15
15
import java .util .Collections ;
16
16
import java .util .Iterator ;
17
17
import java .util .List ;
18
+ import java .util .Map ;
18
19
import java .util .Optional ;
19
20
import java .util .Set ;
20
21
import java .util .concurrent .ConcurrentHashMap ;
31
32
32
33
import org .hibernate .validator .internal .engine .ConstraintCreationContext ;
33
34
import org .hibernate .validator .internal .engine .MethodValidationConfiguration ;
35
+ import org .hibernate .validator .internal .engine .PredefinedScopeConfigurationImpl ;
34
36
import org .hibernate .validator .internal .engine .groups .Sequence ;
35
37
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 ;
36
40
import org .hibernate .validator .internal .metadata .aggregated .BeanMetaData ;
37
41
import org .hibernate .validator .internal .metadata .aggregated .BeanMetaDataBuilder ;
38
42
import org .hibernate .validator .internal .metadata .aggregated .BeanMetaDataImpl ;
39
43
import org .hibernate .validator .internal .metadata .aggregated .ExecutableMetaData ;
44
+ import org .hibernate .validator .internal .metadata .aggregated .NonTrackedBeanMetaDataImpl ;
40
45
import org .hibernate .validator .internal .metadata .aggregated .PropertyMetaData ;
41
46
import org .hibernate .validator .internal .metadata .core .AnnotationProcessingOptions ;
42
47
import org .hibernate .validator .internal .metadata .core .AnnotationProcessingOptionsImpl ;
@@ -61,15 +66,17 @@ public class PredefinedScopeBeanMetaDataManager implements BeanMetaDataManager {
61
66
*/
62
67
private final ConcurrentMap <Class <?>, BeanMetaData <?>> beanMetaDataMap = new ConcurrentHashMap <>();
63
68
69
+ private final ProcessedBeansTrackingStrategy processedBeansTrackingStrategy ;
70
+
64
71
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 ) {
73
80
AnnotationProcessingOptions annotationProcessingOptions = getAnnotationProcessingOptionsFromNonDefaultProviders ( optionalMetaDataProviders );
74
81
AnnotationMetaDataProvider defaultProvider = new AnnotationMetaDataProvider (
75
82
constraintCreationContext ,
@@ -85,7 +92,7 @@ public PredefinedScopeBeanMetaDataManager(ConstraintCreationContext constraintCr
85
92
metaDataProviders .add ( defaultProvider );
86
93
metaDataProviders .addAll ( optionalMetaDataProviders );
87
94
88
- for ( Class <?> validatedClass : beanClassesToInitialize ) {
95
+ for ( Class <?> validatedClass : hibernateSpecificConfig . getBeanClassesToInitialize () ) {
89
96
Class <?> normalizedValidatedClass = beanMetaDataClassNormalizer .normalize ( validatedClass );
90
97
91
98
@ SuppressWarnings ("unchecked" )
@@ -105,6 +112,23 @@ public PredefinedScopeBeanMetaDataManager(ConstraintCreationContext constraintCr
105
112
}
106
113
107
114
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
+ }
108
132
}
109
133
110
134
@ SuppressWarnings ("unchecked" )
@@ -124,6 +148,10 @@ public Collection<BeanMetaData<?>> getBeanMetaData() {
124
148
return beanMetaDataMap .values ();
125
149
}
126
150
151
+ public ProcessedBeansTrackingStrategy getProcessedBeansTrackingStrategy () {
152
+ return processedBeansTrackingStrategy ;
153
+ }
154
+
127
155
@ Override
128
156
public void clear () {
129
157
beanMetaDataMap .clear ();
0 commit comments