gernotbelger@9151: /** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde gernotbelger@9151: * Software engineering by gernotbelger@9151: * Björnsen Beratende Ingenieure GmbH gernotbelger@9151: * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt gernotbelger@9151: * gernotbelger@9151: * This file is Free Software under the GNU AGPL (>=v3) gernotbelger@9151: * and comes with ABSOLUTELY NO WARRANTY! Check out the gernotbelger@9151: * documentation coming with Dive4Elements River for details. gernotbelger@9151: */ gernotbelger@9151: package org.dive4elements.river.artifacts.common; gernotbelger@9151: gernotbelger@9151: import java.io.OutputStream; gernotbelger@9151: gernotbelger@9151: import org.apache.log4j.Logger; gernotbelger@9151: import org.dive4elements.artifacts.CallContext; gernotbelger@9151: import org.dive4elements.river.artifacts.model.CalculationResult; gernotbelger@9195: import org.dive4elements.river.artifacts.sinfo.util.RiverInfo; gernotbelger@9151: import org.dive4elements.river.exports.AbstractExporter; gernotbelger@9151: import org.w3c.dom.Document; gernotbelger@9151: gernotbelger@9151: import au.com.bytecode.opencsv.CSVWriter; gernotbelger@9195: import net.sf.jasperreports.engine.JRException; gernotbelger@9151: gernotbelger@9151: /** gernotbelger@9151: * @author Gernot Belger gernotbelger@9151: */ gernotbelger@9195: public abstract class AbstractCommonExporter> extends AbstractExporter { gernotbelger@9151: gernotbelger@9151: /** The log used in this exporter. */ gernotbelger@9151: private final Logger log = Logger.getLogger(getClass()); gernotbelger@9151: gernotbelger@9151: /** The log used in this exporter. */ gernotbelger@9151: protected final Logger getLog() { gernotbelger@9151: return this.log; gernotbelger@9151: } gernotbelger@9151: gernotbelger@9151: private RESULTS results = null; gernotbelger@9151: gernotbelger@9151: @Override gernotbelger@9151: public void init(final String outName, final Document request, final OutputStream out, final CallContext context) { gernotbelger@9151: super.init(outName, request, out, context); gernotbelger@9151: } gernotbelger@9151: gernotbelger@9151: @Override gernotbelger@9151: protected final void addData(final Object d) { gernotbelger@9151: /* reset */ gernotbelger@9151: this.results = null; gernotbelger@9151: gernotbelger@9151: if (d instanceof CalculationResult) { gernotbelger@9151: gernotbelger@9151: final Object dat = ((CalculationResult) d).getData(); gernotbelger@9151: if (dat != null) { gernotbelger@9151: @SuppressWarnings("unchecked") gernotbelger@9151: final RESULTS result = (RESULTS) dat; gernotbelger@9151: this.results = result; gernotbelger@9151: } gernotbelger@9151: } gernotbelger@9151: } gernotbelger@9151: gernotbelger@9151: protected final RESULTS getResults() { gernotbelger@9151: return this.results; gernotbelger@9151: } gernotbelger@9151: gernotbelger@9195: @Override gernotbelger@9195: protected final void writeCSVData(final CSVWriter writer) { gernotbelger@9195: gernotbelger@9195: final ExportContextCSV exportContext = new ExportContextCSV(this.context, writer, this.results); gernotbelger@9195: gernotbelger@9195: doWriteCSVData(exportContext, this.results); gernotbelger@9151: } gernotbelger@9151: gernotbelger@9195: protected final void doWriteCSVData(final ExportContextCSV exportContext, final RESULTS results) { gernotbelger@9195: gernotbelger@9195: writeCSVGlobalMetadata(exportContext, results); gernotbelger@9195: gernotbelger@9195: final RiverInfo river = results.getRiver(); gernotbelger@9195: gernotbelger@9353: Class lastResultType = null; gernotbelger@9195: gernotbelger@9195: for (final AbstractCalculationExportableResult result : results.getResults()) { gernotbelger@9195: gernotbelger@9195: final Class resultType = result.getClass(); gernotbelger@9195: if (lastResultType == null || lastResultType != resultType) { gernotbelger@9195: exportContext.writeBlankLine(); gernotbelger@9195: result.writeCSVHeader(exportContext, river); gernotbelger@9195: exportContext.writeBlankLine(); gernotbelger@9195: } else gernotbelger@9195: exportContext.writeCSVLine(new String[] { "#" }); gernotbelger@9195: gernotbelger@9353: lastResultType = resultType; gernotbelger@9195: result.writeCsv(exportContext); gernotbelger@9195: } gernotbelger@9151: } gernotbelger@9151: gernotbelger@9195: protected abstract void writeCSVGlobalMetadata(final ExportContextCSV exportContext, final RESULTS results); gernotbelger@9151: gernotbelger@9151: @Override gernotbelger@9151: protected final void writePDF(final OutputStream out) { gernotbelger@9151: doWritePdf(out, this.results); gernotbelger@9151: } gernotbelger@9151: gernotbelger@9195: private final void doWritePdf(final OutputStream out, final RESULTS results) { gernotbelger@9195: gernotbelger@9195: try { gernotbelger@9195: final ExportContextPDF exportContext = new ExportContextPDF(this.context, results); gernotbelger@9195: gernotbelger@9195: final JasperReporter reporter = new JasperReporter(); gernotbelger@9195: gernotbelger@9195: for (final RESULT result : results.getResults()) { gernotbelger@9455: if (result.pdfExportEnabled()) { // TODO: only works for multiple result: if singleresult is disabled, ugly errors occur, 'cause no pdf will be gernotbelger@9455: // created at all gernotbelger@9195: gernotbelger@9455: final MetaAndTableJRDataSource source = new MetaAndTableJRDataSource(); gernotbelger@9195: gernotbelger@9455: writePDFGlobalMetadata(exportContext, source); gernotbelger@9455: gernotbelger@9455: final JasperDesigner design = result.addReport(exportContext, reporter, source); gernotbelger@9455: configureDesign(result, design); gernotbelger@9455: } gernotbelger@9195: } gernotbelger@9195: gernotbelger@9195: reporter.exportPDF(out); gernotbelger@9195: } gernotbelger@9195: catch (final JRException je) { gernotbelger@9195: getLog().warn("Error generating PDF Report!", je); gernotbelger@9195: } gernotbelger@9195: } gernotbelger@9195: gernotbelger@9195: /** gernotbelger@9195: * Override to implement, does nothing by default. gernotbelger@9195: */ gernotbelger@9195: protected void configureDesign(final RESULT result, final JasperDesigner design) { gernotbelger@9195: } gernotbelger@9195: gernotbelger@9195: protected abstract void writePDFGlobalMetadata(ExportContextPDF exportContext, MetaAndTableJRDataSource source); gernotbelger@9151: }