mschaefer@9361: /** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde mschaefer@9361: * Software engineering by mschaefer@9361: * Björnsen Beratende Ingenieure GmbH mschaefer@9361: * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt mschaefer@9361: * mschaefer@9361: * This file is Free Software under the GNU AGPL (>=v3) mschaefer@9361: * and comes with ABSOLUTELY NO WARRANTY! Check out the mschaefer@9361: * documentation coming with Dive4Elements River for details. mschaefer@9361: */ mschaefer@9361: package org.dive4elements.river.artifacts.uinfo.salix; mschaefer@9361: mschaefer@9361: import java.text.NumberFormat; mschaefer@9361: import java.util.ArrayList; mschaefer@9361: import java.util.Collection; mschaefer@9361: import java.util.List; mschaefer@9361: mschaefer@9361: import org.dive4elements.river.artifacts.common.AbstractCalculationExportableResult; mschaefer@9361: import org.dive4elements.river.artifacts.common.ExportContextCSV; mschaefer@9361: import org.dive4elements.river.artifacts.common.ExportContextPDF; mschaefer@9361: import org.dive4elements.river.artifacts.common.GeneralResultType; mschaefer@9361: import org.dive4elements.river.artifacts.common.IExportContext; mschaefer@9361: import org.dive4elements.river.artifacts.common.MetaAndTableJRDataSource; mschaefer@9361: import org.dive4elements.river.artifacts.common.ResultRow; mschaefer@9361: import org.dive4elements.river.artifacts.sinfo.util.RiverInfo; mschaefer@9361: import org.dive4elements.river.artifacts.uinfo.common.UInfoResultType; mschaefer@9361: mschaefer@9361: import gnu.trove.TDoubleArrayList; mschaefer@9361: mschaefer@9361: /** mschaefer@9361: * @author Domenico Nardi Tironi mschaefer@9361: */ mschaefer@9361: class SalixLineCalculationResult extends AbstractCalculationExportableResult { mschaefer@9361: mschaefer@9361: private static final long serialVersionUID = 1L; mschaefer@9361: private static final String JASPER_FILE = "/jasper/templates/uinfo.salixline.jrxml"; mschaefer@9361: mschaefer@9361: private final String[] scenarioLabels; mschaefer@9361: mschaefer@9361: private final String partialRangeString; mschaefer@9361: mschaefer@9361: private final String deltaWString; mschaefer@9361: mschaefer@9361: public SalixLineCalculationResult(final String label, final Collection rows) { mschaefer@9361: this(label, new String[] {}, "", "", rows); mschaefer@9361: } mschaefer@9361: mschaefer@9361: public SalixLineCalculationResult(final String label, final String[] scenarioLabels, final String partialRangeString, final String deltaWString, mschaefer@9361: final Collection rows) { mschaefer@9361: super(label, rows); mschaefer@9361: this.scenarioLabels = scenarioLabels; mschaefer@9361: this.partialRangeString = partialRangeString; mschaefer@9361: this.deltaWString = deltaWString; mschaefer@9361: } mschaefer@9361: mschaefer@9361: public final int getScenarioCount() { mschaefer@9361: return (this.scenarioLabels != null) ? this.scenarioLabels.length : 0; mschaefer@9361: } mschaefer@9361: mschaefer@9361: public String getScenarioLabel(final int i) { mschaefer@9361: if ((this.scenarioLabels != null) && (i < this.scenarioLabels.length)) mschaefer@9361: return this.scenarioLabels[i]; mschaefer@9361: mschaefer@9361: return ""; mschaefer@9361: } mschaefer@9361: mschaefer@9361: public String getPartialRangeString() { mschaefer@9361: return this.partialRangeString; mschaefer@9361: } mschaefer@9361: mschaefer@9361: public String getDeltaWString() { mschaefer@9361: return this.deltaWString; mschaefer@9361: } mschaefer@9361: mschaefer@9361: @Override mschaefer@9361: public void writeCSVHeader(final ExportContextCSV exportContextCSV, final RiverInfo river) { mschaefer@9361: mschaefer@9361: final Collection header = new ArrayList<>(); mschaefer@9361: mschaefer@9361: header.add(exportContextCSV.formatCsvHeader(GeneralResultType.station)); mschaefer@9361: header.add(exportContextCSV.formatCsvHeader(UInfoResultType.salixline)); mschaefer@9361: header.add(exportContextCSV.formatCsvHeader(UInfoResultType.salix_mw_mnw)); mschaefer@9361: mschaefer@9361: for (int i = 1; i <= getScenarioCount(); i++) { mschaefer@9361: header.add(exportContextCSV.msg(SalixScenario.getDeltaWHeader())); mschaefer@9361: header.add(exportContextCSV.msg(SalixScenario.getScenarioValueHeader())); mschaefer@9361: } mschaefer@9361: exportContextCSV.writeCSVLine(header.toArray(new String[header.size()])); mschaefer@9361: } mschaefer@9361: mschaefer@9361: @Override mschaefer@9361: protected String[] formatCSVRow(final ExportContextCSV exportContextCSV, final ResultRow row) { mschaefer@9361: return formatRow(exportContextCSV, row); mschaefer@9361: } mschaefer@9361: mschaefer@9361: @Override mschaefer@9361: protected String[] formatPDFRow(final ExportContextPDF exportContextPDF, final ResultRow row) { mschaefer@9361: return formatRow(exportContextPDF, row); mschaefer@9361: } mschaefer@9361: mschaefer@9361: @Override mschaefer@9361: protected String getJasperFile() { mschaefer@9361: return JASPER_FILE; mschaefer@9361: } mschaefer@9361: mschaefer@9361: @Override mschaefer@9361: protected void addJRTableHeader(final ExportContextPDF exportContextPDF, final MetaAndTableJRDataSource source) { mschaefer@9361: mschaefer@9361: /* additional column headings */ mschaefer@9361: exportContextPDF.addJRMetadata(source, "station_header", GeneralResultType.station); mschaefer@9361: exportContextPDF.addJRMetadata(source, "salix_line", UInfoResultType.salixline); mschaefer@9361: exportContextPDF.addJRMetadata(source, "salix_delta_mw", UInfoResultType.salix_mw_mnw); mschaefer@9361: mschaefer@9361: for (int i = 1; i <= this.getScenarioCount(); i++) { mschaefer@9361: // TODO Spaltenueberschriften der Scenarios mschaefer@9361: } mschaefer@9361: } mschaefer@9361: mschaefer@9361: private String[] formatRow(final IExportContext context, final ResultRow row) { mschaefer@9361: mschaefer@9361: final Collection lines = new ArrayList<>(); mschaefer@9361: lines.add(context.formatRowValue(row, GeneralResultType.station)); mschaefer@9361: lines.add(context.formatRowValue(row, UInfoResultType.salixline)); mschaefer@9361: lines.add(context.formatRowValue(row, UInfoResultType.salix_mw_mnw)); mschaefer@9361: mschaefer@9361: final NumberFormat formatter = ((ExportContextCSV) context).getSalixScenFormatter(); mschaefer@9361: final List scenarios = (List) row.getValue(UInfoResultType.customMultiRowColSalixScenarios); mschaefer@9361: for (int i = 1; i <= this.getScenarioCount(); i++) { mschaefer@9361: if (i > scenarios.size()) mschaefer@9361: break; mschaefer@9361: if (scenarios.get(i - 1) != null) { mschaefer@9361: lines.add(scenarios.get(i - 1).getDeltaWFormatted()); mschaefer@9361: lines.add(scenarios.get(i - 1).getSalixValueFormatted(formatter)); mschaefer@9361: } mschaefer@9361: else { mschaefer@9361: lines.add(""); mschaefer@9361: lines.add(""); mschaefer@9361: } mschaefer@9361: } mschaefer@9361: return lines.toArray(new String[lines.size()]); mschaefer@9361: } mschaefer@9361: mschaefer@9361: @Override mschaefer@9361: protected void writeCSVResultMetadata(final ExportContextCSV exportContextCSV) { mschaefer@9361: // do nothing. subclass may override mschaefer@9361: } mschaefer@9361: mschaefer@9361: /** mschaefer@9361: * Gets a longitudinal section of the salix value of a scenario mschaefer@9361: */ mschaefer@9361: public final double[][] getScenarioPoints(final int dataIndex) { mschaefer@9361: mschaefer@9361: final Collection rows = getRows(); mschaefer@9361: mschaefer@9361: final TDoubleArrayList xPoints = new TDoubleArrayList(rows.size()); mschaefer@9361: final TDoubleArrayList yPoints = new TDoubleArrayList(rows.size()); mschaefer@9361: mschaefer@9361: for (final ResultRow row : rows) { mschaefer@9361: mschaefer@9361: final double station = row.getDoubleValue(GeneralResultType.station); mschaefer@9361: mschaefer@9361: final List scenarios = (List) row.getValue(UInfoResultType.customMultiRowColSalixScenarios); mschaefer@9361: if (dataIndex <= scenarios.size() - 1) { mschaefer@9361: final SalixScenario salixScenario = scenarios.get(dataIndex); mschaefer@9361: if (salixScenario != null) { mschaefer@9361: final double value = salixScenario.getSalixValue(); mschaefer@9361: xPoints.add(station); mschaefer@9361: yPoints.add(value); mschaefer@9361: } mschaefer@9361: } mschaefer@9361: } mschaefer@9361: mschaefer@9361: return new double[][] { xPoints.toNativeArray(), yPoints.toNativeArray() }; mschaefer@9361: } mschaefer@9361: }