# HG changeset patch # User gernotbelger # Date 1530616186 -7200 # Node ID aca5a7a57a3ae24763cc54c3a8a08eadfaedd501 # Parent de55d9a94796cf116e2340c3ee6c823148c2d4db SINFO-TKH: definition der standard sohlhöhen jetzt mit Gültigkeitsstrecke. Definitionsdateien aufgeteilt in eine pro Gewässer. diff -r de55d9a94796 -r aca5a7a57a3a artifacts/doc/conf/sinfo_tkh_bedheights.properties --- 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: = , , ... -# Alle Daten beziehen sich auf die FLYS Datenbank (d4e Datenbank) -# der 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 diff -r de55d9a94796 -r aca5a7a57a3a artifacts/doc/conf/sinfo_tkh_sohlhoehen_Beispielfluss.properties --- /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_.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' 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 diff -r de55d9a94796 -r aca5a7a57a3a artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/tkhstate/DefaultBedHeights.java --- 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 getBedHeights(final Calculation problems) { - final Collection bedHeightNames = loadBedHeightDefaultsForRiver(this.river, problems); + final Collection defaults = DefaultBedHeightsConfig.getDefaults(this.river, problems); - final List defaultBedHeights = loadBedHeightsByName(this.river, bedHeightNames, problems); + final List 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 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 loadBedHeightsByName(final River river, final Collection defaults, final Calculation problems) { - private static List loadBedHeightsByName(final River river, final Collection bedHeightNames, final Calculation problems) { - - final List bedHeights = new ArrayList<>(bedHeightNames.size()); + final List 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); } } diff -r de55d9a94796 -r aca5a7a57a3a artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/tkhstate/DefaultBedHeightsConfig.java --- /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 getDefaults(final River river, final Calculation problems) { + return INSTANCE.getBedHeightDefaultsForRiver(river, problems); + } + + private final Map> cache = new HashMap<>(); + + private DefaultBedHeightsConfig() { + } + + + private synchronized Collection getBedHeightDefaultsForRiver(final River river, final Calculation problems) { + + final String rivername = river.getName(); + if (!this.cache.containsKey(rivername)) { + final Collection newDefaults = loadBedHeightDefaultsForRiver(river, problems); + this.cache.put(rivername, null); + return newDefaults; + } + + return this.cache.get(rivername); + } + + private static Collection 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 keys = properties.stringPropertyNames(); + + final Collection 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 diff -r de55d9a94796 -r aca5a7a57a3a artifacts/src/main/resources/messages.properties --- 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 diff -r de55d9a94796 -r aca5a7a57a3a artifacts/src/main/resources/messages_de.properties --- 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 diff -r de55d9a94796 -r aca5a7a57a3a backend/src/main/java/org/dive4elements/river/model/BedHeight.java --- 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