ingo@647: package de.intevation.flys.exports; ingo@647: sascha@1752: import de.intevation.flys.java2d.NOPGraphics2D; 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: ingo@647: import de.intevation.artifacts.Artifact; ingo@647: import de.intevation.artifacts.CallContext; ingo@647: felix@1945: import de.intevation.artifactdatabase.state.ArtifactAndFacet; ingo@1979: import de.intevation.artifactdatabase.state.Settings; ingo@695: ingo@647: import de.intevation.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 ingo@647: * to, is to overrite 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@653: protected XYChartGenerator generator; ingo@647: ingo@647: protected OutputStream out; ingo@647: ingo@647: ingo@647: ingo@653: public ChartInfoGenerator(XYChartGenerator 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@647: */ ingo@1684: public void doOut( felix@1945: ArtifactAndFacet artifactFacet, felix@1945: Document 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@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@1979: * Returns an instance of EmptySettings currently! ingo@1979: * ingo@1979: * @return an instance of EmptySettings. ingo@1979: */ ingo@1979: public Settings getSettings() { ingo@1979: return new EmptySettings(); ingo@1979: } ingo@647: } ingo@647: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :