Normand Briere
2018-12-21 dcda2c5fa15e63daad67f5720a2f726e34f8cd71
Fix out of memory crash with TimeUnit.
7 files modified
245 ■■■■ changed files
timeflow/app/actions/DateFieldAction.java 21 ●●●● patch | view | raw | blame | history
timeflow/data/db/BasicAct.java 139 ●●●● patch | view | raw | blame | history
timeflow/data/time/RoughTime.java 9 ●●●● patch | view | raw | blame | history
timeflow/data/time/TimeUnit.java 6 ●●●● patch | view | raw | blame | history
timeflow/format/field/DateTimeGuesser.java 56 ●●●● patch | view | raw | blame | history
timeflow/vis/timeline/AxisTicMarks.java 10 ●●●● patch | view | raw | blame | history
timeflow/vis/timeline/TimelineSlider.java 4 ●●●● patch | view | raw | blame | history
timeflow/app/actions/DateFieldAction.java
....@@ -10,15 +10,16 @@
1010 import javax.swing.*;
1111 import java.util.*;
1212
13
-public class DateFieldAction extends TimeflowAction {
13
+public class DateFieldAction extends TimeflowAction
14
+{
15
+ public DateFieldAction(TimeflowApp app)
16
+ {
17
+ super(app, "Set Date Fields...", null, "Set date fields corresponding to start, end.");
18
+ }
1419
15
- public DateFieldAction(TimeflowApp app)
16
- {
17
- super(app, "Set Date Fields...", null, "Set date fields corresponding to start, end.");
18
- }
19
-
20
- @Override
21
- public void actionPerformed(ActionEvent e) {
22
- DateFieldPanel.popWindow(app.model);
23
- }
20
+ @Override
21
+ public void actionPerformed(ActionEvent e)
22
+ {
23
+ DateFieldPanel.popWindow(app.model);
24
+ }
2425 }
timeflow/data/db/BasicAct.java
....@@ -6,84 +6,93 @@
66 import java.net.URL;
77 import java.util.*;
88
9
-public class BasicAct implements Act {
10
-
11
- private HashMap data=new HashMap();
12
- private ActDB db;
13
-
14
- public BasicAct(ActDB db)
15
- {
16
- this.db=db;
17
- }
18
-
9
+public class BasicAct implements Act
10
+{
1911
20
- @Override
21
- public String getString(Field field) {
22
- return (String)data.get(field.getName());
23
- }
24
-
25
- public void setText(Field field, String text)
26
- {
27
- data.put(field.getName(), text);
28
- }
12
+ private HashMap data = new HashMap();
13
+ private ActDB db;
2914
30
- @Override
31
- public String[] getTextList(Field field) {
32
- return (String[])data.get(field.getName());
33
- }
34
-
35
- public void setTextList(Field field, String[] list){
36
- data.put(field.getName(), list);
37
- }
15
+ public BasicAct(ActDB db)
16
+ {
17
+ this.db = db;
18
+ }
3819
39
- @Override
40
- public double getValue(Field field) {
41
- return (Double)data.get(field.getName());
42
- }
43
-
44
- public void setValue(Field field, double value)
45
- {
46
- data.put(field.getName(), value);
47
- }
20
+ @Override
21
+ public String getString(Field field)
22
+ {
23
+ Object s = data.get(field.getName());
24
+ if (s == null)
25
+ return null;
26
+ return s.toString();
27
+ }
4828
49
- @Override
50
- public Object get(Field field) {
51
- return data.get(field.getName());
52
- }
29
+ public void setText(Field field, String text)
30
+ {
31
+ data.put(field.getName(), text);
32
+ }
5333
54
- @Override
55
- public ActDB getDB() {
56
- return db;
57
- }
34
+ @Override
35
+ public String[] getTextList(Field field)
36
+ {
37
+ return (String[]) data.get(field.getName());
38
+ }
5839
59
- @Override
60
- public void set(Field field, Object value) {
61
- data.put(field.getName(), value);
62
- }
40
+ public void setTextList(Field field, String[] list)
41
+ {
42
+ data.put(field.getName(), list);
43
+ }
6344
45
+ @Override
46
+ public double getValue(Field field)
47
+ {
48
+ return (Double) data.get(field.getName());
49
+ }
6450
65
- @Override
66
- public RoughTime getTime(Field field) {
67
- return (RoughTime)data.get(field.getName());
68
- }
51
+ public void setValue(Field field, double value)
52
+ {
53
+ data.put(field.getName(), value);
54
+ }
6955
56
+ @Override
57
+ public Object get(Field field)
58
+ {
59
+ return data.get(field.getName());
60
+ }
7061
71
- @Override
72
- public void setTime(Field field, RoughTime time) {
73
- data.put(field.getName(), time);
74
-
75
- }
62
+ @Override
63
+ public ActDB getDB()
64
+ {
65
+ return db;
66
+ }
7667
68
+ @Override
69
+ public void set(Field field, Object value)
70
+ {
71
+ data.put(field.getName(), value);
72
+ }
7773
78
- @Override
79
- public URL getURL(Field field) {
80
- return (URL)data.get(field.getName());
81
- }
74
+ @Override
75
+ public RoughTime getTime(Field field)
76
+ {
77
+ return (RoughTime) data.get(field.getName());
78
+ }
8279
80
+ @Override
81
+ public void setTime(Field field, RoughTime time)
82
+ {
83
+ data.put(field.getName(), time);
8384
84
- @Override
85
- public void setURL(Field field, URL url) {
86
- data.put(field.getName(), url);
87
- }
85
+ }
8886
87
+ @Override
88
+ public URL getURL(Field field)
89
+ {
90
+ return (URL) data.get(field.getName());
91
+ }
92
+
93
+ @Override
94
+ public void setURL(Field field, URL url)
95
+ {
96
+ data.put(field.getName(), url);
97
+ }
8998 }
timeflow/data/time/RoughTime.java
....@@ -106,7 +106,14 @@
106106 public String format()
107107 {
108108 //return units.formatFull(time);
109
- return TimeUnit.SECOND.formatFull(time);
109
+ String format = TimeUnit.REALTIME.formatFull(time);
110
+
111
+ if (format.equals("00:00:00:00"))
112
+ {
113
+ format = TimeUnit.DAY.formatFull(time);
114
+ }
115
+
116
+ return format;
110117 }
111118
112119 public static int compare(RoughTime t1, RoughTime t2)
timeflow/data/time/TimeUnit.java
....@@ -13,7 +13,7 @@
1313 public static final TimeUnit HOUR = new TimeUnit("Hours", Calendar.HOUR_OF_DAY, 60 * 60 * 1000L, "HH:mm", "MMM d yyyy HH:mm");
1414 public static final TimeUnit MINUTE = new TimeUnit("Minutes", Calendar.MINUTE, 60 * 1000L, ":mm", "MMM d yyyy HH:mm");
1515 public static final TimeUnit SECOND = new TimeUnit("Seconds", Calendar.SECOND, 1000L, ":ss", "MMM d yyyy HH:mm:ss");
16
- public static final TimeUnit REALTIME = new TimeUnit("Realtime", Calendar.MILLISECOND, 8L, ":SSS", "MMM d yyyy HH:mm:ss:SSS");
16
+ public static final TimeUnit REALTIME = new TimeUnit("Realtime", Calendar.MILLISECOND, 1L, ":SS", "HH:mm:ss.SS");
1717
1818 public static final TimeUnit DECADE = multipleYears(10);
1919 public static final TimeUnit CENTURY = multipleYears(100);
....@@ -101,7 +101,7 @@
101101 }
102102 private static final int[] calendarUnits =
103103 {
104
- Calendar.SECOND, Calendar.MINUTE, Calendar.HOUR_OF_DAY, Calendar.DAY_OF_MONTH, Calendar.MONTH, Calendar.YEAR
104
+ Calendar.MILLISECOND, Calendar.SECOND, Calendar.MINUTE, Calendar.HOUR_OF_DAY, Calendar.DAY_OF_MONTH, Calendar.MONTH, Calendar.YEAR
105105 };
106106
107107 public RoughTime round(long timestamp, boolean up)
....@@ -128,7 +128,7 @@
128128 }
129129 if (i == calendarUnits.length - 1)
130130 {
131
- throw new IllegalArgumentException("Unsupported Calendar Unit: " + calendarCode);
131
+ //throw new IllegalArgumentException("Unsupported Calendar Unit: " + calendarCode);
132132 }
133133 c.set(calendarUnits[i], c.getMinimum(calendarUnits[i]));
134134 }
timeflow/format/field/DateTimeGuesser.java
....@@ -44,34 +44,36 @@
4444 // because then the guesser succeeds before it has a chance to try parsing days.
4545 static
4646 {
47
- parsers.add(new DateTimeParser("yyyy-MM-ddzzzzzzzzzz", TimeUnit.DAY));
48
- parsers.add(new DateTimeParser("MMM dd yyyy HH:mm", TimeUnit.SECOND));
49
- parsers.add(new DateTimeParser("MMM/dd/yyyy HH:mm", TimeUnit.SECOND));
50
- parsers.add(new DateTimeParser("MM/dd/yy HH:mm", TimeUnit.SECOND));
51
- parsers.add(new DateTimeParser("MMM dd yyyy HH:mm:ss", TimeUnit.SECOND));
52
- parsers.add(new DateTimeParser("MM/dd/yyyy HH:mm:ss", TimeUnit.SECOND));
53
- parsers.add(new DateTimeParser("MMM dd yyyy HH:mm:ss zzzzzzzz", TimeUnit.SECOND));
54
- parsers.add(new DateTimeParser("EEE MMM dd HH:mm:ss zzzzzzzz yyyy", TimeUnit.SECOND));
55
- parsers.add(new DateTimeParser("EEE MMM dd HH:mm:ss zzzzzzzz yyyy", TimeUnit.SECOND));
56
- parsers.add(new DateTimeParser("MM-dd-yyyy", TimeUnit.DAY));
57
- parsers.add(new DateTimeParser("yyyy-MM-dd", TimeUnit.DAY));
58
- parsers.add(new DateTimeParser("yyyyMMdd", TimeUnit.DAY));
59
- parsers.add(new DateTimeParser("MM-dd-yy", TimeUnit.DAY));
60
- parsers.add(new DateTimeParser("dd-MMM-yy", TimeUnit.DAY));
61
- parsers.add(new DateTimeParser("MM-dd-yyyy", TimeUnit.DAY));
62
- parsers.add(new DateTimeParser("MM/dd/yy", TimeUnit.DAY));
63
- parsers.add(new DateTimeParser("MM/dd/yyyy", TimeUnit.DAY));
64
- parsers.add(new DateTimeParser("dd MMM yyyy", TimeUnit.DAY));
65
- parsers.add(new DateTimeParser("dd MMM, yyyy", TimeUnit.DAY));
47
+// parsers.add(new DateTimeParser("yyyy-MM-ddzzzzzzzzzz", TimeUnit.DAY));
48
+// parsers.add(new DateTimeParser("MMM dd yyyy HH:mm", TimeUnit.SECOND));
49
+// parsers.add(new DateTimeParser("MMM/dd/yyyy HH:mm", TimeUnit.SECOND));
50
+// parsers.add(new DateTimeParser("MM/dd/yy HH:mm", TimeUnit.SECOND));
51
+// parsers.add(new DateTimeParser("MMM dd yyyy HH:mm:ss", TimeUnit.SECOND));
52
+ parsers.add(new DateTimeParser("HH:mm:ss:SS", TimeUnit.REALTIME));
53
+// parsers.add(new DateTimeParser("MM/dd/yyyy HH:mm:ss", TimeUnit.SECOND));
54
+// parsers.add(new DateTimeParser("MMM dd yyyy HH:mm:ss zzzzzzzz", TimeUnit.SECOND));
55
+// parsers.add(new DateTimeParser("EEE MMM dd HH:mm:ss zzzzzzzz yyyy", TimeUnit.SECOND));
56
+// parsers.add(new DateTimeParser("EEE MMM dd HH:mm:ss zzzzzzzz yyyy", TimeUnit.SECOND));
57
+// parsers.add(new DateTimeParser("MM-dd-yyyy", TimeUnit.DAY));
58
+// parsers.add(new DateTimeParser("yyyy-MM-dd", TimeUnit.DAY));
59
+// parsers.add(new DateTimeParser("yyyyMMdd", TimeUnit.DAY));
60
+// parsers.add(new DateTimeParser("MM-dd-yy", TimeUnit.DAY));
61
+// parsers.add(new DateTimeParser("dd-MMM-yy", TimeUnit.DAY));
62
+// parsers.add(new DateTimeParser("MM-dd-yyyy", TimeUnit.DAY));
63
+// parsers.add(new DateTimeParser("MM/dd/yy", TimeUnit.DAY));
64
+// parsers.add(new DateTimeParser("MM/dd/yyyy", TimeUnit.DAY));
65
+// parsers.add(new DateTimeParser("dd MMM yyyy", TimeUnit.DAY));
66
+// parsers.add(new DateTimeParser("dd MMM, yyyy", TimeUnit.DAY));
6667 parsers.add(new DateTimeParser("MMM dd yyyy", TimeUnit.DAY));
67
- parsers.add(new DateTimeParser("MMM dd, yyyy", TimeUnit.DAY));
68
- parsers.add(new DateTimeParser("EEE MMM dd zzzzzzzz yyyy", TimeUnit.DAY));
69
- parsers.add(new DateTimeParser("EEE MMM dd yyyy", TimeUnit.DAY));
70
- parsers.add(new DateTimeParser("MMM-yy", TimeUnit.MONTH));
71
- parsers.add(new DateTimeParser("MMM yy", TimeUnit.MONTH));
72
- parsers.add(new DateTimeParser("MMM/yy", TimeUnit.MONTH));
73
- parsers.add(new DateTimeParser("yyyy", TimeUnit.YEAR));
74
- parsers.add(new DateTimeParser("yyyy GG", TimeUnit.YEAR));
68
+// parsers.add(new DateTimeParser("MMM dd, yyyy", TimeUnit.DAY));
69
+// parsers.add(new DateTimeParser("EEE MMM dd zzzzzzzz yyyy", TimeUnit.DAY));
70
+// parsers.add(new DateTimeParser("EEE MMM dd yyyy", TimeUnit.DAY));
71
+// parsers.add(new DateTimeParser("MMM-yy", TimeUnit.MONTH));
72
+// parsers.add(new DateTimeParser("MMM yy", TimeUnit.MONTH));
73
+// parsers.add(new DateTimeParser("MMM/yy", TimeUnit.MONTH));
74
+// parsers.add(new DateTimeParser("yyyy", TimeUnit.YEAR));
75
+// parsers.add(new DateTimeParser("yyyy GG", TimeUnit.YEAR));
76
+ parsers.add(new DateTimeParser("S", TimeUnit.REALTIME));
7577 }
7678
7779 public DateTimeParser getLastGoodFormat()
timeflow/vis/timeline/AxisTicMarks.java
....@@ -10,7 +10,7 @@
1010 public List<Long> tics;
1111 private static final TimeUnit[] units =
1212 {
13
- TimeUnit.YEAR, TimeUnit.MONTH, TimeUnit.DAY, TimeUnit.HOUR, TimeUnit.MINUTE, TimeUnit.SECOND
13
+ TimeUnit.YEAR, TimeUnit.MONTH, TimeUnit.DAY, TimeUnit.HOUR, TimeUnit.MINUTE, TimeUnit.SECOND, TimeUnit.REALTIME
1414 };
1515 private static final TimeUnit[] histUnits =
1616 {
....@@ -20,7 +20,8 @@
2020 TimeUnit.WEEK, TimeUnit.DAY.times(2), TimeUnit.DAY,
2121 TimeUnit.HOUR,
2222 TimeUnit.MINUTE,
23
- TimeUnit.SECOND
23
+ TimeUnit.SECOND,
24
+ TimeUnit.REALTIME
2425 };
2526
2627 public AxisTicMarks(TimeUnit unit, long start, long end)
....@@ -48,12 +49,15 @@
4849
4950 public static AxisTicMarks histoTics(long start, long end)
5051 {
51
- for (int i = histUnits.length - 1; i >= 0; i--)
52
+ for (int i = histUnits.length; --i >= 0;)
5253 {
5354 TimeUnit u = histUnits[i];
5455 long estimate = u.approxNumInRange(start, end);
5556 if (estimate < 200 || i == 0)
5657 {
58
+ if (i == 17)
59
+ i = 17;
60
+
5761 AxisTicMarks t = new AxisTicMarks(u, start, end);
5862 return t;
5963 }
timeflow/vis/timeline/TimelineSlider.java
....@@ -15,7 +15,6 @@
1515
1616 public class TimelineSlider extends ModelPanel
1717 {
18
-
1918 TimelineVisuals visuals;
2019 Interval original;
2120 long minRange;
....@@ -30,6 +29,7 @@
3029
3130 START, END, POSITION, NONE
3231 };
32
+
3333 Modify change = Modify.NONE;
3434 Rectangle startRect = new Rectangle(-1, -1, 0, 0);
3535 Rectangle endRect = new Rectangle(-1, -1, 0, 0);
....@@ -165,7 +165,6 @@
165165 scale.setDateRange(visuals.getGlobalInterval());
166166 scale.setNumberRange(ew, w - ew);
167167
168
-
169168 // draw the area for the central "thumb".
170169 int lx = scale.toInt(window().start);
171170 int rx = scale.toInt(window().end);
....@@ -194,6 +193,7 @@
194193 mostInSlot = Math.max(mostInSlot, slots[s]);
195194 }
196195 }
196
+
197197 if (mostInSlot > 30)
198198 {
199199 g.setColor(Color.gray);