[jboss-cvs] JBossAS SVN: r61315 - in projects/aop/trunk/aop/src/main/org/jboss/aop: advice and 1 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Tue Mar 13 17:40:20 EDT 2007


Author: kabir.khan at jboss.com
Date: 2007-03-13 17:40:20 -0400 (Tue, 13 Mar 2007)
New Revision: 61315

Modified:
   projects/aop/trunk/aop/src/main/org/jboss/aop/Advisor.java
   projects/aop/trunk/aop/src/main/org/jboss/aop/advice/AspectDefinition.java
   projects/aop/trunk/aop/src/main/org/jboss/aop/classpool/AOPClassPoolRepository.java
Log:
[JBAOP-374] Clean up advisor references from AspectDefinition

Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/Advisor.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/Advisor.java	2007-03-13 20:26:34 UTC (rev 61314)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/Advisor.java	2007-03-13 21:40:20 UTC (rev 61315)
@@ -50,6 +50,7 @@
 import org.jboss.aop.advice.Interceptor;
 import org.jboss.aop.advice.InterceptorFactory;
 import org.jboss.aop.advice.PrecedenceSorter;
+import org.jboss.aop.advice.Scope;
 import org.jboss.aop.annotation.AnnotationElement;
 import org.jboss.aop.annotation.AnnotationRepository;
 import org.jboss.aop.instrument.ConstructionTransformer;
@@ -1147,4 +1148,32 @@
          }
       };
    }
+   
+   public void cleanup()
+   {
+      //AspectDefinitions have strong links back to us
+      for(Iterator it = perInstanceAspectDefinitions.iterator() ; it.hasNext() ; )
+      {
+         AspectDefinition def = (AspectDefinition)it.next();
+         removePerInstanceAspect(def);
+         def.unregisterAdvisor(this);
+      }
+      
+      for(Iterator it = perInstanceJoinpointAspectDefinitions.keySet().iterator() ; it.hasNext() ; )
+      {
+         AspectDefinition def = (AspectDefinition)it.next();
+         removePerInstanceJoinpointAspect(def);
+         def.unregisterAdvisor(this);
+      }
+
+      AspectDefinition[] defs = (AspectDefinition[])adviceInterceptors.keySet().toArray(new AspectDefinition[adviceInterceptors.size()]);
+      for(int i = 0 ; i < defs.length ; i++)
+      {
+         if (defs[i].getScope() == Scope.PER_CLASS)
+         {
+            removePerClassAspect(defs[i]);
+            defs[i].unregisterAdvisor(this);
+         }
+      }
+   }
 }
\ No newline at end of file

Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/advice/AspectDefinition.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/advice/AspectDefinition.java	2007-03-13 20:26:34 UTC (rev 61314)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/advice/AspectDefinition.java	2007-03-13 21:40:20 UTC (rev 61315)
@@ -41,6 +41,8 @@
    protected Scope scope = Scope.PER_VM;
    protected AspectFactory factory;
    protected boolean deployed = true;
+   
+   /** @deprecated Should not access directly */
    public Map advisors = new ConcurrentReaderHashMap();
 
    /**
@@ -138,4 +140,9 @@
    {
       advisors.put(advisor, Boolean.TRUE);
    }
+   
+   public synchronized void unregisterAdvisor(Advisor advisor)
+   {
+      advisors.remove(advisor);
+   }
 }

Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/classpool/AOPClassPoolRepository.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/classpool/AOPClassPoolRepository.java	2007-03-13 20:26:34 UTC (rev 61314)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/classpool/AOPClassPoolRepository.java	2007-03-13 21:40:20 UTC (rev 61315)
@@ -21,6 +21,7 @@
 */ 
 package org.jboss.aop.classpool;
 
+import java.lang.ref.WeakReference;
 import java.lang.reflect.Field;
 import java.security.AccessController;
 import java.security.PrivilegedActionException;
@@ -30,6 +31,7 @@
 import java.util.Iterator;
 import java.util.Map;
 
+import org.jboss.aop.Advisor;
 import org.jboss.aop.AspectManager;
 import org.jboss.aop.instrument.Instrumentor;
 
@@ -193,7 +195,12 @@
                Object clazz = it.next();
                synchronized (manager.getAdvisors())
                {
-                  manager.getAdvisors().remove(clazz);
+                  WeakReference ref = (WeakReference)manager.getAdvisors().remove(clazz);
+                  Advisor advisor = (Advisor)ref.get();
+                  if (advisor != null)
+                  {
+                     advisor.cleanup();
+                  }
                   Class advisedClass = (Class)clazz;
                   try
                   {




More information about the jboss-cvs-commits mailing list