gernotbelger@8915: /* Copyright (C) 2017 by Bundesanstalt für Gewässerkunde gernotbelger@8915: * Software engineering by gernotbelger@8915: * Björnsen Beratende Ingenieure GmbH gernotbelger@8915: * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt gernotbelger@8915: * gernotbelger@8915: * This file is Free Software under the GNU AGPL (>=v3) gernotbelger@8915: * and comes with ABSOLUTELY NO WARRANTY! Check out the gernotbelger@8915: * documentation coming with Dive4Elements River for details. gernotbelger@8915: */ gernotbelger@8915: package org.dive4elements.river.artifacts.sinfo.tkhstate; gernotbelger@8915: gernotbelger@9150: import java.util.ArrayList; gernotbelger@8915: import java.util.Collection; gernotbelger@8915: gernotbelger@9150: import org.dive4elements.river.artifacts.common.ExportContextCSV; gernotbelger@9195: import org.dive4elements.river.artifacts.common.ExportContextPDF; gernotbelger@9150: import org.dive4elements.river.artifacts.common.GeneralResultType; gernotbelger@9195: import org.dive4elements.river.artifacts.common.IExportContext; gernotbelger@9150: import org.dive4elements.river.artifacts.common.MetaAndTableJRDataSource; gernotbelger@8996: 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@8915: import org.dive4elements.river.artifacts.sinfo.util.WstInfo; gernotbelger@8915: gernotbelger@8915: /** gernotbelger@9067: * Contains the results of a {@link FloodDurationCalculation}. gernotbelger@8915: * gernotbelger@8915: * @author Gernot Belger gernotbelger@8915: */ gernotbelger@9195: final class TkhCalculationResult extends AbstractTkhCalculationResult { gernotbelger@8915: gernotbelger@8915: private static final long serialVersionUID = 1L; gernotbelger@9150: private static final String JASPER_FILE = "/jasper/templates/sinfo.tkh.jrxml"; gernotbelger@9150: gernotbelger@9150: private enum ExportMode { gernotbelger@9150: pdf, csv gernotbelger@9150: } gernotbelger@8915: gernotbelger@8996: public TkhCalculationResult(final String label, final WstInfo wst, final boolean hasTkh, final Collection rows) { gernotbelger@9170: super(label, wst, hasTkh, rows); gernotbelger@9170: gernotbelger@8915: } gernotbelger@9150: gernotbelger@9150: @Override gernotbelger@9195: public void writeCSVHeader(final ExportContextCSV exportContext, final RiverInfo river) { gernotbelger@9150: gernotbelger@9150: final Collection header = new ArrayList<>(11); gernotbelger@9150: gernotbelger@9195: header.add(exportContext.formatCsvHeader(GeneralResultType.station)); gernotbelger@9195: header.add(exportContext.msgUnitCSV(SInfoResultType.tkh)); gernotbelger@9195: header.add(exportContext.formatCsvHeader(SInfoResultType.soilkind)); gernotbelger@9195: header.add(exportContext.msgUnitCSV(SInfoResultType.meanBedHeight, river.getWstUnit())); gernotbelger@9195: header.add(exportContext.msgUnitCSV(SInfoResultType.waterlevel, river.getWstUnit())); gernotbelger@9195: header.add(exportContext.msgUnitCSV(SInfoResultType.discharge)); gernotbelger@9150: gernotbelger@9195: final TkhCalculationResults results = exportContext.getResults(); gernotbelger@9150: final String descriptionHeader = results.getDescriptionHeader(); gernotbelger@9150: if (descriptionHeader != null) gernotbelger@9150: header.add(descriptionHeader); gernotbelger@9150: gernotbelger@9195: header.add(exportContext.formatCsvHeader(SInfoResultType.gaugeLabel)); gernotbelger@9195: header.add(exportContext.formatCsvHeader(SInfoResultType.location)); gernotbelger@9150: gernotbelger@9195: exportContext.writeCSVLine(header.toArray(new String[header.size()])); gernotbelger@9150: gernotbelger@9150: } gernotbelger@9150: gernotbelger@9150: @Override gernotbelger@9195: protected void writeCSVResultMetadata(final ExportContextCSV exportContextCSV) { gernotbelger@9170: exportContextCSV.writeCSVWaterlevelMetadata(super.getWst());// TODO: move to super gernotbelger@9150: exportContextCSV.writeBlankLine(); gernotbelger@9150: } gernotbelger@9150: gernotbelger@9150: @Override gernotbelger@9195: protected String[] formatCSVRow(final ExportContextCSV exportContextCSV, final ResultRow row) { gernotbelger@9150: gernotbelger@9195: return this.formatRow(exportContextCSV, row, ExportMode.csv); gernotbelger@9150: } gernotbelger@9150: gernotbelger@9150: @Override gernotbelger@9195: protected String[] formatPDFRow(final ExportContextPDF exportContext, final ResultRow row) { gernotbelger@9150: gernotbelger@9195: return this.formatRow(exportContext, row, ExportMode.pdf); gernotbelger@9150: } gernotbelger@9150: gernotbelger@9150: @Override gernotbelger@9150: protected String getJasperFile() { gernotbelger@9150: return JASPER_FILE; gernotbelger@9150: } gernotbelger@9150: gernotbelger@9150: @Override gernotbelger@9195: protected void addJRTableHeader(final ExportContextPDF exportContext, final MetaAndTableJRDataSource source) { gernotbelger@9150: /* column headings */ gernotbelger@9195: exportContext.addJRMetadata(source, "station_header", GeneralResultType.station); gernotbelger@9195: exportContext.addJRMetadata(source, "tkh_header", SInfoResultType.tkh); gernotbelger@9195: exportContext.addJRMetadata(source, "tkhkind_header", SInfoResultType.soilkind); gernotbelger@9195: exportContext.addJRMetadata(source, "bedheight_header", SInfoResultType.meanBedHeight); gernotbelger@9195: exportContext.addJRMetadata(source, "waterlevel_header", SInfoResultType.waterlevel); gernotbelger@9195: exportContext.addJRMetadata(source, "discharge_header", SInfoResultType.discharge); gernotbelger@9150: gernotbelger@9150: // REMARK: actually the column makes no sense if description header is null. But (software symmetry...) WINFO also gernotbelger@9150: // writes an empty column into the pdf in that case (most probably to avoid the need for two jasper templates). gernotbelger@9195: gernotbelger@9195: final TkhCalculationResults results = exportContext.getResults(); gernotbelger@9150: final String descriptionHeader = results.getDescriptionHeader(); gernotbelger@9150: gernotbelger@9195: final String waterlevelNameHeader = descriptionHeader == null ? exportContext.msgPdf(SInfoResultType.waterlevelLabel) : descriptionHeader; gernotbelger@9195: exportContext.addJRMetadata(source, "waterlevel_name_header", waterlevelNameHeader); gernotbelger@9195: gernotbelger@9195: exportContext.addJRMetadata(source, "gauge_header", SInfoResultType.gaugeLabel); gernotbelger@9195: exportContext.addJRMetadata(source, "location_header", SInfoResultType.location); gernotbelger@9150: gernotbelger@9150: } gernotbelger@9150: gernotbelger@9195: private String[] formatRow(final IExportContext exportContext, final ResultRow row, final ExportMode mode) { gernotbelger@9150: gernotbelger@9150: final Collection lines = new ArrayList<>(11); gernotbelger@9150: gernotbelger@9150: lines.add(exportContext.formatRowValue(row, GeneralResultType.station)); gernotbelger@9150: lines.add(exportContext.formatRowValue(row, SInfoResultType.tkh)); gernotbelger@9150: lines.add(exportContext.formatRowValue(row, SInfoResultType.soilkind)); gernotbelger@9150: lines.add(exportContext.formatRowValue(row, SInfoResultType.meanBedHeight)); gernotbelger@9150: lines.add(exportContext.formatRowValue(row, SInfoResultType.waterlevel)); gernotbelger@9150: lines.add(exportContext.formatRowValue(row, SInfoResultType.discharge)); gernotbelger@9150: gernotbelger@9150: // REMARK: always export this column in pdf-mode, because WInfo also does it (no need for two jasper-templates). gernotbelger@9195: final TkhCalculationResults results = exportContext.getResults(); gernotbelger@9195: final String descriptionHeader = results.getDescriptionHeader(); gernotbelger@9195: if (descriptionHeader != null || mode == ExportMode.pdf) gernotbelger@9150: lines.add(exportContext.formatRowValue(row, SInfoResultType.waterlevelLabel)); gernotbelger@9150: gernotbelger@9150: lines.add(exportContext.formatRowValue(row, SInfoResultType.gaugeLabel)); gernotbelger@9150: lines.add(exportContext.formatRowValue(row, SInfoResultType.location)); gernotbelger@9150: gernotbelger@9150: return lines.toArray(new String[lines.size()]); gernotbelger@9150: } gernotbelger@8915: }