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 2018/03/27 16:49:02 UTC

[2/5] bval git commit: implement validationAppliesTo rules

implement validationAppliesTo rules


Project: http://git-wip-us.apache.org/repos/asf/bval/repo
Commit: http://git-wip-us.apache.org/repos/asf/bval/commit/8864228a
Tree: http://git-wip-us.apache.org/repos/asf/bval/tree/8864228a
Diff: http://git-wip-us.apache.org/repos/asf/bval/diff/8864228a

Branch: refs/heads/bv2
Commit: 8864228a46246ef93752efef7173893271ac314a
Parents: 66e9714
Author: Matt Benson <mb...@apache.org>
Authored: Tue Mar 27 10:22:29 2018 -0500
Committer: Matt Benson <mb...@apache.org>
Committed: Tue Mar 27 10:22:29 2018 -0500

----------------------------------------------------------------------
 .../apache/bval/jsr/descriptor/ConstraintD.java | 30 +++++++++++++++++++-
 1 file changed, 29 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/bval/blob/8864228a/bval-jsr/src/main/java/org/apache/bval/jsr/descriptor/ConstraintD.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/descriptor/ConstraintD.java b/bval-jsr/src/main/java/org/apache/bval/jsr/descriptor/ConstraintD.java
index bd8c1f8..d8bb932 100644
--- a/bval-jsr/src/main/java/org/apache/bval/jsr/descriptor/ConstraintD.java
+++ b/bval-jsr/src/main/java/org/apache/bval/jsr/descriptor/ConstraintD.java
@@ -20,6 +20,8 @@ package org.apache.bval.jsr.descriptor;
 
 import java.lang.annotation.Annotation;
 import java.lang.annotation.ElementType;
+import java.lang.reflect.AnnotatedElement;
+import java.lang.reflect.Executable;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
@@ -75,6 +77,7 @@ public class ConstraintD<A extends Annotation> implements ConstraintDescriptor<A
     private final boolean reportAsSingle;
     private final ValidateUnwrappedValue valueUnwrapping;
     private final Map<String, Object> attributes;
+    private final ConstraintTarget validationAppliesTo;
 
     private final Set<ConstraintDescriptor<?>> composingConstraints;
     private final List<Class<? extends ConstraintValidator<A, ?>>> constraintValidatorClasses;
@@ -89,6 +92,7 @@ public class ConstraintD<A extends Annotation> implements ConstraintDescriptor<A
         reportAsSingle = annotation.annotationType().isAnnotationPresent(ReportAsSingleViolation.class);
         valueUnwrapping = computeValidateUnwrappedValue();
         attributes = AnnotationsManager.readAttributes(annotation);
+        validationAppliesTo = computeValidationAppliesTo(meta.getElementType());
 
         Validate.notNull(validatorFactory, "validatorFactory");
         composingConstraints = computeComposingConstraints(validatorFactory);
@@ -137,7 +141,7 @@ public class ConstraintD<A extends Annotation> implements ConstraintDescriptor<A
 
     @Override
     public ConstraintTarget getValidationAppliesTo() {
-        return read(ConstraintAnnotationAttributes.VALIDATION_APPLIES_TO);
+        return validationAppliesTo;
     }
 
     @Override
@@ -224,4 +228,28 @@ public class ConstraintD<A extends Annotation> implements ConstraintDescriptor<A
         }
         return result;
     }
+
+    private ConstraintTarget computeValidationAppliesTo(ElementType elementType) {
+        final ConstraintTarget result = read(ConstraintAnnotationAttributes.VALIDATION_APPLIES_TO);
+        if (result != null) {
+            final AnnotatedElement host = meta.getHost();
+            Exceptions.raiseUnless(host instanceof Executable, ConstraintDeclarationException::new, "Illegal %s on %s",
+                result, host);
+
+            switch (result) {
+            case PARAMETERS:
+                Exceptions.raiseIf(((Executable) host).getParameterCount() == 0, ConstraintDeclarationException::new,
+                    "Illegal specification of %s on %s with no parameters", result, elementType);
+                break;
+            case RETURN_VALUE:
+                Exceptions.raiseIf(Void.TYPE.equals(meta.getType()), ConstraintDeclarationException::new,
+                    "Illegal %s on %s method %s", result, Void.TYPE, host);
+                break;
+            case IMPLICIT:
+                // handled in ReflectionBuilder
+            default:
+            }
+        }
+        return result;
+    }
 }