package org.hibernate.validator.referenceguide.chapter07; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.List; import java.util.Set; import javax.validation.Configuration; import javax.validation.Validation; import javax.validation.Validator; import javax.validation.ValidatorFactory; import javax.validation.constraints.Future; import javax.validation.constraints.Min; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; import javax.validation.metadata.BeanDescriptor; import javax.validation.metadata.ConstraintDescriptor; import javax.validation.metadata.ConstructorDescriptor; import javax.validation.metadata.CrossParameterDescriptor; import javax.validation.metadata.MethodDescriptor; import javax.validation.metadata.ParameterDescriptor; import javax.validation.metadata.ReturnValueDescriptor; import org.junit.BeforeClass; import org.junit.Test; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; /** * @author Hardy Ferentschik */ public class XMLConfigurationTest { private static Validator validator; @BeforeClass public static void setUpValidator() { Configuration<?> configuration = Validation.byDefaultProvider().configure(); configuration.addMapping( XMLConfigurationTest.class.getResourceAsStream( "rental-station-mapping.xml" ) ); ValidatorFactory factory = configuration.buildValidatorFactory(); validator = factory.getValidator(); } @Test public void testXMLConstraintsApplied() { BeanDescriptor beanDescriptor = validator.getConstraintsForClass( RentalStation.class ); assertTrue( beanDescriptor.isBeanConstrained() ); ConstructorDescriptor constructorDescriptor = beanDescriptor.getConstraintsForConstructor(); ReturnValueDescriptor returnValueDescriptor = constructorDescriptor.getReturnValueDescriptor(); Set<ConstraintDescriptor<?>> constraintDescriptors = returnValueDescriptor.getConstraintDescriptors(); assertCorrectConstraintTypes( constraintDescriptors, ValidRentalStation.class ); constructorDescriptor = beanDescriptor.getConstraintsForConstructor( String.class ); List<ParameterDescriptor> parameterDescriptors = constructorDescriptor.getParameterDescriptors(); constraintDescriptors = parameterDescriptors.get( 0 ).getConstraintDescriptors(); assertCorrectConstraintTypes( constraintDescriptors, NotNull.class ); MethodDescriptor methodDescriptor = beanDescriptor.getConstraintsForMethod( "getCustomers" ); returnValueDescriptor = methodDescriptor.getReturnValueDescriptor(); constraintDescriptors = returnValueDescriptor.getConstraintDescriptors(); assertCorrectConstraintTypes( constraintDescriptors, NotNull.class, Size.class ); methodDescriptor = beanDescriptor.getConstraintsForMethod( "rentCar", Customer.class, Date.class, int.class ); parameterDescriptors = methodDescriptor.getParameterDescriptors(); constraintDescriptors = parameterDescriptors.get( 0 ).getConstraintDescriptors(); assertCorrectConstraintTypes( constraintDescriptors, NotNull.class ); constraintDescriptors = parameterDescriptors.get( 1 ).getConstraintDescriptors(); assertCorrectConstraintTypes( constraintDescriptors, NotNull.class, Future.class ); constraintDescriptors = parameterDescriptors.get( 2 ).getConstraintDescriptors(); assertCorrectConstraintTypes( constraintDescriptors, Min.class ); } @Test public void testXMLCrossParameterConstraints() { BeanDescriptor beanDescriptor = validator.getConstraintsForClass( Garage.class ); MethodDescriptor methodDescriptor = beanDescriptor.getConstraintsForMethod( "buildCar", java.util.List.class ); CrossParameterDescriptor crossParameterDescriptor = methodDescriptor.getCrossParameterDescriptor(); Set<ConstraintDescriptor<?>> constraintDescriptors = crossParameterDescriptor.getConstraintDescriptors(); assertCorrectConstraintTypes( constraintDescriptors, ELAssert.class ); methodDescriptor = beanDescriptor.getConstraintsForMethod( "paintCar", int.class ); ReturnValueDescriptor returnValueDescriptor = methodDescriptor.getReturnValueDescriptor(); constraintDescriptors = returnValueDescriptor.getConstraintDescriptors(); assertCorrectConstraintTypes( constraintDescriptors, ELAssert.class ); } private void assertCorrectConstraintTypes( Set<ConstraintDescriptor<?>> constraintDescriptors, Class<?>... constraints) { List<Class<?>> constraintAnnotations = new ArrayList<Class<?>>(); constraintAnnotations.addAll( Arrays.asList( constraints ) ); for ( ConstraintDescriptor descriptor : constraintDescriptors ) { Class<?> annotationType = descriptor.getAnnotation().annotationType(); if ( constraintAnnotations.contains( annotationType ) ) { constraintAnnotations.remove( annotationType ); } else { fail( "found constraint type " + annotationType + " which was not expected" ); } } if ( !constraintAnnotations.isEmpty() ) { fail( "not all expected constraint types were found" ); } } }