diff artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineCalculator.java @ 9321:a978b601a034

Salix: Fixed ArrrayoutOfBoundsException; minor cleanup
author gernotbelger
date Fri, 27 Jul 2018 10:25:09 +0200
parents 72b3270e1568
children b3d3c958a594
line wrap: on
line diff
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineCalculator.java	Fri Jul 27 10:19:38 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineCalculator.java	Fri Jul 27 10:25:09 2018 +0200
@@ -16,7 +16,6 @@
 import java.util.Map.Entry;
 import java.util.NavigableMap;
 
-import org.dive4elements.artifacts.CallContext;
 import org.dive4elements.river.artifacts.WINFOArtifact;
 import org.dive4elements.river.artifacts.access.ComputationRangeAccess;
 import org.dive4elements.river.artifacts.common.GeneralResultType;
@@ -41,14 +40,12 @@
  *
  * @author Matthias Schäfer
  */
-public class SalixLineCalculator {
+final class SalixLineCalculator {
 
     private final List<ResultRow> rows = new ArrayList<>();
 
     private final RiverInfoProvider riverInfoProvider;
 
-    private final CallContext context;
-
     private final Map<Gauge, QPosition> gaugeMwPos;
     private final Map<Gauge, QPosition> gaugeMnwPos;
     private final Map<Gauge, QPosition> gaugeMhwPos;
@@ -57,21 +54,13 @@
 
     private WstValueTable wst;
 
-    /**
-     * List of delta-w (may be 0) mapped by km range
-     */
-    private NavigableMap<Double, List<Double>> rangeScenarios;
-
-
-    public SalixLineCalculator(final CallContext context, final RiverInfoProvider riverInfoProvider) {
-        this.context = context;
+    public SalixLineCalculator(final RiverInfoProvider riverInfoProvider) {
         this.riverInfoProvider = riverInfoProvider;
         this.gaugeMwPos = new HashMap<>();
         this.gaugeMnwPos = new HashMap<>();
         this.gaugeMhwPos = new HashMap<>();
     }
 
-
     /**
      * Calculate the salix line result rows
      */
@@ -80,7 +69,6 @@
 
         this.problems = problems;
         this.wst = WstValueTableFactory.getTable(this.riverInfoProvider.getRiver());
-        this.rangeScenarios = rangeScenarios;
 
         fetchGaugeMainValuePositions();
 
@@ -88,7 +76,7 @@
         winfo.addStringData("ld_mode", "distance");
         winfo.addStringData("ld_step", "100");
         for (final double station : new ComputationRangeAccess(winfo).getKms()) {
-            this.rows.add(createRow(station));
+            this.rows.add(createRow(station, rangeScenarios));
         }
         if (scenarioType == ScenarioType.REGIONAL)
             results.addResult(new SalixLineCalculationRegionalResult("Salix", scenarioLabels, this.rows), problems);
@@ -128,8 +116,10 @@
 
     /**
      * Create a result row for a station and its gauge, and add w-q-values as selected
+     *
+     * @param rangeScenarios2
      */
-    private ResultRow createRow(final double station) {
+    private ResultRow createRow(final double station, final NavigableMap<Double, List<Double>> rangeScenarios) {
 
         final ResultRow row = ResultRow.create();
         // Find station's gauge
@@ -147,13 +137,14 @@
         row.putValue(UInfoResultType.salix_delta_mw, calcMwmnw(mw, mnw));
         // Calc scenario values (always all scenario types set, Result variant extracts the fields needed)
         final List<SalixScenario> scenarios = new ArrayList<>();
-        final double[] deltaws = getDeltaWs(station);
+        final double[] deltaws = getDeltaWs(station, rangeScenarios);
         for (int i = 0; i <= deltaws.length - 1; i++) {
             if (Math.abs(deltaws[i]) < 0.0001) {
                 row.putValue(UInfoResultType.salix_line_scenario, Double.NaN);
                 row.putValue(UInfoResultType.salix_line_scenario_dwspl, 0); // TODO NaN when changed from int to double
-            }
-            else {
+                /* always need to add a member, so the exporter will produce empty columns */
+                scenarios.add(null);
+            } else {
                 final double salix = calcSalix(mhw, mw + deltaws[i]);
                 row.putValue(UInfoResultType.salix_line_scenario, salix);
                 row.putValue(UInfoResultType.salix_line_scenario_dwspl, (int) (deltaws[i] * 100));
@@ -170,8 +161,8 @@
     private double interpolateW(final double station, final QPosition qPosition) {
         if (qPosition != null)
             return this.wst.interpolateW(station, qPosition, this.problems);
-        else
-            return Double.NaN;
+
+        return Double.NaN;
     }
 
     /**
@@ -190,16 +181,17 @@
 
     /**
      * Gets the station-specific list of delta-ws of the active scenario, at least with one 0 item in any case
+     *
+     * @param rangeScenarios
      */
-    private double[] getDeltaWs(final double station) {
-        final Entry<Double, List<Double>> stationScenarios = this.rangeScenarios.floorEntry(station);
+    private double[] getDeltaWs(final double station, final NavigableMap<Double, List<Double>> rangeScenarios) {
+        final Entry<Double, List<Double>> stationScenarios = rangeScenarios.floorEntry(station);
         if (stationScenarios == null)
             return new double[] { 0.0 };
-        else {
-            final double[] deltaws = new double[stationScenarios.getValue().size()];
-            for (int i = 0; i <= stationScenarios.getValue().size() - 1; i++)
-                deltaws[i] = stationScenarios.getValue().get(i);
-            return deltaws;
-        }
+
+        final double[] deltaws = new double[stationScenarios.getValue().size()];
+        for (int i = 0; i <= stationScenarios.getValue().size() - 1; i++)
+            deltaws[i] = stationScenarios.getValue().get(i);
+        return deltaws;
     }
-}
+}
\ No newline at end of file

http://dive4elements.wald.intevation.org