package org.jboss.resteasy.plugins.validation;
import java.util.Set;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.validation.BootstrapConfiguration;
import javax.validation.Configuration;
import javax.validation.Validation;
import javax.validation.ValidationException;
import javax.validation.ValidatorFactory;
import javax.validation.executable.ExecutableType;
import org.hibernate.validator.HibernateValidator;
import org.hibernate.validator.HibernateValidatorConfiguration;
import org.jboss.resteasy.plugins.validation.i18n.LogMessages;
import org.jboss.resteasy.plugins.validation.i18n.Messages;
import org.jboss.resteasy.spi.validation.GeneralValidatorCDI;
/**
*
* @author Leandro Ferro Luzia
* @author <a href="ron.sigal@jboss.com">Ron Sigal</a>
* @version $Revision: 1.1 $
*
* Copyright May 23, 2013
*/
public class AbstractValidatorContextResolver
{
private volatile ValidatorFactory validatorFactory;
final static Object RD_LOCK = new Object();
private volatile Configuration<?> config;
private volatile BootstrapConfiguration bootstrapConfiguration;
// this used to be initialized in a static block, but I was having trouble class loading the context resolver in some
// environments. So instead of failing and logging a warning when the resolver is instantiated at deploy time
// we log any validation warning when trying to obtain the ValidatorFactory.
ValidatorFactory getValidatorFactory()
{
ValidatorFactory tmpValidatorFactory = validatorFactory;
if (tmpValidatorFactory == null)
{
synchronized (RD_LOCK)
{
tmpValidatorFactory = validatorFactory;
if (tmpValidatorFactory == null)
{
try
{
// Also look up java:comp/env
Context context = new InitialContext();
validatorFactory = tmpValidatorFactory = ValidatorFactory.class.cast(context.lookup("java:comp/ValidatorFactory"));
LogMessages.LOGGER.debug(Messages.MESSAGES.usingValidatorFactorySupportsCDI(validatorFactory));
}
catch (NamingException e)
{
LogMessages.LOGGER.info(Messages.MESSAGES.usingValidatorFactoryDoesNotSupportCDI());
HibernateValidatorConfiguration config = Validation.byProvider(HibernateValidator.class).configure();
validatorFactory = tmpValidatorFactory = config.buildValidatorFactory();
}
}
}
}
return validatorFactory;
}
BootstrapConfiguration getConfig()
{
BootstrapConfiguration tmpConfig = bootstrapConfiguration;
if (tmpConfig == null)
{
synchronized (RD_LOCK)
{
tmpConfig = bootstrapConfiguration;
if (tmpConfig == null)
{
config = Validation.byDefaultProvider().configure();
bootstrapConfiguration = tmpConfig = config.getBootstrapConfiguration();
}
}
}
return tmpConfig;
}
public GeneralValidatorCDI getContext(Class<?> type) {
try
{
BootstrapConfiguration bootstrapConfiguration = getConfig();
boolean isExecutableValidationEnabled = bootstrapConfiguration.isExecutableValidationEnabled();
Set<ExecutableType> defaultValidatedExecutableTypes = bootstrapConfiguration.getDefaultValidatedExecutableTypes();
return new GeneralValidatorImpl(getValidatorFactory(), isExecutableValidationEnabled, defaultValidatedExecutableTypes);
}
catch (Exception e)
{
throw new ValidationException(Messages.MESSAGES.unableToLoadValidationSupport(), e);
}
}
}