Skip to content

Commit 2e06264

Browse files
marko-bekhtagsmet
authored andcommitted
HV-1526 Split ValidationContext into two parts
As the methods used in ConstraintTree could be potentially reused for other kinds of validation contexts e.g. property holder contexts that won't have bean metadata related methods, we can separate these concerns and split the interface into two.
1 parent 7af799e commit 2e06264

File tree

9 files changed

+108
-70
lines changed

9 files changed

+108
-70
lines changed

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

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,8 @@
4545
import org.hibernate.validator.internal.engine.path.NodeImpl;
4646
import org.hibernate.validator.internal.engine.path.PathImpl;
4747
import org.hibernate.validator.internal.engine.resolver.TraversableResolvers;
48+
import org.hibernate.validator.internal.engine.validationcontext.BaseBeanValidationContext;
4849
import org.hibernate.validator.internal.engine.validationcontext.ExecutableValidationContext;
49-
import org.hibernate.validator.internal.engine.validationcontext.ValidationContext;
5050
import org.hibernate.validator.internal.engine.validationcontext.ValidationContextBuilder;
5151
import org.hibernate.validator.internal.engine.validationcontext.ValidatorScopedContext;
5252
import org.hibernate.validator.internal.engine.valueextraction.ValueExtractorDescriptor;
@@ -149,7 +149,7 @@ public final <T> Set<ConstraintViolation<T>> validate(T object, Class<?>... grou
149149
Contracts.assertNotNull( object, MESSAGES.validatedObjectMustNotBeNull() );
150150
sanityCheckGroups( groups );
151151

152-
ValidationContext<T> validationContext = getValidationContextBuilder().forValidate( object );
152+
BaseBeanValidationContext<T> validationContext = getValidationContextBuilder().forValidate( object );
153153

154154
if ( !validationContext.getRootBeanMetaData().hasConstraints() ) {
155155
return Collections.emptySet();
@@ -173,7 +173,7 @@ public final <T> Set<ConstraintViolation<T>> validateProperty(T object, String p
173173
sanityCheckGroups( groups );
174174

175175
PathImpl propertyPath = PathImpl.createPathFromString( propertyName );
176-
ValidationContext<T> validationContext = getValidationContextBuilder().forValidateProperty( object, propertyPath );
176+
BaseBeanValidationContext<T> validationContext = getValidationContextBuilder().forValidateProperty( object, propertyPath );
177177

178178
if ( !validationContext.getRootBeanMetaData().hasConstraints() ) {
179179
return Collections.emptySet();
@@ -197,7 +197,7 @@ public final <T> Set<ConstraintViolation<T>> validateValue(Class<T> beanType, St
197197
sanityCheckGroups( groups );
198198

199199
PathImpl propertyPath = PathImpl.createPathFromString( propertyName );
200-
ValidationContext<T> validationContext = getValidationContextBuilder().forValidateValue( beanType, propertyPath );
200+
BaseBeanValidationContext<T> validationContext = getValidationContextBuilder().forValidateValue( beanType, propertyPath );
201201

202202
if ( !validationContext.getRootBeanMetaData().hasConstraints() ) {
203203
return Collections.emptySet();
@@ -357,7 +357,7 @@ private ValidationOrder determineGroupValidationOrder(Class<?>[] groups) {
357357
*
358358
* @return Set of constraint violations or the empty set if there were no violations.
359359
*/
360-
private <T, U> Set<ConstraintViolation<T>> validateInContext(ValidationContext<T> validationContext, ValueContext<U, Object> valueContext,
360+
private <T, U> Set<ConstraintViolation<T>> validateInContext(BaseBeanValidationContext<T> validationContext, ValueContext<U, Object> valueContext,
361361
ValidationOrder validationOrder) {
362362
if ( valueContext.getCurrentBean() == null ) {
363363
return Collections.emptySet();
@@ -417,7 +417,7 @@ private <T, U> Set<ConstraintViolation<T>> validateInContext(ValidationContext<T
417417
return validationContext.getFailingConstraints();
418418
}
419419

420-
private void validateConstraintsForCurrentGroup(ValidationContext<?> validationContext, ValueContext<?, Object> valueContext) {
420+
private void validateConstraintsForCurrentGroup(BaseBeanValidationContext<?> validationContext, ValueContext<?, Object> valueContext) {
421421
// we are not validating the default group there is nothing special to consider. If we are validating the default
422422
// group sequence we have to consider that a class in the hierarchy could redefine the default group sequence.
423423
if ( !valueContext.validatingDefault() ) {
@@ -428,7 +428,7 @@ private void validateConstraintsForCurrentGroup(ValidationContext<?> validationC
428428
}
429429
}
430430

431-
private <U> void validateConstraintsForDefaultGroup(ValidationContext<?> validationContext, ValueContext<U, Object> valueContext) {
431+
private <U> void validateConstraintsForDefaultGroup(BaseBeanValidationContext<?> validationContext, ValueContext<U, Object> valueContext) {
432432
final BeanMetaData<U> beanMetaData = valueContext.getCurrentBeanMetaData();
433433
final Map<Class<?>, Class<?>> validatedInterfaces = new HashMap<>();
434434

@@ -472,7 +472,7 @@ private <U> void validateConstraintsForDefaultGroup(ValidationContext<?> validat
472472
}
473473
}
474474

475-
private <U> boolean validateConstraintsForSingleDefaultGroupElement(ValidationContext<?> validationContext, ValueContext<U, Object> valueContext, final Map<Class<?>, Class<?>> validatedInterfaces,
475+
private <U> boolean validateConstraintsForSingleDefaultGroupElement(BaseBeanValidationContext<?> validationContext, ValueContext<U, Object> valueContext, final Map<Class<?>, Class<?>> validatedInterfaces,
476476
Class<? super U> clazz, Set<MetaConstraint<?>> metaConstraints, Group defaultSequenceMember) {
477477
boolean validationSuccessful = true;
478478

@@ -500,12 +500,12 @@ private <U> boolean validateConstraintsForSingleDefaultGroupElement(ValidationCo
500500
return validationSuccessful;
501501
}
502502

503-
private void validateConstraintsForNonDefaultGroup(ValidationContext<?> validationContext, ValueContext<?, Object> valueContext) {
503+
private void validateConstraintsForNonDefaultGroup(BaseBeanValidationContext<?> validationContext, ValueContext<?, Object> valueContext) {
504504
validateMetaConstraints( validationContext, valueContext, valueContext.getCurrentBean(), valueContext.getCurrentBeanMetaData().getMetaConstraints() );
505505
validationContext.markCurrentBeanAsProcessed( valueContext );
506506
}
507507

508-
private void validateMetaConstraints(ValidationContext<?> validationContext, ValueContext<?, Object> valueContext, Object parent,
508+
private void validateMetaConstraints(BaseBeanValidationContext<?> validationContext, ValueContext<?, Object> valueContext, Object parent,
509509
Iterable<MetaConstraint<?>> constraints) {
510510

511511
for ( MetaConstraint<?> metaConstraint : constraints ) {
@@ -516,7 +516,7 @@ private void validateMetaConstraints(ValidationContext<?> validationContext, Val
516516
}
517517
}
518518

519-
private boolean validateMetaConstraint(ValidationContext<?> validationContext, ValueContext<?, Object> valueContext, Object parent, MetaConstraint<?> metaConstraint) {
519+
private boolean validateMetaConstraint(BaseBeanValidationContext<?> validationContext, ValueContext<?, Object> valueContext, Object parent, MetaConstraint<?> metaConstraint) {
520520
ValueContext.ValueState<Object> originalValueState = valueContext.getCurrentValueState();
521521
valueContext.appendNode( metaConstraint.getLocation() );
522522
boolean success = true;
@@ -545,7 +545,7 @@ private boolean validateMetaConstraint(ValidationContext<?> validationContext, V
545545
* @param validationContext The execution context
546546
* @param valueContext Collected information for single validation
547547
*/
548-
private void validateCascadedConstraints(ValidationContext<?> validationContext, ValueContext<?, Object> valueContext) {
548+
private void validateCascadedConstraints(BaseBeanValidationContext<?> validationContext, ValueContext<?, Object> valueContext) {
549549
Validatable validatable = valueContext.getCurrentValidatable();
550550
ValueContext.ValueState<Object> originalValueState = valueContext.getCurrentValueState();
551551

@@ -582,7 +582,7 @@ private void validateCascadedConstraints(ValidationContext<?> validationContext,
582582
}
583583
}
584584

585-
private void validateCascadedAnnotatedObjectForCurrentGroup(Object value, ValidationContext<?> validationContext, ValueContext<?, Object> valueContext,
585+
private void validateCascadedAnnotatedObjectForCurrentGroup(Object value, BaseBeanValidationContext<?> validationContext, ValueContext<?, Object> valueContext,
586586
CascadingMetaData cascadingMetaData) {
587587
if ( validationContext.isBeanAlreadyValidated( value, valueContext.getCurrentGroup(), valueContext.getPropertyPath() ) ||
588588
shouldFailFast( validationContext ) ) {
@@ -602,7 +602,7 @@ private void validateCascadedAnnotatedObjectForCurrentGroup(Object value, Valida
602602
validateInContext( validationContext, cascadedValueContext, validationOrder );
603603
}
604604

605-
private void validateCascadedContainerElementsForCurrentGroup(Object value, ValidationContext<?> validationContext, ValueContext<?, ?> valueContext,
605+
private void validateCascadedContainerElementsForCurrentGroup(Object value, BaseBeanValidationContext<?> validationContext, ValueContext<?, ?> valueContext,
606606
List<ContainerCascadingMetaData> containerElementTypesCascadingMetaData) {
607607
for ( ContainerCascadingMetaData cascadingMetaData : containerElementTypesCascadingMetaData ) {
608608
if ( !cascadingMetaData.isMarkedForCascadingOnAnnotatedObjectOrContainerElements() ) {
@@ -627,11 +627,11 @@ private void validateCascadedContainerElementsForCurrentGroup(Object value, Vali
627627

628628
private class CascadingValueReceiver implements ValueExtractor.ValueReceiver {
629629

630-
private final ValidationContext<?> validationContext;
630+
private final BaseBeanValidationContext<?> validationContext;
631631
private final ValueContext<?, ?> valueContext;
632632
private final ContainerCascadingMetaData cascadingMetaData;
633633

634-
public CascadingValueReceiver(ValidationContext<?> validationContext, ValueContext<?, ?> valueContext, ContainerCascadingMetaData cascadingMetaData) {
634+
public CascadingValueReceiver(BaseBeanValidationContext<?> validationContext, ValueContext<?, ?> valueContext, ContainerCascadingMetaData cascadingMetaData) {
635635
this.validationContext = validationContext;
636636
this.valueContext = valueContext;
637637
this.cascadingMetaData = cascadingMetaData;
@@ -702,7 +702,7 @@ private void doValidate(Object value, String nodeName) {
702702
}
703703
}
704704

705-
private void validateCascadedContainerElementsInContext(Object value, ValidationContext<?> validationContext, ValueContext<?, ?> valueContext,
705+
private void validateCascadedContainerElementsInContext(Object value, BaseBeanValidationContext<?> validationContext, ValueContext<?, ?> valueContext,
706706
ContainerCascadingMetaData cascadingMetaData, ValidationOrder validationOrder) {
707707
Iterator<Group> groupIterator = validationOrder.getGroupIterator();
708708
while ( groupIterator.hasNext() ) {
@@ -760,7 +760,7 @@ private ValueContext<?, Object> buildNewLocalExecutionContext(ValueContext<?, ?>
760760
return newValueContext;
761761
}
762762

763-
private <T> Set<ConstraintViolation<T>> validateValueInContext(ValidationContext<T> validationContext, Object value, PathImpl propertyPath,
763+
private <T> Set<ConstraintViolation<T>> validateValueInContext(BaseBeanValidationContext<T> validationContext, Object value, PathImpl propertyPath,
764764
ValidationOrder validationOrder) {
765765
ValueContext<?, Object> valueContext = getValueContextForValueValidation( validationContext.getRootBeanClass(), propertyPath );
766766
valueContext.setCurrentValidatedValue( value );
@@ -1080,7 +1080,7 @@ private <V, T> void validateReturnValueInContext(ExecutableValidationContext<T>
10801080
}
10811081

10821082
//TODO GM: if possible integrate with validateParameterForGroup()
1083-
private <T> void validateReturnValueForGroup(ValidationContext<T> validationContext, ExecutableMetaData executableMetaData, T bean, Object value,
1083+
private <T> void validateReturnValueForGroup(BaseBeanValidationContext<T> validationContext, ExecutableMetaData executableMetaData, T bean, Object value,
10841084
Group group) {
10851085
Contracts.assertNotNull( executableMetaData, "executableMetaData may not be null" );
10861086

@@ -1118,7 +1118,7 @@ private <T> void validateReturnValueForGroup(ValidationContext<T> validationCont
11181118
}
11191119
}
11201120

1121-
private <T> void validateReturnValueForSingleGroup(ValidationContext<T> validationContext, ExecutableMetaData executableMetaData, T bean, Object value, Class<?> oneGroup) {
1121+
private <T> void validateReturnValueForSingleGroup(BaseBeanValidationContext<T> validationContext, ExecutableMetaData executableMetaData, T bean, Object value, Class<?> oneGroup) {
11221122
// validate constraints at return value itself
11231123
ValueContext<?, Object> valueContext = getExecutableValueContext(
11241124
executableMetaData.getKind() == ElementKind.CONSTRUCTOR ? value : bean,
@@ -1142,7 +1142,7 @@ private <T> void validateReturnValueForSingleGroup(ValidationContext<T> validati
11421142
* @return Returns an instance of {@code ValueContext} which describes the local validation context associated to
11431143
* the given property path.
11441144
*/
1145-
private <V> ValueContext<?, V> getValueContextForPropertyValidation(ValidationContext<?> validationContext, PathImpl propertyPath) {
1145+
private <V> ValueContext<?, V> getValueContextForPropertyValidation(BaseBeanValidationContext<?> validationContext, PathImpl propertyPath) {
11461146
Class<?> clazz = validationContext.getRootBeanClass();
11471147
BeanMetaData<?> beanMetaData = validationContext.getRootBeanMetaData();
11481148
Object value = validationContext.getRootBean();
@@ -1259,7 +1259,7 @@ private <V> ValueContext<?, V> getValueContextForValueValidation(Class<?> rootBe
12591259
return ValueContext.getLocalExecutionContext( validatorScopedContext.getParameterNameProvider(), clazz, beanMetaData, propertyPath );
12601260
}
12611261

1262-
private boolean isValidationRequired(ValidationContext<?> validationContext,
1262+
private boolean isValidationRequired(BaseBeanValidationContext<?> validationContext,
12631263
ValueContext<?, ?> valueContext,
12641264
MetaConstraint<?> metaConstraint) {
12651265
// check if this validation context is qualified to validate the current meta constraint.
@@ -1287,7 +1287,7 @@ private boolean isValidationRequired(ValidationContext<?> validationContext,
12871287
);
12881288
}
12891289

1290-
private boolean isReachable(ValidationContext<?> validationContext, Object traversableObject, PathImpl path, ElementType type) {
1290+
private boolean isReachable(BaseBeanValidationContext<?> validationContext, Object traversableObject, PathImpl path, ElementType type) {
12911291
if ( needToCallTraversableResolver( path, type ) ) {
12921292
return true;
12931293
}
@@ -1318,7 +1318,7 @@ private boolean needToCallTraversableResolver(PathImpl path, ElementType type) {
13181318
|| isReturnValueValidation( path );
13191319
}
13201320

1321-
private boolean isCascadeRequired(ValidationContext<?> validationContext, Object traversableObject, PathImpl path, ElementType type) {
1321+
private boolean isCascadeRequired(BaseBeanValidationContext<?> validationContext, Object traversableObject, PathImpl path, ElementType type) {
13221322
if ( needToCallTraversableResolver( path, type ) ) {
13231323
return true;
13241324
}
@@ -1359,7 +1359,7 @@ private boolean isReturnValueValidation(PathImpl path) {
13591359
return path.getLeafNode().getKind() == ElementKind.RETURN_VALUE;
13601360
}
13611361

1362-
private boolean shouldFailFast(ValidationContext<?> validationContext) {
1362+
private boolean shouldFailFast(BaseBeanValidationContext<?> validationContext) {
13631363
return validationContext.isFailFastModeEnabled() && !validationContext.getFailingConstraints().isEmpty();
13641364
}
13651365

@@ -1371,7 +1371,7 @@ private PropertyMetaData getBeanPropertyMetaData(BeanMetaData<?> beanMetaData, P
13711371
return beanMetaData.getMetaDataFor( propertyNode.getName() );
13721372
}
13731373

1374-
private Object getCascadableValue(ValidationContext<?> validationContext, Object object, Cascadable cascadable) {
1374+
private Object getCascadableValue(BaseBeanValidationContext<?> validationContext, Object object, Cascadable cascadable) {
13751375
return cascadable.getValue( object );
13761376
}
13771377
}

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

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ private <U extends Annotation> ConstraintTree<U> createConstraintTree(Constraint
6464
}
6565

6666
@Override
67-
protected <T> void validateConstraints(ValidationContext<T> validationContext,
67+
protected void validateConstraints(ValidationContext<?> validationContext,
6868
ValueContext<?, ?> valueContext,
6969
Collection<ConstraintValidatorContextImpl> violatedConstraintValidatorContexts) {
7070
CompositionResult compositionResult = validateComposingConstraints(
@@ -119,7 +119,7 @@ protected <T> void validateConstraints(ValidationContext<T> validationContext,
119119
}
120120
}
121121

122-
private <T> boolean mainConstraintNeedsEvaluation(ValidationContext<T> validationContext,
122+
private boolean mainConstraintNeedsEvaluation(ValidationContext<?> validationContext,
123123
Collection<ConstraintValidatorContextImpl> violatedConstraintValidatorContexts) {
124124
// we are dealing with a composing constraint with no validator for the main constraint
125125
if ( !descriptor.getComposingConstraints().isEmpty() && descriptor.getMatchingConstraintValidatorDescriptors().isEmpty() ) {
@@ -151,9 +151,8 @@ private <T> boolean mainConstraintNeedsEvaluation(ValidationContext<T> validatio
151151
* @param valueContext meta data for currently validated value
152152
* @param violatedConstraintValidatorContexts used to accumulate constraint validator contexts that cause constraint violations
153153
* @param localConstraintValidatorContext an optional of constraint violations of top level constraint
154-
*
155154
*/
156-
private <T> void prepareFinalConstraintViolations(ValidationContext<T> validationContext,
155+
private void prepareFinalConstraintViolations(ValidationContext<?> validationContext,
157156
ValueContext<?, ?> valueContext,
158157
Collection<ConstraintValidatorContextImpl> violatedConstraintValidatorContexts,
159158
Optional<ConstraintValidatorContextImpl> localConstraintValidatorContext) {
@@ -196,7 +195,7 @@ private <T> void prepareFinalConstraintViolations(ValidationContext<T> validatio
196195
*
197196
* @return Returns an instance of {@code CompositionResult} relevant for boolean composition of constraints
198197
*/
199-
private <T> CompositionResult validateComposingConstraints(ValidationContext<T> validationContext,
198+
private CompositionResult validateComposingConstraints(ValidationContext<?> validationContext,
200199
ValueContext<?, ?> valueContext,
201200
Collection<ConstraintValidatorContextImpl> violatedConstraintValidatorContexts) {
202201
CompositionResult compositionResult = new CompositionResult( true, false );

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ public static <U extends Annotation> ConstraintTree<U> of(ConstraintDescriptorIm
6868
}
6969
}
7070

71-
public final <T> boolean validateConstraints(ValidationContext<T> validationContext, ValueContext<?, ?> valueContext) {
71+
public final boolean validateConstraints(ValidationContext<?> validationContext, ValueContext<?, ?> valueContext) {
7272
List<ConstraintValidatorContextImpl> violatedConstraintValidatorContexts = new ArrayList( 5 );
7373
validateConstraints( validationContext, valueContext, violatedConstraintValidatorContexts );
7474
if ( !violatedConstraintValidatorContexts.isEmpty() ) {
@@ -84,7 +84,7 @@ public final <T> boolean validateConstraints(ValidationContext<T> validationCont
8484
return true;
8585
}
8686

87-
protected abstract <T> void validateConstraints(ValidationContext<T> executionContext, ValueContext<?, ?> valueContext, Collection<ConstraintValidatorContextImpl> violatedConstraintValidatorContexts);
87+
protected abstract void validateConstraints(ValidationContext<?> validationContext, ValueContext<?, ?> valueContext, Collection<ConstraintValidatorContextImpl> violatedConstraintValidatorContexts);
8888

8989
public final ConstraintDescriptorImpl<A> getDescriptor() {
9090
return descriptor;
@@ -115,7 +115,7 @@ private ValidationException getExceptionForNullValidator(Type validatedValueType
115115
}
116116
}
117117

118-
protected final <T> ConstraintValidator<A, ?> getInitializedConstraintValidator(ValidationContext<T> validationContext, ValueContext<?, ?> valueContext) {
118+
protected final ConstraintValidator<A, ?> getInitializedConstraintValidator(ValidationContext<?> validationContext, ValueContext<?, ?> valueContext) {
119119
ConstraintValidator<A, ?> validator;
120120

121121
if ( validationContext.getConstraintValidatorFactory() == validationContext.getConstraintValidatorManager().getDefaultConstraintValidatorFactory()

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ public SimpleConstraintTree(ConstraintDescriptorImpl<B> descriptor, Type validat
3838
}
3939

4040
@Override
41-
protected <T> void validateConstraints(ValidationContext<T> validationContext,
41+
protected void validateConstraints(ValidationContext<?> validationContext,
4242
ValueContext<?, ?> valueContext,
4343
Collection<ConstraintValidatorContextImpl> violatedConstraintValidatorContexts) {
4444

engine/src/main/java/org/hibernate/validator/internal/engine/validationcontext/AbstractValidationContext.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@
4848
* @author Guillaume Smet
4949
* @author Marko Bekhta
5050
*/
51-
abstract class AbstractValidationContext<T> implements ValidationContext<T> {
51+
abstract class AbstractValidationContext<T> implements BaseBeanValidationContext<T> {
5252

5353
private static final Log LOG = LoggerFactory.make( MethodHandles.lookup() );
5454

0 commit comments

Comments
 (0)