changeset 9532:8e6b9cb9486a

Fixed BedQuality finder
author gernotbelger
date Tue, 02 Oct 2018 18:19:44 +0200
parents 267ac3012150
children d9fda7af24ca
files artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/tkhcalculation/BedQualityD50KmValueFinder.java artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/tkhcalculation/TkhCalculator.java artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/tkhstate/BedQualityD50TimeRangeConfig.java
diffstat 3 files changed, 69 insertions(+), 68 deletions(-) [+]
line wrap: on
line diff
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/tkhcalculation/BedQualityD50KmValueFinder.java	Tue Oct 02 18:08:02 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/tkhcalculation/BedQualityD50KmValueFinder.java	Tue Oct 02 18:19:44 2018 +0200
@@ -23,7 +23,6 @@
 import org.dive4elements.river.artifacts.model.Calculation;
 import org.dive4elements.river.artifacts.model.DateRange;
 import org.dive4elements.river.artifacts.sinfo.tkhstate.BedQualityD50TimeRangeConfig;
-import org.dive4elements.river.artifacts.sinfo.tkhstate.BedQualityD50TimeRangeConfig.BedQualityParseException;
 import org.dive4elements.river.artifacts.sinfo.tkhstate.TsvHelper.TsvReaderException;
 import org.dive4elements.river.backend.SedDBSessionHolder;
 import org.dive4elements.river.model.River;
@@ -97,15 +96,16 @@
      * Abhängig von Peiljahr
      *
      * @param problems
-     * @throws BedQualityParseException
      * @throws TsvReaderException
      * @throws IOException
      */
     public static BedQualityD50KmValueFinder loadBedMeasurements(final Calculation problems, final River river, final DoubleRange kmRange,
-            final int soundingYear) throws BedQualityParseException, IOException, TsvReaderException {
+            final int soundingYear) {
 
-        final DateRange rangeFromConfigFile = BedQualityD50TimeRangeConfig.getDefaults(river, soundingYear, problems);
-        final DateRange dateRange = rangeFromConfigFile != null ? rangeFromConfigFile : new DateRange(MIN_DATE, MAX_DATE);
+        final DateRange dateRange = BedQualityD50TimeRangeConfig.getDefaults(river, soundingYear, problems);
+        if (dateRange == null)
+            return null;
+
         return loadBedMeasurements(problems, river, kmRange, dateRange, soundingYear);
     }
 
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/tkhcalculation/TkhCalculator.java	Tue Oct 02 18:08:02 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/tkhcalculation/TkhCalculator.java	Tue Oct 02 18:19:44 2018 +0200
@@ -9,16 +9,12 @@
  */
 package org.dive4elements.river.artifacts.sinfo.tkhcalculation;
 
-import java.io.IOException;
-
 import org.apache.commons.lang.math.DoubleRange;
 import org.dive4elements.river.artifacts.common.GeneralResultType;
 import org.dive4elements.river.artifacts.common.ResultRow;
 import org.dive4elements.river.artifacts.model.Calculation;
 import org.dive4elements.river.artifacts.sinfo.common.SInfoResultType;
 import org.dive4elements.river.artifacts.sinfo.tkhstate.BedHeightsFinder;
-import org.dive4elements.river.artifacts.sinfo.tkhstate.BedQualityD50TimeRangeConfig.BedQualityParseException;
-import org.dive4elements.river.artifacts.sinfo.tkhstate.TsvHelper.TsvReaderException;
 import org.dive4elements.river.model.River;
 
 /**
@@ -60,7 +56,7 @@
 
         /* access bed quality data */
         final int soundingYear = bedHeightsProvider.getInfo().getYear();
-        final BedQualityD50KmValueFinder bedMeasurementsFinder = loadBedMeasurementsFinder(problems, river, calcRange, soundingYear);
+        final BedQualityD50KmValueFinder bedMeasurementsFinder = BedQualityD50KmValueFinder.loadBedMeasurements(problems, river, calcRange, soundingYear);
         if (bedMeasurementsFinder == null)
             return new TkhCalculator(null, waterlevelProvider, dischargeProvider, bedHeightsProvider, null, null);
 
@@ -77,18 +73,6 @@
         return new TkhCalculator(bedMeasurementsFinder, waterlevelProvider, dischargeProvider, bedHeightsProvider, soilKindFinder, flowVelocitiesFinder);
     }
 
-    private static BedQualityD50KmValueFinder loadBedMeasurementsFinder(final Calculation problems, final River river, final DoubleRange calcRange,
-            final int soundingYear) {
-
-        try {
-            return BedQualityD50KmValueFinder.loadBedMeasurements(problems, river, calcRange, soundingYear);
-        }
-        catch (final BedQualityParseException | IOException | TsvReaderException e) {
-            e.printStackTrace();
-            return null;
-        }
-    }
-
     private TkhCalculator(final BedQualityD50KmValueFinder bedMeasurementsFinder, final WaterlevelValuesFinder waterlevelProvider,
             final DischargeValuesFinder dischargeProvider, final BedHeightsFinder bedHeightsProvider, final SoilKindKmValueFinder soilKindFinder,
             final FlowVelocityModelKmValueFinder flowVelocitiesFinder) {
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/tkhstate/BedQualityD50TimeRangeConfig.java	Tue Oct 02 18:08:02 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/tkhstate/BedQualityD50TimeRangeConfig.java	Tue Oct 02 18:19:44 2018 +0200
@@ -11,11 +11,14 @@
 
 import java.io.File;
 import java.io.IOException;
+import java.util.ArrayList;
 import java.util.Calendar;
+import java.util.Collection;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.TimeZone;
 
 import org.dive4elements.river.artifacts.model.Calculation;
 import org.dive4elements.river.artifacts.model.DateRange;
@@ -32,68 +35,87 @@
 
     private static final String CONFIG_FILE = "d50_sohlkorndurchmesser_%s.tsv";
 
-    private final Map<String, DateRange> cache = new HashMap<>();
+    private final Map<String, CalRange[]> cache = new HashMap<>();
 
     private static BedQualityD50TimeRangeConfig INSTANCE = new BedQualityD50TimeRangeConfig();
 
-    public static class BedQualityParseException extends Exception {
+    private static class BedQualityParseException extends Exception {
 
         private static final long serialVersionUID = 1L;
 
-        BedQualityParseException(final String message) {
-            super(message);
-        }
-
-        BedQualityParseException(final String message, final Throwable cause) {
+        public BedQualityParseException(final String message, final Throwable cause) {
             super(message, cause);
         }
     }
 
-    public static synchronized DateRange getDefaults(final River river, final int soundingYear, final Calculation problems)
-            throws BedQualityParseException {
+    public static synchronized DateRange getDefaults(final River river, final int soundingYear, final Calculation problems) {
         return INSTANCE.getBedHeightDefaultsForRiver(river, soundingYear, problems);
     }
 
-    private synchronized DateRange getBedHeightDefaultsForRiver(final River river, final int soundingYear, final Calculation problems)
-            throws BedQualityParseException {
-        final String rivername = river.getName();
-        final String cacheKey = new StringBuilder().append(rivername).append(";").append(soundingYear).toString();
-        if (!this.cache.containsKey(cacheKey)) {
-            final File file = TsvHelper.makeFile2(CONFIG_FILE, rivername);
-            final File fileCheck = TsvHelper.checkFile(file);
-            if (fileCheck == null)
-                return null; // automatically dateRange min/max wil be taken
+    private synchronized DateRange getBedHeightDefaultsForRiver(final River river, final int soundingYear, final Calculation problems) {
 
-            List<String[]> results = null;
-            try {
-                results = TsvHelper.readTsv(file, 4);
-            }
-            catch (final TsvReaderException | IOException e) {
-                problems.addProblem("sinfo.bedqualityd50config.configfile.loaderror", file.getPath(), e.getStackTrace());
-            }
-            if (results != null) {
-                for (final String[] line : results) {
-                    final CalRange range = new CalRange(parseInput(line[0]), parseInput(line[1]), parseInput(line[2]), parseInput(line[3]));
-                    if (range.isSoundingYearInRange(soundingYear)) {
-                        final DateRange dateRange = new DateRange(range.getStartTimeQuery(), range.getEndTimeQuery());
-                        this.cache.put(cacheKey, dateRange);
+        final String rivername = river.getName();
 
-                    }
-                }
-            }
-            problems.addProblem("sinfo.bedqualityd50config.configfile.loaderror", file.getPath(),
-                    " Die angegebene d50-sohlkorndurchmesser-config-file enthält keinen gültigen Bereich für das konfigurierte Peiljahr.");
+        final CalRange[] ranges = getRanges(rivername, problems);
+        if (ranges == null)
+            return null;
+
+        for (final CalRange range : ranges) {
+            if (range.isSoundingYearInRange(soundingYear))
+                return new DateRange(range.getStartTimeQuery(), range.getEndTimeQuery());
+        }
+
+        // Message for admin, not translated
+        final File file = TsvHelper.makeFile2(CONFIG_FILE, rivername);
+        final String message = "Die angegebene d50-Sohlkorndurchmesser Konfigurationsdatei enthält keinen gültigen Bereich für das konfigurierte Peiljahr."; //$NON-NLS-1$
+        problems.addProblem("sinfo.bedqualityd50config.configfile.loaderror", file.getPath(), message);
+        return null;
+    }
+
+    private CalRange[] getRanges(final String rivername, final Calculation problems) {
+
+        if (this.cache.containsKey(rivername))
+            return this.cache.get(rivername);
+
+        final CalRange[] ranges = loadRanges(rivername, problems);
+        if (ranges == null) {
+            /* do not cache so we always get the problem message again */
             return null;
         }
-        return this.cache.get(cacheKey);
+
+        this.cache.put(rivername, ranges);
+        return ranges;
+    }
+
+    private CalRange[] loadRanges(final String rivername, final Calculation problems) {
+        final File file = TsvHelper.makeFile2(CONFIG_FILE, rivername);
+        final File fileCheck = TsvHelper.checkFile(file);
+        if (fileCheck == null)
+            return new CalRange[] { new CalRange(null, null, null, null) }; // automatically dateRange min/max will be taken
+
+        try {
+            final List<String[]> results = TsvHelper.readTsv(file, 4);
+
+            final Collection<CalRange> ranges = new ArrayList<>(results.size());
+
+            for (final String[] line : results)
+                ranges.add(new CalRange(parseInput(line[0]), parseInput(line[1]), parseInput(line[2]), parseInput(line[3])));
+
+            return ranges.toArray(new CalRange[ranges.size()]);
+        }
+        catch (final TsvReaderException | IOException | BedQualityParseException e) {
+            problems.addProblem("sinfo.bedqualityd50config.configfile.loaderror", file.getPath(), e.getLocalizedMessage());
+            return null;
+        }
     }
 
     private static Integer parseInput(final String raw) throws BedQualityParseException {
+
         final String value = raw.trim();
         if (value.toUpperCase().equals("MIN") || value.toUpperCase().equals("MAX"))
             return null;
+
         try {
-
             return Integer.valueOf(value);
         }
         catch (final NumberFormatException e) {
@@ -108,8 +130,6 @@
         private final long startTimeQuery;
         private final long endTimeQuery;
 
-        private final static Calendar cal = Calendar.getInstance();
-
         public Date getStartTimeQuery() {
             return new Date(this.startTimeQuery);
         }
@@ -126,7 +146,8 @@
             this.endTimeQuery = (endYearQuery != null) ? getLongValForYear(endYearQuery, 11, 31) : BedQualityD50KmValueFinder.MAX_DATE.getTime();
         }
 
-        private long getLongValForYear(final int year, final int month0based, final int dayOfMonth) {
+        private static long getLongValForYear(final int year, final int month0based, final int dayOfMonth) {
+            final Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT+1"));
             cal.clear();
             cal.set(year, month0based, dayOfMonth);
 
@@ -134,12 +155,8 @@
         }
 
         public boolean isSoundingYearInRange(final int soundingYear) {
-            cal.clear();
 
-            cal.set(soundingYear, 5, 5); // random date in the middle of the year
-
-            final Long time = cal.getTimeInMillis();
-
+            final long time = getLongValForYear(soundingYear, 5, 5); // random date in the middle of the year
             if (time > this.startTimeSounding && time < this.endTimeSounding)
                 return true;
 

http://dive4elements.wald.intevation.org