/*
* 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.cdi;
import java.lang.annotation.Annotation;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import javax.enterprise.inject.Any;
import javax.enterprise.inject.Default;
import javax.enterprise.util.AnnotationLiteral;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import org.hibernate.validator.HibernateValidatorFactory;
import org.hibernate.validator.cdi.HibernateValidator;
import org.hibernate.validator.internal.engine.ValidatorFactoryImpl;
import org.hibernate.validator.internal.engine.ValidatorImpl;
import static org.hibernate.validator.internal.util.CollectionHelper.newHashSet;
/**
* Provides functionality for dealing with validation provider types.
*
* @author Gunnar Morling
*/
public class ValidationProviderHelper {
private final boolean isDefaultProvider;
private final boolean isHibernateValidator;
private final Class<? extends ValidatorFactory> validatorFactoryClass;
private final Class<? extends Validator> validatorClass;
private final Set<Annotation> qualifiers;
public static ValidationProviderHelper forDefaultProvider(ValidatorFactory validatorFactory) {
boolean isHibernateValidator = validatorFactory instanceof HibernateValidatorFactory;
return new ValidationProviderHelper(
true,
isHibernateValidator,
validatorFactory.getClass(),
validatorFactory.getValidator().getClass(),
determineRequiredQualifiers( true, isHibernateValidator )
);
}
public static ValidationProviderHelper forHibernateValidator() {
return new ValidationProviderHelper(
false,
true,
ValidatorFactoryImpl.class,
ValidatorImpl.class,
determineRequiredQualifiers( false, true )
);
}
private ValidationProviderHelper(boolean isDefaultProvider,
boolean isHibernateValidator,
Class<? extends ValidatorFactory> validatorFactoryClass,
Class<? extends Validator> validatorClass,
Set<Annotation> qualifiers) {
this.isDefaultProvider = isDefaultProvider;
this.isHibernateValidator = isHibernateValidator;
this.validatorFactoryClass = validatorFactoryClass;
this.validatorClass = validatorClass;
this.qualifiers = Collections.unmodifiableSet( qualifiers );
}
/**
* Whether the given provider is the default provider or not.
*
* @return {@code true} if the given provider is the default provider, {@code false} otherwise
*/
public boolean isDefaultProvider() {
return isDefaultProvider;
}
/**
* Whether the given provider is Hibernate Validator or not.
*/
boolean isHibernateValidator() {
return isHibernateValidator;
}
/**
* Determines the class of the {@link ValidatorFactory} corresponding to the given configuration object.
*/
Class<? extends ValidatorFactory> getValidatorFactoryBeanClass() {
return validatorFactoryClass;
}
/**
* Determines the class of the {@link Validator} corresponding to the given configuration object.
*/
Class<? extends Validator> getValidatorBeanClass() {
return validatorClass;
}
Set<Annotation> getQualifiers() {
return qualifiers;
}
/**
* Returns the qualifiers to be used for registering a validator or validator factory.
*/
@SuppressWarnings("serial")
private static Set<Annotation> determineRequiredQualifiers(boolean isDefaultProvider,
boolean isHibernateValidator) {
HashSet<Annotation> qualifiers = newHashSet( 3 );
if ( isDefaultProvider ) {
qualifiers.add(
new AnnotationLiteral<Default>() {
}
);
}
if ( isHibernateValidator ) {
qualifiers.add(
new AnnotationLiteral<HibernateValidator>() {
}
);
}
qualifiers.add(
new AnnotationLiteral<Any>() {
}
);
return qualifiers;
}
@Override
public String toString() {
return "ValidationProviderHelper [isDefaultProvider="
+ isDefaultProvider + ", isHibernateValidator="
+ isHibernateValidator + ", validatorFactoryClass="
+ validatorFactoryClass + ", validatorClass=" + validatorClass
+ ", qualifiers=" + qualifiers + "]";
}
}