Skip to content

Commit dccd3cf

Browse files
gsmetmarko-bekhta
authored andcommitted
HV-1831 Create ProcessedBeansTrackingVoter contract
This contract allows to override the default bean process tracking behavior without exposing our internal structures. It needs a bit more love on the config side so that we can define it via XML too and some documentation.
1 parent 4c5db57 commit dccd3cf

16 files changed

+250
-64
lines changed

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,15 @@
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;
2928
import org.hibernate.validator.messageinterpolation.ExpressionLanguageFeatureLevel;
30-
import org.hibernate.validator.spi.messageinterpolation.LocaleResolver;
3129
import org.hibernate.validator.metadata.BeanMetaDataClassNormalizer;
30+
import org.hibernate.validator.spi.messageinterpolation.LocaleResolver;
3231
import org.hibernate.validator.spi.nodenameprovider.PropertyNodeNameProvider;
3332
import org.hibernate.validator.spi.properties.GetterPropertySelectionStrategy;
3433
import org.hibernate.validator.spi.resourceloading.ResourceBundleLocator;
3534
import org.hibernate.validator.spi.scripting.ScriptEvaluator;
3635
import org.hibernate.validator.spi.scripting.ScriptEvaluatorFactory;
36+
import org.hibernate.validator.spi.tracking.ProcessedBeansTrackingVoter;
3737

3838
/**
3939
* Base interface for Hibernate Validator specific configurations.
@@ -504,5 +504,5 @@ default S locales(Locale... locales) {
504504
S showValidatedValuesInTraceLogs(boolean enabled);
505505

506506
@Incubating
507-
S processedBeansTrackingStrategy(ProcessedBeansTrackingStrategy processedBeanTrackingStrategy);
507+
S processedBeansTrackingVoter(ProcessedBeansTrackingVoter processedBeanTrackingVoter);
508508
}

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

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@
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;
4746
import org.hibernate.validator.internal.engine.valueextraction.ValueExtractorDescriptor;
4847
import org.hibernate.validator.internal.engine.valueextraction.ValueExtractorManager;
4948
import org.hibernate.validator.internal.properties.DefaultGetterPropertySelectionStrategy;
@@ -68,6 +67,7 @@
6867
import org.hibernate.validator.spi.properties.GetterPropertySelectionStrategy;
6968
import org.hibernate.validator.spi.resourceloading.ResourceBundleLocator;
7069
import org.hibernate.validator.spi.scripting.ScriptEvaluatorFactory;
70+
import org.hibernate.validator.spi.tracking.ProcessedBeansTrackingVoter;
7171

7272
/**
7373
* Hibernate specific {@code Configuration} implementation.
@@ -134,7 +134,7 @@ public abstract class AbstractConfigurationImpl<T extends BaseHibernateValidator
134134
private BeanMetaDataClassNormalizer beanMetaDataClassNormalizer;
135135
private ExpressionLanguageFeatureLevel constraintExpressionLanguageFeatureLevel;
136136
private ExpressionLanguageFeatureLevel customViolationExpressionLanguageFeatureLevel;
137-
private ProcessedBeansTrackingStrategy processedBeansTrackingStrategy;
137+
private ProcessedBeansTrackingVoter processedBeansTrackingVoter;
138138
private boolean showValidatedValuesInTraceLogs;
139139

140140
protected AbstractConfigurationImpl(BootstrapState state) {
@@ -675,19 +675,19 @@ public final boolean getShowValidatedValuesInTraceLogs() {
675675
}
676676

677677
@Override
678-
public T processedBeansTrackingStrategy(ProcessedBeansTrackingStrategy processedBeansTrackingStrategy) {
678+
public T processedBeansTrackingVoter(ProcessedBeansTrackingVoter processedBeansTrackingVoter) {
679679
if ( LOG.isDebugEnabled() ) {
680-
if ( processedBeansTrackingStrategy != null ) {
681-
LOG.debug( "Setting custom ProcessedBeansTrackingStrategy of type " + processedBeansTrackingStrategy.getClass()
680+
if ( processedBeansTrackingVoter != null ) {
681+
LOG.debug( "Setting custom ProcessedBeansTrackingVoter of type " + processedBeansTrackingVoter.getClass()
682682
.getName() );
683683
}
684684
}
685-
this.processedBeansTrackingStrategy = processedBeansTrackingStrategy;
685+
this.processedBeansTrackingVoter = processedBeansTrackingVoter;
686686
return thisAsT();
687687
}
688688

689-
public ProcessedBeansTrackingStrategy getProcessedBeansTrackingStrategy() {
690-
return processedBeansTrackingStrategy;
689+
public ProcessedBeansTrackingVoter getProcessedBeansTrackingVoter() {
690+
return processedBeansTrackingVoter;
691691
}
692692

693693
public final Set<DefaultConstraintMapping> getProgrammaticMappings() {

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
import org.hibernate.validator.internal.engine.constraintvalidation.HibernateConstraintValidatorInitializationContextImpl;
5050
import org.hibernate.validator.internal.engine.constraintvalidation.PredefinedScopeConstraintValidatorManagerImpl;
5151
import org.hibernate.validator.internal.engine.groups.ValidationOrderGenerator;
52+
import org.hibernate.validator.internal.engine.tracking.DefaultProcessedBeansTrackingVoter;
5253
import org.hibernate.validator.internal.engine.valueextraction.ValueExtractorManager;
5354
import org.hibernate.validator.internal.metadata.PredefinedScopeBeanMetaDataManager;
5455
import org.hibernate.validator.internal.metadata.core.ConstraintHelper;
@@ -210,6 +211,9 @@ public PredefinedScopeValidatorFactoryImpl(ConfigurationState configurationState
210211
buildMetaDataProviders( constraintCreationContext, xmlMetaDataProvider, constraintMappings ),
211212
methodValidationConfiguration,
212213
determineBeanMetaDataClassNormalizer( hibernateSpecificConfig ),
214+
( hibernateSpecificConfig != null && hibernateSpecificConfig.getProcessedBeansTrackingVoter() != null )
215+
? hibernateSpecificConfig.getProcessedBeansTrackingVoter()
216+
: new DefaultProcessedBeansTrackingVoter(),
213217
hibernateSpecificConfig
214218
);
215219

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

Lines changed: 10 additions & 1 deletion
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.DefaultProcessedBeansTrackingVoter;
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;
@@ -69,6 +70,7 @@
6970
import org.hibernate.validator.spi.nodenameprovider.PropertyNodeNameProvider;
7071
import org.hibernate.validator.spi.properties.GetterPropertySelectionStrategy;
7172
import org.hibernate.validator.spi.scripting.ScriptEvaluatorFactory;
73+
import org.hibernate.validator.spi.tracking.ProcessedBeansTrackingVoter;
7274

7375
/**
7476
* Factory returning initialized {@code Validator} instances. This is the Hibernate Validator default
@@ -134,6 +136,8 @@ public class ValidatorFactoryImpl implements HibernateValidatorFactory {
134136

135137
private final ValidationOrderGenerator validationOrderGenerator;
136138

139+
private final ProcessedBeansTrackingVoter processedBeansTrackingVoter;
140+
137141
public ValidatorFactoryImpl(ConfigurationState configurationState) {
138142
ClassLoader externalClassLoader = determineExternalClassLoader( configurationState );
139143

@@ -225,6 +229,10 @@ public ValidatorFactoryImpl(ConfigurationState configurationState) {
225229
this.xmlMetaDataProvider = null;
226230
}
227231

232+
this.processedBeansTrackingVoter = ( hibernateSpecificConfig != null && hibernateSpecificConfig.getProcessedBeansTrackingVoter() != null )
233+
? hibernateSpecificConfig.getProcessedBeansTrackingVoter()
234+
: new DefaultProcessedBeansTrackingVoter();
235+
228236
if ( LOG.isDebugEnabled() ) {
229237
logValidatorFactoryScopedConfiguration( validatorFactoryScopedContext );
230238
}
@@ -348,7 +356,8 @@ Validator createValidator(ConstraintValidatorFactory constraintValidatorFactory,
348356
beanMetadataClassNormalizer,
349357
validationOrderGenerator,
350358
buildMetaDataProviders(),
351-
methodValidationConfiguration
359+
methodValidationConfiguration,
360+
processedBeansTrackingVoter
352361
)
353362
);
354363

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
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 org.hibernate.validator.spi.tracking.ProcessedBeansTrackingVoter;
10+
11+
public class DefaultProcessedBeansTrackingVoter implements ProcessedBeansTrackingVoter {
12+
13+
@Override
14+
public Vote isEnabledForBean(Class<?> beanClass, boolean hasCascadables) {
15+
return Vote.DEFAULT;
16+
}
17+
18+
@Override
19+
public Vote isEnabledForReturnValue(Class<?> beanClass, String name, Class<?>[] parameterTypes, boolean hasCascadables) {
20+
return Vote.DEFAULT;
21+
}
22+
23+
@Override
24+
public Vote isEnabledForParameters(Class<?> beanClass, String name, Class<?>[] parameterTypes, boolean hasCascadables) {
25+
return Vote.DEFAULT;
26+
}
27+
}

engine/src/main/java/org/hibernate/validator/internal/metadata/BeanMetaDataManagerImpl.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import org.hibernate.validator.internal.util.classhierarchy.ClassHierarchyHelper;
3636
import org.hibernate.validator.internal.util.stereotypes.Immutable;
3737
import org.hibernate.validator.metadata.BeanMetaDataClassNormalizer;
38+
import org.hibernate.validator.spi.tracking.ProcessedBeansTrackingVoter;
3839

3940
/**
4041
* This manager is in charge of providing all constraint related meta data
@@ -97,6 +98,8 @@ public class BeanMetaDataManagerImpl implements BeanMetaDataManager {
9798

9899
private final ValidationOrderGenerator validationOrderGenerator;
99100

101+
private final ProcessedBeansTrackingVoter processedBeansTrackingVoter;
102+
100103
/**
101104
* the three properties in this field affect the invocation of rules associated to section 4.5.5
102105
* of the specification. By default they are all false, if true they allow
@@ -111,14 +114,15 @@ public BeanMetaDataManagerImpl(ConstraintCreationContext constraintCreationConte
111114
BeanMetaDataClassNormalizer beanMetaDataClassNormalizer,
112115
ValidationOrderGenerator validationOrderGenerator,
113116
List<MetaDataProvider> optionalMetaDataProviders,
114-
MethodValidationConfiguration methodValidationConfiguration) {
117+
MethodValidationConfiguration methodValidationConfiguration,
118+
ProcessedBeansTrackingVoter processedBeansTrackingVoter) {
115119
this.constraintCreationContext = constraintCreationContext;
116120
this.executableHelper = executableHelper;
117121
this.parameterNameProvider = parameterNameProvider;
118122
this.beanMetaDataClassNormalizer = beanMetaDataClassNormalizer;
119123
this.validationOrderGenerator = validationOrderGenerator;
120-
121124
this.methodValidationConfiguration = methodValidationConfiguration;
125+
this.processedBeansTrackingVoter = processedBeansTrackingVoter;
122126

123127
this.beanMetaDataCache = new ConcurrentReferenceHashMap<>(
124128
DEFAULT_INITIAL_CAPACITY,
@@ -195,7 +199,8 @@ public int numberOfCachedBeanMetaDataInstances() {
195199
private <T> BeanMetaDataImpl<T> createBeanMetaData(Class<T> clazz) {
196200
BeanMetaDataBuilder<T> builder = BeanMetaDataBuilder.getInstance(
197201
constraintCreationContext, executableHelper, parameterNameProvider,
198-
validationOrderGenerator, clazz, methodValidationConfiguration );
202+
validationOrderGenerator, clazz, methodValidationConfiguration,
203+
processedBeansTrackingVoter );
199204

200205
for ( MetaDataProvider provider : metaDataProviders ) {
201206
for ( BeanConfiguration<? super T> beanConfiguration : getBeanConfigurationForHierarchy( provider, clazz ) ) {

engine/src/main/java/org/hibernate/validator/internal/metadata/PredefinedScopeBeanMetaDataManager.java

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
import org.hibernate.validator.internal.util.classhierarchy.ClassHierarchyHelper;
5757
import org.hibernate.validator.internal.util.classhierarchy.Filters;
5858
import org.hibernate.validator.metadata.BeanMetaDataClassNormalizer;
59+
import org.hibernate.validator.spi.tracking.ProcessedBeansTrackingVoter;
5960

6061
public class PredefinedScopeBeanMetaDataManager implements BeanMetaDataManager {
6162

@@ -76,6 +77,7 @@ public PredefinedScopeBeanMetaDataManager(ConstraintCreationContext constraintCr
7677
List<MetaDataProvider> optionalMetaDataProviders,
7778
MethodValidationConfiguration methodValidationConfiguration,
7879
BeanMetaDataClassNormalizer beanMetaDataClassNormalizer,
80+
ProcessedBeansTrackingVoter processedBeansTrackingVoter,
7981
PredefinedScopeConfigurationImpl hibernateSpecificConfig) {
8082
AnnotationProcessingOptions annotationProcessingOptions = getAnnotationProcessingOptionsFromNonDefaultProviders( optionalMetaDataProviders );
8183
AnnotationMetaDataProvider defaultProvider = new AnnotationMetaDataProvider(
@@ -108,24 +110,19 @@ public PredefinedScopeBeanMetaDataManager(ConstraintCreationContext constraintCr
108110
rawBeanMetaDataMap.put( hierarchyElement,
109111
createBeanMetaData( constraintCreationContext, executableHelper, parameterNameProvider,
110112
javaBeanHelper, validationOrderGenerator, optionalMetaDataProviders, methodValidationConfiguration,
111-
metaDataProviders, hierarchyElement ) );
113+
processedBeansTrackingVoter, metaDataProviders, hierarchyElement ) );
112114
}
113115
}
114116

115117
this.beanMetaDataClassNormalizer = beanMetaDataClassNormalizer;
116-
117-
if ( hibernateSpecificConfig.getProcessedBeansTrackingStrategy() != null ) {
118-
this.processedBeansTrackingStrategy = hibernateSpecificConfig.getProcessedBeansTrackingStrategy();
119-
}
120-
else {
121-
this.processedBeansTrackingStrategy = new PredefinedScopeProcessedBeansTrackingStrategy(
122-
rawBeanMetaDataMap
123-
);
124-
}
118+
this.processedBeansTrackingStrategy = new PredefinedScopeProcessedBeansTrackingStrategy(
119+
rawBeanMetaDataMap
120+
);
125121

126122
// Inject the processed beans tracking information into the BeanMetaData objects
127-
for ( Map.Entry<Class<?>, BeanMetaData<?>> rawBeanMetaDataEntry : rawBeanMetaDataMap.entrySet() ) {
128-
beanMetaDataMap.put( rawBeanMetaDataEntry.getKey(), injectTrackingInformation( rawBeanMetaDataEntry.getValue(), processedBeansTrackingStrategy ) );
123+
for ( Map.Entry<Class<?>, BeanMetaData<?>> rawBeanMetaDataEntry : rawBeanMetaDataMap.entrySet() ) {
124+
beanMetaDataMap.put( rawBeanMetaDataEntry.getKey(),
125+
injectTrackingInformation( rawBeanMetaDataEntry.getValue(), processedBeansTrackingStrategy, processedBeansTrackingVoter ) );
129126
}
130127
}
131128

@@ -171,11 +168,13 @@ private static <T> BeanMetaDataImpl<T> createBeanMetaData(ConstraintCreationCont
171168
ValidationOrderGenerator validationOrderGenerator,
172169
List<MetaDataProvider> optionalMetaDataProviders,
173170
MethodValidationConfiguration methodValidationConfiguration,
171+
ProcessedBeansTrackingVoter processedBeansTrackingVoter,
174172
List<MetaDataProvider> metaDataProviders,
175173
Class<T> clazz) {
176174
BeanMetaDataBuilder<T> builder = BeanMetaDataBuilder.getInstance(
177175
constraintCreationContext, executableHelper, parameterNameProvider,
178-
validationOrderGenerator, clazz, methodValidationConfiguration );
176+
validationOrderGenerator, clazz, methodValidationConfiguration,
177+
processedBeansTrackingVoter );
179178

180179
for ( MetaDataProvider provider : metaDataProviders ) {
181180
for ( BeanConfiguration<? super T> beanConfiguration : getBeanConfigurationForHierarchy( provider, clazz ) ) {
@@ -221,8 +220,9 @@ private static <T> List<BeanConfiguration<? super T>> getBeanConfigurationForHie
221220
}
222221

223222
private static <T> BeanMetaData<T> injectTrackingInformation(BeanMetaData<T> rawBeanMetaData,
224-
ProcessedBeansTrackingStrategy processedBeansTrackingStrategy) {
225-
return new BeanMetaDataImpl<T>( (BeanMetaDataImpl<T>) rawBeanMetaData, processedBeansTrackingStrategy );
223+
ProcessedBeansTrackingStrategy processedBeansTrackingStrategy,
224+
ProcessedBeansTrackingVoter processedBeansTrackingVoter) {
225+
return new BeanMetaDataImpl<T>( (BeanMetaDataImpl<T>) rawBeanMetaData, processedBeansTrackingStrategy, processedBeansTrackingVoter );
226226
}
227227

228228
private static class UninitializedBeanMetaData<T> implements BeanMetaData<T> {

0 commit comments

Comments
 (0)