/* * 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.xml; import static org.hibernate.validator.internal.util.CollectionHelper.newHashSet; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertFalse; import static org.testng.Assert.assertTrue; import static org.testng.Assert.fail; import java.io.InputStream; import java.util.Collections; import java.util.List; import java.util.Set; import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; import javax.validation.ValidationException; import javax.validation.constraints.DecimalMin; import org.hibernate.validator.internal.engine.cascading.ValueExtractorManager; import org.hibernate.validator.internal.engine.constraintvalidation.ConstraintValidatorDescriptor; import org.hibernate.validator.internal.metadata.core.ConstraintHelper; import org.hibernate.validator.internal.util.TypeResolutionHelper; import org.hibernate.validator.internal.xml.MappingXmlParser; import org.hibernate.validator.testutil.TestForIssue; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; /** * @author Hardy Ferentschik */ public class MappingXmlParserTest { private MappingXmlParser xmlMappingParser; private ConstraintHelper constraintHelper; @BeforeMethod public void setupParserHelper() { constraintHelper = new ConstraintHelper(); xmlMappingParser = new MappingXmlParser( constraintHelper, new TypeResolutionHelper(), new ValueExtractorManager( Collections.emptySet() ), null ); } @Test @TestForIssue(jiraKey = "HV-782") public void testAdditionalConstraintValidatorsGetAddedAndAreLastInList() { List<ConstraintValidatorDescriptor<DecimalMin>> validatorDescriptors = constraintHelper.getAllValidatorDescriptors( DecimalMin.class ); assertFalse( validatorDescriptors.isEmpty(), "Wrong number of default validators" ); assertEquals( getIndex( validatorDescriptors, DecimalMinValidatorForFoo.class ), -1, "The custom validator must be absent" ); Set<InputStream> mappingStreams = newHashSet(); mappingStreams.add( MappingXmlParserTest.class.getResourceAsStream( "decimal-min-mapping-1.xml" ) ); xmlMappingParser.parse( mappingStreams ); validatorDescriptors = constraintHelper.getAllValidatorDescriptors( DecimalMin.class ); assertFalse( validatorDescriptors.isEmpty(), "Wrong number of default validators" ); assertEquals( getIndex( validatorDescriptors, DecimalMinValidatorForFoo.class ), validatorDescriptors.size() - 1, "The custom validator must be last" ); } private int getIndex(Iterable<? extends ConstraintValidatorDescriptor<?>> descriptors, Class<?> validatorType) { int i = 0; for ( ConstraintValidatorDescriptor<?> constraintValidatorDescriptor : descriptors ) { if ( constraintValidatorDescriptor.getValidatorClass() == validatorType ) { return i; } i++; } return -1; } @Test @TestForIssue(jiraKey = "HV-782") public void testOverridingOfConstraintValidatorsFromMultipleMappingFilesThrowsException() { Set<InputStream> mappingStreams = newHashSet(); mappingStreams.add( MappingXmlParserTest.class.getResourceAsStream( "decimal-min-mapping-1.xml" ) ); mappingStreams.add( MappingXmlParserTest.class.getResourceAsStream( "decimal-min-mapping-2.xml" ) ); try { xmlMappingParser.parse( mappingStreams ); fail( "Constraint definitions for a given constraint can only be overridden once" ); } catch (ValidationException e) { assertTrue( e.getMessage().startsWith( "HV000167" ) ); } } public static class DecimalMinValidatorForFoo implements ConstraintValidator<DecimalMin, Foo> { @Override public boolean isValid(Foo value, ConstraintValidatorContext context) { return false; } } public static class DecimalMinValidatorForBar implements ConstraintValidator<DecimalMin, Bar> { @Override public boolean isValid(Bar value, ConstraintValidatorContext context) { return false; } } public static class Foo { } public static class Bar { } }