gernotbelger@9211: /** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde gernotbelger@9211: * Software engineering by gernotbelger@9211: * Björnsen Beratende Ingenieure GmbH gernotbelger@9211: * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt gernotbelger@9211: * gernotbelger@9211: * This file is Free Software under the GNU AGPL (>=v3) gernotbelger@9211: * and comes with ABSOLUTELY NO WARRANTY! Check out the gernotbelger@9211: * documentation coming with Dive4Elements River for details. gernotbelger@9211: */ gernotbelger@9211: package org.dive4elements.river.artifacts.sinfo.tkhstate; gernotbelger@9211: gernotbelger@9211: import java.util.ArrayList; gernotbelger@9211: import java.util.Collection; gernotbelger@9211: import java.util.Collections; gernotbelger@9211: import java.util.HashMap; gernotbelger@9211: import java.util.Map; gernotbelger@9211: import java.util.Properties; gernotbelger@9211: import java.util.Set; gernotbelger@9211: gernotbelger@9211: import org.apache.commons.lang.StringUtils; gernotbelger@9211: import org.dive4elements.artifacts.common.utils.Config; gernotbelger@9211: import org.dive4elements.river.artifacts.model.Calculation; gernotbelger@9211: import org.dive4elements.river.model.River; gernotbelger@9211: gernotbelger@9211: /** gernotbelger@9211: * Represents the contents of the 'bedheights.properties' files. gernotbelger@9211: * gernotbelger@9211: * @author Gernot Belger gernotbelger@9211: */ gernotbelger@9211: final class DefaultBedHeightsConfig { gernotbelger@9211: gernotbelger@9211: private static final String CONFIG_FILE = "sinfo_tkh_sohlhoehen_%s.properties"; gernotbelger@9211: gernotbelger@9211: gernotbelger@9211: public static class DefaultBedHeight { gernotbelger@9211: gernotbelger@9211: public final String description; gernotbelger@9211: public final double startKm; gernotbelger@9211: public final double endKm; gernotbelger@9211: gernotbelger@9211: public DefaultBedHeight(final String description, final double startKm, final double endKm) { gernotbelger@9211: this.description = description; gernotbelger@9211: this.startKm = startKm; gernotbelger@9211: this.endKm = endKm; gernotbelger@9211: } gernotbelger@9211: } gernotbelger@9211: gernotbelger@9211: private static DefaultBedHeightsConfig INSTANCE = new DefaultBedHeightsConfig(); gernotbelger@9211: gernotbelger@9211: public static synchronized Collection getDefaults(final River river, final Calculation problems) { gernotbelger@9211: return INSTANCE.getBedHeightDefaultsForRiver(river, problems); gernotbelger@9211: } gernotbelger@9211: gernotbelger@9211: private final Map> cache = new HashMap<>(); gernotbelger@9211: gernotbelger@9211: private DefaultBedHeightsConfig() { gernotbelger@9211: } gernotbelger@9211: gernotbelger@9211: gernotbelger@9211: private synchronized Collection getBedHeightDefaultsForRiver(final River river, final Calculation problems) { gernotbelger@9211: gernotbelger@9211: final String rivername = river.getName(); gernotbelger@9211: if (!this.cache.containsKey(rivername)) { gernotbelger@9211: final Collection newDefaults = loadBedHeightDefaultsForRiver(river, problems); gernotbelger@9211: this.cache.put(rivername, null); gernotbelger@9211: return newDefaults; gernotbelger@9211: } gernotbelger@9211: gernotbelger@9211: return this.cache.get(rivername); gernotbelger@9211: } gernotbelger@9211: gernotbelger@9211: private static Collection loadBedHeightDefaultsForRiver(final River river, final Calculation problems) { gernotbelger@9211: gernotbelger@9211: try { gernotbelger@9211: final String rivername = river.getName(); gernotbelger@9211: final String filename = String.format(CONFIG_FILE, rivername); gernotbelger@9211: gernotbelger@9211: final Properties properties = Config.loadProperties(filename); gernotbelger@9211: gernotbelger@9211: final Set keys = properties.stringPropertyNames(); gernotbelger@9211: gernotbelger@9211: final Collection defaults = new ArrayList<>(keys.size()); gernotbelger@9211: gernotbelger@9211: for (final String key : keys) { gernotbelger@9211: gernotbelger@9211: final String value = properties.getProperty(key); gernotbelger@9211: gernotbelger@9211: final String[] split = StringUtils.split(StringUtils.trim(value), ';'); gernotbelger@9211: gernotbelger@9211: final double startKm = Double.parseDouble(split[0]); gernotbelger@9211: final double endKm = Double.parseDouble(split[1]); gernotbelger@9211: gernotbelger@9211: defaults.add(new DefaultBedHeight(key, startKm, endKm)); gernotbelger@9211: } gernotbelger@9211: gernotbelger@9211: return defaults; gernotbelger@9211: } gernotbelger@9211: catch (final Exception e) { gernotbelger@9211: e.printStackTrace(); gernotbelger@9211: problems.addProblem("sinfo.bedheightsfinder.configfile.loaderror", CONFIG_FILE, e.getMessage()); gernotbelger@9211: return Collections.emptyList(); gernotbelger@9211: } gernotbelger@9211: } gernotbelger@9211: }