/*
* 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.internal.engine.constraintvalidation;
import java.lang.annotation.Annotation;
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
*/
class ClassBasedValidatorDescriptor<A extends Annotation> implements ConstraintValidatorDescriptor<A> {
private static final long serialVersionUID = -8207687559460098548L;
private static final Log LOG = LoggerFactory.make();
private final Class<? extends ConstraintValidator<A, ?>> validatorClass;
private final Type validatedType;
private final EnumSet<ValidationTarget> validationTargets;
public ClassBasedValidatorDescriptor(Class<? extends ConstraintValidator<A, ?>> validatorClass) {
this.validatorClass = validatorClass;
this.validatedType = TypeHelper.extractType( validatorClass );
this.validationTargets = determineValidationTargets( validatorClass );
}
private static EnumSet<ValidationTarget> determineValidationTargets(Class<? extends ConstraintValidator<?, ?>> 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<? extends ConstraintValidator<A, ?>> getValidatorClass() {
return validatorClass;
}
@Override
public ConstraintValidator<A, ?> newInstance(ConstraintValidatorFactory constraintFactory) {
ConstraintValidator<A, ?> constraintValidator = constraintFactory.getInstance( validatorClass );
if ( constraintValidator == null ) {
throw LOG.getConstraintFactoryMustNotReturnNullException( validatorClass );
}
return constraintValidator;
}
@Override
public Type getValidatedType() {
return validatedType;
}
@Override
public EnumSet<ValidationTarget> getValidationTargets() {
return validationTargets;
}
}