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.inundationduration; 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@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.common.SInfoResultType; gernotbelger@8996: import org.dive4elements.river.artifacts.sinfo.util.RiverInfo; gernotbelger@8996: import org.dive4elements.river.artifacts.uinfo.commons.AbstractUInfoExporter; 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 InundationDurationExporter extends AbstractUInfoExporter { gernotbelger@8996: gernotbelger@8996: /** The log used in this exporter. */ gernotbelger@8996: private static Logger log = Logger.getLogger(InundationDurationExporter.class); gernotbelger@8996: gernotbelger@9006: private static final String JASPER_FILE = "/jasper/templates/uinfo.inundationduration.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 InundationDurationCalculationResults results) { gernotbelger@8996: log.info("SalixLineExporter.writeCSVMeta"); gernotbelger@8996: gernotbelger@8996: super.writeCSVGlobalMetadataDefaults(writer, results); gernotbelger@9006: writer.writeNext(new String[] { "" }); // break line gernotbelger@8996: } gernotbelger@8996: gernotbelger@8996: @Override gernotbelger@8996: protected void writeCSVResultMetadata(final CSVWriter writer, final InundationDurationCalculationResults results, gernotbelger@8996: final InundationDurationCalculationResult result) { gernotbelger@8996: gernotbelger@8996: /* gernotbelger@8996: * final BedHeightInfo sounding = result.getSounding(); gernotbelger@8996: * super.writeCSVSoundingMetadata(writer, sounding); gernotbelger@8996: * final WstInfo wst = result.getWst(); gernotbelger@8996: * super.writeCSVWaterlevelMetadata(writer, wst); gernotbelger@8996: */ 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 InundationDurationCalculationResults results, final RiverInfo river) { gernotbelger@8996: log.info("FlowDepthExporter.writeCSVHeader"); gernotbelger@8996: gernotbelger@8996: final Collection header = new ArrayList<>(11); 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(msgUnit(SInfoResultType.waterlevel.getCsvHeader(), river.getWstUnit())); gernotbelger@8996: header.add(msgUnit(SInfoResultType.discharge.getCsvHeader(), SInfoResultType.discharge.getUnit())); gernotbelger@8996: header.add(msg(SInfoResultType.waterlevelLabel.getCsvHeader())); gernotbelger@8996: header.add(msg(SInfoResultType.gaugeLabel.getCsvHeader())); gernotbelger@8996: header.add(msgUnit(SInfoResultType.meanBedHeight.getCsvHeader(), river.getWstUnit())); gernotbelger@8996: header.add(msg(SInfoResultType.soundingLabel.getCsvHeader())); gernotbelger@8996: header.add(msg(SInfoResultType.location.getCsvHeader())); gernotbelger@8996: 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 InundationDurationCalculationResults results, final ResultRow row, final ExportMode mode) { gernotbelger@8996: gernotbelger@8996: final Collection lines = new ArrayList<>(11); gernotbelger@8996: gernotbelger@8996: lines.add(row.exportValue(this.context, GeneralResultType.station)); gernotbelger@8996: lines.add(row.exportValue(this.context, SInfoResultType.flowdepth)); gernotbelger@8996: gernotbelger@8996: lines.add(row.exportValue(this.context, SInfoResultType.waterlevel)); gernotbelger@8996: lines.add(row.exportValue(this.context, SInfoResultType.discharge)); gernotbelger@8996: lines.add(row.exportValue(this.context, SInfoResultType.waterlevelLabel)); gernotbelger@8996: lines.add(row.exportValue(this.context, SInfoResultType.gaugeLabel)); gernotbelger@8996: lines.add(row.exportValue(this.context, SInfoResultType.meanBedHeight)); gernotbelger@8996: lines.add(row.exportValue(this.context, SInfoResultType.soundingLabel)); gernotbelger@8996: lines.add(row.exportValue(this.context, SInfoResultType.location)); gernotbelger@8996: 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 InundationDurationCalculationResults results) { gernotbelger@8996: gernotbelger@8996: /* general metadata */ gernotbelger@8996: super.addJRMetaData(source, results); gernotbelger@9006: gernotbelger@8996: /* column headings */ gernotbelger@8996: source.addMetaData("station_header", GeneralResultType.station.getPdfHeader(this.context.getMeta())); gernotbelger@9006: 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@8996: } gernotbelger@8996: gernotbelger@8996: }