Mercurial > dive4elements > river
comparison artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/tkhstate/BedQualityD50TimeRangeConfig.java @ 9481:787fc085459b
TSV introduced; uinfo.inundationWMS-Config
author | gernotbelger |
---|---|
date | Wed, 12 Sep 2018 10:55:09 +0200 |
parents | 6acd22e86951 |
children | 23d97d60b889 |
comparison
equal
deleted
inserted
replaced
9480:7228bd10a8cc | 9481:787fc085459b |
---|---|
7 * and comes with ABSOLUTELY NO WARRANTY! Check out the | 7 * and comes with ABSOLUTELY NO WARRANTY! Check out the |
8 * documentation coming with Dive4Elements River for details. | 8 * documentation coming with Dive4Elements River for details. |
9 */ | 9 */ |
10 package org.dive4elements.river.artifacts.sinfo.tkhstate; | 10 package org.dive4elements.river.artifacts.sinfo.tkhstate; |
11 | 11 |
12 import java.io.BufferedReader; | |
13 import java.io.File; | 12 import java.io.File; |
14 import java.io.FileReader; | 13 import java.io.IOException; |
15 import java.util.Calendar; | 14 import java.util.Calendar; |
16 import java.util.Date; | 15 import java.util.Date; |
17 import java.util.HashMap; | 16 import java.util.HashMap; |
17 import java.util.List; | |
18 import java.util.Map; | 18 import java.util.Map; |
19 | 19 |
20 import org.dive4elements.artifacts.common.utils.Config; | |
21 import org.dive4elements.river.artifacts.model.Calculation; | 20 import org.dive4elements.river.artifacts.model.Calculation; |
22 import org.dive4elements.river.artifacts.model.DateRange; | 21 import org.dive4elements.river.artifacts.model.DateRange; |
22 import org.dive4elements.river.artifacts.sinfo.tkhstate.TsvHelper.TsvReaderException; | |
23 import org.dive4elements.river.model.River; | 23 import org.dive4elements.river.model.River; |
24 | 24 |
25 /** | 25 /** |
26 * Represents the contents of the 'bedheights.properties' files. | 26 * Represents the contents of the 'bedheights.properties' files. |
27 * | 27 * |
28 * @author Gernot Belger | 28 * @author Gernot Belger |
29 */ | 29 */ |
30 public final class BedQualityD50TimeRangeConfig { | 30 public final class BedQualityD50TimeRangeConfig { |
31 | 31 |
32 private static final String CONFIG_FILE = "d50_sohlkorndurchmesser_%s.properties"; | 32 private static final String CONFIG_FILE = "d50_sohlkorndurchmesser_%s.tsv"; |
33 | 33 |
34 private final Map<String, DateRange> cache = new HashMap<>(); | 34 private final Map<String, DateRange> cache = new HashMap<>(); |
35 | 35 |
36 private static BedQualityD50TimeRangeConfig INSTANCE = new BedQualityD50TimeRangeConfig(); | 36 private static BedQualityD50TimeRangeConfig INSTANCE = new BedQualityD50TimeRangeConfig(); |
37 | 37 |
38 public static synchronized DateRange getDefaults(final River river, final int soundingYear, final Calculation problems) { | 38 public static class BedQualityParseException extends Exception { |
39 | |
40 private static final long serialVersionUID = 1L; | |
41 | |
42 private BedQualityParseException(final String string) { | |
43 super(string); | |
44 } | |
45 } | |
46 | |
47 public static synchronized DateRange getDefaults(final River river, final int soundingYear, final Calculation problems) | |
48 throws BedQualityParseException, IOException, TsvReaderException { | |
39 return INSTANCE.getBedHeightDefaultsForRiver(river, soundingYear, problems); | 49 return INSTANCE.getBedHeightDefaultsForRiver(river, soundingYear, problems); |
40 } | 50 } |
41 | 51 |
42 private synchronized DateRange getBedHeightDefaultsForRiver(final River river, final int soundingYear, final Calculation problems) { | 52 private synchronized DateRange getBedHeightDefaultsForRiver(final River river, final int soundingYear, final Calculation problems) |
53 throws BedQualityParseException { | |
43 final String rivername = river.getName(); | 54 final String rivername = river.getName(); |
44 final String cacheKey = new StringBuilder().append(rivername).append(";").append(soundingYear).toString(); | 55 final String cacheKey = new StringBuilder().append(rivername).append(";").append(soundingYear).toString(); |
45 if (!this.cache.containsKey(cacheKey)) { | 56 if (!this.cache.containsKey(cacheKey)) { |
46 final DateRange range = loadBedHeightDefaultsForRiver(river, soundingYear, problems); | 57 final File file = TsvHelper.makeFile2(CONFIG_FILE, rivername); |
47 this.cache.put(cacheKey, range); | 58 final File fileCheck = TsvHelper.checkFile(file); |
48 return range; | 59 if (fileCheck == null) |
60 return null; // automatically dateRange min/max wil be taken | |
61 | |
62 List<String[]> results = null; | |
63 try { | |
64 results = TsvHelper.readTsv(file, 4); | |
65 } | |
66 catch (final TsvReaderException | IOException e) { | |
67 problems.addProblem("sinfo.bedqualityd50config.configfile.loaderror", file.getPath(), e.getStackTrace()); | |
68 } | |
69 if (results != null) { | |
70 for (final String[] line : results) { | |
71 final CalRange range = new CalRange(parseInput(line[0]), parseInput(line[1]), parseInput(line[2]), parseInput(line[3])); | |
72 if (range.isSoundingYearInRange(soundingYear)) { | |
73 final DateRange dateRange = new DateRange(range.getStartTimeQuery(), range.getEndTimeQuery()); | |
74 this.cache.put(cacheKey, dateRange); | |
75 | |
76 } | |
77 } | |
78 } | |
79 problems.addProblem("sinfo.bedqualityd50config.configfile.loaderror", file.getPath(), | |
80 " Die angegebene d50-sohlkorndurchmesser-config-file enthält keinen gültigen Bereich für das konfigurierte Peiljahr."); | |
81 return null; | |
49 } | 82 } |
50 return this.cache.get(cacheKey); | 83 return this.cache.get(cacheKey); |
51 } | 84 } |
52 | 85 |
53 private static DateRange loadBedHeightDefaultsForRiver(final River river, final int soundingYear, final Calculation problems) { | 86 private static Integer parseInput(final String raw) throws BedQualityParseException { |
54 final String rivername = river.getName(); | 87 final String value = raw.trim(); |
55 final File configDir = Config.getModulesConfigDirectory(); | |
56 | |
57 final String filename = String.format(CONFIG_FILE, rivername); | |
58 | |
59 final File file = new File(configDir, filename); | |
60 | |
61 if (!file.canRead() && !file.isFile()) { | |
62 return null; // no config-file specified or spelling mistake etc. (not necessarily an error) | |
63 } | |
64 | |
65 try (final BufferedReader reader = new BufferedReader(new FileReader(file))) { | |
66 | |
67 String line; | |
68 while ((line = reader.readLine()) != null) { | |
69 if ((line = line.trim()).length() == 0 || line.startsWith("#")) { | |
70 continue; | |
71 } | |
72 | |
73 final String[] parts = line.split(";"); | |
74 | |
75 if (parts.length != 4) { | |
76 throw new Exception("Invalid number of Tokens; should be 4!"); | |
77 } | |
78 | |
79 final CalRange range = new CalRange(parseInput(parts[0]), parseInput(parts[1]), parseInput(parts[2]), parseInput(parts[3])); | |
80 if (range.isSoundingYearInRange(soundingYear)) { | |
81 return new DateRange(range.getStartTimeQuery(), range.getEndTimeQuery()); | |
82 } | |
83 } | |
84 return null; | |
85 } | |
86 catch (final Exception e) { | |
87 e.printStackTrace(); | |
88 problems.addProblem("sinfo.bedqualityd50config.configfile.loaderror", CONFIG_FILE, e.getMessage()); | |
89 return null; | |
90 } | |
91 } | |
92 | |
93 private static Integer parseInput(final String value) throws Exception { | |
94 if (value.toUpperCase().equals("MIN") || value.toUpperCase().equals("MAX")) | 88 if (value.toUpperCase().equals("MIN") || value.toUpperCase().equals("MAX")) |
95 return null; | 89 return null; |
96 try { | 90 try { |
91 | |
97 return Integer.valueOf(value); | 92 return Integer.valueOf(value); |
98 } | 93 } |
99 catch (final NumberFormatException e) { | 94 catch (final NumberFormatException e) { |
100 throw new Exception("Invalid input; should be year ('yyyy') or 'MIN' or 'MAX'"); | 95 throw new BedQualityParseException("Invalid input; should be year ('yyyy') or 'MIN' or 'MAX'"); |
101 } | 96 } |
102 } | 97 } |
103 | 98 |
104 private static class CalRange { | 99 private static class CalRange { |
105 private final long startTimeSounding; | 100 private final long startTimeSounding; |
118 return new Date(this.endTimeQuery); | 113 return new Date(this.endTimeQuery); |
119 } | 114 } |
120 | 115 |
121 private CalRange(final Integer startYearSounding, final Integer endYearSounding, final Integer startYearQuery, final Integer endYearQuery) { | 116 private CalRange(final Integer startYearSounding, final Integer endYearSounding, final Integer startYearQuery, final Integer endYearQuery) { |
122 | 117 |
123 this.startTimeSounding = 1l;// (startYearSounding != null) ? getLongValForYear(startYearSounding, 0, 1) : | 118 this.startTimeSounding = 1L;// (startYearSounding != null) ? getLongValForYear(startYearSounding, 0, 1) : |
124 // BedQualityD50KmValueFinder.MIN_DATE.getTime(); | 119 // BedQualityD50KmValueFinder.MIN_DATE.getTime(); |
125 this.startTimeQuery = 1l;// (startYearQuery != null) ? getLongValForYear(startYearQuery, 0, 1) : BedQualityD50KmValueFinder.MIN_DATE.getTime(); | 120 this.startTimeQuery = 1L;// (startYearQuery != null) ? getLongValForYear(startYearQuery, 0, 1) : BedQualityD50KmValueFinder.MIN_DATE.getTime(); |
126 this.endTimeSounding = 1l;// (endYearSounding != null) ? getLongValForYear(endYearSounding, 11, 31) : | 121 this.endTimeSounding = 1L;// (endYearSounding != null) ? getLongValForYear(endYearSounding, 11, 31) : |
127 // BedQualityD50KmValueFinder.MAX_DATE.getTime(); | 122 // BedQualityD50KmValueFinder.MAX_DATE.getTime(); |
128 this.endTimeQuery = 1l; // (endYearQuery != null) ? getLongValForYear(endYearQuery, 11, 31) : BedQualityD50KmValueFinder.MAX_DATE.getTime(); | 123 this.endTimeQuery = 1L;// (endYearQuery != null) ? getLongValForYear(endYearQuery, 11, 31) : BedQualityD50KmValueFinder.MAX_DATE.getTime(); |
129 | 124 |
130 } | 125 } |
131 | 126 |
132 private long getLongValForYear(final int year, final int month0based, final int dayOfMonth) { | 127 private long getLongValForYear(final int year, final int month0based, final int dayOfMonth) { |
133 cal.clear(); | 128 cal.clear(); |