diff gnv-artifacts/src/main/java/de/intevation/gnv/chart/ChartFactory.java @ 217:3dcd2b0b456e

Added configurable TimeGap Support to the TimeSeries-Chart-Generation. issu45 gnv-artifacts/trunk@275 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Tim Englich <tim.englich@intevation.de>
date Thu, 29 Oct 2009 15:58:47 +0000
parents 34f233123a6f
children 21152e1bf325
line wrap: on
line diff
--- a/gnv-artifacts/src/main/java/de/intevation/gnv/chart/ChartFactory.java	Wed Oct 28 16:26:03 2009 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/chart/ChartFactory.java	Thu Oct 29 15:58:47 2009 +0000
@@ -44,6 +44,7 @@
 
 import de.intevation.gnv.chart.exception.TechnicalChartException;
 import de.intevation.gnv.geobackend.base.Result;
+import de.intevation.gnv.timeseries.gap.TimeGap;
 import de.intevation.gnv.transition.describedata.KeyValueDescibeData;
 
 /**
@@ -72,7 +73,8 @@
                                                          Collection<KeyValueDescibeData> parameters,
                                                          Collection<KeyValueDescibeData> measurements,
                                                          OutputStream outputStream,
-                                                         Collection<Result> resultSet)
+                                                         Collection<Result> resultSet,
+                                                         Collection<TimeGap> timeGaps)
                                                                                       throws IOException,
                                                                                       TechnicalChartException {
         if (sDebug)
@@ -90,7 +92,7 @@
         if (sDebug)
             sLogger.debug("  vor createDataset()");
         XYDataset lSet = this.createDataset(resultSet, lUpperLevel,
-                lLowerLevel, parameters, measurements);
+                lLowerLevel, parameters, measurements,timeGaps);
         if (sDebug)
             sLogger.debug("  nach createDataset()");
         final Color[] color = { Color.black, Color.red, Color.green, Color.blue };
@@ -219,8 +221,7 @@
     private TimeSeries createTimeSeries(String pTimeSeriesName,
                                         Collection<Result> resultSet,
                                         int lUpperCut, int lLowerCut,
-                                        int pStart, int pEnd, Date dStart,
-                                        Date dEnd)
+                                        int pStart, int pEnd, long maxGap)
                                                   throws TechnicalChartException {
         if (sDebug)
             sLogger.debug("createTimeSeries()");
@@ -231,9 +232,9 @@
         TimeSeries lTimeseries = new TimeSeries(pTimeSeriesName,
                 org.jfree.data.time.Minute.class);
         try {
-            long maxGap = 0, lDateDiff = 0;
+            long lDateDiff = 0;
             double lValue = 0;
-
+            
             int i = 0;
             Iterator<Result> resultIterator = resultSet.iterator();
             while (resultIterator.hasNext()) {
@@ -241,28 +242,6 @@
                 if (i >= pStart + 1 && i <= pEnd) {
                     if (i == pStart + 1) {
                         lRow0 = lRow;//
-
-                        // Handle Gaps > 0.5% timeserieslength, i.e do not draw
-                        // here
-                        // +TODO mache maxGap variabel über diagram options
-                        maxGap = (dEnd.getTime() - dStart.getTime()) / 200; // 0,5
-                                                                            // prozent
-                                                                            // der
-                                                                            // Länge
-                        if (maxGap < 3600000)
-                            maxGap = 3600010;
-                        if (maxGap < (dEnd.getTime() - dStart.getTime())
-                                     / (pEnd - pStart))
-                            maxGap = (dEnd.getTime() - dStart.getTime())
-                                     / (pEnd - pStart) + 1000;
-
-                        if (sDebug)
-                            sLogger.debug("MaxGap : " + maxGap / 1000
-                                          + " Länge : "
-                                          + (dEnd.getTime() - dStart.getTime())
-                                          / 1000 + "Intervall "
-                                          + (dEnd.getTime() - dStart.getTime())
-                                          / (pEnd - pStart) / 1000);
                         lDate = lRow0.getDate("XORDINATE");
                         lDate0 = lDate;
                         lValue = lRow0.getDouble("YORDINATE");
@@ -316,7 +295,8 @@
     private XYDataset createDataset(Collection<Result> resultSet,
                                     int lUpperCut, int lLowerCut,
                                     Collection<KeyValueDescibeData> parameters,
-                                    Collection<KeyValueDescibeData> measurements)
+                                    Collection<KeyValueDescibeData> measurements,
+                                    Collection<TimeGap> timeGaps)
                                                                                  throws TechnicalChartException {
 
         TimeSeriesCollection lTimeSeriesCollection = new TimeSeriesCollection();
@@ -335,6 +315,7 @@
                 break3 = row.getString("GROUP3"); // 4
                 dStart = row.getDate("XORDINATE");
                 int i = 1;
+                Integer gapID = -1;
                 while (resultIterator.hasNext()) {
                     row = resultIterator.next();
                     if (!break1.equals(row.getString("GROUP1"))
@@ -345,10 +326,14 @@
                                                  + " "
                                                  + findValueTitle(measurements,
                                                          break2) + "m";
-
+                        long maxGap = this.calculateMaxGap(dStart, dEnd,mStart,
+                                                           mEnd, gapID.intValue(),
+                                                           timeGaps);
+                        
+                        
                         lTimeSeriesCollection.addSeries(createTimeSeries(
                                 mTimeSeriesName, resultSet, lUpperCut,
-                                lLowerCut, mStart, mEnd, dStart, dEnd));
+                                lLowerCut, mStart, mEnd,maxGap));
                         mStart = i;
                         dStart = row.getDate("XORDINATE");
                         break1 = row.getString("GROUP1");
@@ -358,6 +343,7 @@
                     }
                     mEnd = i;
                     dEnd = row.getDate("XORDINATE");
+                    gapID = row.getInteger("GAPID");
                     i = i + 1;
                 }
 
@@ -365,13 +351,17 @@
                                          + " "
                                          + findValueTitle(measurements, break2)
                                          + "m";
+                long maxGap = this.calculateMaxGap(dStart, dEnd,mStart, 
+                                                   mEnd,gapID.intValue(),
+                                                   timeGaps);
                 lTimeSeriesCollection.addSeries(createTimeSeries(
                         mTimeSeriesName, resultSet, lUpperCut, lLowerCut,
-                        mStart, mEnd, dStart, dEnd));
+                        mStart, mEnd, maxGap));
             }else{
+                // Es sind keine Daten vorhanden: Es wird eine Zeitserie eingefügt.
                 lTimeSeriesCollection.addSeries(createTimeSeries(
                         "", resultSet, lUpperCut, lLowerCut,
-                        mStart, mEnd, dStart, dEnd));
+                        mStart, mEnd, 999999));
             }
         } catch (Exception e) {
             sLogger.error(e.getMessage(), e);
@@ -380,6 +370,74 @@
         return lTimeSeriesCollection;
     }
 
+    /**
+     * @param dStart
+     * @param dEnd
+     */
+    private long calculateMaxGap(Date dStart, Date dEnd, int pStart ,
+                                 int pEnd, int gapID, 
+                                 Collection<TimeGap> timeGaps) {
+        
+           // umgesetzt nach issue 45
+            // Handle Gaps > 0.5% timeserieslength, 
+            // i.e do not draw here
+            long maxGap = (dEnd.getTime() - dStart.getTime()) / 200; 
+            // 0,5 prozent der Länge
+            long timeInterval = this.getTimeGapValue(dStart, dEnd, pStart, 
+                                                     pEnd, gapID, timeGaps);
+            
+            if (maxGap < timeInterval){
+                maxGap = timeInterval + 10;
+            }
+//            if (maxGap < (dEnd.getTime() - dStart.getTime())
+//                         / (pEnd - pStart))
+//                maxGap = (dEnd.getTime() - dStart.getTime())
+//                         / (pEnd - pStart) + 1000;
+            
+            return maxGap;
+    }
+    
+    private long getTimeGapValue(Date dStart, Date dEnd, 
+                                 int pStart ,int pEnd, 
+                                 int gapID, Collection<TimeGap> timeGaps){
+        long gap = 0;
+        
+        if (gapID < 0 || gapID >= 99){
+            if (pEnd-pStart < 60)
+             gap = (3/(pEnd-pStart)) * (dEnd.getTime() - dStart.getTime());
+        }else{
+            
+            Iterator<TimeGap> it = timeGaps.iterator();
+           
+            while (it.hasNext()){
+                TimeGap tempTimeGap = it.next();
+                if (tempTimeGap.getKey() == gapID){
+                    int gapValue = tempTimeGap.getValue();
+                    String unit = tempTimeGap.getUnit();
+                    
+                    if (unit.equals(TimeGap.TIME_UNIT_MINUTE)){
+                        gap = gapValue * TimeGap.MINUTE_IN_MILLIS;
+                    }else if (unit.equals(TimeGap.TIME_UNIT_HOUR)){
+                        gap = gapValue * TimeGap.HOUR_IN_MILLIS;
+                    }else if (unit.equals(TimeGap.TIME_UNIT_DAY)){
+                        gap = gapValue * TimeGap.DAY_IN_MILLIS;
+                    }else if (unit.equals(TimeGap.TIME_UNIT_WEEK)){
+                        gap = gapValue * TimeGap.WEEK_IN_MILLIS;
+                    }else if (unit.equals(TimeGap.TIME_UNIT_MONTH)){
+                        // TODO wie soll das laufen
+                        gap = gapValue * (TimeGap.DAY_IN_MILLIS *30);
+                    }else if (unit.equals(TimeGap.TIME_UNIT_YEAR)){
+                        // TODO wie soll das laufen für schaltjahre
+                        gap = gapValue * (TimeGap.DAY_IN_MILLIS *365);
+                    }
+                    break;
+                }
+            }
+        }
+        
+        return gap;
+    }
+
     private void encodeChart(JFreeChart pChart, ChartStyle pStyle,
                              OutputStream outputStream) throws IOException {
         if (sDebug)

http://dive4elements.wald.intevation.org