[jboss-cvs] JBossAS SVN: r101067 - in projects/jboss-mdr/trunk/src: test/java/org/jboss/test/metadata/shared and 1 other directory.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Wed Feb 17 07:02:30 EST 2010


Author: kabir.khan at jboss.com
Date: 2010-02-17 07:02:30 -0500 (Wed, 17 Feb 2010)
New Revision: 101067

Modified:
   projects/jboss-mdr/trunk/src/main/java/org/jboss/metadata/plugins/loader/reflection/AnnotatedElementMetaDataLoader.java
   projects/jboss-mdr/trunk/src/test/java/org/jboss/test/metadata/shared/ComponentBasicAnnotationsTest.java
Log:
[JBMDR-66] When getting component metadata for an element that does not have annotations, avoid the overhead of having to create a new AnnotatedElementMetaDataLoader and its associated ScopeKey by returning a singleton representing no annotations

Modified: projects/jboss-mdr/trunk/src/main/java/org/jboss/metadata/plugins/loader/reflection/AnnotatedElementMetaDataLoader.java
===================================================================
--- projects/jboss-mdr/trunk/src/main/java/org/jboss/metadata/plugins/loader/reflection/AnnotatedElementMetaDataLoader.java	2010-02-17 11:56:37 UTC (rev 101066)
+++ projects/jboss-mdr/trunk/src/main/java/org/jboss/metadata/plugins/loader/reflection/AnnotatedElementMetaDataLoader.java	2010-02-17 12:02:30 UTC (rev 101067)
@@ -31,14 +31,21 @@
 import org.jboss.logging.Logger;
 import org.jboss.metadata.plugins.loader.BasicMetaDataLoader;
 import org.jboss.metadata.plugins.loader.SimpleMetaDataLoader;
+import org.jboss.metadata.spi.loader.MetaDataLoader;
 import org.jboss.metadata.spi.retrieval.AnnotationItem;
 import org.jboss.metadata.spi.retrieval.AnnotationsItem;
+import org.jboss.metadata.spi.retrieval.MetaDataItem;
 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.basic.BasicMetaDatasItem;
 import org.jboss.metadata.spi.retrieval.simple.SimpleAnnotationItem;
 import org.jboss.metadata.spi.retrieval.simple.SimpleAnnotationsItem;
 import org.jboss.metadata.spi.scope.CommonLevels;
 import org.jboss.metadata.spi.scope.Scope;
 import org.jboss.metadata.spi.scope.ScopeKey;
+import org.jboss.metadata.spi.scope.ScopeLevel;
 import org.jboss.metadata.spi.signature.ConstructorParametersSignature;
 import org.jboss.metadata.spi.signature.ConstructorSignature;
 import org.jboss.metadata.spi.signature.DeclaredMethodSignature;
@@ -137,6 +144,8 @@
                   log.trace("Constructor with signature " + signature + " does not exist on class " + clazz.getName());
                return null;
             }
+            if (constructor.getAnnotations().length == 0)
+               return NullAnnotatedElementComponentMetaDataLoader.INSTANCE;
             return new AnnotatedElementMetaDataLoader(constructor);
          }
          else if (signature instanceof MethodSignature)
@@ -151,6 +160,8 @@
                   log.trace("Method with signature " + signature + " does not exist on class " + clazz.getName());
                return null;
             }
+            if (method.getAnnotations().length == 0)
+               return NullAnnotatedElementComponentMetaDataLoader.INSTANCE;
             return new AnnotatedElementMetaDataLoader(method);
          }
          else if (signature instanceof DeclaredMethodSignature)
@@ -173,6 +184,8 @@
                   return null;     
                }
             }
+            if (method.getAnnotations().length == 0)
+               return NullAnnotatedElementComponentMetaDataLoader.INSTANCE;
             return new AnnotatedElementMetaDataLoader(method);
          }
          else if (signature instanceof MethodParametersSignature)
@@ -188,6 +201,8 @@
                return null;
             }
             Annotation[][] paramAnnotations = method.getParameterAnnotations();
+            if (paramAnnotations[methodParametersSignature.getParam()].length == 0)
+               return NullAnnotatedElementComponentMetaDataLoader.INSTANCE;
             return new SimpleMetaDataLoader(paramAnnotations[methodParametersSignature.getParam()]);
          }
          else if (signature instanceof ConstructorParametersSignature)
@@ -203,6 +218,8 @@
                return null;
             }
             Annotation[][] paramAnnotations = constructor.getParameterAnnotations();
+            if (paramAnnotations[constructorParametersSignature.getParam()].length == 0)
+               return NullAnnotatedElementComponentMetaDataLoader.INSTANCE;
             return new SimpleMetaDataLoader(paramAnnotations[constructorParametersSignature.getParam()]);
          }
          else if (signature instanceof FieldSignature)
@@ -217,6 +234,8 @@
                   log.trace("Field " + signature.getName() + " does not exist on class " + clazz.getName());
                return null;
             }
+            if (field.getAnnotations().length == 0)
+               return NullAnnotatedElementComponentMetaDataLoader.INSTANCE;
             return new AnnotatedElementMetaDataLoader(field);
          }
       }
@@ -228,6 +247,8 @@
             Method method = (Method)annotated;
             Annotation[][] paramAnnotations = method.getParameterAnnotations();
             MethodParametersSignature sig = (MethodParametersSignature) signature;
+            if (paramAnnotations[sig.getParam()].length == 0)
+               return NullAnnotatedElementComponentMetaDataLoader.INSTANCE;
             return new SimpleMetaDataLoader(paramAnnotations[sig.getParam()]);
          }
       }
@@ -239,6 +260,8 @@
             Constructor<?> constructor = Constructor.class.cast(annotated);
             Annotation[][] paramAnnotations = constructor.getParameterAnnotations();
             ConstructorParametersSignature sig = (ConstructorParametersSignature) signature;
+            if (paramAnnotations[sig.getParam()].length == 0)
+               return NullAnnotatedElementComponentMetaDataLoader.INSTANCE;
             return new SimpleMetaDataLoader(paramAnnotations[sig.getParam()]);
          }
       }
@@ -280,4 +303,86 @@
       }
       return null;
    }
+   
+   /**
+    * http://community.jboss.org/thread/148203
+    * Singleton be returned by AnnotatedElementMetaDataLoader.getComponentMetaDataRetrieval() when there are no annotations for the member. This is to avoid
+    * the overhead of creating a new AnnotatedElementMetaDataLoader even in those cases, something which shows up to be a big bottleneck in AS startup time,
+    * mainly due to the creation of AnnotatedElementMetaDataLoader's ScopeKey.    
+    */
+   private static class NullAnnotatedElementComponentMetaDataLoader implements MetaDataRetrieval
+   {
+      final static NullAnnotatedElementComponentMetaDataLoader INSTANCE = new NullAnnotatedElementComponentMetaDataLoader();
+      final static ScopeKey nullScopeKey = new ScopeKey(new Scope(CommonLevels.JOINPOINT, INSTANCE));
+      
+      final BasicAnnotationsItem noANnnotationsItem = new BasicAnnotationsItem(null, new AnnotationItem[0]);
+      final BasicMetaDatasItem noMetaDatasItem = new BasicMetaDatasItem(null, new MetaDataItem[0]);
+      final ValidTime validTime = new ValidTime();
+      
+      public MetaDataRetrieval getComponentMetaDataRetrieval(Signature signature)
+      {
+         return INSTANCE;
+      }
+
+      public ScopeKey getScope()
+      {
+         return nullScopeKey;
+      }
+
+      public MetaDataRetrieval getScopedRetrieval(ScopeLevel level)
+      {
+         return INSTANCE;
+      }
+
+      public ValidTime getValidTime()
+      {
+         return validTime;
+      }
+
+      public boolean isEmpty()
+      {
+         return true;
+      }
+
+      public <T extends Annotation> AnnotationItem<T> retrieveAnnotation(Class<T> annotationType)
+      {
+         return null;
+      }
+
+      public AnnotationsItem retrieveAnnotations()
+      {
+         return noANnnotationsItem;
+      }
+
+      public AnnotationsItem retrieveAnnotationsAnnotatedWith(Class<? extends Annotation> meta)
+      {
+         return noANnnotationsItem;
+      }
+
+      public AnnotationsItem retrieveLocalAnnotations()
+      {
+         return noANnnotationsItem;
+      }
+
+      public MetaDatasItem retrieveLocalMetaData()
+      {
+         return noMetaDatasItem;
+      }
+
+      public MetaDatasItem retrieveMetaData()
+      {
+         return noMetaDatasItem;
+      }
+
+      public <T> MetaDataItem<T> retrieveMetaData(Class<T> type)
+      {
+         return null;
+      }
+
+      public MetaDataItem<?> retrieveMetaData(String name)
+      {
+         return null;
+      }
+      
+   }
 }

Modified: projects/jboss-mdr/trunk/src/test/java/org/jboss/test/metadata/shared/ComponentBasicAnnotationsTest.java
===================================================================
--- projects/jboss-mdr/trunk/src/test/java/org/jboss/test/metadata/shared/ComponentBasicAnnotationsTest.java	2010-02-17 11:56:37 UTC (rev 101066)
+++ projects/jboss-mdr/trunk/src/test/java/org/jboss/test/metadata/shared/ComponentBasicAnnotationsTest.java	2010-02-17 12:02:30 UTC (rev 101067)
@@ -100,6 +100,7 @@
    protected void testEmpty(MetaData metaData) throws Exception
    {
       assertNotNull(metaData);
+      assertNotNull(metaData.getValidTime());
       ExpectedAnnotations expectedAnnotations = emptyExpectedAnnotations();
 
       assertNoAnnotation(metaData, NotPresentAnnotation.class);




More information about the jboss-cvs-commits mailing list