gernotbelger@9145: /* Copyright (C) 2017 by Bundesanstalt für Gewässerkunde gernotbelger@9145: * Software engineering by gernotbelger@9145: * Björnsen Beratende Ingenieure GmbH gernotbelger@9145: * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt gernotbelger@9145: * gernotbelger@9145: * This file is Free Software under the GNU AGPL (>=v3) gernotbelger@9145: * and comes with ABSOLUTELY NO WARRANTY! Check out the gernotbelger@9145: * documentation coming with Dive4Elements River for details. gernotbelger@9145: */ gernotbelger@9145: package org.dive4elements.river.artifacts.sinfo.flood_duration; gernotbelger@9145: gernotbelger@9150: import java.text.NumberFormat; gernotbelger@9150: import java.util.ArrayList; gernotbelger@9145: import java.util.Collection; gernotbelger@9150: import java.util.List; gernotbelger@9145: gernotbelger@9150: import org.dive4elements.river.artifacts.common.ExportContextCSV; gernotbelger@9150: import org.dive4elements.river.artifacts.common.GeneralResultType; gernotbelger@9150: import org.dive4elements.river.artifacts.common.MetaAndTableJRDataSource; gernotbelger@9145: 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@9150: import org.dive4elements.river.artifacts.sinfo.util.RiverInfo; gernotbelger@9145: import org.dive4elements.river.artifacts.sinfo.util.WstInfo; gernotbelger@9145: gernotbelger@9145: /** gernotbelger@9145: * Contains the results of a {@link FloodDurationCalculation}. gernotbelger@9145: * gernotbelger@9145: * @author Gernot Belger gernotbelger@9145: */ gernotbelger@9170: final class FloodDurationCalculationResult extends AbstractTkhCalculationResult { gernotbelger@9145: gernotbelger@9145: private static final long serialVersionUID = 1L; gernotbelger@9150: private final int waterlevelCount; // TODO: ggf 2 verschiedene Result-Klassen? gernotbelger@9170: // private final WstInfo wstInfo; gernotbelger@9150: private final int maxWaterlevelPdf = 3; gernotbelger@9150: gernotbelger@9150: private enum ExportMode { gernotbelger@9150: pdf, csv gernotbelger@9150: } gernotbelger@9145: gernotbelger@9170: public FloodDurationCalculationResult(final String label, final WstInfo wstInfo, final Collection rows, final boolean hasTkh, gernotbelger@9170: final int waterlevelCount) { gernotbelger@9170: super(label, wstInfo, hasTkh, rows); gernotbelger@9145: this.waterlevelCount = waterlevelCount; gernotbelger@9170: // this.wstInfo = wstInfo; gernotbelger@9150: } gernotbelger@9150: gernotbelger@9150: @Override gernotbelger@9170: public void writeCSVHeader(final ExportContextCSV exportContextCSV, final FloodDurationCalculationResults results, final RiverInfo river) { gernotbelger@9150: gernotbelger@9150: final Collection header = new ArrayList<>(99); gernotbelger@9150: gernotbelger@9150: header.add(exportContextCSV.formatCsvHeader(GeneralResultType.station)); gernotbelger@9150: header.add(exportContextCSV.formatCsvHeader(SInfoResultType.riverside)); gernotbelger@9150: header.add(exportContextCSV.formatCsvHeader(SInfoResultType.inundationduration)); gernotbelger@9150: header.add(exportContextCSV.formatCsvHeader(SInfoResultType.inundationdurationq)); gernotbelger@9150: header.add(exportContextCSV.formatCsvHeader(SInfoResultType.infrastructureHeight)); gernotbelger@9150: header.add(exportContextCSV.formatCsvHeader(SInfoResultType.infrastructuretype)); gernotbelger@9150: gernotbelger@9150: // add dynamic headers gernotbelger@9150: final int waterlevelCount = // results. gernotbelger@9150: getWaterlevelCount(); gernotbelger@9150: for (int i = 0; i < waterlevelCount; i++) { gernotbelger@9150: final int naturalIndex = i + 1; gernotbelger@9150: final String appendIndex = new StringBuilder().append("_").append(naturalIndex).toString(); gernotbelger@9150: final Object[] args = new Object[] { appendIndex }; gernotbelger@9150: // new StringBuilder().append('\u2081').toString(); // schlechter UTF-8-Support für subscript ints gernotbelger@9150: header.add(exportContextCSV.msg(DurationWaterlevel.getHeaderW(), new Object[] { appendIndex, "results.getRiver().getWstUnit()" })); gernotbelger@9150: header.add(exportContextCSV.msg(DurationWaterlevel.getHeaderFloodDurPerYear(), args)); gernotbelger@9150: header.add(exportContextCSV.msg(DurationWaterlevel.getHeaderQ(), args)); gernotbelger@9150: header.add(exportContextCSV.msg(DurationWaterlevel.getHeaderBezeichn(), args)); gernotbelger@9150: } gernotbelger@9150: gernotbelger@9150: header.add(exportContextCSV.formatCsvHeader(SInfoResultType.gaugeLabel)); gernotbelger@9150: header.add(exportContextCSV.formatCsvHeader(SInfoResultType.location)); gernotbelger@9150: gernotbelger@9150: exportContextCSV.writeCSVLine(header.toArray(new String[header.size()])); gernotbelger@9150: } gernotbelger@9150: gernotbelger@9150: @Override gernotbelger@9170: protected void writeCSVResultMetadata(final ExportContextCSV exportContextCSV, final FloodDurationCalculationResults results) { gernotbelger@9150: gernotbelger@9170: exportContextCSV.writeCSVWaterlevelMetadata(super.getWst()); // -> export in super? -> TODO gernotbelger@9150: exportContextCSV.writeBlankLine(); gernotbelger@9150: // writer.writeNext(new String[] { "" }); // break line gernotbelger@9145: gernotbelger@9145: } gernotbelger@9145: gernotbelger@9150: @Override gernotbelger@9170: protected String[] formatCSVRow(final ExportContextCSV exportContextCSV, final FloodDurationCalculationResults results, final ResultRow row) { gernotbelger@9150: // TODO Auto-generated method stub gernotbelger@9150: return formatRow(exportContextCSV, results, row, ExportMode.csv); gernotbelger@9150: } gernotbelger@9150: gernotbelger@9150: @Override gernotbelger@9170: protected String[] formatPDFRow(final ExportContextCSV exportContextCSV, final FloodDurationCalculationResults results, final ResultRow row) { gernotbelger@9150: gernotbelger@9150: return formatRow(exportContextCSV, results, row, ExportMode.pdf); gernotbelger@9150: } gernotbelger@9150: gernotbelger@9150: @Override gernotbelger@9150: protected String getJasperFile() { gernotbelger@9150: if (this.waterlevelCount <= 1) gernotbelger@9150: return "/jasper/templates/sinfo.floodduration.jrxml"; // TODO 2 different result-classes? gernotbelger@9150: else gernotbelger@9150: return "/jasper/templates/sinfo.floodduration2.jrxml"; gernotbelger@9150: } gernotbelger@9150: gernotbelger@9150: @Override gernotbelger@9170: protected void addJRTableHeader(final ExportContextCSV exportContextCSV, final MetaAndTableJRDataSource source, gernotbelger@9170: final FloodDurationCalculationResults results) { gernotbelger@9150: /* column headings */ gernotbelger@9150: exportContextCSV.addJRMetadata(source, "station_header", GeneralResultType.station); gernotbelger@9150: exportContextCSV.addJRMetadata(source, "riverside_header", SInfoResultType.riverside); gernotbelger@9150: exportContextCSV.addJRMetadata(source, "inundationduration_header", SInfoResultType.inundationduration); gernotbelger@9150: exportContextCSV.addJRMetadata(source, "inundationduration_q_header", SInfoResultType.inundationdurationq); gernotbelger@9150: exportContextCSV.addJRMetadata(source, "infrastructure_height_header", SInfoResultType.infrastructureHeightFloodDur); gernotbelger@9150: exportContextCSV.addJRMetadata(source, "infrastructure_type_header", SInfoResultType.infrastructuretype); gernotbelger@9150: gernotbelger@9150: // add dynamic headers gernotbelger@9150: gernotbelger@9150: if (this.waterlevelCount == 0 || this.waterlevelCount == 2) { gernotbelger@9150: source.addMetaData("dummy", "dummy"); gernotbelger@9150: source.addMetaData("dummy", "dummy"); gernotbelger@9150: source.addMetaData("dummy", "dummy"); gernotbelger@9150: source.addMetaData("dummy", "dummy"); gernotbelger@9150: } gernotbelger@9150: gernotbelger@9150: for (int i = 0; i < this.waterlevelCount; i++) { gernotbelger@9150: final int naturalIndex = i + 1; gernotbelger@9150: gernotbelger@9150: final Object[] args = new String[] { new StringBuilder().append("_").append(naturalIndex).toString() }; gernotbelger@9150: exportContextCSV.addJRMetadata(source, getPdfHeader("w", naturalIndex), exportContextCSV.msg(DurationWaterlevel.getHeaderW(), args)); gernotbelger@9150: exportContextCSV.addJRMetadata(source, getPdfHeader("duration", naturalIndex), gernotbelger@9150: exportContextCSV.msg(DurationWaterlevel.getHeaderFloodDurPerYear(), args)); gernotbelger@9150: exportContextCSV.addJRMetadata(source, getPdfHeader("q", naturalIndex), exportContextCSV.msg(DurationWaterlevel.getHeaderQ(), args)); gernotbelger@9150: exportContextCSV.addJRMetadata(source, getPdfHeader("bezeichnung", naturalIndex), gernotbelger@9150: exportContextCSV.msg(DurationWaterlevel.getHeaderBezeichn(), args)); gernotbelger@9150: gernotbelger@9150: } gernotbelger@9150: gernotbelger@9150: exportContextCSV.addJRMetadata(source, "gauge_header", SInfoResultType.gaugeLabel); gernotbelger@9150: exportContextCSV.addJRMetadata(source, "location_header", SInfoResultType.location); gernotbelger@9150: gernotbelger@9150: } gernotbelger@9150: gernotbelger@9150: public int getWaterlevelCount() { // der exporter muss daran, um spalten auszublenden gernotbelger@9145: return this.waterlevelCount; gernotbelger@9145: } gernotbelger@9145: gernotbelger@9170: private String[] formatRow(final ExportContextCSV exportContextCSV, final FloodDurationCalculationResults results, final ResultRow row, gernotbelger@9170: final ExportMode mode) { gernotbelger@9150: gernotbelger@9150: final Collection lines = new ArrayList<>(99); gernotbelger@9150: gernotbelger@9150: lines.add(exportContextCSV.formatRowValue(row, GeneralResultType.station)); gernotbelger@9150: lines.add(exportContextCSV.formatRowValue(row, SInfoResultType.riverside)); gernotbelger@9150: lines.add(exportContextCSV.formatRowValue(row, SInfoResultType.inundationduration)); gernotbelger@9150: lines.add(exportContextCSV.formatRowValue(row, SInfoResultType.inundationdurationq)); gernotbelger@9150: lines.add(exportContextCSV.formatRowValue(row, SInfoResultType.infrastructureHeight)); gernotbelger@9150: lines.add(exportContextCSV.formatRowValue(row, SInfoResultType.infrastructuretype)); gernotbelger@9150: gernotbelger@9150: final List waterlevelList = (List) row.getValue(SInfoResultType.customMultiRowColWaterlevel); gernotbelger@9150: if (waterlevelList != null) { gernotbelger@9150: final NumberFormat wFormatter = exportContextCSV.getFlowDepthFormatter(); gernotbelger@9150: final NumberFormat qFormatter = exportContextCSV.getQFormatter(); gernotbelger@9150: gernotbelger@9150: for (int i = 0; i < waterlevelList.size(); i++) { gernotbelger@9150: gernotbelger@9150: if (i == this.maxWaterlevelPdf && mode == ExportMode.pdf) gernotbelger@9150: break; gernotbelger@9150: gernotbelger@9150: final DurationWaterlevel item = waterlevelList.get(i); gernotbelger@9150: lines.add(item.getWFormatted(wFormatter)); gernotbelger@9150: lines.add(item.getFloodDurDaysPerYearFormatted()); gernotbelger@9150: lines.add(item.getQFormatted(qFormatter)); gernotbelger@9150: lines.add(item.getBezeichnung()); gernotbelger@9150: } gernotbelger@9150: } gernotbelger@9150: gernotbelger@9150: if ((this.waterlevelCount == 0 || this.waterlevelCount == 2) && mode == ExportMode.pdf) { gernotbelger@9150: lines.add("dummy"); gernotbelger@9150: lines.add("dummy"); gernotbelger@9150: lines.add("dummy"); gernotbelger@9150: lines.add("dummy"); gernotbelger@9150: } gernotbelger@9150: gernotbelger@9150: lines.add(exportContextCSV.formatRowValue(row, SInfoResultType.gaugeLabel)); gernotbelger@9150: lines.add(exportContextCSV.formatRowValue(row, SInfoResultType.location)); gernotbelger@9150: return lines.toArray(new String[lines.size()]); gernotbelger@9150: } gernotbelger@9150: gernotbelger@9150: private String getPdfHeader(final String rootStr, final int index) { gernotbelger@9150: final String hd = "_header"; gernotbelger@9150: final StringBuilder builder = new StringBuilder(); gernotbelger@9150: return builder.append(rootStr).append("_").append(index).append(hd).toString(); gernotbelger@9150: } gernotbelger@9145: }