[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