[jboss-cvs] JBossAS SVN: r61299 - in branches/Branch_AOP_1_5/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 13:58:22 EDT 2007


Author: kabir.khan at jboss.com
Date: 2007-03-13 13:58:22 -0400 (Tue, 13 Mar 2007)
New Revision: 61299

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

Modified: branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/Advisor.java
===================================================================
--- branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/Advisor.java	2007-03-13 17:51:50 UTC (rev 61298)
+++ branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/Advisor.java	2007-03-13 17:58:22 UTC (rev 61299)
@@ -31,6 +31,7 @@
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -47,6 +48,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;
@@ -931,4 +933,32 @@
       //Implemented by base-classes
       throw new NotImplementedException("Not a legal operation for Advisor");
    }
+   
+   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: branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/advice/AspectDefinition.java
===================================================================
--- branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/advice/AspectDefinition.java	2007-03-13 17:51:50 UTC (rev 61298)
+++ branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/advice/AspectDefinition.java	2007-03-13 17:58:22 UTC (rev 61299)
@@ -41,6 +41,9 @@
    protected Scope scope = Scope.PER_VM;
    protected AspectFactory factory;
    protected boolean deployed = true;
+   /**
+    * @deprecated Should not access from outside this class
+    */
    public Map advisors = new ConcurrentReaderHashMap();
 
    /**
@@ -139,4 +142,9 @@
    {
       advisors.put(advisor, Boolean.TRUE);
    }
+   
+   public synchronized void unregisterAdvisor(Advisor advisor)
+   {
+      advisors.remove(advisor);
+   }
 }

Modified: branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/classpool/AOPClassPoolRepository.java
===================================================================
--- branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/classpool/AOPClassPoolRepository.java	2007-03-13 17:51:50 UTC (rev 61298)
+++ branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/classpool/AOPClassPoolRepository.java	2007-03-13 17:58:22 UTC (rev 61299)
@@ -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;
 
@@ -168,7 +170,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