gernotbelger@8854: /* Copyright (C) 2017 by Bundesanstalt für Gewässerkunde gernotbelger@8877: * Software engineering by gernotbelger@8877: * Björnsen Beratende Ingenieure GmbH gernotbelger@8854: * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt gernotbelger@8854: * gernotbelger@8854: * This file is Free Software under the GNU AGPL (>=v3) gernotbelger@8854: * and comes with ABSOLUTELY NO WARRANTY! Check out the gernotbelger@8854: * documentation coming with Dive4Elements River for details. gernotbelger@8854: */ gernotbelger@8854: package org.dive4elements.river.artifacts.sinfo.flowdepth; gernotbelger@8854: gernotbelger@9150: import java.util.ArrayList; gernotbelger@8854: import java.util.Collection; gernotbelger@8854: gernotbelger@9150: import org.dive4elements.river.artifacts.common.ExportContextCSV; gernotbelger@9195: import org.dive4elements.river.artifacts.common.ExportContextPDF; gernotbelger@9150: import org.dive4elements.river.artifacts.common.GeneralResultType; gernotbelger@9195: import org.dive4elements.river.artifacts.common.IExportContext; gernotbelger@9150: import org.dive4elements.river.artifacts.common.MetaAndTableJRDataSource; gernotbelger@8997: import org.dive4elements.river.artifacts.common.ResultRow; gernotbelger@9170: import org.dive4elements.river.artifacts.sinfo.common.AbstractTkhCalculationResult; gernotbelger@9150: import org.dive4elements.river.artifacts.sinfo.common.SInfoResultType; gernotbelger@8894: import org.dive4elements.river.artifacts.sinfo.util.BedHeightInfo; gernotbelger@9150: import org.dive4elements.river.artifacts.sinfo.util.RiverInfo; gernotbelger@8894: import org.dive4elements.river.artifacts.sinfo.util.WstInfo; gernotbelger@8894: gernotbelger@8854: /** gernotbelger@9067: * Contains the results of a {@link FloodDurationCalculation}. gernotbelger@8854: * gernotbelger@8854: * @author Gernot Belger gernotbelger@8854: */ gernotbelger@9170: gernotbelger@9195: final class FlowDepthCalculationResult extends AbstractTkhCalculationResult { gernotbelger@8854: gernotbelger@8877: private static final long serialVersionUID = 1L; gernotbelger@8854: gernotbelger@9150: private enum ExportMode { // TODO; nicht ständig kopieren gernotbelger@9150: pdf, csv gernotbelger@9150: } gernotbelger@9150: gernotbelger@9150: private static final String JASPER_FILE = "/jasper/templates/sinfo.flowdepth.jrxml"; // TODO use jrxml-path all over the project gernotbelger@9150: gernotbelger@8877: private final BedHeightInfo sounding; gernotbelger@8877: gernotbelger@8915: public FlowDepthCalculationResult(final String label, final WstInfo wst, final BedHeightInfo sounding, final boolean hasTkh, gernotbelger@8997: final Collection rows) { gernotbelger@9170: super(label, wst, hasTkh, rows); gernotbelger@8877: gernotbelger@8915: this.sounding = sounding; gernotbelger@9170: gernotbelger@8877: } gernotbelger@8877: gernotbelger@8877: public BedHeightInfo getSounding() { gernotbelger@8877: return this.sounding; gernotbelger@8877: } gernotbelger@9150: gernotbelger@9150: @Override gernotbelger@9351: public void writeCSVHeader(final ExportContextCSV exportContext, final RiverInfo river) { gernotbelger@9150: // getLog().info("FlowDepthExporter.writeCSVHeader"); gernotbelger@9150: gernotbelger@9365: final Collection header = new ArrayList<>(15); gernotbelger@9150: gernotbelger@9351: header.add(exportContext.formatCsvHeader(GeneralResultType.station)); gernotbelger@9351: header.add(exportContext.msgUnitCSV(SInfoResultType.flowdepth)); gernotbelger@9150: gernotbelger@9351: if (((FlowDepthCalculationResults) exportContext.getResults()).hasTkh()) { gernotbelger@9351: header.add(exportContext.msgUnitCSV(SInfoResultType.flowdepthtkh)); gernotbelger@9351: header.add(exportContext.msgUnitCSV(SInfoResultType.tkh)); gernotbelger@9150: } gernotbelger@9150: gernotbelger@9351: header.add(exportContext.msgUnitCSV(SInfoResultType.waterlevel, river.getWstUnit())); gernotbelger@9351: header.add(exportContext.msgUnitCSV(SInfoResultType.discharge)); gernotbelger@9351: header.add(exportContext.formatCsvHeader(GeneralResultType.waterlevelLabel)); gernotbelger@9365: gernotbelger@9365: if (((FlowDepthCalculationResults) exportContext.getResults()).isShowRefGauges()) { gernotbelger@9365: header.add(exportContext.formatCsvHeader(GeneralResultType.gaugeLabel)); gernotbelger@9365: } gernotbelger@9365: gernotbelger@9581: header.add(exportContext.msgUnitCSV(SInfoResultType.meanBedHeight, river.getWstUnit())); gernotbelger@9351: header.add(exportContext.formatCsvHeader(SInfoResultType.soundingLabel)); gernotbelger@9351: header.add(exportContext.formatCsvHeader(GeneralResultType.location)); gernotbelger@9150: gernotbelger@9351: exportContext.writeCSVLine(header.toArray(new String[header.size()])); gernotbelger@9150: gernotbelger@9150: } gernotbelger@9150: gernotbelger@9150: @Override gernotbelger@9195: protected void writeCSVResultMetadata(final ExportContextCSV exportContextCSV) { gernotbelger@9150: gernotbelger@9150: exportContextCSV.writeCSVSoundingMetadata(this.sounding); gernotbelger@9150: gernotbelger@9150: exportContextCSV.writeBlankLine();// .writeNext(new String[] { "" }); // break line gernotbelger@9150: gernotbelger@9170: exportContextCSV.writeCSVWaterlevelMetadata(super.getWst()); // TODO move to super gernotbelger@9150: gernotbelger@9150: exportContextCSV.writeBlankLine();// .writeNext(new String[] { "" }); // break line gernotbelger@9150: gernotbelger@9150: } gernotbelger@9150: gernotbelger@9150: @Override gernotbelger@9150: protected String getJasperFile() { gernotbelger@9150: return JASPER_FILE; gernotbelger@9150: } gernotbelger@9150: gernotbelger@9150: @Override gernotbelger@9195: protected String[] formatCSVRow(final ExportContextCSV exportContextCSV, final ResultRow row) { gernotbelger@9195: return formatRow(ExportMode.csv, exportContextCSV, row); gernotbelger@9150: } gernotbelger@9150: gernotbelger@9150: @Override gernotbelger@9195: protected String[] formatPDFRow(final ExportContextPDF exportContextPDF, final ResultRow row) { gernotbelger@9150: gernotbelger@9195: return formatRow(ExportMode.pdf, exportContextPDF, row); gernotbelger@9150: } gernotbelger@9150: gernotbelger@9150: @Override gernotbelger@9195: protected void addJRTableHeader(final ExportContextPDF exportContextPDF, final MetaAndTableJRDataSource source) { gernotbelger@9150: gernotbelger@9150: /* column headings */ gernotbelger@9150: exportContextPDF.addJRMetadata(source, "station_header", GeneralResultType.station); gernotbelger@9150: exportContextPDF.addJRMetadata(source, "flowdepth_header", SInfoResultType.flowdepth); gernotbelger@9150: exportContextPDF.addJRMetadata(source, "flowdepth_tkh_header", SInfoResultType.flowdepthtkh); gernotbelger@9150: exportContextPDF.addJRMetadata(source, "tkh_header", SInfoResultType.tkh); gernotbelger@9150: exportContextPDF.addJRMetadata(source, "waterlevel_header", SInfoResultType.waterlevel); gernotbelger@9150: exportContextPDF.addJRMetadata(source, "discharge_header", SInfoResultType.discharge); gernotbelger@9318: exportContextPDF.addJRMetadata(source, "waterlevel_name_header", GeneralResultType.waterlevelLabel); gernotbelger@9318: exportContextPDF.addJRMetadata(source, "gauge_header", GeneralResultType.gaugeLabel); gernotbelger@9150: exportContextPDF.addJRMetadata(source, "bedheight_header", SInfoResultType.meanBedHeight); gernotbelger@9150: exportContextPDF.addJRMetadata(source, "sounding_name_header", SInfoResultType.soundingLabel); gernotbelger@9312: exportContextPDF.addJRMetadata(source, "location_header", GeneralResultType.location); gernotbelger@9150: } gernotbelger@9150: gernotbelger@9195: private String[] formatRow(final ExportMode mode, final IExportContext exportContext, final ResultRow row) { gernotbelger@9150: gernotbelger@9150: final Collection lines = new ArrayList<>(11); gernotbelger@9150: gernotbelger@9195: lines.add(exportContext.formatRowValue(row, GeneralResultType.station)); gernotbelger@9195: lines.add(exportContext.formatRowValue(row, SInfoResultType.flowdepth)); gernotbelger@9195: final FlowDepthCalculationResults results = exportContext.getResults(); gernotbelger@9150: gernotbelger@9351: // REMARK: for csv: only remove tkh columns, if no result has tkh gernotbelger@9351: // for pdf: adding by default is necessary. If there is no tkh, columns will be removed later in the exporter. gernotbelger@9351: if (mode == ExportMode.pdf || results.hasTkh()) { gernotbelger@9195: lines.add(exportContext.formatRowValue(row, SInfoResultType.flowdepthtkh)); gernotbelger@9195: lines.add(exportContext.formatRowValue(row, SInfoResultType.tkh)); gernotbelger@9150: } gernotbelger@9150: gernotbelger@9195: lines.add(exportContext.formatRowValue(row, SInfoResultType.waterlevel)); gernotbelger@9195: lines.add(exportContext.formatRowValue(row, SInfoResultType.discharge)); gernotbelger@9318: lines.add(exportContext.formatRowValue(row, GeneralResultType.waterlevelLabel)); gernotbelger@9365: gernotbelger@9365: if (mode == ExportMode.pdf || results.isShowRefGauges()) { gernotbelger@9365: lines.add(exportContext.formatRowValue(row, GeneralResultType.gaugeLabel)); gernotbelger@9365: } gernotbelger@9365: gernotbelger@9195: lines.add(exportContext.formatRowValue(row, SInfoResultType.meanBedHeight)); gernotbelger@9195: lines.add(exportContext.formatRowValue(row, SInfoResultType.soundingLabel)); gernotbelger@9312: lines.add(exportContext.formatRowValue(row, GeneralResultType.location)); gernotbelger@9150: gernotbelger@9150: return lines.toArray(new String[lines.size()]); gernotbelger@9150: } gernotbelger@9150: gernotbelger@8854: }