[jboss-dev-forums] [JBoss Microcontainer Development] - Adding getAnnotationsAnnotatedWith() to MDR
kabir.khan@jboss.com
do-not-reply at jboss.com
Fri Dec 4 09:32:53 EST 2009
As mentioned here
http://www.jboss.org/index.html?module=bb&op=viewtopic&t=163887&start=10
"alesj" wrote : "kabir.khan at jboss.com" wrote :
| | Since most qualifiers I've seen (in jsr-299 and jsr-330) are picked out using annotations on the annotation, I propose adding something to BeanAnnotationAdapter to handle meta-annotations.
| |
| I would put this support directly to Reflect or MDR
| - which ever suites best, but probably both will have to adapt.
|
| BAA should just use this feature, not implement it.
|
I've added this to MetaData:
| /**
| * Get all the annotations annotated with the given meta annotation
| *
| * @param the meta annotation
| * @return the annotations annotated with the meta annotation
| */
| Annotation[] getAnnotationsAnnotatedWith(Class<? extends Annotation> meta);
|
and this to MetaDataRetrieval
| /**
| * Get all the annotations annotated with the given meta annotation
| *
| * @param the meta annotation
| * @return the annotations annotated with the meta annotation
| */
| AnnotationsItem retrieveAnnotationsAnnotatedWith(Class<? extends Annotation> meta);
|
The implemetation of this in AbstractMetaDataLoader
| public AnnotationsItem retrieveAnnotationsAnnotatedWith(Class<? extends Annotation> meta)
| {
| AnnotationsItem annotations = retrieveAnnotations();
| List<AnnotationItem<? extends Annotation>> values = new ArrayList<AnnotationItem<? extends Annotation>>(annotations.getAnnotations().length);
| for (AnnotationItem<? extends Annotation> item : annotations.getAnnotations())
| {
| for (Annotation ann : item.getAnnotation().annotationType().getAnnotations())
| {
| if (meta == ann.annotationType())
| {
| values.add(item);
| break;
| }
| }
| }
| return new BasicAnnotationsItem(this, values.toArray(new AnnotationItem[values.size()]));
| }
|
And then the implemetation in AbstractMetaDataContext
| public AnnotationsItem retrieveAnnotationsAnnotatedWith(Class<? extends Annotation> meta)
| {
| return new CummulativeAnnotationsItem(this, true, new AnnotationsAnnotatedWithFilter(meta));
| }
|
| private static class AnnotationsAnnotatedWithFilter implements CummulativeAnnotationsFilter
| {
| Class<? extends Annotation> meta;
|
| public AnnotationsAnnotatedWithFilter(Class<? extends Annotation> meta)
| {
| this.meta = meta;
| }
|
| public AnnotationsItem getAnnotations(MetaDataRetrieval retrieval)
| {
| return retrieval.retrieveAnnotationsAnnotatedWith(meta);
| }
| }
|
Changes to CummulativeAnnotationsItem
| Index: src/main/java/org/jboss/metadata/spi/retrieval/cummulative/CummulativeAnnotationsItem.java
| ===================================================================
| --- src/main/java/org/jboss/metadata/spi/retrieval/cummulative/CummulativeAnnotationsItem.java (revision 97282)
| +++ src/main/java/org/jboss/metadata/spi/retrieval/cummulative/CummulativeAnnotationsItem.java (working copy)
| @@ -49,6 +49,8 @@
| /** The valid time */
| private long validTime;
|
| + private CummulativeAnnotationsFilter filter = AllAnnotationsFilter.INSTANCE;
| +
| /**
| * Create a new CummulativeAnnotationsItem.
| *
| @@ -57,11 +59,25 @@
| */
| public CummulativeAnnotationsItem(MetaDataContext context, boolean includeParent)
| {
| + this(context, includeParent, null);
| + }
| +
| + /**
| + * Create a new CummulativeAnnotationsItem.
| + *
| + * @param context the context
| + * @param includeParent whether to include the parent
| + */
| + public CummulativeAnnotationsItem(MetaDataContext context, boolean includeParent, CummulativeAnnotationsFilter filter)
| + {
| if (context == null)
| throw new IllegalArgumentException("Null context");
|
| this.context = context;
| this.includeParent = includeParent;
| + if (filter != null)
| + this.filter = filter;
| +
| init(context.getValidTime().getValidTime());
| }
|
| @@ -131,7 +147,7 @@
|
| for (MetaDataRetrieval retrieval : retrievals)
| {
| - AnnotationsItem item = retrieval.retrieveAnnotations();
| + AnnotationsItem item = filter.getAnnotations(retrieval);
| if (item != null)
| {
| AnnotationItem<? extends Annotation>[] items = item.getAnnotations();
| @@ -150,4 +166,14 @@
| setAnnotationItems(items);
| this.validTime = validTime;
| }
| +
| + private static class AllAnnotationsFilter implements CummulativeAnnotationsFilter
| + {
| + private static final CummulativeAnnotationsFilter INSTANCE = new AllAnnotationsFilter();
| +
| + public AnnotationsItem getAnnotations(MetaDataRetrieval retrieval)
| + {
| + return retrieval.retrieveAnnotations();
| + }
| + }
| }
|
I am currently reworking the current tests to also check this new functionality. One issue I have not yet looked into is the caching of this information, which is next on my list.
View the original post : http://www.jboss.org/index.html?module=bb&op=viewtopic&p=4269025#4269025
Reply to the post : http://www.jboss.org/index.html?module=bb&op=posting&mode=reply&p=4269025
More information about the jboss-dev-forums
mailing list