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 <lukaszlen...@apache.org> Authored: Mon Apr 10 08:37:22 2017 +0200 Committer: Lukasz Lenart <lukaszlen...@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; + } }