Mercurial > dive4elements > river
diff artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/tkhstate/BedQualityD50TimeRangeConfig.java @ 9532:8e6b9cb9486a
Fixed BedQuality finder
author | gernotbelger |
---|---|
date | Tue, 02 Oct 2018 18:19:44 +0200 |
parents | 23d97d60b889 |
children | ba0561906f81 |
line wrap: on
line diff
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/tkhstate/BedQualityD50TimeRangeConfig.java Tue Oct 02 18:08:02 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/tkhstate/BedQualityD50TimeRangeConfig.java Tue Oct 02 18:19:44 2018 +0200 @@ -11,11 +11,14 @@ import java.io.File; import java.io.IOException; +import java.util.ArrayList; import java.util.Calendar; +import java.util.Collection; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.TimeZone; import org.dive4elements.river.artifacts.model.Calculation; import org.dive4elements.river.artifacts.model.DateRange; @@ -32,68 +35,87 @@ private static final String CONFIG_FILE = "d50_sohlkorndurchmesser_%s.tsv"; - private final Map<String, DateRange> cache = new HashMap<>(); + private final Map<String, CalRange[]> cache = new HashMap<>(); private static BedQualityD50TimeRangeConfig INSTANCE = new BedQualityD50TimeRangeConfig(); - public static class BedQualityParseException extends Exception { + private static class BedQualityParseException extends Exception { private static final long serialVersionUID = 1L; - BedQualityParseException(final String message) { - super(message); - } - - BedQualityParseException(final String message, final Throwable cause) { + public BedQualityParseException(final String message, final Throwable cause) { super(message, cause); } } - public static synchronized DateRange getDefaults(final River river, final int soundingYear, final Calculation problems) - throws BedQualityParseException { + public static synchronized DateRange getDefaults(final River river, final int soundingYear, final Calculation problems) { return INSTANCE.getBedHeightDefaultsForRiver(river, soundingYear, problems); } - private synchronized DateRange getBedHeightDefaultsForRiver(final River river, final int soundingYear, final Calculation problems) - throws BedQualityParseException { - final String rivername = river.getName(); - final String cacheKey = new StringBuilder().append(rivername).append(";").append(soundingYear).toString(); - if (!this.cache.containsKey(cacheKey)) { - final File file = TsvHelper.makeFile2(CONFIG_FILE, rivername); - final File fileCheck = TsvHelper.checkFile(file); - if (fileCheck == null) - return null; // automatically dateRange min/max wil be taken + private synchronized DateRange getBedHeightDefaultsForRiver(final River river, final int soundingYear, final Calculation problems) { - List<String[]> results = null; - try { - results = TsvHelper.readTsv(file, 4); - } - catch (final TsvReaderException | IOException e) { - problems.addProblem("sinfo.bedqualityd50config.configfile.loaderror", file.getPath(), e.getStackTrace()); - } - if (results != null) { - for (final String[] line : results) { - final CalRange range = new CalRange(parseInput(line[0]), parseInput(line[1]), parseInput(line[2]), parseInput(line[3])); - if (range.isSoundingYearInRange(soundingYear)) { - final DateRange dateRange = new DateRange(range.getStartTimeQuery(), range.getEndTimeQuery()); - this.cache.put(cacheKey, dateRange); + final String rivername = river.getName(); - } - } - } - problems.addProblem("sinfo.bedqualityd50config.configfile.loaderror", file.getPath(), - " Die angegebene d50-sohlkorndurchmesser-config-file enthält keinen gültigen Bereich für das konfigurierte Peiljahr."); + final CalRange[] ranges = getRanges(rivername, problems); + if (ranges == null) + return null; + + for (final CalRange range : ranges) { + if (range.isSoundingYearInRange(soundingYear)) + return new DateRange(range.getStartTimeQuery(), range.getEndTimeQuery()); + } + + // Message for admin, not translated + final File file = TsvHelper.makeFile2(CONFIG_FILE, rivername); + final String message = "Die angegebene d50-Sohlkorndurchmesser Konfigurationsdatei enthält keinen gültigen Bereich für das konfigurierte Peiljahr."; //$NON-NLS-1$ + problems.addProblem("sinfo.bedqualityd50config.configfile.loaderror", file.getPath(), message); + return null; + } + + private CalRange[] getRanges(final String rivername, final Calculation problems) { + + if (this.cache.containsKey(rivername)) + return this.cache.get(rivername); + + final CalRange[] ranges = loadRanges(rivername, problems); + if (ranges == null) { + /* do not cache so we always get the problem message again */ return null; } - return this.cache.get(cacheKey); + + this.cache.put(rivername, ranges); + return ranges; + } + + private CalRange[] loadRanges(final String rivername, final Calculation problems) { + final File file = TsvHelper.makeFile2(CONFIG_FILE, rivername); + final File fileCheck = TsvHelper.checkFile(file); + if (fileCheck == null) + return new CalRange[] { new CalRange(null, null, null, null) }; // automatically dateRange min/max will be taken + + try { + final List<String[]> results = TsvHelper.readTsv(file, 4); + + final Collection<CalRange> ranges = new ArrayList<>(results.size()); + + for (final String[] line : results) + ranges.add(new CalRange(parseInput(line[0]), parseInput(line[1]), parseInput(line[2]), parseInput(line[3]))); + + return ranges.toArray(new CalRange[ranges.size()]); + } + catch (final TsvReaderException | IOException | BedQualityParseException e) { + problems.addProblem("sinfo.bedqualityd50config.configfile.loaderror", file.getPath(), e.getLocalizedMessage()); + return null; + } } private static Integer parseInput(final String raw) throws BedQualityParseException { + final String value = raw.trim(); if (value.toUpperCase().equals("MIN") || value.toUpperCase().equals("MAX")) return null; + try { - return Integer.valueOf(value); } catch (final NumberFormatException e) { @@ -108,8 +130,6 @@ private final long startTimeQuery; private final long endTimeQuery; - private final static Calendar cal = Calendar.getInstance(); - public Date getStartTimeQuery() { return new Date(this.startTimeQuery); } @@ -126,7 +146,8 @@ this.endTimeQuery = (endYearQuery != null) ? getLongValForYear(endYearQuery, 11, 31) : BedQualityD50KmValueFinder.MAX_DATE.getTime(); } - private long getLongValForYear(final int year, final int month0based, final int dayOfMonth) { + private static long getLongValForYear(final int year, final int month0based, final int dayOfMonth) { + final Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT+1")); cal.clear(); cal.set(year, month0based, dayOfMonth); @@ -134,12 +155,8 @@ } public boolean isSoundingYearInRange(final int soundingYear) { - cal.clear(); - cal.set(soundingYear, 5, 5); // random date in the middle of the year - - final Long time = cal.getTimeInMillis(); - + final long time = getLongValForYear(soundingYear, 5, 5); // random date in the middle of the year if (time > this.startTimeSounding && time < this.endTimeSounding) return true;