org.hibernate.validator.internal.engine.constraintvalidation.ClassBasedValidatorDescriptor Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of bean-validator Show documentation
Show all versions of bean-validator Show documentation
JSR 380's RI, Hibernate Validator version ${hibernate-validator.version} and its dependencies repackaged as OSGi bundle
/*
* Hibernate Validator, declare and validate application constraints
*
* License: Apache License, Version 2.0
* See the license.txt file in the root directory or .
*/
package org.hibernate.validator.internal.engine.constraintvalidation;
import java.lang.annotation.Annotation;
import java.lang.invoke.MethodHandles;
import java.lang.reflect.Type;
import java.util.Arrays;
import java.util.EnumSet;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorFactory;
import javax.validation.constraintvalidation.SupportedValidationTarget;
import javax.validation.constraintvalidation.ValidationTarget;
import org.hibernate.validator.internal.util.TypeHelper;
import org.hibernate.validator.internal.util.logging.Log;
import org.hibernate.validator.internal.util.logging.LoggerFactory;
/**
* Represents an implementation of {@link ConstraintValidator}.
*
* @author Gunnar Morling
* @author Guillaume Smet
*/
class ClassBasedValidatorDescriptor implements ConstraintValidatorDescriptor {
private static final Log LOG = LoggerFactory.make( MethodHandles.lookup() );
private final Class> validatorClass;
private final Type validatedType;
private final EnumSet validationTargets;
private ClassBasedValidatorDescriptor(Class> validatorClass) {
this.validatorClass = validatorClass;
this.validatedType = TypeHelper.extractValidatedType( validatorClass );
this.validationTargets = determineValidationTargets( validatorClass );
}
public static ClassBasedValidatorDescriptor of(Class> validatorClass,
Class registeredConstraintAnnotationType) {
Type definedConstraintAnnotationType = TypeHelper.extractConstraintType( validatorClass );
if ( !registeredConstraintAnnotationType.equals( definedConstraintAnnotationType ) ) {
throw LOG.getConstraintValidatorDefinitionConstraintMismatchException( validatorClass, registeredConstraintAnnotationType,
definedConstraintAnnotationType );
}
return new ClassBasedValidatorDescriptor( validatorClass );
}
private static EnumSet determineValidationTargets(Class> validatorClass) {
SupportedValidationTarget supportedTargetAnnotation = validatorClass.getAnnotation(
SupportedValidationTarget.class );
// by default constraints target the annotated element
if ( supportedTargetAnnotation == null ) {
return EnumSet.of( ValidationTarget.ANNOTATED_ELEMENT );
}
else {
return EnumSet.copyOf( Arrays.asList( supportedTargetAnnotation.value() ) );
}
}
@Override
public Class> getValidatorClass() {
return validatorClass;
}
@Override
public ConstraintValidator newInstance(ConstraintValidatorFactory constraintValidatorFactory) {
ConstraintValidator constraintValidator = constraintValidatorFactory.getInstance( validatorClass );
if ( constraintValidator == null ) {
throw LOG.getConstraintValidatorFactoryMustNotReturnNullException( validatorClass );
}
return constraintValidator;
}
@Override
public Type getValidatedType() {
return validatedType;
}
@Override
public EnumSet getValidationTargets() {
return validationTargets;
}
}