# HG changeset patch # User Ingo Weinzierl # Date 1308060019 0 # Node ID a078ba1c139d7ce722a30cfef8a21b61ef501520 # Parent 55a90afaf51326a15f42cd19d7b293ddf419cf1e Introduced a client side input validation for the adapted WQ panel. flys-client/trunk@2112 c6561f87-3c4e-4783-a992-168aeb5c3f6f diff -r 55a90afaf513 -r a078ba1c139d flys-client/ChangeLog --- a/flys-client/ChangeLog Tue Jun 14 11:31:33 2011 +0000 +++ b/flys-client/ChangeLog Tue Jun 14 14:00:19 2011 +0000 @@ -1,3 +1,18 @@ +2011-06-14 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/shared/model/WQDataItem.java: + New. This DataItem is used to save min/max W/Q values. This enables the + UIProvider to validate the entered values. Currently, this is used in the + WQAdaptedInputPanel only. + + * src/main/java/de/intevation/flys/client/server/ArtifactDescriptionFactory.java: + Read the W/Q ranges from DESCRIBE document and create WQDataItems if + they are existing. + + * src/main/java/de/intevation/flys/client/client/ui/WQAdaptedInputPanel.java: + Introduced a client side input validation for the entered W/Q values + with respect on their format and min/max range. + 2011-06-14 Ingo Weinzierl * src/main/java/de/intevation/flys/client/client/ui/WQInputPanel.java: The diff -r 55a90afaf513 -r a078ba1c139d flys-client/src/main/java/de/intevation/flys/client/client/ui/WQAdaptedInputPanel.java --- a/flys-client/src/main/java/de/intevation/flys/client/client/ui/WQAdaptedInputPanel.java Tue Jun 14 11:31:33 2011 +0000 +++ b/flys-client/src/main/java/de/intevation/flys/client/client/ui/WQAdaptedInputPanel.java Tue Jun 14 14:00:19 2011 +0000 @@ -1,5 +1,6 @@ package de.intevation.flys.client.client.ui; +import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashMap; @@ -7,6 +8,7 @@ import java.util.Map; import com.google.gwt.core.client.GWT; +import com.google.gwt.i18n.client.NumberFormat; import com.smartgwt.client.types.TitleOrientation; import com.smartgwt.client.types.VerticalAlignment; @@ -26,6 +28,7 @@ import de.intevation.flys.client.shared.model.DataList; import de.intevation.flys.client.shared.model.DefaultData; import de.intevation.flys.client.shared.model.DefaultDataItem; +import de.intevation.flys.client.shared.model.WQDataItem; import de.intevation.flys.client.client.FLYSConstants; @@ -59,6 +62,12 @@ /** Stores the input panels related to their keys.*/ protected Map wqranges; + /** Stores the min/max values for each q range.*/ + protected Map qranges; + + /** Stores the min/max values for each w range.*/ + protected Map wranges; + /** The RadioGroupItem that determines the w/q input mode.*/ protected DynamicForm modes; @@ -66,6 +75,8 @@ public WQAdaptedInputPanel() { wqranges = new HashMap(); + qranges = new HashMap(); + wranges = new HashMap(); } @@ -189,6 +200,111 @@ } + @Override + public List validate() { + if (isWMode()) { + return validateW(); + } + else { + return validateQ(); + } + } + + + protected List validateW() { + List errors = new ArrayList(); + NumberFormat nf = NumberFormat.getDecimalFormat(); + + Iterator iter = wqranges.keySet().iterator(); + + while (iter.hasNext()) { + List tmpErrors = new ArrayList(); + + String key = iter.next(); + DoubleArrayPanel dap = wqranges.get(key); + double[] mm = wranges.get(key); + + double[] values = dap.getInputValues(); + double[] good = new double[values.length]; + + int idx = 0; + + for (double value: values) { + if (value < mm[0] || value > mm[1]) { + String tmp = MSG.error_validate_range(); + tmp = tmp.replace("$1", nf.format(value)); + tmp = tmp.replace("$2", nf.format(mm[0])); + tmp = tmp.replace("$3", nf.format(mm[1])); + tmpErrors.add(tmp); + } + else { + good[idx++] = value; + } + } + + double[] justGood = new double[idx]; + for (int i = 0; i < justGood.length; i++) { + justGood[i] = good[i]; + } + + if (!tmpErrors.isEmpty()) { + dap.setValues(justGood); + + errors.addAll(tmpErrors); + } + } + + return errors; + } + + + protected List validateQ() { + List errors = new ArrayList(); + NumberFormat nf = NumberFormat.getDecimalFormat(); + + Iterator iter = wqranges.keySet().iterator(); + + while (iter.hasNext()) { + List tmpErrors = new ArrayList(); + + String key = iter.next(); + DoubleArrayPanel dap = wqranges.get(key); + double[] mm = qranges.get(key); + + double[] values = dap.getInputValues(); + double[] good = new double[values.length]; + + int idx = 0; + + for (double value: values) { + if (value < mm[0] || value > mm[1]) { + String tmp = MSG.error_validate_range(); + tmp = tmp.replace("$1", nf.format(value)); + tmp = tmp.replace("$2", nf.format(mm[0])); + tmp = tmp.replace("$3", nf.format(mm[1])); + tmpErrors.add(tmp); + } + else { + good[idx++] = value; + } + } + + double[] justGood = new double[idx]; + for (int i = 0; i < justGood.length; i++) { + justGood[i] = good[i]; + } + + if (!tmpErrors.isEmpty()) { + dap.setValues(justGood); + + errors.addAll(tmpErrors); + } + } + + return errors; + } + + protected void initUserDefaults(DataList dataList) { initUserWQValues(dataList); @@ -275,6 +391,19 @@ createLineTitle(title), null, this, TitleOrientation.LEFT); wqranges.put(title, dap); + + if (item instanceof WQDataItem) { + WQDataItem wq = (WQDataItem) item; + double[] mmQ = wq.getQRange(); + double[] mmW = wq.getWRange(); + + GWT.log(title + " Q: " + mmQ[0] + " - " + mmQ[1]); + GWT.log(title + " W: " + mmW[0] + " - " + mmW[1]); + + qranges.put(title, mmQ); + wranges.put(title, mmW); + } + layout.addMember(dap); } @@ -340,6 +469,13 @@ } + public boolean isWMode() { + String mode = (String) modes.getValue(FIELD_WQ_MODE); + + return FIELD_WQ_W.equals(mode); + } + + protected Data getWQMode() { String wqMode = modes.getValueAsString(FIELD_WQ_MODE); DataItem item = new DefaultDataItem("wq_mode", "wq_mode", wqMode); diff -r 55a90afaf513 -r a078ba1c139d flys-client/src/main/java/de/intevation/flys/client/server/ArtifactDescriptionFactory.java --- a/flys-client/src/main/java/de/intevation/flys/client/server/ArtifactDescriptionFactory.java Tue Jun 14 11:31:33 2011 +0000 +++ b/flys-client/src/main/java/de/intevation/flys/client/server/ArtifactDescriptionFactory.java Tue Jun 14 14:00:19 2011 +0000 @@ -21,6 +21,7 @@ import de.intevation.flys.client.shared.model.DefaultDataItem; import de.intevation.flys.client.shared.model.DefaultOutputMode; import de.intevation.flys.client.shared.model.OutputMode; +import de.intevation.flys.client.shared.model.WQDataItem; /** @@ -175,13 +176,95 @@ String label = ClientProtocolUtils.getLabel(item); String value = ClientProtocolUtils.getValue(item); - dataItems.add(new DefaultDataItem(label, null, value)); + double[] mmQ = extractMinMaxQValues(item); + double[] mmW = extractMinMaxWValues(item); + + if (mmQ != null || mmW != null) { + dataItems.add(new WQDataItem(label, null, value, mmQ, mmW)); + } + else { + dataItems.add(new DefaultDataItem(label, null, value)); + } } return (DataItem[]) dataItems.toArray(new DataItem[count]); } + protected static double[] extractMinMaxQValues(Node item) { + System.out.println("ArtifactDescriptionFactory - extractMinMaxQValues"); + + if (item == null) { + System.err.println("This node is empty - no min/max Q values."); + return null; + } + + Node node = (Node) XMLUtils.xpath( + item, + "art:range[@art:type='Q']", + XPathConstants.NODE, + ArtifactNamespaceContext.INSTANCE); + + if (node == null) { + System.out.println("No min/max Q values found."); + return null; + } + + return extractMinMaxValues(node); + } + + + protected static double[] extractMinMaxWValues(Node item) { + System.out.println("ArtifactDescriptionFactory - extractMinMaxWValues"); + + if (item == null) { + System.err.println("This node is empty - no min/max W values."); + return null; + } + + Node node = (Node) XMLUtils.xpath( + item, + "art:range[@art:type='W']", + XPathConstants.NODE, + ArtifactNamespaceContext.INSTANCE); + + if (node == null) { + System.out.println("No min/max W values found."); + return null; + } + + return extractMinMaxValues(node); + } + + + protected static double[] extractMinMaxValues(Node node) { + System.out.println("ArtifactDescriptionFactory.extractMinMaxValues"); + + String minStr = XMLUtils.xpathString( + node, "art:min/text()", ArtifactNamespaceContext.INSTANCE); + + String maxStr = XMLUtils.xpathString( + node, "art:max/text()", ArtifactNamespaceContext.INSTANCE); + + if (maxStr == null || minStr == null) { + System.err.println("No min/max values found."); + return null; + } + + try { + double min = Double.valueOf(minStr); + double max = Double.valueOf(maxStr); + + return new double[] { min, max }; + } + catch (NumberFormatException nfe) { + System.err.println("Error while parsing min/max values."); + } + + return null; + } + + /** * This method extracts the data objects from the data node of the static ui * part of the DESCRIBE document. diff -r 55a90afaf513 -r a078ba1c139d flys-client/src/main/java/de/intevation/flys/client/shared/model/WQDataItem.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/flys-client/src/main/java/de/intevation/flys/client/shared/model/WQDataItem.java Tue Jun 14 14:00:19 2011 +0000 @@ -0,0 +1,38 @@ +package de.intevation.flys.client.shared.model; + +/** + * @author Ingo Weinzierl + */ +public class WQDataItem extends DefaultDataItem { + + protected double[] qRange; + protected double[] wRange; + + public WQDataItem() { + } + + + public WQDataItem( + String label, + String description, + String value, + double[] qRange, + double[] wRange) + { + super(label, description, value); + + this.qRange = qRange; + this.wRange = wRange; + } + + + public double[] getQRange() { + return qRange; + } + + + public double[] getWRange() { + return wRange; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :