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();

http://dive4elements.wald.intevation.org