diff artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/tkhstate/BedQualityD50TimeRangeConfig.java @ 9481:787fc085459b

TSV introduced; uinfo.inundationWMS-Config
author gernotbelger
date Wed, 12 Sep 2018 10:55:09 +0200
parents 6acd22e86951
children 23d97d60b889
line wrap: on
line diff
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/tkhstate/BedQualityD50TimeRangeConfig.java	Mon Sep 10 17:06:23 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/tkhstate/BedQualityD50TimeRangeConfig.java	Wed Sep 12 10:55:09 2018 +0200
@@ -9,17 +9,17 @@
  */
 package org.dive4elements.river.artifacts.sinfo.tkhstate;
 
-import java.io.BufferedReader;
 import java.io.File;
-import java.io.FileReader;
+import java.io.IOException;
 import java.util.Calendar;
 import java.util.Date;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
-import org.dive4elements.artifacts.common.utils.Config;
 import org.dive4elements.river.artifacts.model.Calculation;
 import org.dive4elements.river.artifacts.model.DateRange;
+import org.dive4elements.river.artifacts.sinfo.tkhstate.TsvHelper.TsvReaderException;
 import org.dive4elements.river.model.River;
 
 /**
@@ -29,75 +29,70 @@
  */
 public final class BedQualityD50TimeRangeConfig {
 
-    private static final String CONFIG_FILE = "d50_sohlkorndurchmesser_%s.properties";
+    private static final String CONFIG_FILE = "d50_sohlkorndurchmesser_%s.tsv";
 
     private final Map<String, DateRange> cache = new HashMap<>();
 
     private static BedQualityD50TimeRangeConfig INSTANCE = new BedQualityD50TimeRangeConfig();
 
-    public static synchronized DateRange getDefaults(final River river, final int soundingYear, final Calculation problems) {
+    public static class BedQualityParseException extends Exception {
+
+        private static final long serialVersionUID = 1L;
+
+        private BedQualityParseException(final String string) {
+            super(string);
+        }
+    }
+
+    public static synchronized DateRange getDefaults(final River river, final int soundingYear, final Calculation problems)
+            throws BedQualityParseException, IOException, TsvReaderException {
         return INSTANCE.getBedHeightDefaultsForRiver(river, soundingYear, problems);
     }
 
-    private synchronized DateRange getBedHeightDefaultsForRiver(final River river, final int soundingYear, final Calculation 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 DateRange range = loadBedHeightDefaultsForRiver(river, soundingYear, problems);
-            this.cache.put(cacheKey, range);
-            return range;
+            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
+
+            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);
+
+                    }
+                }
+            }
+            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.");
+            return null;
         }
         return this.cache.get(cacheKey);
     }
 
-    private static DateRange loadBedHeightDefaultsForRiver(final River river, final int soundingYear, final Calculation problems) {
-        final String rivername = river.getName();
-        final File configDir = Config.getModulesConfigDirectory();
-
-        final String filename = String.format(CONFIG_FILE, rivername);
-
-        final File file = new File(configDir, filename);
-
-        if (!file.canRead() && !file.isFile()) {
-            return null; // no config-file specified or spelling mistake etc. (not necessarily an error)
-        }
-
-        try (final BufferedReader reader = new BufferedReader(new FileReader(file))) {
-
-            String line;
-            while ((line = reader.readLine()) != null) {
-                if ((line = line.trim()).length() == 0 || line.startsWith("#")) {
-                    continue;
-                }
-
-                final String[] parts = line.split(";");
-
-                if (parts.length != 4) {
-                    throw new Exception("Invalid number of Tokens; should be 4!");
-                }
-
-                final CalRange range = new CalRange(parseInput(parts[0]), parseInput(parts[1]), parseInput(parts[2]), parseInput(parts[3]));
-                if (range.isSoundingYearInRange(soundingYear)) {
-                    return new DateRange(range.getStartTimeQuery(), range.getEndTimeQuery());
-                }
-            }
-            return null;
-        }
-        catch (final Exception e) {
-            e.printStackTrace();
-            problems.addProblem("sinfo.bedqualityd50config.configfile.loaderror", CONFIG_FILE, e.getMessage());
-            return null;
-        }
-    }
-
-    private static Integer parseInput(final String value) throws Exception {
+    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) {
-            throw new Exception("Invalid input; should be year ('yyyy') or 'MIN' or 'MAX'");
+            throw new BedQualityParseException("Invalid input; should be year ('yyyy') or 'MIN' or 'MAX'");
         }
     }
 
@@ -120,12 +115,12 @@
 
         private CalRange(final Integer startYearSounding, final Integer endYearSounding, final Integer startYearQuery, final Integer endYearQuery) {
 
-            this.startTimeSounding = 1l;// (startYearSounding != null) ? getLongValForYear(startYearSounding, 0, 1) :
+            this.startTimeSounding = 1L;// (startYearSounding != null) ? getLongValForYear(startYearSounding, 0, 1) :
                                         // BedQualityD50KmValueFinder.MIN_DATE.getTime();
-            this.startTimeQuery = 1l;// (startYearQuery != null) ? getLongValForYear(startYearQuery, 0, 1) : BedQualityD50KmValueFinder.MIN_DATE.getTime();
-            this.endTimeSounding = 1l;// (endYearSounding != null) ? getLongValForYear(endYearSounding, 11, 31) :
+            this.startTimeQuery = 1L;// (startYearQuery != null) ? getLongValForYear(startYearQuery, 0, 1) : BedQualityD50KmValueFinder.MIN_DATE.getTime();
+            this.endTimeSounding = 1L;// (endYearSounding != null) ? getLongValForYear(endYearSounding, 11, 31) :
                                       // BedQualityD50KmValueFinder.MAX_DATE.getTime();
-            this.endTimeQuery = 1l; // (endYearQuery != null) ? getLongValForYear(endYearQuery, 11, 31) : BedQualityD50KmValueFinder.MAX_DATE.getTime();
+            this.endTimeQuery = 1L;// (endYearQuery != null) ? getLongValForYear(endYearQuery, 11, 31) : BedQualityD50KmValueFinder.MAX_DATE.getTime();
 
         }
 

http://dive4elements.wald.intevation.org