annotate artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixZone.java @ 9321:a978b601a034

Salix: Fixed ArrrayoutOfBoundsException; minor cleanup
author gernotbelger
date Fri, 27 Jul 2018 10:25:09 +0200
parents da0bdbcd6f09
children
rev   line source
9237
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
1 /** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
2 * Software engineering by
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
3 * Björnsen Beratende Ingenieure GmbH
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
4 * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
5 *
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
6 * This file is Free Software under the GNU AGPL (>=v3)
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
7 * and comes with ABSOLUTELY NO WARRANTY! Check out the
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
8 * documentation coming with Dive4Elements River for details.
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
9 */
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
10 package org.dive4elements.river.artifacts.uinfo.salix;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
11
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
12 import java.util.ArrayList;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
13 import java.util.List;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
14 import java.util.TreeSet;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
15
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
16 /**
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
17 * @author Domenico Nardi Tironi
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
18 *
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
19 */
9321
a978b601a034 Salix: Fixed ArrrayoutOfBoundsException; minor cleanup
gernotbelger
parents: 9243
diff changeset
20 final class SalixZone implements Comparable<SalixZone> {
9237
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
21
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
22 // IMMER ABGLEICHEN Server Client SalixZone.java
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
23 private static final String TABLE_CELL_SEPARATOR = "TABLE_CELL_SEPARATOR";
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
24 private static final String TABLE_ROW_SEPARATOR = "TABLE_ROW_SEPARATOR";
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
25 private final int dwsplValue;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
26 private final double fromKm;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
27 private final double toKm;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
28
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
29 private final static double DELTA = 0.0001;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
30
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
31 public static List<SalixZone> parse(final String zonesRaw) {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
32 final List<SalixZone> resultList = new ArrayList<>();
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
33
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
34 final List<String[]> results = new ArrayList<>();
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
35 if (zonesRaw.contains(TABLE_ROW_SEPARATOR)) {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
36 final String[] rows = zonesRaw.split(TABLE_ROW_SEPARATOR);
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
37 for (final String row : rows) {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
38 if (row.contains(TABLE_CELL_SEPARATOR)) {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
39 final String[] result = row.split(TABLE_CELL_SEPARATOR);
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
40 results.add(result);
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
41 }
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
42 }
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
43 }
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
44 for (final String[] zone : results) {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
45 final SalixZone helper = new SalixZone(Integer.valueOf(zone[0]), Double.valueOf(zone[1]), Double.valueOf(zone[2]));
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
46 resultList.add(helper);
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
47 }
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
48 return resultList;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
49 }
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
50
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
51 public static SalixZone createFromTableEntry(final String dwspl, final String from, final String to) {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
52 return new SalixZone(Integer.valueOf(dwspl), Double.valueOf(from), Double.valueOf(to)); // Error-Handling?
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
53 }
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
54
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
55 private SalixZone(final int dwsplValue, final double fromKm, final double toKm) {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
56 this.dwsplValue = dwsplValue;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
57 this.fromKm = fromKm;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
58 this.toKm = toKm;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
59 }
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
60
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
61 public Double getToKm() {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
62 return this.toKm;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
63 }
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
64
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
65 public int getDwsplValue() {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
66 return this.dwsplValue;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
67 }
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
68
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
69 public Double getFromKm() {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
70 return this.fromKm;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
71 }
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
72
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
73 public static final String parseListToDataString(final List<SalixZone> list) {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
74
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
75 java.util.Collections.sort(list);
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
76 final StringBuilder builder = new StringBuilder();
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
77 for (final SalixZone zone : list) {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
78 builder.append(zone.getDwsplValue());
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
79 builder.append(TABLE_CELL_SEPARATOR);
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
80 builder.append(zone.getFromKm());
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
81 builder.append(TABLE_CELL_SEPARATOR);
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
82 builder.append(zone.getToKm());
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
83 builder.append(TABLE_ROW_SEPARATOR);
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
84 }
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
85 return builder.toString();
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
86 }
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
87
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
88 public static final boolean zonesAreOverlapping(final List<SalixZone> list) {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
89 for (final SalixZone zone : list) {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
90 for (final SalixZone zoneOther : list) {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
91 if (zone != zoneOther) {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
92 final boolean overlaps = zone.overlaps(zoneOther);
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
93 if (overlaps) {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
94 return overlaps; // cancel. only one zone has to overlap
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
95 }
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
96 }
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
97 }
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
98 }
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
99
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
100 return false;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
101 }
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
102
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
103 public static final boolean hasGaps(final List<SalixZone> list, final double lower, final double upper) {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
104
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
105 if (((upper - lower) > DELTA) && list.size() == 0)
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
106 return true;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
107
9238
1c756bfee472 salix.supraregional table revision -> Anschluss
gernotbelger
parents: 9237
diff changeset
108 final TreeSet<SalixZone> treeList = new TreeSet<>();
9237
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
109 treeList.addAll(list);
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
110 double lowerCompare = lower + DELTA;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
111 for (final SalixZone zone : treeList) {
9241
cbe393451ab0 minor bugfixes
gernotbelger
parents: 9238
diff changeset
112 if ((zone.getUpperFromTo() - zone.getLowerFromTo()) > DELTA) {
cbe393451ab0 minor bugfixes
gernotbelger
parents: 9238
diff changeset
113 if (zone.getLowerFromTo() > lowerCompare) {
cbe393451ab0 minor bugfixes
gernotbelger
parents: 9238
diff changeset
114 return true;
cbe393451ab0 minor bugfixes
gernotbelger
parents: 9238
diff changeset
115 }
cbe393451ab0 minor bugfixes
gernotbelger
parents: 9238
diff changeset
116 lowerCompare = zone.getUpperFromTo() + DELTA;
9237
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
117 }
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
118 }
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
119 if ((lowerCompare + DELTA) < upper)
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
120 return true; // am Ende nicht geschlossen
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
121
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
122 return false;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
123 }
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
124
9243
da0bdbcd6f09 salix.supraRegional+Regional results
gernotbelger
parents: 9242
diff changeset
125 public Double getLowerFromTo() {
9237
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
126 return this.fromKm < this.toKm ? this.fromKm : this.toKm; // Math. is forbidden :-(
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
127 }
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
128
9243
da0bdbcd6f09 salix.supraRegional+Regional results
gernotbelger
parents: 9242
diff changeset
129 public Double getUpperFromTo() {
9237
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
130 return this.fromKm > this.toKm ? this.fromKm : this.toKm;// Math. is forbidden :-(
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
131 }
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
132
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
133 private boolean overlaps(final SalixZone otherZone) {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
134 final double otherLower = otherZone.getLowerFromTo();
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
135 final double otherUpper = otherZone.getUpperFromTo();
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
136
9242
2ea7b61797d3 SupraRegionalTable final review
gernotbelger
parents: 9241
diff changeset
137 final double upper = getUpperFromTo();
2ea7b61797d3 SupraRegionalTable final review
gernotbelger
parents: 9241
diff changeset
138 final double lower = getLowerFromTo();
9237
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
139 final double otherSchwerpunkt = (otherLower + otherUpper) / 2;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
140 if ((otherUpper < upper && otherUpper > lower)) {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
141 return true;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
142 } else if (otherLower > lower && otherLower < upper) {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
143 return true;
9242
2ea7b61797d3 SupraRegionalTable final review
gernotbelger
parents: 9241
diff changeset
144 } else if (otherSchwerpunkt > (lower - DELTA) && otherSchwerpunkt < (upper + DELTA)) {
9237
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
145 return true;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
146 }
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
147 return false;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
148 }
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
149
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
150 @Override
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
151 public int compareTo(final SalixZone o) {
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
152 final int basicCompare = this.getLowerFromTo().compareTo(o.getLowerFromTo());
9241
cbe393451ab0 minor bugfixes
gernotbelger
parents: 9238
diff changeset
153 if (basicCompare == 0) {
cbe393451ab0 minor bugfixes
gernotbelger
parents: 9238
diff changeset
154 return 1; // necessary for the treeSet!
cbe393451ab0 minor bugfixes
gernotbelger
parents: 9238
diff changeset
155 }
9237
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
156 return basicCompare;
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
157 }
972e10522ed6 salix.supraregional ui
gernotbelger
parents:
diff changeset
158
9238
1c756bfee472 salix.supraregional table revision -> Anschluss
gernotbelger
parents: 9237
diff changeset
159 public static boolean isValidAnschlussRange(final double fromTest, final double toTest, final List<SalixZone> list, final double minKm) {
1c756bfee472 salix.supraregional table revision -> Anschluss
gernotbelger
parents: 9237
diff changeset
160 final SalixZone zone = new SalixZone(0, fromTest, toTest);
1c756bfee472 salix.supraregional table revision -> Anschluss
gernotbelger
parents: 9237
diff changeset
161 final double lower = zone.getLowerFromTo();
1c756bfee472 salix.supraregional table revision -> Anschluss
gernotbelger
parents: 9237
diff changeset
162 final double anschluss = getAnschluss(list, minKm);
1c756bfee472 salix.supraregional table revision -> Anschluss
gernotbelger
parents: 9237
diff changeset
163 final double differenceAbs = (lower - anschluss) > 0 ? (lower - anschluss) : (anschluss - lower); // no Math.abs allowed :-(
1c756bfee472 salix.supraregional table revision -> Anschluss
gernotbelger
parents: 9237
diff changeset
164 if (differenceAbs > DELTA) {
1c756bfee472 salix.supraregional table revision -> Anschluss
gernotbelger
parents: 9237
diff changeset
165 return false;
1c756bfee472 salix.supraregional table revision -> Anschluss
gernotbelger
parents: 9237
diff changeset
166 }
1c756bfee472 salix.supraregional table revision -> Anschluss
gernotbelger
parents: 9237
diff changeset
167 return true;
1c756bfee472 salix.supraregional table revision -> Anschluss
gernotbelger
parents: 9237
diff changeset
168 }
1c756bfee472 salix.supraregional table revision -> Anschluss
gernotbelger
parents: 9237
diff changeset
169
1c756bfee472 salix.supraregional table revision -> Anschluss
gernotbelger
parents: 9237
diff changeset
170 private static double getAnschluss(final List<SalixZone> list, final double minKm) {
1c756bfee472 salix.supraregional table revision -> Anschluss
gernotbelger
parents: 9237
diff changeset
171 if (list.size() > 0) {
1c756bfee472 salix.supraregional table revision -> Anschluss
gernotbelger
parents: 9237
diff changeset
172 return list.get(list.size() - 1).getUpperFromTo();
1c756bfee472 salix.supraregional table revision -> Anschluss
gernotbelger
parents: 9237
diff changeset
173 }
1c756bfee472 salix.supraregional table revision -> Anschluss
gernotbelger
parents: 9237
diff changeset
174 return minKm;
1c756bfee472 salix.supraregional table revision -> Anschluss
gernotbelger
parents: 9237
diff changeset
175 }
9321
a978b601a034 Salix: Fixed ArrrayoutOfBoundsException; minor cleanup
gernotbelger
parents: 9243
diff changeset
176 }

http://dive4elements.wald.intevation.org