ingo@647: package de.intevation.flys.exports;
ingo@647:
ingo@3422: import de.intevation.flys.collections.FLYSArtifactCollection;
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
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: */
ingo@3422: public void setCollection(FLYSArtifactCollection 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: */
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@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 :