Mercurial > dive4elements > river
diff artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/tkhstate/DefaultBedHeights.java @ 9706:299c1c61d8ef
zu 1.1. Sohlhöhen-Überlappung
author | dnt_bjoernsen <d.tironi@bjoernsen.de> |
---|---|
date | Fri, 22 Jan 2021 12:28:58 +0100 |
parents | b9c87bbff6a4 |
children | b74f817435fe |
line wrap: on
line diff
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/tkhstate/DefaultBedHeights.java Thu Jan 21 15:05:24 2021 +0100 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/tkhstate/DefaultBedHeights.java Fri Jan 22 12:28:58 2021 +0100 @@ -22,94 +22,131 @@ import org.dive4elements.river.model.River; /** - * This class knows how to find the default bed levels defined for tkh and other calculations + * This class knows how to find the default bed levels defined for tkh and other + * calculations * * @author Gernot Belger */ public final class DefaultBedHeights { - private final River river; - - public DefaultBedHeights(final River river) { - this.river = river; - } - - public List<BedHeight> getBedHeights(final Calculation problems) { - final Collection<DefaultBedHeight> defaults = DefaultBedHeightsConfig.getDefaults(this.river, problems); - - final List<BedHeight> defaultBedHeights = loadBedHeightsByName(this.river, defaults, problems); - if (defaultBedHeights.isEmpty()) { - problems.addProblem("sinfo.bedheightsfinder.nobedheightsforriver", this.river.getName()); - return Collections.emptyList(); - } - - /* check for overlapping ranges, N2-search, but we expect only have small numbers of bed levels */ - final List<BedHeight> result = new ArrayList<>(defaultBedHeights.size()); - - for (int i = 0; i < defaultBedHeights.size(); i++) { - final BedHeight bedHeight = defaultBedHeights.get(i); - - final Range range = bedHeight.getRange(); - final NumberRange bedRange = new NumberRange(range.getA(), range.getB()); - - if (overlapsRange(bedRange, defaultBedHeights, i + 1)) - problems.addProblem("sinfo.bedheightsfinder.overlappingrange", bedHeight.getDescription()); - else - result.add(bedHeight); - } - - final List<BedHeight> validBedHeights = new ArrayList<>(defaultBedHeights.size()); - - // REMARK: check for bad ranges because db schema allow for incomplete ranges, and ignore if this is the case - for (final BedHeight bedHeight : defaultBedHeights) { - - final Range range = bedHeight.getRange(); + private final River river; - if (range.getA() == null || range.getB() == null) - problems.addProblem("sinfo.bedheightsfinder.badrange", bedHeight.getDescription()); - else - validBedHeights.add(bedHeight); - } - - return result; - } - - private static List<BedHeight> loadBedHeightsByName(final River river, final Collection<DefaultBedHeight> defaults, final Calculation problems) { - - final List<BedHeight> bedHeights = new ArrayList<>(defaults.size()); - - for (final DefaultBedHeight heightDefault : defaults) { - - final String description = heightDefault.description; - try { + public DefaultBedHeights(final River river) { + this.river = river; + } - final BedHeight bedHeight = BedHeight.getBedHeightByDescription(river, description, heightDefault.startKm, heightDefault.endKm); - if (bedHeight == null) - problems.addProblem("sinfo.bedheightsfinder.missingdescription", river.getName(), description); - else - bedHeights.add(bedHeight); - } - catch (final Exception e) { - e.printStackTrace(); - problems.addProblem("sinfo.bedheightsfinder.missingdescription", river.getName(), description); - } - } - - return bedHeights; - } + public List<BedHeight> getBedHeights(final Calculation problems) { + final Collection<DefaultBedHeight> defaults = DefaultBedHeightsConfig.getDefaults(this.river, problems); + // check ob jede default-range irgendeine andere überlappt - private static boolean overlapsRange(final NumberRange bedRange, final List<BedHeight> result, final int startIndex) { - - for (int i = startIndex; i < result.size(); i++) { + for (DefaultBedHeight check : defaults) { + double end = check.endKm > check.startKm ? check.endKm : check.startKm; + double start = check.startKm < check.endKm ? check.startKm : check.endKm; - final BedHeight compareBed = result.get(i); - final Range range = compareBed.getRange(); - final NumberRange compareRange = new NumberRange(range.getA(), range.getB()); + for (DefaultBedHeight checkInner : defaults) { + if (!checkInner.description.equals(check.description) + && (checkInner.startKm < end && checkInner.endKm > start)) + problems.addProblem("sinfo.bedheightsfinder.overlappingrange", check.description); + } + } - if (compareRange.overlapsRange(bedRange)) - return true; - } + final List<BedHeight> defaultBedHeights = loadBedHeightsByName(this.river, defaults, problems); + if (defaultBedHeights.isEmpty()) { + problems.addProblem("sinfo.bedheightsfinder.nobedheightsforriver", this.river.getName()); + return Collections.emptyList(); + } - return false; - } + /* + * check for overlapping ranges, N2-search, but we expect only have small + * numbers of bed levels + */ + final List<BedHeight> result = new ArrayList<>(defaultBedHeights.size()); + + for (int i = 0; i < defaultBedHeights.size(); i++) { + + final BedHeight bedHeight = defaultBedHeights.get(i); + + DefaultBedHeight configuredBH = getConfiguredBedheightByDescription(problems, defaults, + bedHeight.getDescription()); + + final double startKm = configuredBH.startKm < configuredBH.endKm ? configuredBH.startKm + : configuredBH.endKm; + final double endKm = configuredBH.endKm > configuredBH.startKm ? configuredBH.endKm : configuredBH.startKm; + // final NumberRange bedRange = new NumberRange(range.getA(), range.getB()); + + // FIXME: optional: deckt die echte Range (Datenbank) die + // konfigurierte Range ab? + + // copy bedheight and restrict to configured ranges + BedHeight rangedBedheight = BedHeight.copyPojoFrom(bedHeight, startKm, endKm); + result.add(rangedBedheight); + } + + final List<BedHeight> validBedHeights = new ArrayList<>(defaultBedHeights.size()); + + // REMARK: check for bad ranges because db schema allow for incomplete ranges, + // and ignore if this is the case + for (final BedHeight bedHeight : defaultBedHeights) { + + final Range range = bedHeight.getRange(); + + if (range.getA() == null || range.getB() == null) + problems.addProblem("sinfo.bedheightsfinder.badrange", bedHeight.getDescription()); + else + validBedHeights.add(bedHeight); + } + + return result; + } + + private DefaultBedHeight getConfiguredBedheightByDescription(Calculation problems, + Collection<DefaultBedHeight> defaults, String description) { + for (DefaultBedHeight bh : defaults) { + if (bh.description.equals(description)) + return bh; + } + problems.addProblem("could not find the configured bedheight, which is not possible", description); + return null; + } + + private static List<BedHeight> loadBedHeightsByName(final River river, final Collection<DefaultBedHeight> defaults, + final Calculation problems) { + + final List<BedHeight> bedHeights = new ArrayList<>(defaults.size()); + + for (final DefaultBedHeight heightDefault : defaults) { + + final String description = heightDefault.description; + try { + + final BedHeight bedHeight = BedHeight.getBedHeightByDescription(river, description, + heightDefault.startKm, heightDefault.endKm); + if (bedHeight == null) + problems.addProblem("sinfo.bedheightsfinder.missingdescription", river.getName(), description); + else + bedHeights.add(bedHeight); + } catch (final Exception e) { + e.printStackTrace(); + problems.addProblem("sinfo.bedheightsfinder.missingdescription", river.getName(), description); + } + } + + return bedHeights; + } + + /* + * this check is replaced by configRangeCheck private static boolean + * overlapsRange(final NumberRange bedRange, final List<BedHeight> result, final + * int startIndex) { + * + * for (int i = startIndex; i < result.size(); i++) { + * + * final BedHeight compareBed = result.get(i); final Range range = + * compareBed.getRange(); final NumberRange compareRange = new + * NumberRange(range.getA(), range.getB()); + * + * if (compareRange.overlapsRange(bedRange)) return true; } + * + * return false; } + */ } \ No newline at end of file