From dcda2c5fa15e63daad67f5720a2f726e34f8cd71 Mon Sep 17 00:00:00 2001 From: Normand Briere <nbriere@noware.ca> Date: Thu, 20 Dec 2018 20:11:57 -0500 Subject: [PATCH] Fix out of memory crash with TimeUnit. --- timeflow/app/actions/DateFieldAction.java | 21 ++-- timeflow/data/time/TimeUnit.java | 6 timeflow/vis/timeline/TimelineSlider.java | 4 timeflow/data/time/RoughTime.java | 9 + timeflow/vis/timeline/AxisTicMarks.java | 10 + timeflow/data/db/BasicAct.java | 139 ++++++++++++++------------- timeflow/format/field/DateTimeGuesser.java | 56 +++++----- 7 files changed, 134 insertions(+), 111 deletions(-) diff --git a/timeflow/app/actions/DateFieldAction.java b/timeflow/app/actions/DateFieldAction.java index b7e8496..bf81d0b 100755 --- a/timeflow/app/actions/DateFieldAction.java +++ b/timeflow/app/actions/DateFieldAction.java @@ -10,15 +10,16 @@ import javax.swing.*; import java.util.*; -public class DateFieldAction extends TimeflowAction { +public class DateFieldAction extends TimeflowAction +{ + public DateFieldAction(TimeflowApp app) + { + super(app, "Set Date Fields...", null, "Set date fields corresponding to start, end."); + } - public DateFieldAction(TimeflowApp app) - { - super(app, "Set Date Fields...", null, "Set date fields corresponding to start, end."); - } - - @Override - public void actionPerformed(ActionEvent e) { - DateFieldPanel.popWindow(app.model); - } + @Override + public void actionPerformed(ActionEvent e) + { + DateFieldPanel.popWindow(app.model); + } } diff --git a/timeflow/data/db/BasicAct.java b/timeflow/data/db/BasicAct.java index 48e3eb9..8473d86 100755 --- a/timeflow/data/db/BasicAct.java +++ b/timeflow/data/db/BasicAct.java @@ -6,84 +6,93 @@ import java.net.URL; import java.util.*; -public class BasicAct implements Act { - - private HashMap data=new HashMap(); - private ActDB db; - - public BasicAct(ActDB db) - { - this.db=db; - } - +public class BasicAct implements Act +{ - @Override - public String getString(Field field) { - return (String)data.get(field.getName()); - } - - public void setText(Field field, String text) - { - data.put(field.getName(), text); - } + private HashMap data = new HashMap(); + private ActDB db; - @Override - public String[] getTextList(Field field) { - return (String[])data.get(field.getName()); - } - - public void setTextList(Field field, String[] list){ - data.put(field.getName(), list); - } + public BasicAct(ActDB db) + { + this.db = db; + } - @Override - public double getValue(Field field) { - return (Double)data.get(field.getName()); - } - - public void setValue(Field field, double value) - { - data.put(field.getName(), value); - } + @Override + public String getString(Field field) + { + Object s = data.get(field.getName()); + if (s == null) + return null; + return s.toString(); + } - @Override - public Object get(Field field) { - return data.get(field.getName()); - } + public void setText(Field field, String text) + { + data.put(field.getName(), text); + } - @Override - public ActDB getDB() { - return db; - } + @Override + public String[] getTextList(Field field) + { + return (String[]) data.get(field.getName()); + } - @Override - public void set(Field field, Object value) { - data.put(field.getName(), value); - } + public void setTextList(Field field, String[] list) + { + data.put(field.getName(), list); + } + @Override + public double getValue(Field field) + { + return (Double) data.get(field.getName()); + } - @Override - public RoughTime getTime(Field field) { - return (RoughTime)data.get(field.getName()); - } + public void setValue(Field field, double value) + { + data.put(field.getName(), value); + } + @Override + public Object get(Field field) + { + return data.get(field.getName()); + } - @Override - public void setTime(Field field, RoughTime time) { - data.put(field.getName(), time); - - } + @Override + public ActDB getDB() + { + return db; + } + @Override + public void set(Field field, Object value) + { + data.put(field.getName(), value); + } - @Override - public URL getURL(Field field) { - return (URL)data.get(field.getName()); - } + @Override + public RoughTime getTime(Field field) + { + return (RoughTime) data.get(field.getName()); + } + @Override + public void setTime(Field field, RoughTime time) + { + data.put(field.getName(), time); - @Override - public void setURL(Field field, URL url) { - data.put(field.getName(), url); - } + } + @Override + public URL getURL(Field field) + { + return (URL) data.get(field.getName()); + } + + @Override + public void setURL(Field field, URL url) + { + data.put(field.getName(), url); + } } diff --git a/timeflow/data/time/RoughTime.java b/timeflow/data/time/RoughTime.java index 85403f3..a3221b4 100755 --- a/timeflow/data/time/RoughTime.java +++ b/timeflow/data/time/RoughTime.java @@ -106,7 +106,14 @@ public String format() { //return units.formatFull(time); - return TimeUnit.SECOND.formatFull(time); + String format = TimeUnit.REALTIME.formatFull(time); + + if (format.equals("00:00:00:00")) + { + format = TimeUnit.DAY.formatFull(time); + } + + return format; } public static int compare(RoughTime t1, RoughTime t2) diff --git a/timeflow/data/time/TimeUnit.java b/timeflow/data/time/TimeUnit.java index bbba6e1..0eb149f 100755 --- a/timeflow/data/time/TimeUnit.java +++ b/timeflow/data/time/TimeUnit.java @@ -13,7 +13,7 @@ public static final TimeUnit HOUR = new TimeUnit("Hours", Calendar.HOUR_OF_DAY, 60 * 60 * 1000L, "HH:mm", "MMM d yyyy HH:mm"); public static final TimeUnit MINUTE = new TimeUnit("Minutes", Calendar.MINUTE, 60 * 1000L, ":mm", "MMM d yyyy HH:mm"); public static final TimeUnit SECOND = new TimeUnit("Seconds", Calendar.SECOND, 1000L, ":ss", "MMM d yyyy HH:mm:ss"); - public static final TimeUnit REALTIME = new TimeUnit("Realtime", Calendar.MILLISECOND, 8L, ":SSS", "MMM d yyyy HH:mm:ss:SSS"); + public static final TimeUnit REALTIME = new TimeUnit("Realtime", Calendar.MILLISECOND, 1L, ":SS", "HH:mm:ss.SS"); public static final TimeUnit DECADE = multipleYears(10); public static final TimeUnit CENTURY = multipleYears(100); @@ -101,7 +101,7 @@ } private static final int[] calendarUnits = { - Calendar.SECOND, Calendar.MINUTE, Calendar.HOUR_OF_DAY, Calendar.DAY_OF_MONTH, Calendar.MONTH, Calendar.YEAR + Calendar.MILLISECOND, Calendar.SECOND, Calendar.MINUTE, Calendar.HOUR_OF_DAY, Calendar.DAY_OF_MONTH, Calendar.MONTH, Calendar.YEAR }; public RoughTime round(long timestamp, boolean up) @@ -128,7 +128,7 @@ } if (i == calendarUnits.length - 1) { - throw new IllegalArgumentException("Unsupported Calendar Unit: " + calendarCode); + //throw new IllegalArgumentException("Unsupported Calendar Unit: " + calendarCode); } c.set(calendarUnits[i], c.getMinimum(calendarUnits[i])); } diff --git a/timeflow/format/field/DateTimeGuesser.java b/timeflow/format/field/DateTimeGuesser.java index 48d05c9..3ec965c 100755 --- a/timeflow/format/field/DateTimeGuesser.java +++ b/timeflow/format/field/DateTimeGuesser.java @@ -44,34 +44,36 @@ // because then the guesser succeeds before it has a chance to try parsing days. static { - parsers.add(new DateTimeParser("yyyy-MM-ddzzzzzzzzzz", TimeUnit.DAY)); - parsers.add(new DateTimeParser("MMM dd yyyy HH:mm", TimeUnit.SECOND)); - parsers.add(new DateTimeParser("MMM/dd/yyyy HH:mm", TimeUnit.SECOND)); - parsers.add(new DateTimeParser("MM/dd/yy HH:mm", TimeUnit.SECOND)); - parsers.add(new DateTimeParser("MMM dd yyyy HH:mm:ss", TimeUnit.SECOND)); - parsers.add(new DateTimeParser("MM/dd/yyyy HH:mm:ss", TimeUnit.SECOND)); - parsers.add(new DateTimeParser("MMM dd yyyy HH:mm:ss zzzzzzzz", TimeUnit.SECOND)); - parsers.add(new DateTimeParser("EEE MMM dd HH:mm:ss zzzzzzzz yyyy", TimeUnit.SECOND)); - parsers.add(new DateTimeParser("EEE MMM dd HH:mm:ss zzzzzzzz yyyy", TimeUnit.SECOND)); - parsers.add(new DateTimeParser("MM-dd-yyyy", TimeUnit.DAY)); - parsers.add(new DateTimeParser("yyyy-MM-dd", TimeUnit.DAY)); - parsers.add(new DateTimeParser("yyyyMMdd", TimeUnit.DAY)); - parsers.add(new DateTimeParser("MM-dd-yy", TimeUnit.DAY)); - parsers.add(new DateTimeParser("dd-MMM-yy", TimeUnit.DAY)); - parsers.add(new DateTimeParser("MM-dd-yyyy", TimeUnit.DAY)); - parsers.add(new DateTimeParser("MM/dd/yy", TimeUnit.DAY)); - parsers.add(new DateTimeParser("MM/dd/yyyy", TimeUnit.DAY)); - parsers.add(new DateTimeParser("dd MMM yyyy", TimeUnit.DAY)); - parsers.add(new DateTimeParser("dd MMM, yyyy", TimeUnit.DAY)); +// parsers.add(new DateTimeParser("yyyy-MM-ddzzzzzzzzzz", TimeUnit.DAY)); +// parsers.add(new DateTimeParser("MMM dd yyyy HH:mm", TimeUnit.SECOND)); +// parsers.add(new DateTimeParser("MMM/dd/yyyy HH:mm", TimeUnit.SECOND)); +// parsers.add(new DateTimeParser("MM/dd/yy HH:mm", TimeUnit.SECOND)); +// parsers.add(new DateTimeParser("MMM dd yyyy HH:mm:ss", TimeUnit.SECOND)); + parsers.add(new DateTimeParser("HH:mm:ss:SS", TimeUnit.REALTIME)); +// parsers.add(new DateTimeParser("MM/dd/yyyy HH:mm:ss", TimeUnit.SECOND)); +// parsers.add(new DateTimeParser("MMM dd yyyy HH:mm:ss zzzzzzzz", TimeUnit.SECOND)); +// parsers.add(new DateTimeParser("EEE MMM dd HH:mm:ss zzzzzzzz yyyy", TimeUnit.SECOND)); +// parsers.add(new DateTimeParser("EEE MMM dd HH:mm:ss zzzzzzzz yyyy", TimeUnit.SECOND)); +// parsers.add(new DateTimeParser("MM-dd-yyyy", TimeUnit.DAY)); +// parsers.add(new DateTimeParser("yyyy-MM-dd", TimeUnit.DAY)); +// parsers.add(new DateTimeParser("yyyyMMdd", TimeUnit.DAY)); +// parsers.add(new DateTimeParser("MM-dd-yy", TimeUnit.DAY)); +// parsers.add(new DateTimeParser("dd-MMM-yy", TimeUnit.DAY)); +// parsers.add(new DateTimeParser("MM-dd-yyyy", TimeUnit.DAY)); +// parsers.add(new DateTimeParser("MM/dd/yy", TimeUnit.DAY)); +// parsers.add(new DateTimeParser("MM/dd/yyyy", TimeUnit.DAY)); +// parsers.add(new DateTimeParser("dd MMM yyyy", TimeUnit.DAY)); +// parsers.add(new DateTimeParser("dd MMM, yyyy", TimeUnit.DAY)); parsers.add(new DateTimeParser("MMM dd yyyy", TimeUnit.DAY)); - parsers.add(new DateTimeParser("MMM dd, yyyy", TimeUnit.DAY)); - parsers.add(new DateTimeParser("EEE MMM dd zzzzzzzz yyyy", TimeUnit.DAY)); - parsers.add(new DateTimeParser("EEE MMM dd yyyy", TimeUnit.DAY)); - parsers.add(new DateTimeParser("MMM-yy", TimeUnit.MONTH)); - parsers.add(new DateTimeParser("MMM yy", TimeUnit.MONTH)); - parsers.add(new DateTimeParser("MMM/yy", TimeUnit.MONTH)); - parsers.add(new DateTimeParser("yyyy", TimeUnit.YEAR)); - parsers.add(new DateTimeParser("yyyy GG", TimeUnit.YEAR)); +// parsers.add(new DateTimeParser("MMM dd, yyyy", TimeUnit.DAY)); +// parsers.add(new DateTimeParser("EEE MMM dd zzzzzzzz yyyy", TimeUnit.DAY)); +// parsers.add(new DateTimeParser("EEE MMM dd yyyy", TimeUnit.DAY)); +// parsers.add(new DateTimeParser("MMM-yy", TimeUnit.MONTH)); +// parsers.add(new DateTimeParser("MMM yy", TimeUnit.MONTH)); +// parsers.add(new DateTimeParser("MMM/yy", TimeUnit.MONTH)); +// parsers.add(new DateTimeParser("yyyy", TimeUnit.YEAR)); +// parsers.add(new DateTimeParser("yyyy GG", TimeUnit.YEAR)); + parsers.add(new DateTimeParser("S", TimeUnit.REALTIME)); } public DateTimeParser getLastGoodFormat() diff --git a/timeflow/vis/timeline/AxisTicMarks.java b/timeflow/vis/timeline/AxisTicMarks.java index edbd96b..2a88ab8 100755 --- a/timeflow/vis/timeline/AxisTicMarks.java +++ b/timeflow/vis/timeline/AxisTicMarks.java @@ -10,7 +10,7 @@ public List<Long> tics; private static final TimeUnit[] units = { - TimeUnit.YEAR, TimeUnit.MONTH, TimeUnit.DAY, TimeUnit.HOUR, TimeUnit.MINUTE, TimeUnit.SECOND + TimeUnit.YEAR, TimeUnit.MONTH, TimeUnit.DAY, TimeUnit.HOUR, TimeUnit.MINUTE, TimeUnit.SECOND, TimeUnit.REALTIME }; private static final TimeUnit[] histUnits = { @@ -20,7 +20,8 @@ TimeUnit.WEEK, TimeUnit.DAY.times(2), TimeUnit.DAY, TimeUnit.HOUR, TimeUnit.MINUTE, - TimeUnit.SECOND + TimeUnit.SECOND, + TimeUnit.REALTIME }; public AxisTicMarks(TimeUnit unit, long start, long end) @@ -48,12 +49,15 @@ public static AxisTicMarks histoTics(long start, long end) { - for (int i = histUnits.length - 1; i >= 0; i--) + for (int i = histUnits.length; --i >= 0;) { TimeUnit u = histUnits[i]; long estimate = u.approxNumInRange(start, end); if (estimate < 200 || i == 0) { + if (i == 17) + i = 17; + AxisTicMarks t = new AxisTicMarks(u, start, end); return t; } diff --git a/timeflow/vis/timeline/TimelineSlider.java b/timeflow/vis/timeline/TimelineSlider.java index 005db28..def6cdb 100755 --- a/timeflow/vis/timeline/TimelineSlider.java +++ b/timeflow/vis/timeline/TimelineSlider.java @@ -15,7 +15,6 @@ public class TimelineSlider extends ModelPanel { - TimelineVisuals visuals; Interval original; long minRange; @@ -30,6 +29,7 @@ START, END, POSITION, NONE }; + Modify change = Modify.NONE; Rectangle startRect = new Rectangle(-1, -1, 0, 0); Rectangle endRect = new Rectangle(-1, -1, 0, 0); @@ -165,7 +165,6 @@ scale.setDateRange(visuals.getGlobalInterval()); scale.setNumberRange(ew, w - ew); - // draw the area for the central "thumb". int lx = scale.toInt(window().start); int rx = scale.toInt(window().end); @@ -194,6 +193,7 @@ mostInSlot = Math.max(mostInSlot, slots[s]); } } + if (mostInSlot > 30) { g.setColor(Color.gray); -- Gitblit v1.6.2