You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openwebbeans.apache.org by ge...@apache.org on 2010/04/28 10:38:16 UTC

svn commit: r938818 - in /openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans: config/ lifecycle/ portable/

Author: gerdogdu
Date: Wed Apr 28 08:38:16 2010
New Revision: 938818

URL: http://svn.apache.org/viewvc?rev=938818&view=rev
Log:
Cache of Annotated types.

Modified:
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/OwbParametrizedTypeImpl.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/lifecycle/AbstractLifeCycle.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/AbstractAnnotated.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/AbstractAnnotatedMember.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/AnnotatedElementFactory.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/AnnotatedParameterImpl.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/AnnotatedTypeImpl.java

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/OwbParametrizedTypeImpl.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/OwbParametrizedTypeImpl.java?rev=938818&r1=938817&r2=938818&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/OwbParametrizedTypeImpl.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/OwbParametrizedTypeImpl.java Wed Apr 28 08:38:16 2010
@@ -23,7 +23,7 @@ import java.lang.reflect.Type;
 
 public class OwbParametrizedTypeImpl implements ParameterizedType
 {
-    private Class<?> clazz;
+    private final Class<?> clazz;
     
     public OwbParametrizedTypeImpl(Class<?> clazz)
     {

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/lifecycle/AbstractLifeCycle.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/lifecycle/AbstractLifeCycle.java?rev=938818&r1=938817&r2=938818&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/lifecycle/AbstractLifeCycle.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/lifecycle/AbstractLifeCycle.java Wed Apr 28 08:38:16 2010
@@ -31,6 +31,7 @@ import org.apache.webbeans.container.Inj
 import org.apache.webbeans.corespi.ServiceLoader;
 import org.apache.webbeans.logger.WebBeansLogger;
 import org.apache.webbeans.plugins.PluginLoader;
+import org.apache.webbeans.portable.AnnotatedElementFactory;
 import org.apache.webbeans.portable.events.ExtensionLoader;
 import org.apache.webbeans.portable.events.discovery.BeforeShutdownImpl;
 import org.apache.webbeans.proxy.JavassistProxyFactory;
@@ -160,6 +161,9 @@ public abstract class AbstractLifeCycle 
             //Delte proxies
             JavassistProxyFactory.clear();
             
+            //Delete AnnotateTypeCache
+            AnnotatedElementFactory.clear();
+            
             //After Stop
             afterStopApplication(endObject);
                         

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/AbstractAnnotated.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/AbstractAnnotated.java?rev=938818&r1=938817&r2=938818&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/AbstractAnnotated.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/AbstractAnnotated.java Wed Apr 28 08:38:16 2010
@@ -30,7 +30,7 @@ import org.apache.webbeans.util.ClassUti
 abstract class AbstractAnnotated implements Annotated
 {
     /**Base type of an annotated element*/
-    private Type baseType = null;
+    private final Type baseType;
     
     /**Type closures*/
     private Set<Type> typeClosures = new HashSet<Type>();

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/AbstractAnnotatedMember.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/AbstractAnnotatedMember.java?rev=938818&r1=938817&r2=938818&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/AbstractAnnotatedMember.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/AbstractAnnotatedMember.java Wed Apr 28 08:38:16 2010
@@ -37,10 +37,10 @@ import org.apache.webbeans.util.ClassUti
 abstract class AbstractAnnotatedMember<X> extends AbstractAnnotated implements AnnotatedMember<X>
 {
     /**Annotated type that owns this member*/
-    private AnnotatedType<X> declaringType;
+    private final AnnotatedType<X> declaringType;
     
     /**Member type*/
-    protected Member javaMember;
+    protected final Member javaMember;
     
     /**
      * Creates a new instance.

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/AnnotatedElementFactory.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/AnnotatedElementFactory.java?rev=938818&r1=938817&r2=938818&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/AnnotatedElementFactory.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/AnnotatedElementFactory.java Wed Apr 28 08:38:16 2010
@@ -16,6 +16,8 @@ package org.apache.webbeans.portable;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.Field;
 import java.lang.reflect.Method;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
 
 import javax.enterprise.inject.spi.Annotated;
 import javax.enterprise.inject.spi.AnnotatedConstructor;
@@ -23,6 +25,7 @@ import javax.enterprise.inject.spi.Annot
 import javax.enterprise.inject.spi.AnnotatedMethod;
 import javax.enterprise.inject.spi.AnnotatedType;
 
+import org.apache.webbeans.util.Asserts;
 import org.apache.webbeans.util.SecurityUtil;
 
 /**
@@ -32,6 +35,25 @@ import org.apache.webbeans.util.Security
  */
 public final class AnnotatedElementFactory
 {
+    //Cache of the AnnotatedType
+    private static ConcurrentMap<Class<?>, AnnotatedType<?>> annotatedTypeCache = 
+        new ConcurrentHashMap<Class<?>, AnnotatedType<?>>();
+    
+    //Cache of AnnotatedConstructor
+    private static ConcurrentMap<Constructor<?>, AnnotatedConstructor<?>> annotatedConstructorCache = 
+        new ConcurrentHashMap<Constructor<?>, AnnotatedConstructor<?>>();
+    
+    //Cache of AnnotatedMethod
+    private static ConcurrentMap<Method, AnnotatedMethod<?>> annotatedMethodCache = 
+        new ConcurrentHashMap<Method, AnnotatedMethod<?>>();
+    
+    //Cache of AnnotatedField
+    private static ConcurrentMap<Field, AnnotatedField<?>> annotatedFieldCache = 
+        new ConcurrentHashMap<Field, AnnotatedField<?>>();
+    
+    /**
+     * No instantiate.
+     */
     private AnnotatedElementFactory()
     {
         // Emtpty
@@ -47,27 +69,42 @@ public final class AnnotatedElementFacto
     @SuppressWarnings("unchecked")
     public static <X> AnnotatedType<X> newAnnotatedType(Class<X> annotatedClass)
     {
-        AnnotatedTypeImpl<X> annotatedType = new AnnotatedTypeImpl<X>(annotatedClass);
-        
-        Field[] fields = SecurityUtil.doPrivilegedGetDeclaredFields(annotatedClass);
-        Method[] methods = SecurityUtil.doPrivilegedGetDeclaredMethods(annotatedClass);
-        Constructor<X>[] ctxs = (Constructor<X>[])SecurityUtil.doPrivilegedGetDeclaredConstructors(annotatedClass);
-        for(Field f : fields)
-        {
-            AnnotatedField<X> af = new AnnotatedFieldImpl<X>(f, annotatedType);
-            annotatedType.addAnnotatedField(af);
-        }
-        
-        for(Method m : methods)
+        Asserts.assertNotNull(annotatedClass, "annotatedClass is null");
+        AnnotatedTypeImpl<X> annotatedType = null;
+        if(annotatedTypeCache.containsKey(annotatedClass))
         {
-            AnnotatedMethod<X> am = new AnnotatedMethodImpl<X>(m,annotatedType);
-            annotatedType.addAnnotatedMethod(am);
+            annotatedType = (AnnotatedTypeImpl<X>)annotatedTypeCache.get(annotatedClass);
         }
-        
-        for(Constructor<X> ct : ctxs)
+        else
         {
-            AnnotatedConstructor<X> ac = new AnnotatedConstructorImpl<X>(ct,annotatedType);
-            annotatedType.addAnnotatedConstructor(ac);
+            annotatedType = new AnnotatedTypeImpl<X>(annotatedClass);
+            
+            Field[] fields = SecurityUtil.doPrivilegedGetDeclaredFields(annotatedClass);
+            Method[] methods = SecurityUtil.doPrivilegedGetDeclaredMethods(annotatedClass);
+            Constructor<X>[] ctxs = (Constructor<X>[])SecurityUtil.doPrivilegedGetDeclaredConstructors(annotatedClass);
+            for(Field f : fields)
+            {
+                AnnotatedField<X> af = new AnnotatedFieldImpl<X>(f, annotatedType);
+                annotatedType.addAnnotatedField(af);
+            }
+            
+            for(Method m : methods)
+            {
+                AnnotatedMethod<X> am = new AnnotatedMethodImpl<X>(m,annotatedType);
+                annotatedType.addAnnotatedMethod(am);
+            }
+            
+            for(Constructor<X> ct : ctxs)
+            {
+                AnnotatedConstructor<X> ac = new AnnotatedConstructorImpl<X>(ct,annotatedType);
+                annotatedType.addAnnotatedConstructor(ac);
+            }        
+            
+            AnnotatedTypeImpl<X> oldType = (AnnotatedTypeImpl<X>)annotatedTypeCache.putIfAbsent(annotatedClass, annotatedType);
+            if(oldType != null)
+            {
+                annotatedType = oldType;
+            }
         }
                 
         return annotatedType;
@@ -80,9 +117,26 @@ public final class AnnotatedElementFacto
      * @param constructor constructor
      * @return new annotated constructor
      */
+    @SuppressWarnings("unchecked")
     public static <X> AnnotatedConstructor<X> newAnnotatedConstructor(Constructor<X> constructor)
     {
-        return new AnnotatedConstructorImpl<X>(constructor);
+        Asserts.assertNotNull(constructor, "constructor is null");
+        AnnotatedConstructorImpl<X> annConstructor = null;
+        if(annotatedConstructorCache.containsKey(constructor))
+        {
+            annConstructor = (AnnotatedConstructorImpl<X>)annotatedConstructorCache.get(constructor);
+        }
+        else
+        {
+            annConstructor = new AnnotatedConstructorImpl<X>(constructor);
+            AnnotatedConstructorImpl<X> old = (AnnotatedConstructorImpl<X>)annotatedConstructorCache.putIfAbsent(constructor, annConstructor);
+            if(old != null)
+            {
+                annConstructor = old;
+            }
+        }
+        
+        return annConstructor;
     }
 
     /**
@@ -93,9 +147,28 @@ public final class AnnotatedElementFacto
      * @param declaringClass declaring class
      * @return new annotated field
      */
+    @SuppressWarnings("unchecked")
     public static <X> AnnotatedField<X> newAnnotatedField(Field field, Class<X> declaringClass)
     {
-        return new AnnotatedFieldImpl<X>(field);
+        Asserts.assertNotNull(field, "field is null");
+        Asserts.assertNotNull(declaringClass, "declaringClass is null");
+        
+        AnnotatedFieldImpl<X> annotField = null;
+        if(annotatedFieldCache.containsKey(field))
+        {
+            annotField = (AnnotatedFieldImpl<X>)annotatedFieldCache.get(field);
+        }
+        else
+        {
+            annotField = new AnnotatedFieldImpl<X>(field);
+            AnnotatedFieldImpl<X> old = (AnnotatedFieldImpl<X>) annotatedFieldCache.putIfAbsent(field, annotField);
+            if(old != null)
+            {
+                annotField = old;
+            }
+        }
+        
+        return annotField; 
     }
 
     /**
@@ -106,9 +179,38 @@ public final class AnnotatedElementFacto
      * @param declaringClass declaring class info
      * @return new annotated method
      */
+    @SuppressWarnings("unchecked")
     public static <X> AnnotatedMethod<X> newAnnotatedMethod(Method method, Class<X> declaringClass)
     {
-        return new AnnotatedMethodImpl<X>(method);
+        Asserts.assertNotNull(method, "method is null");
+        Asserts.assertNotNull(declaringClass, "declaringClass is null");
+        
+        AnnotatedMethodImpl<X> annotMethod = null;
+        if(annotatedMethodCache.containsKey(method))
+        {
+            annotMethod = (AnnotatedMethodImpl<X>)annotatedMethodCache.get(method);
+        }
+        else
+        {
+            annotMethod = new AnnotatedMethodImpl<X>(method);
+            AnnotatedMethodImpl<X> old = (AnnotatedMethodImpl<X>) annotatedMethodCache.putIfAbsent(method, annotMethod);
+            if(old != null)
+            {
+                annotMethod = old;
+            }
+        }
+        
+        return annotMethod;          
+    }
+    
+    /**
+     * Clear caches.
+     */
+    public static void clear()
+    {
+        annotatedTypeCache.clear();
+        annotatedConstructorCache.clear();
+        annotatedFieldCache.clear();
+        annotatedMethodCache.clear();
     }
-
 }

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/AnnotatedParameterImpl.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/AnnotatedParameterImpl.java?rev=938818&r1=938817&r2=938818&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/AnnotatedParameterImpl.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/AnnotatedParameterImpl.java Wed Apr 28 08:38:16 2010
@@ -28,10 +28,10 @@ import javax.enterprise.inject.spi.Annot
 class AnnotatedParameterImpl<X> extends AbstractAnnotated implements AnnotatedParameter<X>
 {
     /**Declaring callable*/
-    private AnnotatedCallable<X> declaringCallable;
+    private final AnnotatedCallable<X> declaringCallable;
     
     /**Parameter position*/
-    private int position;
+    private final int position;
     
     AnnotatedParameterImpl(Type baseType, AnnotatedCallable<X> declaringCallable, int position)
     {

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/AnnotatedTypeImpl.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/AnnotatedTypeImpl.java?rev=938818&r1=938817&r2=938818&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/AnnotatedTypeImpl.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/AnnotatedTypeImpl.java Wed Apr 28 08:38:16 2010
@@ -32,7 +32,7 @@ import javax.enterprise.inject.spi.Annot
 class AnnotatedTypeImpl<X> extends AbstractAnnotated implements AnnotatedType<X>
 {
     /**Annotated class*/
-    private Class<X> annotatedClass;
+    private final Class<X> annotatedClass;
     
     /**Constructors*/
     private Set<AnnotatedConstructor<X>> constructors = new HashSet<AnnotatedConstructor<X>>();