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

http://dive4elements.wald.intevation.org