/* * 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.cfg; import java.lang.reflect.Field; import javax.validation.Configuration; import javax.validation.Validation; import javax.validation.Validator; import javax.validation.ValidatorFactory; import javax.validation.bootstrap.GenericBootstrap; import org.hibernate.validator.HibernateValidatorConfiguration; import org.hibernate.validator.internal.IgnoreForbiddenApisErrors; import org.hibernate.validator.internal.engine.MethodValidationConfiguration; import org.hibernate.validator.internal.engine.ValidatorImpl; import org.hibernate.validator.internal.metadata.BeanMetaDataManager; import org.hibernate.validator.testutil.ValidationXmlTestHelper; import org.testng.Assert; import org.testng.annotations.Test; /** * @author Chris Beckey */ public class ConfigurationFilePropertiesTest { /** * The following test assumes that the file META-INF/validation.xml is present and * contains: * <property name="hibernate.validator.allow_parameter_constraint_override">true</property> * <property name="hibernate.validator.allow_multiple_cascaded_validation_on_return_values">true</property> * <property name="hibernate.validator.allow_parallel_method_parameter_constraint">true</property> * <property name="hibernate.validator.fail_fast">true</property> * * The Maven build runs this test in a separate execution of surefire, which adds the * path to the required file onto its classpath. */ @Test public void testAllowMultipleCascadedValidationOnReturnValues() { runWithCustomValidationXml( "ConfigurationFilePropertiesTest_validation.xml", new Runnable() { @Override public void run() { GenericBootstrap provider = Validation.byDefaultProvider(); Assert.assertNotNull( provider ); Configuration<?> config = provider.configure(); Assert.assertNotNull( config ); Assert.assertTrue( config instanceof HibernateValidatorConfiguration ); HibernateValidatorConfiguration hibernateConfig = (HibernateValidatorConfiguration) config; // Note that the configuration from the XML is not read until the // buildValidatorFactory() method is called. ValidatorFactory factory = hibernateConfig.buildValidatorFactory(); Validator validator = factory.getValidator(); ValidatorImpl hibernateValidatorImpl = (ValidatorImpl) validator; BeanMetaDataManager bmdm = findPropertyOfType( hibernateValidatorImpl, BeanMetaDataManager.class ); MethodValidationConfiguration methodConfig = findPropertyOfType( bmdm, MethodValidationConfiguration.class ); Assert.assertTrue( methodConfig.isAllowMultipleCascadedValidationOnReturnValues() ); } } ); } @Test public void testAllowOverridingMethodAlterParameterConstraint() { runWithCustomValidationXml( "ConfigurationFilePropertiesTest_validation.xml", new Runnable() { @Override public void run() { GenericBootstrap provider = Validation.byDefaultProvider(); Assert.assertNotNull( provider ); Configuration<?> config = provider.configure(); Assert.assertNotNull( config ); Assert.assertTrue( config instanceof HibernateValidatorConfiguration ); HibernateValidatorConfiguration hibernateConfig = (HibernateValidatorConfiguration) config; // Note that the configuration from the XML is not read until the // buildValidatorFactory() method is called. ValidatorFactory factory = hibernateConfig.buildValidatorFactory(); Validator validator = factory.getValidator(); ValidatorImpl hibernateValidatorImpl = (ValidatorImpl) validator; BeanMetaDataManager bmdm = findPropertyOfType( hibernateValidatorImpl, BeanMetaDataManager.class ); MethodValidationConfiguration methodConfig = findPropertyOfType( bmdm, MethodValidationConfiguration.class ); Assert.assertTrue( methodConfig.isAllowOverridingMethodAlterParameterConstraint() ); } } ); } @Test public void testAllowParallelMethodsDefineParameterConstraints() { runWithCustomValidationXml( "ConfigurationFilePropertiesTest_validation.xml", new Runnable() { @Override public void run() { GenericBootstrap provider = Validation.byDefaultProvider(); Assert.assertNotNull( provider ); Configuration<?> config = provider.configure(); Assert.assertNotNull( config ); Assert.assertTrue( config instanceof HibernateValidatorConfiguration ); HibernateValidatorConfiguration hibernateConfig = (HibernateValidatorConfiguration) config; // Note that the configuration from the XML is not read until the // buildValidatorFactory() method is called. ValidatorFactory factory = hibernateConfig.buildValidatorFactory(); Validator validator = factory.getValidator(); ValidatorImpl hibernateValidatorImpl = (ValidatorImpl) validator; BeanMetaDataManager bmdm = findPropertyOfType( hibernateValidatorImpl, BeanMetaDataManager.class ); MethodValidationConfiguration methodConfig = findPropertyOfType( bmdm, MethodValidationConfiguration.class ); Assert.assertTrue( methodConfig.isAllowParallelMethodsDefineParameterConstraints() ); } } ); } /** * Reflect into the subject and find the first property of the given type. * * @param subject - the instance to reflect on * @param clazz - exactly the class to match on * * @return */ @IgnoreForbiddenApisErrors(reason = "Prints the stacktrace in case an exception is raised") private <T extends Object> T findPropertyOfType(Object subject, Class<T> clazz) { Field[] fields = subject.getClass().getDeclaredFields(); for ( Field field : fields ) { if ( field.getType().equals( clazz ) ) { boolean accessible = field.isAccessible(); try { field.setAccessible( true ); return (T) field.get( subject ); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } finally { field.setAccessible( accessible ); } } } return null; } private void runWithCustomValidationXml(String validationXmlName, Runnable runnable) { new ValidationXmlTestHelper( ConfigurationFilePropertiesTest.class ). runWithCustomValidationXml( validationXmlName, runnable ); } }