Mercurial > dive4elements > river
annotate artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/vegetationzones/VegetationZoneServerClientXChange.java @ 9661:9b8ba3b83a15
Importer (s/u-info) vegetation zones: new database column in vegetation_type table for german type name,
localized vegetation type names by querying the database instead of translating by resource property,
detecting and cancelling the import of a second vegetation zone file for a river,
detecting, logging, cancelling in case of wrong column titles,
detecting, logging and ignoring lines with missing (color) values,
comparing vegetation zone name and class with the database and logging+ignoring in case of inconsistencies,
starting the most elevated zone with 0 instead of -1 overflow days
author | mschaefer |
---|---|
date | Mon, 23 Mar 2020 16:38:12 +0100 |
parents | d421c2bf0195 |
children |
rev | line source |
---|---|
9071 | 1 /** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde |
2 * Software engineering by | |
3 * Björnsen Beratende Ingenieure GmbH | |
4 * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt | |
5 * | |
6 * This file is Free Software under the GNU AGPL (>=v3) | |
7 * and comes with ABSOLUTELY NO WARRANTY! Check out the | |
8 * documentation coming with Dive4Elements River for details. | |
9 */ | |
10 package org.dive4elements.river.artifacts.uinfo.vegetationzones; | |
11 | |
12 import java.util.ArrayList; | |
13 import java.util.List; | |
9260 | 14 import java.util.TreeSet; |
9071 | 15 |
9402
e511eb935ccd
Changed hard coded standard vegetation zone table to fetching it from the database, i18n for the standard zone names
mschaefer
parents:
9260
diff
changeset
|
16 import org.dive4elements.artifacts.CallContext; |
e511eb935ccd
Changed hard coded standard vegetation zone table to fetching it from the database, i18n for the standard zone names
mschaefer
parents:
9260
diff
changeset
|
17 import org.dive4elements.river.artifacts.resources.Resources; |
e511eb935ccd
Changed hard coded standard vegetation zone table to fetching it from the database, i18n for the standard zone names
mschaefer
parents:
9260
diff
changeset
|
18 import org.dive4elements.river.model.River; |
9443
515643b2c49a
Added computation of uinfo salix line vegetation zone height (not yet connected to the cross section facet)
mschaefer
parents:
9403
diff
changeset
|
19 import org.dive4elements.river.model.uinfo.VegetationType; |
515643b2c49a
Added computation of uinfo salix line vegetation zone height (not yet connected to the cross section facet)
mschaefer
parents:
9403
diff
changeset
|
20 import org.dive4elements.river.model.uinfo.VegetationZone; |
9402
e511eb935ccd
Changed hard coded standard vegetation zone table to fetching it from the database, i18n for the standard zone names
mschaefer
parents:
9260
diff
changeset
|
21 |
9071 | 22 /** |
23 * @author Domenico Nardi Tironi | |
24 * | |
25 */ | |
9403 | 26 public class VegetationZoneServerClientXChange implements Comparable<VegetationZoneServerClientXChange> { |
9118
431f1c269be5
Veg-Zone Table improved, State change data recovery;
gernotbelger
parents:
9071
diff
changeset
|
27 |
9403 | 28 // IMMER ABGLEICHEN MIT VegetationZoneServerClientXChange.class Server und Client |
9260 | 29 |
9071 | 30 private static final String TABLE_CELL_SEPARATOR = "TABLE_CELL_SEPARATOR"; |
9523 | 31 |
9071 | 32 private static final String TABLE_ROW_SEPARATOR = "TABLE_ROW_SEPARATOR"; |
9523 | 33 |
9071 | 34 private final String zoneName; |
9523 | 35 |
9071 | 36 private final int min_day_overflow; |
9523 | 37 |
9071 | 38 private final int max_day_overflow; |
9523 | 39 |
9260 | 40 private final String hexColor; |
9071 | 41 |
9403 | 42 public static List<VegetationZoneServerClientXChange> parse(final String zonesRaw) { |
43 final List<VegetationZoneServerClientXChange> resultList = new ArrayList<>(); | |
9071 | 44 |
45 final List<String[]> results = new ArrayList<>(); | |
46 if (zonesRaw.contains(TABLE_ROW_SEPARATOR)) { | |
47 final String[] rows = zonesRaw.split(TABLE_ROW_SEPARATOR); | |
48 for (final String row : rows) { | |
49 if (row.contains(TABLE_CELL_SEPARATOR)) { | |
50 final String[] result = row.split(TABLE_CELL_SEPARATOR); | |
51 results.add(result); | |
52 } | |
53 } | |
54 } | |
55 for (final String[] zone : results) { | |
56 | |
9523 | 57 final VegetationZoneServerClientXChange helper = new VegetationZoneServerClientXChange(zone[0], Integer.valueOf(zone[1]), Integer.valueOf(zone[2]), |
58 zone[3]); | |
9071 | 59 resultList.add(helper); |
60 } | |
61 | |
62 return resultList; | |
63 } | |
64 | |
9523 | 65 public static VegetationZoneServerClientXChange createFromTableEntry(final String zone, final String min_day_overflow, final String max_day_overflow, |
66 final String hexColor) { | |
9403 | 67 return new VegetationZoneServerClientXChange(zone, Integer.valueOf(min_day_overflow), Integer.valueOf(max_day_overflow), hexColor); // Error-Handling? |
9118
431f1c269be5
Veg-Zone Table improved, State change data recovery;
gernotbelger
parents:
9071
diff
changeset
|
68 } |
431f1c269be5
Veg-Zone Table improved, State change data recovery;
gernotbelger
parents:
9071
diff
changeset
|
69 |
9403 | 70 private VegetationZoneServerClientXChange(final String zone, final Integer min_day_overflow, final Integer max_day_overflow, final String hexColor) { |
9071 | 71 this.zoneName = zone; |
72 this.min_day_overflow = min_day_overflow; | |
73 this.max_day_overflow = max_day_overflow; | |
9260 | 74 this.hexColor = hexColor; |
9071 | 75 } |
76 | |
77 public int getMax_day_overflow() { | |
78 return this.max_day_overflow; | |
79 } | |
80 | |
81 public String getZoneName() { | |
9260 | 82 if (this.zoneName == null || this.zoneName.equals("")) { |
83 return "---"; | |
84 } | |
9071 | 85 return this.zoneName; |
86 } | |
87 | |
9260 | 88 public String getHexColor() { |
89 try { | |
9523 | 90 // REMARK: only return valid colors |
91 Integer.decode(this.hexColor); | |
9260 | 92 return this.hexColor; |
93 } | |
94 catch (final NumberFormatException e) { | |
9523 | 95 e.printStackTrace(); |
9260 | 96 return "#ffffff"; |
97 } | |
98 } | |
99 | |
9071 | 100 public int getMin_day_overflow() { |
101 return this.min_day_overflow; | |
102 } | |
9118
431f1c269be5
Veg-Zone Table improved, State change data recovery;
gernotbelger
parents:
9071
diff
changeset
|
103 |
9443
515643b2c49a
Added computation of uinfo salix line vegetation zone height (not yet connected to the cross section facet)
mschaefer
parents:
9403
diff
changeset
|
104 public static String getLocalizedVegetationTypeName(final CallContext context, final VegetationType zonetype) { |
9661
9b8ba3b83a15
Importer (s/u-info) vegetation zones: new database column in vegetation_type table for german type name,
mschaefer
parents:
9523
diff
changeset
|
105 return zonetype.getLocalizedName(Resources.getLocale(context.getMeta())); |
9443
515643b2c49a
Added computation of uinfo salix line vegetation zone height (not yet connected to the cross section facet)
mschaefer
parents:
9403
diff
changeset
|
106 } |
515643b2c49a
Added computation of uinfo salix line vegetation zone height (not yet connected to the cross section facet)
mschaefer
parents:
9403
diff
changeset
|
107 |
9403 | 108 public static final List<VegetationZoneServerClientXChange> getStandardList(final River river, final CallContext context) { |
9118
431f1c269be5
Veg-Zone Table improved, State change data recovery;
gernotbelger
parents:
9071
diff
changeset
|
109 |
9403 | 110 final List<VegetationZoneServerClientXChange> list = new ArrayList<>(); |
9443
515643b2c49a
Added computation of uinfo salix line vegetation zone height (not yet connected to the cross section facet)
mschaefer
parents:
9403
diff
changeset
|
111 for (final VegetationZone vz : VegetationZone.getValues(river)) { |
515643b2c49a
Added computation of uinfo salix line vegetation zone height (not yet connected to the cross section facet)
mschaefer
parents:
9403
diff
changeset
|
112 final String zn = getLocalizedVegetationTypeName(context, vz.getVegetationType()); |
9403 | 113 list.add(new VegetationZoneServerClientXChange(zn, vz.getMin_overflow_days(), vz.getMax_overflow_days(), vz.getColor())); |
9402
e511eb935ccd
Changed hard coded standard vegetation zone table to fetching it from the database, i18n for the standard zone names
mschaefer
parents:
9260
diff
changeset
|
114 } |
9118
431f1c269be5
Veg-Zone Table improved, State change data recovery;
gernotbelger
parents:
9071
diff
changeset
|
115 return list; |
431f1c269be5
Veg-Zone Table improved, State change data recovery;
gernotbelger
parents:
9071
diff
changeset
|
116 } |
431f1c269be5
Veg-Zone Table improved, State change data recovery;
gernotbelger
parents:
9071
diff
changeset
|
117 |
9403 | 118 public static final String parseListToDataString(final List<VegetationZoneServerClientXChange> list) { |
9118
431f1c269be5
Veg-Zone Table improved, State change data recovery;
gernotbelger
parents:
9071
diff
changeset
|
119 |
431f1c269be5
Veg-Zone Table improved, State change data recovery;
gernotbelger
parents:
9071
diff
changeset
|
120 java.util.Collections.sort(list); |
431f1c269be5
Veg-Zone Table improved, State change data recovery;
gernotbelger
parents:
9071
diff
changeset
|
121 final StringBuilder builder = new StringBuilder(); |
9403 | 122 for (final VegetationZoneServerClientXChange zone : list) { |
9118
431f1c269be5
Veg-Zone Table improved, State change data recovery;
gernotbelger
parents:
9071
diff
changeset
|
123 builder.append(zone.getZoneName()); |
431f1c269be5
Veg-Zone Table improved, State change data recovery;
gernotbelger
parents:
9071
diff
changeset
|
124 builder.append(TABLE_CELL_SEPARATOR); |
431f1c269be5
Veg-Zone Table improved, State change data recovery;
gernotbelger
parents:
9071
diff
changeset
|
125 builder.append(zone.getMin_day_overflow()); |
431f1c269be5
Veg-Zone Table improved, State change data recovery;
gernotbelger
parents:
9071
diff
changeset
|
126 builder.append(TABLE_CELL_SEPARATOR); |
431f1c269be5
Veg-Zone Table improved, State change data recovery;
gernotbelger
parents:
9071
diff
changeset
|
127 builder.append(zone.getMax_day_overflow()); |
9260 | 128 builder.append(TABLE_CELL_SEPARATOR); |
129 builder.append(zone.getHexColor()); | |
9118
431f1c269be5
Veg-Zone Table improved, State change data recovery;
gernotbelger
parents:
9071
diff
changeset
|
130 builder.append(TABLE_ROW_SEPARATOR); |
431f1c269be5
Veg-Zone Table improved, State change data recovery;
gernotbelger
parents:
9071
diff
changeset
|
131 } |
431f1c269be5
Veg-Zone Table improved, State change data recovery;
gernotbelger
parents:
9071
diff
changeset
|
132 return builder.toString(); |
431f1c269be5
Veg-Zone Table improved, State change data recovery;
gernotbelger
parents:
9071
diff
changeset
|
133 |
431f1c269be5
Veg-Zone Table improved, State change data recovery;
gernotbelger
parents:
9071
diff
changeset
|
134 } |
431f1c269be5
Veg-Zone Table improved, State change data recovery;
gernotbelger
parents:
9071
diff
changeset
|
135 |
431f1c269be5
Veg-Zone Table improved, State change data recovery;
gernotbelger
parents:
9071
diff
changeset
|
136 @Override |
9403 | 137 public int compareTo(final VegetationZoneServerClientXChange o) { |
9118
431f1c269be5
Veg-Zone Table improved, State change data recovery;
gernotbelger
parents:
9071
diff
changeset
|
138 final int basicCompare = Integer.valueOf(this.getMin_day_overflow()).compareTo(o.getMin_day_overflow()); |
431f1c269be5
Veg-Zone Table improved, State change data recovery;
gernotbelger
parents:
9071
diff
changeset
|
139 if (basicCompare == 0) |
9260 | 140 return Integer.valueOf(this.getMax_day_overflow()).compareTo(o.getMax_day_overflow()); // wenn min==min && max==max, alphabetisch sortieren? |
141 | |
142 if (basicCompare == 0) { | |
143 return 1; // for treeSet | |
144 } | |
145 | |
9118
431f1c269be5
Veg-Zone Table improved, State change data recovery;
gernotbelger
parents:
9071
diff
changeset
|
146 return basicCompare; |
431f1c269be5
Veg-Zone Table improved, State change data recovery;
gernotbelger
parents:
9071
diff
changeset
|
147 } |
431f1c269be5
Veg-Zone Table improved, State change data recovery;
gernotbelger
parents:
9071
diff
changeset
|
148 |
9403 | 149 public static final boolean zonesAreOverlapping(final List<VegetationZoneServerClientXChange> list) { |
150 for (final VegetationZoneServerClientXChange zone : list) { | |
151 for (final VegetationZoneServerClientXChange zoneOther : list) { | |
9260 | 152 if (zone != zoneOther) { |
153 final boolean overlaps = zone.overlaps(zoneOther); | |
154 if (overlaps) { | |
155 return overlaps; // cancel. only one zone has to overlap | |
156 } | |
157 } | |
158 } | |
159 } | |
160 | |
161 return false; | |
162 } | |
163 | |
9403 | 164 public static final boolean hasGaps(final List<VegetationZoneServerClientXChange> list, final int lower, final int upper) { |
9260 | 165 |
166 if ((upper - lower) == 0) | |
167 return true; | |
168 | |
9403 | 169 final TreeSet<VegetationZoneServerClientXChange> treeList = new TreeSet<>(); |
9260 | 170 treeList.addAll(list); |
171 int lowerCompare = lower; | |
9403 | 172 for (final VegetationZoneServerClientXChange zone : treeList) { |
9523 | 173 if (zone.getLowerFromTo() > (lowerCompare)) { // nicht inklusiv |
9260 | 174 return true; |
175 } | |
176 lowerCompare = zone.getUpperFromTo(); | |
177 } | |
178 if ((lowerCompare) < upper) | |
179 return true; // am Ende nicht geschlossen | |
180 | |
181 return false; | |
182 } | |
183 | |
9403 | 184 private boolean overlaps(final VegetationZoneServerClientXChange otherZone) { |
9260 | 185 final int otherLower = otherZone.getLowerFromTo(); |
186 final int otherUpper = otherZone.getUpperFromTo(); | |
187 | |
188 final int upper = getUpperFromTo(); | |
189 final int lower = getLowerFromTo(); | |
9523 | 190 if ((otherUpper <= upper && otherUpper > lower)) { |
9260 | 191 return true; |
9523 | 192 } else if (otherLower >= lower && otherLower < upper) { |
9260 | 193 return true; |
9523 | 194 } else if (otherLower == lower && otherUpper == upper) { |
9260 | 195 return true; |
196 } | |
197 return false; | |
198 } | |
199 | |
200 public Integer getLowerFromTo() { | |
201 return this.min_day_overflow < this.max_day_overflow ? this.min_day_overflow : this.max_day_overflow; // Math. is forbidden :-( | |
202 } | |
203 | |
204 public Integer getUpperFromTo() { | |
205 return this.min_day_overflow > this.max_day_overflow ? this.min_day_overflow : this.max_day_overflow;// Math. is forbidden :-( | |
206 } | |
9523 | 207 } |