/* * Hibernate Validator, declare and validate application constraints * * License: Apache License, Version 2.0 * See the license.txt file in the root directory or <http://www.apache.org/licenses/LICENSE-2.0>. */ package org.hibernate.validator.test.internal.metadata.descriptor; import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import java.util.Set; import javax.validation.Constraint; import javax.validation.ConstraintTarget; import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; import javax.validation.Payload; import javax.validation.constraints.NotNull; import javax.validation.constraintvalidation.SupportedValidationTarget; import javax.validation.constraintvalidation.ValidationTarget; import javax.validation.metadata.BeanDescriptor; import javax.validation.metadata.ConstraintDescriptor; import javax.validation.metadata.CrossParameterDescriptor; import javax.validation.metadata.MethodDescriptor; import javax.validation.metadata.MethodType; import javax.validation.metadata.PropertyDescriptor; import org.testng.annotations.Test; import static java.lang.annotation.ElementType.ANNOTATION_TYPE; import static java.lang.annotation.ElementType.METHOD; import static org.hibernate.validator.internal.util.CollectionHelper.newHashSet; import static org.hibernate.validator.testutils.ValidatorUtil.getBeanDescriptor; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNull; /** * @author Hardy Ferentschik */ public class ConstraintDescriptorTest { @Test public void testBasicDescriptorAttributes() { BeanDescriptor beanDescriptor = getBeanDescriptor( Foo.class ); PropertyDescriptor propertyDescriptor = beanDescriptor.getConstraintsForProperty( "fubar" ); Set<ConstraintDescriptor<?>> constraintDescriptors = propertyDescriptor.getConstraintDescriptors(); assertEquals( constraintDescriptors.size(), 1 ); ConstraintDescriptor<?> constraintDescriptor = constraintDescriptors.iterator().next(); assertEquals( constraintDescriptor.getMessageTemplate(), "bar", "Wrong message" ); Set<Class<?>> groups = newHashSet(); groups.add( SnafuGroup.class ); assertEquals( constraintDescriptor.getGroups(), groups, "Wrong groups" ); Set<Class<?>> payloads = newHashSet(); payloads.add( Payload22.class ); assertEquals( constraintDescriptor.getPayload(), payloads, "Wrong payload" ); assertNull( constraintDescriptor.getValidationAppliesTo(), "There is no validationAppliedTo attribute" ); } @Test public void testValidationAppliesTo() { BeanDescriptor beanDescriptor = getBeanDescriptor( Bar.class ); Set<MethodDescriptor> methodDescriptors = beanDescriptor.getConstrainedMethods( MethodType.NON_GETTER ); assertEquals( methodDescriptors.size(), 1 ); CrossParameterDescriptor crossParameterDescriptor = methodDescriptors.iterator() .next() .getCrossParameterDescriptor(); Set<ConstraintDescriptor<?>> constraintDescriptors = crossParameterDescriptor.getConstraintDescriptors(); assertEquals( constraintDescriptors.size(), 1 ); ConstraintDescriptor<?> constraintDescriptor = constraintDescriptors.iterator().next(); assertEquals( constraintDescriptor.getValidationAppliesTo(), ConstraintTarget.PARAMETERS, "wrong constraint targets" ); } public interface SnafuGroup { } public static class Payload22 implements Payload { } public static class Foo { @NotNull(message = "bar", groups = SnafuGroup.class, payload = Payload22.class) private String fubar; } @Target({ METHOD, ANNOTATION_TYPE }) @Retention(RetentionPolicy.RUNTIME) @Constraint(validatedBy = { VersatileConstraintValidator.class }) @Documented public @interface VersatileConstraint { String message() default ""; Class<?>[] groups() default { }; Class<? extends Payload>[] payload() default { }; ConstraintTarget validationAppliesTo() default ConstraintTarget.IMPLICIT; } @SupportedValidationTarget(value = { ValidationTarget.PARAMETERS, ValidationTarget.ANNOTATED_ELEMENT }) public class VersatileConstraintValidator implements ConstraintValidator<VersatileConstraint, Object[]> { @Override public boolean isValid(Object[] value, ConstraintValidatorContext context) { return false; } } public static class Bar { @VersatileConstraint(validationAppliesTo = ConstraintTarget.PARAMETERS) public String concatenateStrings(String a, String b) { return a + b; } } }