annotate artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/tkhstate/BedQualityD50TimeRangeConfig.java @ 9559:ba0561906f81

Uinfo inundation duration workflow (vegetation zones, scenario), wms-config changed
author gernotbelger
date Wed, 24 Oct 2018 18:40:38 +0200
parents 8e6b9cb9486a
children
rev   line source
9469
6acd22e86951 Improvements on Config-Files
gernotbelger
parents:
diff changeset
1 /** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde
6acd22e86951 Improvements on Config-Files
gernotbelger
parents:
diff changeset
2 * Software engineering by
6acd22e86951 Improvements on Config-Files
gernotbelger
parents:
diff changeset
3 * Björnsen Beratende Ingenieure GmbH
6acd22e86951 Improvements on Config-Files
gernotbelger
parents:
diff changeset
4 * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt
6acd22e86951 Improvements on Config-Files
gernotbelger
parents:
diff changeset
5 *
6acd22e86951 Improvements on Config-Files
gernotbelger
parents:
diff changeset
6 * This file is Free Software under the GNU AGPL (>=v3)
6acd22e86951 Improvements on Config-Files
gernotbelger
parents:
diff changeset
7 * and comes with ABSOLUTELY NO WARRANTY! Check out the
6acd22e86951 Improvements on Config-Files
gernotbelger
parents:
diff changeset
8 * documentation coming with Dive4Elements River for details.
6acd22e86951 Improvements on Config-Files
gernotbelger
parents:
diff changeset
9 */
6acd22e86951 Improvements on Config-Files
gernotbelger
parents:
diff changeset
10 package org.dive4elements.river.artifacts.sinfo.tkhstate;
6acd22e86951 Improvements on Config-Files
gernotbelger
parents:
diff changeset
11
6acd22e86951 Improvements on Config-Files
gernotbelger
parents:
diff changeset
12 import java.io.File;
9481
787fc085459b TSV introduced; uinfo.inundationWMS-Config
gernotbelger
parents: 9469
diff changeset
13 import java.io.IOException;
9532
8e6b9cb9486a Fixed BedQuality finder
gernotbelger
parents: 9522
diff changeset
14 import java.util.ArrayList;
9469
6acd22e86951 Improvements on Config-Files
gernotbelger
parents:
diff changeset
15 import java.util.Calendar;
9532
8e6b9cb9486a Fixed BedQuality finder
gernotbelger
parents: 9522
diff changeset
16 import java.util.Collection;
9469
6acd22e86951 Improvements on Config-Files
gernotbelger
parents:
diff changeset
17 import java.util.Date;
6acd22e86951 Improvements on Config-Files
gernotbelger
parents:
diff changeset
18 import java.util.HashMap;
9481
787fc085459b TSV introduced; uinfo.inundationWMS-Config
gernotbelger
parents: 9469
diff changeset
19 import java.util.List;
9469
6acd22e86951 Improvements on Config-Files
gernotbelger
parents:
diff changeset
20 import java.util.Map;
9532
8e6b9cb9486a Fixed BedQuality finder
gernotbelger
parents: 9522
diff changeset
21 import java.util.TimeZone;
9469
6acd22e86951 Improvements on Config-Files
gernotbelger
parents:
diff changeset
22
6acd22e86951 Improvements on Config-Files
gernotbelger
parents:
diff changeset
23 import org.dive4elements.river.artifacts.model.Calculation;
6acd22e86951 Improvements on Config-Files
gernotbelger
parents:
diff changeset
24 import org.dive4elements.river.artifacts.model.DateRange;
9522
23d97d60b889 Selection range of D50 values for tkh calculation can now be configured with a river specific table.
gernotbelger
parents: 9481
diff changeset
25 import org.dive4elements.river.artifacts.sinfo.tkhcalculation.BedQualityD50KmValueFinder;
9481
787fc085459b TSV introduced; uinfo.inundationWMS-Config
gernotbelger
parents: 9469
diff changeset
26 import org.dive4elements.river.artifacts.sinfo.tkhstate.TsvHelper.TsvReaderException;
9469
6acd22e86951 Improvements on Config-Files
gernotbelger
parents:
diff changeset
27 import org.dive4elements.river.model.River;
6acd22e86951 Improvements on Config-Files
gernotbelger
parents:
diff changeset
28
6acd22e86951 Improvements on Config-Files
gernotbelger
parents:
diff changeset
29 /**
6acd22e86951 Improvements on Config-Files
gernotbelger
parents:
diff changeset
30 * Represents the contents of the 'bedheights.properties' files.
6acd22e86951 Improvements on Config-Files
gernotbelger
parents:
diff changeset
31 *
6acd22e86951 Improvements on Config-Files
gernotbelger
parents:
diff changeset
32 * @author Gernot Belger
6acd22e86951 Improvements on Config-Files
gernotbelger
parents:
diff changeset
33 */
6acd22e86951 Improvements on Config-Files
gernotbelger
parents:
diff changeset
34 public final class BedQualityD50TimeRangeConfig {
6acd22e86951 Improvements on Config-Files
gernotbelger
parents:
diff changeset
35
9481
787fc085459b TSV introduced; uinfo.inundationWMS-Config
gernotbelger
parents: 9469
diff changeset
36 private static final String CONFIG_FILE = "d50_sohlkorndurchmesser_%s.tsv";
9469
6acd22e86951 Improvements on Config-Files
gernotbelger
parents:
diff changeset
37
9532
8e6b9cb9486a Fixed BedQuality finder
gernotbelger
parents: 9522
diff changeset
38 private final Map<String, CalRange[]> cache = new HashMap<>();
9469
6acd22e86951 Improvements on Config-Files
gernotbelger
parents:
diff changeset
39
6acd22e86951 Improvements on Config-Files
gernotbelger
parents:
diff changeset
40 private static BedQualityD50TimeRangeConfig INSTANCE = new BedQualityD50TimeRangeConfig();
6acd22e86951 Improvements on Config-Files
gernotbelger
parents:
diff changeset
41
9532
8e6b9cb9486a Fixed BedQuality finder
gernotbelger
parents: 9522
diff changeset
42 private static class BedQualityParseException extends Exception {
9481
787fc085459b TSV introduced; uinfo.inundationWMS-Config
gernotbelger
parents: 9469
diff changeset
43
787fc085459b TSV introduced; uinfo.inundationWMS-Config
gernotbelger
parents: 9469
diff changeset
44 private static final long serialVersionUID = 1L;
787fc085459b TSV introduced; uinfo.inundationWMS-Config
gernotbelger
parents: 9469
diff changeset
45
9532
8e6b9cb9486a Fixed BedQuality finder
gernotbelger
parents: 9522
diff changeset
46 public BedQualityParseException(final String message, final Throwable cause) {
9522
23d97d60b889 Selection range of D50 values for tkh calculation can now be configured with a river specific table.
gernotbelger
parents: 9481
diff changeset
47 super(message, cause);
9481
787fc085459b TSV introduced; uinfo.inundationWMS-Config
gernotbelger
parents: 9469
diff changeset
48 }
787fc085459b TSV introduced; uinfo.inundationWMS-Config
gernotbelger
parents: 9469
diff changeset
49 }
787fc085459b TSV introduced; uinfo.inundationWMS-Config
gernotbelger
parents: 9469
diff changeset
50
9532
8e6b9cb9486a Fixed BedQuality finder
gernotbelger
parents: 9522
diff changeset
51 public static synchronized DateRange getDefaults(final River river, final int soundingYear, final Calculation problems) {
9469
6acd22e86951 Improvements on Config-Files
gernotbelger
parents:
diff changeset
52 return INSTANCE.getBedHeightDefaultsForRiver(river, soundingYear, problems);
6acd22e86951 Improvements on Config-Files
gernotbelger
parents:
diff changeset
53 }
6acd22e86951 Improvements on Config-Files
gernotbelger
parents:
diff changeset
54
9532
8e6b9cb9486a Fixed BedQuality finder
gernotbelger
parents: 9522
diff changeset
55 private synchronized DateRange getBedHeightDefaultsForRiver(final River river, final int soundingYear, final Calculation problems) {
9481
787fc085459b TSV introduced; uinfo.inundationWMS-Config
gernotbelger
parents: 9469
diff changeset
56
9532
8e6b9cb9486a Fixed BedQuality finder
gernotbelger
parents: 9522
diff changeset
57 final String rivername = river.getName();
9481
787fc085459b TSV introduced; uinfo.inundationWMS-Config
gernotbelger
parents: 9469
diff changeset
58
9532
8e6b9cb9486a Fixed BedQuality finder
gernotbelger
parents: 9522
diff changeset
59 final CalRange[] ranges = getRanges(rivername, problems);
8e6b9cb9486a Fixed BedQuality finder
gernotbelger
parents: 9522
diff changeset
60 if (ranges == null)
8e6b9cb9486a Fixed BedQuality finder
gernotbelger
parents: 9522
diff changeset
61 return null;
8e6b9cb9486a Fixed BedQuality finder
gernotbelger
parents: 9522
diff changeset
62
8e6b9cb9486a Fixed BedQuality finder
gernotbelger
parents: 9522
diff changeset
63 for (final CalRange range : ranges) {
8e6b9cb9486a Fixed BedQuality finder
gernotbelger
parents: 9522
diff changeset
64 if (range.isSoundingYearInRange(soundingYear))
8e6b9cb9486a Fixed BedQuality finder
gernotbelger
parents: 9522
diff changeset
65 return new DateRange(range.getStartTimeQuery(), range.getEndTimeQuery());
8e6b9cb9486a Fixed BedQuality finder
gernotbelger
parents: 9522
diff changeset
66 }
8e6b9cb9486a Fixed BedQuality finder
gernotbelger
parents: 9522
diff changeset
67
8e6b9cb9486a Fixed BedQuality finder
gernotbelger
parents: 9522
diff changeset
68 // Message for admin, not translated
8e6b9cb9486a Fixed BedQuality finder
gernotbelger
parents: 9522
diff changeset
69 final File file = TsvHelper.makeFile2(CONFIG_FILE, rivername);
8e6b9cb9486a Fixed BedQuality finder
gernotbelger
parents: 9522
diff changeset
70 final String message = "Die angegebene d50-Sohlkorndurchmesser Konfigurationsdatei enthält keinen gültigen Bereich für das konfigurierte Peiljahr."; //$NON-NLS-1$
8e6b9cb9486a Fixed BedQuality finder
gernotbelger
parents: 9522
diff changeset
71 problems.addProblem("sinfo.bedqualityd50config.configfile.loaderror", file.getPath(), message);
8e6b9cb9486a Fixed BedQuality finder
gernotbelger
parents: 9522
diff changeset
72 return null;
8e6b9cb9486a Fixed BedQuality finder
gernotbelger
parents: 9522
diff changeset
73 }
8e6b9cb9486a Fixed BedQuality finder
gernotbelger
parents: 9522
diff changeset
74
8e6b9cb9486a Fixed BedQuality finder
gernotbelger
parents: 9522
diff changeset
75 private CalRange[] getRanges(final String rivername, final Calculation problems) {
8e6b9cb9486a Fixed BedQuality finder
gernotbelger
parents: 9522
diff changeset
76
8e6b9cb9486a Fixed BedQuality finder
gernotbelger
parents: 9522
diff changeset
77 if (this.cache.containsKey(rivername))
8e6b9cb9486a Fixed BedQuality finder
gernotbelger
parents: 9522
diff changeset
78 return this.cache.get(rivername);
8e6b9cb9486a Fixed BedQuality finder
gernotbelger
parents: 9522
diff changeset
79
8e6b9cb9486a Fixed BedQuality finder
gernotbelger
parents: 9522
diff changeset
80 final CalRange[] ranges = loadRanges(rivername, problems);
8e6b9cb9486a Fixed BedQuality finder
gernotbelger
parents: 9522
diff changeset
81 if (ranges == null) {
8e6b9cb9486a Fixed BedQuality finder
gernotbelger
parents: 9522
diff changeset
82 /* do not cache so we always get the problem message again */
9481
787fc085459b TSV introduced; uinfo.inundationWMS-Config
gernotbelger
parents: 9469
diff changeset
83 return null;
9469
6acd22e86951 Improvements on Config-Files
gernotbelger
parents:
diff changeset
84 }
9532
8e6b9cb9486a Fixed BedQuality finder
gernotbelger
parents: 9522
diff changeset
85
8e6b9cb9486a Fixed BedQuality finder
gernotbelger
parents: 9522
diff changeset
86 this.cache.put(rivername, ranges);
8e6b9cb9486a Fixed BedQuality finder
gernotbelger
parents: 9522
diff changeset
87 return ranges;
8e6b9cb9486a Fixed BedQuality finder
gernotbelger
parents: 9522
diff changeset
88 }
8e6b9cb9486a Fixed BedQuality finder
gernotbelger
parents: 9522
diff changeset
89
8e6b9cb9486a Fixed BedQuality finder
gernotbelger
parents: 9522
diff changeset
90 private CalRange[] loadRanges(final String rivername, final Calculation problems) {
8e6b9cb9486a Fixed BedQuality finder
gernotbelger
parents: 9522
diff changeset
91 final File file = TsvHelper.makeFile2(CONFIG_FILE, rivername);
8e6b9cb9486a Fixed BedQuality finder
gernotbelger
parents: 9522
diff changeset
92 final File fileCheck = TsvHelper.checkFile(file);
8e6b9cb9486a Fixed BedQuality finder
gernotbelger
parents: 9522
diff changeset
93 if (fileCheck == null)
8e6b9cb9486a Fixed BedQuality finder
gernotbelger
parents: 9522
diff changeset
94 return new CalRange[] { new CalRange(null, null, null, null) }; // automatically dateRange min/max will be taken
8e6b9cb9486a Fixed BedQuality finder
gernotbelger
parents: 9522
diff changeset
95
8e6b9cb9486a Fixed BedQuality finder
gernotbelger
parents: 9522
diff changeset
96 try {
8e6b9cb9486a Fixed BedQuality finder
gernotbelger
parents: 9522
diff changeset
97 final List<String[]> results = TsvHelper.readTsv(file, 4);
8e6b9cb9486a Fixed BedQuality finder
gernotbelger
parents: 9522
diff changeset
98
8e6b9cb9486a Fixed BedQuality finder
gernotbelger
parents: 9522
diff changeset
99 final Collection<CalRange> ranges = new ArrayList<>(results.size());
8e6b9cb9486a Fixed BedQuality finder
gernotbelger
parents: 9522
diff changeset
100
9559
ba0561906f81 Uinfo inundation duration workflow (vegetation zones, scenario), wms-config changed
gernotbelger
parents: 9532
diff changeset
101 for (final String[] line : results) {
ba0561906f81 Uinfo inundation duration workflow (vegetation zones, scenario), wms-config changed
gernotbelger
parents: 9532
diff changeset
102 if (line != null && line.length == 4)
ba0561906f81 Uinfo inundation duration workflow (vegetation zones, scenario), wms-config changed
gernotbelger
parents: 9532
diff changeset
103 ranges.add(new CalRange(parseInput(line[0]), parseInput(line[1]), parseInput(line[2]), parseInput(line[3])));
ba0561906f81 Uinfo inundation duration workflow (vegetation zones, scenario), wms-config changed
gernotbelger
parents: 9532
diff changeset
104 }
9532
8e6b9cb9486a Fixed BedQuality finder
gernotbelger
parents: 9522
diff changeset
105 return ranges.toArray(new CalRange[ranges.size()]);
8e6b9cb9486a Fixed BedQuality finder
gernotbelger
parents: 9522
diff changeset
106 }
8e6b9cb9486a Fixed BedQuality finder
gernotbelger
parents: 9522
diff changeset
107 catch (final TsvReaderException | IOException | BedQualityParseException e) {
8e6b9cb9486a Fixed BedQuality finder
gernotbelger
parents: 9522
diff changeset
108 problems.addProblem("sinfo.bedqualityd50config.configfile.loaderror", file.getPath(), e.getLocalizedMessage());
8e6b9cb9486a Fixed BedQuality finder
gernotbelger
parents: 9522
diff changeset
109 return null;
8e6b9cb9486a Fixed BedQuality finder
gernotbelger
parents: 9522
diff changeset
110 }
9469
6acd22e86951 Improvements on Config-Files
gernotbelger
parents:
diff changeset
111 }
6acd22e86951 Improvements on Config-Files
gernotbelger
parents:
diff changeset
112
9481
787fc085459b TSV introduced; uinfo.inundationWMS-Config
gernotbelger
parents: 9469
diff changeset
113 private static Integer parseInput(final String raw) throws BedQualityParseException {
9532
8e6b9cb9486a Fixed BedQuality finder
gernotbelger
parents: 9522
diff changeset
114
9481
787fc085459b TSV introduced; uinfo.inundationWMS-Config
gernotbelger
parents: 9469
diff changeset
115 final String value = raw.trim();
9469
6acd22e86951 Improvements on Config-Files
gernotbelger
parents:
diff changeset
116 if (value.toUpperCase().equals("MIN") || value.toUpperCase().equals("MAX"))
6acd22e86951 Improvements on Config-Files
gernotbelger
parents:
diff changeset
117 return null;
9532
8e6b9cb9486a Fixed BedQuality finder
gernotbelger
parents: 9522
diff changeset
118
9469
6acd22e86951 Improvements on Config-Files
gernotbelger
parents:
diff changeset
119 try {
6acd22e86951 Improvements on Config-Files
gernotbelger
parents:
diff changeset
120 return Integer.valueOf(value);
6acd22e86951 Improvements on Config-Files
gernotbelger
parents:
diff changeset
121 }
6acd22e86951 Improvements on Config-Files
gernotbelger
parents:
diff changeset
122 catch (final NumberFormatException e) {
9522
23d97d60b889 Selection range of D50 values for tkh calculation can now be configured with a river specific table.
gernotbelger
parents: 9481
diff changeset
123 throw new BedQualityParseException("Invalid input; should be year ('yyyy') or 'MIN' or 'MAX'", e);
9469
6acd22e86951 Improvements on Config-Files
gernotbelger
parents:
diff changeset
124 }
6acd22e86951 Improvements on Config-Files
gernotbelger
parents:
diff changeset
125 }
6acd22e86951 Improvements on Config-Files
gernotbelger
parents:
diff changeset
126
9522
23d97d60b889 Selection range of D50 values for tkh calculation can now be configured with a river specific table.
gernotbelger
parents: 9481
diff changeset
127 private static final class CalRange {
9469
6acd22e86951 Improvements on Config-Files
gernotbelger
parents:
diff changeset
128 private final long startTimeSounding;
6acd22e86951 Improvements on Config-Files
gernotbelger
parents:
diff changeset
129 private final long endTimeSounding;
6acd22e86951 Improvements on Config-Files
gernotbelger
parents:
diff changeset
130
6acd22e86951 Improvements on Config-Files
gernotbelger
parents:
diff changeset
131 private final long startTimeQuery;
6acd22e86951 Improvements on Config-Files
gernotbelger
parents:
diff changeset
132 private final long endTimeQuery;
6acd22e86951 Improvements on Config-Files
gernotbelger
parents:
diff changeset
133
9522
23d97d60b889 Selection range of D50 values for tkh calculation can now be configured with a river specific table.
gernotbelger
parents: 9481
diff changeset
134 public Date getStartTimeQuery() {
9469
6acd22e86951 Improvements on Config-Files
gernotbelger
parents:
diff changeset
135 return new Date(this.startTimeQuery);
6acd22e86951 Improvements on Config-Files
gernotbelger
parents:
diff changeset
136 }
6acd22e86951 Improvements on Config-Files
gernotbelger
parents:
diff changeset
137
9522
23d97d60b889 Selection range of D50 values for tkh calculation can now be configured with a river specific table.
gernotbelger
parents: 9481
diff changeset
138 public Date getEndTimeQuery() {
9469
6acd22e86951 Improvements on Config-Files
gernotbelger
parents:
diff changeset
139 return new Date(this.endTimeQuery);
6acd22e86951 Improvements on Config-Files
gernotbelger
parents:
diff changeset
140 }
6acd22e86951 Improvements on Config-Files
gernotbelger
parents:
diff changeset
141
9522
23d97d60b889 Selection range of D50 values for tkh calculation can now be configured with a river specific table.
gernotbelger
parents: 9481
diff changeset
142 public CalRange(final Integer startYearSounding, final Integer endYearSounding, final Integer startYearQuery, final Integer endYearQuery) {
9469
6acd22e86951 Improvements on Config-Files
gernotbelger
parents:
diff changeset
143
9522
23d97d60b889 Selection range of D50 values for tkh calculation can now be configured with a river specific table.
gernotbelger
parents: 9481
diff changeset
144 this.startTimeSounding = (startYearSounding != null) ? getLongValForYear(startYearSounding, 0, 1) : BedQualityD50KmValueFinder.MIN_DATE.getTime();
23d97d60b889 Selection range of D50 values for tkh calculation can now be configured with a river specific table.
gernotbelger
parents: 9481
diff changeset
145 this.startTimeQuery = (startYearQuery != null) ? getLongValForYear(startYearQuery, 0, 1) : BedQualityD50KmValueFinder.MIN_DATE.getTime();
23d97d60b889 Selection range of D50 values for tkh calculation can now be configured with a river specific table.
gernotbelger
parents: 9481
diff changeset
146 this.endTimeSounding = (endYearSounding != null) ? getLongValForYear(endYearSounding, 11, 31) : BedQualityD50KmValueFinder.MAX_DATE.getTime();
23d97d60b889 Selection range of D50 values for tkh calculation can now be configured with a river specific table.
gernotbelger
parents: 9481
diff changeset
147 this.endTimeQuery = (endYearQuery != null) ? getLongValForYear(endYearQuery, 11, 31) : BedQualityD50KmValueFinder.MAX_DATE.getTime();
9469
6acd22e86951 Improvements on Config-Files
gernotbelger
parents:
diff changeset
148 }
6acd22e86951 Improvements on Config-Files
gernotbelger
parents:
diff changeset
149
9532
8e6b9cb9486a Fixed BedQuality finder
gernotbelger
parents: 9522
diff changeset
150 private static long getLongValForYear(final int year, final int month0based, final int dayOfMonth) {
8e6b9cb9486a Fixed BedQuality finder
gernotbelger
parents: 9522
diff changeset
151 final Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT+1"));
9469
6acd22e86951 Improvements on Config-Files
gernotbelger
parents:
diff changeset
152 cal.clear();
6acd22e86951 Improvements on Config-Files
gernotbelger
parents:
diff changeset
153 cal.set(year, month0based, dayOfMonth);
6acd22e86951 Improvements on Config-Files
gernotbelger
parents:
diff changeset
154
6acd22e86951 Improvements on Config-Files
gernotbelger
parents:
diff changeset
155 return cal.getTimeInMillis();
6acd22e86951 Improvements on Config-Files
gernotbelger
parents:
diff changeset
156 }
6acd22e86951 Improvements on Config-Files
gernotbelger
parents:
diff changeset
157
9522
23d97d60b889 Selection range of D50 values for tkh calculation can now be configured with a river specific table.
gernotbelger
parents: 9481
diff changeset
158 public boolean isSoundingYearInRange(final int soundingYear) {
9469
6acd22e86951 Improvements on Config-Files
gernotbelger
parents:
diff changeset
159
9532
8e6b9cb9486a Fixed BedQuality finder
gernotbelger
parents: 9522
diff changeset
160 final long time = getLongValForYear(soundingYear, 5, 5); // random date in the middle of the year
9469
6acd22e86951 Improvements on Config-Files
gernotbelger
parents:
diff changeset
161 if (time > this.startTimeSounding && time < this.endTimeSounding)
6acd22e86951 Improvements on Config-Files
gernotbelger
parents:
diff changeset
162 return true;
6acd22e86951 Improvements on Config-Files
gernotbelger
parents:
diff changeset
163
6acd22e86951 Improvements on Config-Files
gernotbelger
parents:
diff changeset
164 return false;
6acd22e86951 Improvements on Config-Files
gernotbelger
parents:
diff changeset
165 }
6acd22e86951 Improvements on Config-Files
gernotbelger
parents:
diff changeset
166 }
9522
23d97d60b889 Selection range of D50 values for tkh calculation can now be configured with a river specific table.
gernotbelger
parents: 9481
diff changeset
167 }

http://dive4elements.wald.intevation.org