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 <[email protected]> Authored: Tue Mar 27 10:22:29 2018 -0500 Committer: Matt Benson <[email protected]> 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; + } }
