# HG changeset patch # User mschaefer # Date 1529410772 -7200 # Node ID f9bb5d0a6ff3cb890aab35e6a940ed57f4ee436c # Parent 568961ff709aa4603e60956565d1ffee9b1cbb33 Added the S-Info collision calculation and chart output diff -r 568961ff709a -r f9bb5d0a6ff3 artifacts/src/main/java/org/dive4elements/river/artifacts/common/AbstractResultType.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/common/AbstractResultType.java Tue Jun 19 14:16:45 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/common/AbstractResultType.java Tue Jun 19 14:19:32 2018 +0200 @@ -9,7 +9,9 @@ */ package org.dive4elements.river.artifacts.common; +import java.text.DateFormat; import java.text.NumberFormat; +import java.util.Date; import java.util.HashMap; import java.util.Locale; import java.util.Map; @@ -84,6 +86,12 @@ return this.formatters.get(locale); } + protected final String exportDateValue(final CallContext context, final Date value) { + final Locale locale = Resources.getLocale(context.getMeta()); + final DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT, locale); + return df.format(value); + } + protected abstract NumberFormat createFormatter(CallContext context); @Override @@ -95,10 +103,12 @@ return Resources.getMsg(meta, this.csvHeader, this.csvHeader); } + @Override public final String getPdfHeader(final CallMeta meta) { return Resources.getMsg(meta, this.pdfHeader, this.pdfHeader); } + @Override public final String getUnit() { return this.unit; } diff -r 568961ff709a -r f9bb5d0a6ff3 artifacts/src/main/java/org/dive4elements/river/artifacts/common/GeneralResultType.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/common/GeneralResultType.java Tue Jun 19 14:16:45 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/common/GeneralResultType.java Tue Jun 19 14:19:32 2018 +0200 @@ -10,6 +10,7 @@ package org.dive4elements.river.artifacts.common; import java.text.NumberFormat; +import java.util.Date; import org.dive4elements.artifacts.CallContext; import org.dive4elements.river.utils.Formatter; @@ -35,6 +36,18 @@ } }; + public static final GeneralResultType date = new GeneralResultType(I18NStrings.UNIT_NONE, I18NStrings.CSV_META_DATE) { + @Override + public String exportValue(final CallContext context, final Object value) { + return exportDateValue(context, (Date) value); + } + + @Override + protected NumberFormat createFormatter(final CallContext context) { + throw new UnsupportedOperationException(); + } + }; + private GeneralResultType(final String unit, final String csvHeader) { super(unit, csvHeader, csvHeader); diff -r 568961ff709a -r f9bb5d0a6ff3 artifacts/src/main/java/org/dive4elements/river/artifacts/common/I18NStrings.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/common/I18NStrings.java Tue Jun 19 14:16:45 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/common/I18NStrings.java Tue Jun 19 14:19:32 2018 +0200 @@ -47,6 +47,8 @@ String CSV_META_HEIGHT_UNIT_RIVER = "sinfo.export.flow_depth.csv.meta.height_unit.river"; // move to child? + String CSV_META_DATE = "sinfo.export.csv.meta.date"; + /// sonstiges: // Einheiten: diff -r 568961ff709a -r f9bb5d0a6ff3 artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/CollisionArtifact.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/CollisionArtifact.java Tue Jun 19 14:16:45 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/CollisionArtifact.java Tue Jun 19 14:19:32 2018 +0200 @@ -36,6 +36,8 @@ */ public class CollisionArtifact extends AbstractStaticStateArtifact implements FacetTypes { + private static final long serialVersionUID = 1L; + /** The log for this class. */ private static Logger log = Logger.getLogger(CollisionArtifact.class); diff -r 568961ff709a -r f9bb5d0a6ff3 artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/CollisionCalcDetailResult.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/CollisionCalcDetailResult.java Tue Jun 19 14:16:45 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/CollisionCalcDetailResult.java Tue Jun 19 14:19:32 2018 +0200 @@ -17,6 +17,7 @@ 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.SInfoResultType; import org.dive4elements.river.artifacts.sinfo.util.RiverInfo; /** @@ -45,18 +46,14 @@ @Override public void writeCSVHeader(final ExportContextCSV exportContextCSV, final CollisionCalculationResults results, final RiverInfo river) { - // FIXME wrong columns: - final Collection header = new ArrayList<>(99); + final Collection header = new ArrayList<>(6); header.add(exportContextCSV.formatCsvHeader(GeneralResultType.station)); - // - // header.add(exportContext.formatCsvHeader(SInfoResultType.riverside)); - // header.add(exportContext.formatCsvHeader(SInfoResultType.inundationduration)); - // header.add(exportContext.formatCsvHeader(SInfoResultType.inundationdurationq)); - // header.add(exportContext.formatCsvHeader(SInfoResultType.infrastructureHeight)); - // header.add(exportContext.formatCsvHeader(SInfoResultType.infrastructuretype)); - // header.add(exportContext.formatCsvHeader(SInfoResultType.gaugeLabel)); - // header.add(exportContext.formatCsvHeader(SInfoResultType.location)); + header.add(exportContextCSV.formatCsvHeader(GeneralResultType.date)); + header.add(exportContextCSV.formatCsvHeader(SInfoResultType.collisionGaugeW)); + header.add(exportContextCSV.formatCsvHeader(SInfoResultType.gaugeLabel)); + header.add(exportContextCSV.formatCsvHeader(SInfoResultType.discharge)); + header.add(exportContextCSV.formatCsvHeader(SInfoResultType.dischargeZone)); exportContextCSV.writeCSVLine(header.toArray(new String[header.size()])); } @@ -68,22 +65,24 @@ @Override protected String[] formatPDFRow(final ExportContextCSV exportContextCSV, final CollisionCalculationResults results, final ResultRow row) { + /* + * final Collection lines = new ArrayList<>(6); + * lines.add(exportContextCSV.formatRowValue(row, GeneralResultType.station)); + * return lines.toArray(new String[lines.size()]); + */ return formatRow(exportContextCSV, results, row); } private String[] formatRow(final ExportContextCSV exportContextCSV, final CollisionCalculationResults results, final ResultRow row) { - final Collection lines = new ArrayList<>(11); + final Collection lines = new ArrayList<>(6); - // FIXME wrong columns: lines.add(exportContextCSV.formatRowValue(row, GeneralResultType.station)); - // lines.add(exportContext.formatRowValue(row, SInfoResultType.tkh)); - // lines.add(exportContext.formatRowValue(row, SInfoResultType.soilkind)); - // lines.add(exportContext.formatRowValue(row, SInfoResultType.meanBedHeight)); - // lines.add(exportContext.formatRowValue(row, SInfoResultType.waterlevel)); - // lines.add(exportContext.formatRowValue(row, SInfoResultType.discharge)); - // lines.add(exportContext.formatRowValue(row, SInfoResultType.gaugeLabel)); - // lines.add(exportContext.formatRowValue(row, SInfoResultType.location)); + lines.add(exportContextCSV.formatRowValue(row, GeneralResultType.date)); + lines.add(exportContextCSV.formatRowValue(row, SInfoResultType.collisionGaugeW)); + lines.add(exportContextCSV.formatRowValue(row, SInfoResultType.gaugeLabel)); + lines.add(exportContextCSV.formatRowValue(row, SInfoResultType.discharge)); + lines.add(exportContextCSV.formatRowValue(row, SInfoResultType.dischargeZone)); return lines.toArray(new String[lines.size()]); } @@ -97,13 +96,11 @@ protected void addJRTableHeader(final ExportContextCSV exportContextCSV, final MetaAndTableJRDataSource source, final CollisionCalculationResults results) { /* column headings */ - // FIXME wrong columns: exportContextCSV.addJRMetadata(source, "station_header", GeneralResultType.station); - // exportContext.addJRMetadata(source, "station_header", GeneralResultType.station); - // exportContext.addJRMetadata(source, "tkh_header", SInfoResultType.tkh); - // exportContext.addJRMetadata(source, "tkhkind_header", SInfoResultType.soilkind); - // exportContext.addJRMetadata(source, "bedheight_header", SInfoResultType.meanBedHeight); - // exportContext.addJRMetadata(source, "waterlevel_header", SInfoResultType.waterlevel); - // exportContext.addJRMetadata(source, "discharge_header", SInfoResultType.discharge); + exportContextCSV.addJRMetadata(source, "date_header", GeneralResultType.date); + exportContextCSV.addJRMetadata(source, "gaugew_header", SInfoResultType.collisionGaugeW); + exportContextCSV.addJRMetadata(source, "gaugelabel_header", SInfoResultType.gaugeLabel); + exportContextCSV.addJRMetadata(source, "discharge_header", SInfoResultType.discharge); + exportContextCSV.addJRMetadata(source, "dischargezone_header", SInfoResultType.dischargeZone); } } \ No newline at end of file diff -r 568961ff709a -r f9bb5d0a6ff3 artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/CollisionCalcFacet.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/CollisionCalcFacet.java Tue Jun 19 14:19:32 2018 +0200 @@ -0,0 +1,65 @@ +/** 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.collision; + +import org.dive4elements.artifactdatabase.state.Facet; +import org.dive4elements.artifacts.Artifact; +import org.dive4elements.artifacts.CallContext; +import org.dive4elements.river.artifacts.D4EArtifact; +import org.dive4elements.river.artifacts.model.CalculationResult; +import org.dive4elements.river.artifacts.model.DataFacet; +import org.dive4elements.river.artifacts.states.DefaultState.ComputeType; + +/** + * Facet for calculated river bed collision counts + * + * @author Matthias Schäfer + */ +public class CollisionCalcFacet extends DataFacet { + + private static final long serialVersionUID = 1; + + public CollisionCalcFacet() { + // required for clone operation deepCopy() + } + + public CollisionCalcFacet(final int idx, final String name, final String description, final String yAxisLabelKey, final ComputeType type, + final String stateId, final String hash) { + super(idx, name, description, type, hash, stateId); + this.metaData.put("X", "sinfo.chart.km.xaxis.label"); + this.metaData.put("Y", yAxisLabelKey); + } + + @Override + public Object getData(final Artifact artifact, final CallContext context) { + + final D4EArtifact flys = (D4EArtifact) artifact; + + final CalculationResult res = (CalculationResult) flys.compute(context, this.hash, this.stateId, this.type, false); + + final CollisionCalculationResults data = (CollisionCalculationResults) res.getData(); + + return data.getResults().get(this.index); + } + + /** Copy deeply. */ + @Override + public Facet deepCopy() { + // FIXME: why not simply use the full constructor instead? + final CollisionCalcFacet copy = new CollisionCalcFacet(); + // FIXME: why does DataFacet does not override set? Bad access to variables of parent! + copy.set(this); + copy.type = this.type; + copy.hash = this.hash; + copy.stateId = this.stateId; + return copy; + } +} \ No newline at end of file diff -r 568961ff709a -r f9bb5d0a6ff3 artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/CollisionCalcOverviewResult.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/CollisionCalcOverviewResult.java Tue Jun 19 14:16:45 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/CollisionCalcOverviewResult.java Tue Jun 19 14:19:32 2018 +0200 @@ -17,14 +17,15 @@ 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.SInfoResultType; import org.dive4elements.river.artifacts.sinfo.util.RiverInfo; /** - * Contains the results of a {@link FloodDurationCalculation}. + * Contains the results of a {@link CollisionCalculation}. * * @author Gernot Belger */ -final class CollisionCalcOverviewResult extends AbstractCalculationExportableResult { +final public class CollisionCalcOverviewResult extends AbstractCalculationExportableResult { private static final long serialVersionUID = 1L; @@ -44,18 +45,11 @@ @Override public void writeCSVHeader(final ExportContextCSV exportContextCSV, final CollisionCalculationResults results, final RiverInfo river) { - // FIXME wrong columns: - final Collection header = new ArrayList<>(99); + final Collection header = new ArrayList<>(3); header.add(exportContextCSV.formatCsvHeader(GeneralResultType.station)); - // - // header.add(exportContext.formatCsvHeader(SInfoResultType.riverside)); - // header.add(exportContext.formatCsvHeader(SInfoResultType.inundationduration)); - // header.add(exportContext.formatCsvHeader(SInfoResultType.inundationdurationq)); - // header.add(exportContext.formatCsvHeader(SInfoResultType.infrastructureHeight)); - // header.add(exportContext.formatCsvHeader(SInfoResultType.infrastructuretype)); - // header.add(exportContext.formatCsvHeader(SInfoResultType.gaugeLabel)); - // header.add(exportContext.formatCsvHeader(SInfoResultType.location)); + header.add(exportContextCSV.formatCsvHeader(SInfoResultType.years)); + header.add(exportContextCSV.formatCsvHeader(SInfoResultType.collisionCount)); exportContextCSV.writeCSVLine(header.toArray(new String[header.size()])); } @@ -67,22 +61,21 @@ @Override protected String[] formatPDFRow(final ExportContextCSV exportContextCSV, final CollisionCalculationResults results, final ResultRow row) { - return formatRow(exportContextCSV, results, row); + final Collection lines = new ArrayList<>(3); + + lines.add(exportContextCSV.formatRowValue(row, GeneralResultType.station)); + + return lines.toArray(new String[lines.size()]); + // return formatRow(exportContextCSV, results, row); } private String[] formatRow(final ExportContextCSV exportContextCSV, final CollisionCalculationResults results, final ResultRow row) { - final Collection lines = new ArrayList<>(11); + final Collection lines = new ArrayList<>(3); - // FIXME wrong columns: lines.add(exportContextCSV.formatRowValue(row, GeneralResultType.station)); - // lines.add(exportContext.formatRowValue(row, SInfoResultType.tkh)); - // lines.add(exportContext.formatRowValue(row, SInfoResultType.soilkind)); - // lines.add(exportContext.formatRowValue(row, SInfoResultType.meanBedHeight)); - // lines.add(exportContext.formatRowValue(row, SInfoResultType.waterlevel)); - // lines.add(exportContext.formatRowValue(row, SInfoResultType.discharge)); - // lines.add(exportContext.formatRowValue(row, SInfoResultType.gaugeLabel)); - // lines.add(exportContext.formatRowValue(row, SInfoResultType.location)); + lines.add(exportContextCSV.formatRowValue(row, SInfoResultType.years)); + lines.add(exportContextCSV.formatRowValue(row, SInfoResultType.collisionCount)); return lines.toArray(new String[lines.size()]); } @@ -96,13 +89,8 @@ protected void addJRTableHeader(final ExportContextCSV exportContextCSV, final MetaAndTableJRDataSource source, final CollisionCalculationResults results) { /* column headings */ - // FIXME wrong columns: exportContextCSV.addJRMetadata(source, "station_header", GeneralResultType.station); - // exportContext.addJRMetadata(source, "station_header", GeneralResultType.station); - // exportContext.addJRMetadata(source, "tkh_header", SInfoResultType.tkh); - // exportContext.addJRMetadata(source, "tkhkind_header", SInfoResultType.soilkind); - // exportContext.addJRMetadata(source, "bedheight_header", SInfoResultType.meanBedHeight); - // exportContext.addJRMetadata(source, "waterlevel_header", SInfoResultType.waterlevel); - // exportContext.addJRMetadata(source, "discharge_header", SInfoResultType.discharge); + // exportContextCSV.addJRMetadata(source, "years_header", SInfoResultType.years); + // exportContextCSV.addJRMetadata(source, "collisioncount_header", SInfoResultType.collisionCount); } } \ No newline at end of file diff -r 568961ff709a -r f9bb5d0a6ff3 artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/CollisionCalculation.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/CollisionCalculation.java Tue Jun 19 14:16:45 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/CollisionCalculation.java Tue Jun 19 14:19:32 2018 +0200 @@ -11,6 +11,8 @@ import java.util.ArrayList; import java.util.Collection; +import java.util.HashMap; +import java.util.Map; import org.apache.commons.lang.math.DoubleRange; import org.dive4elements.artifacts.CallContext; @@ -18,12 +20,18 @@ import org.dive4elements.river.artifacts.common.ResultRow; import org.dive4elements.river.artifacts.model.Calculation; import org.dive4elements.river.artifacts.model.CalculationResult; +import org.dive4elements.river.artifacts.model.DateRange; import org.dive4elements.river.artifacts.resources.Resources; import org.dive4elements.river.artifacts.sinfo.SINFOArtifact; import org.dive4elements.river.artifacts.sinfo.common.RiverInfoProvider; +import org.dive4elements.river.artifacts.sinfo.common.SInfoResultType; import org.dive4elements.river.artifacts.sinfo.util.CalculationUtils; import org.dive4elements.river.artifacts.sinfo.util.RiverInfo; +import org.dive4elements.river.backend.utils.DateUtil; +import org.dive4elements.river.model.Gauge; import org.dive4elements.river.model.River; +import org.dive4elements.river.model.sinfo.CollisionAggregateValue; +import org.dive4elements.river.model.sinfo.CollisionValue; class CollisionCalculation { @@ -39,46 +47,89 @@ final String user = CalculationUtils.findArtifactUser(this.context, sinfo); - /* access input data */ + // access input data final CollisionAccess access = new CollisionAccess(sinfo); final River river = access.getRiver(); final RiverInfo riverInfo = new RiverInfo(river); final DoubleRange calcRange = access.getRange(); - /* calculate results for each diff pair */ + // calculate results for each year or epoch final Calculation problems = new Calculation(); - final RiverInfoProvider infoProvider = RiverInfoProvider.forRange(this.context, river, calcRange); - final String calcModeLabel = Resources.getMsg(this.context.getMeta(), sinfo.getCalculationMode().name()); - final int[] years = access.getYears(); - final int[][] epochs = access.getEpochs(); + final CollisionCalculationResults results = new CollisionCalculationResults(calcModeLabel, user, riverInfo, calcRange, access.getYearsHeader()); final Collection overViewRows = new ArrayList<>(); + + if (access.getYears() != null) { + for (final int year : access.getYears()) + calculateOverview(overViewRows, river, access.getLowerKm(), access.getUpperKm(), year, year, false); + } + else { + for (final DateRange dr : access.getEpochs()) + calculateOverview(overViewRows, river, access.getLowerKm(), access.getUpperKm(), dr.getFromYear(), dr.getToYear(), true); + } + final CollisionCalcOverviewResult overviewResult = new CollisionCalcOverviewResult(access.getYearsHeader(), overViewRows); + results.addResult(overviewResult, problems); + + // create q-for-w-finders for all gauges of the calculation km range + final RiverInfoProvider infoProvider = RiverInfoProvider.forRange(this.context, river, calcRange); + final Map qFinders = new HashMap<>(); + final Map zoneFinders = new HashMap<>(); + for (final Gauge gauge : river.determineGauges(calcRange.getMinimumDouble(), calcRange.getMaximumDouble())) { + qFinders.put(gauge, GaugeDischargeValuesFinder.loadValues(gauge, problems)); + zoneFinders.put(gauge, GaugeDischargeZoneFinder.loadValues(gauge, problems)); + } final Collection detailsRows = new ArrayList<>(); - // TODO: calculate - - final CollisionCalculationResults results = new CollisionCalculationResults(calcModeLabel, user, riverInfo, calcRange); - - final ResultRow row = ResultRow.create().putValue(GeneralResultType.station, 8888.888); - final ResultRow row2 = ResultRow.create().putValue(GeneralResultType.station, 777.888); - - for (int i = 0; i < 300; i++) { - overViewRows.add(row); - overViewRows.add(row2); + // calculate secondary results for each year or epoch + if (access.getYears() != null) { + for (final int year : access.getYears()) + calculateDetails(detailsRows, infoProvider, access.getLowerKm(), access.getUpperKm(), year, year, qFinders, zoneFinders); } - final CollisionCalcOverviewResult overviewResult = new CollisionCalcOverviewResult("Overview", overViewRows); // TODO: get Title-Strings from messages - results.addResult(overviewResult, problems); - for (int i = 0; i < 200; i++) { - detailsRows.add(row); - detailsRows.add(row2); + else { + for (final DateRange dr : access.getEpochs()) + calculateDetails(detailsRows, infoProvider, access.getLowerKm(), access.getUpperKm(), dr.getFromYear(), dr.getToYear(), qFinders, zoneFinders); } final CollisionCalcDetailResult detailResult = new CollisionCalcDetailResult("Details", detailsRows); results.addResult(detailResult, problems); return new CalculationResult(results, problems); } + + /** + * Calculates the collision counts for a km range of a river and a year or year range (epoch), + * and adds them to a ResultRow collection + */ + private void calculateOverview(final Collection rows, final River river, final double fromKm, final double toKm, final int fromYear, + final int toYear, final boolean isEpoch) { + for (final CollisionAggregateValue aggregate : CollisionAggregateValue.getValuesByKm(river, fromKm, toKm, fromYear, toYear)) { + rows.add(ResultRow.create().putValue(GeneralResultType.station, aggregate.getStation()) + .putValue(SInfoResultType.years, (isEpoch? String.format("%d-%d", fromYear, toYear) : Integer.toString(fromYear))) + .putValue(SInfoResultType.collisionCount, aggregate.getCount())); + } + } + + /** + * Calculates the collision details for a km range of a river and a year or year range (epoch), + * and adds them to a ResultRow collection + */ + private void calculateDetails(final Collection rows, final RiverInfoProvider riverInfo, final double fromKm, final double toKm, + final int fromYear, final int toYear, final Map qFinders, + final Map zoneFinders) { + for (final CollisionValue collision : CollisionValue.getValues(riverInfo.getRiver(), fromKm, toKm, DateUtil.getStartDateFromYear(fromYear), + DateUtil.getEndDateFromYear(toYear))) { + final Gauge gauge = riverInfo.getGauge(collision.getStation(), true); + final double q = qFinders.get(gauge).getDischarge(collision.getGaugeW()); + final double qOut = Double.isInfinite(q) ? Double.NaN : q; + rows.add(ResultRow.create().putValue(GeneralResultType.station, collision.getStation()) + .putValue(GeneralResultType.date, collision.getEventDate()) + .putValue(SInfoResultType.collisionGaugeW, collision.getGaugeW()) + .putValue(SInfoResultType.gaugeLabel, collision.getGaugeName()) + .putValue(SInfoResultType.discharge, qOut) + .putValue(SInfoResultType.dischargeZone, zoneFinders.get(gauge).getDischargeZone(q))); + } + } } \ No newline at end of file diff -r 568961ff709a -r f9bb5d0a6ff3 artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/CollisionCalculationResults.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/CollisionCalculationResults.java Tue Jun 19 14:16:45 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/CollisionCalculationResults.java Tue Jun 19 14:19:32 2018 +0200 @@ -21,8 +21,15 @@ private static final long serialVersionUID = 1L; - public CollisionCalculationResults(final String calcModeLabel, final String user, final RiverInfo river, final DoubleRange calcRange) { + private final String yearsHeader; + + public CollisionCalculationResults(final String calcModeLabel, final String user, final RiverInfo river, final DoubleRange calcRange, + final String yearsHeader) { super(calcModeLabel, user, river, calcRange); + this.yearsHeader = yearsHeader; + } + public String getYearsHeader() { + return this.yearsHeader; } } \ No newline at end of file diff -r 568961ff709a -r f9bb5d0a6ff3 artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/CollisionExporter.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/CollisionExporter.java Tue Jun 19 14:16:45 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/CollisionExporter.java Tue Jun 19 14:19:32 2018 +0200 @@ -16,6 +16,7 @@ import org.dive4elements.river.artifacts.common.ExportContextCSV; import org.dive4elements.river.artifacts.common.JasperReporter; import org.dive4elements.river.artifacts.common.MetaAndTableJRDataSource; +import org.dive4elements.river.artifacts.sinfo.common.SInfoI18NStrings; import org.dive4elements.river.artifacts.sinfo.util.RiverInfo; import au.com.bytecode.opencsv.CSVWriter; @@ -38,6 +39,7 @@ /* write as csv */ exportContextCSV.writeCSVGlobalMetadataDefaults(results); // ggf auslagern innerhalb dieser Klasse + exportContextCSV.writeCSVMetaEntry(SInfoI18NStrings.CSV_META_HEADER_YEARS, results.getYearsHeader()); // writer.writeNext(new String[] { "" }); // break line HERE to avoid redundance final RiverInfo river = results.getRiver(); diff -r 568961ff709a -r f9bb5d0a6ff3 artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/CollisionState.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/CollisionState.java Tue Jun 19 14:16:45 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/CollisionState.java Tue Jun 19 14:19:32 2018 +0200 @@ -15,18 +15,23 @@ import org.dive4elements.river.artifacts.ChartArtifact; import org.dive4elements.river.artifacts.D4EArtifact; import org.dive4elements.river.artifacts.common.AbstractCalculationExportableResult; +import org.dive4elements.river.artifacts.model.Calculation; import org.dive4elements.river.artifacts.model.CalculationResult; import org.dive4elements.river.artifacts.model.DataFacet; import org.dive4elements.river.artifacts.model.EmptyFacet; import org.dive4elements.river.artifacts.model.FacetTypes; +import org.dive4elements.river.artifacts.model.ReportFacet; import org.dive4elements.river.artifacts.sinfo.SINFOArtifact; +import org.dive4elements.river.artifacts.sinfo.common.CollisionCalcProcessor; import org.dive4elements.river.artifacts.states.DefaultState; -/** State in which a waterlevel has been calculated. */ +/** + * State in which a collision count has been calculated. + */ public class CollisionState extends DefaultState { /// ** The log that is used in this state. */ - // private static Logger log = Logger.getLogger(FlowDepthState.class); + // private static Logger log = Logger.getLogger(CollisionState.class); private static final long serialVersionUID = 1L; @@ -44,7 +49,6 @@ facets.add(new EmptyFacet()); return null; } - return compute((SINFOArtifact) artifact, context, hash, facets, old); } @@ -71,40 +75,29 @@ return res; // final CollisionCalculationResults results = (CollisionCalculationResults) res.getData(); - // - // /* add themes for chart, for each result */ - // final List resultList = results.getResults(); - // for (int index = 0; index < resultList.size(); index++) { - // - final AbstractCalculationExportableResult result = results.getResults().get(0); - // - // /* filtered (zoom dependent mean) flow depth */ - // facets.add(FlowDepthProcessor.createFlowDepthFilteredFacet(context, hash, this.id, result, index)); - // facets.add(FlowDepthProcessor.createFlowDepthRawFacet(context, hash, this.id, result, index)); - // - // if (results.isUseTkh()) { - // /* filtered (zoom dependent mean) flow depth including tkh */ - // facets.add(FlowDepthProcessor.createFlowDepthTkhFilteredFacet(context, hash, this.id, result, index)); - // facets.add(FlowDepthProcessor.createFlowDepthTkhRawFacet(context, hash, this.id, result, index)); - // - // facets.add(TkhProcessor.createTkhFacet(context, hash, this.id, result, index)); - // } - // } + /* add themes for chart, for each result */ + final List> resultList = results.getResults(); + for (int index = 0; index < resultList.size(); index++) { + if (resultList.get(index) instanceof CollisionCalcOverviewResult) { + final CollisionCalcOverviewResult result = (CollisionCalcOverviewResult) resultList.get(index); + facets.add(CollisionCalcProcessor.createFacet(context, hash, this.id, result, index)); + } + } - if (!result.isEmpty()) { + if (!resultList.isEmpty()) { final Facet csv = new DataFacet(FacetTypes.CSV, "CSV data", ComputeType.ADVANCE, hash, this.id); final Facet pdf = new DataFacet(FacetTypes.PDF, "PDF data", ComputeType.ADVANCE, hash, this.id); facets.add(csv); facets.add(pdf); } - // - // final Calculation report = res.getReport(); - // - // if (report.hasProblems()) { - // facets.add(new ReportFacet(ComputeType.ADVANCE, hash, this.id)); - // } + + final Calculation report = res.getReport(); + + if (report.hasProblems()) { + facets.add(new ReportFacet(ComputeType.ADVANCE, hash, this.id)); + } return res; } diff -r 568961ff709a -r f9bb5d0a6ff3 artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/GaugeDischargeValuesFinder.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/GaugeDischargeValuesFinder.java Tue Jun 19 14:19:32 2018 +0200 @@ -0,0 +1,107 @@ +/** 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.collision; + +import org.apache.commons.lang.math.DoubleRange; +import org.apache.commons.math.FunctionEvaluationException; +import org.apache.commons.math.analysis.UnivariateRealFunction; +import org.apache.commons.math.analysis.interpolation.LinearInterpolator; +import org.dive4elements.river.artifacts.model.Calculation; +import org.dive4elements.river.model.DischargeTable; +import org.dive4elements.river.model.DischargeTableValue; +import org.dive4elements.river.model.Gauge; + +import gnu.trove.TDoubleArrayList; + +/** + * Loading and search/interpolation of a gauge's discharge table + * + * @author Matthias Schäfer + * + */ +public final class GaugeDischargeValuesFinder { + + /***** FIELDS *****/ + + // private static Logger log = Logger.getLogger(GaugeDischargeValuesFinder.class); + + private final Gauge gauge; + + private final Calculation problems; + + private final UnivariateRealFunction wInterpolator; + + private final DoubleRange wRange; + + + /***** CONSTRUCTORS *****/ + + private GaugeDischargeValuesFinder(final Gauge gauge, final Calculation problems, final DischargeTable dischargeTable) { + this.gauge = gauge; + this.problems = problems; + final TDoubleArrayList ws = new TDoubleArrayList(); + final TDoubleArrayList qs = new TDoubleArrayList(); + for (final DischargeTableValue v : DischargeTable.getValuesSortedByW(dischargeTable)) { + ws.add(v.getW().doubleValue()); + qs.add(v.getQ().doubleValue()); + } + if (!ws.isEmpty()) + this.wRange = new DoubleRange(ws.get(0), ws.get(ws.size() - 1)); + else + this.wRange = null; + this.wInterpolator = new LinearInterpolator().interpolate(ws.toNativeArray(), qs.toNativeArray()); + } + + + /***** METHODS *****/ + + /** + * Loads the the main discharge table of a gauge (GAUGE.at) + * + * @return The discharge table values finder of the gauge, or null + */ + public static GaugeDischargeValuesFinder loadValues(final Gauge gauge, final Calculation problems) { + final DischargeTable table = DischargeTable.getGaugeMainDischargeTable(gauge); + if ((table == null) || (table.getDischargeTableValues().size() == 0)) + return null; + else { + return new GaugeDischargeValuesFinder(gauge, problems, table); + } + } + + /** + * If this provider may return valid data at all. + */ + public boolean isValid() { + return (this.wInterpolator != null); + } + + /** + * Discharge for a W + * + * @return Q, or NegInf for w less than all, or PosInf for w greater then all, or NaN in case of exception + */ + public double getDischarge(final double w) { + try { + if (this.wInterpolator == null) + return Double.NaN; + else if (w < this.wRange.getMinimumDouble()) + return Double.NEGATIVE_INFINITY; + else if (w > this.wRange.getMaximumDouble()) + return Double.POSITIVE_INFINITY; + else + return this.wInterpolator.value(w); + } + catch (@SuppressWarnings("unused") final FunctionEvaluationException e) { + // ignore exception because this can/will happen regularly + return Double.NaN; + } + } +} \ No newline at end of file diff -r 568961ff709a -r f9bb5d0a6ff3 artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/GaugeDischargeZoneFinder.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/GaugeDischargeZoneFinder.java Tue Jun 19 14:19:32 2018 +0200 @@ -0,0 +1,108 @@ +/** 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.collision; + +import java.util.Map.Entry; +import java.util.NavigableMap; +import java.util.TreeMap; + +import org.dive4elements.river.artifacts.model.Calculation; +import org.dive4elements.river.model.Gauge; +import org.dive4elements.river.model.MainValue; +import org.dive4elements.river.model.MainValueType.MainValueTypeKey; + +/** + * Loading and search the discharge zones of a gauge + * + * @author Matthias Schäfer + * + */ +public final class GaugeDischargeZoneFinder { + + /***** FIELDS *****/ + + // private static Logger log = Logger.getLogger(GaugeDischargeZoneFinder.class); + + private final Gauge gauge; + + private final Calculation problems; + + private final NavigableMap qZones; + + private final String approxPrefix = "ca."; // "\u2248" geht wohl nicht + + + /***** CONSTRUCTORS *****/ + + private GaugeDischargeZoneFinder(final Gauge gauge, final Calculation problems) { + this.gauge = gauge; + this.problems = problems; + this.qZones = new TreeMap<>(); + for (final MainValue mainValue : MainValue.getValuesOfGaugeAndType(gauge, MainValueTypeKey.Q)) + this.qZones.put(Double.valueOf(mainValue.getValue().doubleValue()), mainValue); + } + + + /***** METHODS *****/ + + /** + * Loads the the main discharge table of a gauge (GAUGE.at) + * + * @return The discharge table values finder of the gauge, or null + */ + public static GaugeDischargeZoneFinder loadValues(final Gauge gauge, final Calculation problems) { + return new GaugeDischargeZoneFinder(gauge, problems); + } + + /** + * If this provider may return valid data at all. + */ + public boolean isValid() { + return (this.qZones != null); + } + + /** + * Discharge zone for a Q. + */ + public String getDischargeZone(final double q) { + if (Double.isNaN(q)) + return ""; + + // Exact match + if (this.qZones.containsKey(Double.valueOf(q))) + return this.qZones.get(Double.valueOf(q)).getMainValue().getName(); + + // Clearly below or just (max. 10%) below lowest named discharge + final Entry lowerZone = this.qZones.floorEntry(Double.valueOf(q)); + if (lowerZone == null) { + if (q >= this.qZones.firstKey().doubleValue() * 0.9) + return this.approxPrefix + this.qZones.firstEntry().getValue().getMainValue().getName(); + else + return "<" + this.qZones.firstEntry().getValue().getMainValue().getName(); + } + + // Clearly above or just (max. 10%) above highest named discharge + final Entry higherZone = this.qZones.ceilingEntry(Double.valueOf(q)); + if (higherZone == null) { + if (q <= this.qZones.lastKey().doubleValue() * 1.1) + return this.approxPrefix + this.qZones.lastEntry().getValue().getMainValue().getName(); + else + return ">" + this.qZones.lastEntry().getValue().getMainValue().getName(); + } + + // Near (10%) one of the borders of a zone interval, or clearly within a zone + if (q <= lowerZone.getKey().doubleValue() * 1.1) + return this.approxPrefix + lowerZone.getValue().getMainValue().getName(); + else if (q >= higherZone.getKey().doubleValue() * 0.9) + return this.approxPrefix + higherZone.getValue().getMainValue().getName(); + else + return lowerZone.getValue().getMainValue().getName() + "-" + higherZone.getValue().getMainValue().getName(); + } +} \ No newline at end of file diff -r 568961ff709a -r f9bb5d0a6ff3 artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/common/CollisionCalcProcessor.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/common/CollisionCalcProcessor.java Tue Jun 19 14:19:32 2018 +0200 @@ -0,0 +1,88 @@ +/** 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.common; + +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +import org.dive4elements.artifactdatabase.state.ArtifactAndFacet; +import org.dive4elements.artifactdatabase.state.Facet; +import org.dive4elements.artifacts.Artifact; +import org.dive4elements.artifacts.CallContext; +import org.dive4elements.river.artifacts.common.AbstractCalculationResult; +import org.dive4elements.river.artifacts.resources.Resources; +import org.dive4elements.river.artifacts.sinfo.collision.CollisionCalcFacet; +import org.dive4elements.river.artifacts.sinfo.collision.CollisionCalcOverviewResult; +import org.dive4elements.river.artifacts.states.DefaultState.ComputeType; +import org.dive4elements.river.exports.DiagramGenerator; +import org.dive4elements.river.exports.StyledSeriesBuilder; +import org.dive4elements.river.jfree.StyledXYSeries; +import org.dive4elements.river.themes.ThemeDocument; + +/** + * Processor to generate the facet and data series of calculated bed collision counts + * + * @author Matthias Schäfer + * + */ +public final class CollisionCalcProcessor extends AbstractSInfoProcessor { + + public static final String FACET_COLLISION_CALC_COUNT = "sinfo_facet_collision_calc_count"; + + private static final String I18N_AXIS_LABEL = "chart.collision_count.section.yaxis.label"; + + private static final String I18N_SERIES_NAME_PATTERN = "collision.count.title"; + + private static final Set HANDLED_FACET_TYPES = new HashSet<>(); + + static { + HANDLED_FACET_TYPES.add(FACET_COLLISION_CALC_COUNT); + } + + public CollisionCalcProcessor() { + super(I18N_AXIS_LABEL, HANDLED_FACET_TYPES); + } + + @Override + protected String generateSeries(final DiagramGenerator generator, final ArtifactAndFacet bundle, final ThemeDocument theme, final boolean visible) { + + final CallContext context = generator.getContext(); + final Map metaData = bundle.getFacet().getMetaData(); + + final Artifact artifact = bundle.getArtifact(); + + final StyledXYSeries series = new StyledXYSeries(bundle.getFacetDescription(), theme); + series.putMetaData(metaData, artifact, context); + + final String facetName = bundle.getFacetName(); + + final CollisionCalcOverviewResult data = (CollisionCalcOverviewResult) bundle.getData(context); + if (data == null) { + // Check has been here before so we keep it for security reasons + // this should never happen though. + throw new IllegalStateException("Data is null for facet: " + facetName); + } + + final double[][] points = data.getStationPoints(SInfoResultType.collisionCount); + + StyledSeriesBuilder.addPoints(series, points, true); + generator.addAxisSeries(series, getAxisName(), visible); + + return metaData.get("Y"); + } + + public static final Facet createFacet(final CallContext context, final String hash, final String id, final AbstractCalculationResult result, + final int index) { + final String facetDescription = Resources.getMsg(context.getMeta(), I18N_SERIES_NAME_PATTERN, I18N_SERIES_NAME_PATTERN, result.getLabel()); + return new CollisionCalcFacet(index, FACET_COLLISION_CALC_COUNT, facetDescription, I18N_AXIS_LABEL, ComputeType.ADVANCE, id, hash); + } +} \ No newline at end of file diff -r 568961ff709a -r f9bb5d0a6ff3 artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/common/CollisionCountProcessor.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/common/CollisionCountProcessor.java Tue Jun 19 14:16:45 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/common/CollisionCountProcessor.java Tue Jun 19 14:19:32 2018 +0200 @@ -65,6 +65,7 @@ series.putMetaData(metaData, artifact, context); final String facetName = bundle.getFacetName(); + final CollisionQueryCalculationResult data = (CollisionQueryCalculationResult) bundle.getData(context); if (data == null) { // Check has been here before so we keep it for security reasons @@ -84,4 +85,5 @@ return new CollisionFacet(FACET_COLLISION_COUNT, Resources.getMsg(callMeta, I18N_SERIES_NAME_PATTERN, I18N_SERIES_NAME_PATTERN, seriesName), I18N_AXIS_LABEL); } + } \ No newline at end of file diff -r 568961ff709a -r f9bb5d0a6ff3 artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/common/CollisionGaugeWProcessor.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/common/CollisionGaugeWProcessor.java Tue Jun 19 14:16:45 2018 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,87 +0,0 @@ -/** 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.common; - -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - -import org.dive4elements.artifactdatabase.state.ArtifactAndFacet; -import org.dive4elements.artifactdatabase.state.Facet; -import org.dive4elements.artifacts.Artifact; -import org.dive4elements.artifacts.CallContext; -import org.dive4elements.artifacts.CallMeta; -import org.dive4elements.river.artifacts.resources.Resources; -import org.dive4elements.river.artifacts.sinfo.collision.CollisionFacet; -import org.dive4elements.river.artifacts.sinfo.collision.CollisionQueryCalculationResult; -import org.dive4elements.river.exports.DiagramGenerator; -import org.dive4elements.river.exports.StyledSeriesBuilder; -import org.dive4elements.river.jfree.StyledXYSeries; -import org.dive4elements.river.themes.ThemeDocument; - -/** - * Processor to generate a data series for collision gauge W data loaded from the database - * - * @author Matthias Schäfer - * - */ -public class CollisionGaugeWProcessor extends AbstractSInfoProcessor { - - // private final static Logger log = Logger.getLogger(CollisionGaugeWProcessor.class); - - public static final String FACET_COLLISION_GAUGEW = "sinfo_facet_collision_gaugew"; - - private static final String I18N_AXIS_LABEL = "chart.longitudinal.section.yaxis.label"; - - private static final String I18N_SERIES_NAME_PATTERN = "collision.gaugew.title"; - - private static final Set HANDLED_FACET_TYPES = new HashSet<>(); - - static { - HANDLED_FACET_TYPES.add(FACET_COLLISION_GAUGEW); - } - - public CollisionGaugeWProcessor() { - super(I18N_AXIS_LABEL, HANDLED_FACET_TYPES); - } - - @Override - protected String generateSeries(final DiagramGenerator generator, final ArtifactAndFacet bundle, final ThemeDocument theme, final boolean visible) { - - final CallContext context = generator.getContext(); - final Map metaData = bundle.getFacet().getMetaData(); - - final Artifact artifact = bundle.getArtifact(); - - final StyledXYSeries series = new StyledXYSeries(bundle.getFacetDescription(), theme); - series.putMetaData(metaData, artifact, context); - - final String facetName = bundle.getFacetName(); - final CollisionQueryCalculationResult data = (CollisionQueryCalculationResult) bundle.getData(context); - if (data == null) { - // Check has been here before so we keep it for security reasons - // this should never happen though. - throw new IllegalStateException("Data is null for facet: " + facetName); - } - - final double[][] points = data.getStationPoints(SInfoResultType.collisionGaugeW); - - StyledSeriesBuilder.addPoints(series, points, true); - generator.addAxisSeries(series, getAxisName(), visible); - - return metaData.get("Y"); - } - - public static Facet createFacet(final CallMeta callMeta, final String seriesName) { - return new CollisionFacet(FACET_COLLISION_GAUGEW, - Resources.getMsg(callMeta, I18N_SERIES_NAME_PATTERN, I18N_SERIES_NAME_PATTERN, seriesName), I18N_AXIS_LABEL); - } -} \ No newline at end of file diff -r 568961ff709a -r f9bb5d0a6ff3 artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/common/SInfoI18NStrings.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/common/SInfoI18NStrings.java Tue Jun 19 14:16:45 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/common/SInfoI18NStrings.java Tue Jun 19 14:19:32 2018 +0200 @@ -81,4 +81,9 @@ String CSV_COLLISION_GAUGEW_HEADER = "sinfo.export.csv.header.collision.gaugew"; + String CSV_META_HEADER_YEARS = "sinfo.export.csv.meta.header.years"; + + String CSV_YEARS_HEADER = "sinfo.export.csv.header.years"; + + String CSV_DISCHARGE_ZONE_HEADER = "sinfo.export.csv.header.discharge.zone"; } \ No newline at end of file diff -r 568961ff709a -r f9bb5d0a6ff3 artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/common/SInfoResultType.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/common/SInfoResultType.java Tue Jun 19 14:16:45 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/common/SInfoResultType.java Tue Jun 19 14:19:32 2018 +0200 @@ -63,12 +63,12 @@ public String exportValue(final CallContext context, final Object value) { final double doubleValue = asDouble(value); return exportDoubleValue(context, doubleValue); // integer - // als - // double? - // finde - // gerade - // kein - // int-beispiel + // als + // double? + // finde + // gerade + // kein + // int-beispiel } @Override @@ -85,12 +85,12 @@ public String exportValue(final CallContext context, final Object value) { final double doubleValue = asDouble(value); return exportDoubleValue(context, doubleValue); // integer - // als - // double? - // finde - // gerade - // kein - // int-beispiel + // als + // double? + // finde + // gerade + // kein + // int-beispiel } @Override @@ -602,4 +602,31 @@ } }; + public static final SInfoResultType years = new SInfoResultType(I18NStrings.UNIT_NONE, SInfoI18NStrings.CSV_YEARS_HEADER) { + private static final long serialVersionUID = 1L; + + @Override + public String exportValue(final CallContext context, final Object value) { + return exportStringValue(value); + } + + @Override + protected NumberFormat createFormatter(final CallContext context) { + throw new UnsupportedOperationException(); + } + }; + + public static final SInfoResultType dischargeZone = new SInfoResultType(I18NStrings.UNIT_NONE, SInfoI18NStrings.CSV_DISCHARGE_ZONE_HEADER) { + private static final long serialVersionUID = 1L; + + @Override + public String exportValue(final CallContext context, final Object value) { + return exportStringValue(value); + } + + @Override + protected NumberFormat createFormatter(final CallContext context) { + throw new UnsupportedOperationException(); + } + }; } \ No newline at end of file diff -r 568961ff709a -r f9bb5d0a6ff3 artifacts/src/main/resources/messages.properties --- a/artifacts/src/main/resources/messages.properties Tue Jun 19 14:16:45 2018 +0200 +++ b/artifacts/src/main/resources/messages.properties Tue Jun 19 14:19:32 2018 +0200 @@ -1110,9 +1110,16 @@ sinfo.export.csv.header.collision.count = Anzahl der Grundber\u00fchrungen collision.count.title = Grundber\u00fchrungen {0} -chart.collision_count.section.yaxis.label = Anzahl +chart.collision_count.section.yaxis.label = H\u00e4ufigkeit sinfo.export.csv.header.collision.gaugew = W am Pegel collision.gaugew.title = W am Pegel {0} +sinfo.export.csv.header.discharge.zone = Abflusszustand + +sinfo.export.csv.meta.header.years = # Jahr/Zeitraum: {0} +sinfo.export.csv.header.years = Jahr/Zeitraum +sinfo.export.csv.meta.date = Datum + +sinfo.chart.collision.section.title = Grundber\u00fchrungen bundu_bezugswst = Bezugswasserst\u00e4nde bundu_analysis = Fixinganalysis diff -r 568961ff709a -r f9bb5d0a6ff3 artifacts/src/main/resources/messages_de.properties --- a/artifacts/src/main/resources/messages_de.properties Tue Jun 19 14:16:45 2018 +0200 +++ b/artifacts/src/main/resources/messages_de.properties Tue Jun 19 14:19:32 2018 +0200 @@ -1110,9 +1110,16 @@ sinfo.export.csv.header.collision.count = Anzahl der Grundber\u00fchrungen collision.count.title = Grundber\u00fchrungen {0} -chart.collision_count.section.yaxis.label = Anzahl +chart.collision_count.section.yaxis.label = H\u00e4ufigkeit sinfo.export.csv.header.collision.gaugew = W am Pegel collision.gaugew.title = W am Pegel {0} +sinfo.export.csv.header.discharge.zone = Abflusszustand + +sinfo.export.csv.meta.header.years = # Jahr/Zeitraum: {0} +sinfo.export.csv.header.years = Jahr/Zeitraum +sinfo.export.csv.meta.date = Datum + +sinfo.chart.collision.section.title = Grundber\u00fchrungen bundu_bezugswst = Bezugswasserst\u00e4nde bundu_analysis = Fixierungsanalyse diff -r 568961ff709a -r f9bb5d0a6ff3 gwt-client/src/main/java/org/dive4elements/river/client/client/FLYSConstants.java --- a/gwt-client/src/main/java/org/dive4elements/river/client/client/FLYSConstants.java Tue Jun 19 14:16:45 2018 +0200 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/FLYSConstants.java Tue Jun 19 14:19:32 2018 +0200 @@ -1505,6 +1505,8 @@ String sinfo_collisions(); + String sinfo_collision(); + String uinfo(); String uinfo_salix_line_export(); diff -r 568961ff709a -r f9bb5d0a6ff3 gwt-client/src/main/java/org/dive4elements/river/client/client/FLYSConstants.properties --- a/gwt-client/src/main/java/org/dive4elements/river/client/client/FLYSConstants.properties Tue Jun 19 14:16:45 2018 +0200 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/FLYSConstants.properties Tue Jun 19 14:19:32 2018 +0200 @@ -809,6 +809,7 @@ sinfo_infrastructure = Infrastrukturen BWaStr sinfo_collisions = Grundber\u00fchrungen +sinfo_collision = Grundber\u00fchrungen uinfo = U-INFO uinfo_inundation_duration_export = \u00dcberflutungsdauern Export diff -r 568961ff709a -r f9bb5d0a6ff3 gwt-client/src/main/java/org/dive4elements/river/client/client/FLYSConstants_de.properties --- a/gwt-client/src/main/java/org/dive4elements/river/client/client/FLYSConstants_de.properties Tue Jun 19 14:16:45 2018 +0200 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/FLYSConstants_de.properties Tue Jun 19 14:19:32 2018 +0200 @@ -809,6 +809,7 @@ sinfo_infrastructure = Infrastrukturen BWaStr sinfo_collisions = Grundber\u00fchrungen +sinfo_collision = Grundber\u00fchrungen uinfo = U-INFO uinfo_inundation_duration_export = \u00dcberflutungsdauern Export