[hibernate-commits] Hibernate SVN: r16287 - in validator/trunk/hibernate-validator/src: test/java/org/hibernate/validation/engine/xml and 1 other directories.
hibernate-commits at lists.jboss.org
hibernate-commits at lists.jboss.org
Thu Apr 9 12:07:23 EDT 2009
Author: hardy.ferentschik
Date: 2009-04-09 12:07:22 -0400 (Thu, 09 Apr 2009)
New Revision: 16287
Added:
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ConstraintValidatorDefinitionsCache.java
validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/xml/CustomConsistentUserValidator.java
Modified:
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/BeanMetaDataImpl.java
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ConfigurationImpl.java
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ConstraintDescriptorImpl.java
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ConstraintHelper.java
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ConstraintValidatorContextImpl.java
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/DefaultValidationProviderResolver.java
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ValidatorFactoryImpl.java
validator/trunk/hibernate-validator/src/test/resources/META-INF/validation/user-constraints.xml
Log:
HV-112
Added support for constraint validator configuration.
Modified: validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/BeanMetaDataImpl.java
===================================================================
--- validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/BeanMetaDataImpl.java 2009-04-09 12:23:07 UTC (rev 16286)
+++ validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/BeanMetaDataImpl.java 2009-04-09 16:07:22 UTC (rev 16287)
@@ -279,13 +279,13 @@
return propertyDescriptor;
}
- private <A extends Annotation> void initClassConstraints(Class clazz, AnnotationIgnores annotationIgnores) {
+ private <A extends Annotation> void initClassConstraints(Class<?> clazz, AnnotationIgnores annotationIgnores) {
if ( annotationIgnores.isIgnoreAnnotations( clazz ) ) {
return;
}
List<ConstraintDescriptorImpl> classMetadata = findClassLevelConstraints( clazz );
for ( ConstraintDescriptorImpl constraintDescription : classMetadata ) {
- MetaConstraint<T, A> metaConstraint = new MetaConstraint<T, A>( clazz, constraintDescription );
+ MetaConstraint<T, A> metaConstraint = new MetaConstraint<T, A>( beanClass, constraintDescription );
metaConstraintList.add( metaConstraint );
}
}
@@ -304,7 +304,7 @@
List<Annotation> constraints = new ArrayList<Annotation>();
if ( constraintHelper.isConstraintAnnotation( annotation ) ||
- constraintHelper.isBuiltinConstraint( annotation ) ) {
+ constraintHelper.isBuiltinConstraint( annotation.annotationType() ) ) {
constraints.add( annotation );
}
Modified: validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ConfigurationImpl.java
===================================================================
--- validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ConfigurationImpl.java 2009-04-09 12:23:07 UTC (rev 16286)
+++ validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ConfigurationImpl.java 2009-04-09 16:07:22 UTC (rev 16287)
@@ -265,9 +265,21 @@
xmlParameters.constraintValidatorFactory = clazz.newInstance();
log.info( "Using {} as constraint factory.", constraintFactoryClass );
}
- catch ( Exception e ) {
- throw new ValidationException( "Unable to instantiate message interpolator class " + constraintFactoryClass + "." );
+ catch ( ClassNotFoundException e ) {
+ throw new ValidationException(
+ "Unable to instantiate constraint factory class " + constraintFactoryClass + ".", e
+ );
}
+ catch ( InstantiationException e ) {
+ throw new ValidationException(
+ "Unable to instantiate constraint factory class " + constraintFactoryClass + ".", e
+ );
+ }
+ catch ( IllegalAccessException e ) {
+ throw new ValidationException(
+ "Unable to instantiate constraint factory class " + constraintFactoryClass + ".", e
+ );
+ }
}
}
@@ -310,9 +322,21 @@
xmlParameters.messageInterpolator = clazz.newInstance();
log.info( "Using {} as message interpolator.", messageInterpolatorClass );
}
- catch ( Exception e ) {
- throw new ValidationException( "Unable to instantiate message interpolator class " + messageInterpolatorClass + "." );
+ catch ( ClassNotFoundException e ) {
+ throw new ValidationException(
+ "Unable to instantiate message interpolator class " + messageInterpolatorClass + ".", e
+ );
}
+ catch ( InstantiationException e ) {
+ throw new ValidationException(
+ "Unable to instantiate message interpolator class " + messageInterpolatorClass + ".", e
+ );
+ }
+ catch ( IllegalAccessException e ) {
+ throw new ValidationException(
+ "Unable to instantiate message interpolator class " + messageInterpolatorClass + ".", e
+ );
+ }
}
}
@@ -327,9 +351,21 @@
xmlParameters.traversableResolver = clazz.newInstance();
log.info( "Using {} as traversable resolver.", traversableResolverClass );
}
- catch ( Exception e ) {
- throw new ValidationException( "Unable to instantiate message interpolator class " + traversableResolverClass + "." );
+ catch ( ClassNotFoundException e ) {
+ throw new ValidationException(
+ "Unable to instantiate traversable resolver class " + traversableResolverClass + ".", e
+ );
}
+ catch ( InstantiationException e ) {
+ throw new ValidationException(
+ "Unable to instantiate traversable resolver class " + traversableResolverClass + ".", e
+ );
+ }
+ catch ( IllegalAccessException e ) {
+ throw new ValidationException(
+ "Unable to instantiate traversable resolver class " + traversableResolverClass + ".", e
+ );
+ }
}
}
@@ -398,7 +434,7 @@
return schema;
}
- private class ParameterHolder {
+ private static class ParameterHolder {
ConstraintValidatorFactory constraintValidatorFactory;
MessageInterpolator messageInterpolator;
TraversableResolver traversableResolver;
Modified: validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ConstraintDescriptorImpl.java
===================================================================
--- validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ConstraintDescriptorImpl.java 2009-04-09 12:23:07 UTC (rev 16286)
+++ validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ConstraintDescriptorImpl.java 2009-04-09 16:07:22 UTC (rev 16287)
@@ -113,28 +113,43 @@
ReportAsSingleViolation.class
);
- findConstraintClasses();
+ findConstraintValidatorClasses();
Map<ClassIndexWrapper, Map<String, Object>> overrideParameters = parseOverrideParameters();
parseComposingConstraints( overrideParameters );
}
- private void findConstraintClasses() {
- if ( constraintHelper.isBuiltinConstraint( annotation ) ) {
- constraintValidatorDefinitonClasses.addAll( constraintHelper.getBuiltInConstraints( annotation ) );
+ private void findConstraintValidatorClasses() {
+ if ( ConstraintValidatorDefinitionsCache.containsConstraintValidatorDefinition( annotation.annotationType())) {
+ for ( Class<? extends ConstraintValidator<? extends Annotation, ?>> validator : ConstraintValidatorDefinitionsCache
+ .getConstraintValidatorDefinition(
+ annotation.annotationType()
+ ) ) {
+ constraintValidatorDefinitonClasses.add( ( Class<? extends ConstraintValidator<T, ?>> ) validator );
+ }
+ return;
}
+
+ List<Class<? extends ConstraintValidator<? extends Annotation, ?>>> constraintDefinitonClasses = new ArrayList<Class<? extends ConstraintValidator<? extends Annotation, ?>>>();
+ if ( constraintHelper.isBuiltinConstraint( annotation.annotationType() ) ) {
+ constraintDefinitonClasses.addAll( constraintHelper.getBuiltInConstraints( annotation.annotationType() ) );
+ }
else {
final Class<? extends Annotation> annotationType = annotation.annotationType();
Class<? extends ConstraintValidator<?, ?>>[] validatedBy = annotationType
.getAnnotation( Constraint.class )
.validatedBy();
- for ( Class<? extends ConstraintValidator<?, ?>> validator : validatedBy ) {
- //FIXME does this create a CCE at runtime?
- //FIXME if yes wrap into VE, if no we need to test the type here
- //Once resolved,we can @SuppressWarning("unchecked") on the cast
- Class<? extends ConstraintValidator<T, ?>> safeValidator = ( Class<? extends ConstraintValidator<T, ?>> ) validator;
- constraintValidatorDefinitonClasses.add( safeValidator );
- }
+ constraintDefinitonClasses.addAll( Arrays.asList( validatedBy ) );
}
+
+ ConstraintValidatorDefinitionsCache.addConstraintValidatorDefinition(
+ annotation.annotationType(), constraintDefinitonClasses
+ );
+
+ for ( Class<? extends ConstraintValidator<? extends Annotation, ?>> validator : constraintDefinitonClasses ) {
+ @SuppressWarnings("unchecked")
+ Class<? extends ConstraintValidator<T, ?>> safeValidator = ( Class<? extends ConstraintValidator<T, ?>> ) validator;
+ constraintValidatorDefinitonClasses.add( safeValidator );
+ }
}
public T getAnnotation() {
@@ -239,7 +254,7 @@
private void parseComposingConstraints(Map<ClassIndexWrapper, Map<String, Object>> overrideParameters) {
for ( Annotation declaredAnnotation : annotation.annotationType().getDeclaredAnnotations() ) {
if ( constraintHelper.isConstraintAnnotation( declaredAnnotation )
- || constraintHelper.isBuiltinConstraint( declaredAnnotation ) ) {
+ || constraintHelper.isBuiltinConstraint( declaredAnnotation.annotationType() ) ) {
ConstraintDescriptorImpl<?> descriptor = createComposingConstraintDescriptor(
declaredAnnotation, overrideParameters, OVERRIDES_PARAMETER_DEFAULT_INDEX
);
Modified: validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ConstraintHelper.java
===================================================================
--- validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ConstraintHelper.java 2009-04-09 12:23:07 UTC (rev 16286)
+++ validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ConstraintHelper.java 2009-04-09 16:07:22 UTC (rev 16287)
@@ -132,30 +132,32 @@
builtinConstraints.put( Pattern.class, constraintList );
}
- public <T extends Annotation> List<Class<? extends ConstraintValidator<T, ?>>> getBuiltInConstraints(T annotation) {
- final List<Class<? extends ConstraintValidator<?, ?>>> builtInList = getBuiltInFromAnnotationType( annotation.annotationType() );
+ public List<Class<? extends ConstraintValidator<? extends Annotation, ?>>> getBuiltInConstraints(Class<? extends Annotation> annotationType) {
+ final List<Class<? extends ConstraintValidator<?, ?>>> builtInList = getBuiltInFromAnnotationType(
+ annotationType
+ );
- if (builtInList == null || builtInList.size() == 0) {
- throw new ValidationException( "Unable to find constraints for " + annotation.annotationType() );
+ if ( builtInList == null || builtInList.size() == 0 ) {
+ throw new ValidationException( "Unable to find constraints for " + annotationType );
}
- List<Class<? extends ConstraintValidator<T, ?>>> constraints =
- new ArrayList<Class<? extends ConstraintValidator<T, ?>>>( builtInList.size() );
- for (Class<? extends ConstraintValidator<?, ?>> validatorClass : builtInList) {
+ List<Class<? extends ConstraintValidator<? extends Annotation, ?>>> constraints =
+ new ArrayList<Class<? extends ConstraintValidator<? extends Annotation, ?>>>( builtInList.size() );
+ for ( Class<? extends ConstraintValidator<?, ?>> validatorClass : builtInList ) {
//safe cause all CV for a given annotation A are CV<A, ?>
- @SuppressWarnings( "unchecked" )
- Class<ConstraintValidator<T, ?>> safeValdiatorClass = (Class<ConstraintValidator<T, ?>>) validatorClass;
+ @SuppressWarnings("unchecked")
+ Class<ConstraintValidator<? extends Annotation, ?>> safeValdiatorClass = ( Class<ConstraintValidator<? extends Annotation, ?>> ) validatorClass;
constraints.add( safeValdiatorClass );
}
return constraints;
}
- private List<Class<? extends ConstraintValidator<?, ?>>> getBuiltInFromAnnotationType(Class<?> annotationType) {
+ private List<Class<? extends ConstraintValidator<? , ?>>> getBuiltInFromAnnotationType(Class<? extends Annotation> annotationType) {
return builtinConstraints.get( annotationType );
}
- public boolean isBuiltinConstraint(Annotation annotation) {
- return builtinConstraints.containsKey( annotation.annotationType() );
+ public boolean isBuiltinConstraint(Class<? extends Annotation> annotationType) {
+ return builtinConstraints.containsKey( annotationType );
}
/**
@@ -174,7 +176,7 @@
if ( returnType.isArray() && returnType.getComponentType().isAnnotation() ) {
Annotation[] annotations = ( Annotation[] ) m.invoke( annotation );
for ( Annotation a : annotations ) {
- if ( isConstraintAnnotation( a ) || isBuiltinConstraint( a ) ) {
+ if ( isConstraintAnnotation( a ) || isBuiltinConstraint( a.annotationType() ) ) {
isMultiValueConstraint = true;
}
else {
@@ -213,7 +215,7 @@
if ( returnType.isArray() && returnType.getComponentType().isAnnotation() ) {
Annotation[] annotations = ( Annotation[] ) m.invoke( annotation );
for ( Annotation a : annotations ) {
- if ( isConstraintAnnotation( a ) || isBuiltinConstraint( a ) ) {
+ if ( isConstraintAnnotation( a ) || isBuiltinConstraint( a.annotationType() ) ) {
annotationList.add( a );
}
}
Modified: validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ConstraintValidatorContextImpl.java
===================================================================
--- validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ConstraintValidatorContextImpl.java 2009-04-09 12:23:07 UTC (rev 16286)
+++ validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ConstraintValidatorContextImpl.java 2009-04-09 16:07:22 UTC (rev 16287)
@@ -1,4 +1,4 @@
-// $Id:$
+// $Id$
/*
* JBoss, Home of Professional Open Source
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
Copied: validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ConstraintValidatorDefinitionsCache.java (from rev 16270, validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/BeanMetaDataCache.java)
===================================================================
--- validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ConstraintValidatorDefinitionsCache.java (rev 0)
+++ validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ConstraintValidatorDefinitionsCache.java 2009-04-09 16:07:22 UTC (rev 16287)
@@ -0,0 +1,48 @@
+// $Id:$
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2008, Red Hat Middleware LLC, and individual contributors
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+* http://www.apache.org/licenses/LICENSE-2.0
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package org.hibernate.validation.engine;
+
+import java.lang.annotation.Annotation;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import javax.validation.ConstraintValidator;
+
+/**
+ * Caches the constraint classes for a given annotation.
+ *
+ * @author Hardy Ferentschik
+ */
+public class ConstraintValidatorDefinitionsCache {
+ private static final Map<Class<? extends Annotation>, List<Class<? extends ConstraintValidator<? extends Annotation, ?>>>> constraintValidatorDefinitons = new HashMap<Class<? extends Annotation>, List<Class<? extends ConstraintValidator<? extends Annotation, ?>>>>();
+
+ public static List<Class<? extends ConstraintValidator<? extends Annotation, ?>>> getConstraintValidatorDefinition(Class<? extends Annotation> annotationClass) {
+ if ( annotationClass == null ) {
+ throw new IllegalArgumentException( "Class cannot be null" );
+ }
+ return constraintValidatorDefinitons.get( annotationClass );
+ }
+
+ public static <A extends Annotation> void addConstraintValidatorDefinition(Class<A> annotationClass, List<Class<? extends ConstraintValidator<? extends Annotation, ?>>> definitionClasses) {
+ constraintValidatorDefinitons.put( annotationClass, definitionClasses );
+ }
+
+ public static boolean containsConstraintValidatorDefinition(Class<? extends Annotation> annotationClass) {
+ return constraintValidatorDefinitons.containsKey( annotationClass );
+ }
+}
\ No newline at end of file
Modified: validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/DefaultValidationProviderResolver.java
===================================================================
--- validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/DefaultValidationProviderResolver.java 2009-04-09 12:23:07 UTC (rev 16286)
+++ validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/DefaultValidationProviderResolver.java 2009-04-09 16:07:22 UTC (rev 16287)
@@ -57,8 +57,8 @@
while ( providerDefinitions.hasMoreElements() ) {
URL url = providerDefinitions.nextElement();
InputStream stream = url.openStream();
+ BufferedReader reader = new BufferedReader( new InputStreamReader( stream ), 100 );
try {
- BufferedReader reader = new BufferedReader( new InputStreamReader( stream ), 100 );
name = reader.readLine();
while ( name != null ) {
name = name.trim();
@@ -76,7 +76,7 @@
}
}
finally {
- stream.close();
+ reader.close();
}
}
}
Modified: validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ValidatorFactoryImpl.java
===================================================================
--- validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ValidatorFactoryImpl.java 2009-04-09 12:23:07 UTC (rev 16286)
+++ validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ValidatorFactoryImpl.java 2009-04-09 16:07:22 UTC (rev 16287)
@@ -32,6 +32,8 @@
import java.util.List;
import java.util.Map;
import java.util.Set;
+import javax.validation.Constraint;
+import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorFactory;
import javax.validation.MessageInterpolator;
import javax.validation.TraversableResolver;
@@ -58,6 +60,7 @@
import org.hibernate.validation.xml.AnnotationType;
import org.hibernate.validation.xml.BeanType;
import org.hibernate.validation.xml.ClassType;
+import org.hibernate.validation.xml.ConstraintDefinitionType;
import org.hibernate.validation.xml.ConstraintMappingsType;
import org.hibernate.validation.xml.ConstraintType;
import org.hibernate.validation.xml.ElementType;
@@ -65,6 +68,7 @@
import org.hibernate.validation.xml.GetterType;
import org.hibernate.validation.xml.GroupSequenceType;
import org.hibernate.validation.xml.GroupsType;
+import org.hibernate.validation.xml.ValidatedByType;
/**
* @author Emmanuel Bernard
@@ -76,12 +80,12 @@
private static final String VALIDATION_MAPPING_XSD = "META-INF/validation-mapping-1.0.xsd";
private static final String MESSAGE_PARAM = "message";
private static final String GROUPS_PARAM = "groups";
+ private static final String PACKAGE_SEPERATOR = ".";
private final MessageInterpolator messageInterpolator;
private final TraversableResolver traversableResolver;
private final ConstraintValidatorFactory constraintValidatorFactory;
private final ConstraintHelper constraintHelper = new ConstraintHelper();
- private static final String PACKAGE_SEPERATOR = ".";
private final Set<Class<?>> processedClasses = new HashSet<Class<?>>();
@@ -143,9 +147,10 @@
private void parseMappingFiles(Set<InputStream> mappingStreams) {
for ( InputStream in : mappingStreams ) {
try {
- ConstraintMappingsType mappings = getValidationConfig( in );
- String defaultPackage = mappings.getDefaultPackage();
- for ( BeanType bean : mappings.getBean() ) {
+ ConstraintMappingsType mapping = getValidationConfig( in );
+ parseConstraintDefinitions( mapping.getConstraintDefinition() );
+ String defaultPackage = mapping.getDefaultPackage();
+ for ( BeanType bean : mapping.getBean() ) {
Class<?> beanClass = getClass( bean.getClazz(), defaultPackage );
checkClassHasNotBeenProcessed( processedClasses, beanClass );
annotationIgnores.setDefaultIgnoreAnnotation( beanClass, bean.isIgnoreAnnotations() );
@@ -166,6 +171,44 @@
}
}
+ private void parseConstraintDefinitions(List<ConstraintDefinitionType> constraintDefinitionList) {
+ for ( ConstraintDefinitionType constraintDefinition : constraintDefinitionList ) {
+ String annotationClassName = constraintDefinition.getAnnotation();
+ Class<? extends Annotation> annotationClass;
+ try {
+ annotationClass = ( Class<? extends Annotation> ) ReflectionHelper.classForName(
+ annotationClassName, this.getClass()
+ );
+ }
+ catch ( ClassNotFoundException e ) {
+ throw new ValidationException( "Unable to load class " + annotationClassName );
+ }
+
+ ValidatedByType validatedByType = constraintDefinition.getValidatedBy();
+ List<Class<? extends ConstraintValidator<? extends Annotation, ?>>> constraintValidatorClasses = new ArrayList<Class<? extends ConstraintValidator<? extends Annotation, ?>>>();
+ if ( validatedByType.isIncludeExistingValidators() != null && validatedByType.isIncludeExistingValidators() ) {
+ constraintValidatorClasses.addAll( findConstraintValidatorClasses( annotationClass ) );
+ }
+ for ( String validatorClassName : validatedByType.getValue() ) {
+ Class<? extends ConstraintValidator<?, ?>> validatorClass;
+ try {
+ // TODO validate this class!
+ validatorClass = ( Class<? extends ConstraintValidator<?, ?>> ) ReflectionHelper.classForName(
+ validatorClassName,
+ this.getClass()
+ );
+ }
+ catch ( ClassNotFoundException e ) {
+ throw new ValidationException( "Unable to load class " + validatorClassName );
+ }
+ constraintValidatorClasses.add( validatorClass );
+ }
+ ConstraintValidatorDefinitionsCache.addConstraintValidatorDefinition(
+ annotationClass, constraintValidatorClasses
+ );
+ }
+ }
+
private void checkClassHasNotBeenProcessed(Set<Class<?>> processedClasses, Class<?> beanClass) {
if ( processedClasses.contains( beanClass ) ) {
throw new ValidationException( beanClass.getName() + " has already be configured in xml." );
@@ -557,4 +600,24 @@
BeanMetaDataCache.addBeanMetaData( beanClass, metaData );
}
}
+
+ private List<Class<? extends ConstraintValidator<? extends Annotation, ?>>> findConstraintValidatorClasses(Class<? extends Annotation> annotationType) {
+ List<Class<? extends ConstraintValidator<? extends Annotation, ?>>> constraintValidatorDefinitonClasses = new ArrayList<Class<? extends ConstraintValidator<? extends Annotation, ?>>>();
+ if ( constraintHelper.isBuiltinConstraint( annotationType ) ) {
+ constraintValidatorDefinitonClasses.addAll( constraintHelper.getBuiltInConstraints( annotationType ) );
+ }
+ else {
+ Class<? extends ConstraintValidator<?, ?>>[] validatedBy = annotationType
+ .getAnnotation( Constraint.class )
+ .validatedBy();
+ for ( Class<? extends ConstraintValidator<?, ?>> validator : validatedBy ) {
+ //FIXME does this create a CCE at runtime?
+ //FIXME if yes wrap into VE, if no we need to test the type here
+ //Once resolved,we can @SuppressWarning("unchecked") on the cast
+ Class<? extends ConstraintValidator<? extends Annotation, ?>> safeValidator = validator;
+ constraintValidatorDefinitonClasses.add( safeValidator );
+ }
+ }
+ return constraintValidatorDefinitonClasses;
+ }
}
Added: validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/xml/CustomConsistentUserValidator.java
===================================================================
--- validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/xml/CustomConsistentUserValidator.java (rev 0)
+++ validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/xml/CustomConsistentUserValidator.java 2009-04-09 16:07:22 UTC (rev 16287)
@@ -0,0 +1,36 @@
+// $Id:$
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2008, Red Hat Middleware LLC, and individual contributors
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+* http://www.apache.org/licenses/LICENSE-2.0
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package org.hibernate.validation.engine.xml;
+
+import javax.validation.ConstraintValidatorContext;
+
+import org.slf4j.Logger;
+
+import org.hibernate.validation.util.LoggerFactory;
+
+/**
+ * @author Hardy Ferentschik
+ */
+public class CustomConsistentUserValidator extends ConsistentUserValidator {
+ private static final Logger log = LoggerFactory.make();
+
+ public boolean isValid(User user, ConstraintValidatorContext constraintValidatorContext) {
+ log.debug( "is valid in CustomConsistentUserValidator is called." );
+ return super.isValid( user, constraintValidatorContext );
+ }
+}
Property changes on: validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/xml/CustomConsistentUserValidator.java
___________________________________________________________________
Name: svn:keywords
+ Id
Modified: validator/trunk/hibernate-validator/src/test/resources/META-INF/validation/user-constraints.xml
===================================================================
--- validator/trunk/hibernate-validator/src/test/resources/META-INF/validation/user-constraints.xml 2009-04-09 12:23:07 UTC (rev 16286)
+++ validator/trunk/hibernate-validator/src/test/resources/META-INF/validation/user-constraints.xml 2009-04-09 16:07:22 UTC (rev 16287)
@@ -52,4 +52,9 @@
</constraint>
</getter>
</bean>
+ <constraint-definition annotation="org.hibernate.validation.engine.xml.ConsistentUserInformation">
+ <validated-by include-existing-validators="false">
+ <value>org.hibernate.validation.engine.xml.CustomConsistentUserValidator</value>
+ </validated-by>
+ </constraint-definition>
</constraint-mappings>
More information about the hibernate-commits
mailing list