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

Reply via email to