# HG changeset patch # User gernotbelger # Date 1534512676 -7200 # Node ID b6e595f1696f746f3ca4b187c956fdcd45d5a22d # Parent 3f49835a00c37cc6ca7136fcdbd5610f1abf159e Activated cross section output mode for salix line and implemented some themes preliminary. diff -r 3f49835a00c3 -r b6e595f1696f artifacts/doc/conf/artifacts/uinfo.xml --- a/artifacts/doc/conf/artifacts/uinfo.xml Fri Aug 17 15:31:02 2018 +0200 +++ b/artifacts/doc/conf/artifacts/uinfo.xml Fri Aug 17 15:31:16 2018 +0200 @@ -3,119 +3,114 @@ - + - - + + - + - - + + - - + + - - + + - - - - - - - - - - - - - - - - - - - - - - - - + + + - - - + + + - - + + - - - - - - - - - - - - - - - + + + - - - + + + - - - - - - + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + - - - + + + @@ -123,8 +118,8 @@ - - + + @@ -133,131 +128,133 @@ - - - - - - - - - + + + + + + + - - + - - + + + + + + + + - + + + + + + + - + - - - - - - + + + - - - - - - - - - - + + + - - - + + + + + + + + - + - - + - - - - + + + - + - - - - + + + - - - + + + - - + - + - - - + + + - - - - + + + @@ -265,148 +262,92 @@ - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + - + + + + + - + - - - - + + + - - - + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff -r 3f49835a00c3 -r b6e595f1696f artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/UINFOArtifact.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/UINFOArtifact.java Fri Aug 17 15:31:02 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/UINFOArtifact.java Fri Aug 17 15:31:16 2018 +0200 @@ -9,11 +9,18 @@ */ package org.dive4elements.river.artifacts.uinfo; +import java.io.Serializable; + import org.apache.commons.lang.StringUtils; import org.dive4elements.artifactdatabase.state.Facet; import org.dive4elements.artifactdatabase.state.FacetActivity; import org.dive4elements.artifacts.Artifact; +import org.dive4elements.artifacts.CallContext; import org.dive4elements.river.artifacts.D4EArtifact; +import org.dive4elements.river.artifacts.WaterLineArtifact; +import org.dive4elements.river.artifacts.model.CalculationResult; +import org.dive4elements.river.artifacts.states.DefaultState.ComputeType; +import org.dive4elements.river.artifacts.uinfo.salix.SalixLineCalculationResults; import org.dive4elements.river.artifacts.uinfo.salix.SalixLineProcessor; /** @@ -21,7 +28,7 @@ * * @author Gernot Belger */ -public class UINFOArtifact extends D4EArtifact { +public class UINFOArtifact extends D4EArtifact implements WaterLineArtifact { private static final long serialVersionUID = 1L; @@ -100,4 +107,18 @@ public String getRiver() { return getDataAsString(FIELD_RIVER); } + + @Override + public double getWaterLevel(final ComputeType type, final String hash, final String stateId, final double currentKm, final Serializable waterLineIndex, + final double nextKm, + final double prevKm, + final CallContext context) { + + final CalculationResult res = (CalculationResult) this.compute(context, hash, stateId, type, false); + final Object data = res.getData(); + if (data instanceof SalixLineCalculationResults) + return ((SalixLineCalculationResults) data).getCrossSectionLine(currentKm, waterLineIndex, nextKm, prevKm, context); + + throw new IllegalStateException("Cross section stuff should only happen for salix line"); + } } \ No newline at end of file diff -r 3f49835a00c3 -r b6e595f1696f artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineCalculationResult.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineCalculationResult.java Fri Aug 17 15:31:02 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineCalculationResult.java Fri Aug 17 15:31:16 2018 +0200 @@ -33,8 +33,11 @@ class SalixLineCalculationResult extends AbstractCalculationExportableResult { private static final long serialVersionUID = 1L; + private static final String JASPER_FILE = "/jasper/templates/uinfo.salixline.jrxml"; + private static final double STATION_TOLERANCE = 0.1d; + private final String[] scenarioLabels; private final String partialRangeString; @@ -176,4 +179,36 @@ return new double[][] { xPoints.toNativeArray(), yPoints.toNativeArray() }; } + + public final double getSalixValue(final double currentKm, final double nextKm, final double prevKm) { + + final ResultRow row = getRowForStation(currentKm, STATION_TOLERANCE); + if (row == null) + return Double.NaN; + + // FIXME: hier wird die geodätische Höhe der SalixLinie benötigt; ggf schon in die Ergebnistzeilen einbauen + return 84.0; + // return row.getDoubleValue(UInfoResultType.salixline); + } + + public final double getSalixScenarioValue(final double currentKm, final double nextKm, final double prevKm, final int scenarioIndex) { + final ResultRow row = getRowForStation(currentKm, STATION_TOLERANCE); + if (row == null) + return Double.NaN; + + final List scenarios = (List) row.getValue(UInfoResultType.customMultiRowColSalixScenarios); + final SalixScenario salixScenario = scenarios.get(scenarioIndex); + if (salixScenario == null) + return Double.NaN; + + // FIXME: hier wird die geodätische Höhe der SalixLinie benötigt; ggf schon als weiteres Feld an SalixScenario dranbauen + return 85; + // return salixScenario.getSalixValue(); + } + + public final double getWaterlevelValue(final double currentKm, final double nextKm, final double prevKm, final String waterlevelName) { + final ResultRow row = getRowForStation(currentKm, STATION_TOLERANCE); + // TODO implement + return Double.NaN; + } } \ No newline at end of file diff -r 3f49835a00c3 -r b6e595f1696f artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineCalculationResults.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineCalculationResults.java Fri Aug 17 15:31:02 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineCalculationResults.java Fri Aug 17 15:31:16 2018 +0200 @@ -9,19 +9,28 @@ */ package org.dive4elements.river.artifacts.uinfo.salix; +import java.io.Serializable; + import org.apache.commons.lang.math.DoubleRange; +import org.dive4elements.artifacts.CallContext; import org.dive4elements.river.artifacts.common.AbstractCalculationResults; import org.dive4elements.river.artifacts.sinfo.util.RiverInfo; /** * @author Domenico Nardi Tironi - * */ -final class SalixLineCalculationResults extends AbstractCalculationResults { +public final class SalixLineCalculationResults extends AbstractCalculationResults { private static final long serialVersionUID = 1L; public SalixLineCalculationResults(final String calcModeLabel, final String user, final RiverInfo river, final DoubleRange calcRange) { super(calcModeLabel, user, river, calcRange); } + + public double getCrossSectionLine(final double currentKm, final Serializable waterLineIndex, final double nextKm, final double prevKm, + final CallContext context) { + + final SalixLineCrossSectionIndexData indexData = (SalixLineCrossSectionIndexData) waterLineIndex; + return indexData.getCrossSectionLine(this, currentKm, nextKm, prevKm, context); + } } \ No newline at end of file diff -r 3f49835a00c3 -r b6e595f1696f artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineCrossSectionIndexData.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineCrossSectionIndexData.java Fri Aug 17 15:31:16 2018 +0200 @@ -0,0 +1,81 @@ +/** 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.uinfo.salix; + +import java.io.Serializable; + +import org.dive4elements.artifacts.CallContext; + +/** + * The 'index' that tells the cross section facet which of my result are to be fetched as a cross section line. + * + * @author Gernot Belger + */ +public final class SalixLineCrossSectionIndexData implements Serializable { + private static final long serialVersionUID = 1L; + + private static final SalixLineCrossSectionIndexData SALIX_LINE = new SalixLineCrossSectionIndexData(null, null); + + // REMARK: we know at the moment there is exactly one result + private final int resultIndex = 0; + + private final Integer scenarioIndex; + + private final String waterlevelName; + + /** + * Creates an instance of this class that represants the salix line. + */ + public static final SalixLineCrossSectionIndexData salixLine() { + return SALIX_LINE; + } + + /** + * Creates an instance of this class that represants the salix line. + */ + public static final SalixLineCrossSectionIndexData scenario(final int scenarioIndex) { + return new SalixLineCrossSectionIndexData(scenarioIndex, null); + } + + /** + * Creates an instance of this class that represants the salix line. + */ + // FIXME: gemeint sind die einzublendenden 'MNW, MW, MHW, HW5' mir nicht klar wo diese Daten herkommen, ggf. aus der + // Rechnung? + // FIXME: statt 'name' vielleicht eine enum oder irgend etwas anderes was diese dinger eindeutig referenzieet? + public static final SalixLineCrossSectionIndexData waterlevel(final String name) { + assert name != null; + return new SalixLineCrossSectionIndexData(null, name); + } + + private SalixLineCrossSectionIndexData(final Integer scenarioIndex, final String waterlevelName) { + this.scenarioIndex = scenarioIndex; + this.waterlevelName = waterlevelName; + } + + public double getCrossSectionLine(final SalixLineCalculationResults results, final double currentKm, final double nextKm, + final double prevKm, final CallContext context) { + + final SalixLineCalculationResult result = results.getResults().get(this.resultIndex); + + if (this.scenarioIndex != null) { + // fetch scenario result data = salix line value at km + return result.getSalixScenarioValue(currentKm, nextKm, prevKm, this.scenarioIndex); + } + + if (this.waterlevelName != null) { + // fetch waterlevel result data = salix line value at km + return result.getWaterlevelValue(currentKm, nextKm, prevKm, this.waterlevelName); + } + + // fetch normal result data = salix line value at km + return result.getSalixValue(currentKm, nextKm, prevKm); + } +} \ No newline at end of file diff -r 3f49835a00c3 -r b6e595f1696f artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineState.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineState.java Fri Aug 17 15:31:02 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineState.java Fri Aug 17 15:31:16 2018 +0200 @@ -17,6 +17,7 @@ import org.dive4elements.river.artifacts.D4EArtifact; import org.dive4elements.river.artifacts.model.Calculation; import org.dive4elements.river.artifacts.model.CalculationResult; +import org.dive4elements.river.artifacts.model.CrossSectionWaterLineFacet; import org.dive4elements.river.artifacts.model.DataFacet; import org.dive4elements.river.artifacts.model.EmptyFacet; import org.dive4elements.river.artifacts.model.FacetTypes; @@ -48,7 +49,7 @@ return null; } - return compute((UINFOArtifact) artifact, context, hash, facets, old); + return compute((UINFOArtifact) artifact, context, ComputeType.FEED, hash, facets, old); } @Override @@ -57,7 +58,7 @@ facets.add(new EmptyFacet()); return null; } - return compute((UINFOArtifact) artifact, context, hash, facets, old); + return compute((UINFOArtifact) artifact, context, ComputeType.ADVANCE, hash, facets, old); } /** @@ -66,7 +67,8 @@ * @param old * Object that was cached. */ - private Object compute(final UINFOArtifact uinfo, final CallContext context, final String hash, final List facets, final Object old) { + private Object compute(final UINFOArtifact uinfo, final CallContext context, final ComputeType type, final String hash, final List facets, + final Object old) { final CalculationResult res = doCompute(uinfo, context, old); @@ -77,14 +79,18 @@ final List resultList = results.getResults(); + final String stateId = getID(); + int facetIndex = 0; if (!resultList.isEmpty()) { - facets.add(SalixLineProcessor.createSalixLineFilteredFacet(context, hash, this.id, facetIndex++, 0)); - facets.add(SalixLineProcessor.createSalixLineRawFacet(context, hash, this.id, facetIndex++, 0)); - facets.add(SalixLineProcessor.createSalixMnwMwFilteredFacet(context, hash, this.id, facetIndex++, 0)); - facets.add(SalixLineProcessor.createSalixMnwMwRawFacet(context, hash, this.id, facetIndex++, 0)); - facets.add(SalixLineProcessor.createSalixRankFacet(context, hash, this.id, facetIndex++, 0)); + facets.add(SalixLineProcessor.createSalixLineFilteredFacet(context, hash, stateId, facetIndex++, 0)); + facets.add(SalixLineProcessor.createSalixLineRawFacet(context, hash, stateId, facetIndex++, 0)); + facets.add(SalixLineProcessor.createSalixMnwMwFilteredFacet(context, hash, stateId, facetIndex++, 0)); + facets.add(SalixLineProcessor.createSalixMnwMwRawFacet(context, hash, stateId, facetIndex++, 0)); + facets.add(SalixLineProcessor.createSalixRankFacet(context, hash, stateId, facetIndex++, 0)); + + facets.add(new CrossSectionWaterLineFacet(facetIndex++, "Salix Linie (!I10N!)", type, hash, stateId, SalixLineCrossSectionIndexData.salixLine())); final SalixLineCalculationResult result = resultList.get(0); @@ -93,12 +99,17 @@ result.getScenarioLabel(i)); // REMARK: using data index as facetIndex, as we know there is only one result of this type. Else we should just // increment - facets.add(SalixLineProcessor.createSalixScenarioFilteredFacet(context, hash, this.id, i, 0, facetIndex++, sublabel)); - facets.add(SalixLineProcessor.createSalixScenarioRawFacet(context, hash, this.id, i, 0, facetIndex++, sublabel)); + facets.add(SalixLineProcessor.createSalixScenarioFilteredFacet(context, hash, stateId, i, 0, facetIndex++, sublabel)); + facets.add(SalixLineProcessor.createSalixScenarioRawFacet(context, hash, stateId, i, 0, facetIndex++, sublabel)); + + facets.add(new CrossSectionWaterLineFacet(facetIndex++, "Salix Linie Scenario (!I10N! )" + i, type, hash, stateId, + SalixLineCrossSectionIndexData.scenario(i))); } - 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); + // FIXME: add cross section wst lines (MW, MMHW, ...) + + final Facet csv = new DataFacet(FacetTypes.CSV, "CSV data", ComputeType.ADVANCE, hash, stateId); + final Facet pdf = new DataFacet(FacetTypes.PDF, "PDF data", ComputeType.ADVANCE, hash, stateId); facets.add(csv); facets.add(pdf); @@ -107,7 +118,7 @@ final Calculation report = res.getReport(); if (report.hasProblems()) - facets.add(new ReportFacet(ComputeType.ADVANCE, hash, this.id)); + facets.add(new ReportFacet(ComputeType.ADVANCE, hash, stateId)); return res; }