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 :

http://dive4elements.wald.intevation.org