[Jboss-cvs] JBossAS SVN: r57056 - in branches/Branch_AOP_1_5: aop aop/src/jdk15/org/jboss/aop/standalone aop/src/main/org/jboss/aop aop/src/main/org/jboss/aop/advice aop/src/main/org/jboss/aop/classpool aop/src/main/org/jboss/aop/contrib aop/src/main/org/jboss/aop/instrument aspects/src/jdk15/org/jboss/aop/deployment aspects/src/main/org/jboss/aop/deployment

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Thu Sep 21 14:04:55 EDT 2006


Author: kabir.khan at jboss.com
Date: 2006-09-21 14:04:34 -0400 (Thu, 21 Sep 2006)
New Revision: 57056

Added:
   branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/classpool/
   branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/classpool/AOPClassPool.java
   branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/classpool/AOPClassPoolFactory.java
   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/AOPScopedClassLoaderHelper.java
   branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/InstrumentorEnum.java
   branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/LoaderRepositoryUrlUtil.java
   branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/ScopedClassLoaderDomain.java
   branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/ScopedJBossClassPool.java
Removed:
   branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/AOPClassPool.java
   branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/AOPClassPoolFactory.java
   branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/AOPScopedClassLoaderHelper.java
   branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/ClassPoolFactory.java
Modified:
   branches/Branch_AOP_1_5/aop/build.xml
   branches/Branch_AOP_1_5/aop/src/jdk15/org/jboss/aop/standalone/Agent.java
   branches/Branch_AOP_1_5/aop/src/jdk15/org/jboss/aop/standalone/StandaloneClassPool.java
   branches/Branch_AOP_1_5/aop/src/jdk15/org/jboss/aop/standalone/StandaloneClassPoolFactory.java
   branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/AspectManager.java
   branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/Domain.java
   branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/advice/AspectFactoryWithClassLoader.java
   branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/advice/AspectFactoryWithClassLoaderSupport.java
   branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/contrib/IDEClassPoolFactory.java
   branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/ClassicInstrumentor.java
   branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/FieldAccessTransformer.java
   branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/GeneratedAdvisorInstrumentor.java
   branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/Instrumentor.java
   branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/InstrumentorFactory.java
   branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/MethodExecutionTransformer.java
   branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/OptimizedCallerInvocations.java
   branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/OptimizedConstructionInvocations.java
   branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/OptimizedConstructorInvocations.java
   branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/OptimizedFieldInvocations.java
   branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/OptimizedInvocations.java
   branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/OptimizedMethodInvocations.java
   branches/Branch_AOP_1_5/aspects/src/jdk15/org/jboss/aop/deployment/AspectManagerService32JDK5.java
   branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/AspectDeployer.java
   branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/AspectManagerService.java
   branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/AspectManagerService32.java
   branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/AspectManagerServiceMBean.java
   branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/JBossClassPool.java
   branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/JBossClassPool32.java
   branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/JBossClassPoolFactory.java
   branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/JBossClassPoolFactory32.java
   branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/JBossScopedClassLoaderHelper.java
Log:
[JBAOP-288] Unify API used by AspectDeployer with AOP 2.0

Modified: branches/Branch_AOP_1_5/aop/build.xml
===================================================================
--- branches/Branch_AOP_1_5/aop/build.xml	2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aop/build.xml	2006-09-21 18:04:34 UTC (rev 57056)
@@ -57,7 +57,7 @@
     -->
 
    <target name="configure" unless="configure.disable">
-      <property name="aop.version" value="jboss-aop-1.5.1.GA"/>
+      <property name="aop.version" value="jboss-aop-1.5.2.GA"/>
       <property name="aop.title" value="JBoss AOP Framework"/>
 
       <!-- =================== -->
@@ -67,7 +67,7 @@
       <!-- Module name(s) & version -->
       <property name="module.name" value="aop"/>
       <property name="module.Name" value="JBoss AOP"/>
-      <property name="module.version" value="1.5.1.GA"/>
+      <property name="module.version" value="1.5.2.GA"/>
 
       <!-- ========= -->
       <!-- Libraries -->

Modified: branches/Branch_AOP_1_5/aop/src/jdk15/org/jboss/aop/standalone/Agent.java
===================================================================
--- branches/Branch_AOP_1_5/aop/src/jdk15/org/jboss/aop/standalone/Agent.java	2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aop/src/jdk15/org/jboss/aop/standalone/Agent.java	2006-09-21 18:04:34 UTC (rev 57056)
@@ -38,7 +38,8 @@
 
    public static void premain(String agentArgs, Instrumentation inst)
    {
-      AspectManager.classPoolFactory = new StandaloneClassPoolFactory();
+      StandaloneClassPoolFactory factory = new StandaloneClassPoolFactory(); 
+      AspectManager.setClassPoolFactory(factory);
       // necessary for configuration
       AspectManager.instance();
       if (agentArgs != null && agentArgs.indexOf("-hotSwap") != -1)
@@ -46,7 +47,7 @@
          // setting dynamic aop strategy: hot swap classes through InstrumentationAdapter
          DynamicAOPStrategy strategy = new HotSwapStrategy(new InstrumentationAdapter(inst));
          AspectManager.instance().setDynamicAOPStrategy(strategy);
-         AspectManager.prune = false; // no prune 
+         AspectManager.setPrune(false); // no prune 
       }
       inst.addTransformer(new AOPTransformer());
    }

Modified: branches/Branch_AOP_1_5/aop/src/jdk15/org/jboss/aop/standalone/StandaloneClassPool.java
===================================================================
--- branches/Branch_AOP_1_5/aop/src/jdk15/org/jboss/aop/standalone/StandaloneClassPool.java	2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aop/src/jdk15/org/jboss/aop/standalone/StandaloneClassPool.java	2006-09-21 18:04:34 UTC (rev 57056)
@@ -25,9 +25,10 @@
 import javassist.ClassPool;
 import javassist.CtClass;
 import javassist.NotFoundException;
+import javassist.scopedpool.ScopedClassPoolRepository;
 
-import org.jboss.aop.AOPClassPool;
 import org.jboss.aop.AspectManager;
+import org.jboss.aop.classpool.AOPClassPool;
 
 /**
  * Comment
@@ -38,14 +39,14 @@
  */
 public class StandaloneClassPool extends AOPClassPool
 {
-   public StandaloneClassPool(ClassLoader cl, ClassPool src, AspectManager manager)
+   public StandaloneClassPool(ClassLoader cl, ClassPool src, ScopedClassPoolRepository repository)
    {
-      super(cl, src, manager);
+      super(cl, src, repository);
    }
 
-   public StandaloneClassPool(ClassPool src, AspectManager manager)
+   public StandaloneClassPool(ClassPool src, ScopedClassPoolRepository repository)
    {
-      super(src, manager);
+      super(src, repository);
    }
 
    //KAB: removed NotFoundException, IOException from throws clause, as 

Modified: branches/Branch_AOP_1_5/aop/src/jdk15/org/jboss/aop/standalone/StandaloneClassPoolFactory.java
===================================================================
--- branches/Branch_AOP_1_5/aop/src/jdk15/org/jboss/aop/standalone/StandaloneClassPoolFactory.java	2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aop/src/jdk15/org/jboss/aop/standalone/StandaloneClassPoolFactory.java	2006-09-21 18:04:34 UTC (rev 57056)
@@ -21,9 +21,11 @@
   */
 package org.jboss.aop.standalone;
 
-import org.jboss.aop.AOPClassPool;
-import org.jboss.aop.AspectManager;
+import org.jboss.aop.classpool.AOPClassPoolFactory;
+
 import javassist.ClassPool;
+import javassist.scopedpool.ScopedClassPool;
+import javassist.scopedpool.ScopedClassPoolRepository;
 
 /**
  * Comment
@@ -31,15 +33,15 @@
  * @author <a href="mailto:bill at jboss.org">Bill Burke</a>
  * @version $Revision$
  */
-public class StandaloneClassPoolFactory extends org.jboss.aop.AOPClassPoolFactory
+public class StandaloneClassPoolFactory extends AOPClassPoolFactory
 {
-   public AOPClassPool create(ClassLoader cl, ClassPool src, AspectManager manager)
+   public ScopedClassPool create(ClassLoader cl, ClassPool src, ScopedClassPoolRepository repository)
    {
-      return new StandaloneClassPool(cl, src, manager);
+      return new StandaloneClassPool(cl, src, repository);
    }
 
-   public AOPClassPool create(ClassPool src, AspectManager manager)
+   public ScopedClassPool create(ClassPool src, ScopedClassPoolRepository repository)
    {
-      return new StandaloneClassPool(src, manager);
+      return new StandaloneClassPool(src, repository);
    }
 }

Deleted: branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/AOPClassPool.java
===================================================================
--- branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/AOPClassPool.java	2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/AOPClassPool.java	2006-09-21 18:04:34 UTC (rev 57056)
@@ -1,240 +0,0 @@
-/*
-  * JBoss, Home of Professional Open Source
-  * Copyright 2005, JBoss Inc., and individual contributors as indicated
-  * by the @authors tag. See the copyright.txt in the distribution for a
-  * full listing of individual contributors.
-  *
-  * This is free software; you can redistribute it and/or modify it
-  * under the terms of the GNU Lesser General Public License as
-  * published by the Free Software Foundation; either version 2.1 of
-  * the License, or (at your option) any later version.
-  *
-  * This software is distributed in the hope that it will be useful,
-  * but WITHOUT ANY WARRANTY; without even the implied warranty of
-  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-  * Lesser General Public License for more details.
-  *
-  * You should have received a copy of the GNU Lesser General Public
-  * 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;
-
-import java.lang.ref.WeakReference;
-import java.security.ProtectionDomain;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.jboss.util.collection.SoftValueHashMap;
-import javassist.CannotCompileException;
-import javassist.ClassPool;
-import javassist.CtClass;
-import javassist.LoaderClassPath;
-import javassist.NotFoundException;
-
-/**
- * @author <a href="mailto:bill at jboss.org">Bill Burke</a>
- * @version $Revision$
- */
-public class AOPClassPool extends ClassPool
-{
-   protected AspectManager manager;
-   //protected ClassLoader dcl;
-   private WeakReference dcl;
-   protected LoaderClassPath classPath;
-   protected SoftValueHashMap softcache = new SoftValueHashMap();
-
-   static 
-   {
-      ClassPool.doPruning = false;
-      ClassPool.releaseUnmodifiedClassFile = false;
-   }   
-   
-   public AOPClassPool(ClassLoader cl, ClassPool src, AspectManager manager)
-   {
-      super(src);
-      this.manager = manager;
-      setClassLoader(cl);
-      if (cl != null)
-      {
-         classPath = new LoaderClassPath(cl);
-         this.insertClassPath(classPath);
-      }
-      childFirstLookup = true;
-   }
-
-   protected AOPClassPool(ClassPool src, AspectManager manager)
-   {
-      this(null, src, manager);
-   }
-   
-   public ClassLoader getClassLoader()
-   {
-      if (dcl==null)
-      {
-         return null;
-      }
-      else
-      {
-         return (ClassLoader)dcl.get();
-      }
-   }
-
-   public void setClassLoader(ClassLoader loader)
-   {
-      if (loader == null)
-      {
-         this.dcl = null;
-      }
-      else
-      {
-         this.dcl = new WeakReference(loader);
-      }
-   }
-
-   public void close()
-   {
-      this.removeClassPath(classPath);
-      classPath.close();
-      classes.clear();
-      softcache.clear();
-   }
-
-   public synchronized void flushClass(String classname)
-   {
-      classes.remove(classname);
-      softcache.remove(classname);
-   }
-
-   public synchronized void soften(CtClass clazz)
-   {
-      if (AspectManager.prune) clazz.prune();
-      classes.remove(clazz.getName());
-      softcache.put(clazz.getName(), clazz);
-   }
-
-
-   public boolean isUnloadedClassLoader()
-   {
-      return false;
-   }
-
-   protected CtClass getCached(String classname)
-   {
-      CtClass clazz = getCachedLocally(classname);
-      if (clazz == null)
-      {
-         boolean isLocal = false; 
-         
-         if (getClassLoader() != null)
-         {
-            final int lastIndex = classname.lastIndexOf('$');
-            String classResourceName = null;
-            if (lastIndex < 0)
-            {
-               classResourceName = classname.replaceAll("[\\.]", "/") + ".class";
-            }
-            else
-            {
-               classResourceName = classname.substring(0, lastIndex).replaceAll("[\\.]", "/") + classname.substring(lastIndex) + ".class";
-            }
-
-            isLocal = getClassLoader().getResource(classResourceName) != null; 
-         }
-         
-         if (!isLocal)
-         {
-            Map registeredCLs = manager.getRegisteredCLs();
-            synchronized (registeredCLs)
-            {
-               Iterator it = registeredCLs.values().iterator();
-               while (it.hasNext())
-               {
-                  AOPClassPool pool = (AOPClassPool) it.next();
-                  if (pool.isUnloadedClassLoader())
-                  {
-                     AspectManager.instance().unregisterClassLoader(pool.getClassLoader());
-                     continue;
-                  }
-   
-                  clazz = pool.getCachedLocally(classname);
-                  if (clazz != null)
-                  {
-                     return clazz;
-                  }
-               }
-            }
-         }
-      }
-      // *NOTE* NEED TO TEST WHEN SUPERCLASS IS IN ANOTHER UCL!!!!!!
-      return clazz;
-   }
-   protected void cacheCtClass(String classname, CtClass c, boolean dynamic)
-   {
-      if (dynamic)
-      {
-         super.cacheCtClass(classname, c, dynamic);
-      }
-      else
-      {
-         if (AspectManager.prune) c.prune();
-         softcache.put(classname, c);
-      }
-   }
-
-   public void lockInCache(CtClass c)
-   {
-      super.cacheCtClass(c.getName(), c, false);
-   }
-
-   protected CtClass getCachedLocally(String classname)
-   {
-      CtClass cached = (CtClass) classes.get(classname);
-      if (cached != null) return cached;
-      synchronized (softcache)
-      {
-         return (CtClass) softcache.get(classname);
-      }
-   }
-
-   public synchronized CtClass getLocally(String classname)
-           throws NotFoundException
-   {
-      softcache.remove(classname);
-      CtClass clazz = (CtClass) classes.get(classname);
-      if (clazz == null)
-      {
-         clazz = createCtClass(classname, true);
-         if (clazz == null) throw new NotFoundException(classname);
-         super.cacheCtClass(classname, clazz, false);
-      }
-
-      return clazz;
-   }
-
-
-   public static AOPClassPool createAOPClassPool(ClassLoader cl, ClassPool src, AspectManager manager)
-   {
-      return AspectManager.classPoolFactory.create(cl, src, manager);
-   }
-
-   public static AOPClassPool createAOPClassPool(ClassPool src, AspectManager manager)
-   {
-      return AspectManager.classPoolFactory.create(src, manager);
-   }
-
-   public Class toClass(CtClass ct, ClassLoader loader, ProtectionDomain domain)
-   throws CannotCompileException
-   {
-      //We need to pass up the classloader stored in this pool, as the default implementation uses the Thread context cl.
-      //In the case of JSP's in Tomcat, org.apache.jasper.servlet.JasperLoader will be stored here, while it's parent
-      //org.jboss.web.tomcat.tc5.WebCtxLoader$ENCLoader is used as the Thread context cl. The invocation class needs to
-      // be generated in the JasperLoader classloader since in the case of method invocations, the package name will be
-      //the same as for the class generated from the jsp, i.e. org.apache.jsp. For classes belonging to org.apache.jsp,
-      //JasperLoader does NOT delegate to its parent if it cannot find them.
-      lockInCache(ct);
-      return super.toClass(ct, getClassLoader(), domain);
-   }
-
-}

Deleted: branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/AOPClassPoolFactory.java
===================================================================
--- branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/AOPClassPoolFactory.java	2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/AOPClassPoolFactory.java	2006-09-21 18:04:34 UTC (rev 57056)
@@ -1,44 +0,0 @@
-/*
-  * JBoss, Home of Professional Open Source
-  * Copyright 2005, JBoss Inc., and individual contributors as indicated
-  * by the @authors tag. See the copyright.txt in the distribution for a
-  * full listing of individual contributors.
-  *
-  * This is free software; you can redistribute it and/or modify it
-  * under the terms of the GNU Lesser General Public License as
-  * published by the Free Software Foundation; either version 2.1 of
-  * the License, or (at your option) any later version.
-  *
-  * This software is distributed in the hope that it will be useful,
-  * but WITHOUT ANY WARRANTY; without even the implied warranty of
-  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-  * Lesser General Public License for more details.
-  *
-  * You should have received a copy of the GNU Lesser General Public
-  * 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;
-
-import javassist.ClassPool;
-
-/**
- * Comment
- *
- * @author <a href="mailto:bill at jboss.org">Bill Burke</a>
- * @version $Revision$
- *
- **/
-public class AOPClassPoolFactory implements ClassPoolFactory
-{
-   public AOPClassPool create(ClassLoader cl, ClassPool src, AspectManager manager)
-   {
-      return new AOPClassPool(cl, src, manager);
-   }
-
-   public AOPClassPool create(ClassPool src, AspectManager manager)
-   {
-      return new AOPClassPool(src, manager);
-   }   
-}

Deleted: branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/AOPScopedClassLoaderHelper.java
===================================================================
--- branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/AOPScopedClassLoaderHelper.java	2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/AOPScopedClassLoaderHelper.java	2006-09-21 18:04:34 UTC (rev 57056)
@@ -1,35 +0,0 @@
-/*
-* JBoss, Home of Professional Open Source
-* Copyright 2005, JBoss Inc., and individual contributors as indicated
-* by the @authors tag. See the copyright.txt in the distribution for a
-* full listing of individual contributors.
-*
-* This is free software; you can redistribute it and/or modify it
-* under the terms of the GNU Lesser General Public License as
-* published by the Free Software Foundation; either version 2.1 of
-* the License, or (at your option) any later version.
-*
-* This software is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-* Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public
-* 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;
-
-/**
- * Helper to determine if we are running within a scoped classloader. 
- * 
- * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
- * @version $Revision$
- */
-public interface AOPScopedClassLoaderHelper
-{
-
-   ClassLoader ifScopedDeploymentGetScopedParentUclForCL(ClassLoader loader);
-   ClassLoader getTopLevelJBossClassLoader();
-}

Modified: branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/AspectManager.java
===================================================================
--- branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/AspectManager.java	2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/AspectManager.java	2006-09-21 18:04:34 UTC (rev 57056)
@@ -41,14 +41,19 @@
 import org.jboss.aop.advice.AdviceBinding;
 import org.jboss.aop.advice.AdviceStack;
 import org.jboss.aop.advice.AspectDefinition;
+import org.jboss.aop.advice.AspectFactoryWithClassLoader;
 import org.jboss.aop.advice.DynamicCFlowDefinition;
 import org.jboss.aop.advice.InterceptorFactory;
 import org.jboss.aop.advice.PrecedenceDef;
 import org.jboss.aop.advice.PrecedenceDefEntry;
 import org.jboss.aop.advice.PrecedenceSorter;
 import org.jboss.aop.advice.Scope;
+import org.jboss.aop.classpool.AOPClassPool;
+import org.jboss.aop.classpool.AOPClassPoolRepository;
+import org.jboss.aop.classpool.AOPScopedClassLoaderHelper;
 import org.jboss.aop.instrument.Instrumentor;
 import org.jboss.aop.instrument.InstrumentorFactory;
+import org.jboss.aop.instrument.TransformerCommon;
 import org.jboss.aop.introduction.AnnotationIntroduction;
 import org.jboss.aop.introduction.InterfaceIntroduction;
 import org.jboss.aop.metadata.ClassMetaDataBinding;
@@ -69,8 +74,9 @@
 import javassist.ByteArrayClassPath;
 import javassist.ClassPool;
 import javassist.CtClass;
-import javassist.LoaderClassPath;
 import javassist.NotFoundException;
+import javassist.scopedpool.ScopedClassPool;
+import javassist.scopedpool.ScopedClassPoolFactory;
 
 /**
  * This singleton class manages all pointcuts and metadata.
@@ -98,8 +104,6 @@
    };
 
    // Attributes ---------------------------------------------------
-   protected final WeakHashMap registeredCLs = new WeakHashMap();
-   protected final HashMap ucl2classes = new HashMap();
 
    protected final WeakHashMap advisors = new WeakHashMap();
    /** A map of domains by classloader, maintaned by the top level AspectManager */
@@ -114,7 +118,6 @@
    /** A queue for adding new subscribed subdomains to */
    protected final WeakHashMap subscribedSubDomainsQueue = new WeakHashMap();
    protected int subscribedDomainQueueRef;
-   protected ClassPool classpool;
    protected final LinkedHashMap interfaceIntroductions = new LinkedHashMap();
    protected final LinkedHashMap annotationIntroductions = new LinkedHashMap();
    protected final LinkedHashMap annotationOverrides = new LinkedHashMap();
@@ -227,7 +230,6 @@
 
    protected static AspectManager manager;
    public static boolean optimize = true;
-   public static boolean prune = true;
    public static boolean debugClasses;//If true, the generated advisor instrumentor will output the generated classes
    public static ClassLoaderValidation classLoaderValidator;
 
@@ -235,7 +237,6 @@
     * logging switch.  We don't use log4j to avoid another heavy library
     */
    public static boolean verbose = false;
-   public static ClassPoolFactory classPoolFactory = new AOPClassPoolFactory();
 
    public static synchronized AspectManager getTopLevelAspectManager()
    {
@@ -270,9 +271,10 @@
                String pruneit = System.getProperty("jboss.aop.prune", null);
                if (pruneit != null)
                {
-                  prune = (new Boolean(pruneit)).booleanValue();
+                  AOPClassPoolRepository.getInstance().setPrune((new Boolean(pruneit)).booleanValue());
                }
                manager = new AspectManager();
+               AOPClassPoolRepository.getInstance().setAspectManager(manager);
    
                if (!verbose)
                {
@@ -333,12 +335,12 @@
          if (scopedClassLoader != null)
          {
             Domain scopedManager = null;
-            synchronized (manager.registeredCLs)
+            synchronized (AOPClassPoolRepository.getInstance().getRegisteredCLs())
             {
                scopedManager = (Domain)manager.scopedClassLoaderDomains.get(scopedClassLoader);
                if (scopedManager == null)
                {
-                  scopedManager = new Domain(manager, false);
+                  scopedManager = scopedCLHelper.getScopedClassLoaderDomain(scopedClassLoader, manager);
                   if (verbose)
                   {
                      System.out.println("Created domain " + scopedManager + " for scoped deployment on: " + 
@@ -426,9 +428,6 @@
    // Constructors -------------------------------------------------
    public AspectManager()
    {
-      classpool = ClassPool.getDefault();
-      ClassLoader cl = Thread.currentThread().getContextClassLoader();
-      classpool.insertClassPath(new LoaderClassPath(cl));
    }
 
    /**
@@ -509,7 +508,11 @@
 
          if (subDomain != null && subDomain != this)
          {
-            return subDomain.findAdvisor(clazz);
+            Advisor advisor = subDomain.findAdvisor(clazz);
+            if (advisor != null)
+            {
+               return advisor;
+            }
          }
       }
 
@@ -595,41 +598,17 @@
 
    // Public -------------------------------------------------------
 
-   public Map getRegisteredCLs()
+   public static Map getRegisteredCLs()
    {
-      clearUnregisteredClassLoaders();
-      return registeredCLs;
+      return AOPClassPoolRepository.getInstance().getRegisteredCLs();
    }
 
-   private Map getRegisteredCLsNoClear()
-   {
-      return registeredCLs;
-   }
    /**
     * This method will check to see if a register classloader has been undeployed (as in JBoss)
     */
    public void clearUnregisteredClassLoaders()
    {
-      ArrayList toUnregister = null;
-      synchronized (getRegisteredCLsNoClear())
-      {
-         Iterator it = getRegisteredCLsNoClear().values().iterator();
-         while (it.hasNext())
-         {
-            AOPClassPool pool = (AOPClassPool) it.next();
-            if (pool.isUnloadedClassLoader())
-            {
-               it.remove();
-            }
-         }
-         if (toUnregister != null)
-         {
-            for (int i = 0; i < toUnregister.size(); i++)
-            {
-               unregisterClassLoader((ClassLoader) toUnregister.get(i));
-            }
-         }
-      }
+      AOPClassPoolRepository.getInstance().clearUnregisteredClassLoaders();
    }
 
    /**
@@ -643,7 +622,7 @@
       synchronized (getRegisteredCLs())
       {
          if (!advisors.containsKey(advisor.getClazz())) return false;
-         AOPClassPool pool = (AOPClassPool) getRegisteredClassPool(advisor.getClazz().getClassLoader());
+         ScopedClassPool pool = (ScopedClassPool) getRegisteredClassPool(advisor.getClazz().getClassLoader());
          if (pool == null) return false;
          if (pool.isUnloadedClassLoader())
          {
@@ -675,39 +654,12 @@
    
    public ClassPool registerClassLoader(ClassLoader ucl)
    {
-//      System.out.println("------> registerClassLoader " + ucl);
-      synchronized (getRegisteredCLs())
-      {
-         // FIXME: Probably want to take this method out later
-         // so that AOP framework can be independent of JMX
-         // This is in here so that we can remove a UCL from the ClassPool as a
-         // ClassPool.classpath
-         if (getRegisteredCLs().containsKey(ucl))
-         {
-//            System.out.println("------> found pool");
-            return (ClassPool) getRegisteredCLs().get(ucl);
-         }
-//         System.out.println("------> creating pool");
-         AOPClassPool pool = AOPClassPool.createAOPClassPool(ucl, classpool, this);
-         getRegisteredCLs().put(ucl, pool);
-         return pool;
-      }
+      return AOPClassPoolRepository.getInstance().registerClassLoader(ucl);
    }
 
-   protected Map getUcl2Classes()
-   {
-      return ucl2classes;
-   }
-   
    protected void registerClass(Class clazz)
    {
-      HashSet classes = (HashSet) getUcl2Classes().get(clazz.getClassLoader());
-      if (classes == null)
-      {
-         classes = new HashSet();
-         getUcl2Classes().put(clazz.getClassLoader(), classes);
-      }
-      classes.add(clazz);
+      AOPClassPoolRepository.getInstance().registerClass(clazz);
    }
 
    protected Map getScopedClassLoaderDomains()
@@ -717,42 +669,9 @@
    
    public void unregisterClassLoader(ClassLoader cl)
    {
-      synchronized (getRegisteredCLs())
-      {
-         AOPClassPool pool = (AOPClassPool) getRegisteredCLs().remove(cl);
-         if (pool != null) pool.close();
-         HashSet classes = (HashSet) getUcl2Classes().remove(cl);
-         if (classes != null)
-         {
-            Iterator it = classes.iterator();
-            while (it.hasNext())
-            {
-               Object clazz = it.next();
-               synchronized (advisors)
-               {
-                  advisors.remove(clazz);
-                  Class advisedClass = (Class)clazz;
-                  try
-                  {
-                     //The static advisor field should be the only remaining hard reference to the advisor
-                     Field f = advisedClass.getDeclaredField(Instrumentor.HELPER_FIELD_NAME);
-                     f.setAccessible(true);
-                     f.set(null, null);
-                  }
-                  catch(NoSuchFieldException e)
-                  {
-                     System.out.println("[warn] Error unsetting advisor for " + advisedClass.getName() + e);
-                  }
-                  catch(IllegalAccessException e)
-                  {
-                     System.out.println("[warn] Error unsetting advisor for " + advisedClass.getName() + e);
-                  }
-               }
-            }
-         }
-         
-         getScopedClassLoaderDomains().remove(cl);
-      }
+      AOPClassPoolRepository.getInstance().unregisterClassLoader(cl);
+      //top-level only
+      getScopedClassLoaderDomains().remove(cl);
    }
 
    public ArrayList getExclude()
@@ -834,6 +753,25 @@
       return false;
    }
 
+   public static boolean getPrune()
+   {
+      return AOPClassPoolRepository.getInstance().isPrune();
+   }
+
+   public static void setPrune(boolean prune)
+   {
+      AOPClassPoolRepository.getInstance().setPrune(prune);
+   }
+
+   public static void setClassPoolFactory(ScopedClassPoolFactory factory)
+   {
+      AOPClassPoolRepository.getInstance().setClassPoolFactory(factory);
+   }
+
+   public static ScopedClassPoolFactory getClassPoolFactory()
+   {
+      return AOPClassPoolRepository.getInstance().getClassPoolFactory();
+   }
    public boolean isNonAdvisableClassName(String classname)
    {
       if (ignoreClass(classname)) return true;
@@ -972,7 +910,7 @@
          {
             pool.lockInCache(clazz);
             byte[] rtn = clazz.toBytecode();
-            if (AspectManager.prune) clazz.prune();
+            if (AspectManager.getPrune()) clazz.prune();
             return rtn;
          }
          else
@@ -1535,7 +1473,7 @@
             Advisor advisor = getAdvisorFromAdvisorsKeySetIterator(it);
             if (advisor == null) continue;
 
-            Class clazz = ((ClassAdvisor) advisor).getClazz();
+            Class clazz = advisor.getClazz();
             addAdvisorToClassMetaDataBinding(meta, clazz, advisor, clazz);
          }
       }
@@ -1785,13 +1723,37 @@
       {
          synchronized (aspect)
          {
-            AspectDefinition adef = (AspectDefinition) aspect;
-            aspect = adef.getFactory().createPerVM();
-            perVMAspects.put(def, aspect);
+            return createPerVmAspect(def, (AspectDefinition)aspect, null);
          }
       }
       return aspect;
    }
+   
+   protected Object createPerVmAspect(String def, AspectDefinition adef, ClassLoader scopedClassLoader)
+   {
+      Object instance = null;
+      synchronized (adef)
+      {
+         try
+         {
+            if (scopedClassLoader != null && adef.getFactory() instanceof AspectFactoryWithClassLoader)
+            {
+               //If a scoped classloader with no parent delegation redefines the class, we need to make sure that that class is pushed on the stack
+               ((AspectFactoryWithClassLoader)adef.getFactory()).pushScopedClassLoader(scopedClassLoader);
+            }
+            instance = adef.getFactory().createPerVM();
+            perVMAspects.put(def, instance);
+         }
+         finally
+         {
+            if (scopedClassLoader != null && adef.getFactory() instanceof AspectFactoryWithClassLoader)
+            {
+               ((AspectFactoryWithClassLoader)adef.getFactory()).popScopedClassLoader();
+            }
+         }
+      }
+      return instance;
+   }
 
    public void addAspectDefinition(AspectDefinition def)
    {

Deleted: branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/ClassPoolFactory.java
===================================================================
--- branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/ClassPoolFactory.java	2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/ClassPoolFactory.java	2006-09-21 18:04:34 UTC (rev 57056)
@@ -1,38 +0,0 @@
-/*
-  * JBoss, Home of Professional Open Source
-  * Copyright 2005, JBoss Inc., and individual contributors as indicated
-  * by the @authors tag. See the copyright.txt in the distribution for a
-  * full listing of individual contributors.
-  *
-  * This is free software; you can redistribute it and/or modify it
-  * under the terms of the GNU Lesser General Public License as
-  * published by the Free Software Foundation; either version 2.1 of
-  * the License, or (at your option) any later version.
-  *
-  * This software is distributed in the hope that it will be useful,
-  * but WITHOUT ANY WARRANTY; without even the implied warranty of
-  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-  * Lesser General Public License for more details.
-  *
-  * You should have received a copy of the GNU Lesser General Public
-  * 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;
-
-import javassist.ClassPool;
-
-/**
- * Comment
- *
- * @author <a href="mailto:bill at jboss.org">Bill Burke</a>
- * @version $Revision$
- *
- **/
-public interface ClassPoolFactory
-{
-   public AOPClassPool create(ClassLoader cl, ClassPool src, AspectManager manager);
-
-   public AOPClassPool create(ClassPool src, AspectManager manager);
-}

Modified: branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/Domain.java
===================================================================
--- branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/Domain.java	2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/Domain.java	2006-09-21 18:04:34 UTC (rev 57056)
@@ -678,19 +678,6 @@
    //Methods that should delegate to the top AspectManager
    
    /** Managed by the top-level aspect manager */
-   public Map getRegisteredCLs()
-   {
-      //ClassLoaders etc. are only managed by the top-level AspectManager
-      return parent.getRegisteredCLs();
-   }
-   
-   /** Managed by the top-level aspect manager */
-   protected Map getUcl2Classes()
-   {
-      return parent.getUcl2Classes();
-   }
-
-   /** Managed by the top-level aspect manager */
    protected Map getScopedClassLoaderDomains()
    {
       return parent.getScopedClassLoaderDomains();

Modified: branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/advice/AspectFactoryWithClassLoader.java
===================================================================
--- branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/advice/AspectFactoryWithClassLoader.java	2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/advice/AspectFactoryWithClassLoader.java	2006-09-21 18:04:34 UTC (rev 57056)
@@ -31,4 +31,7 @@
 public interface AspectFactoryWithClassLoader
 {
    public void setClassLoader(ClassLoader cl);
+   public void pushScopedClassLoader(ClassLoader scopedCl);  
+   public void popScopedClassLoader();
+   public ClassLoader peekScopedClassLoader();
 }

Modified: branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/advice/AspectFactoryWithClassLoaderSupport.java
===================================================================
--- branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/advice/AspectFactoryWithClassLoaderSupport.java	2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/advice/AspectFactoryWithClassLoaderSupport.java	2006-09-21 18:04:34 UTC (rev 57056)
@@ -34,6 +34,9 @@
 {
    private WeakReference loader;
    
+   /** If a scoped classloader with no parent delegation redefines the class, we need to make sure that that class is pushed on the stack */
+   private ThreadLocal scopedClassLoader = new ThreadLocal();
+
    protected AspectFactoryWithClassLoaderSupport()
    {
    }
@@ -51,6 +54,21 @@
       }
       return null;
    }
+   
+   public void pushScopedClassLoader(ClassLoader scopedCl)
+   {
+      scopedClassLoader.set(scopedCl);
+   }
+   
+   public void popScopedClassLoader()
+   {
+      scopedClassLoader.set(null);
+   }
+   
+   public ClassLoader peekScopedClassLoader()
+   {
+      return (ClassLoader)scopedClassLoader.get();
+   }
 
    protected Class loadClass(String name) throws ClassNotFoundException
    {

Added: branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/classpool/AOPClassPool.java
===================================================================
--- branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/classpool/AOPClassPool.java	2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/classpool/AOPClassPool.java	2006-09-21 18:04:34 UTC (rev 57056)
@@ -0,0 +1,206 @@
+/*
+  * JBoss, Home of Professional Open Source
+  * Copyright 2005, JBoss Inc., and individual contributors as indicated
+  * by the @authors tag. See the copyright.txt in the distribution for a
+  * full listing of individual contributors.
+  *
+  * This is free software; you can redistribute it and/or modify it
+  * under the terms of the GNU Lesser General Public License as
+  * published by the Free Software Foundation; either version 2.1 of
+  * the License, or (at your option) any later version.
+  *
+  * This software is distributed in the hope that it will be useful,
+  * but WITHOUT ANY WARRANTY; without even the implied warranty of
+  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+  * Lesser General Public License for more details.
+  *
+  * You should have received a copy of the GNU Lesser General Public
+  * 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;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.jboss.aop.AspectManager;
+
+import EDU.oswego.cs.dl.util.concurrent.ConcurrentReaderHashMap;
+import javassist.ClassPool;
+import javassist.CtClass;
+import javassist.NotFoundException;
+import javassist.scopedpool.ScopedClassPool;
+import javassist.scopedpool.ScopedClassPoolRepository;
+
+/**
+ * @author <a href="mailto:bill at jboss.org">Bill Burke</a>
+ * @version $Revision: 56792 $
+ */
+public class AOPClassPool extends ScopedClassPool
+{
+   /** Classnames of classes that will be created - we do not want to look for these in other pools */
+   protected ConcurrentReaderHashMap generatedClasses = new ConcurrentReaderHashMap();
+   
+   protected ConcurrentReaderHashMap localResources = new ConcurrentReaderHashMap();
+
+   static 
+   {
+      ClassPool.doPruning = false;
+      ClassPool.releaseUnmodifiedClassFile = false;
+   }   
+   
+   public AOPClassPool(ClassLoader cl, ClassPool src, ScopedClassPoolRepository repository)
+   {
+      super(cl, src, repository);
+   }
+
+   protected AOPClassPool(ClassPool src, ScopedClassPoolRepository repository)
+   {
+      this(null, src, repository);
+   }
+
+   public void setClassLoader(ClassLoader cl)
+   {
+      classLoader = new WeakReference(cl);
+   }
+   
+   public void registerGeneratedClass(String className)
+   {
+      generatedClasses.put(className, className);
+   }
+      
+   public void close()
+   {
+      super.close();
+      AOPClassPoolRepository.getInstance().perfomUnregisterClassLoader(getClassLoader());
+   }
+
+   public CtClass getCached(String classname)
+   {
+      CtClass clazz = getCachedLocally(classname);
+      if (clazz == null)
+      {
+         boolean isLocal = false; 
+
+         //FIXME - Once Javassist > 3.3.0 is out use getClassLoader0() and get rid of try/catch
+         ClassLoader cl = null;
+         try
+         {
+            cl =  getClassLoader();
+         }
+         catch (RuntimeException e)
+         {
+            //Ignore, the ScopedClassPoll throws an exception if pool is not associated with a cl
+         }
+
+         if (cl != null)
+         {
+            String classResourceName = getResourceName(classname);
+            isLocal = isLocalResource(classResourceName); 
+         }
+         
+         if (!isLocal)
+         {
+            Object o = generatedClasses.get(classname);
+            if (o == null)
+            {
+               Map registeredCLs = AspectManager.getRegisteredCLs();
+               synchronized (registeredCLs)
+               {
+                  Iterator it = registeredCLs.values().iterator();
+                  while (it.hasNext())
+                  {
+                     AOPClassPool pool = (AOPClassPool) it.next();
+                     if (pool.isUnloadedClassLoader())
+                     {
+                        AspectManager.instance().unregisterClassLoader(pool.getClassLoader());
+                        continue;
+                     }
+                     
+                     //Do not check classpools for scoped classloaders
+                     if (pool.getClass().getName().equals("org.jboss.aop.deployment.ScopedJBossClassPool"))
+                     {
+                        continue;
+                     }
+      
+                     clazz = pool.getCachedLocally(classname);
+                     if (clazz != null)
+                     {
+                        return clazz;
+                     }
+                  }
+               }
+            }
+         }
+      }
+      // *NOTE* NEED TO TEST WHEN SUPERCLASS IS IN ANOTHER UCL!!!!!!
+      return clazz;
+   }
+   
+   protected String getResourceName(String classname)
+   {
+      final int lastIndex = classname.lastIndexOf('$');
+      if (lastIndex < 0)
+      {
+         return classname.replaceAll("[\\.]", "/") + ".class";
+      }
+      else
+      {
+         return classname.substring(0, lastIndex).replaceAll("[\\.]", "/") + classname.substring(lastIndex) + ".class";
+      }
+   }
+   
+   protected boolean isLocalResource(String resourceName)
+   {
+      String classResourceName = getResourceName(resourceName);
+      Boolean isLocal = (Boolean)localResources.get(classResourceName);
+      if (isLocal != null)
+      {
+         return isLocal.booleanValue();
+      }
+      boolean localResource = getClassLoader().getResource(classResourceName) != null;
+      localResources.put(classResourceName, localResource ? Boolean.TRUE : Boolean.FALSE);
+      return localResource;
+   }
+   
+   public synchronized CtClass getLocally(String classname)
+           throws NotFoundException
+   {
+      softcache.remove(classname);
+      CtClass clazz = (CtClass) classes.get(classname);
+      if (clazz == null)
+      {
+         clazz = createCtClass(classname, true);
+         if (clazz == null) throw new NotFoundException(classname);
+         lockInCache(clazz);//Avoid use of the softclasscache
+      }
+
+      return clazz;
+   }
+
+
+   public static AOPClassPool createAOPClassPool(ClassLoader cl, ClassPool src, ScopedClassPoolRepository repository)
+   {
+      return (AOPClassPool)AspectManager.getClassPoolFactory().create(cl, src, repository);
+   }
+
+   public static AOPClassPool createAOPClassPool(ClassPool src, ScopedClassPoolRepository repository)
+   {
+      return (AOPClassPool)AspectManager.getClassPoolFactory().create(src, repository);
+   }
+   
+   public String toString()
+   {
+      ClassLoader cl = null;
+      try
+      {
+         cl = getClassLoader();
+      }
+      catch(IllegalStateException ignore)
+      {
+      }
+      return super.toString() + " - dcl " + cl;
+   }
+}

Added: branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/classpool/AOPClassPoolFactory.java
===================================================================
--- branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/classpool/AOPClassPoolFactory.java	2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/classpool/AOPClassPoolFactory.java	2006-09-21 18:04:34 UTC (rev 57056)
@@ -0,0 +1,47 @@
+/*
+  * JBoss, Home of Professional Open Source
+  * Copyright 2005, JBoss Inc., and individual contributors as indicated
+  * by the @authors tag. See the copyright.txt in the distribution for a
+  * full listing of individual contributors.
+  *
+  * This is free software; you can redistribute it and/or modify it
+  * under the terms of the GNU Lesser General Public License as
+  * published by the Free Software Foundation; either version 2.1 of
+  * the License, or (at your option) any later version.
+  *
+  * This software is distributed in the hope that it will be useful,
+  * but WITHOUT ANY WARRANTY; without even the implied warranty of
+  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+  * Lesser General Public License for more details.
+  *
+  * You should have received a copy of the GNU Lesser General Public
+  * 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 javassist.ClassPool;
+import javassist.scopedpool.ScopedClassPool;
+import javassist.scopedpool.ScopedClassPoolFactory;
+import javassist.scopedpool.ScopedClassPoolRepository;
+
+/**
+ * Comment
+ *
+ * @author <a href="mailto:bill at jboss.org">Bill Burke</a>
+ * @version $Revision: 55872 $
+ *
+ **/
+public class AOPClassPoolFactory implements ScopedClassPoolFactory
+{
+   public ScopedClassPool create(ClassLoader cl, ClassPool src, ScopedClassPoolRepository repository)
+   {
+      return new AOPClassPool(cl, src, repository);
+   }
+
+   public ScopedClassPool create(ClassPool src, ScopedClassPoolRepository repository)
+   {
+      return new AOPClassPool(src, repository);
+   }   
+}

Added: 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	2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/classpool/AOPClassPoolRepository.java	2006-09-21 18:04:34 UTC (rev 57056)
@@ -0,0 +1,234 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2005, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* 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.reflect.Field;
+import java.security.AccessController;
+import java.security.PrivilegedActionException;
+import java.security.PrivilegedExceptionAction;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.jboss.aop.AspectManager;
+import org.jboss.aop.instrument.Instrumentor;
+
+import javassist.ClassPool;
+import javassist.scopedpool.ScopedClassPool;
+import javassist.scopedpool.ScopedClassPoolFactory;
+import javassist.scopedpool.ScopedClassPoolRepository;
+import javassist.scopedpool.ScopedClassPoolRepositoryImpl;
+
+/**
+ * Singleton classpool repository used by aop
+ * 
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 46253 $
+ */
+public class AOPClassPoolRepository implements ScopedClassPoolRepository
+{
+   private final static AOPClassPoolRepository instance = new AOPClassPoolRepository();
+   
+   /** The classes per classppol */
+   protected final HashMap ucl2classes = new HashMap();
+
+   /** The top-level AspectManager this pool belongs to */
+   AspectManager manager;
+   
+   ScopedClassPoolRepository delegate;
+
+   public static AOPClassPoolRepository getInstance()
+   {
+      return instance;
+   }
+   
+   private AOPClassPoolRepository()
+   {
+      this.delegate = ScopedClassPoolRepositoryImpl.getInstance();
+      delegate.setClassPoolFactory(new AOPClassPoolFactory());
+   }
+
+
+   public void setClassPoolFactory(ScopedClassPoolFactory factory)
+   {
+      delegate.setClassPoolFactory(factory);
+   }
+   
+   public ScopedClassPoolFactory getClassPoolFactory()
+   {
+      return delegate.getClassPoolFactory();
+   }
+
+   public boolean isPrune()
+   {
+      return delegate.isPrune();
+   }
+
+   public void setPrune(boolean prune)
+   {
+      delegate.setPrune(prune);
+   }
+
+   public ScopedClassPool createScopedClassPool(ClassLoader cl, ClassPool src)
+   {
+      return delegate.createScopedClassPool(cl, src);
+   }
+
+   public ClassPool findClassPool(ClassLoader cl)
+   {
+      return delegate.findClassPool(cl);
+   }
+
+   public void setAspectManager(AspectManager manager)
+   {
+      this.manager = manager;
+   }
+   
+   /**
+    * Get the registered classloaders
+    * 
+    * @return the registered classloaders
+    */
+   public Map getRegisteredCLs()
+   {
+      return delegate.getRegisteredCLs();
+   }
+
+   /**
+    * This method will check to see if a register classloader has been undeployed (as in JBoss)
+    */
+   public void clearUnregisteredClassLoaders()
+   {
+      delegate.clearUnregisteredClassLoaders();
+   }
+   
+   public ClassPool registerClassLoader(ClassLoader ucl)
+   {
+      return delegate.registerClassLoader(ucl);
+   }
+
+   public void unregisterClassLoader(ClassLoader cl)
+   {
+      delegate.unregisterClassLoader(cl);
+   }
+   
+   public void registerClass(Class clazz)
+   {
+      HashSet classes = (HashSet) ucl2classes.get(clazz.getClassLoader());
+      if (classes == null)
+      {
+         classes = new HashSet();
+         ucl2classes.put(clazz.getClassLoader(), classes);
+      }
+      classes.add(clazz);
+   }
+
+   public void perfomUnregisterClassLoader(ClassLoader cl)
+   {
+      if (System.getSecurityManager() == null)
+      {
+         UnregisterClassLoaderAction.NON_PRIVILEGED.unregister(this, cl);
+      }
+      else
+      {
+         UnregisterClassLoaderAction.PRIVILEGED.unregister(this, cl);
+      }
+   }
+   
+   private void doUnregisterClassLoader(ClassLoader cl)
+   {
+      synchronized (delegate.getRegisteredCLs())
+      {
+         HashSet classes = (HashSet) ucl2classes.remove(cl);
+         if (classes != null)
+         {
+            Iterator it = classes.iterator();
+            while (it.hasNext())
+            {
+               Object clazz = it.next();
+               synchronized (manager.getAdvisors())
+               {
+                  manager.getAdvisors().remove(clazz);
+                  Class advisedClass = (Class)clazz;
+                  try
+                  {
+                     //The static advisor field should be the only remaining hard reference to the advisor
+                     Field f = advisedClass.getDeclaredField(Instrumentor.HELPER_FIELD_NAME);
+                     f.setAccessible(true);
+                     f.set(null, null);
+                  }
+                  catch(NoSuchFieldException e)
+                  {
+                     System.out.println("[warn] Error unsetting advisor for " + advisedClass.getName() + " " + e);
+                  }
+                  catch(IllegalAccessException e)
+                  {
+                     System.out.println("[warn] Error unsetting advisor for " + advisedClass.getName() + " " + e);
+                  }
+               }
+            }
+         }
+      }
+   }
+
+   
+   interface UnregisterClassLoaderAction
+   {
+      void unregister(AOPClassPoolRepository repository, ClassLoader loader);
+      
+      UnregisterClassLoaderAction PRIVILEGED = new UnregisterClassLoaderAction()
+      {
+         public void unregister(final AOPClassPoolRepository repository, final ClassLoader loader)
+         {
+            try
+            {
+               AccessController.doPrivileged(new PrivilegedExceptionAction()
+               {
+                  public Object run()
+                  {
+                     repository.doUnregisterClassLoader(loader);
+                     return null;
+                  }
+               });
+            }
+            catch (PrivilegedActionException e)
+            {
+               Exception ex = e.getException();
+               if (ex instanceof RuntimeException) 
+               { 
+                  throw (RuntimeException)ex;
+               }
+               throw new RuntimeException(ex);
+            }
+         }
+      };
+
+      UnregisterClassLoaderAction NON_PRIVILEGED = new UnregisterClassLoaderAction()
+      {
+         public void unregister(AOPClassPoolRepository repository, ClassLoader loader)
+         {
+            repository.doUnregisterClassLoader(loader);
+         }
+      };
+   }
+}

Added: branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/classpool/AOPScopedClassLoaderHelper.java
===================================================================
--- branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/classpool/AOPScopedClassLoaderHelper.java	2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/classpool/AOPScopedClassLoaderHelper.java	2006-09-21 18:04:34 UTC (rev 57056)
@@ -0,0 +1,39 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2005, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* 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 org.jboss.aop.AspectManager;
+import org.jboss.aop.Domain;
+
+/**
+ * Helper to determine if we are running within a scoped classloader. 
+ * 
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 56777 $
+ */
+public interface AOPScopedClassLoaderHelper
+{
+
+   ClassLoader ifScopedDeploymentGetScopedParentUclForCL(ClassLoader loader);
+   ClassLoader getTopLevelJBossClassLoader();
+   Domain getScopedClassLoaderDomain(ClassLoader cl, AspectManager parent);
+}

Modified: branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/contrib/IDEClassPoolFactory.java
===================================================================
--- branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/contrib/IDEClassPoolFactory.java	2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/contrib/IDEClassPoolFactory.java	2006-09-21 18:04:34 UTC (rev 57056)
@@ -30,17 +30,19 @@
 import javassist.ClassPool;
 import javassist.CtClass;
 import javassist.LoaderClassPath;
+import javassist.scopedpool.ScopedClassPool;
+import javassist.scopedpool.ScopedClassPoolFactory;
+import javassist.scopedpool.ScopedClassPoolRepository;
 
-import org.jboss.aop.AOPClassPool;
 import org.jboss.aop.AspectManager;
-import org.jboss.aop.ClassPoolFactory;
+import org.jboss.aop.classpool.AOPClassPool;
 
 /**
  * @author Marshall
  *         <p/>
  *         This is a class pool factory used by JBossIDE to create an AOP Class Pool
  */
-public class IDEClassPoolFactory implements ClassPoolFactory
+public class IDEClassPoolFactory implements ScopedClassPoolFactory
 {
 
    private ArrayList classPaths;
@@ -50,15 +52,15 @@
       classPaths = new ArrayList();
    }
 
-   public AOPClassPool create(ClassLoader loader, ClassPool pool, AspectManager manager)
+   public ScopedClassPool create(ClassLoader loader, ClassPool pool, ScopedClassPoolRepository repository)
    {
-      SimpleClassPool classPool = new SimpleClassPool(loader, pool, manager);
+      SimpleClassPool classPool = new SimpleClassPool(loader, pool, repository);
       return classPool;
    }
 
-   public AOPClassPool create(ClassPool pool, AspectManager manager)
+   public ScopedClassPool create(ClassPool pool, ScopedClassPoolRepository repository)
    {
-      SimpleClassPool classPool = new SimpleClassPool(pool, manager);
+      SimpleClassPool classPool = new SimpleClassPool(pool, repository);
       return classPool;
    }
 
@@ -78,15 +80,15 @@
    {
       private Loader loader;
 
-      public SimpleClassPool(ClassLoader loader, ClassPool pool, AspectManager manager)
+      public SimpleClassPool(ClassLoader loader, ClassPool pool, ScopedClassPoolRepository repository)
       {
-         super(loader, pool, manager);
+         super(loader, pool, repository);
          loadClasspath();
       }
 
-      public SimpleClassPool(ClassPool pool, AspectManager manager)
+      public SimpleClassPool(ClassPool pool, ScopedClassPoolRepository repository)
       {
-         super(pool, manager);
+         super(pool, repository);
          loadClasspath();
 
       }

Modified: branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/ClassicInstrumentor.java
===================================================================
--- branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/ClassicInstrumentor.java	2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/ClassicInstrumentor.java	2006-09-21 18:04:34 UTC (rev 57056)
@@ -28,9 +28,9 @@
 import javassist.CtNewMethod;
 import javassist.NotFoundException;
 
-import org.jboss.aop.AOPClassPool;
 import org.jboss.aop.AspectManager;
 import org.jboss.aop.ClassAdvisor;
+import org.jboss.aop.classpool.AOPClassPool;
 
 /**
  * Comment

Modified: branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/FieldAccessTransformer.java
===================================================================
--- branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/FieldAccessTransformer.java	2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/FieldAccessTransformer.java	2006-09-21 18:04:34 UTC (rev 57056)
@@ -24,9 +24,9 @@
 import java.util.Collection;
 import java.util.Iterator;
 import java.util.List;
-import org.jboss.aop.AOPClassPool;
 import org.jboss.aop.AspectManager;
 import org.jboss.aop.ClassAdvisor;
+import org.jboss.aop.classpool.AOPClassPool;
 
 import javassist.CannotCompileException;
 import javassist.ClassPool;

Modified: branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/GeneratedAdvisorInstrumentor.java
===================================================================
--- branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/GeneratedAdvisorInstrumentor.java	2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/GeneratedAdvisorInstrumentor.java	2006-09-21 18:04:34 UTC (rev 57056)
@@ -31,7 +31,6 @@
 import javassist.Modifier;
 import javassist.NotFoundException;
 
-import org.jboss.aop.AOPClassPool;
 import org.jboss.aop.AspectManager;
 import org.jboss.aop.ClassAdvisor;
 import org.jboss.aop.ConByMethodInfo;
@@ -40,6 +39,7 @@
 import org.jboss.aop.JoinPointInfo;
 import org.jboss.aop.MethodByMethodInfo;
 import org.jboss.aop.MethodInfo;
+import org.jboss.aop.classpool.AOPClassPool;
 import org.jboss.aop.util.JavassistToReflect;
 
 /**

Modified: branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/Instrumentor.java
===================================================================
--- branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/Instrumentor.java	2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/Instrumentor.java	2006-09-21 18:04:34 UTC (rev 57056)
@@ -29,12 +29,13 @@
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
-import org.jboss.aop.AOPClassPool;
 import org.jboss.aop.Advised;
 import org.jboss.aop.Advisor;
 import org.jboss.aop.AspectManager;
 import org.jboss.aop.ClassAdvisor;
 import org.jboss.aop.annotation.compiler.AnnotationInfoCreator;
+import org.jboss.aop.classpool.AOPClassPool;
+import org.jboss.aop.classpool.AOPClassPoolRepository;
 import org.jboss.aop.introduction.AnnotationIntroduction;
 import org.jboss.aop.introduction.InterfaceIntroduction;
 import org.jboss.aop.util.CtConstructorComparator;
@@ -546,7 +547,7 @@
       String ref = null;
       try
       {
-         AOPClassPool pool = AOPClassPool.createAOPClassPool(clazz.getClassPool(), manager);
+         AOPClassPool pool = AOPClassPool.createAOPClassPool(clazz.getClassPool(), AOPClassPoolRepository.getInstance());
 
          Iterator it = clazz.getRefClasses().iterator();
          while (it.hasNext())

Added: branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/InstrumentorEnum.java
===================================================================
--- branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/InstrumentorEnum.java	2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/InstrumentorEnum.java	2006-09-21 18:04:34 UTC (rev 57056)
@@ -0,0 +1,41 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2005, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* 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.instrument;
+
+/**
+ * 
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 45806 $
+ */
+public class InstrumentorEnum
+{
+   public static final InstrumentorEnum CLASSIC = new InstrumentorEnum(1);
+   public static final InstrumentorEnum GENERATED_ADVISOR = new InstrumentorEnum(2);
+   public static final InstrumentorEnum OTHER_INSTRUMENTOR = new InstrumentorEnum(1000); //The jrockit aop instrumentor is in another jar which we should not depend on
+
+   int instrumentor;
+
+   public InstrumentorEnum(int i)
+   {
+      instrumentor = i;
+   }
+}

Modified: branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/InstrumentorFactory.java
===================================================================
--- branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/InstrumentorFactory.java	2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/InstrumentorFactory.java	2006-09-21 18:04:34 UTC (rev 57056)
@@ -23,8 +23,8 @@
 
 import java.lang.reflect.Constructor;
 
-import org.jboss.aop.AOPClassPool;
 import org.jboss.aop.AspectManager;
+import org.jboss.aop.classpool.AOPClassPool;
 
 /**
  * Comment
@@ -33,12 +33,9 @@
  * @version $Revision$
  */
 public class InstrumentorFactory 
-{
-   protected static final int CLASSIC = 1;
-   protected static final int GENERATED_ADVISOR = 2;
-   protected static final int OTHER_INSTRUMENTOR = 1000; //The jrockit aop instrumentor is in another jar which we should not depend on
-   protected static int instrumentor = 0; 
-   
+{ 
+   protected static InstrumentorEnum instrumentor; 
+
    protected static Constructor otherInstrumentorConstructor;
    
    private static final Class[] CONSTRUCTOR_SIG = new Class[] {AOPClassPool.class, AspectManager.class, JoinpointClassifier.class, DynamicTransformationObserver.class};
@@ -54,11 +51,11 @@
       {
          if (property.equals(ClassicInstrumentor.class.getName()))
          {
-            instrumentor = CLASSIC;
+            instrumentor = InstrumentorEnum.CLASSIC;
          }
          else if (property.equals(GeneratedAdvisorInstrumentor.class.getName()))
          {
-            instrumentor = GENERATED_ADVISOR;
+            instrumentor = InstrumentorEnum.GENERATED_ADVISOR;
          }
          else
          {
@@ -84,17 +81,17 @@
          {
             System.out.println("[debug] Defaulting instrumentor to: " + ClassicInstrumentor.class.getName());
          }
-         instrumentor = CLASSIC;
+         instrumentor = InstrumentorEnum.CLASSIC;
       }
    }
    
    public static Instrumentor getInstrumentor(AOPClassPool pool, AspectManager manager, JoinpointClassifier joinpointClassifier, DynamicTransformationObserver observer)
    {
-      if (instrumentor == CLASSIC)
+      if (instrumentor == InstrumentorEnum.CLASSIC)
       {
          return new ClassicInstrumentor(pool, manager, joinpointClassifier, observer);         
       }
-      else if (instrumentor == GENERATED_ADVISOR)
+      else if (instrumentor == InstrumentorEnum.GENERATED_ADVISOR)
       {
          return new GeneratedAdvisorInstrumentor(pool, manager, joinpointClassifier, observer);
       }
@@ -115,19 +112,39 @@
       }
    }
    
-
    public static Instrumentor getInstrumentor(AspectManager manager, JoinpointClassifier joinpointClassifier)
    {
-      switch(instrumentor)
+      if (instrumentor == InstrumentorEnum.CLASSIC)
       {
-         case CLASSIC:
-            return new ClassicInstrumentor(manager, joinpointClassifier);
-         case GENERATED_ADVISOR:
-            return new GeneratedAdvisorInstrumentor(manager, joinpointClassifier);
-         default:
-            throw new RuntimeException("Instrumentor is not set");
-               
+         return new ClassicInstrumentor(manager, joinpointClassifier);
       }
+      else if (instrumentor == InstrumentorEnum.GENERATED_ADVISOR)
+      {
+         return new GeneratedAdvisorInstrumentor(manager, joinpointClassifier);
+      }
+      else
+      {
+         throw new RuntimeException("Instrumentor is not set");
+      }
    }
-   
+
+   public static String getInstrumentorName()
+   {
+      if (instrumentor == InstrumentorEnum.CLASSIC)
+      {
+         return ClassicInstrumentor.class.getName();
+      }
+      else if (instrumentor == InstrumentorEnum.GENERATED_ADVISOR)
+      {
+         return GeneratedAdvisorInstrumentor.class.getName();
+      }
+      else if (instrumentor == InstrumentorEnum.OTHER_INSTRUMENTOR)
+      {
+         return otherInstrumentorConstructor.getName();
+      }
+      else
+      {
+         throw new RuntimeException("Instrumentor is not set");
+      }
+   }
 }

Modified: branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/MethodExecutionTransformer.java
===================================================================
--- branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/MethodExecutionTransformer.java	2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/MethodExecutionTransformer.java	2006-09-21 18:04:34 UTC (rev 57056)
@@ -25,8 +25,8 @@
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.Iterator;
-import org.jboss.aop.AOPClassPool;
 import org.jboss.aop.ClassAdvisor;
+import org.jboss.aop.classpool.AOPClassPool;
 import org.jboss.aop.util.JavassistMethodHashing;
 
 import javassist.CannotCompileException;

Modified: branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/OptimizedCallerInvocations.java
===================================================================
--- branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/OptimizedCallerInvocations.java	2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/OptimizedCallerInvocations.java	2006-09-21 18:04:34 UTC (rev 57056)
@@ -22,6 +22,8 @@
 package org.jboss.aop.instrument;
 
 
+import org.jboss.aop.classpool.AOPClassPool;
+
 import javassist.CannotCompileException;
 import javassist.CtClass;
 import javassist.CtConstructor;
@@ -31,8 +33,6 @@
 import javassist.Modifier;
 import javassist.NotFoundException;
 
-import org.jboss.aop.AOPClassPool;
-
 /**
  * Comment
  *

Modified: branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/OptimizedConstructionInvocations.java
===================================================================
--- branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/OptimizedConstructionInvocations.java	2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/OptimizedConstructionInvocations.java	2006-09-21 18:04:34 UTC (rev 57056)
@@ -26,7 +26,7 @@
 import java.net.URI;
 import java.net.URL;
 
-import org.jboss.aop.AOPClassPool;
+import org.jboss.aop.classpool.AOPClassPool;
 import org.jboss.aop.standalone.Compiler;
 
 import javassist.ClassPool;

Modified: branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/OptimizedConstructorInvocations.java
===================================================================
--- branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/OptimizedConstructorInvocations.java	2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/OptimizedConstructorInvocations.java	2006-09-21 18:04:34 UTC (rev 57056)
@@ -26,7 +26,7 @@
 import java.net.URI;
 import java.net.URL;
 
-import org.jboss.aop.AOPClassPool;
+import org.jboss.aop.classpool.AOPClassPool;
 import org.jboss.aop.standalone.Compiler;
 
 import javassist.CannotCompileException;

Modified: branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/OptimizedFieldInvocations.java
===================================================================
--- branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/OptimizedFieldInvocations.java	2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/OptimizedFieldInvocations.java	2006-09-21 18:04:34 UTC (rev 57056)
@@ -21,7 +21,7 @@
   */
 package org.jboss.aop.instrument;
 
-import org.jboss.aop.AOPClassPool;
+import org.jboss.aop.classpool.AOPClassPool;
 import org.jboss.aop.util.JavassistToReflect;
 
 import javassist.CannotCompileException;

Modified: branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/OptimizedInvocations.java
===================================================================
--- branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/OptimizedInvocations.java	2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/OptimizedInvocations.java	2006-09-21 18:04:34 UTC (rev 57056)
@@ -22,14 +22,14 @@
 package org.jboss.aop.instrument;
 
 
+import org.jboss.aop.classpool.AOPClassPool;
+
 import javassist.CannotCompileException;
 import javassist.CtClass;
 import javassist.CtConstructor;
 import javassist.CtNewConstructor;
 import javassist.NotFoundException;
 
-import org.jboss.aop.AOPClassPool;
-
 /**
  * Comment
  *

Modified: branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/OptimizedMethodInvocations.java
===================================================================
--- branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/OptimizedMethodInvocations.java	2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/OptimizedMethodInvocations.java	2006-09-21 18:04:34 UTC (rev 57056)
@@ -32,8 +32,8 @@
 import javassist.Modifier;
 import javassist.NotFoundException;
 
-import org.jboss.aop.AOPClassPool;
 import org.jboss.aop.ClassAdvisor;
+import org.jboss.aop.classpool.AOPClassPool;
 
 /**
  * Comment

Modified: branches/Branch_AOP_1_5/aspects/src/jdk15/org/jboss/aop/deployment/AspectManagerService32JDK5.java
===================================================================
--- branches/Branch_AOP_1_5/aspects/src/jdk15/org/jboss/aop/deployment/AspectManagerService32JDK5.java	2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aspects/src/jdk15/org/jboss/aop/deployment/AspectManagerService32JDK5.java	2006-09-21 18:04:34 UTC (rev 57056)
@@ -21,7 +21,8 @@
   */
 package org.jboss.aop.deployment;
 
-import org.jboss.aop.ClassPoolFactory;
+import javassist.scopedpool.ScopedClassPoolFactory;
+
 import org.jboss.aop.ClassLoaderValidation;
 
 /**
@@ -31,7 +32,7 @@
  */
 public class AspectManagerService32JDK5 extends AspectManagerServiceJDK5
 {
-   protected ClassPoolFactory createFactory() throws Exception
+   protected ScopedClassPoolFactory  createFactory() throws Exception
    {
       return new JBossClassPoolFactory32(tmpClassesDir);
    }

Modified: branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/AspectDeployer.java
===================================================================
--- branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/AspectDeployer.java	2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/AspectDeployer.java	2006-09-21 18:04:34 UTC (rev 57056)
@@ -167,7 +167,7 @@
          AspectXmlLoader.deployXML(docURL, scl);
          Notification msg = new Notification("AOP Deploy", this, getNextNotificationSequenceNumber());
          sendNotification(msg);
-         log.info("Deployed AOP: " + di.url);
+         log.debug("Deployed AOP: " + di.url);
       }
       catch (Exception ex)
       {

Modified: branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/AspectManagerService.java
===================================================================
--- branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/AspectManagerService.java	2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/AspectManagerService.java	2006-09-21 18:04:34 UTC (rev 57056)
@@ -28,6 +28,9 @@
 import java.util.Iterator;
 import java.util.Map;
 import java.util.StringTokenizer;
+
+import javassist.scopedpool.ScopedClassPoolFactory;
+
 import javax.management.Attribute;
 import javax.management.AttributeNotFoundException;
 import javax.management.InstanceNotFoundException;
@@ -40,10 +43,10 @@
 import org.jboss.aop.AspectNotificationHandler;
 import org.jboss.aop.AspectXmlLoader;
 import org.jboss.aop.ClassLoaderValidation;
-import org.jboss.aop.ClassPoolFactory;
 import org.jboss.aop.Deployment;
 import org.jboss.aop.hook.JDK14Transformer;
 import org.jboss.aop.hook.JDK14TransformerManager;
+import org.jboss.aop.instrument.InstrumentorFactory;
 import org.jboss.mx.server.ServerConstants;
 import org.jboss.mx.util.ObjectNameFactory;
 import org.jboss.system.ServiceMBeanSupport;
@@ -81,7 +84,7 @@
 
    // Public -------------------------------------------------------
 
-   protected ClassPoolFactory createFactory() throws Exception
+   protected ScopedClassPoolFactory createFactory() throws Exception
    {
       return new JBossClassPoolFactory(tmpClassesDir);
    }
@@ -105,7 +108,7 @@
       // Validate the the tmp dir exists
       if (tmpClassesDir.exists() == false && tmpClassesDir.mkdirs() == false)
          throw new FileNotFoundException("Failed to create tmpClassesDir: " + tmpClassesDir.getAbsolutePath());
-      AspectManager.classPoolFactory = createFactory();
+      AspectManager.setClassPoolFactory(createFactory());
       
       AspectManager.classLoaderValidator = createClassLoaderValidation();
       // Add the tmp classes dir to our UCL classpath
@@ -243,12 +246,12 @@
 
    public boolean getPrune()
    {
-      return AspectManager.prune;
+      return AspectManager.getPrune();
    }
 
    public void setPrune(boolean prune)
    {
-      AspectManager.prune = prune;
+      AspectManager.setPrune(prune);
    }
 
    public String getExclude()
@@ -562,4 +565,15 @@
       }
       this.enableLoadtimeWeaving = enableTransformer;
    }
+   
+   public String getInstrumentor()
+   {
+      return InstrumentorFactory.getInstrumentorName();
+   }
+   
+   public void setInstrumentor(String instrumentor)
+   {
+      InstrumentorFactory.initialise(instrumentor);
+   }
+
 }

Modified: branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/AspectManagerService32.java
===================================================================
--- branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/AspectManagerService32.java	2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/AspectManagerService32.java	2006-09-21 18:04:34 UTC (rev 57056)
@@ -21,8 +21,9 @@
 */
 package org.jboss.aop.deployment;
 
+import javassist.scopedpool.ScopedClassPoolFactory;
+
 import org.jboss.aop.ClassLoaderValidation;
-import org.jboss.aop.ClassPoolFactory;
 
 /**
  * Comment
@@ -32,7 +33,7 @@
  */
 public class AspectManagerService32 extends AspectManagerService
 {
-   protected ClassPoolFactory createFactory() throws Exception
+   protected ScopedClassPoolFactory createFactory() throws Exception
    {
       return new JBossClassPoolFactory32(tmpClassesDir);
    }

Modified: branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/AspectManagerServiceMBean.java
===================================================================
--- branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/AspectManagerServiceMBean.java	2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/AspectManagerServiceMBean.java	2006-09-21 18:04:34 UTC (rev 57056)
@@ -119,4 +119,9 @@
 
    void setIgnore(String ignore);
    
+   String getInstrumentor();
+   
+   void setInstrumentor(String instrumentor);
+   
+   
 }

Modified: branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/JBossClassPool.java
===================================================================
--- branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/JBossClassPool.java	2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/JBossClassPool.java	2006-09-21 18:04:34 UTC (rev 57056)
@@ -23,12 +23,15 @@
 
 import java.io.File;
 import java.io.FileOutputStream;
-import org.jboss.aop.AOPClassPool;
-import org.jboss.aop.AspectManager;
+import java.net.URL;
+import java.security.ProtectionDomain;
+
+import org.jboss.aop.classpool.AOPClassPool;
 import org.jboss.mx.loading.RepositoryClassLoader;
 import javassist.CannotCompileException;
 import javassist.ClassPool;
 import javassist.CtClass;
+import javassist.scopedpool.ScopedClassPoolRepository;
 
 /**
  * Comment
@@ -42,18 +45,20 @@
     * Used for dynamically created classes (see loadClass(String, byte[]), ClassLoader)
     */
    protected File tempdir = null;
+   protected URL tempURL = null;
    // For loadClass tmpdir creation for UCL
    protected final Object tmplock = new Object();
-
-   protected JBossClassPool(ClassLoader cl, ClassPool src, AspectManager manager, File tmp)
+   
+   protected JBossClassPool(ClassLoader cl, ClassPool src, ScopedClassPoolRepository repository, File tmp, URL tmpURL)
    {
-      super(cl, src, manager);
+      super(cl, src, repository);
       tempdir = tmp;
+      tempURL = tmpURL;
    }
 
-   protected JBossClassPool(ClassPool src, AspectManager manager)
+   protected JBossClassPool(ClassPool src, ScopedClassPoolRepository repository)
    {
-      super(src, manager);
+      super(src, repository);
    }
 
    public boolean isUnloadedClassLoader()
@@ -66,19 +71,19 @@
       return false;
    }
 
-   public Class toClass(CtClass cc, ClassLoader loader)
+   public Class toClass(CtClass cc, ClassLoader loader, ProtectionDomain domain)
    throws CannotCompileException
    {
       lockInCache(cc);
       if (getClassLoader() == null || tempdir == null)
       {
-         return super.toClass(cc);
+         return super.toClass(cc, loader, domain);
       }
       Class dynClass = null;
       try
       {
          File classFile = null;
-         String classFileName = cc.getName().replace('.', '/') + ".class";
+         String classFileName = getResourceName(cc.getName());
          // Write the clas file to the tmpdir
          synchronized (tmplock)
          {
@@ -112,4 +117,19 @@
       return dynClass;
    }
 
+   protected boolean isLocalResource(String resourceName)
+   {
+      if (super.isLocalResource(resourceName))
+      {
+         return true;
+      }
+      
+      File file = new File(tempdir, resourceName);
+      if (file.exists())
+      {
+         return true;
+      }
+      
+      return false;
+   }
 }

Modified: branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/JBossClassPool32.java
===================================================================
--- branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/JBossClassPool32.java	2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/JBossClassPool32.java	2006-09-21 18:04:34 UTC (rev 57056)
@@ -23,13 +23,16 @@
 
 import java.io.File;
 import java.io.FileOutputStream;
-import org.jboss.aop.AOPClassPool;
+import java.security.ProtectionDomain;
+
 import org.jboss.aop.AspectManager;
+import org.jboss.aop.classpool.AOPClassPool;
 import org.jboss.mx.loading.RepositoryClassLoader;
 import org.jboss.mx.loading.UnifiedClassLoader;
 import javassist.CannotCompileException;
 import javassist.ClassPool;
 import javassist.CtClass;
+import javassist.scopedpool.ScopedClassPoolRepository;
 
 /**
  * Comment
@@ -46,15 +49,15 @@
    // For loadClass tmpdir creation for UCL
    protected final Object tmplock = new Object();
 
-   protected JBossClassPool32(ClassLoader cl, ClassPool src, AspectManager manager, File tmp)
+   protected JBossClassPool32(ClassLoader cl, ClassPool src, ScopedClassPoolRepository repository, File tmp)
    {
-      super(cl, src, manager);
+      super(cl, src, repository);
       tempdir = tmp;
    }
 
-   protected JBossClassPool32(ClassPool src, AspectManager manager)
+   protected JBossClassPool32(ClassPool src, ScopedClassPoolRepository repository)
    {
-      super(src, manager);
+      super(src, repository);
    }
 
    public boolean isUnloadedClassLoader()
@@ -67,13 +70,13 @@
       return false;
    }
 
-   public Class toClass(CtClass cc, ClassLoader loader)
+   public Class toClass(CtClass cc, ClassLoader loader, ProtectionDomain domain)
            throws CannotCompileException
    {
       lockInCache(cc);
       if (getClassLoader() == null || tempdir == null)
       {
-         return super.toClass(cc);
+         return super.toClass(cc, loader, domain);
       }
       Class dynClass = null;
       try

Modified: branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/JBossClassPoolFactory.java
===================================================================
--- branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/JBossClassPoolFactory.java	2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/JBossClassPoolFactory.java	2006-09-21 18:04:34 UTC (rev 57056)
@@ -24,11 +24,14 @@
 import java.io.File;
 import java.io.IOException;
 import java.net.URL;
-import org.jboss.aop.AOPClassPool;
+
 import org.jboss.aop.AspectManager;
-import org.jboss.aop.ClassPoolFactory;
+import org.jboss.aop.classpool.AOPClassPool;
 import org.jboss.mx.loading.RepositoryClassLoader;
 import javassist.ClassPool;
+import javassist.scopedpool.ScopedClassPool;
+import javassist.scopedpool.ScopedClassPoolFactory;
+import javassist.scopedpool.ScopedClassPoolRepository;
 
 /**
  * Comment
@@ -37,7 +40,7 @@
  * @version $Revision$
  *
  **/
-public class JBossClassPoolFactory implements ClassPoolFactory
+public class JBossClassPoolFactory implements ScopedClassPoolFactory
 {
    protected File tmpClassesDir;
 
@@ -46,16 +49,22 @@
       this.tmpClassesDir = tmpClassesDir;
 
    }
-   public AOPClassPool create(ClassLoader cl, ClassPool src, AspectManager manager)
+   public ScopedClassPool create(ClassLoader cl, ClassPool src, ScopedClassPoolRepository repository)
    {
       try
       {
          if (cl instanceof RepositoryClassLoader)
          {
             File tempdir = createTempDir(cl);
-            return new JBossClassPool(cl, src, manager, tempdir);
+            URL tmpCP = createURLAndAddToLoader(cl, tempdir);
+            if (AspectManager.scopedCLHelper.ifScopedDeploymentGetScopedParentUclForCL(cl) != null)
+            {
+               //It is scoped
+               return new ScopedJBossClassPool(cl, src, repository, tempdir, tmpCP);
+            }
+            return new JBossClassPool(cl, src, repository, tempdir, tmpCP);
          }
-         return new AOPClassPool(cl, src, manager);
+         return new AOPClassPool(cl, src, repository);
       }
       catch (IOException e)
       {
@@ -63,9 +72,9 @@
       }
    }
 
-   public AOPClassPool create(ClassPool src, AspectManager manager)
+   public ScopedClassPool create(ClassPool src, ScopedClassPoolRepository repository)
    {
-      return new JBossClassPool(src, manager);
+      return new JBossClassPool(src, repository);
    }
 
    public File createTempDir(ClassLoader cl) throws IOException
@@ -74,12 +83,23 @@
       tempdir.delete();
       tempdir.mkdir();
       tempdir.deleteOnExit();
-      RepositoryClassLoader ucl = (RepositoryClassLoader) cl;
+
+      return tempdir;
+   }
+   
+   private URL createURLAndAddToLoader(ClassLoader cl, File tempdir) throws IOException
+   {
       URL tmpURL = tempdir.toURL();
       URL tmpCP = new URL(tmpURL, "?dynamic=true");
 
+      RepositoryClassLoader ucl = (RepositoryClassLoader) cl;
+
       // We may be undeploying.
-      if (ucl.getLoaderRepository() != null) ucl.addURL(tmpCP);
-      return tempdir;
+      if (ucl.getLoaderRepository() != null)
+      {
+         ucl.addURL(tmpCP);
+      }
+      
+      return tmpCP;
    }
 }

Modified: branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/JBossClassPoolFactory32.java
===================================================================
--- branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/JBossClassPoolFactory32.java	2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/JBossClassPoolFactory32.java	2006-09-21 18:04:34 UTC (rev 57056)
@@ -24,11 +24,11 @@
 import java.io.File;
 import java.io.IOException;
 import java.net.URL;
-import org.jboss.aop.AOPClassPool;
-import org.jboss.aop.AspectManager;
-import org.jboss.aop.ClassPoolFactory;
 import org.jboss.mx.loading.UnifiedClassLoader;
 import javassist.ClassPool;
+import javassist.scopedpool.ScopedClassPool;
+import javassist.scopedpool.ScopedClassPoolFactory;
+import javassist.scopedpool.ScopedClassPoolRepository;
 
 /**
  * Comment
@@ -37,7 +37,7 @@
  * @version $Revision$
  *
  **/
-public class JBossClassPoolFactory32 implements ClassPoolFactory
+public class JBossClassPoolFactory32 implements ScopedClassPoolFactory
 {
    protected File tmpClassesDir;
 
@@ -46,12 +46,12 @@
       this.tmpClassesDir = tmpClassesDir;
 
    }
-   public AOPClassPool create(ClassLoader cl, ClassPool src, AspectManager manager)
+   public ScopedClassPool create(ClassLoader cl, ClassPool src, ScopedClassPoolRepository repository)
    {
       try
       {
          File tempdir = createTempDir(cl);
-         return new JBossClassPool32(cl, src, manager, tempdir);
+         return new JBossClassPool32(cl, src, repository, tempdir);
       }
       catch (IOException e)
       {
@@ -59,9 +59,9 @@
       }
    }
 
-   public AOPClassPool create(ClassPool src, AspectManager manager)
+   public ScopedClassPool create(ClassPool src, ScopedClassPoolRepository repository)
    {
-      return new JBossClassPool32(src, manager);
+      return new JBossClassPool32(src, repository);
    }
 
    public File createTempDir(ClassLoader cl) throws IOException

Modified: branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/JBossScopedClassLoaderHelper.java
===================================================================
--- branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/JBossScopedClassLoaderHelper.java	2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/JBossScopedClassLoaderHelper.java	2006-09-21 18:04:34 UTC (rev 57056)
@@ -21,10 +21,12 @@
 */ 
 package org.jboss.aop.deployment;
 
-import org.jboss.aop.AOPScopedClassLoaderHelper;
+import org.jboss.aop.AspectManager;
+import org.jboss.aop.Domain;
+import org.jboss.aop.classpool.AOPScopedClassLoaderHelper;
 import org.jboss.mx.loading.HeirarchicalLoaderRepository3;
+import org.jboss.mx.loading.LoaderRepository;
 import org.jboss.mx.loading.RepositoryClassLoader;
-import org.jboss.system.server.NoAnnotationURLClassLoader;
 
 /**
  * 
@@ -33,7 +35,6 @@
  */
 public class JBossScopedClassLoaderHelper implements AOPScopedClassLoaderHelper
 {
-
    public ClassLoader ifScopedDeploymentGetScopedParentUclForCL(ClassLoader loader)
    {
       ClassLoader parent = loader;
@@ -59,23 +60,17 @@
       boolean scoped = false;
       if (loader instanceof RepositoryClassLoader)
       {
-         ClassLoader parent = loader.getParent();
-         
-         //TODO is this really the best way to find out if we are scoped or not?
-         if (parent.getClass().equals(NoAnnotationURLClassLoader.class))
+         LoaderRepository repository = ((RepositoryClassLoader)loader).getLoaderRepository();
+         if (repository instanceof HeirarchicalLoaderRepository3)
          {
-            RepositoryClassLoader rloader = (RepositoryClassLoader)loader;
-            //Scoped with java2ParentDelegation=true
-            scoped = rloader.getLoaderRepository().getClass().equals(HeirarchicalLoaderRepository3.class);
+            scoped = true;
+            HeirarchicalLoaderRepository3 hlr = (HeirarchicalLoaderRepository3)repository;
+            boolean parentFirst = hlr.getUseParentFirst();
          }
-         else
-         {
-            //Scoped with java2ParentDelegation=false
-            scoped = parent.getClass().getName().equals("org.jboss.mx.loading.HeirarchicalLoaderRepository3$NoParentClassLoader");
-         }
       }
       return scoped;
    }
+   
 
    public ClassLoader getTopLevelJBossClassLoader()
    {
@@ -92,4 +87,15 @@
       return topRcl;
    }
 
+   public Domain getScopedClassLoaderDomain(ClassLoader cl, AspectManager parent)
+   {
+      boolean parentDelegation = true;
+      if (cl instanceof RepositoryClassLoader)
+      {
+         HeirarchicalLoaderRepository3 repository = (HeirarchicalLoaderRepository3)((RepositoryClassLoader)cl).getLoaderRepository();
+         parentDelegation = repository.getUseParentFirst();
+      }
+      return new ScopedClassLoaderDomain(cl, parentDelegation, parent, false);
+   }
+
 }

Added: branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/LoaderRepositoryUrlUtil.java
===================================================================
--- branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/LoaderRepositoryUrlUtil.java	2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/LoaderRepositoryUrlUtil.java	2006-09-21 18:04:34 UTC (rev 57056)
@@ -0,0 +1,175 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2005, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* 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.deployment;
+
+import java.net.URL;
+
+import javax.management.InstanceNotFoundException;
+import javax.management.MBeanServer;
+import javax.management.Notification;
+import javax.management.NotificationListener;
+import javax.management.ObjectName;
+
+import org.jboss.mx.loading.HeirarchicalLoaderRepository3;
+import org.jboss.mx.loading.LoaderRepository;
+import org.jboss.mx.util.MBeanServerLocator;
+
+/**
+ * 
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 1.1 $
+ */
+public class LoaderRepositoryUrlUtil implements NotificationListener
+{
+   final static MBeanServer SERVER;
+   final static ObjectName MAIN_LOADER_REPOSITORY_OBJECT_NAME;
+   final static LoaderRepository MAIN_LOADER_REPOSITORY;
+   static
+   {
+      SERVER = MBeanServerLocator.locateJBoss();
+      try
+      {
+         MAIN_LOADER_REPOSITORY_OBJECT_NAME = new ObjectName("JMImplementation:name=Default,service=LoaderRepository");
+         MAIN_LOADER_REPOSITORY = (LoaderRepository)SERVER.invoke(MAIN_LOADER_REPOSITORY_OBJECT_NAME, "getInstance", new Object[0], new String[0]);
+      }
+      catch (Exception e)
+      {
+         throw new RuntimeException(e);
+      }
+   }
+   
+   long currentSequenceNumber;
+   long lastSequenceNumber = -1;
+   URL[] urls;
+   
+   public LoaderRepositoryUrlUtil()
+   {
+      try
+      {
+         SERVER.addNotificationListener(MAIN_LOADER_REPOSITORY_OBJECT_NAME, this, null, null);
+      }
+      catch (InstanceNotFoundException e)
+      {
+         throw new RuntimeException(e);
+      }
+   }
+
+   public synchronized void handleNotification(Notification notification, Object handback)
+   {
+      if (notification.getType().equals(LoaderRepository.CLASSLOADER_ADDED))
+      {
+         currentSequenceNumber = notification.getSequenceNumber();
+      }
+      else if (notification.getType().equals(LoaderRepository.CLASSLOADER_REMOVED))
+      {
+         currentSequenceNumber = notification.getSequenceNumber();
+      }
+   }
+   
+   public synchronized UrlInfo getURLInfo(HeirarchicalLoaderRepository3 scopedLoader, UrlInfo urlInfo)
+   {
+      boolean changed = false;
+      if (lastSequenceNumber != currentSequenceNumber)
+      {
+         urls = MAIN_LOADER_REPOSITORY.getURLs();
+         lastSequenceNumber = currentSequenceNumber;
+         changed = true;
+      }
+      if (!changed)
+      {
+         changed = urlInfo != null && (urlInfo.getSequenceNumber() != lastSequenceNumber);
+      }
+      if (urlInfo == null || changed)
+      {
+         URL[] localUrls = getLocalUrls(scopedLoader, urls);
+         urlInfo = new UrlInfo(urls, localUrls, lastSequenceNumber);
+      }
+      return urlInfo;
+   }
+   
+   public long getCurrentSequenceNumber()
+   {
+      return currentSequenceNumber;
+   }
+   
+   private URL[] getLocalUrls(HeirarchicalLoaderRepository3 scopedRepository, URL[] globalUrls)
+   {
+      URL[] scopedRepositoryUrls = scopedRepository.getURLs();
+
+      //This is a bit of a hack, since this relies on the order of the urls returned by HeirarchicalLoaderRepository3
+      //My urls, followed by parent urls.
+      int scopedLength = 0;
+      for (int i = 0 ; i < scopedRepositoryUrls.length ; i++)
+      {
+         URL scopedUrl = scopedRepositoryUrls[i];
+         for (int j = 0 ; j < globalUrls.length ; j ++)
+         {
+            URL globalUrl = globalUrls[j];
+            if (scopedRepositoryUrls[i].equals(globalUrls[j]))
+            {
+               scopedLength = i;
+               break;
+            }
+         }
+         if (scopedLength > 0)
+         {
+            break;
+         }
+      }
+      
+      URL[] localUrls = new URL[scopedLength];
+      System.arraycopy(scopedRepositoryUrls, 0, localUrls, 0, scopedLength);
+      return localUrls;
+   }
+   
+   public class UrlInfo
+   {
+      
+      URL[] globalUrls;
+      URL[] localUrls;
+      long sequenceNumber;
+
+      public UrlInfo(URL[] globalUrls, URL[] localUrls, long sequenceNumber)
+      {
+         super();
+         this.globalUrls = globalUrls;
+         this.localUrls = localUrls;
+         this.sequenceNumber = sequenceNumber;
+      }
+      
+      public URL[] getGlobalUrls()
+      {
+         return globalUrls;
+      }
+      
+      public URL[] getLocalUrls()
+      {
+         return localUrls;
+      }
+
+      public long getSequenceNumber()
+      {
+         return sequenceNumber;
+      }
+   }
+   
+}

Added: branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/ScopedClassLoaderDomain.java
===================================================================
--- branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/ScopedClassLoaderDomain.java	2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/ScopedClassLoaderDomain.java	2006-09-21 18:04:34 UTC (rev 57056)
@@ -0,0 +1,153 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2005, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* 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.deployment;
+
+import java.lang.ref.WeakReference;
+
+import org.jboss.aop.AspectManager;
+import org.jboss.aop.Domain;
+import org.jboss.aop.advice.AspectDefinition;
+import org.jboss.mx.loading.HeirarchicalLoaderRepository3;
+import org.jboss.mx.loading.LoaderRepository;
+import org.jboss.mx.loading.RepositoryClassLoader;
+
+import EDU.oswego.cs.dl.util.concurrent.ConcurrentReaderHashMap;
+
+/**
+ * A domain that is used for scoped classloaders
+ * 
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 1.1 $
+ */
+public class ScopedClassLoaderDomain extends Domain
+{
+   
+   WeakReference loader;
+   boolean parentDelegation;
+   ConcurrentReaderHashMap myPerVMAspects = new ConcurrentReaderHashMap();
+   ConcurrentReaderHashMap notMyPerVMAspects = new ConcurrentReaderHashMap();
+   
+   public ScopedClassLoaderDomain(ClassLoader loader, boolean parentDelegation, AspectManager manager, boolean parentFirst)
+   {
+      // FIXME ScopedClassLoaderDomain constructor
+      super(manager, parentFirst);
+      this.loader = new WeakReference(loader);
+      this.parentDelegation = parentDelegation;
+   }
+
+   protected ClassLoader getClassLoader()
+   {
+      ClassLoader cl = (ClassLoader)loader.get();
+      if (cl != null)
+      {
+         return cl;
+      }
+      return null;
+   }
+   
+   public Object getPerVMAspect(AspectDefinition def)
+   {
+      return getPerVMAspect(def.getName());
+   }
+
+   public Object getPerVMAspect(String def)
+   {
+      if (parentDelegation == true)
+      {
+         //We will alway be loading up the correct class
+         Object aspect = super.getPerVMAspect(def);
+         return aspect;
+      }
+      else
+      {
+         return getPerVmAspectWithNoParentDelegation(def);
+      }
+   }
+   
+   private Object getPerVmAspectWithNoParentDelegation(String def)
+   {
+      Object aspect = myPerVMAspects.get(def);
+      if (aspect != null)
+      {
+         return aspect;
+      }
+
+      aspect = super.getPerVMAspect(def);
+      if (aspect != null)
+      {
+         LoaderRepository loadingRepository = getAspectRepository(aspect);
+         LoaderRepository myRepository = getScopedRepository();
+         if (loadingRepository == myRepository)
+         {
+            //The parent does not load this class
+            myPerVMAspects.put(def, aspect);
+         }
+         else
+         {
+            //The class has been loaded by a parent classloader, find out if we also have a copy
+            try
+            {
+               Class clazz = myRepository.loadClass(aspect.getClass().getName());
+               if (clazz == aspect.getClass())
+               {
+                  notMyPerVMAspects.put(def, Boolean.TRUE);
+               }
+               else
+               {
+                  //We have a different version of the class deployed
+                  AspectDefinition aspectDefinition = getAspectDefinition(def);
+                  //Override the classloader to create the aspect instance
+                  aspect = createPerVmAspect(def, aspectDefinition, getClassLoader());
+                  myPerVMAspects.put(def, aspect);
+               }
+            }
+            catch (ClassNotFoundException e)
+            {
+               throw new RuntimeException(e);
+            }
+         }
+      }
+      
+      return aspect;
+   }
+   
+   private LoaderRepository getAspectRepository(Object aspect)
+   {
+      ClassLoader cl = aspect.getClass().getClassLoader();
+      ClassLoader parent = cl;
+      while (parent != null)
+      {
+         if (parent instanceof RepositoryClassLoader)
+         {
+            return ((RepositoryClassLoader)parent).getLoaderRepository();
+         }
+         parent = parent.getParent();
+      }
+      return null;
+   }
+   
+   private HeirarchicalLoaderRepository3 getScopedRepository()
+   {
+      HeirarchicalLoaderRepository3 myRepository = (HeirarchicalLoaderRepository3)((RepositoryClassLoader)getClassLoader()).getLoaderRepository();
+      return myRepository;
+   }
+}

Added: branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/ScopedJBossClassPool.java
===================================================================
--- branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/ScopedJBossClassPool.java	2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/ScopedJBossClassPool.java	2006-09-21 18:04:34 UTC (rev 57056)
@@ -0,0 +1,214 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2005, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* 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.deployment;
+
+import java.io.File;
+import java.lang.ref.WeakReference;
+import java.net.URL;
+import java.util.Iterator;
+
+import org.jboss.aop.AspectManager;
+import org.jboss.aop.classpool.AOPClassPool;
+import org.jboss.aop.classpool.AOPClassPoolRepository;
+import org.jboss.aop.deployment.LoaderRepositoryUrlUtil.UrlInfo;
+import org.jboss.mx.loading.HeirarchicalLoaderRepository3;
+import org.jboss.mx.loading.LoaderRepository;
+import org.jboss.mx.loading.RepositoryClassLoader;
+
+import javassist.ClassPool;
+import javassist.CtClass;
+import javassist.NotFoundException;
+import javassist.scopedpool.ScopedClassPoolRepository;
+
+/**
+ * A classpool in JBoss backed by a scoped (HierarchicalLoaderRepository) loader repository
+ * 
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 1.1 $
+ */
+public class ScopedJBossClassPool extends JBossClassPool 
+{
+   final static LoaderRepositoryUrlUtil LOADER_REPOSITORY_UTIL = new LoaderRepositoryUrlUtil();
+   
+   WeakReference repository = null;
+   UrlInfo urlInfo;
+
+   protected ScopedJBossClassPool(ClassLoader cl, ClassPool src, ScopedClassPoolRepository repository, File tmp, URL tmpURL)
+   {
+      super(cl, src, repository, tmp, tmpURL);
+      
+      boolean parentFirst = false;
+      LoaderRepository loaderRepository = null;
+      ClassLoader prnt = cl;
+      while (prnt != null)
+      {
+         if (prnt instanceof RepositoryClassLoader)
+         {
+            loaderRepository = ((RepositoryClassLoader)prnt).getLoaderRepository();
+            if (loaderRepository instanceof HeirarchicalLoaderRepository3)
+            {
+               parentFirst = ((HeirarchicalLoaderRepository3)loaderRepository).getUseParentFirst();
+            }
+            break;
+         }
+         prnt = cl.getParent();
+      }
+      
+      super.childFirstLookup = !parentFirst;
+   }
+   
+
+   private HeirarchicalLoaderRepository3 getRepository()
+   {
+      //FIXME - Once Javassist > 3.3.0 is out use getClassLoader0() and get rid of try/catch
+      ClassLoader cl = null;
+      try
+      {
+         cl =  getClassLoader();
+      }
+      catch (RuntimeException e)
+      {
+         //Ignore, the ScopedClassPoll throws an exception if pool is not associated with a cl
+      }
+      if (cl != null)
+      {
+         return (HeirarchicalLoaderRepository3)((RepositoryClassLoader)cl).getLoaderRepository();
+      }
+      return null;
+   }
+
+   private URL getResourceUrlForClass(String resourcename)
+   {
+      HeirarchicalLoaderRepository3 repo = getRepository();
+      return repo.getResource(resourcename, super.getClassLoader());
+   }
+   
+   private boolean isMine(URL url)
+   {
+      HeirarchicalLoaderRepository3 repo = getRepository();
+      if (repo != null)
+      {
+         //The URL of the class loaded with my scoped classloader
+         if (url != null)
+         {
+            urlInfo = LOADER_REPOSITORY_UTIL.getURLInfo(getRepository(), urlInfo);
+            
+            URL[] myUrls = urlInfo.getLocalUrls();
+            String resource = url.toString();
+            for (int i = 0 ; i < myUrls.length ; i++)
+            {
+               if (resource.indexOf(myUrls[i].toString()) >= 0)
+               {
+                  return true;
+               }
+            }
+            return false;
+         }
+      }
+      return true;
+   }
+
+   public CtClass getCached(String classname)
+   {
+      if (classname == null)
+      {
+         return null;
+      }
+
+      if (generatedClasses.get(classname) != null)
+      {
+         //It is a new class, and this callback is probably coming from the frozen check when creating a new nested class
+         return super.getCached(classname);
+      }
+      
+      //Is this from the scoped classloader itself of from the parent?
+      String resourcename = getResourceName(classname);
+      URL url = getResourceUrlForClass(resourcename);
+      boolean isMine = isMine(url);
+      
+      if (isMine)
+      {
+         if (super.childFirstLookup)
+         {
+            //Parent delegation is false, attempt to get this class out of ourselves
+            CtClass clazz = super.getCachedLocally(classname);
+            if (clazz == null)
+            {
+               clazz = createCtClass(classname, false);
+               if (clazz != null)
+               {
+                  lockInCache(clazz);
+               }
+            }
+            if (clazz != null)
+            {
+               return clazz;
+            }
+         }
+         return super.getCached(classname);
+      }
+      
+
+      try
+      {
+         ClassPool pool = getCorrectPoolForResource(url);
+         return pool.get(classname);
+      }
+      catch (NotFoundException e)
+      {
+      }
+      return null;
+   }
+
+   private ClassPool getCorrectPoolForResource(URL url)
+   {
+      synchronized(AspectManager.getRegisteredCLs())
+      {
+         for(Iterator it = AspectManager.getRegisteredCLs().values().iterator() ; it.hasNext() ; )
+         {
+            AOPClassPool candidate = (AOPClassPool)it.next();
+            if (candidate.isUnloadedClassLoader())
+            {
+               AspectManager.instance().unregisterClassLoader(candidate.getClassLoader());
+               continue;
+            }
+            
+            if (candidate.getClassLoader() instanceof RepositoryClassLoader)
+            {
+               //Sometimes the ClassLoader is a proxy for MBeanProxyExt?!
+               RepositoryClassLoader rcl = (RepositoryClassLoader)candidate.getClassLoader();
+               URL[] urls = rcl.getClasspath();
+               String resource = url.toString();
+               for (int i = 0 ; i < urls.length ; i++)
+               {
+                  if (resource.indexOf(urls[i].toString()) >= 0)
+                  {
+                     return candidate;
+                  }
+               }
+            }
+         }
+      }
+
+      return AOPClassPool.createAOPClassPool(ClassPool.getDefault(), AOPClassPoolRepository.getInstance());
+   }
+}




More information about the jboss-cvs-commits mailing list