Mercurial > dive4elements > river
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 } |