Skip to content

Commit aac76a9

Browse files
committed
HV-1595 Move ConstraintValidatorPayload to ConstraintValidatorContext
1 parent 57126ce commit aac76a9

File tree

15 files changed

+68
-87
lines changed

15 files changed

+68
-87
lines changed

documentation/src/main/asciidoc/ch06.asciidoc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ The `initialize()` method of `HibernateConstraintValidator` takes two parameters
189189
* The `ConstraintDescriptor` of the constraint at hand.
190190
You can get access to the annotation using `ConstraintDescriptor#getAnnotation()`.
191191
* The `HibernateConstraintValidatorInitializationContext` which provides useful helpers and contextual
192-
information, such as the clock provider, the temporal validation tolerance or the constraint validator payload.
192+
information, such as the clock provider or the temporal validation tolerance.
193193

194194
This extension is marked as incubating so it might be subject to change.
195195
The plan is to standardize it and to include it in Bean Validation in the future.
@@ -221,7 +221,7 @@ Another requirement could be to have different behaviors on specific environment
221221
access to some external production resources necessary for the correct functioning of a validator.
222222

223223
The notion of constraint validator payload was introduced for all these use cases.
224-
It is an object passed from the `Validator` instance to each constraint validator via the `HibernateConstraintValidatorInitializationContext`.
224+
It is an object passed from the `Validator` instance to each constraint validator via the `HibernateConstraintValidatorContext`.
225225

226226
The example below shows how to set a constraint validator payload during the `ValidatorFactory` initialization.
227227
Unless you override this default value, all the ``Validator``s created by this `ValidatorFactory` will have this
@@ -258,7 +258,7 @@ include::{sourcedir}/org/hibernate/validator/referenceguide/chapter06/constraint
258258
----
259259
====
260260

261-
`HibernateConstraintValidatorInitializationContext#getConstraintValidatorPayload()` has a type parameter
261+
`HibernateConstraintValidatorContext#getConstraintValidatorPayload()` has a type parameter
262262
and returns the payload only if the payload is of the given type.
263263

264264
[NOTE]

documentation/src/test/java/org/hibernate/validator/referenceguide/chapter06/constraintvalidatorpayload/ZipCodeValidator.java

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,23 +4,15 @@
44
//end::include[]
55

66
import javax.validation.ConstraintValidatorContext;
7-
import javax.validation.metadata.ConstraintDescriptor;
7+
import javax.validation.ConstraintValidator;
88

9-
import org.hibernate.validator.constraintvalidation.HibernateConstraintValidator;
10-
import org.hibernate.validator.constraintvalidation.HibernateConstraintValidatorInitializationContext;
9+
import org.hibernate.validator.constraintvalidation.HibernateConstraintValidatorContext;
1110

1211
//tag::include[]
13-
public class ZipCodeValidator implements HibernateConstraintValidator<ZipCode, String> {
12+
public class ZipCodeValidator implements ConstraintValidator<ZipCode, String> {
1413

1514
public String countryCode;
1615

17-
@Override
18-
public void initialize(ConstraintDescriptor<ZipCode> constraintDescriptor,
19-
HibernateConstraintValidatorInitializationContext initializationContext) {
20-
this.countryCode = initializationContext
21-
.getConstraintValidatorPayload( String.class );
22-
}
23-
2416
@Override
2517
public boolean isValid(String object, ConstraintValidatorContext constraintContext) {
2618
if ( object == null ) {
@@ -29,6 +21,9 @@ public boolean isValid(String object, ConstraintValidatorContext constraintConte
2921

3022
boolean isValid = false;
3123

24+
String countryCode = constraintContext.unwrap( HibernateConstraintValidatorContext.class )
25+
.getConstraintValidatorPayload( String.class );
26+
3227
if ( "US".equals( countryCode ) ) {
3328
// checks specific to the United States
3429
}

engine/src/main/java/org/hibernate/validator/constraintvalidation/HibernateConstraintValidatorContext.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@
88

99
import javax.validation.ConstraintValidatorContext;
1010

11+
import org.hibernate.validator.HibernateValidatorConfiguration;
12+
import org.hibernate.validator.Incubating;
13+
1114
/**
1215
* A custom {@link ConstraintValidatorContext} which allows to set additional message parameters for
1316
* interpolation.
@@ -107,4 +110,18 @@ public interface HibernateConstraintValidatorContext extends ConstraintValidator
107110
*/
108111
HibernateConstraintValidatorContext withDynamicPayload(Object payload);
109112

113+
/**
114+
* Returns an instance of the specified type or {@code null} if the current constraint validator payload isn't of
115+
* the given type.
116+
*
117+
* @param type the type of payload to retrieve
118+
* @return an instance of the specified type or {@code null} if the current constraint validator payload isn't of
119+
* the given type
120+
*
121+
* @since 6.0.9
122+
* @see HibernateValidatorConfiguration#constraintValidatorPayload(Object)
123+
*/
124+
@Incubating
125+
<C> C getConstraintValidatorPayload(Class<C> type);
126+
110127
}

engine/src/main/java/org/hibernate/validator/constraintvalidation/HibernateConstraintValidatorInitializationContext.java

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111

1212
import javax.validation.ClockProvider;
1313

14-
import org.hibernate.validator.HibernateValidatorConfiguration;
1514
import org.hibernate.validator.Incubating;
1615
import org.hibernate.validator.spi.scripting.ScriptEvaluator;
1716
import org.hibernate.validator.spi.scripting.ScriptEvaluatorFactory;
@@ -56,17 +55,4 @@ public interface HibernateConstraintValidatorInitializationContext {
5655
* @return the tolerance
5756
*/
5857
Duration getTemporalValidationTolerance();
59-
60-
/**
61-
* Returns an instance of the specified type or {@code null} if the current constraint validator payload isn't of
62-
* the given type.
63-
*
64-
* @param type the type of payload to retrieve
65-
* @return an instance of the specified type or {@code null} if the current constraint validator payload isn't of
66-
* the given type
67-
*
68-
* @since 6.0.8
69-
* @see HibernateValidatorConfiguration#constraintValidatorPayload(Object)
70-
*/
71-
<C> C getConstraintValidatorPayload(Class<C> type);
7258
}

engine/src/main/java/org/hibernate/validator/internal/engine/ValidationContext.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,10 @@ public ClockProvider getClockProvider() {
264264
return validatorScopedContext.getClockProvider();
265265
}
266266

267+
public Object getConstraintValidatorPayload() {
268+
return validatorScopedContext.getConstraintValidatorPayload();
269+
}
270+
267271
public HibernateConstraintValidatorInitializationContext getConstraintValidatorInitializationContext() {
268272
return constraintValidatorInitializationContext;
269273
}

engine/src/main/java/org/hibernate/validator/internal/engine/ValidatorFactoryImpl.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -729,7 +729,7 @@ private ValidatorFactoryScopedContext(MessageInterpolator messageInterpolator,
729729
this( messageInterpolator, traversableResolver, parameterNameProvider, clockProvider, temporalValidationTolerance, scriptEvaluatorFactory, failFast,
730730
traversableResolverResultCacheEnabled, constraintValidatorPayload,
731731
new HibernateConstraintValidatorInitializationContextImpl( scriptEvaluatorFactory, clockProvider,
732-
temporalValidationTolerance, constraintValidatorPayload ) );
732+
temporalValidationTolerance ) );
733733
}
734734

735735
private ValidatorFactoryScopedContext(MessageInterpolator messageInterpolator,
@@ -915,8 +915,7 @@ public ValidatorFactoryScopedContext build() {
915915
constraintValidatorInitializationContext,
916916
scriptEvaluatorFactory,
917917
clockProvider,
918-
temporalValidationTolerance,
919-
constraintValidatorPayload
918+
temporalValidationTolerance
920919
)
921920
);
922921
}

engine/src/main/java/org/hibernate/validator/internal/engine/constraintvalidation/ComposingConstraintTree.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,8 @@ protected <T> void validateConstraints(ValidationContext<T> validationContext,
9393
validationContext.getParameterNames(),
9494
validationContext.getClockProvider(),
9595
valueContext.getPropertyPath(),
96-
descriptor
96+
descriptor,
97+
validationContext.getConstraintValidatorPayload()
9798
);
9899

99100
// validate

engine/src/main/java/org/hibernate/validator/internal/engine/constraintvalidation/ConstraintValidatorContextImpl.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,13 +52,15 @@ public class ConstraintValidatorContextImpl implements HibernateConstraintValida
5252
private List<ConstraintViolationCreationContext> constraintViolationCreationContexts;
5353
private boolean defaultDisabled;
5454
private Object dynamicPayload;
55+
private final Object constraintValidatorPayload;
5556

5657
public ConstraintValidatorContextImpl(List<String> methodParameterNames, ClockProvider clockProvider,
57-
PathImpl propertyPath, ConstraintDescriptor<?> constraintDescriptor) {
58+
PathImpl propertyPath, ConstraintDescriptor<?> constraintDescriptor, Object constraintValidatorPayload) {
5859
this.methodParameterNames = methodParameterNames;
5960
this.clockProvider = clockProvider;
6061
this.basePath = propertyPath;
6162
this.constraintDescriptor = constraintDescriptor;
63+
this.constraintValidatorPayload = constraintValidatorPayload;
6264
}
6365

6466
@Override
@@ -124,6 +126,16 @@ public HibernateConstraintValidatorContext withDynamicPayload(Object violationCo
124126
return this;
125127
}
126128

129+
@Override
130+
public <C> C getConstraintValidatorPayload(Class<C> type) {
131+
if ( constraintValidatorPayload != null && type.isAssignableFrom( constraintValidatorPayload.getClass() ) ) {
132+
return type.cast( constraintValidatorPayload );
133+
}
134+
else {
135+
return null;
136+
}
137+
}
138+
127139
public final ConstraintDescriptor<?> getConstraintDescriptor() {
128140
return constraintDescriptor;
129141
}

engine/src/main/java/org/hibernate/validator/internal/engine/constraintvalidation/HibernateConstraintValidatorInitializationContextImpl.java

Lines changed: 4 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -25,30 +25,24 @@ public class HibernateConstraintValidatorInitializationContextImpl implements Hi
2525

2626
private final Duration temporalValidationTolerance;
2727

28-
private final Object constraintValidatorPayload;
29-
3028
private final int hashCode;
3129

3230
public HibernateConstraintValidatorInitializationContextImpl(ScriptEvaluatorFactory scriptEvaluatorFactory, ClockProvider clockProvider,
33-
Duration temporalValidationTolerance, Object constraintValidatorPayload) {
31+
Duration temporalValidationTolerance) {
3432
this.scriptEvaluatorFactory = scriptEvaluatorFactory;
3533
this.clockProvider = clockProvider;
3634
this.temporalValidationTolerance = temporalValidationTolerance;
37-
this.constraintValidatorPayload = constraintValidatorPayload;
3835
this.hashCode = createHashCode();
3936
}
4037

4138
public static HibernateConstraintValidatorInitializationContextImpl of(HibernateConstraintValidatorInitializationContextImpl defaultContext,
42-
ScriptEvaluatorFactory scriptEvaluatorFactory, ClockProvider clockProvider, Duration temporalValidationTolerance,
43-
Object constraintValidatorPayload) {
39+
ScriptEvaluatorFactory scriptEvaluatorFactory, ClockProvider clockProvider, Duration temporalValidationTolerance) {
4440
if ( scriptEvaluatorFactory == defaultContext.scriptEvaluatorFactory && clockProvider == defaultContext.clockProvider
45-
&& temporalValidationTolerance.equals( defaultContext.temporalValidationTolerance )
46-
&& constraintValidatorPayload == defaultContext.constraintValidatorPayload ) {
41+
&& temporalValidationTolerance.equals( defaultContext.temporalValidationTolerance ) ) {
4742
return defaultContext;
4843
}
4944

50-
return new HibernateConstraintValidatorInitializationContextImpl( scriptEvaluatorFactory, clockProvider, temporalValidationTolerance,
51-
constraintValidatorPayload );
45+
return new HibernateConstraintValidatorInitializationContextImpl( scriptEvaluatorFactory, clockProvider, temporalValidationTolerance );
5246
}
5347

5448
@Override
@@ -66,16 +60,6 @@ public Duration getTemporalValidationTolerance() {
6660
return temporalValidationTolerance;
6761
}
6862

69-
@Override
70-
public <C> C getConstraintValidatorPayload(Class<C> type) {
71-
if ( constraintValidatorPayload != null && type.isAssignableFrom( constraintValidatorPayload.getClass() ) ) {
72-
return type.cast( constraintValidatorPayload );
73-
}
74-
else {
75-
return null;
76-
}
77-
}
78-
7963
@Override
8064
public boolean equals(Object o) {
8165
if ( this == o ) {
@@ -96,9 +80,6 @@ public boolean equals(Object o) {
9680
if ( !temporalValidationTolerance.equals( hibernateConstraintValidatorInitializationContextImpl.temporalValidationTolerance ) ) {
9781
return false;
9882
}
99-
if ( constraintValidatorPayload != hibernateConstraintValidatorInitializationContextImpl.constraintValidatorPayload ) {
100-
return false;
101-
}
10283
return true;
10384
}
10485

@@ -111,7 +92,6 @@ private int createHashCode() {
11192
int result = System.identityHashCode( scriptEvaluatorFactory );
11293
result = 31 * result + System.identityHashCode( clockProvider );
11394
result = 31 * result + temporalValidationTolerance.hashCode();
114-
result = 31 * result + System.identityHashCode( constraintValidatorPayload );
11595
return result;
11696
}
11797
}

engine/src/main/java/org/hibernate/validator/internal/engine/constraintvalidation/SimpleConstraintTree.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,8 @@ protected <T> void validateConstraints(ValidationContext<T> validationContext,
5959
validationContext.getParameterNames(),
6060
validationContext.getClockProvider(),
6161
valueContext.getPropertyPath(),
62-
descriptor
62+
descriptor,
63+
validationContext.getConstraintValidatorPayload()
6364
);
6465

6566
// validate

0 commit comments

Comments
 (0)