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