[jboss-cvs] JBossAS SVN: r73087 - in projects/aop/trunk/aop/src/main/org/jboss/aop/proxy: container and 1 other directory.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Tue May 6 14:12:48 EDT 2008


Author: kabir.khan at jboss.com
Date: 2008-05-06 14:12:48 -0400 (Tue, 06 May 2008)
New Revision: 73087

Modified:
   projects/aop/trunk/aop/src/main/org/jboss/aop/proxy/ClassProxyFactory.java
   projects/aop/trunk/aop/src/main/org/jboss/aop/proxy/container/ContainerProxyFactory.java
Log:
[JBAOP-572] Make container and class proxy caches classloader aware

Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/proxy/ClassProxyFactory.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/proxy/ClassProxyFactory.java	2008-05-06 18:02:11 UTC (rev 73086)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/proxy/ClassProxyFactory.java	2008-05-06 18:12:48 UTC (rev 73087)
@@ -57,7 +57,7 @@
 {
    private static Object maplock = new Object();
    private static WeakValueHashMap<String, Class<?>> classnameMap = new WeakValueHashMap<String, Class<?>>();
-   private static WeakHashMap<Class<?>, WeakReference<Class<?>>> proxyCache = new WeakHashMap<Class<?>, WeakReference<Class<?>>>();
+   private static WeakHashMap<ClassLoader, WeakHashMap<Class<?>, WeakReference<Class<?>>>> proxyCache = new WeakHashMap<ClassLoader, WeakHashMap<Class<?>, WeakReference<Class<?>>>>();
    private static WeakHashMap<Class<?>, Map<Long, MethodPersistentReference>> methodMapCache = new WeakHashMap<Class<?>, Map<Long, MethodPersistentReference>>();
 
    public static ClassProxy newInstance(Class<?> clazz) throws Exception
@@ -76,19 +76,32 @@
       // Don't make a proxy of a proxy !
       if (ClassProxy.class.isAssignableFrom(clazz)) clazz = clazz.getSuperclass();
 
+      ClassPool pool = AspectManager.instance().findClassPool(clazz.getClassLoader());
+      if (pool == null) throw new NullPointerException("Could not find ClassPool");
+
+      
       Class<?> proxyClass = null;
       synchronized (maplock)
       {
-         WeakReference<Class<?>> ref = proxyCache.get(clazz);
-         if (ref != null)
+         WeakHashMap<Class<?>, WeakReference<Class<?>>> proxiesForLoader = proxyCache.get(pool.getClassLoader());
+         if (proxiesForLoader == null)
          {
-            proxyClass = ref.get();
+            proxiesForLoader = new WeakHashMap<Class<?>, WeakReference<Class<?>>>();
+            proxyCache.put(pool.getClassLoader(), proxiesForLoader);
          }
+         if (proxiesForLoader != null)
+         {
+            WeakReference<Class<?>> ref = proxiesForLoader.get(pool.getClassLoader());
+            if (ref != null)
+            {
+               proxyClass = ref.get();
+            }
+         }
          if (proxyClass == null)
          {
-            proxyClass = generateProxy(clazz, mixins);
+            proxyClass = generateProxy(pool, clazz, mixins);
             classnameMap.put(clazz.getName(), proxyClass);
-            proxyCache.put(clazz, new WeakReference<Class<?>>(proxyClass));
+            proxiesForLoader.put(clazz, new WeakReference<Class<?>>(proxyClass));
             HashMap<Long, MethodPersistentReference> map = methodMap(clazz);
             methodMapCache.put(proxyClass, map);
          }
@@ -132,12 +145,9 @@
 
    private static int counter = 0;
 
-   private static CtClass createProxyCtClass(ProxyMixin[] mixins, Class<?> clazz)
+   private static CtClass createProxyCtClass(ClassPool pool, ProxyMixin[] mixins, Class<?> clazz)
    throws Exception
    {
-      ClassPool pool = AspectManager.instance().findClassPool(clazz.getClassLoader());
-      if (pool == null) throw new NullPointerException("Could not find ClassPool");
-
       String classname = "AOPClassProxy$" + counter++;
 
       CtClass template = pool.get("org.jboss.aop.proxy.ClassProxyTemplate");
@@ -303,9 +313,9 @@
       return proxy;
    }
 
-   private static Class<?> generateProxy(Class<?> clazz, ProxyMixin[] mixins) throws Exception
+   private static Class<?> generateProxy(ClassPool pool, Class<?> clazz, ProxyMixin[] mixins) throws Exception
    {
-      CtClass proxy = createProxyCtClass(mixins, clazz);
+      CtClass proxy = createProxyCtClass(pool, mixins, clazz);
       ProtectionDomain pd = clazz.getProtectionDomain();
       Class<?> proxyClass = TransformerCommon.toClass(proxy, pd);
       Map<Long, MethodPersistentReference> methodmap = ClassProxyFactory.getMethodMap(proxyClass); 
@@ -333,7 +343,7 @@
             {
                long hash = org.jboss.aop.util.MethodHashing.methodHash(declaredMethods[i]);
                if(!ignoredHash.contains(new Long(hash)))
-                  advised.put(new Long(hash), new MethodPersistentReference(declaredMethods[i], PersistentReference.REFERENCE_SOFT));
+                  advised.put(new Long(hash), new MethodPersistentReference(declaredMethods[i], PersistentReference.REFERENCE_WEAK));
             }
             else
             {

Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/proxy/container/ContainerProxyFactory.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/proxy/container/ContainerProxyFactory.java	2008-05-06 18:02:11 UTC (rev 73086)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/proxy/container/ContainerProxyFactory.java	2008-05-06 18:12:48 UTC (rev 73087)
@@ -23,6 +23,7 @@
 
 import java.io.Externalizable;
 import java.io.Serializable;
+import java.lang.ref.WeakReference;
 import java.lang.reflect.Method;
 import java.security.ProtectionDomain;
 import java.util.ArrayList;
@@ -67,14 +68,18 @@
  */
 public class ContainerProxyFactory
 {
+   final static String DELEGATE = Delegate.class.getName();
+   final static String ASPECT_MANAGED = AspectManaged.class.getName();
+   
    @SuppressWarnings("unchecked") private static final HashMap EMPTY_HASHMAP = new HashMap();
    private static final String ADVISED = Advised.class.getName();
    private static final String INSTANCE_ADVISED = InstanceAdvised.class.getName();
    private static final CtClass[] EMPTY_CTCLASS_ARRAY = new CtClass[0];
+//   private static final String[] EMPTY_STRING_ARRAY = new String[0];
    public static final String PROXY_NAME_PREFIX = "AOPContainerProxy$";
    
    private static Object maplock = new Object();
-   private static WeakHashMap<Class<?>, Map<ContainerProxyCacheKey, Class<?>>> proxyCache = new WeakHashMap<Class<?>, Map<ContainerProxyCacheKey, Class<?>>>();
+   private static WeakHashMap<ClassLoader, WeakHashMap<Class<?>, Map<ContainerProxyCacheKey, WeakReference<Class<?>>>>> proxyCache = new WeakHashMap<ClassLoader, WeakHashMap<Class<?>, Map<ContainerProxyCacheKey, WeakReference<Class<?>>>>>();
    private static volatile int counter = 0;
    
    private static CtMethod setDelegateMethod;
@@ -125,24 +130,38 @@
       // Don't make a proxy of a proxy !
       if (Delegate.class.isAssignableFrom(clazz)) clazz = clazz.getSuperclass();
 
+      ClassPool pool = AspectManager.instance().findClassPool(clazz.getClassLoader());
+      if (pool == null) throw new NullPointerException("Could not find ClassPool");
+
       Class<?> proxyClass = null;
       synchronized (maplock)
       {
-         Map<ContainerProxyCacheKey, Class<?>> map = proxyCache.get(clazz);
+         WeakHashMap<Class<?>, Map<ContainerProxyCacheKey, WeakReference<Class<?>>>> proxiesForLoader = proxyCache.get(pool.getClassLoader());
+         if (proxiesForLoader == null)
+         {
+            proxiesForLoader = new WeakHashMap<Class<?>, Map<ContainerProxyCacheKey, WeakReference<Class<?>>>>();
+            proxyCache.put(pool.getClassLoader(), proxiesForLoader);
+         }
+
+         Map<ContainerProxyCacheKey, WeakReference<Class<?>>> map = proxiesForLoader.get(clazz);
          if (map == null)
          {
-            map = new HashMap<ContainerProxyCacheKey, Class<?>>();
-            proxyCache.put(clazz, map);
+            map = new HashMap<ContainerProxyCacheKey, WeakReference<Class<?>>>();
+            proxiesForLoader.put(clazz, map);
          }
          else
          {
-            proxyClass = map.get(key);
+            WeakReference<Class<?>> proxyClassRef = map.get(key);
+            if (proxyClassRef != null)
+            {
+               proxyClass = proxyClassRef.get();
+            }
          }
          
          if (proxyClass == null)
          {
             proxyClass = generateProxy(objectAsSuper, clazz, advisor, outOfVmProxy);
-            map.put(key, proxyClass);
+            map.put(key, new WeakReference<Class<?>>(proxyClass));
          }
       }
       return proxyClass;
@@ -152,8 +171,9 @@
    {
       ArrayList<InterfaceIntroduction> introductions = advisor.getInterfaceIntroductions();
       CtClass proxy = createProxyCtClass(objectAsSuper, introductions, clazz, advisor, outOfVmProxy);
+//      ClassLoader loader = determineClassLoaderToUse(clazz, proxy);
       ProtectionDomain pd = clazz.getProtectionDomain();
-      Class<?> proxyClass = TransformerCommon.toClass(proxy, pd);
+      Class<?> proxyClass = TransformerCommon.toClass(proxy, /*loader,*/ pd);
       return proxyClass;
    }
 
@@ -882,7 +902,7 @@
          destFile.addAttribute(sig.copy(destFile.getConstPool(), EMPTY_HASHMAP));
       }
    }
-   
+
    private interface ProxyStrategy
    {
       /**




More information about the jboss-cvs-commits mailing list