[jboss-cvs] JBossAS SVN: r60587 - 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
Fri Feb 16 08:14:59 EST 2007


Author: kabir.khan at jboss.com
Date: 2007-02-16 08:14:59 -0500 (Fri, 16 Feb 2007)
New Revision: 60587

Modified:
   projects/aop/trunk/aop/src/main/org/jboss/aop/Advisor.java
   projects/aop/trunk/aop/src/main/org/jboss/aop/AspectManager.java
   projects/aop/trunk/aop/src/main/org/jboss/aop/AspectXmlLoader.java
   projects/aop/trunk/aop/src/main/org/jboss/aop/advice/AspectDefinition.java
   projects/aop/trunk/aop/src/main/org/jboss/aop/classpool/AOPScopedClassLoaderHelper.java
Log:
[JBAOP-356] Ability to attach a .aop deployment to a particular scoped classloader.

Register ScopedClassLoaderDomains per LoaderRepository instead of per (scoped) classloader.

When adding PER_INSTANCE, PER_JOINPOINT and PER_CLASS AspectDefinitions to the advisor register the Advisor with the AspectDefinition so that it can be cleaned up when we undeploy the AspectDefinition, otherwise the wrong (old) classloader is used when we redeploy the .aop file we are attaching to a deployment


Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/Advisor.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/Advisor.java	2007-02-16 12:56:20 UTC (rev 60586)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/Advisor.java	2007-02-16 13:14:59 UTC (rev 60587)
@@ -666,6 +666,7 @@
    public void addPerInstanceAspect(AspectDefinition def)
    {
       perInstanceAspectDefinitions.add(def);
+      def.registerAdvisor(this);
    }
 
    public void removePerInstanceAspect(AspectDefinition def)
@@ -687,6 +688,7 @@
       {
          joinpoints = new CopyOnWriteArraySet();
          perInstanceJoinpointAspectDefinitions.put(def, joinpoints);
+         def.registerAdvisor(this);
       }
       joinpoints.add(joinpoint);
    }
@@ -716,6 +718,7 @@
       if (aspects.containsKey(def.getName())) return;
       Object aspect = def.getFactory().createPerClass(this);
       aspects.put(def.getName(), aspect);
+      def.registerAdvisor(this);
    }
 
    public void removePerClassAspect(AspectDefinition def)

Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/AspectManager.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/AspectManager.java	2007-02-16 12:56:20 UTC (rev 60586)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/AspectManager.java	2007-02-16 13:14:59 UTC (rev 60587)
@@ -99,7 +99,7 @@
 
    // Attributes ---------------------------------------------------
    protected final WeakHashMap advisors = new WeakHashMap();
-   /** A map of domains by classloader, maintaned by the top level AspectManager */
+   /** A map of domains by loader repository, maintaned by the top level AspectManager */
    protected final WeakHashMap scopedClassLoaderDomains = new WeakHashMap();
 
    /** A map of domains by class, maintaned by the top level AspectManager */
@@ -292,7 +292,8 @@
             Domain scopedManager = null;
             synchronized (AOPClassPoolRepository.getInstance().getRegisteredCLs())
             {
-               scopedManager = (Domain)manager.scopedClassLoaderDomains.get(scopedClassLoader);
+               Object loaderRepository = scopedCLHelper.getLoaderRepository(loadingClassLoader);
+               scopedManager = (Domain)manager.scopedClassLoaderDomains.get(loaderRepository);
                if (scopedManager == null)
                {
                   scopedManager = scopedCLHelper.getScopedClassLoaderDomain(scopedClassLoader, manager);
@@ -303,7 +304,7 @@
                   }
                   scopedManager.setInheritsBindings(true);
                   scopedManager.setInheritsDeclarations(true);
-                  manager.scopedClassLoaderDomains.put(scopedClassLoader, scopedManager);
+                  manager.scopedClassLoaderDomains.put(loaderRepository, scopedManager);
                }
             }
             return scopedManager;
@@ -680,7 +681,7 @@
    {
       AOPClassPoolRepository.getInstance().unregisterClassLoader(cl);
       //top-level only
-      getScopedClassLoaderDomains().remove(cl);
+//      getScopedClassLoaderDomains().remove(cl);
    }
 
    public ArrayList getExclude()
@@ -1732,12 +1733,18 @@
 
    public void removeAspectDefinition(String name)
    {
+      internalRemoveAspectDefintion(name);
+   }
+   
+   protected AspectDefinition internalRemoveAspectDefintion(String name)
+   {
       AspectDefinition def = (AspectDefinition) aspectDefinitions.remove(name);
       if (def != null)
       {
          def.undeploy();
          if (def.getScope() == Scope.PER_VM) perVMAspects.remove(def.getName());
       }
+      return def;
    }
 
    public Map getAspectDefinitions()

Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/AspectXmlLoader.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/AspectXmlLoader.java	2007-02-16 12:56:20 UTC (rev 60586)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/AspectXmlLoader.java	2007-02-16 13:14:59 UTC (rev 60587)
@@ -1075,6 +1075,10 @@
             {
                deployDeclare(element, tag);
             }
+            else if (tag.equals("loader-repository"))
+            {
+               //Handled by AspctDeployer in JBoss
+            }
             else
             {
                throw new IllegalArgumentException("Unknown AOP tag: " + tag);

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-02-16 12:56:20 UTC (rev 60586)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/advice/AspectDefinition.java	2007-02-16 13:14:59 UTC (rev 60587)
@@ -21,6 +21,13 @@
   */
 package org.jboss.aop.advice;
 
+import java.util.Iterator;
+import java.util.Map;
+
+import org.jboss.aop.Advisor;
+
+import EDU.oswego.cs.dl.util.concurrent.ConcurrentReaderHashMap;
+
 /**
  * Contains definition of aspect or interceptor
  * Scope defaults to PER_VM if it is null.
@@ -34,6 +41,7 @@
    protected Scope scope = Scope.PER_VM;
    protected AspectFactory factory;
    protected boolean deployed = true;
+   public Map advisors = new ConcurrentReaderHashMap();
 
    /**
     * @param name
@@ -52,11 +60,32 @@
 
    public AspectDefinition() {}
 
-   public void undeploy()
+   public synchronized void undeploy()
    {
+      if (advisors.size() > 0)
+      {
+         for (Iterator it = advisors.keySet().iterator() ; it.hasNext() ; )
+         {
+            Advisor advisor = (Advisor)it.next();
+            if (advisors.remove(advisor) !=  null)
+            {
+               if (scope == Scope.PER_INSTANCE)
+               {
+                  advisor.removePerInstanceAspect(this);
+               }
+               else if (scope == Scope.PER_JOINPOINT)
+               {
+                  advisor.removePerInstanceJoinpointAspect(this);
+               }
+               else if (scope == Scope.PER_CLASS)
+               {
+                  advisor.removePerClassAspect(this);
+               }
+            }
+         }
+      }
       this.deployed = false;
    }
-
    public boolean isDeployed()
    {
       return deployed;
@@ -103,4 +132,9 @@
       if (!(obj instanceof AspectDefinition)) return false;
       return name.equals(((AspectDefinition) obj).name);
    }
+   
+   public synchronized void registerAdvisor(Advisor advisor)
+   {
+      advisors.put(advisor, Boolean.TRUE);
+   }
 }

Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/classpool/AOPScopedClassLoaderHelper.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/classpool/AOPScopedClassLoaderHelper.java	2007-02-16 12:56:20 UTC (rev 60586)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/classpool/AOPScopedClassLoaderHelper.java	2007-02-16 13:14:59 UTC (rev 60587)
@@ -32,8 +32,30 @@
  */
 public interface AOPScopedClassLoaderHelper
 {
+   /**
+    * Checks if passed in ClassLoader is a scoped JBoss classloader
+    * @param loader The loader to check
+    * @return The nearest parent (or self) in the hierarchy that is scoped, or null if not scoped
+    */
+   ClassLoader ifScopedDeploymentGetScopedParentUclForCL(ClassLoader loader);
 
-   ClassLoader ifScopedDeploymentGetScopedParentUclForCL(ClassLoader loader);
+   /**
+    * Returns the top-level JBoss classloader 
+    */
    ClassLoader getTopLevelJBossClassLoader();
+   
+   /**
+    * Creates a new domain for the passed in classloader with the passed in AspectManager as the parent
+    * @param loader A scoped classloader
+    * @param parent The AspectManager to create the domain under
+    * @return The created domain for the scoped classloader
+    */
    Domain getScopedClassLoaderDomain(ClassLoader cl, AspectManager parent);
+   
+   /**
+    * Gets the loader repository for the passed in scoped JBossClassLoader
+    * @param loader The classloader to get the loader repository for
+    * @return The LoaderRepository for the scopedc ClassLoader, or null if ClassLoader is not scoped
+    */
+   Object getLoaderRepository(ClassLoader loader);
 }




More information about the jboss-cvs-commits mailing list