[Schmitzm-commits] r982 - in trunk: src/schmitzm/jfree src/schmitzm/jfree/chart/style src/schmitzm/jfree/feature/style src_junit/schmitzm/jfree/feature/style

scm-commit@wald.intevation.org scm-commit at wald.intevation.org
Fri Aug 20 20:28:49 CEST 2010


Author: mojays
Date: 2010-08-20 20:28:47 +0200 (Fri, 20 Aug 2010)
New Revision: 982

Modified:
   trunk/src/schmitzm/jfree/JFreeChartUtil.java
   trunk/src/schmitzm/jfree/chart/style/BasicChartStyle.java
   trunk/src/schmitzm/jfree/feature/style/FeatureChartUtil.java
   trunk/src_junit/schmitzm/jfree/feature/style/FeatureChartStyleTest.java
Log:
Fix for Bar-Charts with 2 Axis, so that the bars are shown next to each other and the 2 renderers do not overlap

Modified: trunk/src/schmitzm/jfree/JFreeChartUtil.java
===================================================================
--- trunk/src/schmitzm/jfree/JFreeChartUtil.java	2010-08-19 15:55:11 UTC (rev 981)
+++ trunk/src/schmitzm/jfree/JFreeChartUtil.java	2010-08-20 18:28:47 UTC (rev 982)
@@ -96,6 +96,7 @@
 import schmitzm.jfree.chart.style.ChartStyle;
 import schmitzm.jfree.chart.style.ChartStyleXMLFactory;
 import schmitzm.jfree.chart.style.ChartType;
+import schmitzm.jfree.feature.style.FeatureChartUtil;
 import schmitzm.lang.LangUtil;
 import schmitzm.lang.ResourceProvider;
 
@@ -136,6 +137,13 @@
 	/** Instance of {@link ChartStyleXMLFactory}. */
 	public static final ChartStyleXMLFactory<ChartStyle> CHART_STYLE_FACTORY = new ChartStyleXMLFactory<ChartStyle>();
 
+	/** Prefix for dataset series key which should be filtered out in
+	 *  legend.
+	 *  @see FeatureChartUtil#createCategoryDataset(org.geotools.feature.FeatureCollection, schmitzm.jfree.feature.style.FeatureChartStyle)
+	 *  @see BasicChartStyle#applyToDataset(Dataset...)
+	 *  */
+	public static final String DUMMY_SERIES_PREFIX = "DUMMY_"; 
+	
 	/**
 	 * Sets all chart legends (in)visible.
 	 * 

Modified: trunk/src/schmitzm/jfree/chart/style/BasicChartStyle.java
===================================================================
--- trunk/src/schmitzm/jfree/chart/style/BasicChartStyle.java	2010-08-19 15:55:11 UTC (rev 981)
+++ trunk/src/schmitzm/jfree/chart/style/BasicChartStyle.java	2010-08-20 18:28:47 UTC (rev 982)
@@ -41,6 +41,8 @@
 
 import org.jfree.chart.ChartFactory;
 import org.jfree.chart.JFreeChart;
+import org.jfree.chart.LegendItem;
+import org.jfree.chart.LegendItemCollection;
 import org.jfree.chart.plot.CategoryPlot;
 import org.jfree.chart.plot.Plot;
 import org.jfree.chart.plot.PlotOrientation;
@@ -252,10 +254,10 @@
       Plot plot = chart.getPlot();
       if ( plot instanceof XYPlot )
         for (int i=1; i<dataset.length; i++)
-          ((XYPlot)plot).setDataset(1, (XYDataset)dataset[1]);
+          ((XYPlot)plot).setDataset(i, (XYDataset)dataset[i]);
       else if ( plot instanceof CategoryPlot )
         for (int i=1; i<dataset.length; i++)
-          ((CategoryPlot)plot).setDataset(1, (CategoryDataset)dataset[1]);
+          ((CategoryPlot)plot).setDataset(i, (CategoryDataset)dataset[i]);
       else
         LOGGER.warn("Plot does not support multiple datasets. Secondary dataset ignored: "+LangUtil.getSimpleClassName(plot));
     }
@@ -293,6 +295,30 @@
     //       the upper stuff, so that changes on the renderer
     //       effect the new (special stacked/stepped) renderer!!
     super.applyToChart(chart);
+    
+    
+    // Workaround (aehnlich zu JFreeChart-Demo "DualAxisDemo5"):
+    // Bei Bar-Charts mit mehreren Achsen wurden Dummy-Series
+    // in die Datasets eingefuegt. Diese sollen nicht in der Legende
+    // erscheinen.
+    // -> Legende in diesem Fall manuell setzen
+    int datasetCount = JFreeChartUtil.getDatasetCountFromPlot(chart.getPlot());
+    if ( chart.getPlot() instanceof CategoryPlot &&
+         datasetCount > 1 &&
+         ChartType.BAR.equals(getType()) ) {
+      LegendItemCollection newLegendItems = new LegendItemCollection();
+      CategoryPlot         cPlot          = chart.getCategoryPlot();
+      int                  rendererCount  = cPlot.getRendererCount();
+      LegendItemCollection legendItems    = cPlot.getLegendItems();
+      
+      for (int j=0; j<legendItems.getItemCount(); j++) {
+        LegendItem lItem = legendItems.get(j);
+        if (!lItem.getLabel().startsWith(JFreeChartUtil.DUMMY_SERIES_PREFIX))
+          newLegendItems.add(lItem);
+      }
+      cPlot.setFixedLegendItems(newLegendItems);
+    }
+
   }
   
 

Modified: trunk/src/schmitzm/jfree/feature/style/FeatureChartUtil.java
===================================================================
--- trunk/src/schmitzm/jfree/feature/style/FeatureChartUtil.java	2010-08-19 15:55:11 UTC (rev 981)
+++ trunk/src/schmitzm/jfree/feature/style/FeatureChartUtil.java	2010-08-20 18:28:47 UTC (rev 982)
@@ -70,6 +70,7 @@
 import schmitzm.jfree.chart.style.ChartRendererStyle;
 import schmitzm.jfree.chart.style.ChartStyle;
 import schmitzm.jfree.chart.style.ChartStyleXMLFactory;
+import schmitzm.jfree.chart.style.ChartType;
 import schmitzm.jfree.feature.Feature2CategoryDatasetMapping;
 import schmitzm.jfree.feature.Feature2PieDatasetMapping;
 import schmitzm.jfree.feature.Feature2SeriesDatasetMapping;
@@ -758,6 +759,27 @@
             if ( seriesID != null )
               yAttrName = yAttrName + "_" + seriesID.toString();
             dataset.addValue(yValue, yAttrName, catValue);
+
+            //#########################
+            // Bei Bar-Charts mit mehreren Achsen ueberlagern sich
+            // die Balken der beiden Datasets, da die Balken unterschiedlicher
+            // Renderer nicht versetzt dargestellt werden, sondern einfach
+            // uebereinander!!
+            //
+            // Workaround (wie in JFreeChart-Demo "DualAxisDemo5"):
+            // Das Versetzen der Balken wird "simuliert", indem in allen
+            // Datasets Werte fuer ALLE Series hinterlegt werden.
+            // -> Im Haupt-Dataset wird der normale Wert hinterlegt
+            // -> In allen anderen Dataset wird NULL hintelegt, damit
+            //    kein Balken erscheint
+            if ( datasets.length > 1 && ChartType.BAR.equals(chartStyle.getType()) ) {
+              for (DefaultCategoryDataset d : datasets)
+                if ( d != dataset ) {
+                  d.addValue(null, JFreeChartUtil.DUMMY_SERIES_PREFIX+yAttrName, catValue);
+                }
+            }
+            //#########################
+            
             // If grouping series attribute is used, and a "legend title" attribute
             // is set, overwrite the legend label in the chart style 
             if ( seriesID != null && chartStyle.getSeriesLegendTitleAttributeName() != null ) {

Modified: trunk/src_junit/schmitzm/jfree/feature/style/FeatureChartStyleTest.java
===================================================================
--- trunk/src_junit/schmitzm/jfree/feature/style/FeatureChartStyleTest.java	2010-08-19 15:55:11 UTC (rev 981)
+++ trunk/src_junit/schmitzm/jfree/feature/style/FeatureChartStyleTest.java	2010-08-20 18:28:47 UTC (rev 982)
@@ -27,598 +27,792 @@
 import org.jfree.chart.axis.NumberTickUnit;
 import org.jfree.chart.axis.TickUnits;
 import org.jfree.chart.axis.ValueTick;
+import org.jfree.chart.plot.CategoryPlot;
+import org.jfree.data.category.CategoryDataset;
+import org.jfree.data.category.DefaultCategoryDataset;
 import org.jfree.ui.RectangleEdge;
 import org.jfree.ui.TextAnchor;
+import org.junit.Ignore;
 import org.junit.Test;
 import org.opengis.feature.simple.SimpleFeature;
 import org.opengis.feature.simple.SimpleFeatureType;
 
 import schmitzm.geotools.styling.TestingUtil2;
 import schmitzm.io.IOUtil;
+import schmitzm.jfree.chart.style.BasicChartStyle;
 import schmitzm.jfree.chart.style.ChartAxisStyle;
 import schmitzm.jfree.chart.style.ChartLabelStyle;
 import schmitzm.jfree.chart.style.ChartRendererStyle;
 import schmitzm.jfree.chart.style.ChartStyle;
+import schmitzm.jfree.chart.style.ChartStyleXMLFactory;
 import schmitzm.jfree.chart.style.ChartType;
 import schmitzm.jfree.table.AggregationFunction;
 
 public class FeatureChartStyleTest {
-	private static Logger log = Logger.getLogger(FeatureChartStyleTest.class);
+  private static Logger log = Logger.getLogger(FeatureChartStyleTest.class);
 
-	FeatureChartStyleXMLFactory xmlFactory = new FeatureChartStyleXMLFactory();
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	@Test
-	public void testLineChartDualAxis() throws IOException, CQLException,
-			InterruptedException {
+  FeatureChartStyleXMLFactory xmlFactoryFeature = new FeatureChartStyleXMLFactory();
+  ChartStyleXMLFactory xmlFactoryBasic = new ChartStyleXMLFactory();
+  
+  @Ignore
+  @Test
+  public void testLineChartDualAxis() throws IOException, CQLException,
+      InterruptedException {
 
-		FeatureCollection<SimpleFeatureType, SimpleFeature> testFeatures = TestingUtil2
-				.getTestFeatures();
+    FeatureCollection<SimpleFeatureType, SimpleFeature> testFeatures = TestingUtil2.getTestFeatures();
 
-		// Daten auf korrektheit überprüfen
-		String groupAttribName = "code"; // KreisZahl
-		SimpleFeatureType testDatenSchema = testFeatures.getSchema();
-		assertNotNull(testDatenSchema.getDescriptor(groupAttribName));
-		String variablenAttribName = "dm_u3"; // Deutsche "Männer" unter 3 Jahren
-		assertNotNull(testDatenSchema.getDescriptor(variablenAttribName));
-		String labelAttribName = "title"; // Attribute mit Label für Series
-		assertNotNull(testDatenSchema.getDescriptor(labelAttribName));
-		String domainAttribName = "jahr"; // Diese Variable soll auf der X-Achse
-		assertNotNull(testDatenSchema.getDescriptor(domainAttribName));
-		String variablenAttribName2 = "w_bev"; // Frauen Bevölkerung 
-		assertNotNull(testDatenSchema.getDescriptor(variablenAttribName2));
+    // Daten auf korrektheit überprüfen
+    String groupAttribName = "code"; // KreisZahl
+    SimpleFeatureType testDatenSchema = testFeatures.getSchema();
+    assertNotNull(testDatenSchema.getDescriptor(groupAttribName));
+    String variablenAttribName = "dm_u3"; // Deutsche "Männer" unter 3 Jahren
+    assertNotNull(testDatenSchema.getDescriptor(variablenAttribName));
+    String labelAttribName = "title"; // Attribute mit Label für Series
+    assertNotNull(testDatenSchema.getDescriptor(labelAttribName));
+    String domainAttribName = "jahr"; // Diese Variable soll auf der X-Achse
+    assertNotNull(testDatenSchema.getDescriptor(domainAttribName));
+    String variablenAttribName2 = "w_bev"; // Frauen Bevölkerung
+    assertNotNull(testDatenSchema.getDescriptor(variablenAttribName2));
 
-		ChartAxisStyle domainAxisStyle = new ChartAxisStyle("jahreszahlen",
-				Color.red, 0., 0.);
+    ChartAxisStyle domainAxisStyle = new ChartAxisStyle("jahreszahlen",
+        Color.red, 0., 0.);
 
-		ChartAxisStyle rangeAxisStyle = new ChartAxisStyle("deut. maenner",
-				Color.green, 0., 0.);
-		
-		ChartAxisStyle rangeAxisStyle2 = new ChartAxisStyle("Weibl. Bevölkerung",
-				Color.blue, 0., 0.);
+    ChartAxisStyle rangeAxisStyle = new ChartAxisStyle("deut. maenner",
+        Color.green, 0., 0.);
 
-		FeatureBasicChartStyle lineChartStyle = new FeatureBasicChartStyle(
-				"testDoubleLineChart", ChartType.LINE);
-		lineChartStyle.setAxisStyle(0, domainAxisStyle);
-		lineChartStyle.setAxisStyle(1, rangeAxisStyle);
-		lineChartStyle.setAxisStyle(2, rangeAxisStyle2);
+    ChartAxisStyle rangeAxisStyle2 = new ChartAxisStyle("Weibl. Bevölkerung",
+        Color.blue, 0., 0.);
 
-		lineChartStyle.setAttributeName(0, domainAttribName);
-		lineChartStyle.setAttributeName(1, variablenAttribName);
-		lineChartStyle.setAttributeName(2, variablenAttribName2);
-		lineChartStyle.setAttributeAxis(2, ChartStyle.RANGE_AXIS2);
+    FeatureBasicChartStyle lineChartStyle = new FeatureBasicChartStyle(
+        "testDoubleLineChart", ChartType.LINE);
+    lineChartStyle.setAxisStyle(0, domainAxisStyle);
+    lineChartStyle.setAxisStyle(1, rangeAxisStyle);
+    lineChartStyle.setAxisStyle(2, rangeAxisStyle2);
 
-		lineChartStyle.setSeriesAttributeName(groupAttribName);
-		
-		//lineChartStyle.setSeriesLegendTitleAttributeName(labelAttribName);
+    lineChartStyle.setAttributeName(0, domainAttribName);
+    lineChartStyle.setAttributeName(1, variablenAttribName);
+    lineChartStyle.setAttributeName(2, variablenAttribName2);
+    lineChartStyle.setAttributeAxis(2, ChartStyle.RANGE_AXIS2);
 
-		assertNull("Wenn nicht explizit gesetzt wird null geliefert",
-				lineChartStyle.getRendererStyle(0));
+    lineChartStyle.setSeriesAttributeName(groupAttribName);
 
-		ChartRendererStyle chartRendererStyle = new ChartRendererStyle();
+    // lineChartStyle.setSeriesLegendTitleAttributeName(labelAttribName);
 
-		chartRendererStyle.setDefaultPaint(Color.blue);
+    assertNull("Wenn nicht explizit gesetzt wird null geliefert",
+        lineChartStyle.getRendererStyle(0));
 
-		chartRendererStyle.setSeriesPaint(0, Color.green);
-		chartRendererStyle.setSeriesPaint(1, Color.red);
-		chartRendererStyle.setSeriesPaint(2, Color.GRAY);
-		lineChartStyle.setRendererStyle(0, chartRendererStyle);
+    ChartRendererStyle chartRendererStyle = new ChartRendererStyle();
 
-		assertEquals(3, chartRendererStyle.getSeriesCount());
+    chartRendererStyle.setDefaultPaint(Color.blue);
 
-		// Renderer style for the series dealing with the
-		// secondary axis.
-		ChartRendererStyle chartRendererStyle2 = new ChartRendererStyle();
-		chartRendererStyle2.setDefaultLineDashAttributes(5.0f,5.0f);
-		chartRendererStyle2.setSeriesLineWidth(1, 10);
-		chartRendererStyle2.setSeriesLineDashAttributes(1, 10f,10f);
-		lineChartStyle.setRendererStyle(1, chartRendererStyle2);
+    chartRendererStyle.setSeriesPaint(0, Color.green);
+    chartRendererStyle.setSeriesPaint(1, Color.red);
+    chartRendererStyle.setSeriesPaint(2, Color.GRAY);
+    lineChartStyle.setRendererStyle(0, chartRendererStyle);
 
-		
-		JFreeChart lineChart = lineChartStyle
-				.applyToFeatureCollection(testFeatures);
-		assertNotNull("applyToFeatureCollection lieferte null!", lineChart);
+    assertEquals(3, chartRendererStyle.getSeriesCount());
 
-		if (INTERACTIVE) {
-			ChartFrame chartFrame = new ChartFrame(
-					"Sechs Linien (3x2), Zwei Achsen",
-					lineChart);
-			chartFrame.pack();
-			chartFrame.setVisible(true);
-			while (chartFrame.isVisible()) {
-				Thread.sleep(100);
-			}
-		}
+    // Renderer style for the series dealing with the
+    // secondary axis.
+    ChartRendererStyle chartRendererStyle2 = new ChartRendererStyle();
+    chartRendererStyle2.setDefaultLineDashAttributes(5.0f, 5.0f);
+    chartRendererStyle2.setSeriesLineWidth(1, 10);
+    chartRendererStyle2.setSeriesLineDashAttributes(1, 10f, 10f);
+    lineChartStyle.setRendererStyle(1, chartRendererStyle2);
 
-		File testFile = File.createTempFile("testDoubleLineChart", ".xml");
-		xmlFactory.writeStyleToFile(lineChartStyle, "testDoubleLineChart", testFile);
+    JFreeChart lineChart = lineChartStyle.applyToFeatureCollection(testFeatures);
+    assertNotNull("applyToFeatureCollection lieferte null!", lineChart);
 
-		assertTrue(testFile.getAbsolutePath() + " wurde nicht geschrieben!",
-				testFile.exists());
+    if (INTERACTIVE) {
+      ChartFrame chartFrame = new ChartFrame("Sechs Linien (3x2), Zwei Achsen",
+          lineChart);
+      chartFrame.pack();
+      chartFrame.setVisible(true);
+      while (chartFrame.isVisible()) {
+        Thread.sleep(100);
+      }
+    }
 
-		String writtenXML = IOUtil.readFileAsString(testFile);
+    File testFile = File.createTempFile("testDoubleLineChart", ".xml");
+    xmlFactoryFeature.writeStyleToFile(lineChartStyle, "testDoubleLineChart", testFile);
 
-		// XML wieder einlesen
-		FeatureChartStyle lineChartAUsXMLgelesen = xmlFactory
-				.readStyleFromFile(testFile);
+    assertTrue(testFile.getAbsolutePath() + " wurde nicht geschrieben!",
+        testFile.exists());
 
-		// Nochmal in XML schreiben
-		File testFile2 = File.createTempFile("testDoubleLineChart", ".xml");
-		xmlFactory.writeStyleToFile(lineChartAUsXMLgelesen, "testDoubleLineChart",
-				testFile2);
-		String readXML = IOUtil.readFileAsString(testFile2);
-        System.out.println(writtenXML);
-        System.out.println(readXML);
-		assertEquals(
-				"Nachdem das Style geschrieben, gelesen und wieder geschrieben wurde ist das XML nicht gleich!",
-				writtenXML, readXML);
-	}
+    String writtenXML = IOUtil.readFileAsString(testFile);
 
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
+    // XML wieder einlesen
+    FeatureChartStyle lineChartAUsXMLgelesen = xmlFactoryFeature.readStyleFromFile(testFile);
 
-	/**
-	 * If tests are run on a system with head, we may theoretically open dialgs,
-	 * frames etc.
-	 **/
+    // Nochmal in XML schreiben
+    File testFile2 = File.createTempFile("testDoubleLineChart", ".xml");
+    xmlFactoryFeature.writeStyleToFile(lineChartAUsXMLgelesen, "testDoubleLineChart",
+        testFile2);
+    String readXML = IOUtil.readFileAsString(testFile2);
+    System.out.println(writtenXML);
+    System.out.println(readXML);
+    assertEquals(
+        "Nachdem das Style geschrieben, gelesen und wieder geschrieben wurde ist das XML nicht gleich!",
+        writtenXML, readXML);
+  }
 
-	boolean INTERACTIVE = !GraphicsEnvironment.isHeadless();
+  /**
+   * If tests are run on a system with head, we may theoretically open dialgs,
+   * frames etc.
+   **/
 
-	@Test
-	public void testBarChartSortedSeries() throws IOException,
-			InterruptedException {
+  boolean INTERACTIVE = !GraphicsEnvironment.isHeadless();
 
-		FeatureCollection<SimpleFeatureType, SimpleFeature> testFeatures = TestingUtil2
-				.getTestFeatures();
+  public CategoryDataset createSampleCategoryDataset1(boolean nullSecondary) {
+    // row keys...
+    String series1 = "Series 1";
+    String series2 = "Dummy 1";
 
-		// Daten auf korrektheit überprüfen
-		String groupAttribName = "jahr"; // KreisZahl
-		SimpleFeatureType testDatenSchema = testFeatures.getSchema();
-		assertNotNull(testDatenSchema.getDescriptor(groupAttribName));
-		String variablenAttribName = "dm_u3"; // Deutsche "Männer" unter 3
-		// Jahren
-		assertNotNull(testDatenSchema.getDescriptor(variablenAttribName));
-		String labelAttribName = "title"; // Attribute mit Label für Series
-		assertNotNull(testDatenSchema.getDescriptor(labelAttribName));
-		String domainAttribName = "code"; // Diese Variable soll auf der X-Achse
-		// angezeigt werden
-		assertNotNull(testDatenSchema.getDescriptor(domainAttribName));
+    // column keys...
+    String category1 = "Category 1";
+    String category2 = "Category 2";
+    String category3 = "Category 3";
+    String category4 = "Category 4";
 
-		ChartAxisStyle domainAxisStyle = new ChartAxisStyle("jahreszahlen",
-				Color.red, 0., 0.);
-		ChartAxisStyle rangeAxisStyle = new ChartAxisStyle("deut. maenner",
-				Color.green, 0., 0.);
+    // create the dataset...
+    DefaultCategoryDataset dataset = new DefaultCategoryDataset();
 
-		FeatureBasicChartStyle barChartStyle = new FeatureBasicChartStyle(
-				"testLineChart", ChartType.BAR);
+    dataset.addValue(1.0, series1, category1);
+    dataset.addValue(4.0, series1, category2);
+    dataset.addValue(3.0, series1, category3);
+    dataset.addValue(5.0, series1, category4);
 
-		barChartStyle.setAxisStyle(0, domainAxisStyle);
-		barChartStyle.setAxisStyle(1, rangeAxisStyle);
+    if (nullSecondary) {
+      dataset.addValue(null, series2, category1);
+      dataset.addValue(null, series2, category2);
+      dataset.addValue(null, series2, category3);
+      dataset.addValue(null, series2, category4);
+    }
+    return dataset;
+  }
+  
+  public CategoryDataset createSampleCategoryDataset2(boolean nullPrimary) {
+    // row keys...
+    String series1 = "Dummy 2";
+    String series2 = "Series 2";
 
-		// Jahreszahlen sollen nicht als zahlen interpretiert werden
-		barChartStyle.setForceCategories(true);
+    // column keys...
+    String category1 = "Category 1";
+    String category2 = "Category 2";
+    String category3 = "Category 3";
+    String category4 = "Category 4";
 
-		barChartStyle.setAttributeName(0, domainAttribName);
-		barChartStyle.setAttributeName(1, variablenAttribName);
+    // create the dataset...
+    DefaultCategoryDataset dataset = new DefaultCategoryDataset();
 
-		barChartStyle.setTooltips(true);
+    if ( nullPrimary ) {
+      dataset.addValue(null, series1, category1);
+      dataset.addValue(null, series1, category2);
+      dataset.addValue(null, series1, category3);
+      dataset.addValue(null, series1, category4);
+    }
+    
+    dataset.addValue(75.0, series2, category1);
+    dataset.addValue(87.0, series2, category2);
+    dataset.addValue(96.0, series2, category3);
+    dataset.addValue(68.0, series2, category4);
 
-		barChartStyle.setSeriesAttributeName(groupAttribName);
+    return dataset;
 
-		barChartStyle.setSortDomainAxis(true);
+  }
+  @Test
+  public void testBarChartDualAxisWithSampleData() throws IOException, InterruptedException {
+    ChartAxisStyle domainAxisStyle = new ChartAxisStyle("jahreszahlen",
+        Color.red, 0., 0.);
+    ChartAxisStyle rangeAxisStyle = new ChartAxisStyle("deut. maenner",
+        Color.green, 0., 0.);
+    ChartAxisStyle rangeAxisStyle2 = new ChartAxisStyle("Weibl. Bevölkerung",
+        Color.blue, 0., 0.);
 
-		assertNull("Wenn nicht explizit gesetzt wird null geliefert",
-				barChartStyle.getRendererStyle(0));
+    BasicChartStyle barChartStyle = new BasicChartStyle(
+        "testBarChartWith2Axis", ChartType.BAR);
+    
+    barChartStyle.setAxisStyle(0, domainAxisStyle);
+    barChartStyle.setAxisStyle(1, rangeAxisStyle);
+    barChartStyle.setAxisStyle(2, rangeAxisStyle2);
 
-		JFreeChart chart = barChartStyle.applyToFeatureCollection(testFeatures);
-		assertNotNull("applyToFeatureCollection liefte null!", chart);
+    
+    assertNull("Wenn nicht explizit gesetzt wird null geliefert",
+        barChartStyle.getRendererStyle(0));
 
-		BufferedImage chartpng = chart.createBufferedImage(600, 400);
-		assertNotNull("Es konnte kein PNG aus dem Chart erstellt werden!",
-				chartpng);
+    ChartRendererStyle chartRendererStyle = new ChartRendererStyle();
+    chartRendererStyle.setDefaultPaint(Color.blue);
+    chartRendererStyle.setSeriesPaint(0, Color.green);
+    chartRendererStyle.setSeriesPaint(1, Color.red);
+    chartRendererStyle.setSeriesPaint(2, Color.GRAY);
+    barChartStyle.setRendererStyle(0, chartRendererStyle);
+    assertEquals(3, chartRendererStyle.getSeriesCount());
 
-		if (INTERACTIVE) {
-			ChartFrame chartFrame = new ChartFrame(
-					"Die Balken sollten ihren Jahreszahlen entsprechend sortiert sein",
-					chart);
-			chartFrame.pack();
-			chartFrame.setVisible(true);
-			while (chartFrame.isVisible()) {
-				Thread.sleep(100);
-			}
-		}
-	}
+    // Renderer style for the series dealing with the
+    // secondary axis.
+    ChartRendererStyle chartRendererStyle2 = new ChartRendererStyle();
+    chartRendererStyle2.setDefaultLineDashAttributes(5.0f, 5.0f);
+    chartRendererStyle2.setSeriesLineWidth(1, 10);
+    chartRendererStyle2.setSeriesLineDashAttributes(1, 10f, 10f);
+    barChartStyle.setRendererStyle(1, chartRendererStyle2);
 
-	@Test
-	public void saveAndLoadWeightedChart() throws IOException {
-		FeatureBasicChartStyle weightChartStyle = new FeatureBasicChartStyle(
-				"testLineChart", ChartType.BAR);
-		weightChartStyle.setAttributeName(0, "attX");
-		weightChartStyle.setAttributeName(1, "attY");
-		weightChartStyle.setAttributeAggregation(1,
-				AggregationFunction.AVG_WEIGHTED);
-		weightChartStyle
-				.setAttributeAggregationWeightAttributeName(1, "weight");
+    CategoryDataset data1 = createSampleCategoryDataset1(true);
+    CategoryDataset data2 = createSampleCategoryDataset2(true);
+    
+    
+    
+    JFreeChart barChart = barChartStyle.applyToDataset(data1,data2);
+    assertNotNull("applyToDataset lieferte null!", barChart);
 
-		// In XML schreiben
-		File testFile = File.createTempFile("testWeightChart", ".xml");
-		xmlFactory.writeStyleToFile(weightChartStyle, "testWeightedhart",
-				testFile);
+    if (INTERACTIVE) {
+      ChartFrame chartFrame = new ChartFrame("Sechs Linien (3x2), Zwei Achsen",
+          barChart);
+      chartFrame.pack();
+      chartFrame.setVisible(true);
+      while (chartFrame.isVisible()) {
+        Thread.sleep(100);
+      }
+    }
 
-		System.out.println(IOUtil.readFileAsString(testFile));
+    File testFile = File.createTempFile("testDoubleLineChart", ".xml");
+    xmlFactoryBasic.writeStyleToFile(barChartStyle, "testDoubleLineChart", testFile);
 
-		// XML wieder einlesen
-		FeatureChartStyle weightChartAusXMLgelesen = xmlFactory
-				.readStyleFromFile(testFile);
-		assertEquals(AggregationFunction.AVG_WEIGHTED, weightChartAusXMLgelesen
-				.getAttributeAggregation(1));
-		assertEquals("weight", weightChartAusXMLgelesen
-				.getAttributeAggregationWeightAttributeName(1));
+    assertTrue(testFile.getAbsolutePath() + " wurde nicht geschrieben!",
+        testFile.exists());
 
-		// Nochmal in XML schreiben
-		File testFile2 = File.createTempFile("testWeightChart", ".xml");
-		xmlFactory.writeStyleToFile(weightChartStyle, "testWeightedhart",
-				testFile2);
+    String writtenXML = IOUtil.readFileAsString(testFile);
 
-		// XML wieder einlesen
-		FeatureChartStyle weightChartAusXMLgelesen2 = xmlFactory
-				.readStyleFromFile(testFile2);
-		assertEquals("weight", weightChartAusXMLgelesen2
-				.getAttributeAggregationWeightAttributeName(1));
+    // XML wieder einlesen
+    ChartStyle lineChartAUsXMLgelesen = xmlFactoryBasic.readStyleFromFile(testFile);
 
-		assertEquals(
-				"Nachdem das Style geschrieben, gelesen und wieder geschrieben wurde ist das XML nicht gleich!",
-				IOUtil.readFileAsString(testFile), IOUtil
-						.readFileAsString(testFile2));
-	}
+    // Nochmal in XML schreiben
+    File testFile2 = File.createTempFile("testDoubleLineChart", ".xml");
+    xmlFactoryBasic.writeStyleToFile(lineChartAUsXMLgelesen, "testDoubleLineChart",
+        testFile2);
+    String readXML = IOUtil.readFileAsString(testFile2);
+    System.out.println(writtenXML);
+    System.out.println(readXML);
+    assertEquals(
+        "Nachdem das Style geschrieben, gelesen und wieder geschrieben wurde ist das XML nicht gleich!",
+        writtenXML, readXML);
+  }
 
-	@Test
-	public void testBarChartForcedCategories() throws IOException,
-			InterruptedException {
+  @Test
+  public void testBarChartDualAxis() throws IOException, CQLException,
+      InterruptedException {
 
-		// Testdatenshape einlesen
-		FeatureCollection<SimpleFeatureType, SimpleFeature> testFeatures = TestingUtil2
-				.getTestFeatures();
+    FeatureCollection<SimpleFeatureType, SimpleFeature> testFeatures = TestingUtil2.getTestFeatures();
 
-		// Daten auf korrektheit überprüfen
-		assertEquals("Testfeatures muss 3x3 Features enthalten", 3 * 3,
-				testFeatures.size());
-		String groupAttribName = "code"; // KreisZahl
-		SimpleFeatureType testDatenSchema = testFeatures.getSchema();
-		assertNotNull(testDatenSchema.getDescriptor(groupAttribName));
-		String variablenAttribName = "dm_u3"; // Deutsche "Männer" unter 3
-		// Jahren
-		assertNotNull(testDatenSchema.getDescriptor(variablenAttribName));
-		String labelAttribName = "title"; // Attribute mit Label für Series
-		assertNotNull(testDatenSchema.getDescriptor(labelAttribName));
-		String domainAttribName = "jahr"; // Diese Variable soll auf der X-Achse
-		// angezeigt werden
-		assertNotNull(testDatenSchema.getDescriptor(domainAttribName));
+    // Daten auf korrektheit überprüfen
+    String groupAttribName = "code"; // KreisZahl
+    SimpleFeatureType testDatenSchema = testFeatures.getSchema();
+    assertNotNull(testDatenSchema.getDescriptor(groupAttribName));
+    String variablenAttribName = "dm_u3"; // Deutsche "Männer" unter 3 Jahren
+    assertNotNull(testDatenSchema.getDescriptor(variablenAttribName));
+    String labelAttribName = "title"; // Attribute mit Label für Series
+    assertNotNull(testDatenSchema.getDescriptor(labelAttribName));
+    String domainAttribName = "jahr"; // Diese Variable soll auf der X-Achse
+    assertNotNull(testDatenSchema.getDescriptor(domainAttribName));
+    String variablenAttribName2 = "w_bev"; // Frauen Bevölkerung
+    assertNotNull(testDatenSchema.getDescriptor(variablenAttribName2));
 
-		ChartAxisStyle domainAxisStyle = new ChartAxisStyle("jahreszahlen",
-				Color.red, 0., 0.);
-		ChartAxisStyle rangeAxisStyle = new ChartAxisStyle("deut. maenner",
-				Color.green, 0., 0.);
+    ChartAxisStyle domainAxisStyle = new ChartAxisStyle("jahreszahlen",
+        Color.red, 0., 0.);
 
-		FeatureBasicChartStyle barChartStyle = new FeatureBasicChartStyle(
-				"testLineChart", ChartType.BAR);
+    ChartAxisStyle rangeAxisStyle = new ChartAxisStyle("deut. maenner",
+        Color.green, 0., 0.);
 
-		barChartStyle.setAxisStyle(0, domainAxisStyle);
-		barChartStyle.setAxisStyle(1, rangeAxisStyle);
+    ChartAxisStyle rangeAxisStyle2 = new ChartAxisStyle("Weibl. Bevölkerung",
+        Color.blue, 0., 0.);
 
-		// Jahreszahlen sollen nicht als zahlen interpretiert werden
-		barChartStyle.setForceCategories(true);
+    FeatureBasicChartStyle barChartStyle = new FeatureBasicChartStyle(
+        "testDoubleBarChart", ChartType.BAR);
+    barChartStyle.setForceCategories(true);
+    barChartStyle.setSortDomainAxis(true);
+    barChartStyle.setAxisStyle(0, domainAxisStyle);
+    barChartStyle.setAxisStyle(1, rangeAxisStyle);
+    barChartStyle.setAxisStyle(2, rangeAxisStyle2);
 
-		barChartStyle.setAttributeName(0, domainAttribName);
-		barChartStyle.setAttributeName(1, variablenAttribName);
+    barChartStyle.setAttributeName(0, domainAttribName);
+    barChartStyle.setAttributeName(1, variablenAttribName);
+    barChartStyle.setAttributeName(2, variablenAttribName2);
+    barChartStyle.setAttributeAxis(2, ChartStyle.RANGE_AXIS2);
 
-		barChartStyle.setTooltips(true);
+    barChartStyle.setSeriesAttributeName(groupAttribName);
 
-		barChartStyle.setSeriesAttributeName(groupAttribName);
+    // barChartStyle.setSeriesLegendTitleAttributeName(labelAttribName);
 
-		assertNull("Wenn nicht explizit gesetzt wird null geliefert",
-				barChartStyle.getRendererStyle(0));
+    assertNull("Wenn nicht explizit gesetzt wird null geliefert",
+        barChartStyle.getRendererStyle(0));
 
-		ChartRendererStyle chartRendererStyle = new ChartRendererStyle();
+    ChartRendererStyle chartRendererStyle = new ChartRendererStyle();
 
-		chartRendererStyle.setSeriesLegendLabel(0, new ChartLabelStyle(
-				"test 1. label"));
+    chartRendererStyle.setDefaultPaint(Color.blue);
 
-		chartRendererStyle.setSeriesPaint(0, Color.green);
-		chartRendererStyle.setSeriesPaint(1, Color.red);
-		chartRendererStyle.setSeriesPaint(2, Color.GRAY);
-		barChartStyle.setRendererStyle(0, chartRendererStyle);
+    chartRendererStyle.setSeriesPaint(0, Color.green);
+    chartRendererStyle.setSeriesPaint(1, Color.red);
+    chartRendererStyle.setSeriesPaint(2, Color.GRAY);
+    barChartStyle.setRendererStyle(0, chartRendererStyle);
 
-		assertEquals(3, chartRendererStyle.getSeriesCount());
+    assertEquals(3, chartRendererStyle.getSeriesCount());
 
-		JFreeChart lineChart = barChartStyle
-				.applyToFeatureCollection(testFeatures);
-		assertNotNull("applyToFeatureCollection liefte null!", lineChart);
+    // Renderer style for the series dealing with the
+    // secondary axis.
+    ChartRendererStyle chartRendererStyle2 = new ChartRendererStyle();
+    chartRendererStyle2.setDefaultLineDashAttributes(5.0f, 5.0f);
+    chartRendererStyle2.setSeriesLineWidth(1, 10);
+    chartRendererStyle2.setSeriesLineDashAttributes(1, 10f, 10f);
+    barChartStyle.setRendererStyle(1, chartRendererStyle2);
 
-		BufferedImage chartpng = lineChart.createBufferedImage(600, 400);
-		assertNotNull("Es konnte kein PNG aus dem Chart erstellt werden!",
-				chartpng);
+    JFreeChart barChart = barChartStyle.applyToFeatureCollection(testFeatures);
+    assertNotNull("applyToFeatureCollection lieferte null!", barChart);
 
-		if (INTERACTIVE) {
-			ChartFrame chartFrame = new ChartFrame(
-					"Drei Balken sein, forcedCategory", lineChart);
-			chartFrame.pack();
-			chartFrame.setVisible(true);
-			while (chartFrame.isVisible()) {
-				Thread.sleep(100);
-			}
-		}
-	}
+    if (INTERACTIVE) {
+      ChartFrame chartFrame = new ChartFrame("Sechs Linien (3x2), Zwei Achsen",
+          barChart);
+      chartFrame.pack();
+      chartFrame.setVisible(true);
+      while (chartFrame.isVisible()) {
+        Thread.sleep(100);
+      }
+    }
 
-	@Test
-	public void testLineChartAsCategories() throws IOException, CQLException,
-			InterruptedException {
+    File testFile = File.createTempFile("testDoubleLineChart", ".xml");
+    xmlFactoryFeature.writeStyleToFile(barChartStyle, "testDoubleLineChart", testFile);
 
-		FeatureCollection<SimpleFeatureType, SimpleFeature> testFeatures = TestingUtil2
-				.getTestFeatures();
+    assertTrue(testFile.getAbsolutePath() + " wurde nicht geschrieben!",
+        testFile.exists());
 
-		// Daten auf korrektheit überprüfen
-		String groupAttribName = "code"; // KreisZahl
-		SimpleFeatureType testDatenSchema = testFeatures.getSchema();
-		assertNotNull(testDatenSchema.getDescriptor(groupAttribName));
-		String variablenAttribName = "dm_u3"; // Deutsche "Männer" unter 3
-		// Jahren
-		assertNotNull(testDatenSchema.getDescriptor(variablenAttribName));
-		String labelAttribName = "title"; // Attribute mit Label für Series
-		assertNotNull(testDatenSchema.getDescriptor(labelAttribName));
-		String domainAttribName = "jahr"; // Diese Variable soll auf der X-Achse
-		// angezeigt werden
-		assertNotNull(testDatenSchema.getDescriptor(domainAttribName));
+    String writtenXML = IOUtil.readFileAsString(testFile);
 
-		ChartAxisStyle domainAxisStyle = new ChartAxisStyle("jahreszahlen",
-				Color.red, 0., 0.);
-		ChartAxisStyle rangeAxisStyle = new ChartAxisStyle("deut. maenner",
-				Color.green, 0., 0.);
+    // XML wieder einlesen
+    FeatureChartStyle lineChartAUsXMLgelesen = xmlFactoryFeature.readStyleFromFile(testFile);
 
-		FeatureBasicChartStyle lineChartStyle = new FeatureBasicChartStyle(
-				"testLineChart", ChartType.LINE);
-		lineChartStyle.setAxisStyle(0, domainAxisStyle);
-		lineChartStyle.setAxisStyle(1, rangeAxisStyle);
+    // Nochmal in XML schreiben
+    File testFile2 = File.createTempFile("testDoubleLineChart", ".xml");
+    xmlFactoryFeature.writeStyleToFile(lineChartAUsXMLgelesen, "testDoubleLineChart",
+        testFile2);
+    String readXML = IOUtil.readFileAsString(testFile2);
+    System.out.println(writtenXML);
+    System.out.println(readXML);
+    assertEquals(
+        "Nachdem das Style geschrieben, gelesen und wieder geschrieben wurde ist das XML nicht gleich!",
+        writtenXML, readXML);
+  }
 
-		// Jahreszahlen sollen nicht als zahlen interpretiert werden
-		lineChartStyle.setForceCategories(true);
+  @Ignore
+  @Test
+  public void testBarChartSortedSeries() throws IOException,
+      InterruptedException {
 
-		lineChartStyle.setAttributeName(0, domainAttribName);
-		lineChartStyle.setAttributeName(1, variablenAttribName);
+    FeatureCollection<SimpleFeatureType, SimpleFeature> testFeatures = TestingUtil2.getTestFeatures();
 
-		lineChartStyle.setTooltips(true);
+    // Daten auf korrektheit überprüfen
+    String groupAttribName = "jahr"; // KreisZahl
+    SimpleFeatureType testDatenSchema = testFeatures.getSchema();
+    assertNotNull(testDatenSchema.getDescriptor(groupAttribName));
+    String variablenAttribName = "dm_u3"; // Deutsche "Männer" unter 3
+    // Jahren
+    assertNotNull(testDatenSchema.getDescriptor(variablenAttribName));
+    String labelAttribName = "title"; // Attribute mit Label für Series
+    assertNotNull(testDatenSchema.getDescriptor(labelAttribName));
+    String domainAttribName = "code"; // Diese Variable soll auf der X-Achse
+    // angezeigt werden
+    assertNotNull(testDatenSchema.getDescriptor(domainAttribName));
 
-		lineChartStyle.setSeriesAttributeName(groupAttribName);
+    ChartAxisStyle domainAxisStyle = new ChartAxisStyle("jahreszahlen",
+        Color.red, 0., 0.);
+    ChartAxisStyle rangeAxisStyle = new ChartAxisStyle("deut. maenner",
+        Color.green, 0., 0.);
 
-		lineChartStyle.setSeriesLegendTitleAttributeName(labelAttribName);
+    FeatureBasicChartStyle barChartStyle = new FeatureBasicChartStyle(
+        "testLineChart", ChartType.BAR);
 
-		assertNull("Wenn nicht explizit gesetzt wird null geliefert",
-				lineChartStyle.getRendererStyle(0));
+    barChartStyle.setAxisStyle(0, domainAxisStyle);
+    barChartStyle.setAxisStyle(1, rangeAxisStyle);
 
-		ChartRendererStyle chartRendererStyle = new ChartRendererStyle();
+    // Jahreszahlen sollen nicht als zahlen interpretiert werden
+    barChartStyle.setForceCategories(true);
 
-		// chartRendererStyle.setSeriesLegendLabel(0, new ChartLabelStyle(
-		// "test 1. label"));
+    barChartStyle.setAttributeName(0, domainAttribName);
+    barChartStyle.setAttributeName(1, variablenAttribName);
 
-		chartRendererStyle.setDefaultPaint(Color.blue);
+    barChartStyle.setTooltips(true);
 
-		chartRendererStyle.setSeriesPaint(0, Color.green);
-		chartRendererStyle.setSeriesPaint(1, Color.red);
-		chartRendererStyle.setSeriesPaint(2, Color.GRAY);
-		lineChartStyle.setRendererStyle(0, chartRendererStyle);
+    barChartStyle.setSeriesAttributeName(groupAttribName);
 
-		assertEquals(3, chartRendererStyle.getSeriesCount());
+    barChartStyle.setSortDomainAxis(true);
 
-		JFreeChart lineChart = lineChartStyle
-				.applyToFeatureCollection(testFeatures);
-		assertNotNull("applyToFeatureCollection liefte null!", lineChart);
+    assertNull("Wenn nicht explizit gesetzt wird null geliefert",
+        barChartStyle.getRendererStyle(0));
 
-		BufferedImage chartpng = lineChart.createBufferedImage(600, 400);
-		assertNotNull("Es konnte kein PNG aus dem Chart erstellt werden!",
-				chartpng);
+    JFreeChart chart = barChartStyle.applyToFeatureCollection(testFeatures);
+    assertNotNull("applyToFeatureCollection liefte null!", chart);
 
-		if (INTERACTIVE) {
-			ChartFrame chartFrame = new ChartFrame(
-					"drei linien, forcedCategories, mit series title kreisname",
-					lineChart);
-			chartFrame.pack();
-			chartFrame.setVisible(true);
-			while (chartFrame.isVisible()) {
-				Thread.sleep(100);
-			}
-		}
+    BufferedImage chartpng = chart.createBufferedImage(600, 400);
+    assertNotNull("Es konnte kein PNG aus dem Chart erstellt werden!", chartpng);
 
-		// Jetzt nur soll noch eine Line kommen:
-		chartRendererStyle.setSeriesLegendLabel(0, null);
-		lineChartStyle.addSeriesAttributeNoDataValue("06532");
-		lineChartStyle.addSeriesAttributeNoDataValue("06531");
-		lineChart = lineChartStyle.applyToFeatureCollection(testFeatures);
-		assertNotNull("applyToFeatureCollection liefte null!", lineChart);
-		if (INTERACTIVE) {
-			ChartFrame chartFrame = new ChartFrame(
-					"test line chart: soll nur line 06533 existieren!",
-					lineChart);
-			chartFrame.pack();
-			chartFrame.setVisible(true);
-			while (chartFrame.isVisible()) {
-				Thread.sleep(100);
-			}
-		}
+    if (INTERACTIVE) {
+      ChartFrame chartFrame = new ChartFrame(
+          "Die Balken sollten ihren Jahreszahlen entsprechend sortiert sein",
+          chart);
+      chartFrame.pack();
+      chartFrame.setVisible(true);
+      while (chartFrame.isVisible()) {
+        Thread.sleep(100);
+      }
+    }
+  }
 
-		File testFile = File.createTempFile("testLineChart", ".xml");
-		xmlFactory.writeStyleToFile(lineChartStyle, "testLineChart", testFile);
+  @Ignore
+  @Test
+  public void saveAndLoadWeightedChart() throws IOException {
+    FeatureBasicChartStyle weightChartStyle = new FeatureBasicChartStyle(
+        "testLineChart", ChartType.BAR);
+    weightChartStyle.setAttributeName(0, "attX");
+    weightChartStyle.setAttributeName(1, "attY");
+    weightChartStyle.setAttributeAggregation(1,
+        AggregationFunction.AVG_WEIGHTED);
+    weightChartStyle.setAttributeAggregationWeightAttributeName(1, "weight");
 
-		assertTrue(testFile.getAbsolutePath() + " wurde nicht geschrieben!",
-				testFile.exists());
+    // In XML schreiben
+    File testFile = File.createTempFile("testWeightChart", ".xml");
+    xmlFactoryFeature.writeStyleToFile(weightChartStyle, "testWeightedhart", testFile);
 
-		String writtenXML = IOUtil.readFileAsString(testFile);
-		System.out.println(writtenXML);
-		assertTrue(
-				"<seriesAttr name=\"code\" nullAliases=\"06531;06532\" fehlt!",
-				writtenXML
-						.contains("<seriesAttr name=\"code\" nullAliases=\"06531;06532\""));
+    System.out.println(IOUtil.readFileAsString(testFile));
 
-		assertTrue("Nodatawerte wurden mehr als einmal in das XML geschrieben",
-				writtenXML.indexOf("06531;06532") == writtenXML
-						.lastIndexOf("06531;06532"));
+    // XML wieder einlesen
+    FeatureChartStyle weightChartAusXMLgelesen = xmlFactoryFeature.readStyleFromFile(testFile);
+    assertEquals(AggregationFunction.AVG_WEIGHTED,
+        weightChartAusXMLgelesen.getAttributeAggregation(1));
+    assertEquals("weight",
+        weightChartAusXMLgelesen.getAttributeAggregationWeightAttributeName(1));
 
-		// XML wieder einlesen
-		FeatureChartStyle lineChartAUsXMLgelesen = xmlFactory
-				.readStyleFromFile(testFile);
+    // Nochmal in XML schreiben
+    File testFile2 = File.createTempFile("testWeightChart", ".xml");
+    xmlFactoryFeature.writeStyleToFile(weightChartStyle, "testWeightedhart", testFile2);
 
-		// Nochmal in XML schreiben
-		File testFile2 = File.createTempFile("testLineChart", ".xml");
-		xmlFactory.writeStyleToFile(lineChartAUsXMLgelesen, "testLineChart",
-				testFile2);
-		assertEquals(
-				"Nachdem das Style geschrieben, gelesen und wieder geschrieben wurde ist das XML nicht gleich!",
-				writtenXML, IOUtil.readFileAsString(testFile2));
-	}
+    // XML wieder einlesen
+    FeatureChartStyle weightChartAusXMLgelesen2 = xmlFactoryFeature.readStyleFromFile(testFile2);
+    assertEquals("weight",
+        weightChartAusXMLgelesen2.getAttributeAggregationWeightAttributeName(1));
 
-	@Test
-	public void testLineChartNOTCategories() throws IOException, CQLException,
-			InterruptedException {
+    assertEquals(
+        "Nachdem das Style geschrieben, gelesen und wieder geschrieben wurde ist das XML nicht gleich!",
+        IOUtil.readFileAsString(testFile), IOUtil.readFileAsString(testFile2));
+  }
 
-		FeatureCollection<SimpleFeatureType, SimpleFeature> testFeatures = TestingUtil2
-				.getTestFeatures();
+  @Ignore
+  @Test
+  public void testBarChartForcedCategories() throws IOException,
+      InterruptedException {
 
-		// Daten auf korrektheit überprüfen
-		String groupAttribName = "code"; // KreisZahl
-		SimpleFeatureType testDatenSchema = testFeatures.getSchema();
-		assertNotNull(testDatenSchema.getDescriptor(groupAttribName));
-		String variablenAttribName = "dm_u3"; // Deutsche "Männer" unter 3
-		// Jahren
-		assertNotNull(testDatenSchema.getDescriptor(variablenAttribName));
-		String labelAttribName = "title"; // Attribute mit Label für Series
-		assertNotNull(testDatenSchema.getDescriptor(labelAttribName));
-		String domainAttribName = "jahr"; // Diese Variable soll auf der X-Achse
-		// angezeigt werden
-		assertNotNull(testDatenSchema.getDescriptor(domainAttribName));
+    // Testdatenshape einlesen
+    FeatureCollection<SimpleFeatureType, SimpleFeature> testFeatures = TestingUtil2.getTestFeatures();
 
-		ChartAxisStyle domainAxisStyle = new ChartAxisStyle("jahreszahlen",
-				Color.red, 0., 0.);
+    // Daten auf korrektheit überprüfen
+    assertEquals("Testfeatures muss 3x3 Features enthalten", 3 * 3,
+        testFeatures.size());
+    String groupAttribName = "code"; // KreisZahl
+    SimpleFeatureType testDatenSchema = testFeatures.getSchema();
+    assertNotNull(testDatenSchema.getDescriptor(groupAttribName));
+    String variablenAttribName = "dm_u3"; // Deutsche "Männer" unter 3
+    // Jahren
+    assertNotNull(testDatenSchema.getDescriptor(variablenAttribName));
+    String labelAttribName = "title"; // Attribute mit Label für Series
+    assertNotNull(testDatenSchema.getDescriptor(labelAttribName));
+    String domainAttribName = "jahr"; // Diese Variable soll auf der X-Achse
+    // angezeigt werden
+    assertNotNull(testDatenSchema.getDescriptor(domainAttribName));
 
-		ChartAxisStyle rangeAxisStyle = new ChartAxisStyle("deut. maenner",
-				Color.green, 0., 0.);
+    ChartAxisStyle domainAxisStyle = new ChartAxisStyle("jahreszahlen",
+        Color.red, 0., 0.);
+    ChartAxisStyle rangeAxisStyle = new ChartAxisStyle("deut. maenner",
+        Color.green, 0., 0.);
 
-		FeatureBasicChartStyle lineChartStyle = new FeatureBasicChartStyle(
-				"testLineChart", ChartType.LINE);
-		lineChartStyle.setAxisStyle(0, domainAxisStyle);
-		lineChartStyle.setAxisStyle(1, rangeAxisStyle);
+    FeatureBasicChartStyle barChartStyle = new FeatureBasicChartStyle(
+        "testLineChart", ChartType.BAR);
 
-		lineChartStyle.setAttributeName(0, domainAttribName);
-		lineChartStyle.setAttributeName(1, variablenAttribName);
+    barChartStyle.setAxisStyle(0, domainAxisStyle);
+    barChartStyle.setAxisStyle(1, rangeAxisStyle);
 
-		lineChartStyle.setSeriesLegendTitleAttributeName(labelAttribName);
+    // Jahreszahlen sollen nicht als zahlen interpretiert werden
+    barChartStyle.setForceCategories(true);
 
-		lineChartStyle.setTooltips(true);
+    barChartStyle.setAttributeName(0, domainAttribName);
+    barChartStyle.setAttributeName(1, variablenAttribName);
 
-		lineChartStyle.setSeriesAttributeName(groupAttribName);
+    barChartStyle.setTooltips(true);
 
-		assertNull("Wenn nicht explizit gesetzt wird null geliefert",
-				lineChartStyle.getRendererStyle(0));
+    barChartStyle.setSeriesAttributeName(groupAttribName);
 
-		ChartRendererStyle chartRendererStyle = new ChartRendererStyle();
+    assertNull("Wenn nicht explizit gesetzt wird null geliefert",
+        barChartStyle.getRendererStyle(0));
 
-		chartRendererStyle.setDefaultPaint(Color.blue);
+    ChartRendererStyle chartRendererStyle = new ChartRendererStyle();
 
-		chartRendererStyle.setSeriesPaint(0, Color.green);
-		chartRendererStyle.setSeriesPaint(1, Color.red);
-		chartRendererStyle.setSeriesPaint(2, Color.GRAY);
-		lineChartStyle.setRendererStyle(0, chartRendererStyle);
+    chartRendererStyle.setSeriesLegendLabel(0, new ChartLabelStyle(
+        "test 1. label"));
 
-		assertEquals(3, chartRendererStyle.getSeriesCount());
+    chartRendererStyle.setSeriesPaint(0, Color.green);
+    chartRendererStyle.setSeriesPaint(1, Color.red);
+    chartRendererStyle.setSeriesPaint(2, Color.GRAY);
+    barChartStyle.setRendererStyle(0, chartRendererStyle);
 
-		JFreeChart lineChart = lineChartStyle
-				.applyToFeatureCollection(testFeatures);
-		assertNotNull("applyToFeatureCollection liefte null!", lineChart);
+    assertEquals(3, chartRendererStyle.getSeriesCount());
 
-		BufferedImage chartpng = lineChart.createBufferedImage(600, 400);
-		assertNotNull("Es konnte kein PNG aus dem Chart erstellt werden!",
-				chartpng);
+    JFreeChart lineChart = barChartStyle.applyToFeatureCollection(testFeatures);
+    assertNotNull("applyToFeatureCollection liefte null!", lineChart);
 
-		lineChart.getXYPlot().getDomainAxis().setAutoTickUnitSelection(false);
-		TickUnits units = new TickUnits();
-		NumberFormat myNumberFormat = NumberFormat.getNumberInstance();
-		units.add(new NumberTickUnit(2005, myNumberFormat));
-		units.add(new NumberTickUnit(2007, myNumberFormat));
-		units.add(new NumberTickUnit(2008, myNumberFormat));
-		// da = lineChart.getXYPlot().getDomainAxis();
-		NumberAxis numberAxis = new NumberAxis() {
-			@Override
-			public List refreshTicks(Graphics2D g2, AxisState state,
-					Rectangle2D dataArea, RectangleEdge edge) {
+    BufferedImage chartpng = lineChart.createBufferedImage(600, 400);
+    assertNotNull("Es konnte kein PNG aus dem Chart erstellt werden!", chartpng);
 
-				List<ValueTick> ticks = new ArrayList<ValueTick>();
-				TextAnchor ra = TextAnchor.CENTER;
-				TextAnchor ta = TextAnchor.CENTER;
-				ticks.add(new NumberTick(2005, "2005", ta, ra, 0.));
-				ticks.add(new NumberTick(2006, "2006", ta, ra, 0.));
-				ticks.add(new NumberTick(2007, "2007", ta, ra, 0.));
-				ticks.add(new NumberTick(2008, "2008", ta, ra, 0.));
+    if (INTERACTIVE) {
+      ChartFrame chartFrame = new ChartFrame(
+          "Drei Balken sein, forcedCategory", lineChart);
+      chartFrame.pack();
+      chartFrame.setVisible(true);
+      while (chartFrame.isVisible()) {
+        Thread.sleep(100);
+      }
+    }
+  }
 
-				return ticks;
+  @Ignore
+  @Test
+  public void testLineChartAsCategories() throws IOException, CQLException,
+      InterruptedException {
 
-			}
-		};
-		lineChart.getXYPlot().setDomainAxis(numberAxis);
-		lineChartStyle.applyToChart(lineChart);
+    FeatureCollection<SimpleFeatureType, SimpleFeature> testFeatures = TestingUtil2.getTestFeatures();
 
-		if (INTERACTIVE) {
-			ChartFrame chartFrame = new ChartFrame(
-					"drei linien, NOT categories, KreisNamen series titles",
-					lineChart);
-			chartFrame.pack();
-			chartFrame.setVisible(true);
-			while (chartFrame.isVisible()) {
-				Thread.sleep(100);
-			}
-		}
+    // Daten auf korrektheit überprüfen
+    String groupAttribName = "code"; // KreisZahl
+    SimpleFeatureType testDatenSchema = testFeatures.getSchema();
+    assertNotNull(testDatenSchema.getDescriptor(groupAttribName));
+    String variablenAttribName = "dm_u3"; // Deutsche "Männer" unter 3
+    // Jahren
+    assertNotNull(testDatenSchema.getDescriptor(variablenAttribName));
+    String labelAttribName = "title"; // Attribute mit Label für Series
+    assertNotNull(testDatenSchema.getDescriptor(labelAttribName));
+    String domainAttribName = "jahr"; // Diese Variable soll auf der X-Achse
+    // angezeigt werden
+    assertNotNull(testDatenSchema.getDescriptor(domainAttribName));
 
-		File testFile = File.createTempFile("testLineChart", ".xml");
-		xmlFactory.writeStyleToFile(lineChartStyle, "testLineChart", testFile);
+    ChartAxisStyle domainAxisStyle = new ChartAxisStyle("jahreszahlen",
+        Color.red, 0., 0.);
+    ChartAxisStyle rangeAxisStyle = new ChartAxisStyle("deut. maenner",
+        Color.green, 0., 0.);
 
-		assertTrue(testFile.getAbsolutePath() + " wurde nicht geschrieben!",
-				testFile.exists());
+    FeatureBasicChartStyle lineChartStyle = new FeatureBasicChartStyle(
+        "testLineChart", ChartType.LINE);
+    lineChartStyle.setAxisStyle(0, domainAxisStyle);
+    lineChartStyle.setAxisStyle(1, rangeAxisStyle);
 
-		String writtenXML = IOUtil.readFileAsString(testFile);
+    // Jahreszahlen sollen nicht als zahlen interpretiert werden
+    lineChartStyle.setForceCategories(true);
 
-		// XML wieder einlesen
-		FeatureChartStyle lineChartAUsXMLgelesen = xmlFactory
-				.readStyleFromFile(testFile);
+    lineChartStyle.setAttributeName(0, domainAttribName);
+    lineChartStyle.setAttributeName(1, variablenAttribName);
 
-		// Nochmal in XML schreiben
-		File testFile2 = File.createTempFile("testLineChart", ".xml");
-		xmlFactory.writeStyleToFile(lineChartAUsXMLgelesen, "testLineChart",
-				testFile2);
-		assertEquals(
-				"Nachdem das Style geschrieben, gelesen und wieder geschrieben wurde ist das XML nicht gleich!",
-				writtenXML, IOUtil.readFileAsString(testFile2));
-	}
-	
-	
-	
-	
+    lineChartStyle.setTooltips(true);
 
+    lineChartStyle.setSeriesAttributeName(groupAttribName);
 
+    lineChartStyle.setSeriesLegendTitleAttributeName(labelAttribName);
+
+    assertNull("Wenn nicht explizit gesetzt wird null geliefert",
+        lineChartStyle.getRendererStyle(0));
+
+    ChartRendererStyle chartRendererStyle = new ChartRendererStyle();
+
+    // chartRendererStyle.setSeriesLegendLabel(0, new ChartLabelStyle(
+    // "test 1. label"));
+
+    chartRendererStyle.setDefaultPaint(Color.blue);
+
+    chartRendererStyle.setSeriesPaint(0, Color.green);
+    chartRendererStyle.setSeriesPaint(1, Color.red);
+    chartRendererStyle.setSeriesPaint(2, Color.GRAY);
+    lineChartStyle.setRendererStyle(0, chartRendererStyle);
+
+    assertEquals(3, chartRendererStyle.getSeriesCount());
+
+    JFreeChart lineChart = lineChartStyle.applyToFeatureCollection(testFeatures);
+    assertNotNull("applyToFeatureCollection liefte null!", lineChart);
+
+    BufferedImage chartpng = lineChart.createBufferedImage(600, 400);
+    assertNotNull("Es konnte kein PNG aus dem Chart erstellt werden!", chartpng);
+
+    if (INTERACTIVE) {
+      ChartFrame chartFrame = new ChartFrame(
+          "drei linien, forcedCategories, mit series title kreisname",
+          lineChart);
+      chartFrame.pack();
+      chartFrame.setVisible(true);
+      while (chartFrame.isVisible()) {
+        Thread.sleep(100);
+      }
+    }
+
+    // Jetzt nur soll noch eine Line kommen:
+    chartRendererStyle.setSeriesLegendLabel(0, null);
+    lineChartStyle.addSeriesAttributeNoDataValue("06532");
+    lineChartStyle.addSeriesAttributeNoDataValue("06531");
+    lineChart = lineChartStyle.applyToFeatureCollection(testFeatures);
+    assertNotNull("applyToFeatureCollection liefte null!", lineChart);
+    if (INTERACTIVE) {
+      ChartFrame chartFrame = new ChartFrame(
+          "test line chart: soll nur line 06533 existieren!", lineChart);
+      chartFrame.pack();
+      chartFrame.setVisible(true);
+      while (chartFrame.isVisible()) {
+        Thread.sleep(100);
+      }
+    }
+
+    File testFile = File.createTempFile("testLineChart", ".xml");
+    xmlFactoryFeature.writeStyleToFile(lineChartStyle, "testLineChart", testFile);
+
+    assertTrue(testFile.getAbsolutePath() + " wurde nicht geschrieben!",
+        testFile.exists());
+
+    String writtenXML = IOUtil.readFileAsString(testFile);
+    System.out.println(writtenXML);
+    assertTrue(
+        "<seriesAttr name=\"code\" nullAliases=\"06531;06532\" fehlt!",
+        writtenXML.contains("<seriesAttr name=\"code\" nullAliases=\"06531;06532\""));
+
+    assertTrue(
+        "Nodatawerte wurden mehr als einmal in das XML geschrieben",
+        writtenXML.indexOf("06531;06532") == writtenXML.lastIndexOf("06531;06532"));
+
+    // XML wieder einlesen
+    FeatureChartStyle lineChartAUsXMLgelesen = xmlFactoryFeature.readStyleFromFile(testFile);
+
+    // Nochmal in XML schreiben
+    File testFile2 = File.createTempFile("testLineChart", ".xml");
+    xmlFactoryFeature.writeStyleToFile(lineChartAUsXMLgelesen, "testLineChart",
+        testFile2);
+    assertEquals(
+        "Nachdem das Style geschrieben, gelesen und wieder geschrieben wurde ist das XML nicht gleich!",
+        writtenXML, IOUtil.readFileAsString(testFile2));
+  }
+
+  @Ignore
+  @Test
+  public void testLineChartNOTCategories() throws IOException, CQLException,
+      InterruptedException {
+
+    FeatureCollection<SimpleFeatureType, SimpleFeature> testFeatures = TestingUtil2.getTestFeatures();
+
+    // Daten auf korrektheit überprüfen
+    String groupAttribName = "code"; // KreisZahl
+    SimpleFeatureType testDatenSchema = testFeatures.getSchema();
+    assertNotNull(testDatenSchema.getDescriptor(groupAttribName));
+    String variablenAttribName = "dm_u3"; // Deutsche "Männer" unter 3
+    // Jahren
+    assertNotNull(testDatenSchema.getDescriptor(variablenAttribName));
+    String labelAttribName = "title"; // Attribute mit Label für Series
+    assertNotNull(testDatenSchema.getDescriptor(labelAttribName));
+    String domainAttribName = "jahr"; // Diese Variable soll auf der X-Achse
+    // angezeigt werden
+    assertNotNull(testDatenSchema.getDescriptor(domainAttribName));
+
+    ChartAxisStyle domainAxisStyle = new ChartAxisStyle("jahreszahlen",
+        Color.red, 0., 0.);
+
+    ChartAxisStyle rangeAxisStyle = new ChartAxisStyle("deut. maenner",
+        Color.green, 0., 0.);
+
+    FeatureBasicChartStyle lineChartStyle = new FeatureBasicChartStyle(
+        "testLineChart", ChartType.LINE);
+    lineChartStyle.setAxisStyle(0, domainAxisStyle);
+    lineChartStyle.setAxisStyle(1, rangeAxisStyle);
+
+    lineChartStyle.setAttributeName(0, domainAttribName);
+    lineChartStyle.setAttributeName(1, variablenAttribName);
+
+    lineChartStyle.setSeriesLegendTitleAttributeName(labelAttribName);
+
+    lineChartStyle.setTooltips(true);
+
+    lineChartStyle.setSeriesAttributeName(groupAttribName);
+
+    assertNull("Wenn nicht explizit gesetzt wird null geliefert",
+        lineChartStyle.getRendererStyle(0));
+
+    ChartRendererStyle chartRendererStyle = new ChartRendererStyle();
+
+    chartRendererStyle.setDefaultPaint(Color.blue);
+
+    chartRendererStyle.setSeriesPaint(0, Color.green);
+    chartRendererStyle.setSeriesPaint(1, Color.red);
+    chartRendererStyle.setSeriesPaint(2, Color.GRAY);
+    lineChartStyle.setRendererStyle(0, chartRendererStyle);
+
+    assertEquals(3, chartRendererStyle.getSeriesCount());
+
+    JFreeChart lineChart = lineChartStyle.applyToFeatureCollection(testFeatures);
+    assertNotNull("applyToFeatureCollection liefte null!", lineChart);
+
+    BufferedImage chartpng = lineChart.createBufferedImage(600, 400);
+    assertNotNull("Es konnte kein PNG aus dem Chart erstellt werden!", chartpng);
+
+    lineChart.getXYPlot().getDomainAxis().setAutoTickUnitSelection(false);
+    TickUnits units = new TickUnits();
+    NumberFormat myNumberFormat = NumberFormat.getNumberInstance();
+    units.add(new NumberTickUnit(2005, myNumberFormat));
+    units.add(new NumberTickUnit(2007, myNumberFormat));
+    units.add(new NumberTickUnit(2008, myNumberFormat));
+    // da = lineChart.getXYPlot().getDomainAxis();
+    NumberAxis numberAxis = new NumberAxis() {
+      @Override
+      public List refreshTicks(Graphics2D g2, AxisState state,
+          Rectangle2D dataArea, RectangleEdge edge) {
+
+        List<ValueTick> ticks = new ArrayList<ValueTick>();
+        TextAnchor ra = TextAnchor.CENTER;
+        TextAnchor ta = TextAnchor.CENTER;
+        ticks.add(new NumberTick(2005, "2005", ta, ra, 0.));
+        ticks.add(new NumberTick(2006, "2006", ta, ra, 0.));
+        ticks.add(new NumberTick(2007, "2007", ta, ra, 0.));
+        ticks.add(new NumberTick(2008, "2008", ta, ra, 0.));
+
+        return ticks;
+
+      }
+    };
+    lineChart.getXYPlot().setDomainAxis(numberAxis);
+    lineChartStyle.applyToChart(lineChart);
+
+    if (INTERACTIVE) {
+      ChartFrame chartFrame = new ChartFrame(
+          "drei linien, NOT categories, KreisNamen series titles", lineChart);
+      chartFrame.pack();
+      chartFrame.setVisible(true);
+      while (chartFrame.isVisible()) {
+        Thread.sleep(100);
+      }
+    }
+
+    File testFile = File.createTempFile("testLineChart", ".xml");
+    xmlFactoryFeature.writeStyleToFile(lineChartStyle, "testLineChart", testFile);
+
+    assertTrue(testFile.getAbsolutePath() + " wurde nicht geschrieben!",
+        testFile.exists());
+
+    String writtenXML = IOUtil.readFileAsString(testFile);
+
+    // XML wieder einlesen
+    FeatureChartStyle lineChartAUsXMLgelesen = xmlFactoryFeature.readStyleFromFile(testFile);
+
+    // Nochmal in XML schreiben
+    File testFile2 = File.createTempFile("testLineChart", ".xml");
+    xmlFactoryFeature.writeStyleToFile(lineChartAUsXMLgelesen, "testLineChart",
+        testFile2);
+    assertEquals(
+        "Nachdem das Style geschrieben, gelesen und wieder geschrieben wurde ist das XML nicht gleich!",
+        writtenXML, IOUtil.readFileAsString(testFile2));
+  }
+
 }



More information about the Schmitzm-commits mailing list