comparison artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/tkhstate/DefaultBedHeights.java @ 8942:11bf13cf0463

Minor changes to tkh calculation. Loading default bed heights form config file.
author gernotbelger
date Fri, 09 Mar 2018 18:47:06 +0100
parents
children fb976ea01463
comparison
equal deleted inserted replaced
8941:a9950a3a71e5 8942:11bf13cf0463
1 /** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde
2 * Software engineering by
3 * Björnsen Beratende Ingenieure GmbH
4 * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt
5 *
6 * This file is Free Software under the GNU AGPL (>=v3)
7 * and comes with ABSOLUTELY NO WARRANTY! Check out the
8 * documentation coming with Dive4Elements River for details.
9 */
10 package org.dive4elements.river.artifacts.sinfo.tkhstate;
11
12 import java.io.File;
13 import java.io.IOException;
14 import java.io.InputStreamReader;
15 import java.nio.charset.StandardCharsets;
16 import java.nio.file.Files;
17 import java.util.ArrayList;
18 import java.util.Arrays;
19 import java.util.Collection;
20 import java.util.Collections;
21 import java.util.List;
22 import java.util.Properties;
23
24 import org.apache.commons.lang.ArrayUtils;
25 import org.apache.commons.lang.StringUtils;
26 import org.apache.commons.lang.math.NumberRange;
27 import org.dive4elements.artifacts.common.utils.Config;
28 import org.dive4elements.river.artifacts.model.Calculation;
29 import org.dive4elements.river.model.BedHeight;
30 import org.dive4elements.river.model.Range;
31 import org.dive4elements.river.model.River;
32
33 /**
34 * This class knows how to find the default bed heights defined for tkh calculation
35 *
36 * @author Gernot Belger
37 */
38 final class DefaultBedHeights {
39 private static final String CONFIG_FILE = "sinfo_tkh_bedheights.properties";
40 private final River river;
41
42 public DefaultBedHeights(final River river) {
43 this.river = river;
44 }
45
46 public List<BedHeight> getBedHeights(final Calculation problems) {
47 final Collection<String> bedHeightNames = loadBedHeightDefaultsForRiver(this.river, problems);
48
49 final List<BedHeight> defaultBedHeights = loadBedHeightsByName(this.river, bedHeightNames, problems);
50
51 final List<BedHeight> validBedHeights = new ArrayList<>(defaultBedHeights.size());
52
53 // REMARK: check for bad ranges because db schema allow for incomplete ranges, and ignore if this is the case
54 for (final BedHeight bedHeight : defaultBedHeights) {
55
56 final Range range = bedHeight.getRange();
57
58 if (range.getA() == null || range.getB() == null)
59 problems.addProblem("sinfo.bedheightsfinder.badrange", bedHeight.getDescription());
60 else
61 validBedHeights.add(bedHeight);
62 }
63
64 /* check for overlapping ranges, N2-search, but we expect only have small numbers of bed heights */
65 final List<BedHeight> result = new ArrayList<>(defaultBedHeights.size());
66
67 for (int i = 0; i < defaultBedHeights.size(); i++) {
68 final BedHeight bedHeight = validBedHeights.get(i);
69
70 final Range range = bedHeight.getRange();
71 final NumberRange bedRange = new NumberRange(range.getA(), range.getB());
72
73 if (overlapsRange(bedRange, validBedHeights, i + 1)) {
74 problems.addProblem("sinfo.bedheightsfinder.overlappingrange", bedHeight.getDescription());
75 } else
76 result.add(bedHeight);
77 }
78
79 return result;
80 }
81
82 private static Collection<String> loadBedHeightDefaultsForRiver(final River river, final Calculation problems) {
83 final File configDir = Config.getConfigDirectory();
84 final File configFile = new File(configDir, CONFIG_FILE);
85
86 final Properties properties = new Properties();
87 try (final InputStreamReader reader = new InputStreamReader(Files.newInputStream(configFile.toPath()), StandardCharsets.ISO_8859_1)) {
88 properties.load(reader);
89
90 final String value = properties.getProperty(river.getName());
91 final String[] split = StringUtils.split(StringUtils.trim(value), ',');
92 if (ArrayUtils.isEmpty(split)) {
93 problems.addProblem("sinfo.bedheightsfinder.configfile.missingriver", CONFIG_FILE, river.getName());
94 return Collections.emptyList();
95 }
96
97 return Arrays.asList(split);
98 }
99 catch (final IOException e) {
100 e.printStackTrace();
101 problems.addProblem("sinfo.bedheightsfinder.configfile.loaderror", CONFIG_FILE, e.getMessage());
102 return Collections.emptyList();
103 }
104 }
105
106 private static List<BedHeight> loadBedHeightsByName(final River shouldBeRiver, final Collection<String> bedHeightNames, final Calculation problems) {
107
108 final List<BedHeight> bedHeights = new ArrayList<>(bedHeightNames.size());
109
110 for (final String name : bedHeightNames) {
111 try {
112 final BedHeight bedHeight = BedHeight.getBedHeightByDescription(name);
113 if (bedHeight == null)
114 problems.addProblem("sinfo.bedheightsfinder.missingdescription", name);
115 else {
116 final River river = bedHeight.getRiver();
117 if (!shouldBeRiver.getId().equals(river.getId()))
118 problems.addProblem("sinfo.bedheightsfinder.wrongriver", name, shouldBeRiver.getName());
119 else
120 bedHeights.add(bedHeight);
121 }
122 }
123 catch (final Exception e) {
124 e.printStackTrace();
125 problems.addProblem("sinfo.bedheightsfinder.missingdescription", name);
126 }
127 }
128
129 return bedHeights;
130 }
131
132 private static boolean overlapsRange(final NumberRange bedRange, final List<BedHeight> result, final int startIndex) {
133
134 for (int i = startIndex; i < result.size(); i++) {
135
136 final BedHeight compareBed = result.get(i);
137 final Range range = compareBed.getRange();
138 final NumberRange compareRange = new NumberRange(range.getA(), range.getB());
139
140 if (compareRange.overlapsRange(bedRange))
141 return true;
142 }
143
144 return false;
145 }
146 }

http://dive4elements.wald.intevation.org