Mercurial > dive4elements > river
comparison flys-artifacts/src/main/java/de/intevation/flys/artifacts/states/WQAdapted.java @ 417:e54053bc0e70
Implemented the input validation of WQ in the adapted WQ panel.
flys-artifacts/trunk@1882 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Ingo Weinzierl <ingo.weinzierl@intevation.de> |
---|---|
date | Tue, 10 May 2011 15:28:30 +0000 |
parents | 34de11dcf355 |
children | 929137ee8154 |
comparison
equal
deleted
inserted
replaced
416:340dc41a7ea3 | 417:e54053bc0e70 |
---|---|
1 package de.intevation.flys.artifacts.states; | 1 package de.intevation.flys.artifacts.states; |
2 | 2 |
3 import java.util.ArrayList; | |
3 import java.util.List; | 4 import java.util.List; |
5 import java.util.Map; | |
4 | 6 |
5 import org.apache.log4j.Logger; | 7 import org.apache.log4j.Logger; |
6 | 8 |
7 import org.w3c.dom.Element; | 9 import org.w3c.dom.Element; |
8 | 10 |
9 import de.intevation.artifacts.Artifact; | 11 import de.intevation.artifacts.Artifact; |
10 import de.intevation.artifacts.CallContext; | 12 import de.intevation.artifacts.CallContext; |
11 | 13 |
12 import de.intevation.artifactdatabase.ProtocolUtils; | 14 import de.intevation.artifactdatabase.ProtocolUtils; |
15 import de.intevation.artifactdatabase.data.StateData; | |
13 | 16 |
14 import de.intevation.artifacts.common.utils.XMLUtils; | 17 import de.intevation.artifacts.common.utils.XMLUtils; |
15 | 18 |
16 import de.intevation.flys.model.Gauge; | 19 import de.intevation.flys.model.Gauge; |
17 import de.intevation.flys.model.Range; | 20 import de.intevation.flys.model.Range; |
21 import de.intevation.flys.model.River; | |
22 import de.intevation.flys.model.Wst; | |
18 | 23 |
19 import de.intevation.flys.artifacts.FLYSArtifact; | 24 import de.intevation.flys.artifacts.FLYSArtifact; |
25 import de.intevation.flys.artifacts.model.RangeWithValues; | |
26 import de.intevation.flys.artifacts.model.WstFactory; | |
20 | 27 |
21 | 28 |
22 /** | 29 /** |
23 * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a> | 30 * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a> |
24 */ | 31 */ |
144 | 151 |
145 @Override | 152 @Override |
146 protected String getUIProvider() { | 153 protected String getUIProvider() { |
147 return "wq_panel_adapted"; | 154 return "wq_panel_adapted"; |
148 } | 155 } |
156 | |
157 | |
158 public boolean validate(Artifact artifact, CallContext context) | |
159 throws IllegalArgumentException | |
160 { | |
161 logger.debug("WQAdapted.validate"); | |
162 | |
163 Map<String, StateData> data = getData(); | |
164 | |
165 String mode = (String) data.get(FIELD_WQ_MODE).getValue(); | |
166 | |
167 if (mode != null && mode.equals("W")) { | |
168 return validateW(artifact, context); | |
169 } | |
170 else if (mode != null && mode.equals("Q")) { | |
171 return validateQ(artifact, context); | |
172 } | |
173 else { | |
174 throw new IllegalArgumentException("error_feed_no_wq_mode_selected"); | |
175 } | |
176 } | |
177 | |
178 | |
179 protected boolean validateW(Artifact artifact, CallContext context) | |
180 throws IllegalArgumentException | |
181 { | |
182 logger.debug("WQAdapted.validateW"); | |
183 | |
184 RangeWithValues[] rwvs = extractInput(getData("wq_values")); | |
185 List<Gauge> gauges = ((FLYSArtifact) artifact).getGauges(); | |
186 | |
187 for (Gauge gauge: gauges) { | |
188 Range range = gauge.getRange(); | |
189 double lower = range.getA().doubleValue(); | |
190 double upper = range.getB().doubleValue(); | |
191 | |
192 for (RangeWithValues rwv: rwvs) { | |
193 if (lower <= rwv.getLower() && upper >= rwv.getUpper()) { | |
194 compareWsWithGauge(gauge, rwv.getValues()); | |
195 } | |
196 } | |
197 } | |
198 | |
199 return true; | |
200 } | |
201 | |
202 | |
203 protected boolean validateQ(Artifact artifact, CallContext context) | |
204 throws IllegalArgumentException | |
205 { | |
206 logger.debug("WQAdapted.validateQ"); | |
207 | |
208 RangeWithValues[] rwvs = extractInput(getData("wq_values")); | |
209 List<Gauge> gauges = ((FLYSArtifact) artifact).getGauges(); | |
210 River river = ((FLYSArtifact) artifact).getRiver(); | |
211 Wst wst = WstFactory.getWst(river); | |
212 | |
213 for (Gauge gauge: gauges) { | |
214 Range range = gauge.getRange(); | |
215 double lower = range.getA().doubleValue(); | |
216 double upper = range.getB().doubleValue(); | |
217 | |
218 for (RangeWithValues rwv: rwvs) { | |
219 if (lower <= rwv.getLower() && upper >= rwv.getUpper()) { | |
220 compareQsWithGauge(wst, gauge, rwv.getValues()); | |
221 } | |
222 } | |
223 } | |
224 | |
225 return true; | |
226 } | |
227 | |
228 | |
229 protected boolean compareQsWithGauge(Wst wst, Gauge gauge, double[] qs) | |
230 throws IllegalArgumentException | |
231 { | |
232 double[] minmax = gauge != null | |
233 ? wst.determineMinMaxQ(gauge.getRange()) | |
234 : null; | |
235 | |
236 if (minmax == null) { | |
237 logger.warn("Could not determine min/max Q of gauge."); | |
238 return true; | |
239 } | |
240 | |
241 if (logger.isDebugEnabled()) { | |
242 logger.debug("Validate Qs with:"); | |
243 logger.debug("-- Gauge: " + gauge.getName()); | |
244 logger.debug("-- Gauge min: " + minmax[0]); | |
245 logger.debug("-- Gauge max: " + minmax[1]); | |
246 } | |
247 | |
248 for (double q: qs) { | |
249 if (q < minmax[0] || q > minmax[1]) { | |
250 throw new IllegalArgumentException( | |
251 "error_feed_q_values_invalid"); | |
252 } | |
253 } | |
254 | |
255 return true; | |
256 } | |
257 | |
258 | |
259 protected boolean compareWsWithGauge(Gauge gauge, double[] ws) | |
260 throws IllegalArgumentException | |
261 { | |
262 double[] minmax = gauge != null | |
263 ? gauge.determineMinMaxW() | |
264 : null; | |
265 | |
266 if (minmax == null) { | |
267 logger.warn("Could not determine min/max W of gauge."); | |
268 return true; | |
269 } | |
270 | |
271 if (logger.isDebugEnabled()) { | |
272 logger.debug("Validate Ws with:"); | |
273 logger.debug("-- Gauge: " + gauge.getName()); | |
274 logger.debug("-- Gauge min: " + minmax[0]); | |
275 logger.debug("-- Gauge max: " + minmax[1]); | |
276 } | |
277 | |
278 for (double w: ws) { | |
279 if (w < minmax[0] || w > minmax[1]) { | |
280 throw new IllegalArgumentException( | |
281 "error_feed_w_values_invalid"); | |
282 } | |
283 } | |
284 | |
285 return true; | |
286 } | |
287 | |
288 | |
289 protected RangeWithValues[] extractInput(StateData data) { | |
290 String dataString = (String) data.getValue(); | |
291 String[] ranges = dataString.split(":"); | |
292 | |
293 List<RangeWithValues> rwv = new ArrayList<RangeWithValues>(); | |
294 | |
295 for (String range: ranges) { | |
296 String[] parts = range.split(";"); | |
297 | |
298 double lower = Double.parseDouble(parts[0]); | |
299 double upper = Double.parseDouble(parts[1]); | |
300 | |
301 String[] values = parts[2].split(","); | |
302 | |
303 int num = values.length; | |
304 double[] res = new double[num]; | |
305 | |
306 for (int i = 0; i < num; i++) { | |
307 try { | |
308 res[i] = Double.parseDouble(values[i]); | |
309 } | |
310 catch (NumberFormatException nfe) { | |
311 logger.warn(nfe, nfe); | |
312 } | |
313 } | |
314 | |
315 rwv.add(new RangeWithValues(lower, upper, res)); | |
316 } | |
317 | |
318 return (RangeWithValues[]) rwv.toArray(new RangeWithValues[rwv.size()]); | |
319 } | |
149 } | 320 } |
150 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 : | 321 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 : |