Skip to content

Commit e932304

Browse files
gsmetmarko-bekhta
authored andcommitted
HV-1831 Unfinished experiments
1 parent 4794742 commit e932304

15 files changed

+342
-66
lines changed

engine/src/main/java/org/hibernate/validator/BaseHibernateValidatorConfiguration.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.hibernate.validator.cfg.ConstraintMapping;
2626
import org.hibernate.validator.constraints.ParameterScriptAssert;
2727
import org.hibernate.validator.constraints.ScriptAssert;
28+
import org.hibernate.validator.internal.engine.tracking.ProcessedBeansTrackingStrategy;
2829
import org.hibernate.validator.messageinterpolation.ExpressionLanguageFeatureLevel;
2930
import org.hibernate.validator.spi.messageinterpolation.LocaleResolver;
3031
import org.hibernate.validator.metadata.BeanMetaDataClassNormalizer;
@@ -501,4 +502,7 @@ default S locales(Locale... locales) {
501502
*/
502503
@Incubating
503504
S showValidatedValuesInTraceLogs(boolean enabled);
505+
506+
@Incubating
507+
S processedBeansTrackingStrategy(ProcessedBeansTrackingStrategy processedBeanTrackingStrategy);
504508
}

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

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
import org.hibernate.validator.internal.cfg.context.DefaultConstraintMapping;
4444
import org.hibernate.validator.internal.engine.constraintvalidation.ConstraintValidatorFactoryImpl;
4545
import org.hibernate.validator.internal.engine.resolver.TraversableResolvers;
46+
import org.hibernate.validator.internal.engine.tracking.ProcessedBeansTrackingStrategy;
4647
import org.hibernate.validator.internal.engine.valueextraction.ValueExtractorDescriptor;
4748
import org.hibernate.validator.internal.engine.valueextraction.ValueExtractorManager;
4849
import org.hibernate.validator.internal.properties.DefaultGetterPropertySelectionStrategy;
@@ -133,6 +134,7 @@ public abstract class AbstractConfigurationImpl<T extends BaseHibernateValidator
133134
private BeanMetaDataClassNormalizer beanMetaDataClassNormalizer;
134135
private ExpressionLanguageFeatureLevel constraintExpressionLanguageFeatureLevel;
135136
private ExpressionLanguageFeatureLevel customViolationExpressionLanguageFeatureLevel;
137+
private ProcessedBeansTrackingStrategy processedBeansTrackingStrategy;
136138
private boolean showValidatedValuesInTraceLogs;
137139

138140
protected AbstractConfigurationImpl(BootstrapState state) {
@@ -672,6 +674,22 @@ public final boolean getShowValidatedValuesInTraceLogs() {
672674
return this.showValidatedValuesInTraceLogs;
673675
}
674676

677+
@Override
678+
public T processedBeansTrackingStrategy(ProcessedBeansTrackingStrategy processedBeansTrackingStrategy) {
679+
if ( LOG.isDebugEnabled() ) {
680+
if ( processedBeansTrackingStrategy != null ) {
681+
LOG.debug( "Setting custom ProcessedBeansTrackingStrategy of type " + processedBeansTrackingStrategy.getClass()
682+
.getName() );
683+
}
684+
}
685+
this.processedBeansTrackingStrategy = processedBeansTrackingStrategy;
686+
return thisAsT();
687+
}
688+
689+
public ProcessedBeansTrackingStrategy getProcessedBeansTrackingStrategy() {
690+
return processedBeansTrackingStrategy;
691+
}
692+
675693
public final Set<DefaultConstraintMapping> getProgrammaticMappings() {
676694
return programmaticMappings;
677695
}

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

Lines changed: 30 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,11 @@
99
import static org.hibernate.validator.internal.engine.ValidatorFactoryConfigurationHelper.determineAllowMultipleCascadedValidationOnReturnValues;
1010
import static org.hibernate.validator.internal.engine.ValidatorFactoryConfigurationHelper.determineAllowOverridingMethodAlterParameterConstraint;
1111
import static org.hibernate.validator.internal.engine.ValidatorFactoryConfigurationHelper.determineAllowParallelMethodsDefineParameterConstraints;
12-
import static org.hibernate.validator.internal.engine.ValidatorFactoryConfigurationHelper.determineConstraintExpressionLanguageFeatureLevel;
13-
import static org.hibernate.validator.internal.engine.ValidatorFactoryConfigurationHelper.determineCustomViolationExpressionLanguageFeatureLevel;
1412
import static org.hibernate.validator.internal.engine.ValidatorFactoryConfigurationHelper.determineBeanMetaDataClassNormalizer;
13+
import static org.hibernate.validator.internal.engine.ValidatorFactoryConfigurationHelper.determineConstraintExpressionLanguageFeatureLevel;
1514
import static org.hibernate.validator.internal.engine.ValidatorFactoryConfigurationHelper.determineConstraintMappings;
1615
import static org.hibernate.validator.internal.engine.ValidatorFactoryConfigurationHelper.determineConstraintValidatorPayload;
16+
import static org.hibernate.validator.internal.engine.ValidatorFactoryConfigurationHelper.determineCustomViolationExpressionLanguageFeatureLevel;
1717
import static org.hibernate.validator.internal.engine.ValidatorFactoryConfigurationHelper.determineExternalClassLoader;
1818
import static org.hibernate.validator.internal.engine.ValidatorFactoryConfigurationHelper.determineFailFast;
1919
import static org.hibernate.validator.internal.engine.ValidatorFactoryConfigurationHelper.determineScriptEvaluatorFactory;
@@ -46,8 +46,10 @@
4646
import org.hibernate.validator.PredefinedScopeHibernateValidatorFactory;
4747
import org.hibernate.validator.internal.cfg.context.DefaultConstraintMapping;
4848
import org.hibernate.validator.internal.engine.constraintvalidation.ConstraintValidatorManager;
49+
import org.hibernate.validator.internal.engine.constraintvalidation.HibernateConstraintValidatorInitializationContextImpl;
4950
import org.hibernate.validator.internal.engine.constraintvalidation.PredefinedScopeConstraintValidatorManagerImpl;
5051
import org.hibernate.validator.internal.engine.groups.ValidationOrderGenerator;
52+
import org.hibernate.validator.internal.engine.tracking.PredefinedScopeProcessedBeansTrackingStrategy;
5153
import org.hibernate.validator.internal.engine.valueextraction.ValueExtractorManager;
5254
import org.hibernate.validator.internal.metadata.PredefinedScopeBeanMetaDataManager;
5355
import org.hibernate.validator.internal.metadata.core.ConstraintHelper;
@@ -118,24 +120,16 @@ public PredefinedScopeValidatorFactoryImpl(ConfigurationState configurationState
118120
determineAllowParallelMethodsDefineParameterConstraints( hibernateSpecificConfig, properties )
119121
).build();
120122

121-
this.validatorFactoryScopedContext = new ValidatorFactoryScopedContext(
122-
configurationState.getMessageInterpolator(),
123-
configurationState.getTraversableResolver(),
124-
new ExecutableParameterNameProvider( configurationState.getParameterNameProvider() ),
125-
configurationState.getClockProvider(),
126-
determineTemporalValidationTolerance( configurationState, properties ),
127-
determineScriptEvaluatorFactory( configurationState, properties, externalClassLoader ),
128-
determineFailFast( hibernateSpecificConfig, properties ),
129-
determineTraversableResolverResultCacheEnabled( hibernateSpecificConfig, properties ),
130-
determineConstraintValidatorPayload( hibernateSpecificConfig ),
131-
determineConstraintExpressionLanguageFeatureLevel( hibernateSpecificConfig, properties ),
132-
determineCustomViolationExpressionLanguageFeatureLevel( hibernateSpecificConfig, properties ),
133-
determineShowValidatedValuesInTraceLogs( hibernateSpecificConfig, properties )
134-
);
123+
ExecutableParameterNameProvider parameterNameProvider = new ExecutableParameterNameProvider( configurationState.getParameterNameProvider() );
124+
ScriptEvaluatorFactory scriptEvaluatorFactory = determineScriptEvaluatorFactory( configurationState, properties, externalClassLoader );
125+
Duration temporalValidationTolerance = determineTemporalValidationTolerance( configurationState, properties );
126+
127+
HibernateConstraintValidatorInitializationContextImpl constraintValidatorInitializationContext = new HibernateConstraintValidatorInitializationContextImpl(
128+
scriptEvaluatorFactory, configurationState.getClockProvider(), temporalValidationTolerance );
135129

136130
this.constraintValidatorManager = new PredefinedScopeConstraintValidatorManagerImpl(
137131
configurationState.getConstraintValidatorFactory(),
138-
this.validatorFactoryScopedContext.getConstraintValidatorInitializationContext()
132+
constraintValidatorInitializationContext
139133
);
140134

141135
this.validationOrderGenerator = new ValidationOrderGenerator();
@@ -197,7 +191,7 @@ public PredefinedScopeValidatorFactoryImpl(ConfigurationState configurationState
197191
this.beanMetaDataManager = new PredefinedScopeBeanMetaDataManager(
198192
constraintCreationContext,
199193
executableHelper,
200-
validatorFactoryScopedContext.getParameterNameProvider(),
194+
parameterNameProvider,
201195
javaBeanHelper,
202196
validationOrderGenerator,
203197
buildMetaDataProviders( constraintCreationContext, xmlMetaDataProvider, constraintMappings ),
@@ -206,6 +200,24 @@ public PredefinedScopeValidatorFactoryImpl(ConfigurationState configurationState
206200
hibernateSpecificConfig.getBeanClassesToInitialize()
207201
);
208202

203+
this.validatorFactoryScopedContext = new ValidatorFactoryScopedContext(
204+
configurationState.getMessageInterpolator(),
205+
configurationState.getTraversableResolver(),
206+
parameterNameProvider,
207+
configurationState.getClockProvider(),
208+
temporalValidationTolerance,
209+
scriptEvaluatorFactory,
210+
determineFailFast( hibernateSpecificConfig, properties ),
211+
determineTraversableResolverResultCacheEnabled( hibernateSpecificConfig, properties ),
212+
determineShowValidatedValuesInTraceLogs( hibernateSpecificConfig, properties ),
213+
determineConstraintValidatorPayload( hibernateSpecificConfig ),
214+
determineConstraintExpressionLanguageFeatureLevel( hibernateSpecificConfig, properties ),
215+
determineCustomViolationExpressionLanguageFeatureLevel( hibernateSpecificConfig, properties ),
216+
( hibernateSpecificConfig != null && hibernateSpecificConfig.getProcessedBeansTrackingStrategy() != null )
217+
? hibernateSpecificConfig.getProcessedBeansTrackingStrategy()
218+
: new PredefinedScopeProcessedBeansTrackingStrategy( beanMetaDataManager ),
219+
constraintValidatorInitializationContext );
220+
209221
if ( LOG.isDebugEnabled() ) {
210222
logValidatorFactoryScopedConfiguration( validatorFactoryScopedContext );
211223
}

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
import org.hibernate.validator.internal.engine.constraintvalidation.ConstraintValidatorManager;
5050
import org.hibernate.validator.internal.engine.constraintvalidation.ConstraintValidatorManagerImpl;
5151
import org.hibernate.validator.internal.engine.groups.ValidationOrderGenerator;
52+
import org.hibernate.validator.internal.engine.tracking.HasCascadablesProcessedBeansTrackingStrategy;
5253
import org.hibernate.validator.internal.engine.valueextraction.ValueExtractorManager;
5354
import org.hibernate.validator.internal.metadata.BeanMetaDataManager;
5455
import org.hibernate.validator.internal.metadata.BeanMetaDataManagerImpl;
@@ -165,8 +166,10 @@ public ValidatorFactoryImpl(ConfigurationState configurationState) {
165166
determineConstraintValidatorPayload( hibernateSpecificConfig ),
166167
determineConstraintExpressionLanguageFeatureLevel( hibernateSpecificConfig, properties ),
167168
determineCustomViolationExpressionLanguageFeatureLevel( hibernateSpecificConfig, properties ),
168-
determineShowValidatedValuesInTraceLogs( hibernateSpecificConfig, properties )
169-
);
169+
( hibernateSpecificConfig != null && hibernateSpecificConfig.getProcessedBeansTrackingStrategy() != null )
170+
? hibernateSpecificConfig.getProcessedBeansTrackingStrategy()
171+
: new HasCascadablesProcessedBeansTrackingStrategy(),
172+
determineShowValidatedValuesInTraceLogs( hibernateSpecificConfig, properties ) );
170173

171174
ConstraintValidatorManager constraintValidatorManager = new ConstraintValidatorManagerImpl(
172175
configurationState.getConstraintValidatorFactory(),

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

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
import org.hibernate.validator.constraintvalidation.HibernateConstraintValidatorInitializationContext;
1717
import org.hibernate.validator.internal.engine.constraintvalidation.HibernateConstraintValidatorInitializationContextImpl;
18+
import org.hibernate.validator.internal.engine.tracking.ProcessedBeansTrackingStrategy;
1819
import org.hibernate.validator.internal.util.Contracts;
1920
import org.hibernate.validator.internal.util.ExecutableParameterNameProvider;
2021
import org.hibernate.validator.messageinterpolation.ExpressionLanguageFeatureLevel;
@@ -78,6 +79,11 @@ public class ValidatorFactoryScopedContext {
7879
*/
7980
private final ExpressionLanguageFeatureLevel customViolationExpressionLanguageFeatureLevel;
8081

82+
/**
83+
* Strategy used to enable or not processed beans tracking.
84+
*/
85+
private final ProcessedBeansTrackingStrategy processedBeansTrackingStrategy;
86+
8187
/**
8288
* The constraint validator initialization context.
8389
*/
@@ -99,15 +105,16 @@ public class ValidatorFactoryScopedContext {
99105
Object constraintValidatorPayload,
100106
ExpressionLanguageFeatureLevel constraintExpressionLanguageFeatureLevel,
101107
ExpressionLanguageFeatureLevel customViolationExpressionLanguageFeatureLevel,
108+
ProcessedBeansTrackingStrategy processedBeansTrackingStrategy,
102109
boolean showValidatedValuesInTraceLogs) {
103110
this( messageInterpolator, traversableResolver, parameterNameProvider, clockProvider, temporalValidationTolerance, scriptEvaluatorFactory, failFast,
104111
traversableResolverResultCacheEnabled, showValidatedValuesInTraceLogs, constraintValidatorPayload, constraintExpressionLanguageFeatureLevel,
105-
customViolationExpressionLanguageFeatureLevel,
112+
customViolationExpressionLanguageFeatureLevel, processedBeansTrackingStrategy,
106113
new HibernateConstraintValidatorInitializationContextImpl( scriptEvaluatorFactory, clockProvider,
107114
temporalValidationTolerance ) );
108115
}
109116

110-
private ValidatorFactoryScopedContext(MessageInterpolator messageInterpolator,
117+
ValidatorFactoryScopedContext(MessageInterpolator messageInterpolator,
111118
TraversableResolver traversableResolver,
112119
ExecutableParameterNameProvider parameterNameProvider,
113120
ClockProvider clockProvider,
@@ -118,6 +125,7 @@ private ValidatorFactoryScopedContext(MessageInterpolator messageInterpolator,
118125
boolean showValidatedValuesInTraceLogs, Object constraintValidatorPayload,
119126
ExpressionLanguageFeatureLevel constraintExpressionLanguageFeatureLevel,
120127
ExpressionLanguageFeatureLevel customViolationExpressionLanguageFeatureLevel,
128+
ProcessedBeansTrackingStrategy processedBeanTrackingStrategy,
121129
HibernateConstraintValidatorInitializationContextImpl constraintValidatorInitializationContext) {
122130
this.messageInterpolator = messageInterpolator;
123131
this.traversableResolver = traversableResolver;
@@ -131,6 +139,7 @@ private ValidatorFactoryScopedContext(MessageInterpolator messageInterpolator,
131139
this.constraintExpressionLanguageFeatureLevel = constraintExpressionLanguageFeatureLevel;
132140
this.customViolationExpressionLanguageFeatureLevel = customViolationExpressionLanguageFeatureLevel;
133141
this.showValidatedValuesInTraceLogs = showValidatedValuesInTraceLogs;
142+
this.processedBeansTrackingStrategy = processedBeanTrackingStrategy;
134143
this.constraintValidatorInitializationContext = constraintValidatorInitializationContext;
135144
}
136145

@@ -186,6 +195,10 @@ public boolean isShowValidatedValuesInTraceLogs() {
186195
return showValidatedValuesInTraceLogs;
187196
}
188197

198+
public ProcessedBeansTrackingStrategy getProcessedBeansTrackingStrategy() {
199+
return processedBeansTrackingStrategy;
200+
}
201+
189202
static class Builder {
190203
private final ValidatorFactoryScopedContext defaultContext;
191204

@@ -200,6 +213,7 @@ static class Builder {
200213
private Object constraintValidatorPayload;
201214
private ExpressionLanguageFeatureLevel constraintExpressionLanguageFeatureLevel;
202215
private ExpressionLanguageFeatureLevel customViolationExpressionLanguageFeatureLevel;
216+
private ProcessedBeansTrackingStrategy processedBeansTrackingStrategy;
203217

204218
private boolean showValidatedValuesInTraceLogs;
205219
private HibernateConstraintValidatorInitializationContextImpl constraintValidatorInitializationContext;
@@ -220,6 +234,7 @@ static class Builder {
220234
this.constraintExpressionLanguageFeatureLevel = defaultContext.constraintExpressionLanguageFeatureLevel;
221235
this.customViolationExpressionLanguageFeatureLevel = defaultContext.customViolationExpressionLanguageFeatureLevel;
222236
this.showValidatedValuesInTraceLogs = defaultContext.showValidatedValuesInTraceLogs;
237+
this.processedBeansTrackingStrategy = defaultContext.processedBeansTrackingStrategy;
223238
this.constraintValidatorInitializationContext = defaultContext.constraintValidatorInitializationContext;
224239
}
225240

@@ -312,6 +327,12 @@ public ValidatorFactoryScopedContext.Builder setShowValidatedValuesInTraceLogs(
312327
return this;
313328
}
314329

330+
public ValidatorFactoryScopedContext.Builder setProcessedBeansTrackingStrategy(
331+
ProcessedBeansTrackingStrategy processedBeansTrackingStrategy) {
332+
this.processedBeansTrackingStrategy = processedBeansTrackingStrategy;
333+
return this;
334+
}
335+
315336
public ValidatorFactoryScopedContext build() {
316337
return new ValidatorFactoryScopedContext(
317338
messageInterpolator,
@@ -325,6 +346,7 @@ public ValidatorFactoryScopedContext build() {
325346
showValidatedValuesInTraceLogs, constraintValidatorPayload,
326347
constraintExpressionLanguageFeatureLevel,
327348
customViolationExpressionLanguageFeatureLevel,
349+
processedBeansTrackingStrategy,
328350
HibernateConstraintValidatorInitializationContextImpl.of(
329351
constraintValidatorInitializationContext,
330352
scriptEvaluatorFactory,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
/*
2+
* Hibernate Validator, declare and validate application constraints
3+
*
4+
* License: Apache License, Version 2.0
5+
* See the license.txt file in the root directory or <http://www.apache.org/licenses/LICENSE-2.0>.
6+
*/
7+
package org.hibernate.validator.internal.engine.tracking;
8+
9+
import java.lang.reflect.Executable;
10+
11+
public class HasCascadablesProcessedBeansTrackingStrategy implements ProcessedBeansTrackingStrategy {
12+
13+
@Override
14+
public boolean isEnabledForBean(Class<?> beanClass, boolean hasCascadables) {
15+
return hasCascadables;
16+
}
17+
18+
@Override
19+
public boolean isEnabledForReturnValue(Executable executable, boolean hasCascadables) {
20+
return hasCascadables;
21+
}
22+
23+
@Override
24+
public boolean isEnabledForParameters(Executable executable, boolean hasCascadables) {
25+
return hasCascadables;
26+
}
27+
28+
@Override
29+
public void clear() {
30+
}
31+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
/*
2+
* Hibernate Validator, declare and validate application constraints
3+
*
4+
* License: Apache License, Version 2.0
5+
* See the license.txt file in the root directory or <http://www.apache.org/licenses/LICENSE-2.0>.
6+
*/
7+
package org.hibernate.validator.internal.engine.tracking;
8+
9+
import java.lang.reflect.Executable;
10+
import java.util.HashMap;
11+
import java.util.Map;
12+
13+
import org.hibernate.validator.internal.metadata.PredefinedScopeBeanMetaDataManager;
14+
import org.hibernate.validator.internal.util.CollectionHelper;
15+
16+
public class PredefinedScopeProcessedBeansTrackingStrategy implements ProcessedBeansTrackingStrategy {
17+
18+
private final Map<Class<?>, Boolean> trackingEnabledForBeans;
19+
20+
private final Map<Executable, Boolean> trackingEnabledForReturnValues;
21+
22+
private final Map<Executable, Boolean> trackingEnabledForParameters;
23+
24+
public PredefinedScopeProcessedBeansTrackingStrategy(PredefinedScopeBeanMetaDataManager beanMetaDataManager) {
25+
// TODO: build the maps from the information inside the beanMetaDataManager
26+
27+
this.trackingEnabledForBeans = CollectionHelper.toImmutableMap( new HashMap<>() );
28+
this.trackingEnabledForReturnValues = CollectionHelper.toImmutableMap( new HashMap<>() );
29+
this.trackingEnabledForParameters = CollectionHelper.toImmutableMap( new HashMap<>() );
30+
}
31+
32+
@Override
33+
public boolean isEnabledForBean(Class<?> rootBeanClass, boolean hasCascadables) {
34+
if ( !hasCascadables ) {
35+
return false;
36+
}
37+
38+
return trackingEnabledForBeans.getOrDefault( rootBeanClass, true );
39+
}
40+
41+
@Override
42+
public boolean isEnabledForReturnValue(Executable executable, boolean hasCascadables) {
43+
if ( !hasCascadables ) {
44+
return false;
45+
}
46+
47+
return trackingEnabledForReturnValues.getOrDefault( executable, true );
48+
}
49+
50+
@Override
51+
public boolean isEnabledForParameters(Executable executable, boolean hasCascadables) {
52+
if ( !hasCascadables ) {
53+
return false;
54+
}
55+
56+
return trackingEnabledForParameters.getOrDefault( executable, true );
57+
}
58+
59+
@Override
60+
public void clear() {
61+
trackingEnabledForBeans.clear();
62+
trackingEnabledForReturnValues.clear();
63+
trackingEnabledForParameters.clear();
64+
}
65+
}

0 commit comments

Comments
 (0)