gernotbelger@8928: /** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde gernotbelger@8928: * Software engineering by gernotbelger@8928: * Björnsen Beratende Ingenieure GmbH gernotbelger@8928: * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt gernotbelger@8928: * gernotbelger@8928: * This file is Free Software under the GNU AGPL (>=v3) gernotbelger@8928: * and comes with ABSOLUTELY NO WARRANTY! Check out the gernotbelger@8928: * documentation coming with Dive4Elements River for details. gernotbelger@8928: */ gernotbelger@8928: package org.dive4elements.river.artifacts.sinfo.common; gernotbelger@8928: gernotbelger@8928: import java.io.OutputStream; gernotbelger@8928: import java.util.Collection; gernotbelger@8928: import java.util.HashMap; gernotbelger@8928: import java.util.Map; gernotbelger@8928: gernotbelger@8928: import org.apache.log4j.Logger; gernotbelger@8928: import org.dive4elements.artifacts.CallMeta; gernotbelger@8928: import org.dive4elements.artifacts.common.utils.Config; gernotbelger@8928: import org.dive4elements.river.artifacts.model.CalculationResult; gernotbelger@8928: import org.dive4elements.river.artifacts.resources.Resources; gernotbelger@8928: import org.dive4elements.river.artifacts.sinfo.util.MetaAndTableJRDataSource; gernotbelger@8928: import org.dive4elements.river.artifacts.sinfo.util.RiverInfo; gernotbelger@8928: import org.dive4elements.river.exports.AbstractExporter; gernotbelger@8928: gernotbelger@8928: import au.com.bytecode.opencsv.CSVWriter; gernotbelger@8928: import net.sf.jasperreports.engine.JRDataSource; gernotbelger@8928: import net.sf.jasperreports.engine.JRException; gernotbelger@8928: import net.sf.jasperreports.engine.JasperExportManager; gernotbelger@8928: import net.sf.jasperreports.engine.JasperFillManager; gernotbelger@8928: import net.sf.jasperreports.engine.JasperPrint; gernotbelger@8928: gernotbelger@8928: /** gernotbelger@8928: * @author Gernot Belger gernotbelger@8928: */ gernotbelger@8928: public abstract class AbstractSInfoExporter, RESULTS extends AbstractSInfoCalculationResults> extends AbstractExporter { gernotbelger@8928: gernotbelger@8928: /** The storage that contains the current calculation result. */ gernotbelger@8928: private RESULTS data = null; gernotbelger@8928: gernotbelger@8928: protected abstract Logger getLog(); gernotbelger@8928: gernotbelger@8928: public RESULTS getData() { gernotbelger@8928: return this.data; gernotbelger@8928: } gernotbelger@8928: gernotbelger@8928: @Override gernotbelger@8928: protected final void addData(final Object d) { gernotbelger@8928: /* reset */ gernotbelger@8928: this.data = null; gernotbelger@8928: gernotbelger@8928: if (d instanceof CalculationResult) { gernotbelger@8928: gernotbelger@8928: final Object dat = ((CalculationResult) d).getData(); gernotbelger@8928: if (dat != null) gernotbelger@8928: this.data = (RESULTS) dat; gernotbelger@8928: } gernotbelger@8928: } gernotbelger@8928: gernotbelger@8928: @Override gernotbelger@8928: protected final void writeCSVData(final CSVWriter writer) { gernotbelger@8928: getLog().info("writeCSVData"); gernotbelger@8928: gernotbelger@8928: /* fetch calculation results */ gernotbelger@8928: final RESULTS results = this.data; gernotbelger@8928: gernotbelger@8928: final RiverInfo river = results.getRiver(); gernotbelger@8928: gernotbelger@8928: /* write as csv */ gernotbelger@8928: writeCSVMeta(writer, results); gernotbelger@8928: writeCSVHeader(writer, river); gernotbelger@8928: gernotbelger@8928: for (final RESULT result : results.getResults()) { gernotbelger@8928: writeCSVResult(writer, result); gernotbelger@8928: } gernotbelger@8928: } gernotbelger@8928: gernotbelger@8928: protected abstract void writeCSVHeader(final CSVWriter writer, final RiverInfo river); gernotbelger@8928: gernotbelger@8928: protected abstract void writeCSVMeta(final CSVWriter writer, final RESULTS results); gernotbelger@8928: gernotbelger@8928: protected final void writeCSVMetaEntry(final CSVWriter writer, final String message, final Object... messageArgs) { gernotbelger@8928: gernotbelger@8928: final CallMeta meta = this.context.getMeta(); gernotbelger@8928: gernotbelger@8928: writer.writeNext(new String[] { Resources.getMsg(meta, message, message, messageArgs) }); gernotbelger@8928: } gernotbelger@8928: gernotbelger@8928: protected final void writeCSVResult(final CSVWriter writer, final RESULT result) { gernotbelger@8928: gernotbelger@8928: writeCSVResultHeader(writer, result); gernotbelger@8928: gernotbelger@8928: /* nwo the value rows */ gernotbelger@8928: final Collection rows = result.getRows(); gernotbelger@8928: for (final ROW row : rows) { gernotbelger@8928: writeCSVRow(writer, row); gernotbelger@8928: } gernotbelger@8928: } gernotbelger@8928: gernotbelger@8928: protected abstract void writeCSVResultHeader(CSVWriter writer, RESULT result); gernotbelger@8928: gernotbelger@8928: protected final void writeCSVRow(final CSVWriter writer, final ROW row) { gernotbelger@8928: getLog().debug("writeCSVFlowDepthRow"); gernotbelger@8928: gernotbelger@8928: final String[] formattedRow = formatCSVRow(row); gernotbelger@8928: writer.writeNext(formattedRow); gernotbelger@8928: } gernotbelger@8928: gernotbelger@8928: protected abstract String[] formatCSVRow(final ROW row); gernotbelger@8928: gernotbelger@8928: @Override gernotbelger@8928: protected final void writePDF(final OutputStream outStream) { gernotbelger@8928: getLog().debug("write PDF"); gernotbelger@8928: gernotbelger@8928: final JRDataSource source = createJRData(); gernotbelger@8928: gernotbelger@8928: final String confPath = Config.getConfigDirectory().toString(); gernotbelger@8928: gernotbelger@8928: // FIXME: distinguish between with and without tkh: we need two jasper reports! gernotbelger@8928: gernotbelger@8928: final Map parameters = new HashMap<>(); gernotbelger@8928: parameters.put("ReportTitle", "Exported Data"); gernotbelger@8928: gernotbelger@8928: try { gernotbelger@8928: final String jasperPath = confPath + getJasperFile(); gernotbelger@8928: gernotbelger@8928: final JasperPrint print = JasperFillManager.fillReport(jasperPath, parameters, source); gernotbelger@8928: JasperExportManager.exportReportToPdfStream(print, outStream); gernotbelger@8928: } gernotbelger@8928: catch (final JRException je) { gernotbelger@8928: getLog().warn("Error generating PDF Report!", je); gernotbelger@8928: } gernotbelger@8928: } gernotbelger@8928: gernotbelger@8928: protected abstract String getJasperFile(); gernotbelger@8928: gernotbelger@8928: private JRDataSource createJRData() { gernotbelger@8928: gernotbelger@8928: /* fetch calculation results */ gernotbelger@8928: final RESULTS results = this.data; gernotbelger@8928: gernotbelger@8928: final MetaAndTableJRDataSource source = new MetaAndTableJRDataSource(); gernotbelger@8928: gernotbelger@8928: addJRMetaData(source, results); gernotbelger@8928: gernotbelger@8928: for (final RESULT result : results.getResults()) { gernotbelger@8928: addJRTableData(source, result); gernotbelger@8928: } gernotbelger@8928: gernotbelger@8928: return source; gernotbelger@8928: } gernotbelger@8928: gernotbelger@8928: protected abstract void addJRMetaData(final MetaAndTableJRDataSource source, final RESULTS results); gernotbelger@8928: gernotbelger@8928: protected final void addJRTableData(final MetaAndTableJRDataSource source, final RESULT result) { gernotbelger@8928: gernotbelger@8928: final Collection rows = result.getRows(); gernotbelger@8928: gernotbelger@8928: for (final ROW row : rows) { gernotbelger@8928: gernotbelger@8928: final String[] formattedRow = formatPDFRow(row); gernotbelger@8928: source.addData(formattedRow); gernotbelger@8928: } gernotbelger@8928: } gernotbelger@8928: gernotbelger@8928: protected abstract String[] formatPDFRow(final ROW row); gernotbelger@8928: }