gernotbelger@8996: /** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde gernotbelger@8996: * Software engineering by gernotbelger@8996: * Björnsen Beratende Ingenieure GmbH gernotbelger@8996: * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt gernotbelger@8996: * gernotbelger@8996: * This file is Free Software under the GNU AGPL (>=v3) gernotbelger@8996: * and comes with ABSOLUTELY NO WARRANTY! Check out the gernotbelger@8996: * documentation coming with Dive4Elements River for details. gernotbelger@8996: */ gernotbelger@8996: package org.dive4elements.river.artifacts.uinfo.salix; gernotbelger@8996: gernotbelger@9006: import java.io.OutputStream; gernotbelger@8996: import java.util.ArrayList; gernotbelger@8996: import java.util.Collection; gernotbelger@8996: gernotbelger@8996: import org.apache.log4j.Logger; gernotbelger@8996: import org.dive4elements.river.artifacts.common.GeneralResultType; gernotbelger@9107: import org.dive4elements.river.artifacts.common.I18NStrings; gernotbelger@9006: import org.dive4elements.river.artifacts.common.JasperReporter; gernotbelger@9006: import org.dive4elements.river.artifacts.common.MetaAndTableJRDataSource; gernotbelger@8996: import org.dive4elements.river.artifacts.common.ResultRow; gernotbelger@8996: import org.dive4elements.river.artifacts.sinfo.util.RiverInfo; gernotbelger@8996: import org.dive4elements.river.artifacts.uinfo.commons.AbstractUInfoExporter; gernotbelger@8996: import org.dive4elements.river.artifacts.uinfo.commons.UInfoResultType; gernotbelger@8996: gernotbelger@8996: import au.com.bytecode.opencsv.CSVWriter; gernotbelger@9006: import net.sf.jasperreports.engine.JRException; gernotbelger@8996: gernotbelger@8996: /** gernotbelger@8996: * @author Domenico Nardi Tironi gernotbelger@8996: * gernotbelger@8996: */ gernotbelger@8996: public class SalixLineExporter extends AbstractUInfoExporter { gernotbelger@8996: gernotbelger@8996: /** The log used in this exporter. */ gernotbelger@8996: private static Logger log = Logger.getLogger(SalixLineExporter.class); gernotbelger@8996: gernotbelger@9006: private static final String JASPER_FILE = "/jasper/templates/uinfo.salixline.jrxml"; gernotbelger@8996: gernotbelger@8996: @Override gernotbelger@8996: protected Logger getLog() { gernotbelger@8996: return log; gernotbelger@8996: } gernotbelger@8996: gernotbelger@8996: @Override gernotbelger@8996: protected void writeCSVGlobalMetadata(final CSVWriter writer, final SalixLineCalculationResults results) { gernotbelger@8996: log.info("SalixLineExporter.writeCSVMeta"); gernotbelger@8996: gernotbelger@8996: super.writeCSVGlobalMetadataDefaults(writer, results); gernotbelger@8996: gernotbelger@9107: // "# Höhensystem des Flusses: " gernotbelger@9107: writeCSVMetaEntry(writer, I18NStrings.CSV_META_HEIGHT_UNIT_RIVER, results.getRiver().getWstUnit()); gernotbelger@9107: gernotbelger@8996: // Add Auswerter, Bezugspegel, Jahr/Zeitraum der Wasserspiegellage gernotbelger@8996: gernotbelger@8996: // "# Auswerter: " gernotbelger@8996: writeCSVMetaEntry(writer, "uinfo.export.salix_line.csv.meta.header.evaluator", "sounding.getEvaluationBy()"); gernotbelger@8996: // "# Bezugspegel: " gernotbelger@8996: writeCSVMetaEntry(writer, "uinfo.export.salix_line.csv.meta.header.waterlevel.gauge", "wst.getGauge()"); gernotbelger@8996: gernotbelger@8996: // "# Jahr/Zeitraum der Wasserspiegellage: " gernotbelger@8996: // final int year = wst.getYear(); gernotbelger@8996: // if (year > 0) gernotbelger@8996: writeCSVMetaEntry(writer, "uinfo.export.salix_line.csv.meta.header.waterlevel.year", "Integer.toString(year)"); gernotbelger@8996: gernotbelger@8996: } gernotbelger@8996: gernotbelger@8996: private void writeRegionalEffectsCSVMetadata(final CSVWriter writer) { gernotbelger@8996: final String main = "uinfo.export.csv.meta.header.salix.regional"; gernotbelger@8996: // "##Regional wirkende Eingriffe" gernotbelger@8996: writeCSVMetaEntry(writer, main); gernotbelger@8996: writeRegionalCommonCSVMeta(writer); gernotbelger@8996: } gernotbelger@8996: gernotbelger@8996: private void writeRegionalCommonCSVMeta(final CSVWriter writer) { gernotbelger@8996: final String main = "uinfo.export.csv.meta.header.salix"; gernotbelger@8996: // "# Szenariotyp: " gernotbelger@8996: writeCSVMetaEntry(writer, main + ".szenariotyp"); gernotbelger@8996: // "# Teilabschnitt: " gernotbelger@8996: writeCSVMetaEntry(writer, main + ".teilabschnitt"); gernotbelger@8996: // "# Mittelwasserspiegellagenänderung: " gernotbelger@8996: writeCSVMetaEntry(writer, main + ".mwspiegellaenderung"); gernotbelger@8996: } gernotbelger@8996: gernotbelger@8996: private void writeExtendedRegionalEffectsCSVMetadata(final CSVWriter writer) { gernotbelger@8996: final String main = "uinfo.export.csv.meta.header.salix.regionalextended"; gernotbelger@8996: // "##Überregional wirkende Eingriffe" gernotbelger@8996: writeCSVMetaEntry(writer, main); gernotbelger@8996: gernotbelger@8996: writeRegionalCommonCSVMeta(writer); gernotbelger@8996: } gernotbelger@8996: gernotbelger@8996: private void writeHistoricalViewCSVMetadata(final CSVWriter writer) { gernotbelger@8996: final String main = "uinfo.export.csv.meta.header.salix.historical"; gernotbelger@8996: // "##Historische Betrachtung" gernotbelger@8996: writeCSVMetaEntry(writer, main); gernotbelger@8996: gernotbelger@8996: final String mainSub = "uinfo.export.csv.meta.header.salix"; gernotbelger@8996: // "# Szenariotyp: " gernotbelger@8996: writeCSVMetaEntry(writer, mainSub + ".szenariotyp"); gernotbelger@8996: // "# Teilabschnitt: " gernotbelger@8996: writeCSVMetaEntry(writer, mainSub + ".teilabschnitt"); gernotbelger@8996: gernotbelger@8996: // "# Art des Zeitraums: " gernotbelger@8996: writeCSVMetaEntry(writer, main + ".zeitart"); gernotbelger@8996: // "# Historischer Zeitpunkt: " gernotbelger@8996: writeCSVMetaEntry(writer, main + ".zeitpunkt"); gernotbelger@8996: } gernotbelger@8996: gernotbelger@8996: @Override gernotbelger@8996: protected void writeCSVResultMetadata(final CSVWriter writer, final SalixLineCalculationResults results, final SalixLineCalculationResult result) { gernotbelger@8996: writeRegionalEffectsCSVMetadata(writer); gernotbelger@8996: writer.writeNext(new String[] { "" }); // break line gernotbelger@8996: writeExtendedRegionalEffectsCSVMetadata(writer); gernotbelger@8996: writer.writeNext(new String[] { "" }); // break line gernotbelger@8996: writeHistoricalViewCSVMetadata(writer); gernotbelger@8996: } gernotbelger@8996: gernotbelger@8996: /** gernotbelger@8996: * Write the header, with different headings depending on whether at a gernotbelger@8996: * gauge or at a location. gernotbelger@8996: * gernotbelger@8996: * @param river gernotbelger@8996: * @param useTkh gernotbelger@8996: */ gernotbelger@8996: @Override gernotbelger@8996: protected void writeCSVHeader(final CSVWriter writer, final SalixLineCalculationResults results, final RiverInfo river) { gernotbelger@8996: log.info("FlowDepthExporter.writeCSVHeader"); gernotbelger@8996: gernotbelger@8996: final Collection header = new ArrayList<>(4); gernotbelger@8996: gernotbelger@8996: header.add(msg(GeneralResultType.station.getCsvHeader())); gernotbelger@8996: // header.add(msgUnit(SInfoResultType.flowdepth.getCsvHeader(), SInfoResultType.flowdepth.getUnit())); gernotbelger@8996: gernotbelger@8996: header.add(msg(UInfoResultType.salixline.getCsvHeader())); gernotbelger@8996: // wenn "historisch" gewählt wurde, nur "historisch" anzeigen; sonst für jeden scen-wert ne neue Spalte und "hist" gernotbelger@8996: // ausblenden!...!..!! gernotbelger@8996: header.add(msg(UInfoResultType.salixlinehist.getCsvHeader())); gernotbelger@8996: header.add(msg(UInfoResultType.salixlinescen.getCsvHeader())); gernotbelger@8996: writer.writeNext(header.toArray(new String[header.size()])); gernotbelger@8996: } gernotbelger@8996: gernotbelger@8996: /** gernotbelger@8996: * Format a row of a flow depth result into an array of string, both used by csv and pdf gernotbelger@8996: * gernotbelger@8996: * @param pdf gernotbelger@8996: * gernotbelger@8996: * @param useTkh gernotbelger@8996: */ gernotbelger@8996: @Override gernotbelger@8996: protected String[] formatRow(final SalixLineCalculationResults results, final ResultRow row, final ExportMode mode) { gernotbelger@8996: gernotbelger@8996: final Collection lines = new ArrayList<>(3); gernotbelger@8996: gernotbelger@8996: lines.add(row.exportValue(this.context, GeneralResultType.station)); gernotbelger@8996: lines.add(row.exportValue(this.context, UInfoResultType.salixline)); gernotbelger@8996: gernotbelger@8996: // wenn "historisch" gewählt wurde, nur "historisch" anzeigen; sonst für jeden scen-wert ne neue Spalte und "hist" gernotbelger@8996: // ausblenden!...!..!! gernotbelger@8996: lines.add(row.exportValue(this.context, UInfoResultType.salixlinehist)); gernotbelger@8996: lines.add(row.exportValue(this.context, UInfoResultType.salixlinescen)); gernotbelger@8996: return lines.toArray(new String[lines.size()]); gernotbelger@8996: } gernotbelger@8996: gernotbelger@8996: @Override gernotbelger@8996: protected final void addJRMetaData(final MetaAndTableJRDataSource source, final SalixLineCalculationResults results) { gernotbelger@8996: gernotbelger@8996: super.addJRMetaData(source, results); gernotbelger@8996: gernotbelger@8996: /* additional column headings */ gernotbelger@8996: source.addMetaData("station_header", GeneralResultType.station.getPdfHeader(this.context.getMeta())); gernotbelger@9006: gernotbelger@9006: source.addMetaData("salix_line", UInfoResultType.salixline.getPdfHeader(this.context.getMeta())); gernotbelger@9006: // wenn "historisch" gewählt wurde, nur "historisch" anzeigen; sonst für jeden scen-wert ne neue Spalte und "hist" gernotbelger@9006: // ausblenden!...!..!! gernotbelger@9006: source.addMetaData("salix_line_hist", UInfoResultType.salixlinehist.getPdfHeader(this.context.getMeta())); gernotbelger@9006: source.addMetaData("salix_line_scen", UInfoResultType.salixlinescen.getPdfHeader(this.context.getMeta())); gernotbelger@9006: } gernotbelger@9006: gernotbelger@9006: @Override gernotbelger@9006: protected void writePDF(final OutputStream out) { gernotbelger@9006: try { gernotbelger@9006: final MetaAndTableJRDataSource source = createJRData(this.data); gernotbelger@9006: gernotbelger@9006: final JasperReporter reporter = new JasperReporter(); gernotbelger@9006: reporter.addReport(JASPER_FILE, source); gernotbelger@9006: reporter.exportPDF(out); gernotbelger@9006: } gernotbelger@9006: catch (final JRException je) { gernotbelger@9006: getLog().warn("Error generating PDF Report!", je); gernotbelger@9006: } gernotbelger@9006: gernotbelger@8996: } gernotbelger@8996: gernotbelger@8996: }