6
6
*/
7
7
package org .hibernate .validator .internal .engine .tracking ;
8
8
9
- import java .lang .reflect .Executable ;
10
9
import java .lang .reflect .ParameterizedType ;
11
10
import java .lang .reflect .Type ;
12
11
import java .util .Collections ;
15
14
import java .util .Map ;
16
15
import java .util .Set ;
17
16
18
- import org .hibernate .validator .internal .metadata .PredefinedScopeBeanMetaDataManager ;
19
17
import org .hibernate .validator .internal .metadata .aggregated .BeanMetaData ;
20
18
import org .hibernate .validator .internal .metadata .aggregated .CascadingMetaData ;
21
19
import org .hibernate .validator .internal .metadata .aggregated .ContainerCascadingMetaData ;
22
20
import org .hibernate .validator .internal .metadata .facets .Cascadable ;
21
+ import org .hibernate .validator .internal .properties .Signature ;
23
22
import org .hibernate .validator .internal .util .CollectionHelper ;
24
23
25
24
public class PredefinedScopeProcessedBeansTrackingStrategy implements ProcessedBeansTrackingStrategy {
26
25
27
26
private final Map <Class <?>, Boolean > trackingEnabledForBeans ;
28
27
29
- private final Map <Executable , Boolean > trackingEnabledForReturnValues ;
28
+ private final Map <Signature , Boolean > trackingEnabledForReturnValues ;
30
29
31
- private final Map <Executable , Boolean > trackingEnabledForParameters ;
30
+ private final Map <Signature , Boolean > trackingEnabledForParameters ;
32
31
33
- public PredefinedScopeProcessedBeansTrackingStrategy (PredefinedScopeBeanMetaDataManager beanMetaDataManager ) {
32
+ public PredefinedScopeProcessedBeansTrackingStrategy (Map < Class <?>, BeanMetaData <?>> rawBeanMetaDataMap ) {
34
33
// TODO: build the maps from the information inside the beanMetaDataManager
35
34
// There is a good chance we will need a structure with the whole hierarchy of constraint classes.
36
35
// That's something we could add to PredefinedScopeBeanMetaDataManager, as we are already doing similar things
@@ -39,24 +38,24 @@ public PredefinedScopeProcessedBeansTrackingStrategy(PredefinedScopeBeanMetaData
39
38
// PredefinedScopeBeanMetaDataManager.
40
39
41
40
this .trackingEnabledForBeans = CollectionHelper .toImmutableMap (
42
- new TrackingEnabledStrategyBuilder ( beanMetaDataManager ).build ()
41
+ new TrackingEnabledStrategyBuilder ( rawBeanMetaDataMap ).build ()
43
42
);
44
43
this .trackingEnabledForReturnValues = CollectionHelper .toImmutableMap ( new HashMap <>() );
45
44
this .trackingEnabledForParameters = CollectionHelper .toImmutableMap ( new HashMap <>() );
46
45
}
47
46
48
47
private static class TrackingEnabledStrategyBuilder {
49
- private final PredefinedScopeBeanMetaDataManager beanMetaDataManager ;
48
+ private final Map < Class <?>, BeanMetaData <?>> rawBeanMetaDataMap ;
50
49
private final Map <Class <?>, Boolean > classToBeanTrackingEnabled ;
51
50
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 () );
55
54
}
56
55
57
56
public Map <Class <?>, Boolean > build () {
58
57
final Set <Class <?>> beanClassesInPath = new HashSet <>();
59
- for ( BeanMetaData <?> beanMetadata : beanMetaDataManager . getBeanMetaData () ) {
58
+ for ( BeanMetaData <?> beanMetadata : rawBeanMetaDataMap . values () ) {
60
59
determineTrackingRequired ( beanMetadata .getBeanClass (), beanClassesInPath );
61
60
if ( !beanClassesInPath .isEmpty () ) {
62
61
throw new IllegalStateException ( "beanClassesInPath not empty" );
@@ -160,38 +159,38 @@ private boolean determineTrackingRequired(Class<?> beanClass, Set<Class<?>> bean
160
159
161
160
// TODO: is there a more concise way to do this?
162
161
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" );
179
181
}
180
- }
181
- else {
182
- throw new UnsupportedOperationException ( "Non-parameterized containers are not supported yet." );
183
182
}
184
183
}
185
184
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." );
188
186
}
189
187
}
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
+ }
194
192
}
193
+ return directCascadedBeanClasses ;
195
194
}
196
195
197
196
private boolean register (Class <?> beanClass , boolean isBeanTrackingEnabled ) {
@@ -212,21 +211,21 @@ public boolean isEnabledForBean(Class<?> rootBeanClass, boolean hasCascadables)
212
211
}
213
212
214
213
@ Override
215
- public boolean isEnabledForReturnValue (Executable executable , boolean hasCascadables ) {
214
+ public boolean isEnabledForReturnValue (Signature signature , boolean hasCascadables ) {
216
215
if ( !hasCascadables ) {
217
216
return false ;
218
217
}
219
218
220
- return trackingEnabledForReturnValues .getOrDefault ( executable , true );
219
+ return trackingEnabledForReturnValues .getOrDefault ( signature , true );
221
220
}
222
221
223
222
@ Override
224
- public boolean isEnabledForParameters (Executable executable , boolean hasCascadables ) {
223
+ public boolean isEnabledForParameters (Signature signature , boolean hasCascadables ) {
225
224
if ( !hasCascadables ) {
226
225
return false ;
227
226
}
228
227
229
- return trackingEnabledForParameters .getOrDefault ( executable , true );
228
+ return trackingEnabledForParameters .getOrDefault ( signature , true );
230
229
}
231
230
232
231
@ Override
0 commit comments