Mercurial > dive4elements > river
diff artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flood_duration/FloodDurationCalculationResult.java @ 9150:23945061daec
gigantic refactoring: exporter, result, results
to support multiple jaspers -> collisions
author | gernotbelger |
---|---|
date | Thu, 14 Jun 2018 16:56:31 +0200 |
parents | e6b63b2b41b9 |
children | 9b2e46090099 |
line wrap: on
line diff
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flood_duration/FloodDurationCalculationResult.java Thu Jun 14 15:12:25 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flood_duration/FloodDurationCalculationResult.java Thu Jun 14 16:56:31 2018 +0200 @@ -9,10 +9,19 @@ */ package org.dive4elements.river.artifacts.sinfo.flood_duration; +import java.text.NumberFormat; +import java.util.ArrayList; import java.util.Collection; +import java.util.List; +import org.dive4elements.river.artifacts.common.AbstractCalculationExportableResult; +import org.dive4elements.river.artifacts.common.AbstractCalculationResults; +import org.dive4elements.river.artifacts.common.ExportContextCSV; +import org.dive4elements.river.artifacts.common.GeneralResultType; +import org.dive4elements.river.artifacts.common.MetaAndTableJRDataSource; import org.dive4elements.river.artifacts.common.ResultRow; -import org.dive4elements.river.artifacts.sinfo.common.AbstractSInfoCalculationResult; +import org.dive4elements.river.artifacts.sinfo.common.SInfoResultType; +import org.dive4elements.river.artifacts.sinfo.util.RiverInfo; import org.dive4elements.river.artifacts.sinfo.util.WstInfo; /** @@ -20,19 +29,170 @@ * * @author Gernot Belger */ -final class FloodDurationCalculationResult extends AbstractSInfoCalculationResult { +final class FloodDurationCalculationResult extends AbstractCalculationExportableResult { private static final long serialVersionUID = 1L; - private final int waterlevelCount; + private final int waterlevelCount; // TODO: ggf 2 verschiedene Result-Klassen? + private final WstInfo wstInfo; + private final int maxWaterlevelPdf = 3; + + private enum ExportMode { + pdf, csv + } public FloodDurationCalculationResult(final String label, final WstInfo wstInfo, final Collection<ResultRow> rows, final int waterlevelCount) { - super(label, wstInfo, rows); + super(label, rows); this.waterlevelCount = waterlevelCount; + this.wstInfo = wstInfo; + } + + @Override + public void writeCSVHeader(final ExportContextCSV exportContextCSV, final AbstractCalculationResults results, final RiverInfo river) { + + final Collection<String> header = new ArrayList<>(99); + + header.add(exportContextCSV.formatCsvHeader(GeneralResultType.station)); + header.add(exportContextCSV.formatCsvHeader(SInfoResultType.riverside)); + header.add(exportContextCSV.formatCsvHeader(SInfoResultType.inundationduration)); + header.add(exportContextCSV.formatCsvHeader(SInfoResultType.inundationdurationq)); + header.add(exportContextCSV.formatCsvHeader(SInfoResultType.infrastructureHeight)); + header.add(exportContextCSV.formatCsvHeader(SInfoResultType.infrastructuretype)); + + // add dynamic headers + final int waterlevelCount = // results. + getWaterlevelCount(); + for (int i = 0; i < waterlevelCount; i++) { + final int naturalIndex = i + 1; + final String appendIndex = new StringBuilder().append("_").append(naturalIndex).toString(); + final Object[] args = new Object[] { appendIndex }; + // new StringBuilder().append('\u2081').toString(); // schlechter UTF-8-Support für subscript ints + header.add(exportContextCSV.msg(DurationWaterlevel.getHeaderW(), new Object[] { appendIndex, "results.getRiver().getWstUnit()" })); + header.add(exportContextCSV.msg(DurationWaterlevel.getHeaderFloodDurPerYear(), args)); + header.add(exportContextCSV.msg(DurationWaterlevel.getHeaderQ(), args)); + header.add(exportContextCSV.msg(DurationWaterlevel.getHeaderBezeichn(), args)); + } + + header.add(exportContextCSV.formatCsvHeader(SInfoResultType.gaugeLabel)); + header.add(exportContextCSV.formatCsvHeader(SInfoResultType.location)); + + exportContextCSV.writeCSVLine(header.toArray(new String[header.size()])); + } + + @Override + protected void writeCSVResultMetadata(final ExportContextCSV exportContextCSV, final AbstractCalculationResults results) { + + exportContextCSV.writeCSVWaterlevelMetadata(this.wstInfo); // TODO: Abweichend vom Allgemeinen werden hier andere Felder benötigt bei den + // Wasserspiegellagen + exportContextCSV.writeBlankLine(); + // writer.writeNext(new String[] { "" }); // break line } - public int getWaterlevelCount() { + @Override + protected String[] formatCSVRow(final ExportContextCSV exportContextCSV, final AbstractCalculationResults results, final ResultRow row) { + // TODO Auto-generated method stub + return formatRow(exportContextCSV, results, row, ExportMode.csv); + } + + @Override + protected String[] formatPDFRow(final ExportContextCSV exportContextCSV, final AbstractCalculationResults results, final ResultRow row) { + + return formatRow(exportContextCSV, results, row, ExportMode.pdf); + } + + @Override + protected String getJasperFile() { + if (this.waterlevelCount <= 1) + return "/jasper/templates/sinfo.floodduration.jrxml"; // TODO 2 different result-classes? + else + return "/jasper/templates/sinfo.floodduration2.jrxml"; + } + + @Override + protected void addJRTableHeader(final ExportContextCSV exportContextCSV, final MetaAndTableJRDataSource source, final AbstractCalculationResults results) { + /* column headings */ + exportContextCSV.addJRMetadata(source, "station_header", GeneralResultType.station); + exportContextCSV.addJRMetadata(source, "riverside_header", SInfoResultType.riverside); + exportContextCSV.addJRMetadata(source, "inundationduration_header", SInfoResultType.inundationduration); + exportContextCSV.addJRMetadata(source, "inundationduration_q_header", SInfoResultType.inundationdurationq); + exportContextCSV.addJRMetadata(source, "infrastructure_height_header", SInfoResultType.infrastructureHeightFloodDur); + exportContextCSV.addJRMetadata(source, "infrastructure_type_header", SInfoResultType.infrastructuretype); + + // add dynamic headers + + if (this.waterlevelCount == 0 || this.waterlevelCount == 2) { + source.addMetaData("dummy", "dummy"); + source.addMetaData("dummy", "dummy"); + source.addMetaData("dummy", "dummy"); + source.addMetaData("dummy", "dummy"); + } + + for (int i = 0; i < this.waterlevelCount; i++) { + final int naturalIndex = i + 1; + + final Object[] args = new String[] { new StringBuilder().append("_").append(naturalIndex).toString() }; + exportContextCSV.addJRMetadata(source, getPdfHeader("w", naturalIndex), exportContextCSV.msg(DurationWaterlevel.getHeaderW(), args)); + exportContextCSV.addJRMetadata(source, getPdfHeader("duration", naturalIndex), + exportContextCSV.msg(DurationWaterlevel.getHeaderFloodDurPerYear(), args)); + exportContextCSV.addJRMetadata(source, getPdfHeader("q", naturalIndex), exportContextCSV.msg(DurationWaterlevel.getHeaderQ(), args)); + exportContextCSV.addJRMetadata(source, getPdfHeader("bezeichnung", naturalIndex), + exportContextCSV.msg(DurationWaterlevel.getHeaderBezeichn(), args)); + + } + + exportContextCSV.addJRMetadata(source, "gauge_header", SInfoResultType.gaugeLabel); + exportContextCSV.addJRMetadata(source, "location_header", SInfoResultType.location); + + } + + public int getWaterlevelCount() { // der exporter muss daran, um spalten auszublenden return this.waterlevelCount; } + private String[] formatRow(final ExportContextCSV exportContextCSV, final AbstractCalculationResults results, final ResultRow row, final ExportMode mode) { + + final Collection<String> lines = new ArrayList<>(99); + + lines.add(exportContextCSV.formatRowValue(row, GeneralResultType.station)); + lines.add(exportContextCSV.formatRowValue(row, SInfoResultType.riverside)); + lines.add(exportContextCSV.formatRowValue(row, SInfoResultType.inundationduration)); + lines.add(exportContextCSV.formatRowValue(row, SInfoResultType.inundationdurationq)); + lines.add(exportContextCSV.formatRowValue(row, SInfoResultType.infrastructureHeight)); + lines.add(exportContextCSV.formatRowValue(row, SInfoResultType.infrastructuretype)); + + final List<DurationWaterlevel> waterlevelList = (List<DurationWaterlevel>) row.getValue(SInfoResultType.customMultiRowColWaterlevel); + if (waterlevelList != null) { + final NumberFormat wFormatter = exportContextCSV.getFlowDepthFormatter(); + final NumberFormat qFormatter = exportContextCSV.getQFormatter(); + + for (int i = 0; i < waterlevelList.size(); i++) { + + if (i == this.maxWaterlevelPdf && mode == ExportMode.pdf) + break; + + final DurationWaterlevel item = waterlevelList.get(i); + lines.add(item.getWFormatted(wFormatter)); + lines.add(item.getFloodDurDaysPerYearFormatted()); + lines.add(item.getQFormatted(qFormatter)); + lines.add(item.getBezeichnung()); + } + } + + if ((this.waterlevelCount == 0 || this.waterlevelCount == 2) && mode == ExportMode.pdf) { + lines.add("dummy"); + lines.add("dummy"); + lines.add("dummy"); + lines.add("dummy"); + } + + lines.add(exportContextCSV.formatRowValue(row, SInfoResultType.gaugeLabel)); + lines.add(exportContextCSV.formatRowValue(row, SInfoResultType.location)); + return lines.toArray(new String[lines.size()]); + } + + private String getPdfHeader(final String rootStr, final int index) { + final String hd = "_header"; + final StringBuilder builder = new StringBuilder(); + return builder.append(rootStr).append("_").append(index).append(hd).toString(); + } } \ No newline at end of file