/* * 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.util.Collections; import java.util.IdentityHashMap; import java.util.Map; import javax.enterprise.inject.spi.BeanManager; import javax.inject.Inject; import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorFactory; import org.hibernate.validator.internal.util.Contracts; /** * A {@link ConstraintValidatorFactory} which enables CDI based dependency injection for the created * {@link ConstraintValidator}s. * * @author Gunnar Morling * @author Hardy Ferentschik */ public class InjectingConstraintValidatorFactory implements ConstraintValidatorFactory { // TODO look for something with better performance (HF) private final Map<Object, DestructibleBeanInstance<?>> constraintValidatorMap = Collections.synchronizedMap( new IdentityHashMap<Object, DestructibleBeanInstance<?>>() ); private final BeanManager beanManager; @Inject public InjectingConstraintValidatorFactory(BeanManager beanManager) { Contracts.assertNotNull( beanManager, "The BeanManager cannot be null" ); this.beanManager = beanManager; } @Override public <T extends ConstraintValidator<?, ?>> T getInstance(Class<T> key) { DestructibleBeanInstance<T> destructibleBeanInstance = new DestructibleBeanInstance<T>( beanManager, key ); constraintValidatorMap.put( destructibleBeanInstance.getInstance(), destructibleBeanInstance ); return destructibleBeanInstance.getInstance(); } @Override public void releaseInstance(ConstraintValidator<?, ?> instance) { DestructibleBeanInstance<?> destructibleBeanInstance = constraintValidatorMap.remove( instance ); // HV-865 (Cleanup is multi threaded and instances can be removed by multiple threads. Explicit null check is needed) if ( destructibleBeanInstance != null ) { destructibleBeanInstance.destroy(); } } }