@ -101,10 +101,8 @@ public class AnnotatedElementUtils {
@@ -101,10 +101,8 @@ public class AnnotatedElementUtils {
* Get the fully qualified class names of all meta - annotation
* types < em > present < / em > on the annotation ( of the specified
* { @code annotationType } ) on the supplied { @link AnnotatedElement } .
*
* < p > This method follows < em > get semantics < / em > as described in the
* { @linkplain AnnotatedElementUtils class - level Javadoc } .
*
* @param element the annotated element ; never { @code null }
* @param annotationType the annotation type on which to find
* meta - annotations ; never { @code null }
@ -123,10 +121,8 @@ public class AnnotatedElementUtils {
@@ -123,10 +121,8 @@ public class AnnotatedElementUtils {
* Get the fully qualified class names of all meta - annotation
* types < em > present < / em > on the annotation ( of the specified
* { @code annotationName } ) on the supplied { @link AnnotatedElement } .
*
* < p > This method follows < em > get semantics < / em > as described in the
* { @linkplain AnnotatedElementUtils class - level Javadoc } .
*
* @param element the annotated element ; never { @code null }
* @param annotationName the fully qualified class name of the annotation
* type on which to find meta - annotations ; never { @code null } or empty
@ -137,7 +133,7 @@ public class AnnotatedElementUtils {
@@ -137,7 +133,7 @@ public class AnnotatedElementUtils {
* /
public static Set < String > getMetaAnnotationTypes ( AnnotatedElement element , String annotationName ) {
Assert . notNull ( element , "AnnotatedElement must not be null" ) ;
Assert . hasText ( annotationName , "annotationName must not be null or empty" ) ;
Assert . hasLength ( annotationName , "annotationName must not be null or empty" ) ;
final Set < String > types = new LinkedHashSet < String > ( ) ;
@ -159,17 +155,15 @@ public class AnnotatedElementUtils {
@@ -159,17 +155,15 @@ public class AnnotatedElementUtils {
throw new IllegalStateException ( "Failed to introspect annotations on " + element , ex ) ;
}
return ( types . isEmpty ( ) ? null : types ) ;
return ( ! types . isEmpty ( ) ? types : null ) ;
}
/ * *
* Determine if the supplied { @link AnnotatedElement } is annotated with
* a < em > composed annotation < / em > that is meta - annotated with an
* annotation of the specified { @code annotationName } .
*
* < p > This method follows < em > get semantics < / em > as described in the
* { @linkplain AnnotatedElementUtils class - level Javadoc } .
*
* @param element the annotated element ; never { @code null }
* @param annotationName the fully qualified class name of the meta - annotation
* type to find ; never { @code null } or empty
@ -178,13 +172,13 @@ public class AnnotatedElementUtils {
@@ -178,13 +172,13 @@ public class AnnotatedElementUtils {
* /
public static boolean hasMetaAnnotationTypes ( AnnotatedElement element , final String annotationName ) {
Assert . notNull ( element , "AnnotatedElement must not be null" ) ;
Assert . hasText ( annotationName , "annotationName must not be null or empty" ) ;
Assert . hasLength ( annotationName , "annotationName must not be null or empty" ) ;
return Boolean . TRUE . equals ( searchWithGetSemantics ( element , annotationName , new SimpleAnnotationProcessor < Boolean > ( ) {
@Override
public Boolean process ( AnnotatedElement annotatedElement , Annotation annotation , int metaDepth ) {
boolean found = annotation . annotationType ( ) . getName ( ) . equals ( annotationName ) ;
return ( ( found & & ( metaDepth > 0 ) ) ? Boolean . TRUE : CONTINUE ) ;
return ( found & & metaDepth > 0 ? Boolean . TRUE : CONTINUE ) ;
}
} ) ) ;
}
@ -193,10 +187,8 @@ public class AnnotatedElementUtils {
@@ -193,10 +187,8 @@ public class AnnotatedElementUtils {
* Determine if an annotation of the specified { @code annotationName }
* is < em > present < / em > on the supplied { @link AnnotatedElement } or
* within the annotation hierarchy < em > above < / em > the specified element .
*
* < p > If this method returns { @code true } , then { @link # getMergedAnnotationAttributes }
* will return a non - null value .
*
* < p > This method follows < em > get semantics < / em > as described in the
* { @linkplain AnnotatedElementUtils class - level Javadoc } .
*
@ -207,7 +199,7 @@ public class AnnotatedElementUtils {
@@ -207,7 +199,7 @@ public class AnnotatedElementUtils {
* /
public static boolean isAnnotated ( AnnotatedElement element , final String annotationName ) {
Assert . notNull ( element , "AnnotatedElement must not be null" ) ;
Assert . hasText ( annotationName , "annotationName must not be null or empty" ) ;
Assert . hasLength ( annotationName , "annotationName must not be null or empty" ) ;
return Boolean . TRUE . equals ( searchWithGetSemantics ( element , annotationName , new SimpleAnnotationProcessor < Boolean > ( ) {
@Override
@ -224,13 +216,10 @@ public class AnnotatedElementUtils {
@@ -224,13 +216,10 @@ public class AnnotatedElementUtils {
* merge that annotation ' s attributes with < em > matching < / em > attributes from
* annotations in lower levels of the annotation hierarchy , and synthesize
* the result back into an annotation of the specified { @code annotationType } .
*
* < p > { @link AliasFor @AliasFor } semantics are fully supported , both
* within a single annotation and within the annotation hierarchy .
*
* < p > This method delegates to { @link # getMergedAnnotationAttributes ( AnnotatedElement , Class ) }
* and { @link AnnotationUtils # synthesizeAnnotation ( Map , Class , AnnotatedElement ) } .
*
* @param element the annotated element ; never { @code null }
* @param annotationType the annotation type to find ; never { @code null }
* @return the merged , synthesized { @code Annotation } , or { @code null } if not found
@ -249,12 +238,9 @@ public class AnnotatedElementUtils {
@@ -249,12 +238,9 @@ public class AnnotatedElementUtils {
* the annotation hierarchy < em > above < / em > the supplied { @code element } and
* merge that annotation ' s attributes with < em > matching < / em > attributes from
* annotations in lower levels of the annotation hierarchy .
*
* < p > { @link AliasFor @AliasFor } semantics are fully supported , both
* within a single annotation and within the annotation hierarchy .
*
* < p > This method delegates to { @link # getMergedAnnotationAttributes ( AnnotatedElement , String ) } .
*
* @param element the annotated element ; never { @code null }
* @param annotationType the annotation type to find ; never { @code null }
* @return the merged { @code AnnotationAttributes } , or { @code null } if not found
@ -282,13 +268,10 @@ public class AnnotatedElementUtils {
@@ -282,13 +268,10 @@ public class AnnotatedElementUtils {
* the annotation hierarchy < em > above < / em > the supplied { @code element } and
* merge that annotation ' s attributes with < em > matching < / em > attributes from
* annotations in lower levels of the annotation hierarchy .
*
* < p > { @link AliasFor @AliasFor } semantics are fully supported , both
* within a single annotation and within the annotation hierarchy .
*
* < p > This method delegates to { @link # getMergedAnnotationAttributes ( AnnotatedElement , String , boolean , boolean ) } ,
* supplying { @code false } for { @code classValuesAsString } and { @code nestedAnnotationsAsMap } .
*
* @param element the annotated element ; never { @code null }
* @param annotationName the fully qualified class name of the annotation
* type to find ; never { @code null } or empty
@ -310,6 +293,7 @@ public class AnnotatedElementUtils {
@@ -310,6 +293,7 @@ public class AnnotatedElementUtils {
@Deprecated
public static AnnotationAttributes getAnnotationAttributes ( AnnotatedElement element , String annotationName ,
boolean classValuesAsString , boolean nestedAnnotationsAsMap ) {
return getMergedAnnotationAttributes ( element , annotationName , classValuesAsString , nestedAnnotationsAsMap ) ;
}
@ -318,21 +302,17 @@ public class AnnotatedElementUtils {
@@ -318,21 +302,17 @@ public class AnnotatedElementUtils {
* the annotation hierarchy < em > above < / em > the supplied { @code element } and
* merge that annotation ' s attributes with < em > matching < / em > attributes from
* annotations in lower levels of the annotation hierarchy .
*
* < p > Attributes from lower levels in the annotation hierarchy override
* attributes of the same name from higher levels , and
* { @link AliasFor @AliasFor } semantics are fully supported , both
* within a single annotation and within the annotation hierarchy .
*
* < p > In contrast to { @link # getAllAnnotationAttributes } , the search
* algorithm used by this method will stop searching the annotation
* hierarchy once the first annotation of the specified
* { @code annotationName } has been found . As a consequence , additional
* annotations of the specified { @code annotationName } will be ignored .
*
* < p > This method follows < em > get semantics < / em > as described in the
* { @linkplain AnnotatedElementUtils class - level Javadoc } .
*
* @param element the annotated element ; never { @code null }
* @param annotationName the fully qualified class name of the annotation
* type to find ; never { @code null } or empty
@ -352,9 +332,8 @@ public class AnnotatedElementUtils {
@@ -352,9 +332,8 @@ public class AnnotatedElementUtils {
boolean classValuesAsString , boolean nestedAnnotationsAsMap ) {
AnnotationAttributes attributes = searchWithGetSemantics ( element , annotationName ,
new MergedAnnotationAttributesProcessor ( annotationName , classValuesAsString , nestedAnnotationsAsMap ) ) ;
AnnotationUtils . postProcessAnnotationAttributes ( element , attributes , classValuesAsString ,
nestedAnnotationsAsMap ) ;
new MergedAnnotationAttributesProcessor ( annotationName , classValuesAsString , nestedAnnotationsAsMap ) ) ;
AnnotationUtils . postProcessAnnotationAttributes ( element , attributes , classValuesAsString , nestedAnnotationsAsMap ) ;
return attributes ;
}
@ -364,12 +343,9 @@ public class AnnotatedElementUtils {
@@ -364,12 +343,9 @@ public class AnnotatedElementUtils {
* merge that annotation ' s attributes with < em > matching < / em > attributes from
* annotations in lower levels of the annotation hierarchy , and synthesize
* the result back into an annotation of the specified { @code annotationType } .
*
* < p > { @link AliasFor @AliasFor } semantics are fully supported , both
* within a single annotation and within the annotation hierarchy .
*
* < p > This method delegates to { @link # findMergedAnnotation ( AnnotatedElement , String ) } .
*
* @param element the annotated element ; never { @code null }
* @param annotationType the annotation type to find ; never { @code null }
* @return the merged , synthesized { @code Annotation } , or { @code null } if not found
@ -389,14 +365,11 @@ public class AnnotatedElementUtils {
@@ -389,14 +365,11 @@ public class AnnotatedElementUtils {
* merge that annotation ' s attributes with < em > matching < / em > attributes from
* annotations in lower levels of the annotation hierarchy , and synthesize
* the result back into an annotation of the specified { @code annotationName } .
*
* < p > { @link AliasFor @AliasFor } semantics are fully supported , both
* within a single annotation and within the annotation hierarchy .
*
* < p > This method delegates to { @link # findMergedAnnotationAttributes ( AnnotatedElement , String , boolean , boolean ) }
* ( supplying { @code false } for { @code classValuesAsString } and { @code nestedAnnotationsAsMap } )
* and { @link AnnotationUtils # synthesizeAnnotation ( Map , Class , AnnotatedElement ) } .
*
* @param element the annotated element ; never { @code null }
* @param annotationName the fully qualified class name of the annotation
* type to find ; never { @code null } or empty
@ -409,8 +382,8 @@ public class AnnotatedElementUtils {
@@ -409,8 +382,8 @@ public class AnnotatedElementUtils {
@SuppressWarnings ( "unchecked" )
public static < A extends Annotation > A findMergedAnnotation ( AnnotatedElement element , String annotationName ) {
AnnotationAttributes attributes = findMergedAnnotationAttributes ( element , annotationName , false , false ) ;
return ( ( attributes ! = null ) ? AnnotationUtils . synthesizeAnnotation ( attributes ,
( Class < A > ) attributes . annotationType ( ) , element ) : null ) ;
return ( attributes ! = null ?
AnnotationUtils . synthesizeAnnotation ( attributes , ( Class < A > ) attributes . annotationType ( ) , element ) : null ) ;
}
/ * *
@ -418,21 +391,17 @@ public class AnnotatedElementUtils {
@@ -418,21 +391,17 @@ public class AnnotatedElementUtils {
* the annotation hierarchy < em > above < / em > the supplied { @code element } and
* merge that annotation ' s attributes with < em > matching < / em > attributes from
* annotations in lower levels of the annotation hierarchy .
*
* < p > Attributes from lower levels in the annotation hierarchy override
* attributes of the same name from higher levels , and
* { @link AliasFor @AliasFor } semantics are fully supported , both
* within a single annotation and within the annotation hierarchy .
*
* < p > In contrast to { @link # getAllAnnotationAttributes } , the search
* algorithm used by this method will stop searching the annotation
* hierarchy once the first annotation of the specified
* { @code annotationName } has been found . As a consequence , additional
* annotations of the specified { @code annotationName } will be ignored .
*
* < p > This method follows < em > find semantics < / em > as described in the
* { @linkplain AnnotatedElementUtils class - level Javadoc } .
*
* @param element the annotated element ; never { @code null }
* @param annotationName the fully qualified class name of the annotation
* type to find ; never { @code null } or empty
@ -451,9 +420,8 @@ public class AnnotatedElementUtils {
@@ -451,9 +420,8 @@ public class AnnotatedElementUtils {
boolean classValuesAsString , boolean nestedAnnotationsAsMap ) {
AnnotationAttributes attributes = searchWithFindSemantics ( element , annotationName ,
new MergedAnnotationAttributesProcessor ( annotationName , classValuesAsString , nestedAnnotationsAsMap ) ) ;
AnnotationUtils . postProcessAnnotationAttributes ( element , attributes , classValuesAsString ,
nestedAnnotationsAsMap ) ;
new MergedAnnotationAttributesProcessor ( annotationName , classValuesAsString , nestedAnnotationsAsMap ) ) ;
AnnotationUtils . postProcessAnnotationAttributes ( element , attributes , classValuesAsString , nestedAnnotationsAsMap ) ;
return attributes ;
}
@ -462,13 +430,10 @@ public class AnnotatedElementUtils {
@@ -462,13 +430,10 @@ public class AnnotatedElementUtils {
* the specified { @code annotationName } in the annotation hierarchy above
* the supplied { @link AnnotatedElement } and store the results in a
* { @link MultiValueMap } .
*
* < p > Note : in contrast to { @link # getMergedAnnotationAttributes ( AnnotatedElement , String ) } ,
* this method does < em > not < / em > support attribute overrides .
*
* < p > This method follows < em > get semantics < / em > as described in the
* { @linkplain AnnotatedElementUtils class - level Javadoc } .
*
* @param element the annotated element ; never { @code null }
* @param annotationName the fully qualified class name of the annotation
* type to find ; never { @code null } or empty
@ -486,13 +451,10 @@ public class AnnotatedElementUtils {
@@ -486,13 +451,10 @@ public class AnnotatedElementUtils {
* the specified { @code annotationName } in the annotation hierarchy above
* the supplied { @link AnnotatedElement } and store the results in a
* { @link MultiValueMap } .
*
* < p > Note : in contrast to { @link # getMergedAnnotationAttributes ( AnnotatedElement , String ) } ,
* this method does < em > not < / em > support attribute overrides .
*
* < p > This method follows < em > get semantics < / em > as described in the
* { @linkplain AnnotatedElementUtils class - level Javadoc } .
*
* @param element the annotated element ; never { @code null }
* @param annotationName the fully qualified class name of the annotation
* type to find ; never { @code null } or empty
@ -511,7 +473,6 @@ public class AnnotatedElementUtils {
@@ -511,7 +473,6 @@ public class AnnotatedElementUtils {
final MultiValueMap < String , Object > attributesMap = new LinkedMultiValueMap < String , Object > ( ) ;
searchWithGetSemantics ( element , annotationName , new SimpleAnnotationProcessor < Void > ( ) {
@Override
public Void process ( AnnotatedElement annotatedElement , Annotation annotation , int metaDepth ) {
boolean found = annotation . annotationType ( ) . getName ( ) . equals ( annotationName ) ;
@ -522,19 +483,17 @@ public class AnnotatedElementUtils {
@@ -522,19 +483,17 @@ public class AnnotatedElementUtils {
attributesMap . add ( entry . getKey ( ) , entry . getValue ( ) ) ;
}
}
// Continue searching...
return null ;
}
} ) ;
return ( attributesMap . isEmpty ( ) ? null : attributesMap ) ;
return ( ! attributesMap . isEmpty ( ) ? attributesMap : null ) ;
}
/ * *
* Search for annotations of the specified { @code annotationName } on
* the specified { @code element } , following < em > get semantics < / em > .
*
* @param element the annotated element ; never { @code null }
* @param annotationName the fully qualified class name of the annotation
* type to find ; never { @code null } or empty
@ -555,11 +514,8 @@ public class AnnotatedElementUtils {
@@ -555,11 +514,8 @@ public class AnnotatedElementUtils {
* Perform the search algorithm for the { @link # searchWithGetSemantics }
* method , avoiding endless recursion by tracking which annotated elements
* have already been < em > visited < / em > .
*
* < p > The { @code metaDepth } parameter is explained in the
* { @link Processor # process process ( ) } method of the { @link Processor }
* API .
*
* { @link Processor # process process ( ) } method of the { @link Processor } API .
* @param element the annotated element ; never { @code null }
* @param annotationName the fully qualified class name of the annotation
* type to find ; never { @code null } or empty
@ -572,11 +528,10 @@ public class AnnotatedElementUtils {
@@ -572,11 +528,10 @@ public class AnnotatedElementUtils {
Processor < T > processor , Set < AnnotatedElement > visited , int metaDepth ) {
Assert . notNull ( element , "AnnotatedElement must not be null" ) ;
Assert . hasText ( annotationName , "annotationName must not be null or empty" ) ;
Assert . hasLength ( annotationName , "annotationName must not be null or empty" ) ;
if ( visited . add ( element ) ) {
try {
// Start searching within locally declared annotations
List < Annotation > declaredAnnotations = Arrays . asList ( element . getDeclaredAnnotations ( ) ) ;
T result = searchWithGetSemanticsInAnnotations ( element , declaredAnnotations , annotationName , processor ,
@ -593,8 +548,8 @@ public class AnnotatedElementUtils {
@@ -593,8 +548,8 @@ public class AnnotatedElementUtils {
}
// Continue searching within inherited annotations
result = searchWithGetSemanticsInAnnotations ( element , inheritedAnnotations , annotationName , processor ,
visited , metaDepth ) ;
result = searchWithGetSemanticsInAnnotations (
element , inheritedAnnotations , annotationName , processor , visited , metaDepth ) ;
if ( result ! = null ) {
return result ;
}
@ -611,15 +566,11 @@ public class AnnotatedElementUtils {
@@ -611,15 +566,11 @@ public class AnnotatedElementUtils {
* This method is invoked by
* { @link # searchWithGetSemantics ( AnnotatedElement , String , Processor , Set , int ) }
* to perform the actual search within the supplied list of annotations .
*
* < p > This method should be invoked first with locally declared annotations
* and then subsequently with inherited annotations , thereby allowing
* local annotations to take precedence over inherited annotations .
*
* < p > The { @code metaDepth } parameter is explained in the
* { @link Processor # process process ( ) } method of the { @link Processor }
* API .
*
* { @link Processor # process process ( ) } method of the { @link Processor } API .
* @param annotatedElement the element that is annotated with the supplied
* annotations , used for contextual logging ; may be { @code null } if unknown
* @param annotations the annotations to search in ; never { @code null }
@ -636,8 +587,8 @@ public class AnnotatedElementUtils {
@@ -636,8 +587,8 @@ public class AnnotatedElementUtils {
// Search in annotations
for ( Annotation annotation : annotations ) {
if ( ! AnnotationUtils . isInJavaLangAnnotationPackage ( annotation )
& & ( annotation . annotationType ( ) . getName ( ) . equals ( annotationName ) | | metaDepth > 0 ) ) {
if ( ! AnnotationUtils . isInJavaLangAnnotationPackage ( annotation ) & &
( annotation . annotationType ( ) . getName ( ) . equals ( annotationName ) | | metaDepth > 0 ) ) {
T result = processor . process ( annotatedElement , annotation , metaDepth ) ;
if ( result ! = null ) {
return result ;
@ -648,8 +599,8 @@ public class AnnotatedElementUtils {
@@ -648,8 +599,8 @@ public class AnnotatedElementUtils {
// Recursively search in meta-annotations
for ( Annotation annotation : annotations ) {
if ( ! AnnotationUtils . isInJavaLangAnnotationPackage ( annotation ) ) {
T result = searchWithGetSemantics ( annotation . annotationType ( ) , annotationName , processor , visited ,
metaDepth + 1 ) ;
T result = searchWithGetSemantics (
annotation . annotationType ( ) , annotationName , processor , visited , metaDepth + 1 ) ;
if ( result ! = null ) {
processor . postProcess ( annotatedElement , annotation , result ) ;
return result ;
@ -663,7 +614,6 @@ public class AnnotatedElementUtils {
@@ -663,7 +614,6 @@ public class AnnotatedElementUtils {
/ * *
* Search for annotations of the specified { @code annotationName } on
* the specified { @code element } , following < em > find semantics < / em > .
*
* @param element the annotated element ; never { @code null }
* @param annotationName the fully qualified class name of the annotation
* type to find ; never { @code null } or empty
@ -685,11 +635,8 @@ public class AnnotatedElementUtils {
@@ -685,11 +635,8 @@ public class AnnotatedElementUtils {
* Perform the search algorithm for the { @link # searchWithFindSemantics }
* method , avoiding endless recursion by tracking which annotated elements
* have already been < em > visited < / em > .
*
* < p > The { @code metaDepth } parameter is explained in the
* { @link Processor # process process ( ) } method of the { @link Processor }
* API .
*
* { @link Processor # process process ( ) } method of the { @link Processor } API .
* @param element the annotated element ; never { @code null }
* @param annotationName the fully qualified class name of the annotation
* type to find ; never { @code null } or empty
@ -703,7 +650,7 @@ public class AnnotatedElementUtils {
@@ -703,7 +650,7 @@ public class AnnotatedElementUtils {
Processor < T > processor , Set < AnnotatedElement > visited , int metaDepth ) {
Assert . notNull ( element , "AnnotatedElement must not be null" ) ;
Assert . hasText ( annotationName , "annotationName must not be null or empty" ) ;
Assert . hasLength ( annotationName , "annotationName must not be null or empty" ) ;
if ( visited . add ( element ) ) {
try {
@ -759,11 +706,10 @@ public class AnnotatedElementUtils {
@@ -759,11 +706,10 @@ public class AnnotatedElementUtils {
}
try {
Method equivalentMethod = clazz . getDeclaredMethod ( method . getName ( ) ,
method . getParameterTypes ( ) ) ;
Method equivalentMethod = clazz . getDeclaredMethod ( method . getName ( ) , method . getParameterTypes ( ) ) ;
Method resolvedEquivalentMethod = BridgeMethodResolver . findBridgedMethod ( equivalentMethod ) ;
result = searchWithFindSemantics ( resolvedEquivalentMethod , annotationName , processor ,
visited , metaDepth ) ;
result = searchWithFindSemantics (
resolvedEquivalentMethod , annotationName , processor , visited , metaDepth ) ;
if ( result ! = null ) {
return result ;
}
@ -809,9 +755,6 @@ public class AnnotatedElementUtils {
@@ -809,9 +755,6 @@ public class AnnotatedElementUtils {
return null ;
}
/ * *
* @since 4 . 2
* /
private static < T > T searchOnInterfaces ( Method method , String annotationName , Processor < T > processor ,
Set < AnnotatedElement > visited , int metaDepth , Class < ? > [ ] ifcs ) {
@ -833,9 +776,9 @@ public class AnnotatedElementUtils {
@@ -833,9 +776,9 @@ public class AnnotatedElementUtils {
return null ;
}
/ * *
* Callback interface that is used to process annotations during a search .
*
* < p > Depending on the use case , a processor may choose to
* { @linkplain # process } a single target annotation , multiple target
* annotations , or all annotations discovered by the currently executing
@ -846,21 +789,18 @@ public class AnnotatedElementUtils {
@@ -846,21 +789,18 @@ public class AnnotatedElementUtils {
* whereas , returning { @code null } from the { @link # process } method
* instructs the search algorithm to continue searching for additional
* annotations .
*
* < p > Processors can optionally { @linkplain # postProcess post - process }
* the result of the { @link # process } method as the search algorithm
* goes back down the annotation hierarchy from an invocation of
* { @link # process } that returned a non - null value down to the
* { @link AnnotatedElement } that was supplied as the starting point to
* the search algorithm .
*
* @param < T > the type of result returned by the processor
* /
private static interface Processor < T > {
private interface Processor < T > {
/ * *
* Process the supplied annotation .
*
* < p > Depending on the use case , the supplied annotation may be an
* actual target annotation that has been found by the search
* algorithm , or it may be some other annotation within the
@ -868,14 +808,12 @@ public class AnnotatedElementUtils {
@@ -868,14 +808,12 @@ public class AnnotatedElementUtils {
* should have a value greater than { @code 0 } . In any case , it is
* up to concrete implementations of this method to decide what to
* do with the supplied annotation .
*
* < p > The { @code metaDepth } parameter represents the depth of the
* annotation relative to the first annotated element in the
* annotation hierarchy . For example , an annotation that is
* < em > present < / em > on a non - annotation element will have a depth
* of 0 ; a meta - annotation will have a depth of 1 ; and a
* meta - meta - annotation will have a depth of 2 ; etc .
*
* @param annotatedElement the element that is annotated with the
* supplied annotation , used for contextual logging ; may be
* { @code null } if unknown
@ -888,12 +826,10 @@ public class AnnotatedElementUtils {
@@ -888,12 +826,10 @@ public class AnnotatedElementUtils {
/ * *
* Post - process the result returned by the { @link # process } method .
*
* < p > The { @code annotation } supplied to this method is an annotation
* that is present in the annotation hierarchy , between the initial
* { @link AnnotatedElement } and an invocation of { @link # process }
* that returned a non - null value .
*
* @param annotatedElement the element that is annotated with the
* supplied annotation , used for contextual logging ; may be
* { @code null } if unknown
@ -903,6 +839,7 @@ public class AnnotatedElementUtils {
@@ -903,6 +839,7 @@ public class AnnotatedElementUtils {
void postProcess ( AnnotatedElement annotatedElement , Annotation annotation , T result ) ;
}
/ * *
* { @link Processor } that { @linkplain # process processes } annotations
* but does not { @linkplain # postProcess post - process } results .
@ -910,15 +847,13 @@ public class AnnotatedElementUtils {
@@ -910,15 +847,13 @@ public class AnnotatedElementUtils {
* /
private abstract static class SimpleAnnotationProcessor < T > implements Processor < T > {
/ * *
* < em > No - op < / em > .
* /
@Override
public final void postProcess ( AnnotatedElement annotatedElement , Annotation annotation , T result ) {
/* no-op */
// no-op
}
}
/ * *
* { @link Processor } that gets the { @code AnnotationAttributes } for the
* target annotation during the { @link # process } phase and then merges
@ -931,12 +866,14 @@ public class AnnotatedElementUtils {
@@ -931,12 +866,14 @@ public class AnnotatedElementUtils {
private static class MergedAnnotationAttributesProcessor implements Processor < AnnotationAttributes > {
private final String annotationName ;
private final boolean classValuesAsString ;
private final boolean nestedAnnotationsAsMap ;
private final boolean nestedAnnotationsAsMap ;
MergedAnnotationAttributesProcessor ( String annotationName , boolean classValuesAsString ,
boolean nestedAnnotationsAsMap ) {
this . annotationName = annotationName ;
this . classValuesAsString = classValuesAsString ;
this . nestedAnnotationsAsMap = nestedAnnotationsAsMap ;
@ -946,7 +883,7 @@ public class AnnotatedElementUtils {
@@ -946,7 +883,7 @@ public class AnnotatedElementUtils {
public AnnotationAttributes process ( AnnotatedElement annotatedElement , Annotation annotation , int metaDepth ) {
boolean found = annotation . annotationType ( ) . getName ( ) . equals ( this . annotationName ) ;
return ( found ? AnnotationUtils . getAnnotationAttributes ( annotatedElement , annotation ,
this . classValuesAsString , this . nestedAnnotationsAsMap , true ) : null ) ;
this . classValuesAsString , this . nestedAnnotationsAsMap , true ) : null ) ;
}
@Override
@ -975,11 +912,10 @@ public class AnnotatedElementUtils {
@@ -975,11 +912,10 @@ public class AnnotatedElementUtils {
AnnotationAttributes attributes , String sourceAttributeName , String targetAttributeName ) {
Object value = AnnotationUtils . getValue ( annotation , sourceAttributeName ) ;
Object adaptedValue = AnnotationUtils . adaptValue ( element , value , this . classValuesAsString ,
this . nestedAnnotationsAsMap ) ;
Object adaptedValue = AnnotationUtils . adaptValue (
element , value , this . classValuesAsString , this . nestedAnnotationsAsMap ) ;
attributes . put ( targetAttributeName , adaptedValue ) ;
}
}
}