comparison artifacts/src/main/java/org/dive4elements/river/exports/ChartGenerator2.java @ 7079:48e30e2c5db9 generator-refactoring

ChartGenerator2 can be used as ChartInfoGenerator, too.
author Sascha L. Teichmann <teichmann@intevation.de>
date Fri, 20 Sep 2013 17:00:59 +0200
parents 0a337f0005c2
children f0731aa7b735
comparison
equal deleted inserted replaced
7078:b780cf1148c3 7079:48e30e2c5db9
6 * documentation coming with Dive4Elements River for details. 6 * documentation coming with Dive4Elements River for details.
7 */ 7 */
8 8
9 package org.dive4elements.river.exports; 9 package org.dive4elements.river.exports;
10 10
11 import java.awt.BasicStroke;
12 import java.awt.Color;
13 import java.awt.Font;
14 import java.awt.Graphics2D;
15 import java.awt.Paint;
16 import java.awt.Stroke;
17 import java.awt.TexturePaint;
18 import java.awt.Transparency;
19
20 import java.awt.geom.Rectangle2D;
21
22 import java.awt.image.BufferedImage;
23
24 import java.io.IOException;
25 import java.io.OutputStream;
26
27 import java.util.ArrayList;
28 import java.util.List;
29 import java.util.Locale;
30 import java.util.Map;
31 import java.util.SortedMap;
32 import java.util.TreeMap;
33
34 import javax.xml.xpath.XPathConstants;
35
36 import org.apache.log4j.Logger;
37
11 import org.dive4elements.artifactdatabase.state.ArtifactAndFacet; 38 import org.dive4elements.artifactdatabase.state.ArtifactAndFacet;
12 import org.dive4elements.artifactdatabase.state.Settings; 39 import org.dive4elements.artifactdatabase.state.Settings;
40
13 import org.dive4elements.artifacts.Artifact; 41 import org.dive4elements.artifacts.Artifact;
14 import org.dive4elements.artifacts.ArtifactNamespaceContext; 42 import org.dive4elements.artifacts.ArtifactNamespaceContext;
15 import org.dive4elements.artifacts.CallContext; 43 import org.dive4elements.artifacts.CallContext;
16 import org.dive4elements.artifacts.CallMeta; 44 import org.dive4elements.artifacts.CallMeta;
17 import org.dive4elements.artifacts.PreferredLocale; 45 import org.dive4elements.artifacts.PreferredLocale;
46
18 import org.dive4elements.artifacts.common.utils.XMLUtils; 47 import org.dive4elements.artifacts.common.utils.XMLUtils;
48
49 import org.dive4elements.river.artifacts.D4EArtifact;
50
19 import org.dive4elements.river.artifacts.access.RangeAccess; 51 import org.dive4elements.river.artifacts.access.RangeAccess;
20 import org.dive4elements.river.artifacts.D4EArtifact; 52
21 import org.dive4elements.river.artifacts.resources.Resources; 53 import org.dive4elements.river.artifacts.resources.Resources;
54
22 import org.dive4elements.river.collections.D4EArtifactCollection; 55 import org.dive4elements.river.collections.D4EArtifactCollection;
56
57 import org.dive4elements.river.java2d.NOPGraphics2D;
58
59 import org.dive4elements.river.jfree.AxisDataset;
23 import org.dive4elements.river.jfree.Bounds; 60 import org.dive4elements.river.jfree.Bounds;
24 import org.dive4elements.river.jfree.DoubleBounds; 61 import org.dive4elements.river.jfree.DoubleBounds;
25 import org.dive4elements.river.jfree.EnhancedLineAndShapeRenderer; 62 import org.dive4elements.river.jfree.EnhancedLineAndShapeRenderer;
26 import org.dive4elements.river.jfree.RiverAnnotation; 63 import org.dive4elements.river.jfree.RiverAnnotation;
27 import org.dive4elements.river.jfree.StableXYDifferenceRenderer; 64 import org.dive4elements.river.jfree.StableXYDifferenceRenderer;
28 import org.dive4elements.river.jfree.Style; 65 import org.dive4elements.river.jfree.Style;
29 import org.dive4elements.river.jfree.StyledAreaSeriesCollection; 66 import org.dive4elements.river.jfree.StyledAreaSeriesCollection;
30 import org.dive4elements.river.jfree.StyledSeries; 67 import org.dive4elements.river.jfree.StyledSeries;
31 import org.dive4elements.river.jfree.AxisDataset; 68
32 import org.dive4elements.river.model.River; 69 import org.dive4elements.river.model.River;
70
33 import org.dive4elements.river.themes.LineStyle; 71 import org.dive4elements.river.themes.LineStyle;
34 import org.dive4elements.river.themes.TextStyle; 72 import org.dive4elements.river.themes.TextStyle;
35 import org.dive4elements.river.themes.ThemeDocument; 73 import org.dive4elements.river.themes.ThemeDocument;
74
75 import org.dive4elements.river.utils.Formatter;
36 import org.dive4elements.river.utils.RiverUtils; 76 import org.dive4elements.river.utils.RiverUtils;
37 77
38 import java.awt.BasicStroke; 78 import org.jfree.chart.ChartRenderingInfo;
39 import java.awt.Color;
40 import java.awt.Font;
41 import java.awt.Paint;
42 import java.awt.Stroke;
43 import java.awt.TexturePaint;
44 import java.awt.geom.Rectangle2D;
45 import java.awt.image.BufferedImage;
46 import java.io.IOException;
47 import java.io.OutputStream;
48 import java.util.ArrayList;
49 import java.util.List;
50 import java.util.Locale;
51 import java.util.Map;
52 import java.util.SortedMap;
53 import java.util.TreeMap;
54
55 import javax.xml.xpath.XPathConstants;
56
57 import org.apache.log4j.Logger;
58 import org.jfree.chart.JFreeChart; 79 import org.jfree.chart.JFreeChart;
59 import org.jfree.chart.LegendItem; 80 import org.jfree.chart.LegendItem;
60 import org.jfree.chart.LegendItemCollection; 81 import org.jfree.chart.LegendItemCollection;
82
61 import org.jfree.chart.axis.NumberAxis; 83 import org.jfree.chart.axis.NumberAxis;
84
62 import org.jfree.chart.plot.XYPlot; 85 import org.jfree.chart.plot.XYPlot;
86
63 import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer; 87 import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
88
64 import org.jfree.chart.title.TextTitle; 89 import org.jfree.chart.title.TextTitle;
90
65 import org.jfree.data.Range; 91 import org.jfree.data.Range;
92
66 import org.jfree.data.general.Series; 93 import org.jfree.data.general.Series;
94
67 import org.jfree.data.xy.XYDataset; 95 import org.jfree.data.xy.XYDataset;
96
68 import org.jfree.ui.RectangleInsets; 97 import org.jfree.ui.RectangleInsets;
69 import org.jfree.ui.TextAnchor; 98 import org.jfree.ui.TextAnchor;
99
70 import org.w3c.dom.Document; 100 import org.w3c.dom.Document;
71 import org.w3c.dom.Element; 101 import org.w3c.dom.Element;
72
73 import org.dive4elements.river.utils.Formatter;
74 102
75 /** 103 /**
76 * Implementation of the OutGenerator interface for charts. 104 * Implementation of the OutGenerator interface for charts.
77 * It should provide some basic things that equal in all chart types. 105 * It should provide some basic things that equal in all chart types.
78 * 106 *
79 */ 107 */
80 public abstract class ChartGenerator2 implements OutGenerator { 108 public abstract class ChartGenerator2 implements OutGenerator {
81 109
82 private static Logger logger = Logger.getLogger(ChartGenerator2.class); 110 private static Logger logger = Logger.getLogger(ChartGenerator2.class);
111
112 public static final boolean USE_NOP_GRAPHICS =
113 Boolean.getBoolean("info.rendering.nop.graphics");
114
83 115
84 public static final int DEFAULT_CHART_WIDTH = 600; 116 public static final int DEFAULT_CHART_WIDTH = 600;
85 public static final int DEFAULT_CHART_HEIGHT = 400; 117 public static final int DEFAULT_CHART_HEIGHT = 400;
86 public static final String DEFAULT_CHART_FORMAT = "png"; 118 public static final String DEFAULT_CHART_FORMAT = "png";
87 public static final Color DEFAULT_GRID_COLOR = Color.GRAY; 119 public static final Color DEFAULT_GRID_COLOR = Color.GRAY;
254 286
255 /** 287 /**
256 * Generate chart. 288 * Generate chart.
257 */ 289 */
258 @Override 290 @Override
259 public void generate() 291 public void generate() throws IOException {
260 throws IOException 292
261 {
262 logger.debug("ChartGenerator2.generate"); 293 logger.debug("ChartGenerator2.generate");
294
295 if (outName.indexOf("chartinfo") > 0) {
296 generateInfo();
297 }
298 else {
299 generateImage();
300 }
301 }
302
303
304 /** Generate only meta infos */
305 private void generateInfo() throws IOException {
306
307 logger.debug("ChartInfoGenerator2.generateInfo");
308
309 JFreeChart chart = generateChart();
310
311 int[] size = getSize();
312 if (size == null) {
313 size = getDefaultSize();
314 }
315
316 ChartRenderingInfo info = new ChartRenderingInfo();
317
318 long startTime = System.currentTimeMillis();
319
320 if (USE_NOP_GRAPHICS) {
321 BufferedImage image =
322 new BufferedImage(size[0], size[1], Transparency.BITMASK);
323
324 Graphics2D g2d = image.createGraphics();
325 Graphics2D nop = new NOPGraphics2D(g2d);
326
327 chart.draw(
328 nop,
329 new Rectangle2D.Double(0, 0, size[0], size[1]),
330 null,
331 info);
332
333 nop.dispose();
334 }
335 else {
336 chart.createBufferedImage(
337 size[0], size[1], Transparency.BITMASK, info);
338 }
339
340 long stopTime = System.currentTimeMillis();
341
342 if (logger.isDebugEnabled()) {
343 logger.debug("Rendering info took: " +
344 (stopTime-startTime) + "ms");
345 }
346
347
348 InfoGeneratorHelper helper = new InfoGeneratorHelper(this);
349 Document doc = helper.createInfoDocument(chart, info);
350
351 XMLUtils.toStream(doc, out);
352 }
353
354 /** Generate the diagram as an image. */
355 private void generateImage() throws IOException {
356 logger.debug("ChartGenerator2.generateImage");
263 357
264 JFreeChart chart = generateChart(); 358 JFreeChart chart = generateChart();
265 359
266 String format = getFormat(); 360 String format = getFormat();
267 int[] size = getSize(); 361 int[] size = getSize();

http://dive4elements.wald.intevation.org