diff gnv-artifacts/src/main/java/de/intevation/gnv/chart/ChartFactory.java @ 171:7fb9441dd8af

Format Code to max 80 Chars per Row and Cleanup gnv-artifacts/trunk@208 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Tim Englich <tim.englich@intevation.de>
date Fri, 09 Oct 2009 07:54:48 +0000
parents f07637f96312
children 34f233123a6f
line wrap: on
line diff
--- a/gnv-artifacts/src/main/java/de/intevation/gnv/chart/ChartFactory.java	Fri Oct 09 07:49:47 2009 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/chart/ChartFactory.java	Fri Oct 09 07:54:48 2009 +0000
@@ -17,6 +17,7 @@
 
 import java.awt.Color;
 import java.awt.Font;
+import java.awt.Transparency;
 import java.awt.image.BufferedImage;
 import java.io.IOException;
 import java.io.OutputStream;
@@ -59,332 +60,356 @@
  */
 public class ChartFactory {
 
-	/**
-	 * Default Logging instance
-	 */
-	private static Logger sLogger = Logger.getLogger(ChartFactory.class);
-	private static boolean sDebug = sLogger.isDebugEnabled();
-
+    /**
+     * Default Logging instance
+     */
+    private static Logger sLogger = Logger.getLogger(ChartFactory.class);
+    private static boolean sDebug = sLogger.isDebugEnabled();
 
-	public synchronized void createSimpleTimeSeriesChart(ChartLabels pLabels, ChartStyle pStyle, Collection<KeyValueDescibeData> parameters, Collection<KeyValueDescibeData> measurements, OutputStream outputStream, Collection<Result> resultSet) throws IOException, TechnicalChartException {
-		if (sDebug)
-			sLogger.debug("createSimpleTimeSeriesChart()");
-		int lLowerLevel = Integer.MIN_VALUE;
-		int lUpperLevel = Integer.MAX_VALUE;
-		if (pStyle.isUseUpperDataLevel()
-				&& pStyle.getUpperLevel() < Integer.MAX_VALUE) {
-			lUpperLevel = pStyle.getUpperLevel();
-		}
-		if (pStyle.isUseLowerDataLevel()
-				&& pStyle.getLowerLevel() > Integer.MIN_VALUE) {
-			lLowerLevel = pStyle.getLowerLevel();
-		}
-		if (sDebug)
-			sLogger.debug("  vor createDataset()");
-		XYDataset lSet = this.createDataset(resultSet, lUpperLevel,
-				lLowerLevel,parameters,measurements);
-		if (sDebug)
-			sLogger.debug("  nach createDataset()");
-		final Color[] color = {Color.black, Color.red, Color.green, Color.blue};
-		DateAxis domain = new DateAxis(pLabels.getDomainAxisLabel());
+    public synchronized void createSimpleTimeSeriesChart(
+                                                         ChartLabels pLabels,
+                                                         ChartStyle pStyle,
+                                                         Collection<KeyValueDescibeData> parameters,
+                                                         Collection<KeyValueDescibeData> measurements,
+                                                         OutputStream outputStream,
+                                                         Collection<Result> resultSet)
+                                                                                      throws IOException,
+                                                                                      TechnicalChartException {
+        if (sDebug)
+            sLogger.debug("createSimpleTimeSeriesChart()");
+        int lLowerLevel = Integer.MIN_VALUE;
+        int lUpperLevel = Integer.MAX_VALUE;
+        if (pStyle.isUseUpperDataLevel()
+            && pStyle.getUpperLevel() < Integer.MAX_VALUE) {
+            lUpperLevel = pStyle.getUpperLevel();
+        }
+        if (pStyle.isUseLowerDataLevel()
+            && pStyle.getLowerLevel() > Integer.MIN_VALUE) {
+            lLowerLevel = pStyle.getLowerLevel();
+        }
+        if (sDebug)
+            sLogger.debug("  vor createDataset()");
+        XYDataset lSet = this.createDataset(resultSet, lUpperLevel,
+                lLowerLevel, parameters, measurements);
+        if (sDebug)
+            sLogger.debug("  nach createDataset()");
+        final Color[] color = { Color.black, Color.red, Color.green, Color.blue };
+        DateAxis domain = new DateAxis(pLabels.getDomainAxisLabel());
         NumberAxis axis;
         StandardXYItemRenderer renderer = new StandardXYItemRenderer();
-		XYPlot plot = new XYPlot();
-		//Global  settings
-		
-		plot.setOrientation(PlotOrientation.VERTICAL);
-		plot.setBackgroundPaint(Color.lightGray);
-		plot.setDomainGridlinePaint(Color.white);
-		plot.setRangeGridlinePaint(Color.white);
-		plot.setAxisOffset(new RectangleInsets(5.0,5.0,5.0,5.0));
-		//plot.getRangeAxis().setFixedDimension(10.0);
-		plot.setDomainAxis(domain);
-		plot.setDomainAxisLocation(AxisLocation.BOTTOM_OR_LEFT);
-		if (parameters.size() == 1) {
-		    KeyValueDescibeData parameter = parameters.iterator().next();
-			axis = new NumberAxis(parameter.getValue());
-			if(parameter.getValue().contains("richtung")){
-				NumberAxis axis1 = new NumberAxis(
-						((String) parameter.getValue()));//,new Range(0.0,360.0));
-			    axis1.setTickUnit(new NumberTickUnit(30.0));
-				axis1.setUpperBound(360.0);
-				axis1.setLowerBound(0.0);
-                //axis1.setDisplayRange(0.0,360.0);				    
-				plot.setRangeAxis( axis1);
-			}else{
-			axis.setFixedDimension(10.0);
-			axis.setAutoRangeIncludesZero(false);
-			plot.setRangeAxis(axis);
-			}
-			axis.configure();
-			plot.setRangeAxisLocation( AxisLocation.BOTTOM_OR_LEFT);
-			plot.setRenderer(renderer);
-			plot.setDataset(lSet);
-		} else {
-			// Individual settings for different parameters
-			for (int i = 0; i < lSet.getSeriesCount(); i++) {
-
-				plot.setDataset(i, getDataset((TimeSeriesCollection) lSet, i));
-				Color mColor=color[i % color.length];  // zyklische Farbvergabe
-				mColor = color[0];
-				// if ( pParameterId.length==1){
-				
-				if(((String) lSet.getSeriesKey(i)).contains("richtung")){
-					NumberAxis axis1 = new NumberAxis(((String) lSet.getSeriesKey(i)));//,new Range(0.0,360.0));
-				    axis1.setTickUnit(new NumberTickUnit(30.0));
-                    //axis1.setDisplayRange(0.0,360.0);				    
-					axis1.setLabelPaint(mColor);
-					axis1.setTickLabelPaint(mColor);
-					axis1.setUpperBound(360.0);
-					axis1.setLowerBound(0.0);
-					plot.setRangeAxis(i, axis1);
-					
-			    
-				}
-				else {
-					axis = new NumberAxis((String) lSet.getSeriesKey(i));
-					axis.setFixedDimension(10.0);
-					axis.setAutoRangeIncludesZero(false);
-					axis.setLabelPaint(mColor);
-					axis.setTickLabelPaint(mColor);
-					plot.setRangeAxis(i, axis);
-					axis.configure();
-				}
-				if (i % 2 != 0)
-					plot.setRangeAxisLocation(i, AxisLocation.BOTTOM_OR_RIGHT);
-				else
-					plot.setRangeAxisLocation(i, AxisLocation.BOTTOM_OR_LEFT);
-				plot.mapDatasetToRangeAxis(i, i);
-				// }
-				renderer = new StandardXYItemRenderer();
-				renderer.setSeriesPaint(i, mColor);
-				// renderer.setSeriesStroke(i,stroke[j]);
-				plot.setRenderer(i, renderer);
-			}
-		}
-		JFreeChart chart = new JFreeChart(
-				pLabels.getTitle(),
-				new Font ("SansSerif",Font.BOLD,24),
-				plot,true);
-		
-
-		setStyle(chart, pStyle);
-		configureRenderingOptions(chart);
-		if (sDebug)
-			sLogger.debug("  vor encodeChart()");
-		
-		encodeChart(chart, pStyle, outputStream);
-	}
-    private static XYDataset getDataset(TimeSeriesCollection T, int pIndex){ //throws TechnicalChartException{
-    	//if (T.getSeriesCount() < pIndex) throw TechnicalChartException();
-    	TimeSeriesCollection TSC = new TimeSeriesCollection();
-    	TSC.addSeries(T.getSeries(pIndex));
-    	return (XYDataset) TSC;
-    }
-    
-	private void configureRenderingOptions(JFreeChart pJfreechart) {
-		org.jfree.chart.renderer.xy.XYItemRenderer xyitemrenderer = ((XYPlot) pJfreechart
-				.getPlot()).getRenderer();
-		if (xyitemrenderer instanceof XYLineAndShapeRenderer) {
-			XYLineAndShapeRenderer xylineandshaperenderer = (XYLineAndShapeRenderer) xyitemrenderer;
-			xylineandshaperenderer.setBaseShapesVisible(true);
-			xylineandshaperenderer.setBaseShapesFilled(true);
-		}
-	}
-
-	private void setStyle(JFreeChart pJfreechart, ChartStyle pStyle) {
-		if (sDebug)
-			sLogger.debug("setStyle()");
-		pJfreechart.setBackgroundPaint(pStyle.getCanvasColor());
-		XYPlot xyplot = (XYPlot) pJfreechart.getPlot();
-		xyplot.setBackgroundPaint(pStyle.getPlotBackgroundColor());
-		xyplot.setDomainGridlinePaint(pStyle.getDomainGridlineColor());
-		xyplot.setRangeGridlinePaint(pStyle.getRangeGridlineColor());
-
-		Insets lOffsets = pStyle.getAxisOffset();
-		RectangleInsets lRectangleInsets = new RectangleInsets(lOffsets.mUpper,
-				lOffsets.mLeft, lOffsets.mLower, lOffsets.mRight);
-		xyplot.setAxisOffset(lRectangleInsets);
-		xyplot.setDomainCrosshairVisible(pStyle.isDomainCrosshairVisible());
-		xyplot.setRangeCrosshairVisible(pStyle.isRangeCrosshairVisible());
-
-	}
-	
-	
-	private TimeSeries createTimeSeries(String pTimeSeriesName,  Collection<Result> resultSet, 
-			int lUpperCut, int lLowerCut,int pStart,int pEnd, Date dStart, Date dEnd) throws TechnicalChartException{
-		if (sDebug)
-			sLogger.debug("createTimeSeries()");
-		Result lRow0, lRow1;
-		
-		Date lDate=null, lDate0=null;
-        
-        TimeSeries lTimeseries = new TimeSeries(pTimeSeriesName,   
-				org.jfree.data.time.Minute.class);
-		try {
-			long maxGap=0, lDateDiff=0;
-			double lValue=0;
-			
+        XYPlot plot = new XYPlot();
+        // Global settings
 
-			int i = 0;
-			Iterator<Result> resultIterator = resultSet.iterator();
-            while (resultIterator.hasNext()){
-            	Result lRow = resultIterator.next();
-            	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");
-            			if (lValue > lLowerCut && lValue < lUpperCut){
-            				//lTimeseries.addOrUpdate(new Minute(lDate), lValue);
-            				lTimeseries.add(new Minute(lDate), lValue);
-            			}
-                	}
-				//for (int i = pStart+1; i <= pEnd; i++) {
-					lRow1 =lRow;
-					lDate = lRow1.getDate("XORDINATE");
-					lValue = lRow1.getDouble("YORDINATE");
-					lDateDiff = lDate.getTime() - lDate0.getTime();
-					if (lDateDiff > maxGap) {
-						// add 1 minute in millisecs to left hand side Date
-						// and insert Dummy to break line
-						lDate0.setTime((lDate0.getTime() + 60000)); 
-						lTimeseries.addOrUpdate(new Minute(lDate0), null);						 
-						lTimeseries.addOrUpdate(new Minute(lDate), lValue);
-						//lTimeseries.add(new Minute(lDate0), null);
-					} else if (lDateDiff == 0) {
-						if (sDebug)
-								sLogger.debug("Datediff: "+lDateDiff+" bei index : "+i+" Datum : "+lDate+" "+lDate0);
-					}
-					 else if (lValue > lLowerCut && lValue < lUpperCut) {
-						lTimeseries.addOrUpdate(new Minute(lDate), lValue);
-						//lTimeseries.add(new Minute(lDate), lValue);
-					 }
-					lRow0 = lRow1;
-					lDate0 = lDate;
-				}else if (i > pEnd){
-				    return lTimeseries;
-				}
-				i++;
+        plot.setOrientation(PlotOrientation.VERTICAL);
+        plot.setBackgroundPaint(Color.lightGray);
+        plot.setDomainGridlinePaint(Color.white);
+        plot.setRangeGridlinePaint(Color.white);
+        plot.setAxisOffset(new RectangleInsets(5.0, 5.0, 5.0, 5.0));
+        // plot.getRangeAxis().setFixedDimension(10.0);
+        plot.setDomainAxis(domain);
+        plot.setDomainAxisLocation(AxisLocation.BOTTOM_OR_LEFT);
+        if (parameters.size() == 1) {
+            KeyValueDescibeData parameter = parameters.iterator().next();
+            axis = new NumberAxis(parameter.getValue());
+            if (parameter.getValue().contains("richtung")) {
+                NumberAxis axis1 = new NumberAxis((parameter
+                        .getValue()));// ,new Range(0.0,360.0));
+                axis1.setTickUnit(new NumberTickUnit(30.0));
+                axis1.setUpperBound(360.0);
+                axis1.setLowerBound(0.0);
+                // axis1.setDisplayRange(0.0,360.0);
+                plot.setRangeAxis(axis1);
+            } else {
+                axis.setFixedDimension(10.0);
+                axis.setAutoRangeIncludesZero(false);
+                plot.setRangeAxis(axis);
             }
-			
-
-		} catch (OutOfMemoryError e) { 
-			sLogger.error(e.getMessage(), e);
-			return lTimeseries;
-		
-		} catch (Exception e) { //TechnicalChartException
-			sLogger.error(e.getMessage(), e);
-		}
-		finally {
-		}
-		
-		return lTimeseries;
-	}
+            axis.configure();
+            plot.setRangeAxisLocation(AxisLocation.BOTTOM_OR_LEFT);
+            plot.setRenderer(renderer);
+            plot.setDataset(lSet);
+        } else {
+            // Individual settings for different parameters
+            for (int i = 0; i < lSet.getSeriesCount(); i++) {
 
-	private XYDataset createDataset(Collection<Result> resultSet,
-			int lUpperCut, int lLowerCut,Collection<KeyValueDescibeData> parameters, Collection<KeyValueDescibeData> measurements) throws TechnicalChartException {
-		
-		TimeSeriesCollection lTimeSeriesCollection = new TimeSeriesCollection();
-		try{
-			Date dStart = null, dEnd= null;
-			String break1, break2, break3;
-			int mStart = 0;
-			int mEnd = 0;
-			
-	
-			Iterator<Result> resultIterator = resultSet.iterator();
-			if (resultIterator.hasNext()){
-    			Result row = resultIterator.next();
-    			
-    			break1 = row.getString("GROUP1"); // 2
-    			break2 = row.getString("GROUP2");  //3
-    			break3 = row.getString("GROUP3"); // 4
-    			dStart = row.getDate("XORDINATE");
-    			int i = 1;
-    			while (resultIterator.hasNext()) {
-    			    row = resultIterator.next();
-    				if (!break1.equals(row.getString("GROUP1"))
-    						|| !break2 .equals(row.getString("GROUP2"))
-    					    || !break3.equals(row.getString("GROUP3"))){
-    					String mTimeSeriesName = findValueTitle(parameters,break1)+" "+
-    					                         findValueTitle(measurements,break2)+"m";
-    					
-    					lTimeSeriesCollection.addSeries(createTimeSeries(mTimeSeriesName,
-    							resultSet, lUpperCut, lLowerCut, mStart, mEnd, dStart, dEnd));
-    					mStart = i;
-    					dStart = row.getDate("XORDINATE");
-    					break1 = row.getString("GROUP1");
-    					break2 = row.getString("GROUP2");  //3
-    					break3 = row.getString("GROUP3"); // 4
-    	
-    				}
-    				mEnd = i;
-    				dEnd = row.getDate("XORDINATE");
-    				i = i + 1;
-    			}
-			
-			String mTimeSeriesName = findValueTitle(parameters,break1)+" "+
-	                                 findValueTitle(measurements,break2)+"m";
-			lTimeSeriesCollection.addSeries(createTimeSeries(mTimeSeriesName,
-					resultSet, lUpperCut, lLowerCut, mStart, mEnd, dStart, dEnd));
-			}
-		}
-		catch (Exception e){
-			sLogger.error(e.getMessage(), e);
-		}
-		finally{
-		}
-		return lTimeSeriesCollection;
-	}
+                plot.setDataset(i, getDataset((TimeSeriesCollection) lSet, i));
+                Color mColor = color[i % color.length]; // zyklische Farbvergabe
+                mColor = color[0];
+                // if ( pParameterId.length==1){
 
-
-
-	private void encodeChart(JFreeChart pChart, ChartStyle pStyle, OutputStream outputStream)
-			throws IOException {
-		if (sDebug)
-			sLogger.debug("encodeChart()");
-		KeypointPNGEncoderAdapter lEncoder = new KeypointPNGEncoderAdapter();
-		lEncoder.setEncodingAlpha(true);
+                if (((String) lSet.getSeriesKey(i)).contains("richtung")) {
+                    NumberAxis axis1 = new NumberAxis(((String) lSet
+                            .getSeriesKey(i)));// ,new Range(0.0,360.0));
+                    axis1.setTickUnit(new NumberTickUnit(30.0));
+                    // axis1.setDisplayRange(0.0,360.0);
+                    axis1.setLabelPaint(mColor);
+                    axis1.setTickLabelPaint(mColor);
+                    axis1.setUpperBound(360.0);
+                    axis1.setLowerBound(0.0);
+                    plot.setRangeAxis(i, axis1);
 
-		int lWidth = (int) pStyle.getChartSize().getWidth();
-		int lHeight = (int) pStyle.getChartSize().getHeight();
+                } else {
+                    axis = new NumberAxis((String) lSet.getSeriesKey(i));
+                    axis.setFixedDimension(10.0);
+                    axis.setAutoRangeIncludesZero(false);
+                    axis.setLabelPaint(mColor);
+                    axis.setTickLabelPaint(mColor);
+                    plot.setRangeAxis(i, axis);
+                    axis.configure();
+                }
+                if (i % 2 != 0)
+                    plot.setRangeAxisLocation(i, AxisLocation.BOTTOM_OR_RIGHT);
+                else
+                    plot.setRangeAxisLocation(i, AxisLocation.BOTTOM_OR_LEFT);
+                plot.mapDatasetToRangeAxis(i, i);
+                // }
+                renderer = new StandardXYItemRenderer();
+                renderer.setSeriesPaint(i, mColor);
+                // renderer.setSeriesStroke(i,stroke[j]);
+                plot.setRenderer(i, renderer);
+            }
+        }
+        JFreeChart chart = new JFreeChart(pLabels.getTitle(), new Font(
+                "SansSerif", Font.BOLD, 24), plot, true);
 
-		BufferedImage lImage = pChart.createBufferedImage(lWidth, lHeight,
-				BufferedImage.BITMASK, null);
-	
-		lEncoder.encode(lImage, outputStream);
-	
-}
+        setStyle(chart, pStyle);
+        configureRenderingOptions(chart);
+        if (sDebug)
+            sLogger.debug("  vor encodeChart()");
 
-    private String findValueTitle(Collection<KeyValueDescibeData> values, String pMmtId){
-    	int id = 0;
-    	try {
+        encodeChart(chart, pStyle, outputStream);
+    }
+
+    private static XYDataset getDataset(TimeSeriesCollection T, int pIndex) { // throws
+                                                                              // TechnicalChartException{
+        // if (T.getSeriesCount() < pIndex) throw TechnicalChartException();
+        TimeSeriesCollection TSC = new TimeSeriesCollection();
+        TSC.addSeries(T.getSeries(pIndex));
+        return TSC;
+    }
+
+    private void configureRenderingOptions(JFreeChart pJfreechart) {
+        org.jfree.chart.renderer.xy.XYItemRenderer xyitemrenderer = ((XYPlot) pJfreechart
+                .getPlot()).getRenderer();
+        if (xyitemrenderer instanceof XYLineAndShapeRenderer) {
+            XYLineAndShapeRenderer xylineandshaperenderer = (XYLineAndShapeRenderer) xyitemrenderer;
+            xylineandshaperenderer.setBaseShapesVisible(true);
+            xylineandshaperenderer.setBaseShapesFilled(true);
+        }
+    }
+
+    private void setStyle(JFreeChart pJfreechart, ChartStyle pStyle) {
+        if (sDebug)
+            sLogger.debug("setStyle()");
+        pJfreechart.setBackgroundPaint(pStyle.getCanvasColor());
+        XYPlot xyplot = (XYPlot) pJfreechart.getPlot();
+        xyplot.setBackgroundPaint(pStyle.getPlotBackgroundColor());
+        xyplot.setDomainGridlinePaint(pStyle.getDomainGridlineColor());
+        xyplot.setRangeGridlinePaint(pStyle.getRangeGridlineColor());
+
+        Insets lOffsets = pStyle.getAxisOffset();
+        RectangleInsets lRectangleInsets = new RectangleInsets(lOffsets.mUpper,
+                lOffsets.mLeft, lOffsets.mLower, lOffsets.mRight);
+        xyplot.setAxisOffset(lRectangleInsets);
+        xyplot.setDomainCrosshairVisible(pStyle.isDomainCrosshairVisible());
+        xyplot.setRangeCrosshairVisible(pStyle.isRangeCrosshairVisible());
+
+    }
+
+    private TimeSeries createTimeSeries(String pTimeSeriesName,
+                                        Collection<Result> resultSet,
+                                        int lUpperCut, int lLowerCut,
+                                        int pStart, int pEnd, Date dStart,
+                                        Date dEnd)
+                                                  throws TechnicalChartException {
+        if (sDebug)
+            sLogger.debug("createTimeSeries()");
+        Result lRow0, lRow1;
+
+        Date lDate = null, lDate0 = null;
+
+        TimeSeries lTimeseries = new TimeSeries(pTimeSeriesName,
+                org.jfree.data.time.Minute.class);
+        try {
+            long maxGap = 0, lDateDiff = 0;
+            double lValue = 0;
+
+            int i = 0;
+            Iterator<Result> resultIterator = resultSet.iterator();
+            while (resultIterator.hasNext()) {
+                Result lRow = resultIterator.next();
+                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");
+                        if (lValue > lLowerCut && lValue < lUpperCut) {
+                            // lTimeseries.addOrUpdate(new Minute(lDate),
+                            // lValue);
+                            lTimeseries.add(new Minute(lDate), lValue);
+                        }
+                    }
+                    // for (int i = pStart+1; i <= pEnd; i++) {
+                    lRow1 = lRow;
+                    lDate = lRow1.getDate("XORDINATE");
+                    lValue = lRow1.getDouble("YORDINATE");
+                    lDateDiff = lDate.getTime() - lDate0.getTime();
+                    if (lDateDiff > maxGap) {
+                        // add 1 minute in millisecs to left hand side Date
+                        // and insert Dummy to break line
+                        lDate0.setTime((lDate0.getTime() + 60000));
+                        lTimeseries.addOrUpdate(new Minute(lDate0), null);
+                        lTimeseries.addOrUpdate(new Minute(lDate), lValue);
+                        // lTimeseries.add(new Minute(lDate0), null);
+                    } else if (lDateDiff == 0) {
+                        if (sDebug)
+                            sLogger.debug("Datediff: " + lDateDiff
+                                          + " bei index : " + i + " Datum : "
+                                          + lDate + " " + lDate0);
+                    } else if (lValue > lLowerCut && lValue < lUpperCut) {
+                        lTimeseries.addOrUpdate(new Minute(lDate), lValue);
+                        // lTimeseries.add(new Minute(lDate), lValue);
+                    }
+                    lRow0 = lRow1;
+                    lDate0 = lDate;
+                } else if (i > pEnd) {
+                    return lTimeseries;
+                }
+                i++;
+            }
+
+        } catch (OutOfMemoryError e) {
+            sLogger.error(e.getMessage(), e);
+            return lTimeseries;
+
+        } catch (Exception e) { // TechnicalChartException
+            sLogger.error(e.getMessage(), e);
+        } finally {
+        }
+
+        return lTimeseries;
+    }
+
+    private XYDataset createDataset(Collection<Result> resultSet,
+                                    int lUpperCut, int lLowerCut,
+                                    Collection<KeyValueDescibeData> parameters,
+                                    Collection<KeyValueDescibeData> measurements)
+                                                                                 throws TechnicalChartException {
+
+        TimeSeriesCollection lTimeSeriesCollection = new TimeSeriesCollection();
+        try {
+            Date dStart = null, dEnd = null;
+            String break1, break2, break3;
+            int mStart = 0;
+            int mEnd = 0;
+
+            Iterator<Result> resultIterator = resultSet.iterator();
+            if (resultIterator.hasNext()) {
+                Result row = resultIterator.next();
+
+                break1 = row.getString("GROUP1"); // 2
+                break2 = row.getString("GROUP2"); // 3
+                break3 = row.getString("GROUP3"); // 4
+                dStart = row.getDate("XORDINATE");
+                int i = 1;
+                while (resultIterator.hasNext()) {
+                    row = resultIterator.next();
+                    if (!break1.equals(row.getString("GROUP1"))
+                        || !break2.equals(row.getString("GROUP2"))
+                        || !break3.equals(row.getString("GROUP3"))) {
+                        String mTimeSeriesName = findValueTitle(parameters,
+                                break1)
+                                                 + " "
+                                                 + findValueTitle(measurements,
+                                                         break2) + "m";
+
+                        lTimeSeriesCollection.addSeries(createTimeSeries(
+                                mTimeSeriesName, resultSet, lUpperCut,
+                                lLowerCut, mStart, mEnd, dStart, dEnd));
+                        mStart = i;
+                        dStart = row.getDate("XORDINATE");
+                        break1 = row.getString("GROUP1");
+                        break2 = row.getString("GROUP2"); // 3
+                        break3 = row.getString("GROUP3"); // 4
+
+                    }
+                    mEnd = i;
+                    dEnd = row.getDate("XORDINATE");
+                    i = i + 1;
+                }
+
+                String mTimeSeriesName = findValueTitle(parameters, break1)
+                                         + " "
+                                         + findValueTitle(measurements, break2)
+                                         + "m";
+                lTimeSeriesCollection.addSeries(createTimeSeries(
+                        mTimeSeriesName, resultSet, lUpperCut, lLowerCut,
+                        mStart, mEnd, dStart, dEnd));
+            }
+        } catch (Exception e) {
+            sLogger.error(e.getMessage(), e);
+        } finally {
+        }
+        return lTimeSeriesCollection;
+    }
+
+    private void encodeChart(JFreeChart pChart, ChartStyle pStyle,
+                             OutputStream outputStream) throws IOException {
+        if (sDebug)
+            sLogger.debug("encodeChart()");
+        KeypointPNGEncoderAdapter lEncoder = new KeypointPNGEncoderAdapter();
+        lEncoder.setEncodingAlpha(true);
+
+        int lWidth = (int) pStyle.getChartSize().getWidth();
+        int lHeight = (int) pStyle.getChartSize().getHeight();
+
+        BufferedImage lImage = pChart.createBufferedImage(lWidth, lHeight,
+                Transparency.BITMASK, null);
+
+        lEncoder.encode(lImage, outputStream);
+
+    }
+
+    private String findValueTitle(Collection<KeyValueDescibeData> values,
+                                  String pMmtId) {
+        int id = 0;
+        try {
             id = Integer.parseInt(pMmtId);
         } catch (NumberFormatException e) {
-            sLogger.warn(e,e);
+            sLogger.warn(e, e);
             return pMmtId;
         }
-        
+
         Iterator<KeyValueDescibeData> it = values.iterator();
-    	while(it.hasNext()){
-    	    KeyValueDescibeData data = it.next();
-    		if (id  ==Integer.parseInt(data.getKey())){
-    		    return data.getValue();
-    		}
-    	}
-    	return "";
+        while (it.hasNext()) {
+            KeyValueDescibeData data = it.next();
+            if (id == Integer.parseInt(data.getKey())) {
+                return data.getValue();
+            }
+        }
+        return "";
     }
 }

http://dive4elements.wald.intevation.org