View Javadoc

1   package net.sf.statcvs.charts;
2   
3   import java.awt.Color;
4   import java.awt.Dimension;
5   import java.util.Collection;
6   import java.util.Iterator;
7   import java.util.List;
8   
9   import net.sf.statcvs.Messages;
10  import net.sf.statcvs.output.ReportConfig;
11  import net.sf.statcvs.reportmodel.TimeLine;
12  import net.sf.statcvs.reportmodel.TimePoint;
13  
14  import org.jfree.chart.ChartFactory;
15  import org.jfree.chart.JFreeChart;
16  import org.jfree.chart.annotations.XYAnnotation;
17  import org.jfree.chart.axis.DateAxis;
18  import org.jfree.chart.plot.XYPlot;
19  import org.jfree.chart.renderer.xy.XYItemRenderer;
20  import org.jfree.chart.renderer.xy.XYStepRenderer;
21  import org.jfree.data.time.Millisecond;
22  import org.jfree.data.time.TimeSeries;
23  import org.jfree.data.time.TimeSeriesCollection;
24  import org.jfree.data.xy.XYDataset;
25  
26  /**
27   * Creates charts from {@link net.sf.statcvs.reportmodel.TimeLine}s.
28   *
29   * @author Richard Cyganiak
30   * @version $Id: TimeLineChartMaker.java,v 1.11 2009/04/25 16:36:20 benoitx Exp $
31   */
32  public class TimeLineChartMaker {
33      private final ReportConfig config;
34      private final TimeLine timeLine;
35      private final String fileName;
36      private final List annotations;
37      private final String chartName;
38  
39      /**
40       * Creates a chart from a time line.
41       * @param config The configuration to use
42       * @param timeLine the time line data for the chart 
43       * @param fileName the file name for the PNG image
44       */
45      public TimeLineChartMaker(final String chartName, final ReportConfig config, final TimeLine timeLine, final String fileName, final Collection symbolicNames) {
46          this.chartName = chartName;
47          this.config = config;
48          this.timeLine = timeLine;
49          this.fileName = fileName;
50          this.annotations = SymbolicNameAnnotation.createAnnotations(symbolicNames);
51      }
52  
53      public ChartImage toFile() {
54          if (this.timeLine.isEmpty()) {
55              return null;
56          }
57          final TimeSeriesCollection collection = new TimeSeriesCollection();
58          collection.addSeries(createTimeSeries(timeLine));
59  
60          final String range = timeLine.getRangeLabel();
61          final String domain = Messages.getString("DOMAIN_TIME");
62  
63          final XYDataset data = collection;
64          final JFreeChart chart = ChartFactory.createTimeSeriesChart(this.config.getProjectName() + ": " + timeLine.getTitle(), domain, range, data, false,
65                  false, false);
66  
67          final XYPlot plot = (XYPlot) chart.getPlot();
68          plot.getRenderer().setSeriesPaint(0, Color.blue);
69          final DateAxis axis = (DateAxis) plot.getDomainAxis();
70          axis.setVerticalTickLabels(true);
71          plot.getRangeAxis().setLowerBound(0);
72          plot.setRenderer(new XYStepRenderer());
73          for (final Iterator it = annotations.iterator(); it.hasNext();) {
74              plot.addAnnotation((XYAnnotation) it.next());
75          }
76  
77          plot.setBackgroundPaint(ChartConfigUtil.getPlotColor(chartName));
78          chart.setBackgroundPaint(ChartConfigUtil.getBackgroundColor(chartName));
79          final XYItemRenderer renderer = plot.getRenderer();
80          ChartConfigUtil.configureStroke(chartName, renderer, data);
81          ChartConfigUtil.configureShapes(chartName, renderer);
82          ChartConfigUtil.configureCopyrightNotice(chartName, chart);
83          ChartConfigUtil.configureChartBackgroungImage(chartName, chart);
84          ChartConfigUtil.configurePlotImage(chartName, chart);
85  
86          final Dimension dim = ChartConfigUtil.getDimension(chartName, config.getLargeChartSize());
87  
88          return this.config.createChartImage(this.fileName, this.timeLine.getTitle(), chart, dim);
89      }
90  
91      private TimeSeries createTimeSeries(final TimeLine timeLine) {
92          final TimeSeries result = new TimeSeries("!??!SERIES_LABEL!??!", Millisecond.class);
93          final Iterator it = timeLine.getDataPoints().iterator();
94          while (it.hasNext()) {
95              final TimePoint timePoint = (TimePoint) it.next();
96              result.add(new Millisecond(timePoint.getDate()), timePoint.getValue());
97          }
98          return result;
99      }
100 }