changeset 9211:aca5a7a57a3a

SINFO-TKH: definition der standard sohlhöhen jetzt mit Gültigkeitsstrecke. Definitionsdateien aufgeteilt in eine pro Gewässer.
author gernotbelger
date Tue, 03 Jul 2018 13:09:46 +0200
parents de55d9a94796
children 273e7b017bbe
files artifacts/doc/conf/sinfo_tkh_bedheights.properties artifacts/doc/conf/sinfo_tkh_sohlhoehen_Beispielfluss.properties artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/tkhstate/DefaultBedHeights.java artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/tkhstate/DefaultBedHeightsConfig.java artifacts/src/main/resources/messages.properties artifacts/src/main/resources/messages_de.properties backend/src/main/java/org/dive4elements/river/model/BedHeight.java
diffstat 7 files changed, 137 insertions(+), 49 deletions(-) [+]
line wrap: on
line diff
--- a/artifacts/doc/conf/sinfo_tkh_bedheights.properties	Tue Jul 03 13:00:56 2018 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,9 +0,0 @@
-# Konfigurationsdatei f\u00fcr die in der Berechnungsart SINFO-Transportk\u00f6rperh\u00f6hen zu verwendenden Sohlh\u00f6hen.
-# Die Datei ist im Charset 'ISO-8859-1' zu encodieren.
-# Jede Zeile entspricht: <gew\u00e4ssername> = <sohlh\u00f6he1>, <Sohlh\u00f6he2>, ...
-# Alle Daten beziehen sich auf die FLYS Datenbank (d4e Datenbank)
-# der <gew\u00e4ssername> entspricht dem Feld 'name' der Tabelle 'rivers'
-# die Sohlh\u00f6hen dem Feld 'description' aus der Tabelle 'bed_heights'
-# Leerzeichen im Ge\u00e4ssernamen m\u00fcssen mit u0020 kodiert werden.
-Beispielfluss=DGM-2004_Epoche-2-SOBEK  
-Beispiel\u0020fluss=DGM-2004_Epoche-2-SOBEK
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/artifacts/doc/conf/sinfo_tkh_sohlhoehen_Beispielfluss.properties	Tue Jul 03 13:09:46 2018 +0200
@@ -0,0 +1,15 @@
+# Konfigurationsdatei f\u00fcr die in der Berechnungsart SINFO-Transportk\u00f6rperh\u00f6hen zu verwendenden Sohlh\u00f6hen.
+# Je Gew\u00e4sser ist eine Datei mit Namen "sinfo_tkh_sohlhoehen_<Gew\u00e4ssername>.properties" anzulegen. Gro\u00df-/Kleinschriebung beim Gew\u00e4ssernamen ist zu beachten!
+# Die Datei ist im Charset 'ISO-8859-1' zu kodieren.
+
+# Die Datei definiert die Standardm\u00e4\u00dfig zu verwendenden Sohlh\u00f6hen und deren G\u00fcltigkeitsbereiche.
+# Pro Sohlh\u00f6he ist eine Zeile folgender Form anzulegen:
+# <Sohlh\u00f6he> = <von km>;<bis km>
+
+# 'Sohlh\u00f6he' entspriche dem Feld 'description' in der Tabelle 'bed_height' der D4E Datenbank.  
+# 'von km' entpsricht dem Start des G\u00fcltigkeitsbereichs in km
+# 'bis km' entpsricht dem Ende des G\u00fcltigkeitsbereichs in km
+
+# Der G\u00fcltigkeitsbereich schr\u00e4nkt den zu verwendenden Daten bereich der Sohlh\u00f6he f\u00fcr die TKH Berechnung ein, die Daten in der Datenbank k\u00f6nnen einen gr\u00f6\u00dferen G\u00fcltigkeitsbereich besitzen.
+# Leerzeichen im Namen der Sohlh\u00f6he m\u00fcssen mit u0020 kodiert werden.
+DGM-2004_Epoche-2-SOBEK = 0.0;182.4
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/tkhstate/DefaultBedHeights.java	Tue Jul 03 13:00:56 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/tkhstate/DefaultBedHeights.java	Tue Jul 03 13:09:46 2018 +0200
@@ -10,17 +10,13 @@
 package org.dive4elements.river.artifacts.sinfo.tkhstate;
 
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
-import java.util.Properties;
 
-import org.apache.commons.lang.ArrayUtils;
-import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang.math.NumberRange;
-import org.dive4elements.artifacts.common.utils.Config;
 import org.dive4elements.river.artifacts.model.Calculation;
+import org.dive4elements.river.artifacts.sinfo.tkhstate.DefaultBedHeightsConfig.DefaultBedHeight;
 import org.dive4elements.river.model.BedHeight;
 import org.dive4elements.river.model.Range;
 import org.dive4elements.river.model.River;
@@ -31,7 +27,7 @@
  * @author Gernot Belger
  */
 final class DefaultBedHeights {
-    private static final String CONFIG_FILE = "sinfo_tkh_bedheights.properties";
+
     private final River river;
 
     public DefaultBedHeights(final River river) {
@@ -39,9 +35,9 @@
     }
 
     public List<BedHeight> getBedHeights(final Calculation problems) {
-        final Collection<String> bedHeightNames = loadBedHeightDefaultsForRiver(this.river, problems);
+        final Collection<DefaultBedHeight> defaults = DefaultBedHeightsConfig.getDefaults(this.river, problems);
 
-        final List<BedHeight> defaultBedHeights = loadBedHeightsByName(this.river, bedHeightNames, problems);
+        final List<BedHeight> defaultBedHeights = loadBedHeightsByName(this.river, defaults, problems);
         if (defaultBedHeights.isEmpty()) {
             problems.addProblem("sinfo.bedheightsfinder.nobedheightsforriver", this.river.getName());
             return Collections.emptyList();
@@ -56,9 +52,9 @@
             final Range range = bedHeight.getRange();
             final NumberRange bedRange = new NumberRange(range.getA(), range.getB());
 
-            if (overlapsRange(bedRange, defaultBedHeights, i + 1)) {
+            if (overlapsRange(bedRange, defaultBedHeights, i + 1))
                 problems.addProblem("sinfo.bedheightsfinder.overlappingrange", bedHeight.getDescription());
-            } else
+            else
                 result.add(bedHeight);
         }
 
@@ -78,41 +74,25 @@
         return result;
     }
 
-    private static Collection<String> loadBedHeightDefaultsForRiver(final River river, final Calculation problems) {
-
-        try {
-            final Properties properties = Config.loadProperties(CONFIG_FILE);
-            final String value = properties.getProperty(river.getName());
-            final String[] split = StringUtils.split(StringUtils.trim(value), ',');
-            if (ArrayUtils.isEmpty(split)) {
-                problems.addProblem("sinfo.bedheightsfinder.configfile.missingriver", CONFIG_FILE, river.getName());
-                return Collections.emptyList();
-            }
 
-            return Arrays.asList(split);
-        }
-        catch (final Exception e) {
-            e.printStackTrace();
-            problems.addProblem("sinfo.bedheightsfinder.configfile.loaderror", CONFIG_FILE, e.getMessage());
-            return Collections.emptyList();
-        }
-    }
+    private static List<BedHeight> loadBedHeightsByName(final River river, final Collection<DefaultBedHeight> defaults, final Calculation problems) {
 
-    private static List<BedHeight> loadBedHeightsByName(final River river, final Collection<String> bedHeightNames, final Calculation problems) {
-
-        final List<BedHeight> bedHeights = new ArrayList<>(bedHeightNames.size());
+        final List<BedHeight> bedHeights = new ArrayList<>(defaults.size());
 
-        for (final String name : bedHeightNames) {
+        for (final DefaultBedHeight heightDefault : defaults) {
+
+            final String description = heightDefault.description;
             try {
-                final BedHeight bedHeight = BedHeight.getBedHeightByDescription(river, name);
+
+                final BedHeight bedHeight = BedHeight.getBedHeightByDescription(river, description, heightDefault.startKm, heightDefault.endKm);
                 if (bedHeight == null)
-                    problems.addProblem("sinfo.bedheightsfinder.missingdescription", river.getName(), name);
+                    problems.addProblem("sinfo.bedheightsfinder.missingdescription", river.getName(), description);
                 else
                     bedHeights.add(bedHeight);
             }
             catch (final Exception e) {
                 e.printStackTrace();
-                problems.addProblem("sinfo.bedheightsfinder.missingdescription", river.getName(), name);
+                problems.addProblem("sinfo.bedheightsfinder.missingdescription", river.getName(), description);
             }
         }
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/tkhstate/DefaultBedHeightsConfig.java	Tue Jul 03 13:09:46 2018 +0200
@@ -0,0 +1,104 @@
+/** 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.tkhstate;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+
+import org.apache.commons.lang.StringUtils;
+import org.dive4elements.artifacts.common.utils.Config;
+import org.dive4elements.river.artifacts.model.Calculation;
+import org.dive4elements.river.model.River;
+
+/**
+ * Represents the contents of the 'bedheights.properties' files.
+ *
+ * @author Gernot Belger
+ */
+final class DefaultBedHeightsConfig {
+
+    private static final String CONFIG_FILE = "sinfo_tkh_sohlhoehen_%s.properties";
+
+
+    public static class DefaultBedHeight {
+
+        public final String description;
+        public final double startKm;
+        public final double endKm;
+
+        public DefaultBedHeight(final String description, final double startKm, final double endKm) {
+            this.description = description;
+            this.startKm = startKm;
+            this.endKm = endKm;
+        }
+    }
+
+    private static DefaultBedHeightsConfig INSTANCE = new DefaultBedHeightsConfig();
+
+    public static synchronized Collection<DefaultBedHeight> getDefaults(final River river, final Calculation problems) {
+        return INSTANCE.getBedHeightDefaultsForRiver(river, problems);
+    }
+
+    private final Map<String, Collection<DefaultBedHeight>> cache = new HashMap<>();
+
+    private DefaultBedHeightsConfig() {
+    }
+
+
+    private synchronized Collection<DefaultBedHeight> getBedHeightDefaultsForRiver(final River river, final Calculation problems) {
+
+        final String rivername = river.getName();
+        if (!this.cache.containsKey(rivername)) {
+            final Collection<DefaultBedHeight> newDefaults = loadBedHeightDefaultsForRiver(river, problems);
+            this.cache.put(rivername, null);
+            return newDefaults;
+        }
+
+        return this.cache.get(rivername);
+    }
+
+    private static Collection<DefaultBedHeight> loadBedHeightDefaultsForRiver(final River river, final Calculation problems) {
+
+        try {
+            final String rivername = river.getName();
+            final String filename = String.format(CONFIG_FILE, rivername);
+
+            final Properties properties = Config.loadProperties(filename);
+
+            final Set<String> keys = properties.stringPropertyNames();
+
+            final Collection<DefaultBedHeight> defaults = new ArrayList<>(keys.size());
+
+            for (final String key : keys) {
+
+                final String value = properties.getProperty(key);
+
+                final String[] split = StringUtils.split(StringUtils.trim(value), ';');
+
+                final double startKm = Double.parseDouble(split[0]);
+                final double endKm = Double.parseDouble(split[1]);
+
+                defaults.add(new DefaultBedHeight(key, startKm, endKm));
+            }
+
+            return defaults;
+        }
+        catch (final Exception e) {
+            e.printStackTrace();
+            problems.addProblem("sinfo.bedheightsfinder.configfile.loaderror", CONFIG_FILE, e.getMessage());
+            return Collections.emptyList();
+        }
+    }
+}
\ No newline at end of file
--- a/artifacts/src/main/resources/messages.properties	Tue Jul 03 13:00:56 2018 +0200
+++ b/artifacts/src/main/resources/messages.properties	Tue Jul 03 13:09:46 2018 +0200
@@ -802,7 +802,6 @@
 sinfo.bedheightsfinder.badrange = Invalid range for bed heights {0}.
 sinfo.bedheightsfinder.overlappingrange = Range of bed height {0} overlaps with other ranges.
 sinfo.bedheightsfinder.missingdescription = River {0} has no bed heights with description {1}
-sinfo.bedheightsfinder.configfile.missingriver = River not defined in config file ''{0}'': {1}
 sinfo.bedheightsfinder.configfile.loaderror = Failed to load config file ''{0}'': {1}
 sinfo.bedheightsfinder.notfound = Failed to access sounding with id ''{0}''
 sinfo.bedheightsfinder.empty = The bed heights do not contain any values for the selected calculation range
--- a/artifacts/src/main/resources/messages_de.properties	Tue Jul 03 13:00:56 2018 +0200
+++ b/artifacts/src/main/resources/messages_de.properties	Tue Jul 03 13:09:46 2018 +0200
@@ -802,7 +802,6 @@
 sinfo.bedheightsfinder.badrange = Ung\u00fcltige -range- f\u00fcr Sohlh\u00f6hen {0}.
 sinfo.bedheightsfinder.overlappingrange = -Range- der Sohlh\u00f6hen {0} \u00fcberlappt andere Sohlh\u00f6hen.
 sinfo.bedheightsfinder.missingdescription = Gew\u00e4sser {0} hat keine Sohlh\u00f6he mit Bezeichnung {1}
-sinfo.bedheightsfinder.configfile.missingriver = Gew\u00e4sser  {1} ist in Konfigurationsdatei {0} nicht definiert.
 sinfo.bedheightsfinder.configfile.loaderror = Fehler beim Laden der Konfigurationsdatei ''{0}'': {1}
 sinfo.bedheightsfinder.notfound = Keine Sohlh\u00f6he mit id ''{0}'' vorhanden
 sinfo.bedheightsfinder.empty = Die Sohlh\u00f6hen enthalten keine Werte f\u00fcr die gew\u00e4hlte Berechnungsstrecke 
--- a/backend/src/main/java/org/dive4elements/river/model/BedHeight.java	Tue Jul 03 13:00:56 2018 +0200
+++ b/backend/src/main/java/org/dive4elements/river/model/BedHeight.java	Tue Jul 03 13:09:46 2018 +0200
@@ -243,7 +243,8 @@
         return ((singles != null) && !singles.isEmpty()) ? singles.get(0) : null;
     }
 
-    public static BedHeight getBedHeightByDescription(final River river, final String description) {
+    // TODO Do km range filtering in SQL statement
+    public static BedHeight getBedHeightByDescription(final River river, final String description, final double startKm, final double endKm) {
 
         final Session session = SessionHolder.HOLDER.get();
 
@@ -255,5 +256,4 @@
 
         return ((singles != null) && !singles.isEmpty()) ? singles.get(0) : null;
     }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
\ No newline at end of file
+}
\ No newline at end of file

http://dive4elements.wald.intevation.org