/*
* 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.engine.methodvalidation.xml;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.validation.Configuration;
import javax.validation.Constraint;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import javax.validation.Payload;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import javax.validation.constraints.NotNull;
import javax.validation.constraintvalidation.SupportedValidationTarget;
import javax.validation.constraintvalidation.ValidationTarget;
import javax.validation.metadata.BeanDescriptor;
import javax.validation.metadata.ConstructorDescriptor;
import javax.validation.metadata.CrossParameterDescriptor;
import javax.validation.metadata.MethodDescriptor;
import org.testng.annotations.Test;
import org.hibernate.validator.testutil.TestForIssue;
import org.hibernate.validator.testutils.ValidatorUtil;
import static java.lang.annotation.ElementType.CONSTRUCTOR;
import static java.lang.annotation.ElementType.METHOD;
import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertTrue;
/**
* @author Hardy Ferentschik
*/
public class IgnoreCrossParameterConstraintTest {
// used by test framework
public IgnoreCrossParameterConstraintTest() {
}
// constructor used for validation
@CrossParameterConstraint
IgnoreCrossParameterConstraintTest(@NotNull String foo, String bar) {
}
@CrossParameterConstraint
public void snafu(@NotNull String foo, String bar) {
}
@Test
@TestForIssue(jiraKey = "HV-734")
public void testCrossParameterConstraintDefinedOnConstructorAndMethod() {
Validator validator = ValidatorUtil.getValidator();
BeanDescriptor beanDescriptor = validator.getConstraintsForClass( this.getClass() );
// check that the test constructor has a cross parameter constraint
ConstructorDescriptor constructorDescriptor = beanDescriptor.getConstraintsForConstructor(
String.class,
String.class
);
CrossParameterDescriptor crossParameterDescriptor = constructorDescriptor.getCrossParameterDescriptor();
assertTrue( crossParameterDescriptor.hasConstraints(), "There should be cross parameter constraints." );
// check that the test method has a cross parameter constraint
MethodDescriptor methodDescriptor = beanDescriptor.getConstraintsForMethod(
"snafu",
String.class,
String.class
);
crossParameterDescriptor = methodDescriptor.getCrossParameterDescriptor();
assertTrue( crossParameterDescriptor.hasConstraints(), "There should be cross parameter constraints." );
}
@Test
@TestForIssue(jiraKey = "HV-734")
public void testCrossParameterConstraintsAreIgnored() {
Validator validator = getXmlConfiguredValidator( "ignore-annotations-for-cross-parameter-constraints.xml" );
BeanDescriptor beanDescriptor = validator.getConstraintsForClass( this.getClass() );
// check that the test constructor has no cross parameter constraint
ConstructorDescriptor constructorDescriptor = beanDescriptor.getConstraintsForConstructor(
String.class,
String.class
);
CrossParameterDescriptor crossParameterDescriptor = constructorDescriptor.getCrossParameterDescriptor();
assertFalse( crossParameterDescriptor.hasConstraints(), "There should be no cross parameter constraints." );
// check that the test method has no cross parameter constraint
MethodDescriptor methodDescriptor = beanDescriptor.getConstraintsForMethod(
"snafu",
String.class,
String.class
);
crossParameterDescriptor = methodDescriptor.getCrossParameterDescriptor();
assertFalse( crossParameterDescriptor.hasConstraints(), "There should be no cross parameter constraints." );
}
private Validator getXmlConfiguredValidator(String fileName) {
final Configuration<?> configuration = ValidatorUtil.getConfiguration();
configuration.addMapping(
IgnoreAnnotationConfiguredConstructorValidationTest.class.getResourceAsStream( fileName )
);
final ValidatorFactory validatorFactory = configuration.buildValidatorFactory();
return validatorFactory.getValidator();
}
@Target({ CONSTRUCTOR, METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = { CrossParameterConstraintValidator.class })
@Documented
public @interface CrossParameterConstraint {
String message() default "snafu";
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
}
@SupportedValidationTarget(value = ValidationTarget.PARAMETERS)
public class CrossParameterConstraintValidator implements ConstraintValidator<CrossParameterConstraint, Object[]> {
@Override
public boolean isValid(Object[] value, ConstraintValidatorContext context) {
return false;
}
}
}