Mercurial > dive4elements > river
view artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flood_duration/FloodDurationCalculationResult.java @ 9170:9b2e46090099
tkh cast exception fix
gigantic refactoring 2
author | gernotbelger |
---|---|
date | Thu, 21 Jun 2018 14:32:11 +0200 |
parents | 23945061daec |
children | 1614cb14308f |
line wrap: on
line source
/* Copyright (C) 2017 by Bundesanstalt für Gewässerkunde * Software engineering by * Björnsen Beratende Ingenieure GmbH * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt * * This file is Free Software under the GNU AGPL (>=v3) * and comes with ABSOLUTELY NO WARRANTY! Check out the * documentation coming with Dive4Elements River for details. */ 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.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.AbstractTkhCalculationResult; import org.dive4elements.river.artifacts.sinfo.common.SInfoResultType; import org.dive4elements.river.artifacts.sinfo.util.RiverInfo; import org.dive4elements.river.artifacts.sinfo.util.WstInfo; /** * Contains the results of a {@link FloodDurationCalculation}. * * @author Gernot Belger */ final class FloodDurationCalculationResult extends AbstractTkhCalculationResult<FloodDurationCalculationResults> { private static final long serialVersionUID = 1L; 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 boolean hasTkh, final int waterlevelCount) { super(label, wstInfo, hasTkh, rows); this.waterlevelCount = waterlevelCount; // this.wstInfo = wstInfo; } @Override public void writeCSVHeader(final ExportContextCSV exportContextCSV, final FloodDurationCalculationResults 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 FloodDurationCalculationResults results) { exportContextCSV.writeCSVWaterlevelMetadata(super.getWst()); // -> export in super? -> TODO exportContextCSV.writeBlankLine(); // writer.writeNext(new String[] { "" }); // break line } @Override protected String[] formatCSVRow(final ExportContextCSV exportContextCSV, final FloodDurationCalculationResults results, final ResultRow row) { // TODO Auto-generated method stub return formatRow(exportContextCSV, results, row, ExportMode.csv); } @Override protected String[] formatPDFRow(final ExportContextCSV exportContextCSV, final FloodDurationCalculationResults 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 FloodDurationCalculationResults 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 FloodDurationCalculationResults 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(); } }