Mercurial > dive4elements > river
annotate artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/DistanceOnlyPartHistoricalSelect.java @ 9321:a978b601a034
Salix: Fixed ArrrayoutOfBoundsException; minor cleanup
author | gernotbelger |
---|---|
date | Fri, 27 Jul 2018 10:25:09 +0200 |
parents | f48a8dc78529 |
children | e014eca211a3 |
rev | line source |
---|---|
9246 | 1 /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde |
2 * Software engineering by Intevation GmbH | |
3 * | |
4 * This file is Free Software under the GNU AGPL (>=v3) | |
5 * and comes with ABSOLUTELY NO WARRANTY! Check out the | |
6 * documentation coming with Dive4Elements River for details. | |
7 */ | |
8 | |
9 package org.dive4elements.river.artifacts.uinfo.salix; | |
10 | |
11 import java.util.HashMap; | |
12 import java.util.Iterator; | |
13 import java.util.List; | |
14 import java.util.Map; | |
15 import java.util.TreeMap; | |
16 | |
17 import org.dive4elements.artifacts.Artifact; | |
18 import org.dive4elements.artifacts.CallContext; | |
19 import org.dive4elements.artifacts.common.utils.XMLUtils.ElementCreator; | |
20 import org.dive4elements.river.artifacts.resources.Resources; | |
21 import org.dive4elements.river.artifacts.states.AddTableDataHelper; | |
22 import org.dive4elements.river.artifacts.states.DistanceOnlySelect; | |
23 import org.dive4elements.river.artifacts.uinfo.UINFOArtifact; | |
24 import org.dive4elements.river.model.BedHeight; | |
9247
1ec3b891ab02
salix.historical.distance_only_part detail work
gernotbelger
parents:
9246
diff
changeset
|
25 import org.dive4elements.river.model.River; |
1ec3b891ab02
salix.historical.distance_only_part detail work
gernotbelger
parents:
9246
diff
changeset
|
26 import org.dive4elements.river.utils.Formatter; |
9246 | 27 import org.w3c.dom.Element; |
28 | |
29 public class DistanceOnlyPartHistoricalSelect extends DistanceOnlySelect { | |
30 | |
31 private static final long serialVersionUID = 1L; | |
32 | |
9321
a978b601a034
Salix: Fixed ArrrayoutOfBoundsException; minor cleanup
gernotbelger
parents:
9271
diff
changeset
|
33 private List<BedHeight> bhs = null; |
a978b601a034
Salix: Fixed ArrrayoutOfBoundsException; minor cleanup
gernotbelger
parents:
9271
diff
changeset
|
34 private Integer epoch = null; |
a978b601a034
Salix: Fixed ArrrayoutOfBoundsException; minor cleanup
gernotbelger
parents:
9271
diff
changeset
|
35 private Integer year = null; |
a978b601a034
Salix: Fixed ArrrayoutOfBoundsException; minor cleanup
gernotbelger
parents:
9271
diff
changeset
|
36 private Double lowerKm = null; |
a978b601a034
Salix: Fixed ArrrayoutOfBoundsException; minor cleanup
gernotbelger
parents:
9271
diff
changeset
|
37 private Double upperKm = null; |
a978b601a034
Salix: Fixed ArrrayoutOfBoundsException; minor cleanup
gernotbelger
parents:
9271
diff
changeset
|
38 private River river = null; |
9246 | 39 |
40 @Override | |
41 protected String getUIProvider() { | |
42 return "distance_only_part_historical_panel"; | |
43 } | |
44 | |
45 @Override | |
46 protected String getTitle(final CallContext context) { | |
47 // REMARK: that is how it should be: return Resources.getMsg(context.getMeta(), getID()); | |
9271 | 48 return Resources.getMsg(context.getMeta(), "state.title.salix.historical.distance_part_state"); |
9246 | 49 } |
50 | |
51 @Override | |
52 protected void appendItems(final Artifact artifact, final ElementCreator creator, final String name, final CallContext context, final Element select) { | |
53 final String datakey = "bedheights_for_part"; | |
54 | |
55 try { | |
56 if (datakey.equals(name)) { | |
9321
a978b601a034
Salix: Fixed ArrrayoutOfBoundsException; minor cleanup
gernotbelger
parents:
9271
diff
changeset
|
57 makeDataSourceYearEpoch(creator, select, context, getBedheights(artifact)); // ist nur n test |
9246 | 58 } else if (name.equals("ld_from_part")) { |
59 | |
60 final SalixLineAccess access = new SalixLineAccess((UINFOArtifact) artifact); | |
61 final double lowerSoundings = this.getLowerUpperKmRange(getBedheights(artifact))[0]; | |
62 final double lowerKm = access.getLowerKm() > lowerSoundings ? access.getLowerKm() : lowerSoundings; | |
63 | |
64 creator.addAttr(select, "type", "options", true); | |
65 | |
66 final Element item = creator.create("item"); | |
67 creator.addAttr(item, "label", "from_test", true); | |
68 creator.addAttr(item, "value", String.valueOf(lowerKm), true); | |
69 | |
70 select.appendChild(item); | |
71 } | |
72 | |
73 else if (name.equals("ld_to_part")) { | |
74 final SalixLineAccess access = new SalixLineAccess((UINFOArtifact) artifact); | |
75 final double upperSoundings = this.getLowerUpperKmRange(getBedheights(artifact))[1]; | |
76 final double upperKm = access.getUpperKm() < upperSoundings ? access.getUpperKm() : upperSoundings; | |
77 | |
78 creator.addAttr(select, "type", "options", true); | |
79 | |
80 final Element item = creator.create("item"); | |
81 creator.addAttr(item, "label", "to_test", true); | |
82 creator.addAttr(item, "value", String.valueOf(upperKm), true); | |
83 | |
84 select.appendChild(item); | |
85 | |
86 } | |
87 } | |
88 catch ( | |
89 | |
9321
a978b601a034
Salix: Fixed ArrrayoutOfBoundsException; minor cleanup
gernotbelger
parents:
9271
diff
changeset
|
90 final IllegalArgumentException iae) { |
9246 | 91 iae.printStackTrace(); |
92 } | |
93 } | |
94 | |
95 private List<BedHeight> getBedheights(final Artifact artifact) { | |
9247
1ec3b891ab02
salix.historical.distance_only_part detail work
gernotbelger
parents:
9246
diff
changeset
|
96 |
1ec3b891ab02
salix.historical.distance_only_part detail work
gernotbelger
parents:
9246
diff
changeset
|
97 final SalixLineAccess access = new SalixLineAccess((UINFOArtifact) artifact); // improved lazy-loading |
1ec3b891ab02
salix.historical.distance_only_part detail work
gernotbelger
parents:
9246
diff
changeset
|
98 final Integer year = access.getYear(); |
1ec3b891ab02
salix.historical.distance_only_part detail work
gernotbelger
parents:
9246
diff
changeset
|
99 final Integer epoch = access.getEpoch(); |
1ec3b891ab02
salix.historical.distance_only_part detail work
gernotbelger
parents:
9246
diff
changeset
|
100 final River river = access.getRiver(); // comparable? workflow does not allow return and change anyway... |
1ec3b891ab02
salix.historical.distance_only_part detail work
gernotbelger
parents:
9246
diff
changeset
|
101 final Double lower = access.getLowerKm(); |
1ec3b891ab02
salix.historical.distance_only_part detail work
gernotbelger
parents:
9246
diff
changeset
|
102 final Double upper = access.getUpperKm(); |
1ec3b891ab02
salix.historical.distance_only_part detail work
gernotbelger
parents:
9246
diff
changeset
|
103 if (!(this.year == year && this.epoch == epoch && this.river == river && this.lowerKm == lower && this.upperKm == upper)) { |
1ec3b891ab02
salix.historical.distance_only_part detail work
gernotbelger
parents:
9246
diff
changeset
|
104 this.bhs = null; |
1ec3b891ab02
salix.historical.distance_only_part detail work
gernotbelger
parents:
9246
diff
changeset
|
105 } |
9246 | 106 if (this.bhs == null) { |
107 final boolean isEpoch = epoch == null ? false : true; | |
9247
1ec3b891ab02
salix.historical.distance_only_part detail work
gernotbelger
parents:
9246
diff
changeset
|
108 this.bhs = BedHeight.getBedHeightYearEpoch(isEpoch, isEpoch ? epoch : year, river, lower, upper); |
1ec3b891ab02
salix.historical.distance_only_part detail work
gernotbelger
parents:
9246
diff
changeset
|
109 this.year = year; |
1ec3b891ab02
salix.historical.distance_only_part detail work
gernotbelger
parents:
9246
diff
changeset
|
110 this.epoch = epoch; |
1ec3b891ab02
salix.historical.distance_only_part detail work
gernotbelger
parents:
9246
diff
changeset
|
111 this.river = river; |
1ec3b891ab02
salix.historical.distance_only_part detail work
gernotbelger
parents:
9246
diff
changeset
|
112 this.lowerKm = lower; |
1ec3b891ab02
salix.historical.distance_only_part detail work
gernotbelger
parents:
9246
diff
changeset
|
113 this.upperKm = upper; |
9246 | 114 } |
115 return this.bhs; | |
116 | |
117 } | |
118 | |
9321
a978b601a034
Salix: Fixed ArrrayoutOfBoundsException; minor cleanup
gernotbelger
parents:
9271
diff
changeset
|
119 private static final void makeDataSourceYearEpoch(final ElementCreator creator, final Element select, final CallContext context, |
9246 | 120 final List<BedHeight> bedheights) { |
121 | |
122 final AddTableDataHelper helper = new AddTableDataHelper(creator, select, "year", context.getMeta()); | |
123 | |
9247
1ec3b891ab02
salix.historical.distance_only_part detail work
gernotbelger
parents:
9246
diff
changeset
|
124 // TODO: probably aggregating results, no sound-row, output as single row |
1ec3b891ab02
salix.historical.distance_only_part detail work
gernotbelger
parents:
9246
diff
changeset
|
125 |
1ec3b891ab02
salix.historical.distance_only_part detail work
gernotbelger
parents:
9246
diff
changeset
|
126 int year = 0; // hässlich, aber kommt vermutlich eh bald weg |
1ec3b891ab02
salix.historical.distance_only_part detail work
gernotbelger
parents:
9246
diff
changeset
|
127 if (bedheights != null && bedheights.size() > 0) |
1ec3b891ab02
salix.historical.distance_only_part detail work
gernotbelger
parents:
9246
diff
changeset
|
128 year = bedheights.get(0).getYear(); // das jahr/epoche ist immer dasselbe |
1ec3b891ab02
salix.historical.distance_only_part detail work
gernotbelger
parents:
9246
diff
changeset
|
129 |
1ec3b891ab02
salix.historical.distance_only_part detail work
gernotbelger
parents:
9246
diff
changeset
|
130 helper.addColumn(0, "year", "60", "year", "INTEGER", "LEFT", null); |
1ec3b891ab02
salix.historical.distance_only_part detail work
gernotbelger
parents:
9246
diff
changeset
|
131 helper.addColumn(1, "range", "130", "state.uinfo.salix.historical.km_range_part", "STRING", "LEFT", null); |
1ec3b891ab02
salix.historical.distance_only_part detail work
gernotbelger
parents:
9246
diff
changeset
|
132 helper.addColumn(2, "description", "500", "uinfo.salix.sounding", "STRING", "LEFT", null); |
9246 | 133 |
134 final TreeMap<String, String> bedHeightSorted = new TreeMap<>(); | |
135 final double min = Double.MAX_VALUE; | |
136 final double max = -Double.MAX_VALUE; | |
9247
1ec3b891ab02
salix.historical.distance_only_part detail work
gernotbelger
parents:
9246
diff
changeset
|
137 final java.text.NumberFormat formatter = Formatter.getCalculationKm(context.getMeta()); |
9246 | 138 |
139 for (final BedHeight bh : bedheights) { | |
140 final org.dive4elements.river.model.Range range = BedHeight.getRangeFromBedHeights(bh); | |
141 final Double from = range.getA().doubleValue(); // NullPointer check?? | |
142 final Double to = range.getB().doubleValue(); | |
143 | |
9247
1ec3b891ab02
salix.historical.distance_only_part detail work
gernotbelger
parents:
9246
diff
changeset
|
144 bedHeightSorted.put(bh.getDescription(), formatter.format(from) + " - " + formatter.format(to)); |
9246 | 145 } |
146 final Iterator<String> iterator = bedHeightSorted.keySet().iterator(); | |
147 while (iterator.hasNext()) { | |
148 final String descr = iterator.next(); | |
149 final String fromTo = bedHeightSorted.get(descr); | |
150 final Map<String, String> row = new HashMap<>(); | |
9247
1ec3b891ab02
salix.historical.distance_only_part detail work
gernotbelger
parents:
9246
diff
changeset
|
151 row.put("year", String.valueOf(year)); |
1ec3b891ab02
salix.historical.distance_only_part detail work
gernotbelger
parents:
9246
diff
changeset
|
152 row.put("range", fromTo); |
9246 | 153 row.put("description", descr); |
154 helper.addRow(row); | |
155 } | |
156 | |
157 helper.submitMapToXml(); | |
158 } | |
159 | |
160 private double[] getLowerUpperKmRange(final List<BedHeight> bedheights) { | |
161 double min = Double.MAX_VALUE; | |
162 double max = -Double.MAX_VALUE; | |
163 | |
164 for (final BedHeight bh : bedheights) { | |
165 final org.dive4elements.river.model.Range range = BedHeight.getRangeFromBedHeights(bh); | |
166 try { | |
167 final Double from = range.getA().doubleValue(); // NullPointer check?? -> try catch | |
168 final Double to = range.getB().doubleValue(); | |
169 | |
170 final double upper = to > from ? to : from; | |
171 final double lower = from < to ? from : to; | |
172 if (upper > max) | |
173 max = upper; | |
174 | |
175 if (lower < min) | |
176 min = lower; | |
177 } | |
178 catch (final Exception e) { | |
179 e.printStackTrace(); | |
180 } | |
181 | |
182 } | |
183 return new double[] { min, max }; | |
184 } | |
9321
a978b601a034
Salix: Fixed ArrrayoutOfBoundsException; minor cleanup
gernotbelger
parents:
9271
diff
changeset
|
185 } |