You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@bval.apache.org by ro...@apache.org on 2010/05/04 14:16:10 UTC

svn commit: r940822 - in /incubator/bval/trunk/bval-jsr303/src: main/java/org/apache/bval/jsr303/AppendValidationToBuilder.java main/java/org/apache/bval/jsr303/Jsr303MetaBeanFactory.java test/java/org/apache/bval/jsr303/ConstraintCompositionTest.java

Author: romanstumm
Date: Tue May  4 12:16:09 2010
New Revision: 940822

URL: http://svn.apache.org/viewvc?rev=940822&view=rev
Log:
BVAL-33 Payload value must also be inherited in compositing constraints - fixes from Carlos Varla

Modified:
    incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/AppendValidationToBuilder.java
    incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/Jsr303MetaBeanFactory.java
    incubator/bval/trunk/bval-jsr303/src/test/java/org/apache/bval/jsr303/ConstraintCompositionTest.java

Modified: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/AppendValidationToBuilder.java
URL: http://svn.apache.org/viewvc/incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/AppendValidationToBuilder.java?rev=940822&r1=940821&r2=940822&view=diff
==============================================================================
--- incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/AppendValidationToBuilder.java (original)
+++ incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/AppendValidationToBuilder.java Tue May  4 12:16:09 2010
@@ -18,6 +18,7 @@ package org.apache.bval.jsr303;
 
 import org.apache.bval.jsr303.xml.AnnotationProxyBuilder;
 
+import javax.validation.Payload;
 import java.lang.annotation.Annotation;
 import java.util.Set;
 
@@ -37,12 +38,18 @@ public class AppendValidationToBuilder i
         // Any groups definition on a composing annotation is ignored.
         Set<Class<?>> inheritedGroups = builder.getConstraintValidation().getGroups();
         validation.setGroups(inheritedGroups);
+        
+        // JSR-303 2.3 p:
+        // Payloads are also inherited
+        Set<Class<? extends Payload>> inheritedPayload = builder.getConstraintValidation().getPayload();
+        validation.setPayload(inheritedPayload);
 
-        // Inherited groups value must also be replicated in the annotation, so
-        // it has to be substituted with a new proxy.
+        // Inherited groups and payload values must also be replicated in the 
+        // annotation, so it has to be substituted with a new proxy.
         T originalAnnot = validation.getAnnotation();
         AnnotationProxyBuilder<T> apb = new AnnotationProxyBuilder<T>(originalAnnot);
         apb.putValue("groups", inheritedGroups.toArray(new Class[inheritedGroups.size()]));
+        apb.putValue("payload", inheritedPayload.toArray(new Class[inheritedPayload.size()]));
         T newAnnot = apb.createAnnotation();
         validation.setAnnotation(newAnnot);
         
@@ -57,4 +64,11 @@ public class AppendValidationToBuilder i
         return builder.getConstraintValidation().getGroups();
     }
     
+    /**
+     * @return The set of payloads from the parent constraint.
+     */
+    public Set<?> getInheritedPayload() {
+        return builder.getConstraintValidation().getPayload();
+    }
+    
 }

Modified: incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/Jsr303MetaBeanFactory.java
URL: http://svn.apache.org/viewvc/incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/Jsr303MetaBeanFactory.java?rev=940822&r1=940821&r2=940822&view=diff
==============================================================================
--- incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/Jsr303MetaBeanFactory.java (original)
+++ incubator/bval/trunk/bval-jsr303/src/main/java/org/apache/bval/jsr303/Jsr303MetaBeanFactory.java Tue May  4 12:16:09 2010
@@ -449,9 +449,13 @@ public class Jsr303MetaBeanFactory imple
         }
         final AnnotationConstraintBuilder builder = new AnnotationConstraintBuilder(
               constraintClasses, validator, annotation, owner, access);
-        // If already building a constraint composition tree, ensure that the parent groups are inherited
+        // If already building a constraint composition tree, ensure that:
+        //  - the parent groups are inherited
+        //  - the parent payload is inherited
         if ( appender instanceof AppendValidationToBuilder ) {
-            builder.getConstraintValidation().setGroups(((AppendValidationToBuilder) appender).getInheritedGroups());
+            AppendValidationToBuilder avb = (AppendValidationToBuilder) appender;
+            builder.getConstraintValidation().setGroups(avb.getInheritedGroups());
+            builder.getConstraintValidation().setPayload(avb.getInheritedPayload());
         }
         // process composed constraints:
         // here are not other superclasses possible, because annotations do not inherit!

Modified: incubator/bval/trunk/bval-jsr303/src/test/java/org/apache/bval/jsr303/ConstraintCompositionTest.java
URL: http://svn.apache.org/viewvc/incubator/bval/trunk/bval-jsr303/src/test/java/org/apache/bval/jsr303/ConstraintCompositionTest.java?rev=940822&r1=940821&r2=940822&view=diff
==============================================================================
--- incubator/bval/trunk/bval-jsr303/src/test/java/org/apache/bval/jsr303/ConstraintCompositionTest.java (original)
+++ incubator/bval/trunk/bval-jsr303/src/test/java/org/apache/bval/jsr303/ConstraintCompositionTest.java Tue May  4 12:16:09 2010
@@ -103,13 +103,37 @@ public class ConstraintCompositionTest e
         Assert.assertEquals("There should only be 1 group", 1, personNameDesc.getGroups().size());
         Assert.assertTrue("Group1 should be present", notNullDesc.getGroups().contains(Group1.class));
         
-        // Check that the groups() value is right when accesing it from an error
+        // Check that the groups() value is right when accessing it from an error
         Set<ConstraintViolation<Man>> violations = validator.validate(new Man(), Group1.class);
         Set<Class<?>> notNullGroups = violations.iterator().next().getConstraintDescriptor().getGroups();
         Assert.assertEquals("There should only be 1 group", 1, notNullGroups.size());
         Assert.assertTrue("Group1 should be the only group", notNullGroups.contains(Group1.class));
     }
     
+    /**
+     * Checks that the payload() value of the constraint annotations are
+     * correctly set to the inherited ones.
+     */
+    public void testAnnotationPayloadsAreInherited() {
+        Validator validator = getValidator();
+        
+        // Check that the payload() value is right when querying the metadata
+        ConstraintDescriptor<?> manNameDesc = getValidator().getConstraintsForClass(Man.class).getConstraintsForProperty("name").getConstraintDescriptors().iterator().next();
+        ConstraintDescriptor<?> personNameDesc = manNameDesc.getComposingConstraints().iterator().next();
+        ConstraintDescriptor<?> notNullDesc = personNameDesc.getComposingConstraints().iterator().next();
+        Assert.assertEquals("There should only be 1 payload class", 1, manNameDesc.getPayload().size());
+        Assert.assertTrue("Payload1 should be present", manNameDesc.getPayload().contains(Payload1.class));
+        Assert.assertEquals("There should only be 1 payload class", 1, personNameDesc.getPayload().size());
+        Assert.assertTrue("Payload1 should be present", personNameDesc.getPayload().contains(Payload1.class));
+        Assert.assertEquals("There should only be 1 payload class", 1, personNameDesc.getPayload().size());
+        Assert.assertTrue("Payload1 should be present", notNullDesc.getPayload().contains(Payload1.class));
+        
+        // Check that the payload() value is right when accessing it from an error
+        Set<ConstraintViolation<Man>> violations = validator.validate(new Man(), Group1.class);
+        Set<Class<? extends Payload>> notNullPayload = violations.iterator().next().getConstraintDescriptor().getPayload();
+        Assert.assertEquals("There should only be 1 payload class", 1, notNullPayload.size());
+        Assert.assertTrue("Payload1 should be the only payload", notNullPayload.contains(Payload1.class));
+    }
     
     
     public static class Person {
@@ -118,11 +142,11 @@ public class ConstraintCompositionTest e
     }
     
     public static class Man {
-        @ManName(groups={Group1.class})
+        @ManName(groups={Group1.class},payload={Payload1.class})
         String name;
     }
     
-    @NotNull(message="A person needs a non null name", groups={Group1.class})
+    @NotNull(message="A person needs a non null name", groups={Group1.class}, payload={})
     @Constraint(validatedBy = {})
     @Documented
     @Target({ METHOD, FIELD, TYPE })
@@ -133,7 +157,7 @@ public class ConstraintCompositionTest e
         Class<? extends Payload>[] payload() default {};
     }
     
-    @PersonName(groups={Group2.class})
+    @PersonName(groups={Group2.class},payload={Payload1.class,Payload2.class})
     @Constraint(validatedBy = {})
     @Documented
     @Target({ METHOD, FIELD, TYPE })
@@ -150,4 +174,10 @@ public class ConstraintCompositionTest e
     public static interface Group2 {
     }
     
+    public static class Payload1 implements Payload {
+    }
+    
+    public static class Payload2 implements Payload {
+    }
+    
 }