/*
* 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.lang.reflect.Type;
import java.util.Collections;
import java.util.Set;
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.context.spi.CreationalContext;
import javax.enterprise.inject.spi.Bean;
import javax.enterprise.inject.spi.BeanManager;
import javax.enterprise.inject.spi.InjectionPoint;
import javax.enterprise.inject.spi.PassivationCapable;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import org.hibernate.validator.internal.util.CollectionHelper;
import org.hibernate.validator.internal.util.classhierarchy.ClassHierarchyHelper;
/**
* A {@link Bean} representing a {@link Validator}. There is one instance of this type representing the default
* validator and optionally another instance representing the HV validator in case the default provider is not HV.
*
* @author Hardy Ferentschik
* @author Gunnar Morling
*/
public class ValidatorBean implements Bean<Validator>, PassivationCapable {
private final BeanManager beanManager;
private final ValidationProviderHelper validationProviderHelper;
private final Set<Type> types;
private final Bean<?> validatorFactoryBean;
public ValidatorBean(BeanManager beanManager, Bean<?> validatorFactoryBean,
ValidationProviderHelper validationProviderHelper) {
this.beanManager = beanManager;
this.validatorFactoryBean = validatorFactoryBean;
this.validationProviderHelper = validationProviderHelper;
this.types = Collections.unmodifiableSet(
CollectionHelper.<Type>newHashSet(
ClassHierarchyHelper.getHierarchy( validationProviderHelper.getValidatorBeanClass() )
)
);
}
@Override
public Class<?> getBeanClass() {
return validationProviderHelper.getValidatorBeanClass();
}
@Override
public Set<InjectionPoint> getInjectionPoints() {
return Collections.emptySet();
}
@Override
public String getName() {
return null;
}
@Override
public Set<Annotation> getQualifiers() {
return validationProviderHelper.getQualifiers();
}
@Override
public Class<? extends Annotation> getScope() {
return ApplicationScoped.class;
}
@Override
public Set<Class<? extends Annotation>> getStereotypes() {
return Collections.emptySet();
}
@Override
public Set<Type> getTypes() {
return types;
}
@Override
public boolean isAlternative() {
return false;
}
@Override
public boolean isNullable() {
return false;
}
@Override
public Validator create(CreationalContext<Validator> ctx) {
ValidatorFactory validatorFactory = createValidatorFactory();
return validatorFactory.getValidator();
}
private ValidatorFactory createValidatorFactory() {
CreationalContext<?> context = beanManager.createCreationalContext( validatorFactoryBean );
return (ValidatorFactory) beanManager.getReference( validatorFactoryBean, ValidatorFactory.class, context );
}
@Override
public void destroy(Validator instance, CreationalContext<Validator> ctx) {
}
@Override
public String getId() {
return ValidatorBean.class.getName() + "_" + ( validationProviderHelper.isDefaultProvider() ? "default" : "hv" );
}
@Override
public String toString() {
return "ValidatorBean [id=" + getId() + "]";
}
}