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

http://dive4elements.wald.intevation.org