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;
+ }
}