You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@bval.apache.org by mb...@apache.org on 2011/01/21 21:13:24 UTC

svn commit: r1062004 - in /incubator/bval/sandbox/lang3-work/bval-jsr303d/src: main/java/org/apache/bval/constraints/dynamic/StringValuesValidator.java test/java/org/apache/bval/constraints/dynamic/ValuesConstraintValidationTest.java

Author: mbenson
Date: Fri Jan 21 20:13:23 2011
New Revision: 1062004

URL: http://svn.apache.org/viewvc?rev=1062004&view=rev
Log:
add the ability to validate CharSequence values case-insensitively, and/or after trimming values

Modified:
    incubator/bval/sandbox/lang3-work/bval-jsr303d/src/main/java/org/apache/bval/constraints/dynamic/StringValuesValidator.java
    incubator/bval/sandbox/lang3-work/bval-jsr303d/src/test/java/org/apache/bval/constraints/dynamic/ValuesConstraintValidationTest.java

Modified: incubator/bval/sandbox/lang3-work/bval-jsr303d/src/main/java/org/apache/bval/constraints/dynamic/StringValuesValidator.java
URL: http://svn.apache.org/viewvc/incubator/bval/sandbox/lang3-work/bval-jsr303d/src/main/java/org/apache/bval/constraints/dynamic/StringValuesValidator.java?rev=1062004&r1=1062003&r2=1062004&view=diff
==============================================================================
--- incubator/bval/sandbox/lang3-work/bval-jsr303d/src/main/java/org/apache/bval/constraints/dynamic/StringValuesValidator.java (original)
+++ incubator/bval/sandbox/lang3-work/bval-jsr303d/src/main/java/org/apache/bval/constraints/dynamic/StringValuesValidator.java Fri Jan 21 20:13:23 2011
@@ -17,23 +17,77 @@
 package org.apache.bval.constraints.dynamic;
 
 import javax.validation.ConstraintValidator;
+import javax.validation.Payload;
 
 import org.apache.commons.lang3.StringUtils;
 
 /**
- * {@link ConstraintValidator} for {@link Values} constraints on
- * {@link CharSequence} types.
+ * {@link ConstraintValidator} for {@link Values} constraints on {@link CharSequence} types.
  * 
  * @version $Rev$ $Date$
  */
 public class StringValuesValidator extends AbstractValuesValidator.Plain<CharSequence> {
+    /**
+     * Payload to indicate that {@link CharSequence} values should be compared without case-sensitivity. Definition as
+     * payload leaves the base constraints type-agnostic.
+     */
+    public interface IgnoreCase extends Payload {
+    }
+
+    /**
+     * Payload to indicate that {@link CharSequence} values should be trimmed prior to comparison with constrained
+     * values. Definition as payload leaves the base constraints type-agnostic.
+     */
+    public interface Trim extends Payload {
+    }
+
+    private static class Test {
+        private final boolean ignoreCase;
+        private final boolean trim;
+
+        /**
+         * Create a new Test instance.
+         * 
+         * @param payload
+         */
+        Test(Class<? extends Payload>[] payload) {
+            this.ignoreCase = hasPayload(IgnoreCase.class, payload);
+            this.trim = hasPayload(Trim.class, payload);
+        }
+
+        /**
+         * Learn whether a value matches an available choice.
+         * 
+         * @param value
+         * @param choice
+         * @return boolean
+         */
+        boolean matches(CharSequence value, String choice) {
+            if (trim) {
+                value = StringUtils.trim(value.toString());
+            }
+            return ignoreCase ? StringUtils.equalsIgnoreCase(value.toString(), choice) : StringUtils.equals(value,
+                choice);
+        }
+    }
+
+    private Test test;
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void initialize(Values constraintAnnotation) {
+        super.initialize(constraintAnnotation);
+        this.test = new Test(constraintAnnotation.payload());
+    }
 
     /**
      * {@inheritDoc}
      */
     @Override
     protected boolean matches(CharSequence value, String choice) {
-        return StringUtils.equals(value, choice);
+        return test.matches(value, choice);
     }
 
     /**
@@ -42,13 +96,33 @@ public class StringValuesValidator exten
      */
     public static class Labeled extends AbstractValuesValidator.Labeled<CharSequence> {
 
+        private Test test;
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public void initialize(Values.Labeled constraintAnnotation) {
+            super.initialize(constraintAnnotation);
+            this.test = new Test(constraintAnnotation.payload());
+        }
+
         /**
          * {@inheritDoc}
          */
         @Override
         protected boolean matches(CharSequence value, String choice) {
-            return StringUtils.equals(value, choice);
+            return test.matches(value, choice);
         }
 
     }
+
+    private static boolean hasPayload(Class<? extends Payload> target, Class<? extends Payload>[] payload) {
+        for (Class<? extends Payload> p : payload) {
+            if (target.isAssignableFrom(p)) {
+                return true;
+            }
+        }
+        return false;
+    }
 }

Modified: incubator/bval/sandbox/lang3-work/bval-jsr303d/src/test/java/org/apache/bval/constraints/dynamic/ValuesConstraintValidationTest.java
URL: http://svn.apache.org/viewvc/incubator/bval/sandbox/lang3-work/bval-jsr303d/src/test/java/org/apache/bval/constraints/dynamic/ValuesConstraintValidationTest.java?rev=1062004&r1=1062003&r2=1062004&view=diff
==============================================================================
--- incubator/bval/sandbox/lang3-work/bval-jsr303d/src/test/java/org/apache/bval/constraints/dynamic/ValuesConstraintValidationTest.java (original)
+++ incubator/bval/sandbox/lang3-work/bval-jsr303d/src/test/java/org/apache/bval/constraints/dynamic/ValuesConstraintValidationTest.java Fri Jan 21 20:13:23 2011
@@ -26,6 +26,8 @@ import javax.validation.Validation;
 import javax.validation.Validator;
 import javax.validation.groups.Default;
 
+import org.apache.bval.constraints.dynamic.StringValuesValidator.IgnoreCase;
+import org.apache.bval.constraints.dynamic.StringValuesValidator.Trim;
 import org.apache.bval.constraints.dynamic.Values.Labeled;
 import org.apache.bval.constraints.dynamic.Values.Strategy;
 import org.apache.bval.constraints.dynamic.Values.Rule;
@@ -78,10 +80,55 @@ public class ValuesConstraintValidationT
         ElementType noneOfAnnotationOrConstructor;
     }
 
+    public static class StringBean {
+        @Values({ "a", "b", "c" })
+        String plain;
+        @Values(value = { "a", "b", "c" }, payload = IgnoreCase.class)
+        String ignoreCase;
+        @Values(value = { "a", "b", "c" }, payload = Trim.class)
+        String trim;
+        @Values(value = { "a", "b", "c" }, payload = { IgnoreCase.class, Trim.class })
+        String ignoreCaseTrim;
+        @Values(value = { "a", "b", "c" }, rule = Rule.EXCLUDE)
+        String plainExclude;
+        @Values(value = { "a", "b", "c" }, rule = Rule.EXCLUDE, payload = IgnoreCase.class)
+        String ignoreCaseExclude;
+        @Values(value = { "a", "b", "c" }, rule = Rule.EXCLUDE, payload = Trim.class)
+        String trimExclude;
+        @Values(value = { "a", "b", "c" }, rule = Rule.EXCLUDE, payload = { IgnoreCase.class, Trim.class })
+        String ignoreCaseTrimExclude;
+
+        @Values.Labeled({ @Item(label = "A", value = "a"), @Item(label = "B", value = "b"),
+            @Item(label = "C", value = "c") })
+        String labeledPlain;
+        @Values.Labeled(value = { @Item(label = "A", value = "a"), @Item(label = "B", value = "b"),
+            @Item(label = "C", value = "c") }, payload = IgnoreCase.class)
+        String labeledIgnoreCase;
+        @Values.Labeled(value = { @Item(label = "A", value = "a"), @Item(label = "B", value = "b"),
+            @Item(label = "C", value = "c") }, payload = Trim.class)
+        String labeledTrim;
+        @Values.Labeled(value = { @Item(label = "A", value = "a"), @Item(label = "B", value = "b"),
+            @Item(label = "C", value = "c") }, payload = { IgnoreCase.class, Trim.class })
+        String labeledIgnoreCaseTrim;
+        @Values.Labeled(value = { @Item(label = "A", value = "a"), @Item(label = "B", value = "b"),
+            @Item(label = "C", value = "c") }, rule = Rule.EXCLUDE)
+        String labeledPlainExclude;
+        @Values.Labeled(value = { @Item(label = "A", value = "a"), @Item(label = "B", value = "b"),
+            @Item(label = "C", value = "c") }, rule = Rule.EXCLUDE, payload = IgnoreCase.class)
+        String labeledIgnoreCaseExclude;
+        @Values.Labeled(value = { @Item(label = "A", value = "a"), @Item(label = "B", value = "b"),
+            @Item(label = "C", value = "c") }, rule = Rule.EXCLUDE, payload = Trim.class)
+        String labeledTrimExclude;
+        @Values.Labeled(value = { @Item(label = "A", value = "a"), @Item(label = "B", value = "b"),
+            @Item(label = "C", value = "c") }, rule = Rule.EXCLUDE, payload = { IgnoreCase.class, Trim.class })
+        String labeledIgnoreCaseTrimExclude;
+    }
+
     private Validator validator;
     private DynamicValidatorContext validatorContext;
     private final AnnotationFactory annotationFactory = new AnnotationFactory();
     private TestBean testBean;
+    private StringBean stringBean;
 
     @Before
     public void setup() {
@@ -96,6 +143,7 @@ public class ValuesConstraintValidationT
         validatorContext = factory.usingContext();
         validator = validatorContext.getValidator();
         testBean = new TestBean();
+        stringBean = new StringBean();
     }
 
     @Test
@@ -106,6 +154,48 @@ public class ValuesConstraintValidationT
         assertEquals(0, validator.validate(testBean).size());
         testBean.fooBarOrBaz = "oops";
         assertEquals(1, validator.validate(testBean).size());
+
+        assertNull(stringBean.plain);
+        assertEquals(0, validator.validate(stringBean).size());
+        stringBean.plain = "a";
+        assertEquals(0, validator.validate(stringBean).size());
+        stringBean.plain = "A";
+        assertEquals(1, validator.validate(stringBean).size());
+        stringBean.plain = null;
+
+        assertNull(stringBean.ignoreCase);
+        assertEquals(0, validator.validate(stringBean).size());
+        stringBean.ignoreCase = "a";
+        assertEquals(0, validator.validate(stringBean).size());
+        stringBean.ignoreCase = "A";
+        assertEquals(0, validator.validate(stringBean).size());
+        stringBean.ignoreCase = "z";
+        assertEquals(1, validator.validate(stringBean).size());
+        stringBean.ignoreCase = null;
+
+        assertNull(stringBean.trim);
+        assertEquals(0, validator.validate(stringBean).size());
+        stringBean.trim = "a";
+        assertEquals(0, validator.validate(stringBean).size());
+        stringBean.trim = " a ";
+        assertEquals(0, validator.validate(stringBean).size());
+        stringBean.trim = " z ";
+        assertEquals(1, validator.validate(stringBean).size());
+        stringBean.trim = null;
+
+        assertNull(stringBean.ignoreCaseTrim);
+        assertEquals(0, validator.validate(stringBean).size());
+        stringBean.ignoreCaseTrim = "A";
+        assertEquals(0, validator.validate(stringBean).size());
+        stringBean.ignoreCaseTrim = "a";
+        assertEquals(0, validator.validate(stringBean).size());
+        stringBean.ignoreCaseTrim = " a ";
+        assertEquals(0, validator.validate(stringBean).size());
+        stringBean.ignoreCaseTrim = " A ";
+        assertEquals(0, validator.validate(stringBean).size());
+        stringBean.ignoreCaseTrim = " z ";
+        assertEquals(1, validator.validate(stringBean).size());
+        stringBean.ignoreCaseTrim = null;
     }
 
     @Test
@@ -116,6 +206,54 @@ public class ValuesConstraintValidationT
         assertEquals(0, validator.validate(testBean).size());
         testBean.noneOfFooBarOrBaz = "foo";
         assertEquals(1, validator.validate(testBean).size());
+
+        assertNull(stringBean.plainExclude);
+        assertEquals(0, validator.validate(stringBean).size());
+        stringBean.plainExclude = "z";
+        assertEquals(0, validator.validate(stringBean).size());
+        stringBean.plainExclude = "A";
+        assertEquals(0, validator.validate(stringBean).size());
+        stringBean.plainExclude = "a";
+        assertEquals(1, validator.validate(stringBean).size());
+        stringBean.plainExclude = null;
+
+        assertNull(stringBean.ignoreCaseExclude);
+        assertEquals(0, validator.validate(stringBean).size());
+        stringBean.ignoreCaseExclude = "z";
+        assertEquals(0, validator.validate(stringBean).size());
+        stringBean.ignoreCaseExclude = "a";
+        assertEquals(1, validator.validate(stringBean).size());
+        stringBean.ignoreCaseExclude = "A";
+        assertEquals(1, validator.validate(stringBean).size());
+        stringBean.ignoreCaseExclude = null;
+
+        assertNull(stringBean.trimExclude);
+        assertEquals(0, validator.validate(stringBean).size());
+        stringBean.trimExclude = "z";
+        assertEquals(0, validator.validate(stringBean).size());
+        stringBean.trimExclude = " z ";
+        assertEquals(0, validator.validate(stringBean).size());
+        stringBean.trimExclude = "a";
+        assertEquals(1, validator.validate(stringBean).size());
+        stringBean.trimExclude = " a ";
+        assertEquals(1, validator.validate(stringBean).size());
+        stringBean.trimExclude = null;
+
+        assertNull(stringBean.ignoreCaseTrimExclude);
+        assertEquals(0, validator.validate(stringBean).size());
+        stringBean.ignoreCaseTrimExclude = "z";
+        assertEquals(0, validator.validate(stringBean).size());
+        stringBean.ignoreCaseTrimExclude = " z ";
+        assertEquals(0, validator.validate(stringBean).size());
+        stringBean.ignoreCaseTrimExclude = "A";
+        assertEquals(1, validator.validate(stringBean).size());
+        stringBean.ignoreCaseTrimExclude = "a";
+        assertEquals(1, validator.validate(stringBean).size());
+        stringBean.ignoreCaseTrimExclude = " a ";
+        assertEquals(1, validator.validate(stringBean).size());
+        stringBean.ignoreCaseTrimExclude = " A ";
+        assertEquals(1, validator.validate(stringBean).size());
+        stringBean.ignoreCaseTrimExclude = null;
     }
 
     @Test
@@ -126,6 +264,48 @@ public class ValuesConstraintValidationT
         assertEquals(0, validator.validate(testBean).size());
         testBean.oneTwoOrThree = "0";
         assertEquals(1, validator.validate(testBean).size());
+
+        assertNull(stringBean.labeledPlain);
+        assertEquals(0, validator.validate(stringBean).size());
+        stringBean.labeledPlain = "a";
+        assertEquals(0, validator.validate(stringBean).size());
+        stringBean.labeledPlain = "A";
+        assertEquals(1, validator.validate(stringBean).size());
+        stringBean.labeledPlain = null;
+
+        assertNull(stringBean.labeledIgnoreCase);
+        assertEquals(0, validator.validate(stringBean).size());
+        stringBean.labeledIgnoreCase = "a";
+        assertEquals(0, validator.validate(stringBean).size());
+        stringBean.labeledIgnoreCase = "A";
+        assertEquals(0, validator.validate(stringBean).size());
+        stringBean.labeledIgnoreCase = "z";
+        assertEquals(1, validator.validate(stringBean).size());
+        stringBean.labeledIgnoreCase = null;
+
+        assertNull(stringBean.labeledTrim);
+        assertEquals(0, validator.validate(stringBean).size());
+        stringBean.labeledTrim = "a";
+        assertEquals(0, validator.validate(stringBean).size());
+        stringBean.labeledTrim = " a ";
+        assertEquals(0, validator.validate(stringBean).size());
+        stringBean.labeledTrim = " z ";
+        assertEquals(1, validator.validate(stringBean).size());
+        stringBean.labeledTrim = null;
+
+        assertNull(stringBean.labeledIgnoreCaseTrim);
+        assertEquals(0, validator.validate(stringBean).size());
+        stringBean.labeledIgnoreCaseTrim = "A";
+        assertEquals(0, validator.validate(stringBean).size());
+        stringBean.labeledIgnoreCaseTrim = "a";
+        assertEquals(0, validator.validate(stringBean).size());
+        stringBean.labeledIgnoreCaseTrim = " a ";
+        assertEquals(0, validator.validate(stringBean).size());
+        stringBean.labeledIgnoreCaseTrim = " A ";
+        assertEquals(0, validator.validate(stringBean).size());
+        stringBean.labeledIgnoreCaseTrim = " z ";
+        assertEquals(1, validator.validate(stringBean).size());
+        stringBean.labeledIgnoreCaseTrim = null;
     }
 
     @Test
@@ -136,6 +316,50 @@ public class ValuesConstraintValidationT
         assertEquals(0, validator.validate(testBean).size());
         testBean.noneOfOneTwoOrThree = "1";
         assertEquals(1, validator.validate(testBean).size());
+
+        assertNull(stringBean.labeledPlainExclude);
+        assertEquals(0, validator.validate(stringBean).size());
+        stringBean.labeledPlainExclude = "A";
+        assertEquals(0, validator.validate(stringBean).size());
+        stringBean.labeledPlainExclude = "a";
+        assertEquals(1, validator.validate(stringBean).size());
+        stringBean.labeledPlainExclude = null;
+
+        assertNull(stringBean.labeledIgnoreCaseExclude);
+        assertEquals(0, validator.validate(stringBean).size());
+        stringBean.labeledIgnoreCaseExclude = "z";
+        assertEquals(0, validator.validate(stringBean).size());
+        stringBean.labeledIgnoreCaseExclude = "a";
+        assertEquals(1, validator.validate(stringBean).size());
+        stringBean.labeledIgnoreCaseExclude = "A";
+        assertEquals(1, validator.validate(stringBean).size());
+        stringBean.labeledIgnoreCaseExclude = null;
+
+        assertNull(stringBean.labeledTrimExclude);
+        assertEquals(0, validator.validate(stringBean).size());
+        stringBean.labeledTrimExclude = " z ";
+        assertEquals(0, validator.validate(stringBean).size());
+        stringBean.labeledTrimExclude = "a";
+        assertEquals(1, validator.validate(stringBean).size());
+        stringBean.labeledTrimExclude = " a ";
+        assertEquals(1, validator.validate(stringBean).size());
+        stringBean.labeledTrimExclude = null;
+
+        assertNull(stringBean.labeledIgnoreCaseTrimExclude);
+        assertEquals(0, validator.validate(stringBean).size());
+        stringBean.labeledIgnoreCaseTrimExclude = "z";
+        assertEquals(0, validator.validate(stringBean).size());
+        stringBean.labeledIgnoreCaseTrimExclude = " z ";
+        assertEquals(0, validator.validate(stringBean).size());
+        stringBean.labeledIgnoreCaseTrimExclude = "A";
+        assertEquals(1, validator.validate(stringBean).size());
+        stringBean.labeledIgnoreCaseTrimExclude = "a";
+        assertEquals(1, validator.validate(stringBean).size());
+        stringBean.labeledIgnoreCaseTrimExclude = " a ";
+        assertEquals(1, validator.validate(stringBean).size());
+        stringBean.labeledIgnoreCaseTrimExclude = " A ";
+        assertEquals(1, validator.validate(stringBean).size());
+        stringBean.labeledIgnoreCaseTrimExclude = null;
     }
 
     @Test