[jboss-dev-forums] [JBoss Microcontainer Development] - Re: Adding getAnnotationsAnnotatedWith() to MDR
kabir.khan@jboss.com
do-not-reply at jboss.com
Fri Dec 4 11:11:04 EST 2009
Some more changes to AbstractMDL to avoid having to iterate over the contexts every time
| ===================================================================
| --- src/main/java/org/jboss/metadata/plugins/loader/AbstractMetaDataLoader.java (revision 97282)
| +++ src/main/java/org/jboss/metadata/plugins/loader/AbstractMetaDataLoader.java (working copy)
| @@ -22,6 +22,8 @@
| package org.jboss.metadata.plugins.loader;
|
| import java.lang.annotation.Annotation;
| +import java.util.ArrayList;
| +import java.util.List;
|
| import org.jboss.metadata.spi.loader.MetaDataLoader;
| import org.jboss.metadata.spi.retrieval.AnnotationItem;
| @@ -31,6 +33,7 @@
| import org.jboss.metadata.spi.retrieval.MetaDataRetrieval;
| import org.jboss.metadata.spi.retrieval.MetaDatasItem;
| import org.jboss.metadata.spi.retrieval.ValidTime;
| +import org.jboss.metadata.spi.retrieval.basic.BasicAnnotationsItem;
| import org.jboss.metadata.spi.retrieval.helper.AnnotationToMetaDataBridge;
| import org.jboss.metadata.spi.retrieval.helper.AnnotationsToMetaDatasBridge;
| import org.jboss.metadata.spi.scope.ScopeKey;
| @@ -54,6 +57,8 @@
| /** The scope key */
| private ScopeKey scopeKey;
|
| + private volatile AnnotationsAnnotatedWithCache cache;
| +
| /**
| * Create a new AbstractMetaDataLoader.
| */
| @@ -92,7 +97,47 @@
| {
| return retrieveAnnotations();
| }
| +
| + protected AnnotationsAnnotatedWithCache getAnnotationsAnnotatedWithCache()
| + {
| + if (cache == null)
| + {
| + synchronized (this)
| + {
| + if (cache == null)
| + {
| + cache = new AnnotationsAnnotatedWithCache();
| + }
| + }
| + }
| + return cache;
| + }
|
| + public AnnotationsItem retrieveAnnotationsAnnotatedWith(Class<? extends Annotation> meta)
| + {
| + AnnotationsItem item = getAnnotationsAnnotatedWithCache().getAnnotationsAnnotatedWith(meta);
| + if (item == null)
| + {
| + AnnotationsItem annotations = retrieveAnnotations();
| + List<AnnotationItem<? extends Annotation>> values = new ArrayList<AnnotationItem<? extends Annotation>>(annotations.getAnnotations().length);
| + for (AnnotationItem<? extends Annotation> current : annotations.getAnnotations())
| + {
| + for (Annotation ann : current.getAnnotation().annotationType().getAnnotations())
| + {
| + if (meta == ann.annotationType())
| + {
| + values.add(current);
| + break;
| + }
| + }
| + }
| + item = new BasicAnnotationsItem(this, values.toArray(new AnnotationItem[values.size()]));
| + cache.addAnnotationsAnnotatedWith(meta, item);
| + }
| + return item;
| + }
| +
| +
| @SuppressWarnings("unchecked")
| public <T> MetaDataItem<T> retrieveMetaData(Class<T> type)
| {
| @@ -141,5 +186,12 @@
| public void invalidate()
| {
| validTime.invalidate();
| + invalidateAnnotationsAnnotatedWithCache();
| }
| +
| + protected void invalidateAnnotationsAnnotatedWithCache()
| + {
| + if (cache != null)
| + cache.invalidate();
| + }
| }
|
The cache is basically just a wrapper around a map
| public class AnnotationsAnnotatedWithCache
| {
| private ConcurrentMap<Class<? extends Annotation>, AnnotationsItem> annotationsByMetaAnnotation = new ConcurrentHashMap<Class<? extends Annotation>, AnnotationsItem>();
|
| public AnnotationsItem getAnnotationsAnnotatedWith(Class<? extends Annotation> meta)
| {
| AnnotationsItem annotationsItem = annotationsByMetaAnnotation.get(meta);
| if (annotationsItem != null)
| return annotationsItem;
| return null;
| }
|
| public void addAnnotationsAnnotatedWith(Class<? extends Annotation> meta, AnnotationsItem item)
| {
| annotationsByMetaAnnotation.putIfAbsent(meta, item);
| }
|
| public void invalidate()
| {
| annotationsByMetaAnnotation.clear();
| }
| }
|
AMDL.invalidateCache() gets called when annotations are added/removed from MemoryMetaDataLoader, which seems to be the only AMDL subclass that changes the annotations
View the original post : http://www.jboss.org/index.html?module=bb&op=viewtopic&p=4269050#4269050
Reply to the post : http://www.jboss.org/index.html?module=bb&op=posting&mode=reply&p=4269050
More information about the jboss-dev-forums
mailing list