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