Mercurial > dive4elements > river
comparison artifacts/src/main/java/org/dive4elements/river/artifacts/model/OfficialLineFinder.java @ 6494:1e97d2e95410
Amtl. Linien: Fixed problem that only a random official line is detect.
author | Sascha L. Teichmann <teichmann@intevation.de> |
---|---|
date | Fri, 28 Jun 2013 12:52:51 +0200 |
parents | f579e4a80b84 |
children | 1e6bd2831280 |
comparison
equal
deleted
inserted
replaced
6493:c740a4815bb2 | 6494:1e97d2e95410 |
---|---|
15 import java.util.Map; | 15 import java.util.Map; |
16 | 16 |
17 import net.sf.ehcache.Cache; | 17 import net.sf.ehcache.Cache; |
18 import net.sf.ehcache.Element; | 18 import net.sf.ehcache.Element; |
19 | 19 |
20 import org.apache.log4j.Logger; | |
20 import org.dive4elements.river.artifacts.D4EArtifact; | 21 import org.dive4elements.river.artifacts.D4EArtifact; |
21 import org.dive4elements.river.artifacts.cache.CacheFactory; | 22 import org.dive4elements.river.artifacts.cache.CacheFactory; |
22 import org.dive4elements.river.model.Gauge; | 23 import org.dive4elements.river.model.Gauge; |
23 import org.dive4elements.river.model.MainValue; | 24 import org.dive4elements.river.model.MainValue; |
24 import org.dive4elements.river.model.NamedMainValue; | 25 import org.dive4elements.river.model.NamedMainValue; |
28 import org.dive4elements.river.model.WstColumn; | 29 import org.dive4elements.river.model.WstColumn; |
29 | 30 |
30 public class OfficialLineFinder | 31 public class OfficialLineFinder |
31 { | 32 { |
32 public static final String CACHE_NAME = "official-lines"; | 33 public static final String CACHE_NAME = "official-lines"; |
34 | |
35 private static Logger log = Logger.getLogger(OfficialLineFinder.class); | |
33 | 36 |
34 // We will only have one entry in this cache. | 37 // We will only have one entry in this cache. |
35 public static final String CACHE_KEY = CACHE_NAME; | 38 public static final String CACHE_KEY = CACHE_NAME; |
36 | 39 |
37 public static final double EPSILON = 1e-4; | 40 public static final double EPSILON = 1e-4; |
85 return false; | 88 return false; |
86 } | 89 } |
87 ValueRange r = (ValueRange)o; | 90 ValueRange r = (ValueRange)o; |
88 return wstId == r.wstId && columnPos == r.columnPos; | 91 return wstId == r.wstId && columnPos == r.columnPos; |
89 } | 92 } |
93 | |
94 @Override | |
95 public String toString() { | |
96 return "[" + name + | |
97 " value: " + value + | |
98 " wstId: " + wstId + | |
99 " pos: " + columnPos + "]"; | |
100 } | |
90 } | 101 } |
91 | 102 |
92 public OfficialLineFinder() { | 103 public OfficialLineFinder() { |
93 } | 104 } |
94 | 105 |
113 | 124 |
114 } | 125 } |
115 | 126 |
116 public static Map<String, List<ValueRange>> getAllUncached() { | 127 public static Map<String, List<ValueRange>> getAllUncached() { |
117 | 128 |
129 boolean debug = log.isDebugEnabled(); | |
130 | |
118 Map<String, List<ValueRange>> rivers2officialLines = | 131 Map<String, List<ValueRange>> rivers2officialLines = |
119 new HashMap<String, List<ValueRange>>(); | 132 new HashMap<String, List<ValueRange>>(); |
120 | 133 |
121 | |
122 for (OfficialLine line: OfficialLine.fetchAllOfficalLines()) { | 134 for (OfficialLine line: OfficialLine.fetchAllOfficalLines()) { |
123 String name = line.getNamedMainValue().getName(); | 135 NamedMainValue nmv = line.getNamedMainValue(); |
124 WstColumn wc = line.getWstColumn(); | 136 Integer mnvId = nmv.getId(); |
125 Wst wst = wc.getWst(); | 137 WstColumn wc = line.getWstColumn(); |
138 Wst wst = wc.getWst(); | |
126 | 139 |
127 List<ValueRange> ranges = new ArrayList<ValueRange>(); | 140 List<ValueRange> ranges = new ArrayList<ValueRange>(); |
128 | 141 |
129 River river = wst.getRiver(); | 142 River river = wst.getRiver(); |
130 List<Gauge> gauges = river.getGauges(); | 143 List<Gauge> gauges = river.getGauges(); |
131 for (Gauge gauge: gauges) { | 144 for (Gauge gauge: gauges) { |
132 List<MainValue> mainValues = gauge.getMainValues(); | 145 List<MainValue> mainValues = gauge.getMainValues(); |
133 for (MainValue mainValue: mainValues) { | 146 for (MainValue mainValue: mainValues) { |
134 NamedMainValue nmv = mainValue.getMainValue(); | 147 NamedMainValue tnmv = mainValue.getMainValue(); |
135 if (nmv.getName().equalsIgnoreCase(name)) { | 148 if (tnmv.getId().equals(mnvId)) { |
136 // found gauge with this main value | 149 // found gauge with this main value |
137 | 150 |
138 double from = gauge.getRange().getA().doubleValue(); | 151 double from = gauge.getRange().getA().doubleValue(); |
139 double to = gauge.getRange().getA().doubleValue(); | 152 double to = gauge.getRange().getA().doubleValue(); |
140 double value = mainValue.getValue().doubleValue(); | 153 double value = mainValue.getValue().doubleValue(); |
141 int wstId = wst.getId(); | 154 int wstId = wst.getId(); |
142 int pos = wc.getPosition(); | 155 int pos = wc.getPosition(); |
143 ValueRange range = | 156 ValueRange range = new ValueRange( |
144 new ValueRange(from, to, value, wstId, pos, name); | 157 from, to, value, wstId, pos, nmv.getName()); |
158 | |
159 if (debug) { | |
160 log.debug( | |
161 "river: " + river.getName() + | |
162 " gauge: " + gauge.getName() + | |
163 " ol: " + range); | |
164 } | |
145 ranges.add(range); | 165 ranges.add(range); |
146 break; | 166 break; |
147 } | 167 } |
148 } | 168 } |
149 } | 169 } |
150 | 170 |
151 if (!ranges.isEmpty()) { | 171 if (!ranges.isEmpty()) { |
152 rivers2officialLines.put(river.getName(), ranges); | 172 String rname = river.getName(); |
173 List<ValueRange> old = rivers2officialLines.get(rname); | |
174 if (old != null) { | |
175 old.addAll(ranges); | |
176 } | |
177 else { | |
178 rivers2officialLines.put(rname, ranges); | |
179 } | |
153 } | 180 } |
154 } | 181 } |
155 | 182 |
156 return rivers2officialLines; | 183 return rivers2officialLines; |
157 } | 184 } |
161 private static final String nn(String s) { | 188 private static final String nn(String s) { |
162 return s != null ? s : ""; | 189 return s != null ? s : ""; |
163 } | 190 } |
164 | 191 |
165 public static Range extractRange(D4EArtifact artifact) { | 192 public static Range extractRange(D4EArtifact artifact) { |
193 | |
166 String mode = nn(artifact.getDataAsString("ld_mode")); | 194 String mode = nn(artifact.getDataAsString("ld_mode")); |
167 String locations = nn(artifact.getDataAsString("ld_locations")); | 195 String locations = nn(artifact.getDataAsString("ld_locations")); |
168 String from = nn(artifact.getDataAsString("ld_from")); | 196 String from = nn(artifact.getDataAsString("ld_from")); |
169 String to = nn(artifact.getDataAsString("ld_to")); | 197 String to = nn(artifact.getDataAsString("ld_to")); |
198 | |
199 if (log.isDebugEnabled()) { | |
200 log.debug("ld_mode: '" + mode + "'"); | |
201 log.debug("ld_locations: '" + locations + "'"); | |
202 log.debug("ld_from: '" + from + "'"); | |
203 log.debug("ld_to: '" + to + "'"); | |
204 } | |
170 | 205 |
171 if (mode.equals("location")) { | 206 if (mode.equals("location")) { |
172 try { | 207 try { |
173 String loc = locations.replace(" ", ""); | 208 String loc = locations.replace(" ", ""); |
174 String[] split = loc.split(","); | 209 String[] split = loc.split(","); |
307 List<ValueRange> ranges = rivers2officialLines.get(riverName); | 342 List<ValueRange> ranges = rivers2officialLines.get(riverName); |
308 | 343 |
309 if (ranges == null) { | 344 if (ranges == null) { |
310 return Collections.<ValueRange>emptyList(); | 345 return Collections.<ValueRange>emptyList(); |
311 } | 346 } |
347 boolean debug = log.isDebugEnabled(); | |
348 | |
349 if (debug) { | |
350 log.debug("Before range filter:" + ranges); | |
351 } | |
312 | 352 |
313 ranges = filterByRange(extractRange(artifact), ranges); | 353 ranges = filterByRange(extractRange(artifact), ranges); |
354 | |
355 if (debug) { | |
356 log.debug("After range filter:" + ranges); | |
357 } | |
314 | 358 |
315 if (ranges.isEmpty()) { | 359 if (ranges.isEmpty()) { |
316 return Collections.<ValueRange>emptyList(); | 360 return Collections.<ValueRange>emptyList(); |
317 } | 361 } |
318 | 362 |
322 | 366 |
323 if (qRange == Q_OUT_OF_RANGE) { | 367 if (qRange == Q_OUT_OF_RANGE) { |
324 qRange = tripleQRange(artifact); | 368 qRange = tripleQRange(artifact); |
325 } | 369 } |
326 | 370 |
327 return filterByQRange(qRange, ranges); | 371 if (debug) { |
372 log.debug("Q range filter: " + qRange); | |
373 } | |
374 | |
375 ranges = filterByQRange(qRange, ranges); | |
376 | |
377 if (debug) { | |
378 log.debug("After q range filter: " + ranges); | |
379 } | |
380 | |
381 return ranges; | |
328 } | 382 } |
329 } | 383 } |