gernotbelger@9237: /** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde gernotbelger@9237: * Software engineering by gernotbelger@9237: * Björnsen Beratende Ingenieure GmbH gernotbelger@9237: * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt gernotbelger@9237: * gernotbelger@9237: * This file is Free Software under the GNU AGPL (>=v3) gernotbelger@9237: * and comes with ABSOLUTELY NO WARRANTY! Check out the gernotbelger@9237: * documentation coming with Dive4Elements River for details. gernotbelger@9237: */ gernotbelger@9237: package org.dive4elements.river.artifacts.uinfo.salix; gernotbelger@9237: gernotbelger@9237: import java.util.ArrayList; gernotbelger@9237: import java.util.List; gernotbelger@9237: import java.util.TreeSet; gernotbelger@9237: gernotbelger@9237: /** gernotbelger@9237: * @author Domenico Nardi Tironi gernotbelger@9237: * gernotbelger@9237: */ gernotbelger@9237: public class SalixZone implements Comparable { gernotbelger@9237: gernotbelger@9237: // IMMER ABGLEICHEN Server Client SalixZone.java gernotbelger@9237: private static final String TABLE_CELL_SEPARATOR = "TABLE_CELL_SEPARATOR"; gernotbelger@9237: private static final String TABLE_ROW_SEPARATOR = "TABLE_ROW_SEPARATOR"; gernotbelger@9237: private final int dwsplValue; gernotbelger@9237: private final double fromKm; gernotbelger@9237: private final double toKm; gernotbelger@9237: gernotbelger@9237: private final static double DELTA = 0.0001; gernotbelger@9237: gernotbelger@9237: public static List parse(final String zonesRaw) { gernotbelger@9237: final List resultList = new ArrayList<>(); gernotbelger@9237: gernotbelger@9237: final List results = new ArrayList<>(); gernotbelger@9237: if (zonesRaw.contains(TABLE_ROW_SEPARATOR)) { gernotbelger@9237: final String[] rows = zonesRaw.split(TABLE_ROW_SEPARATOR); gernotbelger@9237: for (final String row : rows) { gernotbelger@9237: if (row.contains(TABLE_CELL_SEPARATOR)) { gernotbelger@9237: final String[] result = row.split(TABLE_CELL_SEPARATOR); gernotbelger@9237: results.add(result); gernotbelger@9237: } gernotbelger@9237: } gernotbelger@9237: } gernotbelger@9237: for (final String[] zone : results) { gernotbelger@9237: final SalixZone helper = new SalixZone(Integer.valueOf(zone[0]), Double.valueOf(zone[1]), Double.valueOf(zone[2])); gernotbelger@9237: resultList.add(helper); gernotbelger@9237: } gernotbelger@9237: return resultList; gernotbelger@9237: } gernotbelger@9237: gernotbelger@9237: public static SalixZone createFromTableEntry(final String dwspl, final String from, final String to) { gernotbelger@9237: return new SalixZone(Integer.valueOf(dwspl), Double.valueOf(from), Double.valueOf(to)); // Error-Handling? gernotbelger@9237: } gernotbelger@9237: gernotbelger@9237: private SalixZone(final int dwsplValue, final double fromKm, final double toKm) { gernotbelger@9237: this.dwsplValue = dwsplValue; gernotbelger@9237: this.fromKm = fromKm; gernotbelger@9237: this.toKm = toKm; gernotbelger@9237: } gernotbelger@9237: gernotbelger@9237: public Double getToKm() { gernotbelger@9237: return this.toKm; gernotbelger@9237: } gernotbelger@9237: gernotbelger@9237: public int getDwsplValue() { gernotbelger@9237: return this.dwsplValue; gernotbelger@9237: } gernotbelger@9237: gernotbelger@9237: public Double getFromKm() { gernotbelger@9237: return this.fromKm; gernotbelger@9237: } gernotbelger@9237: gernotbelger@9237: public static final String parseListToDataString(final List list) { gernotbelger@9237: gernotbelger@9237: java.util.Collections.sort(list); gernotbelger@9237: final StringBuilder builder = new StringBuilder(); gernotbelger@9237: for (final SalixZone zone : list) { gernotbelger@9237: builder.append(zone.getDwsplValue()); gernotbelger@9237: builder.append(TABLE_CELL_SEPARATOR); gernotbelger@9237: builder.append(zone.getFromKm()); gernotbelger@9237: builder.append(TABLE_CELL_SEPARATOR); gernotbelger@9237: builder.append(zone.getToKm()); gernotbelger@9237: builder.append(TABLE_ROW_SEPARATOR); gernotbelger@9237: } gernotbelger@9237: return builder.toString(); gernotbelger@9237: } gernotbelger@9237: gernotbelger@9237: public static final boolean zonesAreOverlapping(final List list) { gernotbelger@9237: for (final SalixZone zone : list) { gernotbelger@9237: for (final SalixZone zoneOther : list) { gernotbelger@9237: if (zone != zoneOther) { gernotbelger@9237: final boolean overlaps = zone.overlaps(zoneOther); gernotbelger@9237: if (overlaps) { gernotbelger@9237: return overlaps; // cancel. only one zone has to overlap gernotbelger@9237: } gernotbelger@9237: } gernotbelger@9237: } gernotbelger@9237: } gernotbelger@9237: gernotbelger@9237: return false; gernotbelger@9237: } gernotbelger@9237: gernotbelger@9237: public static final boolean hasGaps(final List list, final double lower, final double upper) { gernotbelger@9237: gernotbelger@9237: if (((upper - lower) > DELTA) && list.size() == 0) gernotbelger@9237: return true; gernotbelger@9237: gernotbelger@9237: final TreeSet treeList = new TreeSet(); gernotbelger@9237: treeList.addAll(list); gernotbelger@9237: double lowerCompare = lower + DELTA; gernotbelger@9237: for (final SalixZone zone : treeList) { gernotbelger@9237: if (zone.getLowerFromTo() > lowerCompare) { gernotbelger@9237: return true; gernotbelger@9237: } gernotbelger@9237: lowerCompare = zone.getUpperFromTo() + DELTA; gernotbelger@9237: } gernotbelger@9237: if ((lowerCompare + DELTA) < upper) gernotbelger@9237: return true; // am Ende nicht geschlossen gernotbelger@9237: gernotbelger@9237: return false; gernotbelger@9237: } gernotbelger@9237: gernotbelger@9237: private Double getLowerFromTo() { gernotbelger@9237: return this.fromKm < this.toKm ? this.fromKm : this.toKm; // Math. is forbidden :-( gernotbelger@9237: } gernotbelger@9237: gernotbelger@9237: private Double getUpperFromTo() { gernotbelger@9237: return this.fromKm > this.toKm ? this.fromKm : this.toKm;// Math. is forbidden :-( gernotbelger@9237: } gernotbelger@9237: gernotbelger@9237: private boolean overlaps(final SalixZone otherZone) { gernotbelger@9237: final double otherLower = otherZone.getLowerFromTo(); gernotbelger@9237: final double otherUpper = otherZone.getUpperFromTo(); gernotbelger@9237: gernotbelger@9237: final double upper = getUpperFromTo() - DELTA; gernotbelger@9237: final double lower = getLowerFromTo() + DELTA; gernotbelger@9237: final double otherSchwerpunkt = (otherLower + otherUpper) / 2; gernotbelger@9237: if ((otherUpper < upper && otherUpper > lower)) { gernotbelger@9237: return true; gernotbelger@9237: } else if (otherLower > lower && otherLower < upper) { gernotbelger@9237: return true; gernotbelger@9237: } else if (otherSchwerpunkt > lower && otherSchwerpunkt < upper) { gernotbelger@9237: return true; gernotbelger@9237: } gernotbelger@9237: return false; gernotbelger@9237: } gernotbelger@9237: gernotbelger@9237: @Override gernotbelger@9237: public int compareTo(final SalixZone o) { gernotbelger@9237: final int basicCompare = this.getLowerFromTo().compareTo(o.getLowerFromTo()); gernotbelger@9237: return basicCompare; gernotbelger@9237: } gernotbelger@9237: gernotbelger@9237: }