[jboss-cvs] JBossAS SVN: r83907 - in projects/aop/trunk: aop/src/main/java/org/jboss/aop/proxy/container and 5 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Thu Feb 5 12:35:54 EST 2009


Author: kabir.khan at jboss.com
Date: 2009-02-05 12:35:54 -0500 (Thu, 05 Feb 2009)
New Revision: 83907

Modified:
   projects/aop/trunk/aop/src/main/java/org/jboss/aop/proxy/ClassProxyFactory.java
   projects/aop/trunk/aop/src/main/java/org/jboss/aop/proxy/container/AOPProxyFactoryParameters.java
   projects/aop/trunk/aop/src/main/java/org/jboss/aop/proxy/container/ContainerProxyFactory.java
   projects/aop/trunk/aop/src/main/java/org/jboss/aop/proxy/container/GeneratedAOPProxyFactory.java
   projects/aop/trunk/asintegration-jmx/src/test/java/org/jboss/test/aop/classpool/ucl/test/UclClassPoolTest.java
   projects/aop/trunk/asintegration-jmx/src/test/java/org/jboss/test/aop/classpool/ucl/test/UclDelegatingClassPoolTestCase.java
   projects/aop/trunk/asintegration-mc/src/main/java/org/jboss/aop/asintegration/jboss5/DomainRegistry.java
   projects/aop/trunk/asintegration-mc/src/main/java/org/jboss/aop/asintegration/jboss5/VFSClassLoaderDomainRegistry.java
   projects/aop/trunk/asintegration-mc/src/main/java/org/jboss/aop/classpool/jbosscl/JBossClDelegatingClassPoolFactory.java
   projects/aop/trunk/asintegration-mc/src/test/java/org/jboss/test/aop/classpool/jbosscl/support/TestVFSClassLoaderFactoryFactory.java
   projects/aop/trunk/asintegration-mc/src/test/java/org/jboss/test/aop/classpool/jbosscl/test/ClassPoolWithRepositoryTestCase.java
   projects/aop/trunk/asintegration-mc/src/test/java/org/jboss/test/aop/classpool/jbosscl/test/JBossClClassPoolTest.java
Log:
[JBAOP-698] Generate proxies in org.jboss.aop.generatedproxies package rather than in default package

Modified: projects/aop/trunk/aop/src/main/java/org/jboss/aop/proxy/ClassProxyFactory.java
===================================================================
--- projects/aop/trunk/aop/src/main/java/org/jboss/aop/proxy/ClassProxyFactory.java	2009-02-05 17:16:14 UTC (rev 83906)
+++ projects/aop/trunk/aop/src/main/java/org/jboss/aop/proxy/ClassProxyFactory.java	2009-02-05 17:35:54 UTC (rev 83907)
@@ -31,6 +31,15 @@
 import java.util.List;
 import java.util.Map;
 import java.util.WeakHashMap;
+
+import javassist.ClassPool;
+import javassist.CtClass;
+import javassist.CtField;
+import javassist.CtMethod;
+import javassist.CtNewMethod;
+import javassist.Modifier;
+import javassist.SerialVersionUID;
+
 import org.jboss.aop.AspectManager;
 import org.jboss.aop.ClassAdvisor;
 import org.jboss.aop.ClassInstanceAdvisor;
@@ -41,13 +50,6 @@
 import org.jboss.aop.util.reference.MethodPersistentReference;
 import org.jboss.aop.util.reference.PersistentReference;
 import org.jboss.util.collection.WeakValueHashMap;
-import javassist.ClassPool;
-import javassist.CtClass;
-import javassist.CtField;
-import javassist.CtMethod;
-import javassist.CtNewMethod;
-import javassist.Modifier;
-import javassist.SerialVersionUID;
 
 
 /**
@@ -60,6 +62,8 @@
    private static WeakValueHashMap<String, Class<?>> classnameMap = new WeakValueHashMap<String, Class<?>>();
    private static WeakHashMap<ClassLoader, WeakHashMap<Class<?>, WeakReference<Class<?>>>> proxyCache = new WeakHashMap<ClassLoader, WeakHashMap<Class<?>, WeakReference<Class<?>>>>();
    private static WeakHashMap<Class<?>, Map<Long, MethodPersistentReference>> methodMapCache = new WeakHashMap<Class<?>, Map<Long, MethodPersistentReference>>();
+   
+   public static final String GENERATED_PROXIES_PACKAGE = "org.jboss.aop.generatedproxies";
 
    public static ClassProxy newInstance(Class<?> clazz) throws Exception
    {
@@ -160,7 +164,11 @@
    private static CtClass createProxyCtClass(ClassPool pool, ProxyMixin[] mixins, Class<?> clazz, boolean interceptWriteReplace)
    throws Exception
    {
-      String classname = "AOPClassProxy$" + counter++;
+      String classname = null;
+      synchronized (ClassProxyFactory.class)
+      {
+         classname = GENERATED_PROXIES_PACKAGE + ".AOPClassProxy$" + counter++;
+      }
 
       CtClass template = pool.get("org.jboss.aop.proxy.ClassProxyTemplate");
       CtClass superclass = pool.get(clazz.getName());

Modified: projects/aop/trunk/aop/src/main/java/org/jboss/aop/proxy/container/AOPProxyFactoryParameters.java
===================================================================
--- projects/aop/trunk/aop/src/main/java/org/jboss/aop/proxy/container/AOPProxyFactoryParameters.java	2009-02-05 17:16:14 UTC (rev 83906)
+++ projects/aop/trunk/aop/src/main/java/org/jboss/aop/proxy/container/AOPProxyFactoryParameters.java	2009-02-05 17:35:54 UTC (rev 83907)
@@ -41,11 +41,15 @@
    private SimpleMetaData simpleMetaData;
    private ContainerCache containerCache;
    private Ctor ctor;
+   private ClassLoader classLoader;
    
    public AOPProxyFactoryParameters()
    {
    }
 
+   /**
+    * This constructor cannot be changed for backwards compatibility
+    */
    public AOPProxyFactoryParameters(
          Class<?> proxiedClass, 
          Object target, 
@@ -184,7 +188,17 @@
          throw new RuntimeException("If specifying either constructor arguments or signature, you must specify the other");
       }
    }
-   
+
+   public ClassLoader getClassLoader()
+   {
+      return classLoader;
+   }
+
+   public void setClassLoader(ClassLoader classLoader)
+   {
+      this.classLoader = classLoader;
+   }
+
    public static class Ctor
    {
       Class<?>[] signature;

Modified: projects/aop/trunk/aop/src/main/java/org/jboss/aop/proxy/container/ContainerProxyFactory.java
===================================================================
--- projects/aop/trunk/aop/src/main/java/org/jboss/aop/proxy/container/ContainerProxyFactory.java	2009-02-05 17:16:14 UTC (rev 83906)
+++ projects/aop/trunk/aop/src/main/java/org/jboss/aop/proxy/container/ContainerProxyFactory.java	2009-02-05 17:35:54 UTC (rev 83907)
@@ -60,6 +60,7 @@
 import org.jboss.aop.instrument.Instrumentor;
 import org.jboss.aop.instrument.TransformerCommon;
 import org.jboss.aop.introduction.InterfaceIntroduction;
+import org.jboss.aop.proxy.ClassProxyFactory;
 import org.jboss.aop.util.JavassistMethodHashing;
 
 
@@ -76,8 +77,8 @@
    private static final String ADVISED = Advised.class.getName();
    private static final String INSTANCE_ADVISED = InstanceAdvised.class.getName();
    private static final CtClass[] EMPTY_CTCLASS_ARRAY = new CtClass[0];
-//   private static final String[] EMPTY_STRING_ARRAY = new String[0];
    public static final String PROXY_NAME_PREFIX = "AOPContainerProxy$";
+   public static final String PROXY_CLASSES_DEFAULT_PACKAGE = ClassProxyFactory.GENERATED_PROXIES_PACKAGE;
    
    private static Object maplock = new Object();
    private static WeakHashMap<ClassLoader, WeakHashMap<Class<?>, Map<ContainerProxyCacheKey, WeakReference<Class<?>>>>> proxyCache = new WeakHashMap<ClassLoader, WeakHashMap<Class<?>, Map<ContainerProxyCacheKey, WeakReference<Class<?>>>>>();
@@ -111,6 +112,8 @@
    /** Methods hardcoded in createBasics */
    private HashSet<Long> hardcodedMethods = new HashSet<Long>();
    
+   private ClassLoader loader;
+   
    public static Class<?> getProxyClass(Class<?> clazz, AspectManager manager) throws Exception
    {
       ContainerProxyCacheKey key = new ContainerProxyCacheKey(clazz);
@@ -123,15 +126,35 @@
    {
       return getProxyClass(objectAsSuper, key, advisor, null);
    }
+
+   public static Class<?> getProxyClass(boolean objectAsSuper, ClassLoader loader, ContainerProxyCacheKey key, Advisor advisor)
+   throws Exception
+   {
+   return getProxyClass(objectAsSuper, loader, key, advisor, null);
+   }
    
+
    public static Class<?> getProxyClass(boolean objectAsSuper, ContainerProxyCacheKey key, Advisor advisor, MarshalledContainerProxy outOfVmProxy)
    throws Exception
+   {  
+      return getProxyClass(objectAsSuper, null, key, advisor, outOfVmProxy);
+   }
+   
+   public static Class<?> getProxyClass(boolean objectAsSuper, ClassLoader loader, ContainerProxyCacheKey key, Advisor advisor, MarshalledContainerProxy outOfVmProxy)
+   throws Exception
    {   
       Class<?> clazz = key.getClazz();
       // Don't make a proxy of a proxy !
       if (Delegate.class.isAssignableFrom(clazz)) clazz = clazz.getSuperclass();
 
-      ClassPool pool = AspectManager.instance().findClassPool(SecurityActions.getClassLoader(clazz));
+      ClassLoader cl = loader;
+      if (cl == null)
+      {
+         cl = SecurityActions.getClassLoader(clazz); 
+      }
+      
+      ClassPool pool = AspectManager.instance().findClassPool(cl);
+      
       if (pool == null) throw new NullPointerException("Could not find ClassPool");
 
       Class<?> proxyClass = null;
@@ -161,17 +184,17 @@
          
          if (proxyClass == null)
          {
-            proxyClass = generateProxy(objectAsSuper, clazz, advisor, outOfVmProxy);
+            proxyClass = generateProxy(objectAsSuper, cl, clazz, advisor, outOfVmProxy);
             map.put(key, new WeakReference<Class<?>>(proxyClass));
          }
       }
       return proxyClass;
    }
 
-   private static Class<?> generateProxy(boolean objectAsSuper, Class<?> clazz, Advisor advisor, MarshalledContainerProxy outOfVmProxy) throws Exception
+   private static Class<?> generateProxy(boolean objectAsSuper, ClassLoader loader, Class<?> clazz, Advisor advisor, MarshalledContainerProxy outOfVmProxy) throws Exception
    {
       ArrayList<InterfaceIntroduction> introductions = advisor.getInterfaceIntroductions();
-      CtClass proxy = createProxyCtClass(objectAsSuper, introductions, clazz, advisor, outOfVmProxy);
+      CtClass proxy = createProxyCtClass(objectAsSuper, loader, introductions, clazz, advisor, outOfVmProxy);
 //      ClassLoader loader = determineClassLoaderToUse(clazz, proxy);
       ProtectionDomain pd = clazz.getProtectionDomain();
       Class<?> proxyClass = TransformerCommon.toClass(proxy, /*loader,*/ pd);
@@ -198,23 +221,24 @@
    private static CtClass createProxyCtClass(boolean objectAsSuper, ArrayList<InterfaceIntroduction> mixins, Class<?> clazz, Advisor advisor)
    throws Exception
    {
-      return createProxyCtClass(objectAsSuper, mixins, clazz, advisor, null);
+      return createProxyCtClass(objectAsSuper, null, mixins, clazz, advisor, null);
    }
    
-   private static CtClass createProxyCtClass(boolean objectAsSuper, ArrayList<InterfaceIntroduction> mixins, Class<?> clazz, Advisor advisor, MarshalledContainerProxy outOfVmProxy)
+   private static CtClass createProxyCtClass(boolean objectAsSuper, ClassLoader loader, ArrayList<InterfaceIntroduction> mixins, Class<?> clazz, Advisor advisor, MarshalledContainerProxy outOfVmProxy)
            throws Exception
    {
-      ContainerProxyFactory factory = new ContainerProxyFactory(objectAsSuper, mixins, clazz, advisor, outOfVmProxy);
+      ContainerProxyFactory factory = new ContainerProxyFactory(objectAsSuper, loader, mixins, clazz, advisor, outOfVmProxy);
       return factory.createProxyCtClass();
    }
 
    
-   private ContainerProxyFactory(boolean objectAsSuper, ArrayList<InterfaceIntroduction> mixins, Class<?> clazz, Advisor advisor, MarshalledContainerProxy outOfVmProxy)
+   private ContainerProxyFactory(boolean objectAsSuper, ClassLoader loader, ArrayList<InterfaceIntroduction> mixins, Class<?> clazz, Advisor advisor, MarshalledContainerProxy outOfVmProxy)
    {
       this.objectAsSuper = objectAsSuper;
       this.clazz = clazz;
       this.advisor = advisor;
       isAdvised = Advised.class.isAssignableFrom(clazz);
+      this.loader = loader;
       
       if (outOfVmProxy == null)
       {
@@ -229,7 +253,15 @@
    
    private CtClass createProxyCtClass() throws Exception
    {
-      this.pool = AspectManager.instance().findClassPool(clazz);
+      if (loader != null)
+      {
+         validateLoader();
+         pool = AspectManager.instance().findClassPool(loader); 
+      }
+      if (pool == null)
+      {
+         pool = AspectManager.instance().findClassPool(clazz);
+      }
       if (pool == null) throw new NullPointerException("Could not find ClassPool");
 
       createBasics();
@@ -241,6 +273,20 @@
       return proxy;
    }
    
+   private void validateLoader() throws Exception
+   {
+      if (loader != null && clazz != null)
+      {
+         try
+         {
+            loader.loadClass(clazz.getName());
+         }
+         catch (ClassNotFoundException e)
+         {
+            throw new Exception("Could not load " + clazz.getName() + " from " + loader);
+         }
+      }
+   }
 
    private CtClass createBasics() throws Exception
    {
@@ -759,7 +805,7 @@
       return set;
    }
    
-   private String getClassName()
+   private synchronized String getClassName()
    {
       String packageName = clazz.getPackage().getName();
       if (!packageName.startsWith("java.") && !packageName.startsWith("sun."))
@@ -768,7 +814,7 @@
       }
       else
       {
-         packageName = "";
+         packageName = PROXY_CLASSES_DEFAULT_PACKAGE + ".";
       }
       
       return packageName + PROXY_NAME_PREFIX + counter++;

Modified: projects/aop/trunk/aop/src/main/java/org/jboss/aop/proxy/container/GeneratedAOPProxyFactory.java
===================================================================
--- projects/aop/trunk/aop/src/main/java/org/jboss/aop/proxy/container/GeneratedAOPProxyFactory.java	2009-02-05 17:16:14 UTC (rev 83906)
+++ projects/aop/trunk/aop/src/main/java/org/jboss/aop/proxy/container/GeneratedAOPProxyFactory.java	2009-02-05 17:35:54 UTC (rev 83907)
@@ -141,7 +141,7 @@
 
    private Class<?> generateProxy(AOPProxyFactoryParameters params) throws Exception
    {
-      Class<?> proxyClass = ContainerProxyFactory.getProxyClass(params.isObjectAsSuperClass(), params.getContainerCache().getKey(), params.getContainerCache().getAdvisor());
+      Class<?> proxyClass = ContainerProxyFactory.getProxyClass(params.isObjectAsSuperClass(), params.getClassLoader(), params.getContainerCache().getKey(), params.getContainerCache().getAdvisor());
 
       return proxyClass;
    }

Modified: projects/aop/trunk/asintegration-jmx/src/test/java/org/jboss/test/aop/classpool/ucl/test/UclClassPoolTest.java
===================================================================
--- projects/aop/trunk/asintegration-jmx/src/test/java/org/jboss/test/aop/classpool/ucl/test/UclClassPoolTest.java	2009-02-05 17:16:14 UTC (rev 83906)
+++ projects/aop/trunk/asintegration-jmx/src/test/java/org/jboss/test/aop/classpool/ucl/test/UclClassPoolTest.java	2009-02-05 17:35:54 UTC (rev 83907)
@@ -22,6 +22,7 @@
 package org.jboss.test.aop.classpool.ucl.test;
 
 import java.io.File;
+import java.io.FilenameFilter;
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.net.URLClassLoader;
@@ -59,9 +60,13 @@
    public final static URL JAR_C_1 = getURLRelativeToProjectRoot("target/jboss-aop-asintegration-jmx-test-classpool-c1.jar");
    public final static URL JAR_C_2 = getURLRelativeToProjectRoot("target/jboss-aop-asintegration-jmx-test-classpool-c2.jar");
 
-   public final static String CLASS_A = "org.jboss.test.aop.classpool.ucl.support.excluded.a.A";
-   public final static String CLASS_B = "org.jboss.test.aop.classpool.ucl.support.excluded.b.B";
-   public final static String CLASS_C = "org.jboss.test.aop.classpool.ucl.support.excluded.c.C";
+   public final static String PACKAGE_A = "org.jboss.test.aop.classpool.ucl.support.excluded.a.";
+   public final static String PACKAGE_B = "org.jboss.test.aop.classpool.ucl.support.excluded.b.";
+   public final static String PACKAGE_C = "org.jboss.test.aop.classpool.ucl.support.excluded.c.";
+   
+   public final static String CLASS_A = PACKAGE_A + "A";
+   public final static String CLASS_B = PACKAGE_B + "B";
+   public final static String CLASS_C = PACKAGE_C + "C";
 
    private MBeanServer server; 
    private LoaderRepository globalRepository;
@@ -193,10 +198,44 @@
             removeClassLoaderFromRepository(cl);
             AspectManager.instance().unregisterClassLoader(cl);
             registeredClassLoaders.remove(cl);
+            //Delete the temporary directory since running in Eclipse does not do this automatically
+            deleteTempDir();
          }
       }
    }
    
+   private void deleteTempDir()
+   {
+      File dir = new File(".");
+      String[] uclFiles = dir.list(
+            new FilenameFilter() 
+            {
+               public boolean accept(File dir, String name) 
+               {
+                  return name.startsWith("ucl");
+                     
+               }
+            });
+      for (String uclFile : uclFiles)
+      {
+         deleteRecursively(dir, uclFile);
+      }
+   }
+   
+   private void deleteRecursively(File dir, String name)
+   {
+      File file = new File(dir, name);
+      if (file.isDirectory())
+      {
+         String[] fileNames = file.list();
+         for (String fileName : fileNames)
+         {
+            deleteRecursively(file, fileName);
+         }
+      }
+      file.delete();
+   }
+   
    protected void assertCannotLoadClass(ClassLoader cl, String className)
    {
       try

Modified: projects/aop/trunk/asintegration-jmx/src/test/java/org/jboss/test/aop/classpool/ucl/test/UclDelegatingClassPoolTestCase.java
===================================================================
--- projects/aop/trunk/asintegration-jmx/src/test/java/org/jboss/test/aop/classpool/ucl/test/UclDelegatingClassPoolTestCase.java	2009-02-05 17:16:14 UTC (rev 83906)
+++ projects/aop/trunk/asintegration-jmx/src/test/java/org/jboss/test/aop/classpool/ucl/test/UclDelegatingClassPoolTestCase.java	2009-02-05 17:35:54 UTC (rev 83907)
@@ -21,6 +21,13 @@
 */ 
 package org.jboss.test.aop.classpool.ucl.test;
 
+import java.util.ArrayList;
+
+import org.jboss.aop.proxy.container.AOPProxyFactoryParameters;
+import org.jboss.aop.proxy.container.AspectManaged;
+import org.jboss.aop.proxy.container.ContainerProxyFactory;
+import org.jboss.aop.proxy.container.GeneratedAOPProxyFactory;
+
 import javassist.ClassPool;
 import javassist.CtClass;
 import junit.framework.Test;
@@ -525,6 +532,9 @@
          
          Class<?> childClazzFromChild = child.getClassLoader().loadClass(CHILD);
          assertSame(childClazz, childClazzFromChild);
+         
+
+         Class<?> clazzA = child.getClassLoader().loadClass(CLASS_A);
       }
       finally
       {
@@ -534,7 +544,6 @@
       }
    }
    
-   
    public void testGeneratingClassInDelegatingPool() throws Exception
    {
       ClassPool globalA = null;
@@ -627,4 +636,88 @@
          removeClassPool(globalC);
       }
    }
+
+   public void testMakeContainerProxyInSamePackage() throws Exception
+   {
+      ClassPool globalPoolA = null;
+      ClassPool globalPoolB = null;
+      try
+      {
+         globalPoolA = createGlobalClassPool(JAR_A_1);
+         globalPoolB = createGlobalClassPool(JAR_B_1);
+         
+         ClassLoader loaderA = globalPoolA.getClassLoader();
+         ClassLoader loaderB = globalPoolB.getClassLoader();
+
+         Object proxyA = assertMakeContainerProxy(loaderA.loadClass(CLASS_A), loaderA);
+         Object proxyB = assertMakeContainerProxy(loaderB.loadClass(CLASS_B), loaderB);
+         
+         Class<?> clazzA = proxyA.getClass();
+         Class<?> clazzB = proxyB.getClass();
+         
+         assertTrue(AspectManaged.class.isAssignableFrom(clazzA));
+         assertTrue(AspectManaged.class.isAssignableFrom(clazzB));
+         assertTrue(clazzA.getName().startsWith(PACKAGE_A));
+         assertTrue(clazzB.getName().startsWith(PACKAGE_B));
+         
+         assertSame(clazzA, loaderA.loadClass(clazzA.getName()));
+         assertSame(clazzB, loaderA.loadClass(clazzB.getName()));
+         assertSame(clazzA, loaderB.loadClass(clazzA.getName()));
+         assertSame(clazzB, loaderB.loadClass(clazzB.getName()));
+      }
+      finally
+      {
+         removeClassPool(globalPoolA);
+         removeClassPool(globalPoolB);
+      }
+   }
+   
+   public void testMakeContainerProxyForSystemClass() throws Exception
+   {
+      ClassPool globalPoolA = null;
+      ClassPool globalPoolB = null;
+      try
+      {
+         globalPoolA = createGlobalClassPool(JAR_A_1);
+         globalPoolB = createGlobalClassPool(JAR_B_1);
+         
+         ClassLoader loaderA = globalPoolA.getClassLoader();
+         ClassLoader loaderB = globalPoolB.getClassLoader();
+
+         Object proxyA = assertMakeContainerProxy(ArrayList.class, loaderA);
+         Object proxyB = assertMakeContainerProxy(ArrayList.class, loaderB);
+         
+         Class<?> clazzA = proxyA.getClass();
+         Class<?> clazzB = proxyB.getClass();
+         
+         assertTrue(AspectManaged.class.isAssignableFrom(clazzA));
+         assertTrue(AspectManaged.class.isAssignableFrom(clazzB));
+         assertTrue(clazzA.getName().startsWith(ContainerProxyFactory.PROXY_CLASSES_DEFAULT_PACKAGE));
+         assertTrue(clazzB.getName().startsWith(ContainerProxyFactory.PROXY_CLASSES_DEFAULT_PACKAGE));
+         
+         assertSame(clazzA, loaderA.loadClass(clazzA.getName()));
+         assertSame(clazzB, loaderA.loadClass(clazzB.getName()));
+         assertSame(clazzA, loaderB.loadClass(clazzA.getName()));
+         assertSame(clazzB, loaderB.loadClass(clazzB.getName()));
+      }
+      finally
+      {
+         removeClassPool(globalPoolA);
+         removeClassPool(globalPoolB);
+      }
+   }
+   
+   private Object assertMakeContainerProxy(Class<?> parent, ClassLoader loader) throws Exception
+   {
+      AOPProxyFactoryParameters params = new AOPProxyFactoryParameters();
+      params.setProxiedClass(parent);
+      params.setTarget(parent.newInstance());
+      params.setClassLoader(loader);
+      params.setInterfaces(new Class<?>[] {java.io.Serializable.class});
+      GeneratedAOPProxyFactory factory = new GeneratedAOPProxyFactory();
+      Object proxy = factory.createAdvisedProxy(params);
+      assertFalse(parent.getName() == proxy.getClass().getName());
+      assertSame(loader, proxy.getClass().getClassLoader());
+      return proxy;
+   }
 }

Modified: projects/aop/trunk/asintegration-mc/src/main/java/org/jboss/aop/asintegration/jboss5/DomainRegistry.java
===================================================================
--- projects/aop/trunk/asintegration-mc/src/main/java/org/jboss/aop/asintegration/jboss5/DomainRegistry.java	2009-02-05 17:16:14 UTC (rev 83906)
+++ projects/aop/trunk/asintegration-mc/src/main/java/org/jboss/aop/asintegration/jboss5/DomainRegistry.java	2009-02-05 17:35:54 UTC (rev 83907)
@@ -35,6 +35,8 @@
 {
    ClassLoaderSystem getSystem();
    
+   ClassLoaderDomain getDefaultDomain();
+   
    boolean initMapsForLoader(ClassLoader loader, Module module, ScopedVFSClassLoaderDomain domain, ClassLoader parentUnitLoader);
 
    void cleanupLoader(ClassLoader loader);

Modified: projects/aop/trunk/asintegration-mc/src/main/java/org/jboss/aop/asintegration/jboss5/VFSClassLoaderDomainRegistry.java
===================================================================
--- projects/aop/trunk/asintegration-mc/src/main/java/org/jboss/aop/asintegration/jboss5/VFSClassLoaderDomainRegistry.java	2009-02-05 17:16:14 UTC (rev 83906)
+++ projects/aop/trunk/asintegration-mc/src/main/java/org/jboss/aop/asintegration/jboss5/VFSClassLoaderDomainRegistry.java	2009-02-05 17:35:54 UTC (rev 83907)
@@ -39,8 +39,10 @@
 {
    final static ClassLoaderDomain domain = new ClassLoaderDomain("NOT_USED_PLACEHOLDER");
    
-   ClassLoaderSystem system;
+   private ClassLoaderSystem system;
    
+   private ClassLoaderDomain defaultDomain;
+   
    /** classloader domains by their classloaders */
    private Map<ClassLoader, WeakReference<ClassLoaderDomain>> classLoaderDomainsByLoader = new WeakHashMap<ClassLoader, WeakReference<ClassLoaderDomain>>();
 
@@ -61,12 +63,19 @@
    /**
     * Needed for the tests, not expected to be needed in production
     */
-   @Deprecated
    public void setSystem(ClassLoaderSystem system)
    {
       this.system = system;
    }
    
+   /**
+    * Needed for the tests, not expected to be needed in production
+    */
+   public void setDefaultDomain(ClassLoaderDomain domain)
+   {
+      this.defaultDomain = domain;
+   }
+   
    public synchronized ClassLoaderSystem getSystem()
    {
       if (system == null)
@@ -75,6 +84,15 @@
       }
       return system;
    }
+   
+   public synchronized ClassLoaderDomain getDefaultDomain()
+   {
+      if (defaultDomain == null)
+      {
+         defaultDomain = getSystem().getDefaultDomain();
+      }
+      return defaultDomain;
+   }
 
    public synchronized boolean initMapsForLoader(ClassLoader loader, Module module, ScopedVFSClassLoaderDomain domain, ClassLoader parentUnitLoader)
    {

Modified: projects/aop/trunk/asintegration-mc/src/main/java/org/jboss/aop/classpool/jbosscl/JBossClDelegatingClassPoolFactory.java
===================================================================
--- projects/aop/trunk/asintegration-mc/src/main/java/org/jboss/aop/classpool/jbosscl/JBossClDelegatingClassPoolFactory.java	2009-02-05 17:16:14 UTC (rev 83906)
+++ projects/aop/trunk/asintegration-mc/src/main/java/org/jboss/aop/classpool/jbosscl/JBossClDelegatingClassPoolFactory.java	2009-02-05 17:35:54 UTC (rev 83907)
@@ -79,7 +79,7 @@
       
       if (domain == null)
       {
-         domain = sys.getDefaultDomain();
+         domain = registry.getDefaultDomain();
       }
       
       ClassPoolDomain poolDomain = ClassPoolDomainRegistry.getInstance().getDomain(domain);

Modified: projects/aop/trunk/asintegration-mc/src/test/java/org/jboss/test/aop/classpool/jbosscl/support/TestVFSClassLoaderFactoryFactory.java
===================================================================
--- projects/aop/trunk/asintegration-mc/src/test/java/org/jboss/test/aop/classpool/jbosscl/support/TestVFSClassLoaderFactoryFactory.java	2009-02-05 17:16:14 UTC (rev 83906)
+++ projects/aop/trunk/asintegration-mc/src/test/java/org/jboss/test/aop/classpool/jbosscl/support/TestVFSClassLoaderFactoryFactory.java	2009-02-05 17:35:54 UTC (rev 83907)
@@ -41,9 +41,9 @@
       return createClassLoaderFactory(name, importAll, null, false, urls);
    }
    
-   public static TestVFSClassLoaderFactory createClassLoaderFactory(String name, BundleInfoBuilder builder, URL... urls) throws Exception
+   public static TestVFSClassLoaderFactory createClassLoaderFactory(String name, boolean importAll, BundleInfoBuilder builder, URL... urls) throws Exception
    {
-      return createClassLoaderFactory(name, false, null, null, builder, false, urls);
+      return createClassLoaderFactory(name, importAll, null, null, builder, false, urls);
    }
    
    public static TestVFSClassLoaderFactory createClassLoaderFactory(String name, String domainName, BundleInfoBuilder builder, boolean parentFirst, URL... urls) throws Exception

Modified: projects/aop/trunk/asintegration-mc/src/test/java/org/jboss/test/aop/classpool/jbosscl/test/ClassPoolWithRepositoryTestCase.java
===================================================================
--- projects/aop/trunk/asintegration-mc/src/test/java/org/jboss/test/aop/classpool/jbosscl/test/ClassPoolWithRepositoryTestCase.java	2009-02-05 17:16:14 UTC (rev 83906)
+++ projects/aop/trunk/asintegration-mc/src/test/java/org/jboss/test/aop/classpool/jbosscl/test/ClassPoolWithRepositoryTestCase.java	2009-02-05 17:35:54 UTC (rev 83907)
@@ -32,7 +32,9 @@
 import org.jboss.aop.proxy.container.AspectManaged;
 import org.jboss.aop.proxy.container.ContainerProxyFactory;
 import org.jboss.aop.proxy.container.GeneratedAOPProxyFactory;
+import org.jboss.aop.proxy.container.ProxyTemplate;
 import org.jboss.classloader.spi.ClassLoaderDomain;
+import org.jboss.test.aop.classpool.jbosscl.support.BundleInfoBuilder;
 
 /**
  * 
@@ -820,6 +822,104 @@
       }
    }
 
+
+   public void testMakeContainerProxyInSamePackage() throws Exception
+   {
+      ClassPool globalPoolA = null;
+      ClassPool globalPoolB = null;
+      try
+      {
+         globalPoolA = createClassPool("A", true, JAR_A_1);
+         globalPoolB = createClassPool("B", true, JAR_B_1);
+         
+         ClassLoader loaderA = globalPoolA.getClassLoader();
+         ClassLoader loaderB = globalPoolB.getClassLoader();
+         
+         loaderA.loadClass(ProxyTemplate.class.getName());
+
+         Object proxyA = assertMakeContainerProxy(loaderA.loadClass(CLASS_A), loaderA);
+         Object proxyB = assertMakeContainerProxy(loaderB.loadClass(CLASS_B), loaderB);
+         
+         Class<?> clazzA = proxyA.getClass();
+         Class<?> clazzB = proxyB.getClass();
+         
+         assertTrue(AspectManaged.class.isAssignableFrom(clazzA));
+         assertTrue(AspectManaged.class.isAssignableFrom(clazzB));
+         assertTrue(clazzA.getName().startsWith(PACKAGE_A));
+         assertTrue(clazzB.getName().startsWith(PACKAGE_B));
+         
+         assertSame(clazzA, loaderA.loadClass(clazzA.getName()));
+         assertSame(clazzB, loaderA.loadClass(clazzB.getName()));
+         assertSame(clazzA, loaderB.loadClass(clazzA.getName()));
+         assertSame(clazzB, loaderB.loadClass(clazzB.getName()));
+      }
+      finally
+      {
+         unregisterClassPool(globalPoolA);
+         unregisterClassPool(globalPoolB);
+      }
+   }
+   
+   public void testMakeContainerProxyForSystemClass() throws Exception
+   {
+      ClassPool globalPoolA = null;
+      ClassPool globalPoolB = null;
+      try
+      {
+         BundleInfoBuilder builderA = BundleInfoBuilder.getBuilder().
+         createModule("ModuleA").
+         createPackage(PACKAGE_A).
+         createPackage(ContainerProxyFactory.PROXY_CLASSES_DEFAULT_PACKAGE);         
+         globalPoolA = createClassPool("A", true, builderA, JAR_A_1);
+         
+         BundleInfoBuilder builderB = BundleInfoBuilder.getBuilder().
+         createModule("ModuleB").
+         createPackage(PACKAGE_B).
+         createPackage(ContainerProxyFactory.PROXY_CLASSES_DEFAULT_PACKAGE);
+         globalPoolB = createClassPool("B", true, builderB, JAR_B_1);
+         
+         ClassLoader loaderA = globalPoolA.getClassLoader();
+         ClassLoader loaderB = globalPoolB.getClassLoader();
+
+         loaderA.loadClass(ProxyTemplate.class.getName());
+
+         Object proxyA = assertMakeContainerProxy(ArrayList.class, loaderA);
+         Object proxyB = assertMakeContainerProxy(ArrayList.class, loaderB);
+         
+         Class<?> clazzA = proxyA.getClass();
+         Class<?> clazzB = proxyB.getClass();
+         
+         assertTrue(AspectManaged.class.isAssignableFrom(clazzA));
+         assertTrue(AspectManaged.class.isAssignableFrom(clazzB));
+         assertTrue(clazzA.getName().startsWith(ContainerProxyFactory.PROXY_CLASSES_DEFAULT_PACKAGE));
+         assertTrue(clazzB.getName().startsWith(ContainerProxyFactory.PROXY_CLASSES_DEFAULT_PACKAGE));
+         
+         assertSame(clazzA, loaderA.loadClass(clazzA.getName()));
+         assertSame(clazzB, loaderA.loadClass(clazzB.getName()));
+         assertSame(clazzA, loaderB.loadClass(clazzA.getName()));
+         assertSame(clazzB, loaderB.loadClass(clazzB.getName()));
+      }
+      finally
+      {
+         unregisterClassPool(globalPoolA);
+         unregisterClassPool(globalPoolB);
+      }
+   }
+   
+   private Object assertMakeContainerProxy(Class<?> parent, ClassLoader loader) throws Exception
+   {
+      AOPProxyFactoryParameters params = new AOPProxyFactoryParameters();
+      params.setProxiedClass(parent);
+      params.setTarget(parent.newInstance());
+      params.setClassLoader(loader);
+      params.setInterfaces(new Class<?>[] {java.io.Serializable.class});
+      GeneratedAOPProxyFactory factory = new GeneratedAOPProxyFactory();
+      Object proxy = factory.createAdvisedProxy(params);
+      assertFalse(parent.getName() == proxy.getClass().getName());
+      assertSame(loader, proxy.getClass().getClassLoader());
+      return proxy;
+   }
+
    private void checkCanLoadString(ClassPool poolA, ClassPool poolB) throws NotFoundException
    {
       CtClass strA = poolA.getCtClass(STRING);

Modified: projects/aop/trunk/asintegration-mc/src/test/java/org/jboss/test/aop/classpool/jbosscl/test/JBossClClassPoolTest.java
===================================================================
--- projects/aop/trunk/asintegration-mc/src/test/java/org/jboss/test/aop/classpool/jbosscl/test/JBossClClassPoolTest.java	2009-02-05 17:16:14 UTC (rev 83906)
+++ projects/aop/trunk/asintegration-mc/src/test/java/org/jboss/test/aop/classpool/jbosscl/test/JBossClClassPoolTest.java	2009-02-05 17:35:54 UTC (rev 83907)
@@ -188,8 +188,8 @@
    protected void setUp() throws Exception
    {
       super.setUp();
-      enableTrace("org.jboss.aop.classpool");
-      enableTrace("org.jboss.aop.classpool.jbosscl");
+//      enableTrace("org.jboss.aop.classpool");
+//      enableTrace("org.jboss.aop.classpool.jbosscl");
       deploy("/org/jboss/test/aop/classpool/jbosscl/Common.xml");
    }
 
@@ -224,7 +224,17 @@
    
    protected ClassLoader createClassLoader(Result result, String name, BundleInfoBuilder builder, URL... urls) throws Exception
    {
-      TestVFSClassLoaderFactory factory = TestVFSClassLoaderFactoryFactory.createClassLoaderFactory(name, builder, urls);
+      return createClassLoader(result, name, false, builder, urls);
+   }
+      
+   protected ClassLoader createClassLoader(String name, boolean importAll, BundleInfoBuilder builder, URL... urls) throws Exception
+   {
+      return createClassLoader(null, name, importAll, builder, urls);
+   }
+      
+   protected ClassLoader createClassLoader(Result result, String name, boolean importAll, BundleInfoBuilder builder, URL... urls) throws Exception
+   {
+      TestVFSClassLoaderFactory factory = TestVFSClassLoaderFactoryFactory.createClassLoaderFactory(name, importAll, builder, urls);
       return createClassLoader(result, factory);
    }
       
@@ -505,10 +515,21 @@
    
    protected ClassPool createClassPool(Result result, String name, BundleInfoBuilder builder, URL... urls) throws Exception
    {
-      ClassLoader loader = createClassLoader(result, name, builder, urls);
+      return createClassPool(result, name, false, builder, urls);
+   }
+   
+   protected ClassPool createClassPool(String name, boolean importAll, BundleInfoBuilder builder, URL... urls) throws Exception
+   {
+      return createClassPool(null, name, importAll, builder, urls);
+   }
+
+   protected ClassPool createClassPool(Result result, String name, boolean importAll, BundleInfoBuilder builder, URL... urls) throws Exception
+   {
+      TestVFSClassLoaderFactory factory = TestVFSClassLoaderFactoryFactory.createClassLoaderFactory(name, importAll, builder, urls);
+      ClassLoader loader = createClassLoader(result, factory);
       return AspectManager.instance().registerClassLoader(loader);
    }
-   
+
    protected ClassPool createChildDomainParentFirstClassPool(String name, String domainName, boolean importAll, URL... urls) throws Exception
    {
       return createChildDomainParentFirstClassPool((Result)null, name, domainName, importAll, urls);




More information about the jboss-cvs-commits mailing list