10000 HV-1831 Unfinished experiments · hibernate/hibernate-validator@0eb0e17 · GitHub
[go: up one dir, main page]

Skip to content

Commit 0eb0e17

Browse files
committed
HV-1831 Unfinished experiments
1 parent c314630 commit 0eb0e17

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;
@@ -480,4 +481,7 @@ default S locales(Locale... locales) {
480481
*/
481482
@Incubating
482483
S customViolationExpressionLanguageFeatureLevel(ExpressionLanguageFeatureLevel expressionLanguageFeatureLevel);
484+
485+
@Incubating
486+
S processedBeansTrackingStrategy(ProcessedBeansTrackingStrategy processedBeanTrackingStrategy);
483487
}

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
@@ -42,6 +42,7 @@
4242
import org.hibernate.validator.internal.cfg.context.DefaultConstraintMapping;
4343
import org.hibernate.validator.internal.engine.constraintvalidation.ConstraintValidatorFactoryImpl;
4444
import org.hibernate.validator.internal.engine.resolver.TraversableResolvers;
45+
import org.hibernate.validator.internal.engine.tracking.ProcessedBeansTrackingStrategy;
4546
import org.hibernate.validator.internal.engine.valueextraction.ValueExtractorDescriptor;
4647
import org.hibernate.validator.internal.engine.valueextraction.ValueExtractorManager;
4748
import org.hibernate.validator.internal.properties.DefaultGetterPropertySelectionStrategy;
@@ -132,6 +133,7 @@ public abstract class AbstractConfigurationImpl<T extends BaseHibernateValidator
132133
private BeanMetaDataClassNormalizer beanMetaDataClassNormalizer;
133134
private ExpressionLanguageFeatureLevel constraintExpressionLanguageFeatureLevel;
134135
private ExpressionLanguageFeatureLevel customViolationExpressionLanguageFeatureLevel;
136+
private ProcessedBeansTrackingStrategy processedBeansTrackingStrategy;
135137

136138
protected AbstractConfigurationImpl(BootstrapState state) {
137139
this();
@@ -660,6 +662,22 @@ public ExpressionLanguageFeatureLevel getCustomViolationExpressionLanguageFeatur
660662
return customViolationExpressionLanguageFeatureLevel;
661663
}
662664

665+
@Override
666+
public T processedBeansTrackingStrategy(ProcessedBeansTrackingStrategy processedBeansTrackingStrategy) {
667+
if ( LOG.isDebugEnabled() ) {
668+
if ( processedBeansTrackingStrategy != null ) {
669+
LOG.debug( "Setting custom ProcessedBeansTrackingStrategy of type " + processedBeansTrackingStrategy.getClass()
670+
.getName() );
671+
}
672+
}
673+
this.processedBeansTrackingStrategy = processedBeansTrackingStrategy;
674+
return thisAsT();
675+
}
676+
677+
public ProcessedBeansTrackingStrategy getProcessedBeansTrackingStrategy() {
678+
return processedBeansTrackingStrategy;
679+
}
680+
663681
public final Set<DefaultConstraintMapping> getProgrammaticMappings() {
664682
return programmaticMappings;
665683
}

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

Lines changed: 29 additions & 17 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;
@@ -44,8 +44,10 @@
4444
import org.hibernate.validator.PredefinedScopeHibernateValidatorFactory;
4545
import org.hibernate.validator.internal.cfg.context.DefaultConstraintMapping;
4646
import org.hibernate.validator.internal.engine.constraintvalidation.ConstraintValidatorManager;
47+
import org.hibernate.validator.internal.engine.constraintvalidation.HibernateConstraintValidatorInitializationContextImpl;
4748
import org.hibernate.validator.internal.engine.constraintvalidation.PredefinedScopeConstraintValidatorManagerImpl;
4849
import org.hibernate.validator.internal.engine.groups.ValidationOrderGenerator;
50+
import org.hibernate.validator.internal.engine.tracking.PredefinedScopeProcessedBeansTrackingStrategy;
4951
import org.hibernate.validator.internal.engine.valueextraction.ValueExtractorManager;
5052
import org.hibernate.validator.internal.metadata.PredefinedScopeBeanMetaDataManager;
5153
import org.hibernate.validator.internal.metadata.core.ConstraintHelper;
@@ -112,23 +114,16 @@ public PredefinedScopeValidatorFactoryImpl(ConfigurationState configurationState
112114
determineAllowParallelMethodsDefineParameterConstraints( hibernateSpecificConfig, properties )
113115
).build();
114116

115-
this.validatorFactoryScopedContext = new ValidatorFactoryScopedContext(
116-
configurationState.getMessageInterpolator(),
117-
configurationState.getTraversableResolver(),
118-
new ExecutableParameterNameProvider( configurationState.getParameterNameProvider() ),
119-
configurationState.getClockProvider(),
120-
determineTemporalValidationTolerance( configurationState, properties ),
121-
determineScriptEvaluatorFactory( configurationState, properties, externalClassLoader ),
122-
determineFailFast( hibernateSpecificConfig, properties ),
123-
determineTraversableResolverResultCacheEnabled( hibernateSpecificConfig, properties ),
124-
determineConstraintValidatorPayload( hibernateSpecificConfig ),
125-
determineConstraintExpressionLanguageFeatureLevel( hibernateSpecificConfig, properties ),
126-
determineCustomViolationExpressionLanguageFeatureLevel( hibernateSpecificConfig, properties )
127-
);
117+
ExecutableParameterNameProvider parameterNameProvider = new ExecutableParameterNameProvider( configurationState.getParameterNameProvider() );
118+
ScriptEvaluatorFactory scriptEvaluatorFactory = determineScriptEvaluatorFactory( configurationState, properties, externalClassLoader );
119+
Duration temporalValidationTolerance = determineTemporalValidationTolerance( configurationState, properties );
120+
121+
HibernateConstraintValidatorInitializationContextImpl constraintValidatorInitializationContext = new HibernateConstraintValidatorInitializationContextImpl(
122+
scriptEvaluatorFactory, configurationState.getClockProvider(), temporalValidationTolerance );
128123

129124
this.constraintValidatorManager = new PredefinedScopeConstraintValidatorManagerImpl(
130125
configurationState.getConstraintValidatorFactory(),
131-
this.validatorFactoryScopedContext.getConstraintValidatorInitializationContext()
126+
constraintValidatorInitializationContext
132127
);
133128

134129
this.validationOrderGenerator = new ValidationOrderGenerator();
@@ -171,7 +166,7 @@ public PredefinedScopeValidatorFactoryImpl(ConfigurationState configurationState
171166
this.beanMetaDataManager = new PredefinedScopeBeanMetaDataManager(
172167
constraintCreationContext,
173168
executableHelper,
174-
validatorFactoryScopedContext.getParameterNameProvider(),
169+
parameterNameProvider,
175170
javaBeanHelper,
176171
validationOrderGenerator,
177172
buildMetaDataProviders( constraintCreationContext, xmlMetaDataProvider, constraintMappings ),
@@ -180,6 +175,23 @@ public PredefinedScopeValidatorFactoryImpl(ConfigurationState configurationState
180175
hibernateSpecificConfig.getBeanClassesToInitialize()
181176
);
182177

178+
this.validatorFactoryScopedContext = new ValidatorFactoryScopedContext(
179+
configurationState.getMessageInterpolator(),
180+
configurationState.getTraversableResolver(),
181+
parameterNameProvider,
182+
configurationState.getClockProvider(),
183+
temporalValidationTolerance,
184+
scriptEvaluatorFactory,
185+
determineFailFast( hibernateSpecificConfig, properties ),
186+
determineTraversableResolverResultCacheEnabled( hibernateSpecificConfig, properties ),
187+
determineConstraintValidatorPayload( hibernateSpecificConfig ),
188+
determineConstraintExpressionLanguageFeatureLevel( hibernateSpecificConfig, properties ),
189+
determineCustomViolationExpressionLanguageFeatureLevel( hibernateSpecificConfig, properties ),
190+
( hibernateSpecificConfig != null && hibernateSpecificConfig.getProcessedBeansTrackingStrategy() != null )
191+
? hibernateSpecificConfig.getProcessedBeansTrackingStrategy()
192+
: new PredefinedScopeProcessedBeansTrackingStrategy( beanMetaDataManager ),
193+
constraintValidatorInitializationContext );
194+
183195
if ( LOG.isDebugEnabled() ) {
184196
logValidatorFactoryScopedConfiguration( validatorFactoryScopedContext );
185197
}

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
@@ -47,6 +47,7 @@
4747
import org.hibernate.validator.internal.engine.constraintvalidation.ConstraintValidatorManager;
4848
import org.hibernate.validator.internal.engine.constraintvalidation.ConstraintValidatorManagerImpl;
4949
import org.hibernate.validator.internal.engine.groups.ValidationOrderGenerator;
50+
import org.hibernate.validator.internal.engine.tracking.HasCascadablesProcessedBeansTrackingStrategy;
5051
import org.hibernate.validator.internal.engine.valueextraction.ValueExtractorManager;
5152
import org.hibernate.validator.internal.metadata.BeanMetaDataManager;
5253
import org.hibernate.validator.internal.metadata.BeanMetaDataManagerImpl;
@@ -160,8 +161,10 @@ public ValidatorFactoryImpl(ConfigurationState configurationState) {
160161
determineTraversableResolverResultCacheEnabled( hibernateSpecificConfig, properties ),
161162
determineConstraintValidatorPayload( hibernateSpecificConfig ),
162163
determineConstraintExpressionLanguageFeatureLevel( hibernateSpecificConfig, properties ),
163-
determineCustomViolationExpressionLanguageFeatureLevel( hibernateSpecificConfig, properties )
164-
);
164+
determineCustomViolationExpressionLanguageFeatureLevel( hibernateSpecificConfig, properties ),
165+
( hibernateSpecificConfig != null && hibernateSpecificConfig.getProcessedBeansTrackingStrategy() != null )
166+
? hibernateSpecificConfig.getProcessedBeansTrackingStrategy()
167+
: new HasCascadablesProcessedBeansTrackingStrategy() );
165168

166169
ConstraintValidatorManager constraintValidatorManager = new ConstraintValidatorManagerImpl(
167170
configurationState.getConstraintValidatorFactory(),

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

Lines changed: 25 additions & 3 deletions
< 57AE /table>
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
*/
@@ -93,15 +99,16 @@ public class ValidatorFactoryScopedContext {
9399
boolean traversableResolverResultCacheEnabled,
94100
Object constraintValidatorPayload,
95101
ExpressionLanguageFeatureLevel constraintExpressionLanguageFeatureLevel,
96-
ExpressionLanguageFeatureLevel customViolationExpressionLanguageFeatureLevel) {
102+
ExpressionLanguageFeatureLevel customViolationExpressionLanguageFeatureLevel,
103+
ProcessedBeansTrackingStrategy processedBeansTrackingStrategy) {
97104
this( messageInterpolator, traversableResolver, parameterNameProvider, clockProvider, temporalValidationTolerance, scriptEvaluatorFactory, failFast,
98105
traversableResolverResultCacheEnabled, constraintValidatorPayload, constraintExpressionLanguageFeatureLevel,
99-
customViolationExpressionLanguageFeatureLevel,
106+
customViolationExpressionLanguageFeatureLevel, processedBeansTrackingStrategy,
100107
new HibernateConstraintValidatorInitializationContextImpl( scriptEvaluatorFactory, clockProvider,
101108
temporalValidationTolerance ) );
102109
}
103110

104-
private ValidatorFactoryScopedContext(MessageInterpolator messageInterpolator,
111+
ValidatorFactoryScopedContext(MessageInterpolator messageInterpolator,
105112
TraversableResolver traversableResolver,
106113
ExecutableParameterNameProvider parameterNameProvider,
107114
ClockProvider clockProvider,
@@ -112,6 +119,7 @@ private ValidatorFactoryScopedContext(MessageInterpolator messageInterpolator,
112119
Object constraintValidatorPayload,
113120
ExpressionLanguageFeatureLevel constraintExpressionLanguageFeatureLevel,
114121
ExpressionLanguageFeatureLevel customViolationExpressionLanguageFeatureLevel,
122+
ProcessedBeansTrackingStrategy processedBeanTrackingStrategy,
115123
HibernateConstraintValidatorInitializationContextImpl constraintValidatorInitializationContext) {
116124
this.messageInterpolator = messageInterpolator;
117125
this.traversableResolver = traversableResolver;
@@ -124,6 +132,7 @@ private ValidatorFactoryScopedContext(MessageInterpolator messageInterpolator,
124132
this.constraintValidatorPayload = constraintValidatorPayload;
125133
this.constraintExpressionLanguageFeatureLevel = constraintExpressionLanguageFeatureLevel;
126134
this.customViolationExpressionLanguageFeatureLevel = customViolationExpressionLanguageFeatureLevel;
135+
this.processedBeansTrackingStrategy = processedBeanTrackingStrategy;
127136
this.constraintValidatorInitializationContext = constraintValidatorInitializationContext;
128137
}
129138

@@ -175,6 +184,10 @@ public ExpressionLanguageFeatureLevel getCustomViolationExpressionLanguageFeatur
175184
return this.customViolationExpressionLanguageFeatureLevel;
176185
}
177186

187+
public ProcessedBeansTrackingStrategy getProcessedBeansTrackingStrategy() {
188+
return processedBeansTrackingStrategy;
189+
}
190+
178191
static class Builder {
179192
private final ValidatorFactoryScopedContext defaultContext;
180193

@@ -189,6 +202,7 @@ static class Builder {
189202
private Object constraintValidatorPayload;
190203
private ExpressionLanguageFeatureLevel constraintExpressionLanguageFeatureLevel;
191204
private ExpressionLanguageFeatureLevel customViolationExpressionLanguageFeatureLevel;
205+
private ProcessedBeansTrackingStrategy processedBeansTrackingStrategy;
192206
private HibernateConstraintValidatorInitializationContextImpl constraintValidatorInitializationContext;
193207

194208
Builder(ValidatorFactoryScopedContext defaultContext) {
@@ -206,6 +220,7 @@ static class Builder {
206220
this.constraintValidatorPayload = defaultContext.constraintValidatorPayload;
207221
this.constraintExpressionLanguageFeatureLevel = defaultContext.constraintExpressionLanguageFeatureLevel;
208222
this.customViolationExpressionLanguageFeatureLevel = defaultContext.customViolationExpressionLanguageFeatureLevel;
223+
this.processedBeansTrackingStrategy = defaultContext.processedBeansTrackingStrategy;
209224
this.constraintValidatorInitializationContext = defaultContext.constraintValidatorInitializationContext;
210225
}
211226

@@ -292,6 +307,12 @@ public ValidatorFactoryScopedContext.Builder setCustomViolationExpressionLanguag
292307
return this;
293308
}
294309

310+
public ValidatorFactoryScopedContext.Builder setProcessedBeansTrackingStrategy(
311+
ProcessedBeansTrackingStrategy processedBeansTrackingStrategy) {
312+
this.processedBeansTrackingStrategy = processedBeansTrackingStrategy;
313+
return this;
314+
}
315+
295316
public ValidatorFactoryScopedContext build() {
296317
return new ValidatorFactoryScopedContext(
297318
messageInterpolator,
@@ -305,6 +326,7 @@ public ValidatorFactoryScopedContext build() {
305326
constraintValidatorPayload,
306327
constraintExpressionLanguageFeatureLevel,
307328
customViolationExpressionLanguageFeatureLevel,
329+
processedBeansTrackingStrategy,
308330
HibernateConstraintValidatorInitializationContextImpl.of(
309331
constraintValidatorInitializationContext,
310332
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+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
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 interface ProcessedBeansTrackingStrategy {
12+
13+
boolean isEnabledForBean(Class<?> beanClass, boolean hasCascadables);
14+
15+
boolean isEnabledForReturnValue(Executable executable, boolean hasCascadables);
16+
17+
boolean isEnabledForParameters(Executable executable, boolean hasCascadables);
18+
19+
void clear();
20+
}

0 commit comments

Comments
 (0)
0