[jboss-cvs] JBossAS SVN: r112006 - in projects/aop/branches/Branch_2_1/aop/src: main/java/org/jboss/aop/classpool and 2 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Thu Aug 11 12:25:33 EDT 2011


Author: kabir.khan at jboss.com
Date: 2011-08-11 12:25:33 -0400 (Thu, 11 Aug 2011)
New Revision: 112006

Modified:
   projects/aop/branches/Branch_2_1/aop/src/main/java/org/
   projects/aop/branches/Branch_2_1/aop/src/main/java/org/jboss/aop/classpool/AOPClassPoolRepository.java
   projects/aop/branches/Branch_2_1/aop/src/main/java/org/jboss/aop/proxy/container/ContainerCache.java
   projects/aop/branches/Branch_2_1/aop/src/test/java/org/
Log:
[JBAOP-807] Clean up ContainerCache containers on undeploy


Property changes on: projects/aop/branches/Branch_2_1/aop/src/main/java/org
___________________________________________________________________
Deleted: svn:mergeinfo
   - 

Modified: projects/aop/branches/Branch_2_1/aop/src/main/java/org/jboss/aop/classpool/AOPClassPoolRepository.java
===================================================================
--- projects/aop/branches/Branch_2_1/aop/src/main/java/org/jboss/aop/classpool/AOPClassPoolRepository.java	2011-08-11 16:03:57 UTC (rev 112005)
+++ projects/aop/branches/Branch_2_1/aop/src/main/java/org/jboss/aop/classpool/AOPClassPoolRepository.java	2011-08-11 16:25:33 UTC (rev 112006)
@@ -18,7 +18,7 @@
 * License along with this software; if not, write to the Free
 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
-*/ 
+*/
 package org.jboss.aop.classpool;
 
 import java.lang.ref.WeakReference;
@@ -35,6 +35,7 @@
 import org.jboss.aop.advice.SecurityActions;
 import org.jboss.aop.instrument.Instrumentor;
 import org.jboss.logging.Logger;
+import org.jboss.aop.proxy.container.ContainerCache;
 
 import javassist.ClassPool;
 import javassist.scopedpool.ScopedClassPool;
@@ -44,29 +45,29 @@
 
 /**
  * Singleton classpool repository used by aop
- * 
+ *
  * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
  * @version $Revision$
  */
 public class AOPClassPoolRepository implements ScopedClassPoolRepository
 {
    private static final Logger logger = Logger.getLogger(AOPClassPoolRepository.class);
-   
+
    private final static AOPClassPoolRepository instance = new AOPClassPoolRepository();
-   
+
    /** The classes per classppol */
    protected final HashMap<ClassLoader, HashSet<Class<?>>> ucl2classes = new HashMap<ClassLoader, HashSet<Class<?>>>();
 
    /** The top-level AspectManager this pool belongs to */
    AspectManager manager;
-   
+
    ScopedClassPoolRepository delegate;
 
    public static AOPClassPoolRepository getInstance()
    {
       return instance;
    }
-   
+
    private AOPClassPoolRepository()
    {
       this.delegate = ScopedClassPoolRepositoryImpl.getInstance();
@@ -86,7 +87,7 @@
 //      {
 //         Class jbcpf = Class.forName("org.jboss.aop.deployment.JBossClassPoolFactory");
 //         ScopedClassPoolFactory factory = (ScopedClassPoolFactory)jbcpf.newInstance();
-//         
+//
 //         Class hlpr = Class.forName("org.jboss.aop.deployment.JBossScopedClassLoaderHelper");
 //         AOPScopedClassLoaderHelper helper = (AOPScopedClassLoaderHelper)hlpr.newInstance();
 //         delegate.setClassPoolFactory(factory);
@@ -98,12 +99,12 @@
 //      }
 //      return false;//Not running in JBoss probably
 //   }
-   
+
    public void setClassPoolFactory(ScopedClassPoolFactory factory)
    {
       delegate.setClassPoolFactory(factory);
    }
-   
+
    public ScopedClassPoolFactory getClassPoolFactory()
    {
       return delegate.getClassPoolFactory();
@@ -133,10 +134,10 @@
    {
       this.manager = manager;
    }
-   
+
    /**
     * Get the registered classloaders
-    * 
+    *
     * @return the registered classloaders
     */
    public Map<ClassLoader, ClassPool> getRegisteredCLs()
@@ -151,7 +152,7 @@
    {
       delegate.clearUnregisteredClassLoaders();
    }
-   
+
    public ClassPool registerClassLoader(ClassLoader ucl)
    {
       return delegate.registerClassLoader(ucl);
@@ -161,7 +162,7 @@
    {
       delegate.unregisterClassLoader(cl);
    }
-   
+
    public void registerClass(Class<?> clazz)
    {
       ClassLoader classLoader = SecurityActions.getClassLoader(clazz);
@@ -185,7 +186,7 @@
          UnregisterClassLoaderAction.PRIVILEGED.unregister(this, cl);
       }
    }
-   
+
    private void doUnregisterClassLoader(ClassLoader cl)
    {
       synchronized (delegate.getRegisteredCLs())
@@ -226,14 +227,15 @@
                }
             }
          }
+         ContainerCache.cleanup(cl);
       }
    }
 
-   
+
    interface UnregisterClassLoaderAction
    {
       void unregister(AOPClassPoolRepository repository, ClassLoader loader);
-      
+
       UnregisterClassLoaderAction PRIVILEGED = new UnregisterClassLoaderAction()
       {
          public void unregister(final AOPClassPoolRepository repository, final ClassLoader loader)
@@ -252,8 +254,8 @@
             catch (PrivilegedActionException e)
             {
                Exception ex = e.getException();
-               if (ex instanceof RuntimeException) 
-               { 
+               if (ex instanceof RuntimeException)
+               {
                   throw (RuntimeException)ex;
                }
                throw new RuntimeException(ex);

Modified: projects/aop/branches/Branch_2_1/aop/src/main/java/org/jboss/aop/proxy/container/ContainerCache.java
===================================================================
--- projects/aop/branches/Branch_2_1/aop/src/main/java/org/jboss/aop/proxy/container/ContainerCache.java	2011-08-11 16:03:57 UTC (rev 112005)
+++ projects/aop/branches/Branch_2_1/aop/src/main/java/org/jboss/aop/proxy/container/ContainerCache.java	2011-08-11 16:25:33 UTC (rev 112006)
@@ -31,6 +31,7 @@
 import org.jboss.aop.introduction.InterfaceIntroduction;
 import org.jboss.aop.metadata.SimpleMetaData;
 import org.jboss.metadata.spi.MetaData;
+import org.jboss.util.collection.WeakSet;
 
 /**
  *
@@ -42,6 +43,7 @@
    private static volatile int counter;
    public static final Object mapLock = new Object();
    private static WeakHashMap<Class<?>, HashMap<String, ClassProxyContainer>> containerCache = new WeakHashMap<Class<?>, HashMap<String, ClassProxyContainer>>();
+   private static WeakHashMap<ClassLoader, WeakSet> classesByLoader = new WeakHashMap<ClassLoader, WeakSet>();
 
    private AspectManager manager;
    private ContainerProxyCacheKey key;
@@ -96,6 +98,20 @@
       return factory;
    }
 
+   public static void cleanup(ClassLoader cl)
+   {
+      synchronized (mapLock)
+      {
+         WeakSet classes = classesByLoader.remove(cl);
+         if (classes != null) {
+            for (Object o : classes)
+            {
+               containerCache.remove(o);
+            }
+         }
+      }
+   }
+
    public ContainerProxyCacheKey getKey()
    {
       return key;
@@ -124,10 +140,10 @@
       }
       return classAdvisor.hasAspects();
    }
-   
+
    public boolean hasIntroductionsForClassAdvisor()
    {
-      return classAdvisor.getInterfaceIntroductions().size() > 0; 
+      return classAdvisor.getInterfaceIntroductions().size() > 0;
    }
 
    public boolean requiresInstanceAdvisor()
@@ -175,7 +191,7 @@
       }
       return null;
    }
-   
+
    private ClassProxyContainer getCachedContainer(AspectManager manager)
    {
       HashMap<String, ClassProxyContainer> managerContainers = containerCache.get(key.getClazz());
@@ -214,6 +230,17 @@
          containerCache.put(key.getClazz(), managerContainers);
       }
       managerContainers.put(key.getManagerFQN(), container);
+      ClassLoader cl = key.getClazz().getClassLoader();
+      if (cl != null)
+      {
+         WeakSet classes = classesByLoader.get(cl);
+         if (classes == null)
+         {
+            classes = new WeakSet();
+            classesByLoader.put(cl, classes);
+         }
+         classes.add(key.getClazz());
+      }
    }
 
    private InterfaceIntroduction getInterfaceIntroduction()
@@ -292,36 +319,36 @@
          instanceContainer = InstanceProxyContainer.createInstanceProxyContainer(classAdvisor, introduction, metaData);
       }
    }
-   
+
    public boolean hasMoreAdvicesOrIntroductionsForInstance()
    {
       if (classAdvisor == null)
       {
          throw new IllegalStateException("initialise() must be called first");
       }
-      
+
       if (instanceContainer == null)
       {
          return false;
       }
-      
+
       if (!classAdvisor.hasSameMethodAspectLength(instanceContainer))
       {
          return true;
       }
-      
+
       if (!classAdvisor.hasSameConstructorAspectLength(instanceContainer))
       {
          return true;
       }
-      
+
       if (instanceContainer.getInterfaceIntroductions().size() > classAdvisor.getInterfaceIntroductions().size())
       {
          return true;
       }
       return false;
    }
-   
+
 }
 
 


Property changes on: projects/aop/branches/Branch_2_1/aop/src/test/java/org
___________________________________________________________________
Deleted: svn:mergeinfo
   - 



More information about the jboss-cvs-commits mailing list