You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@struts.apache.org by lu...@apache.org on 2017/04/19 07:42:16 UTC

[02/13] struts git commit: WW-4578 Changes range validators to support collections

WW-4578 Changes range validators to support collections


Project: http://git-wip-us.apache.org/repos/asf/struts/repo
Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/158eda97
Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/158eda97
Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/158eda97

Branch: refs/heads/master
Commit: 158eda97834645a542e81d7414b67f8285042b8b
Parents: caca3d0
Author: Lukasz Lenart <lu...@apache.org>
Authored: Mon Apr 10 08:37:22 2017 +0200
Committer: Lukasz Lenart <lu...@apache.org>
Committed: Mon Apr 10 08:37:22 2017 +0200

----------------------------------------------------------------------
 .../validators/FieldValidatorSupport.java       | 13 +++-
 .../validators/RangeValidatorSupport.java       | 66 +++++++++++++-------
 .../validators/IntRangeFieldValidatorTest.java  | 23 +++++++
 .../validator/validators/ValidationAction.java  |  9 +++
 4 files changed, 86 insertions(+), 25 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/struts/blob/158eda97/core/src/main/java/com/opensymphony/xwork2/validator/validators/FieldValidatorSupport.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/com/opensymphony/xwork2/validator/validators/FieldValidatorSupport.java b/core/src/main/java/com/opensymphony/xwork2/validator/validators/FieldValidatorSupport.java
index 4a3f147..ec75e13 100644
--- a/core/src/main/java/com/opensymphony/xwork2/validator/validators/FieldValidatorSupport.java
+++ b/core/src/main/java/com/opensymphony/xwork2/validator/validators/FieldValidatorSupport.java
@@ -17,16 +17,17 @@ package com.opensymphony.xwork2.validator.validators;
 
 import com.opensymphony.xwork2.validator.FieldValidator;
 
-
 /**
  * Base class for field validators.
  *
- * @author Jason Carreira
+ * You can access fieldName and its currentValue in a message using expression, e.g.
+ * "Wrong value ${currentValue} for ${fieldName}"
  */
 public abstract class FieldValidatorSupport extends ValidatorSupport implements FieldValidator {
 
     private String fieldName;
     private String type;
+    private Object currentValue;
 
     public void setFieldName(String fieldName) {
         this.fieldName = fieldName;
@@ -45,4 +46,12 @@ public abstract class FieldValidatorSupport extends ValidatorSupport implements
     public String getValidatorType() {
         return type;
     }
+
+    public Object getCurrentValue() {
+        return currentValue;
+    }
+
+    public void setCurrentValue(Object currentValue) {
+        this.currentValue = currentValue;
+    }
 }

http://git-wip-us.apache.org/repos/asf/struts/blob/158eda97/core/src/main/java/com/opensymphony/xwork2/validator/validators/RangeValidatorSupport.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/com/opensymphony/xwork2/validator/validators/RangeValidatorSupport.java b/core/src/main/java/com/opensymphony/xwork2/validator/validators/RangeValidatorSupport.java
index 39c0e86..5d156e3 100644
--- a/core/src/main/java/com/opensymphony/xwork2/validator/validators/RangeValidatorSupport.java
+++ b/core/src/main/java/com/opensymphony/xwork2/validator/validators/RangeValidatorSupport.java
@@ -20,6 +20,8 @@ import org.apache.logging.log4j.LogManager;
 import com.opensymphony.xwork2.validator.ValidationException;
 import org.apache.commons.lang3.StringUtils;
 
+import java.util.Collection;
+
 /**
  * Base class for range based validators. Use this class to develop any other custom range validators.
  */
@@ -40,25 +42,45 @@ public abstract class RangeValidatorSupport<T extends Comparable> extends FieldV
 
     public void validate(Object object) throws ValidationException {
         Object obj = getFieldValue(getFieldName(), object);
-        Comparable<T> value = (Comparable<T>) obj;
 
         // if there is no value - don't do comparison
         // if a value is required, a required validator should be added to the field
-        if (value == null) {
+        if (obj == null) {
             return;
         }
 
+        T min = getMin();
+        T max = getMax();
+
+        if (obj.getClass().isArray()) {
+            Object[] values = (Object[]) obj;
+            for (Object objValue : values) {
+                validateValue(object, (Comparable<T>) objValue, min, max);
+            }
+        } else if (Collection.class.isAssignableFrom(obj.getClass())) {
+            Collection<?> values = (Collection<?>) obj;
+            for (Object objValue : values) {
+                validateValue(object, (Comparable<T>) objValue, min, max);
+            }
+        } else {
+            validateValue(object, (Comparable<T>) obj, min, max);
+        }
+    }
+
+    protected void validateValue(Object object, Comparable<T> value, T min, T max) {
+        setCurrentValue(value);
+
         // only check for a minimum value if the min parameter is set
-        T minComparatorValue = getMin();
-        if ((minComparatorValue != null) && (value.compareTo(minComparatorValue) < 0)) {
+        if ((min != null) && (value.compareTo(min) < 0)) {
             addFieldError(getFieldName(), object);
         }
 
         // only check for a maximum value if the max parameter is set
-        T maxComparatorValue = getMax();
-        if ((maxComparatorValue != null) && (value.compareTo(maxComparatorValue) > 0)) {
+        if ((max != null) && (value.compareTo(max) > 0)) {
             addFieldError(getFieldName(), object);
         }
+
+        setCurrentValue(null);
     }
 
     public void setMin(T min) {
@@ -66,13 +88,11 @@ public abstract class RangeValidatorSupport<T extends Comparable> extends FieldV
     }
 
     public T getMin() {
-        if (min != null) {
-            return min;
-        } else if (StringUtils.isNotEmpty(minExpression)) {
-            return (T) parse(minExpression, type);
-        } else {
-            return null;
-        }
+        return getT(min, minExpression, type);
+    }
+
+    public T getMax() {
+        return getT(max, maxExpression, type);
     }
 
     public void setMinExpression(String minExpression) {
@@ -84,19 +104,19 @@ public abstract class RangeValidatorSupport<T extends Comparable> extends FieldV
         this.max = max;
     }
 
-    public T getMax() {
-        if (max != null) {
-            return max;
-        } else if (StringUtils.isNotEmpty(maxExpression)) {
-            return (T) parse(maxExpression, type);
-        } else {
-            return null;
-        }
-    }
-
     public void setMaxExpression(String maxExpression) {
         LOG.debug("${maxExpression} was defined as [{}]", maxExpression);
         this.maxExpression = maxExpression;
     }
 
+    protected T getT(T minMax, String minMaxExpression, Class<T> toType) {
+        if (minMax != null) {
+            return minMax;
+        } else if (StringUtils.isNotEmpty(minMaxExpression)) {
+            return (T) parse(minMaxExpression, toType);
+        } else {
+            return null;
+        }
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/struts/blob/158eda97/core/src/test/java/com/opensymphony/xwork2/validator/validators/IntRangeFieldValidatorTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/com/opensymphony/xwork2/validator/validators/IntRangeFieldValidatorTest.java b/core/src/test/java/com/opensymphony/xwork2/validator/validators/IntRangeFieldValidatorTest.java
index 229e8fc..1992c25 100644
--- a/core/src/test/java/com/opensymphony/xwork2/validator/validators/IntRangeFieldValidatorTest.java
+++ b/core/src/test/java/com/opensymphony/xwork2/validator/validators/IntRangeFieldValidatorTest.java
@@ -57,11 +57,34 @@ public class IntRangeFieldValidatorTest extends XWorkTestCase {
         assertEquals("Max is 101, min is 99 but value is 102", context.getFieldErrors().get("intRange").get(0));
     }
 
+    public void testArrayOfIntValidation() throws Exception {
+        // given
+        ValidationAction action = new ValidationAction();
+        action.setInts(new Integer[] {99, 100, 101, 102});
+
+        ValidatorContext context = new DummyValidatorContext(action, tpf);
+        IntRangeFieldValidator validator = prepareValidator(action, context);
+
+        // when
+        validator.setMin(100);
+        validator.setMax(101);
+        validator.setFieldName("ints");
+        validator.setDefaultMessage("Max is ${max}, min is ${min} but value is ${currentValue}");
+        validator.validate(action);
+
+        // then
+        assertEquals(1, context.getFieldErrors().size());
+        assertEquals(2, context.getFieldErrors().get("ints").size());
+        assertEquals("Max is 101, min is 100 but value is 99", context.getFieldErrors().get("ints").get(0));
+        assertEquals("Max is 101, min is 100 but value is 102", context.getFieldErrors().get("ints").get(1));
+    }
+
     private ValidationAction prepareAction(int intRange) {
         ValidationAction action = new ValidationAction();
         action.setIntMaxValue(101);
         action.setIntMinValue(99);
         action.setIntRange(intRange);
+        action.setInts(new Integer[] {101, 99, 100, 102});
         return action;
     }
 

http://git-wip-us.apache.org/repos/asf/struts/blob/158eda97/core/src/test/java/com/opensymphony/xwork2/validator/validators/ValidationAction.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/com/opensymphony/xwork2/validator/validators/ValidationAction.java b/core/src/test/java/com/opensymphony/xwork2/validator/validators/ValidationAction.java
index 268288f..a9fc40f 100644
--- a/core/src/test/java/com/opensymphony/xwork2/validator/validators/ValidationAction.java
+++ b/core/src/test/java/com/opensymphony/xwork2/validator/validators/ValidationAction.java
@@ -7,6 +7,7 @@ public class ValidationAction {
     private Integer intRange;
     private Integer intMinValue;
     private Integer intMaxValue;
+    private Integer[] ints;
 
     private Short shortRange;
     private Short shortMinValue;
@@ -133,4 +134,12 @@ public class ValidationAction {
     public String getStringValue() {
         return stringValue;
     }
+
+    public Integer[] getInts() {
+        return ints;
+    }
+
+    public void setInts(Integer[] ints) {
+        this.ints = ints;
+    }
 }