Repository: struts Updated Branches: refs/heads/master 9d4aac058 -> 5fd605eb9
WW-4578 Makes RegexFieldValidator 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/caca3d05 Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/caca3d05 Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/caca3d05 Branch: refs/heads/master Commit: caca3d057d56f43699c1ef5d37e7800eb7b0e5a5 Parents: 1162ddf Author: Lukasz Lenart <lukaszlen...@apache.org> Authored: Thu Apr 6 08:59:11 2017 +0200 Committer: Lukasz Lenart <lukaszlen...@apache.org> Committed: Thu Apr 6 08:59:11 2017 +0200 ---------------------------------------------------------------------- .../validators/RegexFieldValidator.java | 35 ++++++++-- .../validator/validators/ValidatorSupport.java | 2 + .../validator/RegexFieldValidatorTest.java | 70 ++++++++++++++++++++ 3 files changed, 100 insertions(+), 7 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/struts/blob/caca3d05/core/src/main/java/com/opensymphony/xwork2/validator/validators/RegexFieldValidator.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/com/opensymphony/xwork2/validator/validators/RegexFieldValidator.java b/core/src/main/java/com/opensymphony/xwork2/validator/validators/RegexFieldValidator.java index b931482..b1ca900 100644 --- a/core/src/main/java/com/opensymphony/xwork2/validator/validators/RegexFieldValidator.java +++ b/core/src/main/java/com/opensymphony/xwork2/validator/validators/RegexFieldValidator.java @@ -16,11 +16,17 @@ package com.opensymphony.xwork2.validator.validators; +import com.opensymphony.xwork2.ObjectFactory; +import org.apache.commons.lang3.ObjectUtils; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.LogManager; import com.opensymphony.xwork2.validator.ValidationException; import org.apache.commons.lang3.StringUtils; +import java.lang.reflect.Array; +import java.util.Arrays; +import java.util.Collection; +import java.util.Objects; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -105,13 +111,28 @@ public class RegexFieldValidator extends FieldValidatorSupport { return; } - // XW-375 - must be a string - if (!(value instanceof String)) { - return; + if (value instanceof String) { + validateFieldValue(object, fieldName, (String) value, regexToUse); + } + + if (value.getClass().isArray()) { + Object[] values = (Object[]) value; + for (Object objValue: values) { + validateFieldValue(object, fieldName, Objects.toString(objValue, EMPTY_STRING), regexToUse); + } } + if (Collection.class.isAssignableFrom(value.getClass())) { + Collection<Object> values = (Collection<Object>) value; + for (Object objValue : values) { + validateFieldValue(object, fieldName, Objects.toString(objValue, EMPTY_STRING), regexToUse); + } + } + } + + protected void validateFieldValue(Object object, String fieldName, String value, String regexToUse) { // string must not be empty - String str = ((String) value).trim(); + String str = value.trim(); if (str.length() == 0) { return; } @@ -124,12 +145,12 @@ public class RegexFieldValidator extends FieldValidatorSupport { pattern = Pattern.compile(regexToUse, Pattern.CASE_INSENSITIVE); } - String compare = (String) value; - if ( isTrimed() ) { + String compare = value; + if (isTrimed()) { compare = compare.trim(); } - Matcher matcher = pattern.matcher( compare ); + Matcher matcher = pattern.matcher(compare); if (!matcher.matches()) { addFieldError(fieldName, object); } http://git-wip-us.apache.org/repos/asf/struts/blob/caca3d05/core/src/main/java/com/opensymphony/xwork2/validator/validators/ValidatorSupport.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/com/opensymphony/xwork2/validator/validators/ValidatorSupport.java b/core/src/main/java/com/opensymphony/xwork2/validator/validators/ValidatorSupport.java index 2173a2f..dabb4e3 100644 --- a/core/src/main/java/com/opensymphony/xwork2/validator/validators/ValidatorSupport.java +++ b/core/src/main/java/com/opensymphony/xwork2/validator/validators/ValidatorSupport.java @@ -39,6 +39,8 @@ public abstract class ValidatorSupport implements Validator, ShortCircuitableVal private static final Logger LOG = LogManager.getLogger(ValidatorSupport.class); + public static final String EMPTY_STRING = ""; + private ValidatorContext validatorContext; private boolean shortCircuit; private String type; http://git-wip-us.apache.org/repos/asf/struts/blob/caca3d05/core/src/test/java/com/opensymphony/xwork2/validator/RegexFieldValidatorTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/com/opensymphony/xwork2/validator/RegexFieldValidatorTest.java b/core/src/test/java/com/opensymphony/xwork2/validator/RegexFieldValidatorTest.java index 4fa50fd..df392a8 100644 --- a/core/src/test/java/com/opensymphony/xwork2/validator/RegexFieldValidatorTest.java +++ b/core/src/test/java/com/opensymphony/xwork2/validator/RegexFieldValidatorTest.java @@ -21,6 +21,8 @@ import com.opensymphony.xwork2.XWorkTestCase; import com.opensymphony.xwork2.util.ValueStack; import com.opensymphony.xwork2.validator.validators.RegexFieldValidator; +import java.util.ArrayList; +import java.util.Arrays; import java.util.List; /** @@ -183,9 +185,61 @@ public class RegexFieldValidatorTest extends XWorkTestCase { assertFalse(validator.getValidatorContext().hasFieldErrors()); } + public void testArrayOfStringField() throws Exception { + MyTestPerson testPerson = new MyTestPerson(); + testPerson.setFriends(new String[]{"Alice", "Matt"}); + + ValueStack stack = ActionContext.getContext().getValueStack(); + ActionContext.getContext().setValueStack(stack); + + RegexFieldValidator validator = new RegexFieldValidator(); + validator.setRegex("A([a-zA-Z]*)"); + validator.setValidatorContext(new DummyValidatorContext(new Object(), tpf)); + validator.setFieldName("friends"); + validator.setValueStack(ActionContext.getContext().getValueStack()); + validator.setDefaultMessage("Only names starting with A are allowed!"); + + validator.validate(testPerson); + + assertTrue(validator.getValidatorContext().hasErrors()); + assertFalse(validator.getValidatorContext().hasActionErrors()); + assertFalse(validator.getValidatorContext().hasActionMessages()); + assertTrue(validator.getValidatorContext().hasFieldErrors()); + assertEquals(1, validator.getValidatorContext().getFieldErrors().size()); + assertEquals(1, validator.getValidatorContext().getFieldErrors().get("friends").size()); + assertEquals("Only names starting with A are allowed!", validator.getValidatorContext().getFieldErrors().get("friends").get(0)); + } + + public void testListOfStringField() throws Exception { + MyTestPerson testPerson = new MyTestPerson(); + testPerson.setCars(Arrays.asList("Audi", "BMW")); + + ValueStack stack = ActionContext.getContext().getValueStack(); + ActionContext.getContext().setValueStack(stack); + + RegexFieldValidator validator = new RegexFieldValidator(); + validator.setRegex("A([a-zA-Z]*)"); + validator.setValidatorContext(new DummyValidatorContext(new Object(), tpf)); + validator.setFieldName("cars"); + validator.setValueStack(ActionContext.getContext().getValueStack()); + validator.setDefaultMessage("Only cars starting with A are allowed!"); + + validator.validate(testPerson); + + assertTrue(validator.getValidatorContext().hasErrors()); + assertFalse(validator.getValidatorContext().hasActionErrors()); + assertFalse(validator.getValidatorContext().hasActionMessages()); + assertTrue(validator.getValidatorContext().hasFieldErrors()); + assertEquals(1, validator.getValidatorContext().getFieldErrors().size()); + assertEquals(1, validator.getValidatorContext().getFieldErrors().get("cars").size()); + assertEquals("Only cars starting with A are allowed!", validator.getValidatorContext().getFieldErrors().get("cars").get(0)); + } + private class MyTestPerson { private String username; private int age; + private String[] friends; + private List cars; public String getUsername() { return username; @@ -202,6 +256,22 @@ public class RegexFieldValidatorTest extends XWorkTestCase { public void setAge(int age) { this.age = age; } + + public String[] getFriends() { + return friends; + } + + public void setFriends(String[] friends) { + this.friends = friends; + } + + public List getCars() { + return cars; + } + + public void setCars(List cars) { + this.cars = cars; + } } }