Skip to content

Commit 4c5db57

Browse files
gsmetmarko-bekhta
authored andcommitted
HV-1831 New zero cost approach to processed bean tracking strategy
I removed it from the traditional VF for now as I would like us to focus on the case where it is useful first. We will reintroduce it later once we have validated the approach where it is the most useful. I'm a bit unclear right now if we should use the same contract for traditional and predefined scope VF as we are dealing with different things and they won't be evaluated at the same moment. I'm thinking that maybe this needs to be a different contract.
1 parent 22323b4 commit 4c5db57

20 files changed

+182
-282
lines changed

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,6 @@ public PredefinedScopeValidatorFactoryImpl(ConfigurationState configurationState
226226
determineConstraintValidatorPayload( hibernateSpecificConfig ),
227227
determineConstraintExpressionLanguageFeatureLevel( hibernateSpecificConfig, properties ),
228228
determineCustomViolationExpressionLanguageFeatureLevel( hibernateSpecificConfig, properties ),
229-
beanMetaDataManager.getProcessedBeansTrackingStrategy(),
230229
constraintValidatorInitializationContext );
231230

232231
if ( LOG.isDebugEnabled() ) {
@@ -296,6 +295,10 @@ public boolean isTraversableResolverResultCacheEnabled() {
296295
return validatorFactoryScopedContext.isTraversableResolverResultCacheEnabled();
297296
}
298297

298+
public PredefinedScopeBeanMetaDataManager getBeanMetaDataManager() {
299+
return beanMetaDataManager;
300+
}
301+
299302
@Override
300303
public <T> T unwrap(Class<T> type) {
301304
// allow unwrapping into public super types

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

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@
1010
import static org.hibernate.validator.internal.engine.ValidatorFactoryConfigurationHelper.determineAllowOverridingMethodAlterParameterConstraint;
1111
import static org.hibernate.validator.internal.engine.ValidatorFactoryConfigurationHelper.determineAllowParallelMethodsDefineParameterConstraints;
1212
import static org.hibernate.validator.internal.engine.ValidatorFactoryConfigurationHelper.determineBeanMetaDataClassNormalizer;
13+
import static org.hibernate.validator.internal.engine.ValidatorFactoryConfigurationHelper.determineConstraintExpressionLanguageFeatureLevel;
1314
import static org.hibernate.validator.internal.engine.ValidatorFactoryConfigurationHelper.determineConstraintMappings;
1415
import static org.hibernate.validator.internal.engine.ValidatorFactoryConfigurationHelper.determineConstraintValidatorPayload;
15-
import static org.hibernate.validator.internal.engine.ValidatorFactoryConfigurationHelper.determineConstraintExpressionLanguageFeatureLevel;
1616
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;
@@ -49,7 +49,6 @@
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;
5352
import org.hibernate.validator.internal.engine.valueextraction.ValueExtractorManager;
5453
import org.hibernate.validator.internal.metadata.BeanMetaDataManager;
5554
import org.hibernate.validator.internal.metadata.BeanMetaDataManagerImpl;
@@ -166,9 +165,6 @@ public ValidatorFactoryImpl(ConfigurationState configurationState) {
166165
determineConstraintValidatorPayload( hibernateSpecificConfig ),
167166
determineConstraintExpressionLanguageFeatureLevel( hibernateSpecificConfig, properties ),
168167
determineCustomViolationExpressionLanguageFeatureLevel( hibernateSpecificConfig, properties ),
169-
( hibernateSpecificConfig != null && hibernateSpecificConfig.getProcessedBeansTrackingStrategy() != null )
170-
? hibernateSpecificConfig.getProcessedBeansTrackingStrategy()
171-
: new HasCascadablesProcessedBeansTrackingStrategy(),
172168
determineShowValidatedValuesInTraceLogs( hibernateSpecificConfig, properties ) );
173169

174170
ConstraintValidatorManager constraintValidatorManager = new ConstraintValidatorManagerImpl(

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

Lines changed: 1 addition & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
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;
1918
import org.hibernate.validator.internal.util.Contracts;
2019
import org.hibernate.validator.internal.util.ExecutableParameterNameProvider;
2120
import org.hibernate.validator.messageinterpolation.ExpressionLanguageFeatureLevel;
@@ -79,11 +78,6 @@ public class ValidatorFactoryScopedContext {
7978
*/
8079
private final ExpressionLanguageFeatureLevel customViolationExpressionLanguageFeatureLevel;
8180

82-
/**
83-
* Strategy used to enable or not processed beans tracking.
84-
*/
85-
private final ProcessedBeansTrackingStrategy processedBeansTrackingStrategy;
86-
8781
/**
8882
* The constraint validator initialization context.
8983
*/
@@ -105,11 +99,10 @@ public class ValidatorFactoryScopedContext {
10599
Object constraintValidatorPayload,
106100
ExpressionLanguageFeatureLevel constraintExpressionLanguageFeatureLevel,
107101
ExpressionLanguageFeatureLevel customViolationExpressionLanguageFeatureLevel,
108-
ProcessedBeansTrackingStrategy processedBeansTrackingStrategy,
109102
boolean showValidatedValuesInTraceLogs) {
110103
this( messageInterpolator, traversableResolver, parameterNameProvider, clockProvider, temporalValidationTolerance, scriptEvaluatorFactory, failFast,
111104
traversableResolverResultCacheEnabled, showValidatedValuesInTraceLogs, constraintValidatorPayload, constraintExpressionLanguageFeatureLevel,
112-
customViolationExpressionLanguageFeatureLevel, processedBeansTrackingStrategy,
105+
customViolationExpressionLanguageFeatureLevel,
113106
new HibernateConstraintValidatorInitializationContextImpl( scriptEvaluatorFactory, clockProvider,
114107
temporalValidationTolerance ) );
115108
}
@@ -125,7 +118,6 @@ public class ValidatorFactoryScopedContext {
125118
boolean showValidatedValuesInTraceLogs, Object constraintValidatorPayload,
126119
ExpressionLanguageFeatureLevel constraintExpressionLanguageFeatureLevel,
127120
ExpressionLanguageFeatureLevel customViolationExpressionLanguageFeatureLevel,
128-
ProcessedBeansTrackingStrategy processedBeanTrackingStrategy,
129121
HibernateConstraintValidatorInitializationContextImpl constraintValidatorInitializationContext) {
130122
this.messageInterpolator = messageInterpolator;
131123
this.traversableResolver = traversableResolver;
@@ -139,7 +131,6 @@ public class ValidatorFactoryScopedContext {
139131
this.constraintExpressionLanguageFeatureLevel = constraintExpressionLanguageFeatureLevel;
140132
this.customViolationExpressionLanguageFeatureLevel = customViolationExpressionLanguageFeatureLevel;
141133
this.showValidatedValuesInTraceLogs = showValidatedValuesInTraceLogs;
142-
this.processedBeansTrackingStrategy = processedBeanTrackingStrategy;
143134
this.constraintValidatorInitializationContext = constraintValidatorInitializationContext;
144135
}
145136

@@ -195,10 +186,6 @@ public boolean isShowValidatedValuesInTraceLogs() {
195186
return showValidatedValuesInTraceLogs;
196187
}
197188

198-
public ProcessedBeansTrackingStrategy getProcessedBeansTrackingStrategy() {
199-
return processedBeansTrackingStrategy;
200-
}
201-
202189
static class Builder {
203190
private final ValidatorFactoryScopedContext defaultContext;
204191

@@ -213,8 +200,6 @@ static class Builder {
213200
private Object constraintValidatorPayload;
214201
private ExpressionLanguageFeatureLevel constraintExpressionLanguageFeatureLevel;
215202
private ExpressionLanguageFeatureLevel customViolationExpressionLanguageFeatureLevel;
216-
private ProcessedBeansTrackingStrategy processedBeansTrackingStrategy;
217-
218203
private boolean showValidatedValuesInTraceLogs;
219204
private HibernateConstraintValidatorInitializationContextImpl constraintValidatorInitializationContext;
220205

@@ -234,7 +219,6 @@ static class Builder {
234219
this.constraintExpressionLanguageFeatureLevel = defaultContext.constraintExpressionLanguageFeatureLevel;
235220
this.customViolationExpressionLanguageFeatureLevel = defaultContext.customViolationExpressionLanguageFeatureLevel;
236221
this.showValidatedValuesInTraceLogs = defaultContext.showValidatedValuesInTraceLogs;
237-
this.processedBeansTrackingStrategy = defaultContext.processedBeansTrackingStrategy;
238222
this.constraintValidatorInitializationContext = defaultContext.constraintValidatorInitializationContext;
239223
}
240224

@@ -327,12 +311,6 @@ public ValidatorFactoryScopedContext.Builder setShowValidatedValuesInTraceLogs(
327311
return this;
328312
}
329313

330-
public ValidatorFactoryScopedContext.Builder setProcessedBeansTrackingStrategy(
331-
ProcessedBeansTrackingStrategy processedBeansTrackingStrategy) {
332-
this.processedBeansTrackingStrategy = processedBeansTrackingStrategy;
333-
return this;
334-
}
335-
336314
public ValidatorFactoryScopedContext build() {
337315
return new ValidatorFactoryScopedContext(
338316
messageInterpolator,
@@ -346,7 +324,6 @@ public ValidatorFactoryScopedContext build() {
346324
showValidatedValuesInTraceLogs, constraintValidatorPayload,
347325
constraintExpressionLanguageFeatureLevel,
348326
customViolationExpressionLanguageFeatureLevel,
349-
processedBeansTrackingStrategy,
350327
HibernateConstraintValidatorInitializationContextImpl.of(
351328
constraintValidatorInitializationContext,
352329
scriptEvaluatorFactory,

engine/src/main/java/org/hibernate/validator/internal/engine/tracking/HasCascadablesProcessedBeansTrackingStrategy.java

Lines changed: 0 additions & 31 deletions
This file was deleted.

engine/src/main/java/org/hibernate/validator/internal/engine/tracking/PredefinedScopeProcessedBeansTrackingStrategy.java

Lines changed: 39 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
*/
77
package org.hibernate.validator.internal.engine.tracking;
88

9-
import java.lang.reflect.Executable;
109
import java.lang.reflect.ParameterizedType;
1110
import java.lang.reflect.Type;
1211
import java.util.Collections;
@@ -15,22 +14,22 @@
1514
import java.util.Map;
1615
import java.util.Set;
1716

18-
import org.hibernate.validator.internal.metadata.PredefinedScopeBeanMetaDataManager;
1917
import org.hibernate.validator.internal.metadata.aggregated.BeanMetaData;
2018
import org.hibernate.validator.internal.metadata.aggregated.CascadingMetaData;
2119
import org.hibernate.validator.internal.metadata.aggregated.ContainerCascadingMetaData;
2220
import org.hibernate.validator.internal.metadata.facets.Cascadable;
21+
import org.hibernate.validator.internal.properties.Signature;
2322
import org.hibernate.validator.internal.util.CollectionHelper;
2423

2524
public class PredefinedScopeProcessedBeansTrackingStrategy implements ProcessedBeansTrackingStrategy {
2625

2726
private final Map<Class<?>, Boolean> trackingEnabledForBeans;
2827

29-
private final Map<Executable, Boolean> trackingEnabledForReturnValues;
28+
private final Map<Signature, Boolean> trackingEnabledForReturnValues;
3029

31-
private final Map<Executable, Boolean> trackingEnabledForParameters;
30+
private final Map<Signature, Boolean> trackingEnabledForParameters;
3231

33-
public PredefinedScopeProcessedBeansTrackingStrategy(PredefinedScopeBeanMetaDataManager beanMetaDataManager) {
32+
public PredefinedScopeProcessedBeansTrackingStrategy(Map<Class<?>, BeanMetaData<?>> rawBeanMetaDataMap) {
3433
// TODO: build the maps from the information inside the beanMetaDataManager
3534
// There is a good chance we will need a structure with the whole hierarchy of constraint classes.
3635
// That's something we could add to PredefinedScopeBeanMetaDataManager, as we are already doing similar things
@@ -39,24 +38,24 @@ public PredefinedScopeProcessedBeansTrackingStrategy(PredefinedScopeBeanMetaData
3938
// PredefinedScopeBeanMetaDataManager.
4039

4140
this.trackingEnabledForBeans = CollectionHelper.toImmutableMap(
42-
new TrackingEnabledStrategyBuilder( beanMetaDataManager ).build()
41+
new TrackingEnabledStrategyBuilder( rawBeanMetaDataMap ).build()
4342
);
4443
this.trackingEnabledForReturnValues = CollectionHelper.toImmutableMap( new HashMap<>() );
4544
this.trackingEnabledForParameters = CollectionHelper.toImmutableMap( new HashMap<>() );
4645
}
4746

4847
private static class TrackingEnabledStrategyBuilder {
49-
private final PredefinedScopeBeanMetaDataManager beanMetaDataManager;
48+
private final Map<Class<?>, BeanMetaData<?>> rawBeanMetaDataMap;
5049
private final Map<Class<?>, Boolean> classToBeanTrackingEnabled;
5150

52-
TrackingEnabledStrategyBuilder(PredefinedScopeBeanMetaDataManager beanMetaDataManager) {
53-
this.beanMetaDataManager = beanMetaDataManager;
54-
this.classToBeanTrackingEnabled = new HashMap<>( beanMetaDataManager.getBeanMetaData().size() );
51+
TrackingEnabledStrategyBuilder(Map<Class<?>, BeanMetaData<?>> rawBeanMetaDataMap) {
52+
this.rawBeanMetaDataMap = rawBeanMetaDataMap;
53+
this.classToBeanTrackingEnabled = CollectionHelper.newHashMap( rawBeanMetaDataMap.size() );
5554
}
5655

5756
public Map<Class<?>, Boolean> build() {
5857
final Set<Class<?>> beanClassesInPath = new HashSet<>();
59-
for ( BeanMetaData<?> beanMetadata : beanMetaDataManager.getBeanMetaData() ) {
58+
for ( BeanMetaData<?> beanMetadata : rawBeanMetaDataMap.values() ) {
6059
determineTrackingRequired( beanMetadata.getBeanClass(), beanClassesInPath );
6160
if ( !beanClassesInPath.isEmpty() ) {
6261
throw new IllegalStateException( "beanClassesInPath not empty" );
@@ -160,38 +159,38 @@ private boolean determineTrackingRequired(Class<?> beanClass, Set<Class<?>> bean
160159

161160
// TODO: is there a more concise way to do this?
162161
private <T> Set<Class<?>> getDirectCascadedBeanClasses(Class<T> beanClass ) {
163-
final BeanMetaData<T> beanMetaData = beanMetaDataManager.getBeanMetaData( beanClass );
164-
if ( beanMetaData.hasCascadables() ) {
165-
final Set<Class<?>> directCascadedBeanClasses = new HashSet<>();
166-
for ( Cascadable cascadable : beanMetaData.getCascadables() ) {
167-
final CascadingMetaData cascadingMetaData = cascadable.getCascadingMetaData();
168-
if ( cascadingMetaData.isContainer() ) {
169-
final ContainerCascadingMetaData containerCascadingMetaData = (ContainerCascadingMetaData) cascadingMetaData;
170-
if ( containerCascadingMetaData.getEnclosingType() instanceof ParameterizedType ) {
171-
ParameterizedType parameterizedType = (ParameterizedType) containerCascadingMetaData.getEnclosingType();
172-
for ( Type typeArgument : parameterizedType.getActualTypeArguments() ) {
173-
if ( typeArgument instanceof Class ) {
174-
directCascadedBeanClasses.add( (Class<?>) typeArgument );
175-
}
176-
else {
177-
throw new UnsupportedOperationException( "Only ParameterizedType values of type Class are supported" );
178-
}
162+
final BeanMetaData<?> beanMetaData = rawBeanMetaDataMap.get( beanClass );
163+
164+
if ( beanMetaData == null || !beanMetaData.hasCascadables() ) {
165+
return Collections.emptySet();
166+
}
167+
168+
final Set<Class<?>> directCascadedBeanClasses = new HashSet<>();
169+
for ( Cascadable cascadable : beanMetaData.getCascadables() ) {
170+
final CascadingMetaData cascadingMetaData = cascadable.getCascadingMetaData();
171+
if ( cascadingMetaData.isContainer() ) {
172+
final ContainerCascadingMetaData containerCascadingMetaData = (ContainerCascadingMetaData) cascadingMetaData;
173+
if ( containerCascadingMetaData.getEnclosingType() instanceof ParameterizedType ) {
174+
ParameterizedType parameterizedType = (ParameterizedType) containerCascadingMetaData.getEnclosingType();
175+
for ( Type typeArgument : parameterizedType.getActualTypeArguments() ) {
176+
if ( typeArgument instanceof Class ) {
177+
directCascadedBeanClasses.add( (Class<?>) typeArgument );
178+
}
179+
else {
180+
throw new UnsupportedOperationException( "Only ParameterizedType values of type Class are supported" );
179181
}
180-
}
181-
else {
182-
throw new UnsupportedOperationException( "Non-parameterized containers are not supported yet." );
183182
}
184183
}
185184
else {
186-
// TODO: For now, assume non-container Cascadables are always beans. Truee???
187-
directCascadedBeanClasses.add( (Class<?>) cascadable.getCascadableType() );
185+
throw new UnsupportedOperationException( "Non-parameterized containers are not supported yet." );
188186
}
189187
}
190-
return directCascadedBeanClasses;
191-
}
192-
else {
193-
return Collections.emptySet();
188+
else {
189+
// TODO: For now, assume non-container Cascadables are always beans. Truee???
190+
directCascadedBeanClasses.add( (Class<?>) cascadable.getCascadableType() );
191+
}
194192
}
193+
return directCascadedBeanClasses;
195194
}
196195

197196
private boolean register(Class<?> beanClass, boolean isBeanTrackingEnabled) {
@@ -212,21 +211,21 @@ public boolean isEnabledForBean(Class<?> rootBeanClass, boolean hasCascadables)
212211
}
213212

214213
@Override
215-
public boolean isEnabledForReturnValue(Executable executable, boolean hasCascadables) {
214+
public boolean isEnabledForReturnValue(Signature signature, boolean hasCascadables) {
216215
if ( !hasCascadables ) {
217216
return false;
218217
}
219218

220-
return trackingEnabledForReturnValues.getOrDefault( executable, true );
219+
return trackingEnabledForReturnValues.getOrDefault( signature, true );
221220
}
222221

223222
@Override
224-
public boolean isEnabledForParameters(Executable executable, boolean hasCascadables) {
223+
public boolean isEnabledForParameters(Signature signature, boolean hasCascadables) {
225224
if ( !hasCascadables ) {
226225
return false;
227226
}
228227

229-
return trackingEnabledForParameters.getOrDefault( executable, true );
228+
return trackingEnabledForParameters.getOrDefault( signature, true );
230229
}
231230

232231
@Override

engine/src/main/java/org/hibernate/validator/internal/engine/tracking/ProcessedBeansTrackingStrategy.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,15 @@
66
*/
77
package org.hibernate.validator.internal.engine.tracking;
88

9-
import java.lang.reflect.Executable;
9+
import org.hibernate.validator.internal.properties.Signature;
1010

1111
public interface ProcessedBeansTrackingStrategy {
1212

1313
boolean isEnabledForBean(Class<?> beanClass, boolean hasCascadables);
1414

15-
boolean isEnabledForReturnValue(Executable executable, boolean hasCascadables);
15+
boolean isEnabledForReturnValue(Signature signature, boolean hasCascadables);
1616

17-
boolean isEnabledForParameters(Executable executable, boolean hasCascadables);
17+
boolean isEnabledForParameters(Signature signature, boolean hasCascadables);
1818

1919
void clear();
2020
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ class BeanValidationContext<T> extends AbstractValidationContext<T> {
3737
BeanMetaData<T> rootBeanMetaData
3838
) {
3939
super( constraintValidatorManager, constraintValidatorFactory, validatorScopedContext, traversableResolver, constraintValidatorInitializationContext,
40-
rootBean, rootBeanClass, rootBeanMetaData, rootBeanMetaData.isTrackingRequired()
40+
rootBean, rootBeanClass, rootBeanMetaData, rootBeanMetaData.isTrackingEnabled()
4141
);
4242
}
4343

0 commit comments

Comments
 (0)