Skip to content

Commit 77c3615

Browse files
committed
HV-2127 Create a public-path copy for constraint violation
Signed-off-by: marko-bekhta <[email protected]>
1 parent 25729f0 commit 77c3615

36 files changed

+253
-167
lines changed

cdi/src/main/java/org/hibernate/validator/cdi/interceptor/spi/ValidationInterceptor.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
*/
55
package org.hibernate.validator.cdi.interceptor.spi;
66

7+
import java.io.Serial;
78
import java.io.Serializable;
89
import java.lang.reflect.Member;
910
import java.util.Arrays;
@@ -37,6 +38,7 @@
3738
@Priority(Interceptor.Priority.PLATFORM_AFTER + 800)
3839
public class ValidationInterceptor implements Serializable {
3940

41+
@Serial
4042
private static final long serialVersionUID = 604440259030722151L;
4143

4244
/**

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
*/
55
package org.hibernate.validator.internal.engine;
66

7+
import java.io.Serial;
78
import java.io.Serializable;
89
import java.lang.invoke.MethodHandles;
910
import java.util.Map;
@@ -24,6 +25,7 @@
2425
public class ConstraintViolationImpl<T> implements HibernateConstraintViolation<T>, Serializable {
2526

2627
private static final Log LOG = LoggerFactory.make( MethodHandles.lookup() );
28+
@Serial
2729
private static final long serialVersionUID = -4970067626703103139L;
2830

2931
private final String interpolatedMessage;

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

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,8 @@
3838
import org.hibernate.validator.internal.engine.groups.Sequence;
3939
import org.hibernate.validator.internal.engine.groups.ValidationOrder;
4040
import org.hibernate.validator.internal.engine.groups.ValidationOrderGenerator;
41+
import org.hibernate.validator.internal.engine.path.ModifiablePath;
4142
import org.hibernate.validator.internal.engine.path.NodeImpl;
42-
import org.hibernate.validator.internal.engine.path.PathImpl;
4343
import org.hibernate.validator.internal.engine.resolver.TraversableResolvers;
4444
import org.hibernate.validator.internal.engine.validationcontext.BaseBeanValidationContext;
4545
import org.hibernate.validator.internal.engine.validationcontext.ExecutableValidationContext;
@@ -164,7 +164,7 @@ public final <T> Set<ConstraintViolation<T>> validate(T object, Class<?>... grou
164164
validatorScopedContext.getParameterNameProvider(),
165165
object,
166166
validationContext.getRootBeanMetaData(),
167-
PathImpl.createRootPath()
167+
ModifiablePath.createRootPath()
168168
);
169169

170170
return validateInContext( validationContext, valueContext, validationOrder );
@@ -184,7 +184,7 @@ public final <T> Set<ConstraintViolation<T>> validateProperty(T object, String p
184184
return Collections.emptySet();
185185
}
186186

187-
PathImpl propertyPath = PathImpl.createPathFromString( propertyName );
187+
ModifiablePath propertyPath = ModifiablePath.createPathFromString( propertyName );
188188
BaseBeanValidationContext<T> validationContext = getValidationContextBuilder().forValidateProperty( rootBeanClass, rootBeanMetaData, object,
189189
propertyPath );
190190

@@ -211,7 +211,7 @@ public final <T> Set<ConstraintViolation<T>> validateValue(Class<T> beanType, St
211211
return Collections.emptySet();
212212
}
213213

214-
PathImpl propertyPath = PathImpl.createPathFromString( propertyName );
214+
ModifiablePath propertyPath = ModifiablePath.createPathFromString( propertyName );
215215
BaseBeanValidationContext<T> validationContext = getValidationContextBuilder().forValidateValue( beanType, rootBeanMetaData, propertyPath );
216216

217217
ValidationOrder validationOrder = determineGroupValidationOrder( groups );
@@ -813,7 +813,7 @@ private BeanValueContext<?, Object> buildNewLocalExecutionContext(ValueContext<?
813813
return newValueContext;
814814
}
815815

816-
private <T> Set<ConstraintViolation<T>> validateValueInContext(BaseBeanValidationContext<T> validationContext, Object value, PathImpl propertyPath,
816+
private <T> Set<ConstraintViolation<T>> validateValueInContext(BaseBeanValidationContext<T> validationContext, Object value, ModifiablePath propertyPath,
817817
ValidationOrder validationOrder) {
818818
BeanValueContext<?, Object> valueContext = getValueContextForValueValidation( validationContext.getRootBeanClass(), propertyPath );
819819
valueContext.setCurrentValidatedValue( value );
@@ -902,7 +902,7 @@ private <T> void validateParametersInContext(ExecutableValidationContext<T> vali
902902
validatorScopedContext.getParameterNameProvider(),
903903
parameterValues,
904904
executableMetaData.getValidatableParametersMetaData(),
905-
PathImpl.createPathForExecutable( executableMetaData )
905+
ModifiablePath.createPathForExecutable( executableMetaData )
906906
);
907907

908908
groupIterator = validationOrder.getGroupIterator();
@@ -1035,7 +1035,7 @@ private <T> ValueContext<T, Object> getExecutableValueContext(T object, Executab
10351035
validatorScopedContext.getParameterNameProvider(),
10361036
object,
10371037
validatable,
1038-
PathImpl.createPathForExecutable( executableMetaData )
1038+
ModifiablePath.createPathForExecutable( executableMetaData )
10391039
);
10401040

10411041
valueContext.setCurrentGroup( group );
@@ -1078,7 +1078,7 @@ private <V, T> void validateReturnValueInContext(ExecutableValidationContext<T>
10781078
validatorScopedContext.getParameterNameProvider(),
10791079
value,
10801080
executableMetaData.getReturnValueMetaData(),
1081-
PathImpl.createPathForExecutable( executableMetaData )
1081+
ModifiablePath.createPathForExecutable( executableMetaData )
10821082
);
10831083

10841084
groupIterator = validationOrder.getGroupIterator();
@@ -1184,7 +1184,7 @@ private <T> void validateReturnValueForSingleGroup(BaseBeanValidationContext<T>
11841184
* @return Returns an instance of {@code ValueContext} which describes the local validation context associated to
11851185
* the given property path.
11861186
*/
1187-
private <V> BeanValueContext<?, V> getValueContextForPropertyValidation(BaseBeanValidationContext<?> validationContext, PathImpl propertyPath) {
1187+
private <V> BeanValueContext<?, V> getValueContextForPropertyValidation(BaseBeanValidationContext<?> validationContext, ModifiablePath propertyPath) {
11881188
Class<?> clazz = validationContext.getRootBeanClass();
11891189
BeanMetaData<?> beanMetaData = validationContext.getRootBeanMetaData();
11901190
Object value = validationContext.getRootBean();
@@ -1262,7 +1262,7 @@ else if ( propertyPathNode.getKey() != null ) {
12621262
* the given property path.
12631263
*/
12641264
private <V> BeanValueContext<?, V> getValueContextForValueValidation(Class<?> rootBeanClass,
1265-
PathImpl propertyPath) {
1265+
ModifiablePath propertyPath) {
12661266
Class<?> clazz = rootBeanClass;
12671267
BeanMetaData<?> beanMetaData = null;
12681268
PropertyMetaData propertyMetaData = null;
@@ -1330,13 +1330,13 @@ private boolean isValidationRequired(BaseBeanValidationContext<?> validationCont
13301330
);
13311331
}
13321332

1333-
private boolean isReachable(BaseBeanValidationContext<?> validationContext, Object traversableObject, PathImpl path,
1333+
private boolean isReachable(BaseBeanValidationContext<?> validationContext, Object traversableObject, ModifiablePath path,
13341334
ConstraintLocationKind constraintLocationKind) {
13351335
if ( needToCallTraversableResolver( path, constraintLocationKind ) ) {
13361336
return true;
13371337
}
13381338

1339-
Path pathToObject = PathImpl.createCopyWithoutLeafNode( path );
1339+
Path pathToObject = ModifiablePath.createCopyWithoutLeafNode( path );
13401340
try {
13411341
return validationContext.getTraversableResolver().isReachable(
13421342
traversableObject,
@@ -1351,7 +1351,7 @@ private boolean isReachable(BaseBeanValidationContext<?> validationContext, Obje
13511351
}
13521352
}
13531353

1354-
private boolean needToCallTraversableResolver(PathImpl path, ConstraintLocationKind constraintLocationKind) {
1354+
private boolean needToCallTraversableResolver(ModifiablePath path, ConstraintLocationKind constraintLocationKind) {
13551355
// as the TraversableResolver interface is designed right now it does not make sense to call it when
13561356
// there is no traversable object hosting the property to be accessed. For this reason we don't call the resolver
13571357
// for class level constraints (ElementType.TYPE) or top level method parameters or return values.
@@ -1362,7 +1362,7 @@ private boolean needToCallTraversableResolver(PathImpl path, ConstraintLocationK
13621362
|| isReturnValueValidation( path );
13631363
}
13641364

1365-
private boolean isCascadeRequired(BaseBeanValidationContext<?> validationContext, Object traversableObject, PathImpl path,
1365+
private boolean isCascadeRequired(BaseBeanValidationContext<?> validationContext, Object traversableObject, ModifiablePath path,
13661366
ConstraintLocationKind constraintLocationKind) {
13671367
if ( needToCallTraversableResolver( path, constraintLocationKind ) ) {
13681368
return true;
@@ -1373,7 +1373,7 @@ private boolean isCascadeRequired(BaseBeanValidationContext<?> validationContext
13731373
return false;
13741374
}
13751375

1376-
Path pathToObject = PathImpl.createCopyWithoutLeafNode( path );
1376+
Path pathToObject = ModifiablePath.createCopyWithoutLeafNode( path );
13771377
try {
13781378
return validationContext.getTraversableResolver().isCascadable(
13791379
traversableObject,
@@ -1392,15 +1392,15 @@ private boolean isClassLevelConstraint(ConstraintLocationKind constraintLocation
13921392
return ConstraintLocationKind.TYPE.equals( constraintLocationKind );
13931393
}
13941394

1395-
private boolean isCrossParameterValidation(PathImpl path) {
1395+
private boolean isCrossParameterValidation(ModifiablePath path) {
13961396
return path.getLeafNode().getKind() == ElementKind.CROSS_PARAMETER;
13971397
}
13981398

1399-
private boolean isParameterValidation(PathImpl path) {
1399+
private boolean isParameterValidation(ModifiablePath path) {
14001400
return path.getLeafNode().getKind() == ElementKind.PARAMETER;
14011401
}
14021402

1403-
private boolean isReturnValueValidation(PathImpl path) {
1403+
private boolean isReturnValueValidation(ModifiablePath path) {
14041404
return path.getLeafNode().getKind() == ElementKind.RETURN_VALUE;
14051405
}
14061406

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

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828

2929
import org.hibernate.validator.constraintvalidation.HibernateConstraintValidatorContext;
3030
import org.hibernate.validator.constraintvalidation.HibernateConstraintViolationBuilder;
31-
import org.hibernate.validator.internal.engine.path.PathImpl;
31+
import org.hibernate.validator.internal.engine.path.ModifiablePath;
3232
import org.hibernate.validator.internal.util.CollectionHelper;
3333
import org.hibernate.validator.internal.util.Contracts;
3434
import org.hibernate.validator.internal.util.logging.Log;
@@ -49,7 +49,7 @@ public class ConstraintValidatorContextImpl implements HibernateConstraintValida
4949
private final ClockProvider clockProvider;
5050
private final ExpressionLanguageFeatureLevel defaultConstraintExpressionLanguageFeatureLevel;
5151
private final ExpressionLanguageFeatureLevel defaultCustomViolationExpressionLanguageFeatureLevel;
52-
private final PathImpl basePath;
52+
private final ModifiablePath basePath;
5353
private final ConstraintDescriptor<?> constraintDescriptor;
5454
private List<ConstraintViolationCreationContext> constraintViolationCreationContexts;
5555
private boolean defaultDisabled;
@@ -58,7 +58,7 @@ public class ConstraintValidatorContextImpl implements HibernateConstraintValida
5858

5959
public ConstraintValidatorContextImpl(
6060
ClockProvider clockProvider,
61-
PathImpl propertyPath,
61+
ModifiablePath propertyPath,
6262
ConstraintDescriptor<?> constraintDescriptor,
6363
Object constraintValidatorPayload,
6464
ExpressionLanguageFeatureLevel defaultConstraintExpressionLanguageFeatureLevel,
@@ -168,8 +168,8 @@ public final List<ConstraintViolationCreationContext> getConstraintViolationCrea
168168
return CollectionHelper.toImmutableList( returnedConstraintViolationCreationContexts );
169169
}
170170

171-
protected final PathImpl getCopyOfBasePath() {
172-
return PathImpl.createCopy( basePath );
171+
protected final ModifiablePath getCopyOfBasePath() {
172+
return ModifiablePath.createCopy( basePath );
173173
}
174174

175175
private ConstraintViolationCreationContext getDefaultConstraintViolationCreationContext() {
@@ -188,13 +188,13 @@ private abstract class NodeBuilderBase {
188188

189189
protected final String messageTemplate;
190190
protected ExpressionLanguageFeatureLevel expressionLanguageFeatureLevel;
191-
protected PathImpl propertyPath;
191+
protected ModifiablePath propertyPath;
192192

193-
protected NodeBuilderBase(String template, PathImpl path) {
193+
protected NodeBuilderBase(String template, ModifiablePath path) {
194194
this( template, defaultCustomViolationExpressionLanguageFeatureLevel, path );
195195
}
196196

197-
protected NodeBuilderBase(String template, ExpressionLanguageFeatureLevel expressionLanguageFeatureLevel, PathImpl path) {
197+
protected NodeBuilderBase(String template, ExpressionLanguageFeatureLevel expressionLanguageFeatureLevel, ModifiablePath path) {
198198
this.messageTemplate = template;
199199
this.expressionLanguageFeatureLevel = expressionLanguageFeatureLevel;
200200
this.propertyPath = path;
@@ -225,7 +225,7 @@ public ConstraintValidatorContext addConstraintViolation() {
225225

226226
protected class ConstraintViolationBuilderImpl extends NodeBuilderBase implements HibernateConstraintViolationBuilder {
227227

228-
protected ConstraintViolationBuilderImpl(String template, PathImpl path) {
228+
protected ConstraintViolationBuilderImpl(String template, ModifiablePath path) {
229229
super( template, path );
230230
}
231231

@@ -274,15 +274,15 @@ public ContainerElementNodeBuilderCustomizableContext addContainerElementNode(St
274274
*/
275275
private void dropLeafNodeIfRequired() {
276276
if ( propertyPath.getLeafNode().getKind() == ElementKind.BEAN ) {
277-
propertyPath = PathImpl.createCopyWithoutLeafNode( propertyPath );
277+
propertyPath = ModifiablePath.createCopyWithoutLeafNode( propertyPath );
278278
}
279279
}
280280
}
281281

282282
protected class NodeBuilder extends NodeBuilderBase
283283
implements NodeBuilderDefinedContext, LeafNodeBuilderDefinedContext, ContainerElementNodeBuilderDefinedContext {
284284

285-
protected NodeBuilder(String template, ExpressionLanguageFeatureLevel expressionLanguageFeatureLevel, PathImpl path) {
285+
protected NodeBuilder(String template, ExpressionLanguageFeatureLevel expressionLanguageFeatureLevel, ModifiablePath path) {
286286
super( template, expressionLanguageFeatureLevel, path );
287287
}
288288

@@ -322,7 +322,7 @@ private class DeferredNodeBuilder extends NodeBuilderBase
322322

323323
private DeferredNodeBuilder(String template,
324324
ExpressionLanguageFeatureLevel expressionLanguageFeatureLevel,
325-
PathImpl path,
325+
ModifiablePath path,
326326
String nodeName,
327327
ElementKind leafNodeKind) {
328328
super( template, expressionLanguageFeatureLevel, path );
@@ -334,7 +334,7 @@ private DeferredNodeBuilder(String template,
334334

335335
private DeferredNodeBuilder(String template,
336336
ExpressionLanguageFeatureLevel expressionLanguageFeatureLevel,
337-
PathImpl path,
337+
ModifiablePath path,
338338
String nodeName,
339339
Class<?> leafNodeContainerType,
340340
Integer leafNodeTypeArgumentIndex) {

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
import java.util.Map;
1010

11-
import org.hibernate.validator.internal.engine.path.PathImpl;
11+
import org.hibernate.validator.internal.engine.path.ModifiablePath;
1212
import org.hibernate.validator.internal.util.stereotypes.Immutable;
1313
import org.hibernate.validator.messageinterpolation.ExpressionLanguageFeatureLevel;
1414

@@ -23,7 +23,7 @@ public class ConstraintViolationCreationContext {
2323
private final String message;
2424
private final ExpressionLanguageFeatureLevel expressionLanguageFeatureLevel;
2525
private final boolean customViolation;
26-
private final PathImpl propertyPath;
26+
private final ModifiablePath propertyPath;
2727
@Immutable
2828
private final Map<String, Object> messageParameters;
2929
@Immutable
@@ -33,7 +33,7 @@ public class ConstraintViolationCreationContext {
3333
public ConstraintViolationCreationContext(String message,
3434
ExpressionLanguageFeatureLevel expressionLanguageFeatureLevel,
3535
boolean customViolation,
36-
PathImpl property,
36+
ModifiablePath property,
3737
Map<String, Object> messageParameters,
3838
Map<String, Object> expressionVariables,
3939
Object dynamicPayload) {
@@ -58,7 +58,7 @@ public boolean isCustomViolation() {
5858
return customViolation;
5959
}
6060

61-
public final PathImpl getPath() {
61+
public final ModifiablePath getPath() {
6262
return propertyPath;
6363
}
6464

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
import org.hibernate.validator.constraintvalidation.HibernateConstraintViolationBuilder;
1414
import org.hibernate.validator.constraintvalidation.HibernateCrossParameterConstraintValidatorContext;
15-
import org.hibernate.validator.internal.engine.path.PathImpl;
15+
import org.hibernate.validator.internal.engine.path.ModifiablePath;
1616
import org.hibernate.validator.internal.util.Contracts;
1717
import org.hibernate.validator.messageinterpolation.ExpressionLanguageFeatureLevel;
1818

@@ -25,7 +25,7 @@ public class CrossParameterConstraintValidatorContextImpl extends ConstraintVali
2525

2626
public CrossParameterConstraintValidatorContextImpl(List<String> methodParameterNames,
2727
ClockProvider clockProvider,
28-
PathImpl propertyPath,
28+
ModifiablePath propertyPath,
2929
ConstraintDescriptor<?> constraintDescriptor,
3030
Object constraintValidatorPayload,
3131
ExpressionLanguageFeatureLevel constraintExpressionLanguageFeatureLevel,
@@ -63,7 +63,7 @@ private class CrossParameterConstraintViolationBuilderImpl extends ConstraintVio
6363

6464
private final List<String> methodParameterNames;
6565

66-
private CrossParameterConstraintViolationBuilderImpl(List<String> methodParameterNames, String template, PathImpl path) {
66+
private CrossParameterConstraintViolationBuilderImpl(List<String> methodParameterNames, String template, ModifiablePath path) {
6767
super( template, path );
6868
this.methodParameterNames = methodParameterNames;
6969
}
@@ -77,7 +77,7 @@ public NodeBuilderDefinedContext addParameterNode(int index) {
7777
}
7878

7979
private void dropLeafNode() {
80-
propertyPath = PathImpl.createCopyWithoutLeafNode( propertyPath );
80+
propertyPath = ModifiablePath.createCopyWithoutLeafNode( propertyPath );
8181
}
8282
}
8383
}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
*/
55
package org.hibernate.validator.internal.engine.constraintvalidation;
66

7+
import java.io.Serial;
78
import java.lang.annotation.Annotation;
89
import java.lang.reflect.Type;
910
import java.util.EnumSet;
@@ -22,6 +23,7 @@
2223
*/
2324
class LambdaBasedValidatorDescriptor<A extends Annotation> implements ConstraintValidatorDescriptor<A> {
2425

26+
@Serial
2527
private static final long serialVersionUID = 5129757824081595723L;
2628

2729
private final Type validatedType;

0 commit comments

Comments
 (0)