Skip to content

Commit 22323b4

Browse files
gbadnermarko-bekhta
authored andcommitted
HV-1831 : Wrap a BeanMetaData in a NonTrackedBeanMetaDataImpl if tracking is not required
1 parent c03f9d1 commit 22323b4

File tree

5 files changed

+144
-22
lines changed

5 files changed

+144
-22
lines changed

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

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,6 @@
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.PredefinedScopeProcessedBeansTrackingStrategy;
5352
import org.hibernate.validator.internal.engine.valueextraction.ValueExtractorManager;
5453
import org.hibernate.validator.internal.metadata.PredefinedScopeBeanMetaDataManager;
5554
import org.hibernate.validator.internal.metadata.core.ConstraintHelper;
@@ -211,7 +210,7 @@ public PredefinedScopeValidatorFactoryImpl(ConfigurationState configurationState
211210
buildMetaDataProviders( constraintCreationContext, xmlMetaDataProvider, constraintMappings ),
212211
methodValidationConfiguration,
213212
determineBeanMetaDataClassNormalizer( hibernateSpecificConfig ),
214-
hibernateSpecificConfig.getBeanClassesToInitialize()
213+
hibernateSpecificConfig
215214
);
216215

217216
this.validatorFactoryScopedContext = new ValidatorFactoryScopedContext(
@@ -227,9 +226,7 @@ public PredefinedScopeValidatorFactoryImpl(ConfigurationState configurationState
227226
determineConstraintValidatorPayload( hibernateSpecificConfig ),
228227
determineConstraintExpressionLanguageFeatureLevel( hibernateSpecificConfig, properties ),
229228
determineCustomViolationExpressionLanguageFeatureLevel( hibernateSpecificConfig, properties ),
230-
( hibernateSpecificConfig != null && hibernateSpecificConfig.getProcessedBeansTrackingStrategy() != null )
231-
? hibernateSpecificConfig.getProcessedBeansTrackingStrategy()
232-
: new PredefinedScopeProcessedBeansTrackingStrategy( beanMetaDataManager ),
229+
beanMetaDataManager.getProcessedBeansTrackingStrategy(),
233230
constraintValidatorInitializationContext );
234231

235232
if ( LOG.isDebugEnabled() ) {

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

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
import org.hibernate.validator.internal.engine.ConstraintViolationImpl;
1717
import org.hibernate.validator.internal.engine.constraintvalidation.ConstraintValidatorManager;
1818
import org.hibernate.validator.internal.engine.constraintvalidation.ConstraintViolationCreationContext;
19-
import org.hibernate.validator.internal.engine.tracking.ProcessedBeansTrackingStrategy;
2019
import org.hibernate.validator.internal.engine.valuecontext.ValueContext;
2120
import org.hibernate.validator.internal.metadata.aggregated.BeanMetaData;
2221

@@ -38,16 +37,10 @@ class BeanValidationContext<T> extends AbstractValidationContext<T> {
3837
BeanMetaData<T> rootBeanMetaData
3938
) {
4039
super( constraintValidatorManager, constraintValidatorFactory, validatorScopedContext, traversableResolver, constraintValidatorInitializationContext,
41-
rootBean, rootBeanClass, rootBeanMetaData, buildProcessedBeansTrackingEnabled( validatorScopedContext.getProcessedBeansTrackingStrategy(),
42-
rootBeanClass, rootBeanMetaData )
40+
rootBean, rootBeanClass, rootBeanMetaData, rootBeanMetaData.isTrackingRequired()
4341
);
4442
}
4543

46-
private static boolean buildProcessedBeansTrackingEnabled(ProcessedBeansTrackingStrategy processedBeansTrackingStrategy, Class<?> rootBeanClass,
47-
BeanMetaData<?> rootBeanMetaData) {
48-
return processedBeansTrackingStrategy.isEnabledForBean( rootBeanClass, rootBeanMetaData.hasCascadables() );
49-
}
50-
5144
@Override
5245
protected ConstraintViolation<T> createConstraintViolation(
5346
String messageTemplate, String interpolatedMessage, Path propertyPath,

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

Lines changed: 37 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import java.util.Collections;
1616
import java.util.Iterator;
1717
import java.util.List;
18+
import java.util.Map;
1819
import java.util.Optional;
1920
import java.util.Set;
2021
import java.util.concurrent.ConcurrentHashMap;
@@ -31,12 +32,16 @@
3132

3233
import org.hibernate.validator.internal.engine.ConstraintCreationContext;
3334
import org.hibernate.validator.internal.engine.MethodValidationConfiguration;
35+
import org.hibernate.validator.internal.engine.PredefinedScopeConfigurationImpl;
3436
import org.hibernate.validator.internal.engine.groups.Sequence;
3537
import org.hibernate.validator.internal.engine.groups.ValidationOrderGenerator;
38+
import org.hibernate.validator.internal.engine.tracking.PredefinedScopeProcessedBeansTrackingStrategy;
39+
import org.hibernate.validator.internal.engine.tracking.ProcessedBeansTrackingStrategy;
3640
import org.hibernate.validator.internal.metadata.aggregated.BeanMetaData;
3741
import org.hibernate.validator.internal.metadata.aggregated.BeanMetaDataBuilder;
3842
import org.hibernate.validator.internal.metadata.aggregated.BeanMetaDataImpl;
3943
import org.hibernate.validator.internal.metadata.aggregated.ExecutableMetaData;
44+
import org.hibernate.validator.internal.metadata.aggregated.NonTrackedBeanMetaDataImpl;
4045
import org.hibernate.validator.internal.metadata.aggregated.PropertyMetaData;
4146
import org.hibernate.validator.internal.metadata.core.AnnotationProcessingOptions;
4247
import org.hibernate.validator.internal.metadata.core.AnnotationProcessingOptionsImpl;
@@ -61,15 +66,17 @@ public class PredefinedScopeBeanMetaDataManager implements BeanMetaDataManager {
6166
*/
6267
private final ConcurrentMap<Class<?>, BeanMetaData<?>> beanMetaDataMap = new ConcurrentHashMap<>();
6368

69+
private final ProcessedBeansTrackingStrategy processedBeansTrackingStrategy;
70+
6471
public PredefinedScopeBeanMetaDataManager(ConstraintCreationContext constraintCreationContext,
65-
ExecutableHelper executableHelper,
66-
ExecutableParameterNameProvider parameterNameProvider,
67-
JavaBeanHelper javaBeanHelper,
68-
ValidationOrderGenerator validationOrderGenerator,
69-
List<MetaDataProvider> optionalMetaDataProviders,
70-
MethodValidationConfiguration methodValidationConfiguration,
71-
BeanMetaDataClassNormalizer beanMetaDataClassNormalizer,
72-
Set<Class<?>> beanClassesToInitialize) {
72+
ExecutableHelper executableHelper,
73+
ExecutableParameterNameProvider parameterNameProvider,
74+
JavaBeanHelper javaBeanHelper,
75+
ValidationOrderGenerator validationOrderGenerator,
76+
List<MetaDataProvider> optionalMetaDataProviders,
77+
MethodValidationConfiguration methodValidationConfiguration,
78+
BeanMetaDataClassNormalizer beanMetaDataClassNormalizer,
79+
PredefinedScopeConfigurationImpl hibernateSpecificConfig) {
7380
AnnotationProcessingOptions annotationProcessingOptions = getAnnotationProcessingOptionsFromNonDefaultProviders( optionalMetaDataProviders );
7481
AnnotationMetaDataProvider defaultProvider = new AnnotationMetaDataProvider(
7582
constraintCreationContext,
@@ -85,7 +92,7 @@ public PredefinedScopeBeanMetaDataManager(ConstraintCreationContext constraintCr
8592
metaDataProviders.add( defaultProvider );
8693
metaDataProviders.addAll( optionalMetaDataProviders );
8794

88-
for ( Class<?> validatedClass : beanClassesToInitialize ) {
95+
for ( Class<?> validatedClass : hibernateSpecificConfig.getBeanClassesToInitialize() ) {
8996
Class<?> normalizedValidatedClass = beanMetaDataClassNormalizer.normalize( validatedClass );
9097

9198
@SuppressWarnings("unchecked")
@@ -105,6 +112,23 @@ public PredefinedScopeBeanMetaDataManager(ConstraintCreationContext constraintCr
105112
}
106113

107114
this.beanMetaDataClassNormalizer = beanMetaDataClassNormalizer;
115+
116+
if ( hibernateSpecificConfig.getProcessedBeansTrackingStrategy() != null ) {
117+
this.processedBeansTrackingStrategy = hibernateSpecificConfig.getProcessedBeansTrackingStrategy();
118+
}
119+
else {
120+
this.processedBeansTrackingStrategy = new PredefinedScopeProcessedBeansTrackingStrategy(
121+
this
122+
);
123+
}
124+
// Wrap the BeanMetaData objects with NonTrackedBeanMetaDataImpl if tracking is not required.
125+
for ( Map.Entry<Class<?>, BeanMetaData<?>> entry : beanMetaDataMap.entrySet() ) {
126+
final Class<?> beanClass = entry.getKey();
127+
final BeanMetaData<?> beanMetaData = entry.getValue();
128+
if ( ! processedBeansTrackingStrategy.isEnabledForBean( beanClass, beanMetaData.hasCascadables() ) ) {
129+
beanMetaDataMap.put( beanClass, new NonTrackedBeanMetaDataImpl<>( beanMetaData ) );
130+
}
131+
}
108132
}
109133

110134
@SuppressWarnings("unchecked")
@@ -124,6 +148,10 @@ public Collection<BeanMetaData<?>> getBeanMetaData() {
124148
return beanMetaDataMap.values();
125149
}
126150

151+
public ProcessedBeansTrackingStrategy getProcessedBeansTrackingStrategy() {
152+
return processedBeansTrackingStrategy;
153+
}
154+
127155
@Override
128156
public void clear() {
129157
beanMetaDataMap.clear();

engine/src/main/java/org/hibernate/validator/internal/metadata/aggregated/BeanMetaData.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,4 +113,12 @@ public interface BeanMetaData<T> extends Validatable {
113113
* element itself and goes up the hierarchy chain. Interfaces are not included.
114114
*/
115115
List<Class<? super T>> getClassHierarchy();
116+
117+
/**
118+
* @return {@code true} if the bean class is required to be tracked; {@code false} otherwise.
119+
*/
120+
default boolean isTrackingRequired() {
121+
// TODO: is this the correct return value for UninitializedBeanMetaData???
122+
return true;
123+
}
116124
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
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.metadata.aggregated;
8+
9+
import java.lang.reflect.Executable;
10+
import java.util.Iterator;
11+
import java.util.List;
12+
import java.util.Optional;
13+
import java.util.Set;
14+
import javax.validation.metadata.BeanDescriptor;
15+
16+
import org.hibernate.validator.internal.engine.groups.Sequence;
17+
import org.hibernate.validator.internal.metadata.core.MetaConstraint;
18+
import org.hibernate.validator.internal.metadata.facets.Cascadable;
19+
20+
public class NonTrackedBeanMetaDataImpl<T> implements BeanMetaData<T> {
21+
private final BeanMetaData<T> beanMetaData;
22+
23+
public NonTrackedBeanMetaDataImpl(BeanMetaData<T> beanMetaData) {
24+
this.beanMetaData = beanMetaData;
25+
}
26+
27+
@Override
28+
public Class<T> getBeanClass() {
29+
return beanMetaData.getBeanClass();
30+
}
31+
32+
@Override
33+
public boolean hasConstraints() {
34+
return beanMetaData.hasConstraints();
35+
}
36+
37+
@Override
38+
public BeanDescriptor getBeanDescriptor() {
39+
return beanMetaData.getBeanDescriptor();
40+
}
41+
42+
@Override
43+
public PropertyMetaData getMetaDataFor(String propertyName) {
44+
return beanMetaData.getMetaDataFor( propertyName );
45+
}
46+
47+
@Override
48+
public List<Class<?>> getDefaultGroupSequence(T beanState) {
49+
return beanMetaData.getDefaultGroupSequence( beanState );
50+
}
51+
52+
@Override
53+
public Iterator<Sequence> getDefaultValidationSequence(T beanState) {
54+
return beanMetaData.getDefaultValidationSequence( beanState );
55+
}
56+
57+
@Override
58+
public boolean isDefaultGroupSequenceRedefined() {
59+
return beanMetaData.isDefaultGroupSequenceRedefined();
60+
}
61+
62+
@Override
63+
public Set<MetaConstraint<?>> getMetaConstraints() {
64+
return beanMetaData.getMetaConstraints();
65+
}
66+
67+
@Override
68+
public Set<MetaConstraint<?>> getDirectMetaConstraints() {
69+
return beanMetaData.getDirectMetaConstraints();
70+
}
71+
72+
@Override
73+
public Optional<ExecutableMetaData> getMetaDataFor(Executable executable) throws IllegalArgumentException {
74+
return beanMetaData.getMetaDataFor( executable );
75+
}
76+
77+
@Override
78+
public List<Class<? super T>> getClassHierarchy() {
79+
return beanMetaData.getClassHierarchy();
80+
}
81+
82+
@Override
83+
public Iterable<Cascadable> getCascadables() {
84+
return beanMetaData.getCascadables();
85+
}
86+
87+
@Override
88+
public boolean hasCascadables() {
89+
return beanMetaData.hasCascadables();
90+
}
91+
92+
@Override
93+
public boolean isTrackingRequired() {
94+
return false;
95+
}
96+
}

0 commit comments

Comments
 (0)