88import java .lang .reflect .Type ;
99import java .lang .reflect .TypeVariable ;
1010import java .lang .reflect .WildcardType ;
11- import java .util .HashMap ;
1211import java .util .HashSet ;
1312import java .util .Map ;
1413import java .util .Set ;
2120import org .hibernate .validator .internal .metadata .aggregated .ReturnValueMetaData ;
2221import org .hibernate .validator .internal .metadata .aggregated .ValidatableParametersMetaData ;
2322import org .hibernate .validator .internal .metadata .facets .Cascadable ;
24- import org .hibernate .validator .internal .properties . Signature ;
23+ import org .hibernate .validator .internal .metadata . facets . Validatable ;
2524import org .hibernate .validator .internal .util .CollectionHelper ;
2625
2726public class PredefinedScopeProcessedBeansTrackingStrategy implements ProcessedBeansTrackingStrategy {
2827
2928 private final Map <Class <?>, Boolean > trackingEnabledForBeans ;
3029
31- // TODO: signature is just name and parameters so that can clash between different beans.
32- // with that.. do we even need to track it per signature or since
33- // we already built the `trackingEnabledForBeans` we can just "inspect" the cascadable as we go
34- // and check against this `trackingEnabledForBeans` to see if tracking is required ?
35- private final Map <Signature , Boolean > trackingEnabledForReturnValues ;
36- private final Map <Signature , Boolean > trackingEnabledForParameters ;
37-
3830 public PredefinedScopeProcessedBeansTrackingStrategy (Map <Class <?>, BeanMetaData <?>> rawBeanMetaDataMap ) {
39- // TODO: build the maps from the information inside the beanMetaDataManager
40- // There is a good chance we will need a structure with the whole hierarchy of constraint classes.
41- // That's something we could add to PredefinedScopeBeanMetaDataManager, as we are already doing similar things
42- // there (see the ClassHierarchyHelper.getHierarchy call).
43- // In the predefined scope case, we will have the whole hierarchy of constrained classes passed to
44- // PredefinedScopeBeanMetaDataManager.
45-
4631 this .trackingEnabledForBeans = CollectionHelper .toImmutableMap (
4732 new TrackingEnabledStrategyBuilder ( rawBeanMetaDataMap ).build ()
4833 );
49- this .trackingEnabledForReturnValues = CollectionHelper .toImmutableMap ( new HashMap <>() );
50- this .trackingEnabledForParameters = CollectionHelper .toImmutableMap ( new HashMap <>() );
5134 }
5235
5336 private static class TrackingEnabledStrategyBuilder {
@@ -223,16 +206,13 @@ private static void processSingleCascadable(Cascadable cascadable, Set<Class<?>>
223206 final ContainerCascadingMetaData containerCascadingMetaData = cascadingMetaData .as ( ContainerCascadingMetaData .class );
224207 processContainerCascadingMetaData ( containerCascadingMetaData , directCascadedBeanClasses );
225208 }
226- else if ( cascadingMetaData instanceof PotentiallyContainerCascadingMetaData potentiallyContainerCascadingMetaData ) {
227- // if it's a potentially container cascading one, we are "in trouble" as thing can be "almost anything".
228- // TODO: would it be enough to just take the type as defined ?
229- // directCascadedBeanClasses.add( (Class<?>) cascadable.getCascadableType() );
230- //
231- // TODO: or be much more cautious and just assume that it can be "anything":
209+ else if ( cascadingMetaData instanceof PotentiallyContainerCascadingMetaData ) {
210+ // If it's a potentially container cascading one, we are "in trouble" as thing can be "almost anything".
211+ // Let's be much more cautious and just assume that it can be "anything":
232212 directCascadedBeanClasses .add ( Object .class );
233213 }
234214 else {
235- // TODO: For now, assume non-container Cascadables are always beans. Truee ???
215+ // TODO: For now, assume non-container Cascadables are always beans. True ???
236216 directCascadedBeanClasses .add ( typeToClassToProcess ( cascadable .getCascadableType () ) );
237217 }
238218 }
@@ -260,8 +240,8 @@ else if ( typeArgument instanceof WildcardType wildcard ) {
260240 }
261241 }
262242 else {
263- // TODO: instead of failing, add an Object.class and assume it can be anything ?
264- throw new UnsupportedOperationException ( typeArgument . getClass (). getSimpleName () + " type argument values are not supported." );
243+ // In any unexpected case treat things as if they require tracking just to be on the safe side:
244+ directCascadedBeanClasses . add ( Object . class );
265245 }
266246 }
267247 }
@@ -288,9 +268,7 @@ else if ( type instanceof ParameterizedType parameterizedType ) {
288268 return typeToClassToProcess ( parameterizedType .getRawType () );
289269 }
290270 else {
291- // TODO: instead of failing, add an Object.class and assume it can be anything ?
292- // return Object.class;
293- throw new UnsupportedOperationException ( type .getClass ().getSimpleName () + " type values are not supported." );
271+ return Object .class ;
294272 }
295273 }
296274
@@ -303,55 +281,27 @@ public boolean isEnabledForBean(Class<?> rootBeanClass, boolean hasCascadables)
303281 return trackingEnabledForBeans .get ( rootBeanClass );
304282 }
305283
306- @ Override
307- public boolean isEnabledForReturnValue (Signature signature , boolean hasCascadables ) {
308- if ( !hasCascadables ) {
309- return false ;
310- }
311-
312- return trackingEnabledForReturnValues .getOrDefault ( signature , true );
313- }
314-
315284 @ Override
316285 public boolean isEnabledForReturnValue (ReturnValueMetaData returnValueMetaData ) {
317- if ( !returnValueMetaData .isCascading () ) {
318- return false ;
319- }
320-
321- Set <Class <?>> directCascadedBeanClasses = new HashSet <>();
322- for ( Cascadable cascadable : returnValueMetaData .getCascadables () ) {
323- processSingleCascadable ( cascadable , directCascadedBeanClasses );
324- }
325- for ( Class <?> directCascadedBeanClass : directCascadedBeanClasses ) {
326- if ( trackingEnabledForBeans .get ( directCascadedBeanClass ) ) {
327- return true ;
328- }
329- }
330-
331- return false ;
286+ return isEnabledForExecutableValidatable ( returnValueMetaData );
332287 }
333288
334289 @ Override
335- public boolean isEnabledForParameters (Signature signature , boolean hasCascadables ) {
336- if ( !hasCascadables ) {
337- return false ;
338- }
339-
340- return trackingEnabledForParameters .getOrDefault ( signature , true );
290+ public boolean isEnabledForParameters (ValidatableParametersMetaData parametersMetaData ) {
291+ return isEnabledForExecutableValidatable ( parametersMetaData );
341292 }
342293
343- @ Override
344- public boolean isEnabledForParameters (ValidatableParametersMetaData parametersMetaData ) {
345- if ( !parametersMetaData .hasCascadables () ) {
294+ private boolean isEnabledForExecutableValidatable (Validatable validatable ) {
295+ if ( !validatable .hasCascadables () ) {
346296 return false ;
347297 }
348298
349299 Set <Class <?>> directCascadedBeanClasses = new HashSet <>();
350- for ( Cascadable cascadable : parametersMetaData .getCascadables () ) {
300+ for ( Cascadable cascadable : validatable .getCascadables () ) {
351301 processSingleCascadable ( cascadable , directCascadedBeanClasses );
352302 }
353303 for ( Class <?> directCascadedBeanClass : directCascadedBeanClasses ) {
354- if ( trackingEnabledForBeans .get ( directCascadedBeanClass ) ) {
304+ if ( Boolean . TRUE . equals ( trackingEnabledForBeans .get ( directCascadedBeanClass ) ) ) {
355305 return true ;
356306 }
357307 }
@@ -362,7 +312,5 @@ public boolean isEnabledForParameters(ValidatableParametersMetaData parametersMe
362312 @ Override
363313 public void clear () {
364314 trackingEnabledForBeans .clear ();
365- trackingEnabledForReturnValues .clear ();
366- trackingEnabledForParameters .clear ();
367315 }
368316}
0 commit comments