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 }

http://dive4elements.wald.intevation.org