# HG changeset patch # User Ingo Weinzierl # Date 1305041310 0 # Node ID e54053bc0e701ddd5e23e9a77563b9a77b8798d4 # Parent 340dc41a7ea37c66d9171614d15032529475a86d Implemented the input validation of WQ in the adapted WQ panel. flys-artifacts/trunk@1882 c6561f87-3c4e-4783-a992-168aeb5c3f6f diff -r 340dc41a7ea3 -r e54053bc0e70 flys-artifacts/ChangeLog --- a/flys-artifacts/ChangeLog Tue May 10 13:18:03 2011 +0000 +++ b/flys-artifacts/ChangeLog Tue May 10 15:28:30 2011 +0000 @@ -1,3 +1,13 @@ +2011-05-10 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/model/RangeWithValues.java: + New. A data structure that enables us to save a data triple: a range + that consist of lower and upper double value and a set of values that + belong to this range. + + * src/main/java/de/intevation/flys/artifacts/states/WQAdapted.java: + Implemented the validation of W/Q values. + 2011-05-10 Ingo Weinzierl * src/main/java/de/intevation/flys/exports/AbstractExporter.java: New diff -r 340dc41a7ea3 -r e54053bc0e70 flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/RangeWithValues.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/RangeWithValues.java Tue May 10 15:28:30 2011 +0000 @@ -0,0 +1,41 @@ +package de.intevation.flys.artifacts.model; + +import java.io.Serializable; + + +/** + * @author Ingo Weinzierl + */ +public class RangeWithValues implements Serializable { + + protected double lower; + protected double upper; + protected double[] values; + + + public RangeWithValues() { + } + + + public RangeWithValues(double lower, double upper, double[] values) { + this.lower = lower; + this.upper = upper; + this.values = values; + } + + + public double getLower() { + return lower; + } + + + public double getUpper() { + return upper; + } + + + public double[] getValues() { + return values; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 : diff -r 340dc41a7ea3 -r e54053bc0e70 flys-artifacts/src/main/java/de/intevation/flys/artifacts/states/WQAdapted.java --- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/states/WQAdapted.java Tue May 10 13:18:03 2011 +0000 +++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/states/WQAdapted.java Tue May 10 15:28:30 2011 +0000 @@ -1,6 +1,8 @@ package de.intevation.flys.artifacts.states; +import java.util.ArrayList; import java.util.List; +import java.util.Map; import org.apache.log4j.Logger; @@ -10,13 +12,18 @@ import de.intevation.artifacts.CallContext; import de.intevation.artifactdatabase.ProtocolUtils; +import de.intevation.artifactdatabase.data.StateData; import de.intevation.artifacts.common.utils.XMLUtils; import de.intevation.flys.model.Gauge; import de.intevation.flys.model.Range; +import de.intevation.flys.model.River; +import de.intevation.flys.model.Wst; import de.intevation.flys.artifacts.FLYSArtifact; +import de.intevation.flys.artifacts.model.RangeWithValues; +import de.intevation.flys.artifacts.model.WstFactory; /** @@ -146,5 +153,169 @@ protected String getUIProvider() { return "wq_panel_adapted"; } + + + public boolean validate(Artifact artifact, CallContext context) + throws IllegalArgumentException + { + logger.debug("WQAdapted.validate"); + + Map data = getData(); + + String mode = (String) data.get(FIELD_WQ_MODE).getValue(); + + if (mode != null && mode.equals("W")) { + return validateW(artifact, context); + } + else if (mode != null && mode.equals("Q")) { + return validateQ(artifact, context); + } + else { + throw new IllegalArgumentException("error_feed_no_wq_mode_selected"); + } + } + + + protected boolean validateW(Artifact artifact, CallContext context) + throws IllegalArgumentException + { + logger.debug("WQAdapted.validateW"); + + RangeWithValues[] rwvs = extractInput(getData("wq_values")); + List gauges = ((FLYSArtifact) artifact).getGauges(); + + for (Gauge gauge: gauges) { + Range range = gauge.getRange(); + double lower = range.getA().doubleValue(); + double upper = range.getB().doubleValue(); + + for (RangeWithValues rwv: rwvs) { + if (lower <= rwv.getLower() && upper >= rwv.getUpper()) { + compareWsWithGauge(gauge, rwv.getValues()); + } + } + } + + return true; + } + + + protected boolean validateQ(Artifact artifact, CallContext context) + throws IllegalArgumentException + { + logger.debug("WQAdapted.validateQ"); + + RangeWithValues[] rwvs = extractInput(getData("wq_values")); + List gauges = ((FLYSArtifact) artifact).getGauges(); + River river = ((FLYSArtifact) artifact).getRiver(); + Wst wst = WstFactory.getWst(river); + + for (Gauge gauge: gauges) { + Range range = gauge.getRange(); + double lower = range.getA().doubleValue(); + double upper = range.getB().doubleValue(); + + for (RangeWithValues rwv: rwvs) { + if (lower <= rwv.getLower() && upper >= rwv.getUpper()) { + compareQsWithGauge(wst, gauge, rwv.getValues()); + } + } + } + + return true; + } + + + protected boolean compareQsWithGauge(Wst wst, Gauge gauge, double[] qs) + throws IllegalArgumentException + { + double[] minmax = gauge != null + ? wst.determineMinMaxQ(gauge.getRange()) + : null; + + if (minmax == null) { + logger.warn("Could not determine min/max Q of gauge."); + return true; + } + + if (logger.isDebugEnabled()) { + logger.debug("Validate Qs with:"); + logger.debug("-- Gauge: " + gauge.getName()); + logger.debug("-- Gauge min: " + minmax[0]); + logger.debug("-- Gauge max: " + minmax[1]); + } + + for (double q: qs) { + if (q < minmax[0] || q > minmax[1]) { + throw new IllegalArgumentException( + "error_feed_q_values_invalid"); + } + } + + return true; + } + + + protected boolean compareWsWithGauge(Gauge gauge, double[] ws) + throws IllegalArgumentException + { + double[] minmax = gauge != null + ? gauge.determineMinMaxW() + : null; + + if (minmax == null) { + logger.warn("Could not determine min/max W of gauge."); + return true; + } + + if (logger.isDebugEnabled()) { + logger.debug("Validate Ws with:"); + logger.debug("-- Gauge: " + gauge.getName()); + logger.debug("-- Gauge min: " + minmax[0]); + logger.debug("-- Gauge max: " + minmax[1]); + } + + for (double w: ws) { + if (w < minmax[0] || w > minmax[1]) { + throw new IllegalArgumentException( + "error_feed_w_values_invalid"); + } + } + + return true; + } + + + protected RangeWithValues[] extractInput(StateData data) { + String dataString = (String) data.getValue(); + String[] ranges = dataString.split(":"); + + List rwv = new ArrayList(); + + for (String range: ranges) { + String[] parts = range.split(";"); + + double lower = Double.parseDouble(parts[0]); + double upper = Double.parseDouble(parts[1]); + + String[] values = parts[2].split(","); + + int num = values.length; + double[] res = new double[num]; + + for (int i = 0; i < num; i++) { + try { + res[i] = Double.parseDouble(values[i]); + } + catch (NumberFormatException nfe) { + logger.warn(nfe, nfe); + } + } + + rwv.add(new RangeWithValues(lower, upper, res)); + } + + return (RangeWithValues[]) rwv.toArray(new RangeWithValues[rwv.size()]); + } } // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :