Hi,
I got a patch that might be slightly related to
https://issues.apache.org/jira/browse/VALIDATOR-116. It addresses the following
two problems.
1.) If an indexed field is validated the validation terminates on the first
index failing. My patch makes this configurable within the field element via an
attribute "stopOnFail". If this is false just the validation for the current
index is terminated if a dependency validation fails. If it is true (Default)
there is no change in behaviour.
2.) In VALIDATOR-116 it is said that a major problem with indexed fields is
that you can't get different error messages. My patch makes this possible by
allowing a back-reference token "[]" (as used internally for the key of the
field) to be used within msg keys, arg keys and var values. In case of an
indexed property these are replaced by [0],[1],[2],... during the iteration
over all the indexes of the validated field.
By the way, should I have (or should I still) opened an "Improvement" within
Jira for this or has it been correct to first post this patch here?
Björn Eickvonder
Diese E-Mail enthaelt vertrauliche und/oder rechtlich geschuetzte Informationen.
Wenn Sie nicht der richtige Adressat sind oder diese E-Mail irrtuemlich
erhalten haben,
informieren Sie bitte sofort den Absender und vernichten Sie diese Mail.
Das unerlaubte Kopieren sowie die unbefugte Weitergabe dieser Mail bzw. Inhalte
hieraus ist nicht gestattet.
Index: D:/workspace3.1/trunk/conf/share/validator_1_3_0.dtd
===================================================================
--- D:/workspace3.1/trunk/conf/share/validator_1_3_0.dtd (revision
475615)
+++ D:/workspace3.1/trunk/conf/share/validator_1_3_0.dtd (working copy)
@@ -128,14 +128,18 @@
list and then loop through the list performing the
validations for this field.
+ stopOnFail A boolean value that defines if all index values should
+ be validated or validation should stop on the first
+ index failing (Default: true)
+
-->
<!ELEMENT field (msg|arg|var)*>
<!ATTLIST field property CDATA #REQUIRED>
<!ATTLIST field depends CDATA #IMPLIED>
<!ATTLIST field page CDATA #IMPLIED>
<!ATTLIST field indexedListProperty CDATA #IMPLIED>
+<!ATTLIST field stopOnFail CDATA #IMPLIED>
-
<!--
Defines a custom message key to use when one of the
validators for this field fails. Each validator has a default message
Index: D:/workspace3.1/trunk/src/share/org/apache/commons/validator/Field.java
===================================================================
--- D:/workspace3.1/trunk/src/share/org/apache/commons/validator/Field.java
(revision 475615)
+++ D:/workspace3.1/trunk/src/share/org/apache/commons/validator/Field.java
(working copy)
@@ -90,6 +90,12 @@
* The Field's indexed list property name.
*/
protected String indexedListProperty = null;
+
+ /**
+ * Defines if all indexed fields should be validated or stop
+ * validation should stop on first fail.
+ */
+ protected boolean stopOnFail = true;
/**
* The Field's unique key.
@@ -216,8 +222,26 @@
public String getIndexedListProperty() {
return this.indexedListProperty;
}
+
+ /**
+ * Gets a boolean value that defines if all index values should
+ * be validated or validation should stop on the first
+ * index failing (Default: true)
+ * @return true if validation stops on first fail.
+ */
+ public boolean isStopOnFail() {
+ return stopOnFail;
+ }
/**
+ * Sets the stopOnFail boolean attribute of the field.
+ * @param stopOnFail a boolean value that defines if validation should
stop on first fail
+ */
+ public void setStopOnFail(boolean stopOnFail) {
+ this.stopOnFail = stopOnFail;
+ }
+
+ /**
* Sets the indexed property name of the field.
* @param indexedListProperty The field's indexed List property name.
*/
@@ -881,7 +905,8 @@
if (!good) {
allResults.merge(results);
- return allResults;
+ if (isStopOnFail()) return allResults;
+ else break;
}
}
allResults.merge(results);
Index:
D:/workspace3.1/trunk/src/share/org/apache/commons/validator/ValidatorAction.java
===================================================================
---
D:/workspace3.1/trunk/src/share/org/apache/commons/validator/ValidatorAction.java
(revision 475615)
+++
D:/workspace3.1/trunk/src/share/org/apache/commons/validator/ValidatorAction.java
(working copy)
@@ -34,6 +34,7 @@
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;
+import java.util.Iterator;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -741,6 +742,39 @@
Field.TOKEN_INDEXED,
"[" + pos + "]"));
+ // replace index token within key of args
+ for (int i=0; i<indexedField.args.length; i++) {
+ Map argMap = indexedField.args[i];
+ Iterator iter = argMap.values().iterator();
+ while (iter.hasNext()) {
+ Arg arg = (Arg) iter.next();
+ arg.setKey(ValidatorUtils.replace(
+ arg.getKey(),
+ Field.TOKEN_INDEXED,
+ "[" + pos + "]"));
+ }
+ }
+
+ // replace index token within key of msg
+ Iterator msgIter = indexedField.hMsgs.values().iterator();
+ while (msgIter.hasNext()) {
+ Msg msg = (Msg) msgIter.next();
+ msg.setKey(ValidatorUtils.replace(
+ msg.getKey(),
+ Field.TOKEN_INDEXED,
+ "[" + pos + "]"));
+ }
+
+ // replace index token within value of var
+ Iterator varIter = indexedField.hVars.values().iterator();
+ while (varIter.hasNext()) {
+ Var var = (Var) varIter.next();
+ var.setValue(ValidatorUtils.replace(
+ var.getValue(),
+ Field.TOKEN_INDEXED,
+ "[" + pos + "]"));
+ }
+
paramValues[fieldIndex] = indexedField;
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]