/*
* 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;
import java.util.HashMap;
import java.util.Map;
import javax.validation.ClockProvider;
import javax.validation.ConstraintValidatorFactory;
import javax.validation.MessageInterpolator;
import javax.validation.ParameterNameProvider;
import javax.validation.TraversableResolver;
import javax.validation.Validator;
import javax.validation.valueextraction.ValueExtractor;
import org.hibernate.validator.HibernateValidatorContext;
import org.hibernate.validator.internal.engine.cascading.ValueExtractorDescriptor;
import org.hibernate.validator.internal.engine.cascading.ValueExtractorManager;
import org.hibernate.validator.internal.util.ExecutableParameterNameProvider;
import org.hibernate.validator.internal.util.logging.Log;
import org.hibernate.validator.internal.util.logging.LoggerFactory;
/**
* @author Emmanuel Bernard
* @author Hardy Ferentschik
* @author Kevin Pollet <kevin.pollet@serli.com> (C) 2011 SERLI
* @author Gunnar Morling
* @author Chris Beckey <cbeckey@paypal.com>
*/
public class ValidatorContextImpl implements HibernateValidatorContext {
private static final Log LOG = LoggerFactory.make();
private final ValidatorFactoryImpl validatorFactory;
private MessageInterpolator messageInterpolator;
private TraversableResolver traversableResolver;
private ConstraintValidatorFactory constraintValidatorFactory;
private ExecutableParameterNameProvider parameterNameProvider;
private ClockProvider clockProvider;
private boolean failFast;
private final ValueExtractorManager valueExtractorManager;
private final MethodValidationConfiguration.Builder methodValidationConfigurationBuilder;
private final Map<ValueExtractorDescriptor.Key, ValueExtractorDescriptor> valueExtractorDescriptors;
public ValidatorContextImpl(ValidatorFactoryImpl validatorFactory) {
this.validatorFactory = validatorFactory;
this.messageInterpolator = validatorFactory.getMessageInterpolator();
this.traversableResolver = validatorFactory.getTraversableResolver();
this.constraintValidatorFactory = validatorFactory.getConstraintValidatorFactory();
this.parameterNameProvider = validatorFactory.getExecutableParameterNameProvider();
this.clockProvider = validatorFactory.getClockProvider();
this.failFast = validatorFactory.isFailFast();
this.methodValidationConfigurationBuilder = new MethodValidationConfiguration.Builder( validatorFactory.getMethodValidationConfiguration() );
this.valueExtractorManager = validatorFactory.getValueExtractorManager();
this.valueExtractorDescriptors = new HashMap<>();
}
@Override
public HibernateValidatorContext messageInterpolator(MessageInterpolator messageInterpolator) {
if ( messageInterpolator == null ) {
this.messageInterpolator = validatorFactory.getMessageInterpolator();
}
else {
this.messageInterpolator = messageInterpolator;
}
return this;
}
@Override
public HibernateValidatorContext traversableResolver(TraversableResolver traversableResolver) {
if ( traversableResolver == null ) {
this.traversableResolver = validatorFactory.getTraversableResolver();
}
else {
this.traversableResolver = traversableResolver;
}
return this;
}
@Override
public HibernateValidatorContext constraintValidatorFactory(ConstraintValidatorFactory factory) {
if ( factory == null ) {
this.constraintValidatorFactory = validatorFactory.getConstraintValidatorFactory();
}
else {
this.constraintValidatorFactory = factory;
}
return this;
}
@Override
public HibernateValidatorContext parameterNameProvider(ParameterNameProvider parameterNameProvider) {
if ( parameterNameProvider == null ) {
this.parameterNameProvider = validatorFactory.getExecutableParameterNameProvider();
}
else {
this.parameterNameProvider = new ExecutableParameterNameProvider( parameterNameProvider );
}
return this;
}
@Override
public HibernateValidatorContext clockProvider(ClockProvider clockProvider) {
if ( clockProvider == null ) {
this.clockProvider = validatorFactory.getClockProvider();
}
else {
this.clockProvider = clockProvider;
}
return this;
}
@Override
public HibernateValidatorContext addValueExtractor(ValueExtractor<?> extractor) {
ValueExtractorDescriptor descriptor = new ValueExtractorDescriptor( extractor );
ValueExtractorDescriptor previous = valueExtractorDescriptors.put( descriptor.getKey(), descriptor );
if ( previous != null ) {
throw LOG.getValueExtractorForTypeAndTypeUseAlreadyPresentException( extractor, previous.getValueExtractor() );
}
return this;
}
@Override
public HibernateValidatorContext failFast(boolean failFast) {
this.failFast = failFast;
return this;
}
@Override
public HibernateValidatorContext allowOverridingMethodAlterParameterConstraint(boolean allow) {
methodValidationConfigurationBuilder.allowOverridingMethodAlterParameterConstraint( allow );
return this;
}
@Override
public HibernateValidatorContext allowMultipleCascadedValidationOnReturnValues(boolean allow) {
methodValidationConfigurationBuilder.allowMultipleCascadedValidationOnReturnValues( allow );
return this;
}
@Override
public HibernateValidatorContext allowParallelMethodsDefineParameterConstraints(boolean allow) {
methodValidationConfigurationBuilder.allowParallelMethodsDefineParameterConstraints( allow );
return this;
}
@Override
public Validator getValidator() {
return validatorFactory.createValidator(
constraintValidatorFactory,
messageInterpolator,
traversableResolver,
parameterNameProvider,
clockProvider,
failFast,
valueExtractorDescriptors.isEmpty() ? valueExtractorManager : new ValueExtractorManager( valueExtractorManager, valueExtractorDescriptors ),
methodValidationConfigurationBuilder.build()
);
}
}