Skip to content

Commit

Permalink
Dynamic payload at ValidatorFactory and HibernateValidatorContext level
Browse files Browse the repository at this point in the history
  • Loading branch information
mkurz committed Dec 1, 2017
1 parent 84e327f commit aaf7b8a
Show file tree
Hide file tree
Showing 6 changed files with 52 additions and 17 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -153,4 +153,16 @@ public interface HibernateValidatorContext extends ValidatorContext {
*/
@Incubating
HibernateValidatorContext temporalValidationTolerance(Duration temporalValidationTolerance);

/**
* Define a dynamic payload.
*
* @param dynamicPayload the dynamic payload
*
* @return {@code this} following the chaining method pattern
*
* @since 6.0.5
*/
@Incubating
HibernateValidatorContext dynamicPayload(Object dynamicPayload);
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
import javax.validation.ClockProvider;

import org.hibernate.validator.Incubating;
import org.hibernate.validator.internal.engine.ValidatorImpl;
import org.hibernate.validator.spi.scripting.ScriptEvaluator;
import org.hibernate.validator.spi.scripting.ScriptEvaluatorFactory;
import org.hibernate.validator.spi.scripting.ScriptEvaluatorNotFoundException;
Expand Down Expand Up @@ -58,8 +57,7 @@ public interface HibernateConstraintValidatorInitializationContext {
Duration getTemporalValidationTolerance();

/**
* Returns an instance of the specified type set by the user via {@link ValidatorImpl#withConstraintValidatorDynamicPayload(Object)}
* or {@code null} if no constraint validator payload of the given type has been set.
* Returns an instance of the specified type set by the user or {@code null} if no constraint validator payload of the given type has been set.
*
* @param type The type of payload to retrieve
* @return an instance of the specified type or null if no payload has been set
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -711,6 +711,8 @@ static class ValidatorScopedContext {
*/
private final boolean traversableResolverResultCacheEnabled;

private final Object dynamicPayload;

ValidatorScopedContext(ValidatorFactoryScopedContext validatorFactoryScopedContext) {
this.messageInterpolator = validatorFactoryScopedContext.getMessageInterpolator();
this.parameterNameProvider = validatorFactoryScopedContext.getParameterNameProvider();
Expand All @@ -719,6 +721,7 @@ static class ValidatorScopedContext {
this.scriptEvaluatorFactory = validatorFactoryScopedContext.getScriptEvaluatorFactory();
this.failFast = validatorFactoryScopedContext.isFailFast();
this.traversableResolverResultCacheEnabled = validatorFactoryScopedContext.isTraversableResolverResultCacheEnabled();
this.dynamicPayload = validatorFactoryScopedContext.getDynamicPayload();
}

public MessageInterpolator getMessageInterpolator() {
Expand Down Expand Up @@ -748,6 +751,10 @@ public boolean isFailFast() {
public boolean isTraversableResolverResultCacheEnabled() {
return this.traversableResolverResultCacheEnabled;
}

public Object getDynamicPayload() {
return this.dynamicPayload;
}
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,12 @@ public HibernateValidatorContext temporalValidationTolerance(Duration temporalVa
return this;
}

@Override
public HibernateValidatorContext dynamicPayload(Object dynamicPayload) {
validatorFactoryContextBuilder.setDynamicPayload( dynamicPayload );
return this;
}

@Override
public Validator getValidator() {
return validatorFactory.createValidator(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -183,7 +183,8 @@ public ValidatorFactoryImpl(ConfigurationState configurationState) {
getTemporalValidationTolerance( configurationState, properties ),
getScriptEvaluatorFactory( configurationState, properties, externalClassLoader ),
getFailFast( hibernateSpecificConfig, properties ),
getTraversableResolverResultCacheEnabled( hibernateSpecificConfig, properties )
getTraversableResolverResultCacheEnabled( hibernateSpecificConfig, properties ),
null
);

if ( LOG.isDebugEnabled() ) {
Expand Down Expand Up @@ -669,8 +670,10 @@ static class ValidatorFactoryScopedContext {
*/
private final boolean traversableResolverResultCacheEnabled;

private final Object dynamicPayload;

private ValidatorFactoryScopedContext(MessageInterpolator messageInterpolator, TraversableResolver traversableResolver, ExecutableParameterNameProvider parameterNameProvider, ClockProvider clockProvider, Duration temporalValidationTolerance,
ScriptEvaluatorFactory scriptEvaluatorFactory, boolean failFast, boolean traversableResolverResultCacheEnabled) {
ScriptEvaluatorFactory scriptEvaluatorFactory, boolean failFast, boolean traversableResolverResultCacheEnabled, Object dynamicPayload) {
this.messageInterpolator = messageInterpolator;
this.traversableResolver = traversableResolver;
this.parameterNameProvider = parameterNameProvider;
Expand All @@ -679,6 +682,7 @@ private ValidatorFactoryScopedContext(MessageInterpolator messageInterpolator, T
this.scriptEvaluatorFactory = scriptEvaluatorFactory;
this.failFast = failFast;
this.traversableResolverResultCacheEnabled = traversableResolverResultCacheEnabled;
this.dynamicPayload = dynamicPayload;
}

public MessageInterpolator getMessageInterpolator() {
Expand Down Expand Up @@ -713,6 +717,10 @@ public boolean isTraversableResolverResultCacheEnabled() {
return this.traversableResolverResultCacheEnabled;
}

public Object getDynamicPayload() {
return this.dynamicPayload;
}

static class Builder {
private final ValidatorFactoryScopedContext defaultContext;

Expand All @@ -724,9 +732,10 @@ static class Builder {
private Duration temporalValidationTolerance;
private boolean failFast;
private boolean traversableResolverResultCacheEnabled;
private Object dynamicPayload;

Builder(ValidatorFactoryScopedContext defaultContext) {
this.defaultContext = defaultContext != null ? defaultContext : new ValidatorFactoryScopedContext( null, null, null, null, null, null, false, false );
this.defaultContext = defaultContext != null ? defaultContext : new ValidatorFactoryScopedContext( null, null, null, null, null, null, false, false, null );

this.messageInterpolator = defaultContext.messageInterpolator;
this.traversableResolver = defaultContext.traversableResolver;
Expand All @@ -736,6 +745,7 @@ static class Builder {
this.temporalValidationTolerance = defaultContext.temporalValidationTolerance;
this.failFast = defaultContext.failFast;
this.traversableResolverResultCacheEnabled = defaultContext.traversableResolverResultCacheEnabled;
this.dynamicPayload = defaultContext.dynamicPayload;
}

public Builder setMessageInterpolator(MessageInterpolator messageInterpolator) {
Expand Down Expand Up @@ -804,6 +814,16 @@ public Builder setTraversableResolverResultCacheEnabled(boolean traversableResol
return this;
}

public Builder setDynamicPayload(Object dynamicPayload) {
if ( scriptEvaluatorFactory == null ) {
this.dynamicPayload = defaultContext.dynamicPayload;
}
else {
this.dynamicPayload = dynamicPayload;
}
return this;
}

public ValidatorFactoryScopedContext build() {
return new ValidatorFactoryScopedContext(
messageInterpolator,
Expand All @@ -813,7 +833,8 @@ public ValidatorFactoryScopedContext build() {
temporalValidationTolerance,
scriptEvaluatorFactory,
failFast,
traversableResolverResultCacheEnabled
traversableResolverResultCacheEnabled,
dynamicPayload
);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@ public class ValidatorImpl implements Validator, ExecutableValidator {
* The constraint initialization context is stored at this level to prevent creating a new instance each time we
* initialize a new constraint validator as, for now, it only contains Validator scoped objects.
*/
private HibernateConstraintValidatorInitializationContext constraintValidatorInitializationContext;
private final HibernateConstraintValidatorInitializationContext constraintValidatorInitializationContext;

public ValidatorImpl(ConstraintValidatorFactory constraintValidatorFactory,
BeanMetaDataManager beanMetaDataManager,
Expand All @@ -148,15 +148,6 @@ public ValidatorImpl(ConstraintValidatorFactory constraintValidatorFactory,
this.constraintValidatorInitializationContext = new HibernateConstraintValidatorInitializationContextImpl( validatorScopedContext.getScriptEvaluatorFactory(), validatorScopedContext.getClockProvider(), validatorScopedContext.getTemporalValidationTolerance(), null );
}

public ValidatorImpl withConstraintValidatorDynamicPayload(Object dynamicPayload) {
this.constraintValidatorInitializationContext = new HibernateConstraintValidatorInitializationContextImpl(
this.validatorScopedContext.getScriptEvaluatorFactory(),
this.constraintValidatorInitializationContext.getClockProvider(),
this.constraintValidatorInitializationContext.getTemporalValidationTolerance(),
dynamicPayload );
return this;
}

@Override
public final <T> Set<ConstraintViolation<T>> validate(T object, Class<?>... groups) {
Contracts.assertNotNull( object, MESSAGES.validatedObjectMustNotBeNull() );
Expand Down

0 comments on commit aaf7b8a

Please sign in to comment.