teichmann@5863: /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde teichmann@5863: * Software engineering by Intevation GmbH teichmann@5863: * teichmann@5994: * This file is Free Software under the GNU AGPL (>=v3) teichmann@5863: * and comes with ABSOLUTELY NO WARRANTY! Check out the teichmann@5994: * documentation coming with Dive4Elements River for details. teichmann@5863: */ teichmann@5863: teichmann@5831: package org.dive4elements.river.exports; ingo@647: teichmann@5867: import org.dive4elements.river.collections.D4EArtifactCollection; teichmann@5831: import org.dive4elements.river.java2d.NOPGraphics2D; teichmann@6905: import org.dive4elements.river.themes.ThemeDocument; sascha@1752: ingo@647: import java.io.IOException; ingo@647: import java.io.OutputStream; ingo@647: sascha@1752: import java.awt.Transparency; sascha@1752: import java.awt.Graphics2D; sascha@1752: sascha@1752: import java.awt.geom.Rectangle2D; sascha@1752: sascha@1752: import java.awt.image.BufferedImage; sascha@1752: ingo@647: import org.w3c.dom.Document; ingo@647: ingo@647: import org.apache.log4j.Logger; ingo@647: ingo@647: import org.jfree.chart.ChartRenderingInfo; ingo@647: import org.jfree.chart.JFreeChart; ingo@647: teichmann@5831: import org.dive4elements.artifacts.Artifact; teichmann@5831: import org.dive4elements.artifacts.CallContext; ingo@647: teichmann@5831: import org.dive4elements.artifactdatabase.state.ArtifactAndFacet; teichmann@5831: import org.dive4elements.artifactdatabase.state.Settings; ingo@695: teichmann@5831: import org.dive4elements.artifacts.common.utils.XMLUtils; ingo@647: ingo@647: ingo@647: /** ingo@647: * An OutGenerator that generates meta information for charts. A concrete ingo@647: * ChartInfoGenerator need to instantiate a concrete ChartGenerator and dispatch ingo@647: * the methods to that instance. The only thing this ChartInfoGenerator needs christian@3242: * to, is to overwrite the generate() method which doesn't write the chart image ingo@647: * to the OutputStream but a Document that contains some meta information of the ingo@647: * created chart. ingo@647: * ingo@647: * @author Ingo Weinzierl ingo@647: */ ingo@647: public abstract class ChartInfoGenerator implements OutGenerator { ingo@647: sascha@1752: public static final boolean USE_NOP_GRAPHICS = sascha@1752: Boolean.getBoolean("info.rendering.nop.graphics"); sascha@1752: ingo@647: /** The logger used in this generator.*/ ingo@647: private static Logger logger = ingo@647: Logger.getLogger(ChartInfoGenerator.class); ingo@647: ingo@647: ingo@647: /** The OutGenerator that creates the charts.*/ ingo@2261: protected ChartGenerator generator; ingo@647: ingo@647: protected OutputStream out; ingo@647: ingo@647: ingo@647: ingo@2261: public ChartInfoGenerator(ChartGenerator generator) { ingo@647: this.generator = generator; ingo@647: } ingo@647: ingo@647: ingo@647: /** ingo@647: * Dispatches the operation to the instantiated generator. ingo@647: * ingo@647: * @param request ingo@647: * @param out ingo@647: * @param context ingo@647: */ ingo@647: public void init(Document request, OutputStream out, CallContext context) { ingo@647: this.out = out; ingo@647: ingo@647: generator.init(request, out, context); ingo@647: } ingo@647: ingo@647: ingo@647: /** ingo@647: * Dispatches the operation to the instantiated generator. ingo@647: * felix@1945: * @param master The master artifact ingo@647: */ ingo@647: public void setMasterArtifact(Artifact master) { ingo@647: generator.setMasterArtifact(master); ingo@647: } ingo@647: ingo@647: ingo@647: /** ingo@647: * Dispatches the operation to the instantiated generator. ingo@3422: * ingo@3422: * @param collection The collection. ingo@3422: */ teichmann@5867: public void setCollection(D4EArtifactCollection collection) { ingo@3422: generator.setCollection(collection); ingo@3422: } ingo@3422: ingo@3422: ingo@3422: /** ingo@3422: * Dispatches the operation to the instantiated generator. ingo@647: */ teichmann@6905: @Override ingo@1684: public void doOut( felix@1945: ArtifactAndFacet artifactFacet, teichmann@6905: ThemeDocument attr, felix@1945: boolean visible ingo@1684: ) { felix@1945: generator.doOut(artifactFacet, attr, visible); ingo@647: } ingo@647: ingo@647: ingo@647: /** ingo@647: * This method generates the chart using a concrete ChartGenerator but ingo@647: * doesn't write the chart itself to the OutputStream but a Document that ingo@647: * contains meta information of the created chart. ingo@647: */ ingo@647: @Override ingo@647: public void generate() ingo@647: throws IOException ingo@647: { ingo@647: logger.debug("ChartInfoGenerator.generate"); ingo@647: ingo@653: JFreeChart chart = generator.generateChart(); ingo@647: ingo@653: int[] size = generator.getSize(); ingo@2057: if (size == null) { ingo@2057: size = generator.getDefaultSize(); ingo@2057: } ingo@647: ingo@647: ChartRenderingInfo info = new ChartRenderingInfo(); ingo@647: sascha@1752: long startTime = System.currentTimeMillis(); sascha@1752: sascha@1752: if (USE_NOP_GRAPHICS) { sascha@1752: BufferedImage image = sascha@1752: new BufferedImage(size[0], size[1], Transparency.BITMASK); sascha@1752: sascha@1752: Graphics2D g2d = image.createGraphics(); sascha@1752: Graphics2D nop = new NOPGraphics2D(g2d); sascha@1752: sascha@1752: chart.draw( sascha@1752: nop, sascha@1752: new Rectangle2D.Double(0, 0, size[0], size[1]), sascha@1752: null, sascha@1752: info); sascha@1752: sascha@1752: nop.dispose(); sascha@1752: } sascha@1752: else { sascha@1752: chart.createBufferedImage( sascha@1752: size[0], size[1], Transparency.BITMASK, info); sascha@1752: } sascha@1752: sascha@1752: long stopTime = System.currentTimeMillis(); sascha@1752: sascha@1752: if (logger.isDebugEnabled()) { sascha@1752: logger.debug("Rendering info took: " + sascha@1752: (stopTime-startTime) + "ms"); sascha@1752: } sascha@1752: ingo@647: ingo@673: InfoGeneratorHelper helper = new InfoGeneratorHelper(generator); ingo@673: Document doc = helper.createInfoDocument(chart, info); ingo@647: ingo@647: XMLUtils.toStream(doc, out); ingo@647: } ingo@1979: ingo@1979: ingo@1979: /** ingo@2047: * A proxy method which calls generator.getSettings() and returns its ingo@2047: * return value. ingo@1979: * ingo@2047: * @return a Settings object provided by generator. ingo@1979: */ ingo@2047: @Override ingo@1979: public Settings getSettings() { ingo@2047: return generator.getSettings(); ingo@2047: } ingo@2047: ingo@2047: ingo@2047: /** ingo@2047: * A proxy method which calls generator.setSettings(). ingo@2047: * ingo@2047: * @param settings A settings object for the generator. ingo@2047: */ ingo@2047: @Override ingo@2047: public void setSettings(Settings settings) { ingo@2047: generator.setSettings(settings); ingo@1979: } ingo@647: } ingo@647: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :