# HG changeset patch # User Sascha L. Teichmann # Date 1379689259 -7200 # Node ID 48e30e2c5db9c2608b7744dfa526316d9d8f70d9 # Parent b780cf1148c38d5b3ea864a730786bf600cfcbd8 ChartGenerator2 can be used as ChartInfoGenerator, too. diff -r b780cf1148c3 -r 48e30e2c5db9 artifacts/src/main/java/org/dive4elements/river/exports/ChartGenerator2.java --- a/artifacts/src/main/java/org/dive4elements/river/exports/ChartGenerator2.java Fri Sep 20 16:34:37 2013 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/exports/ChartGenerator2.java Fri Sep 20 17:00:59 2013 +0200 @@ -8,43 +8,22 @@ package org.dive4elements.river.exports; -import org.dive4elements.artifactdatabase.state.ArtifactAndFacet; -import org.dive4elements.artifactdatabase.state.Settings; -import org.dive4elements.artifacts.Artifact; -import org.dive4elements.artifacts.ArtifactNamespaceContext; -import org.dive4elements.artifacts.CallContext; -import org.dive4elements.artifacts.CallMeta; -import org.dive4elements.artifacts.PreferredLocale; -import org.dive4elements.artifacts.common.utils.XMLUtils; -import org.dive4elements.river.artifacts.access.RangeAccess; -import org.dive4elements.river.artifacts.D4EArtifact; -import org.dive4elements.river.artifacts.resources.Resources; -import org.dive4elements.river.collections.D4EArtifactCollection; -import org.dive4elements.river.jfree.Bounds; -import org.dive4elements.river.jfree.DoubleBounds; -import org.dive4elements.river.jfree.EnhancedLineAndShapeRenderer; -import org.dive4elements.river.jfree.RiverAnnotation; -import org.dive4elements.river.jfree.StableXYDifferenceRenderer; -import org.dive4elements.river.jfree.Style; -import org.dive4elements.river.jfree.StyledAreaSeriesCollection; -import org.dive4elements.river.jfree.StyledSeries; -import org.dive4elements.river.jfree.AxisDataset; -import org.dive4elements.river.model.River; -import org.dive4elements.river.themes.LineStyle; -import org.dive4elements.river.themes.TextStyle; -import org.dive4elements.river.themes.ThemeDocument; -import org.dive4elements.river.utils.RiverUtils; - import java.awt.BasicStroke; import java.awt.Color; import java.awt.Font; +import java.awt.Graphics2D; import java.awt.Paint; import java.awt.Stroke; import java.awt.TexturePaint; +import java.awt.Transparency; + import java.awt.geom.Rectangle2D; + import java.awt.image.BufferedImage; + import java.io.IOException; import java.io.OutputStream; + import java.util.ArrayList; import java.util.List; import java.util.Locale; @@ -55,23 +34,72 @@ import javax.xml.xpath.XPathConstants; import org.apache.log4j.Logger; + +import org.dive4elements.artifactdatabase.state.ArtifactAndFacet; +import org.dive4elements.artifactdatabase.state.Settings; + +import org.dive4elements.artifacts.Artifact; +import org.dive4elements.artifacts.ArtifactNamespaceContext; +import org.dive4elements.artifacts.CallContext; +import org.dive4elements.artifacts.CallMeta; +import org.dive4elements.artifacts.PreferredLocale; + +import org.dive4elements.artifacts.common.utils.XMLUtils; + +import org.dive4elements.river.artifacts.D4EArtifact; + +import org.dive4elements.river.artifacts.access.RangeAccess; + +import org.dive4elements.river.artifacts.resources.Resources; + +import org.dive4elements.river.collections.D4EArtifactCollection; + +import org.dive4elements.river.java2d.NOPGraphics2D; + +import org.dive4elements.river.jfree.AxisDataset; +import org.dive4elements.river.jfree.Bounds; +import org.dive4elements.river.jfree.DoubleBounds; +import org.dive4elements.river.jfree.EnhancedLineAndShapeRenderer; +import org.dive4elements.river.jfree.RiverAnnotation; +import org.dive4elements.river.jfree.StableXYDifferenceRenderer; +import org.dive4elements.river.jfree.Style; +import org.dive4elements.river.jfree.StyledAreaSeriesCollection; +import org.dive4elements.river.jfree.StyledSeries; + +import org.dive4elements.river.model.River; + +import org.dive4elements.river.themes.LineStyle; +import org.dive4elements.river.themes.TextStyle; +import org.dive4elements.river.themes.ThemeDocument; + +import org.dive4elements.river.utils.Formatter; +import org.dive4elements.river.utils.RiverUtils; + +import org.jfree.chart.ChartRenderingInfo; import org.jfree.chart.JFreeChart; import org.jfree.chart.LegendItem; import org.jfree.chart.LegendItemCollection; + import org.jfree.chart.axis.NumberAxis; + import org.jfree.chart.plot.XYPlot; + import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer; + import org.jfree.chart.title.TextTitle; + import org.jfree.data.Range; + import org.jfree.data.general.Series; + import org.jfree.data.xy.XYDataset; + import org.jfree.ui.RectangleInsets; import org.jfree.ui.TextAnchor; + import org.w3c.dom.Document; import org.w3c.dom.Element; -import org.dive4elements.river.utils.Formatter; - /** * Implementation of the OutGenerator interface for charts. * It should provide some basic things that equal in all chart types. @@ -81,6 +109,10 @@ private static Logger logger = Logger.getLogger(ChartGenerator2.class); + public static final boolean USE_NOP_GRAPHICS = + Boolean.getBoolean("info.rendering.nop.graphics"); + + public static final int DEFAULT_CHART_WIDTH = 600; public static final int DEFAULT_CHART_HEIGHT = 400; public static final String DEFAULT_CHART_FORMAT = "png"; @@ -256,11 +288,73 @@ * Generate chart. */ @Override - public void generate() - throws IOException - { + public void generate() throws IOException { + logger.debug("ChartGenerator2.generate"); + if (outName.indexOf("chartinfo") > 0) { + generateInfo(); + } + else { + generateImage(); + } + } + + + /** Generate only meta infos */ + private void generateInfo() throws IOException { + + logger.debug("ChartInfoGenerator2.generateInfo"); + + JFreeChart chart = generateChart(); + + int[] size = getSize(); + if (size == null) { + size = getDefaultSize(); + } + + ChartRenderingInfo info = new ChartRenderingInfo(); + + long startTime = System.currentTimeMillis(); + + if (USE_NOP_GRAPHICS) { + BufferedImage image = + new BufferedImage(size[0], size[1], Transparency.BITMASK); + + Graphics2D g2d = image.createGraphics(); + Graphics2D nop = new NOPGraphics2D(g2d); + + chart.draw( + nop, + new Rectangle2D.Double(0, 0, size[0], size[1]), + null, + info); + + nop.dispose(); + } + else { + chart.createBufferedImage( + size[0], size[1], Transparency.BITMASK, info); + } + + long stopTime = System.currentTimeMillis(); + + if (logger.isDebugEnabled()) { + logger.debug("Rendering info took: " + + (stopTime-startTime) + "ms"); + } + + + InfoGeneratorHelper helper = new InfoGeneratorHelper(this); + Document doc = helper.createInfoDocument(chart, info); + + XMLUtils.toStream(doc, out); + } + + /** Generate the diagram as an image. */ + private void generateImage() throws IOException { + logger.debug("ChartGenerator2.generateImage"); + JFreeChart chart = generateChart(); String format = getFormat();