[jboss-cvs] JBossAS SVN: r73087 - in projects/aop/trunk/aop/src/main/org/jboss/aop/proxy: container and 1 other directory.
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Tue May 6 14:12:48 EDT 2008
Author: kabir.khan at jboss.com
Date: 2008-05-06 14:12:48 -0400 (Tue, 06 May 2008)
New Revision: 73087
Modified:
projects/aop/trunk/aop/src/main/org/jboss/aop/proxy/ClassProxyFactory.java
projects/aop/trunk/aop/src/main/org/jboss/aop/proxy/container/ContainerProxyFactory.java
Log:
[JBAOP-572] Make container and class proxy caches classloader aware
Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/proxy/ClassProxyFactory.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/proxy/ClassProxyFactory.java 2008-05-06 18:02:11 UTC (rev 73086)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/proxy/ClassProxyFactory.java 2008-05-06 18:12:48 UTC (rev 73087)
@@ -57,7 +57,7 @@
{
private static Object maplock = new Object();
private static WeakValueHashMap<String, Class<?>> classnameMap = new WeakValueHashMap<String, Class<?>>();
- private static WeakHashMap<Class<?>, WeakReference<Class<?>>> proxyCache = new WeakHashMap<Class<?>, WeakReference<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 ClassProxy newInstance(Class<?> clazz) throws Exception
@@ -76,19 +76,32 @@
// Don't make a proxy of a proxy !
if (ClassProxy.class.isAssignableFrom(clazz)) clazz = clazz.getSuperclass();
+ ClassPool pool = AspectManager.instance().findClassPool(clazz.getClassLoader());
+ if (pool == null) throw new NullPointerException("Could not find ClassPool");
+
+
Class<?> proxyClass = null;
synchronized (maplock)
{
- WeakReference<Class<?>> ref = proxyCache.get(clazz);
- if (ref != null)
+ WeakHashMap<Class<?>, WeakReference<Class<?>>> proxiesForLoader = proxyCache.get(pool.getClassLoader());
+ if (proxiesForLoader == null)
{
- proxyClass = ref.get();
+ proxiesForLoader = new WeakHashMap<Class<?>, WeakReference<Class<?>>>();
+ proxyCache.put(pool.getClassLoader(), proxiesForLoader);
}
+ if (proxiesForLoader != null)
+ {
+ WeakReference<Class<?>> ref = proxiesForLoader.get(pool.getClassLoader());
+ if (ref != null)
+ {
+ proxyClass = ref.get();
+ }
+ }
if (proxyClass == null)
{
- proxyClass = generateProxy(clazz, mixins);
+ proxyClass = generateProxy(pool, clazz, mixins);
classnameMap.put(clazz.getName(), proxyClass);
- proxyCache.put(clazz, new WeakReference<Class<?>>(proxyClass));
+ proxiesForLoader.put(clazz, new WeakReference<Class<?>>(proxyClass));
HashMap<Long, MethodPersistentReference> map = methodMap(clazz);
methodMapCache.put(proxyClass, map);
}
@@ -132,12 +145,9 @@
private static int counter = 0;
- private static CtClass createProxyCtClass(ProxyMixin[] mixins, Class<?> clazz)
+ private static CtClass createProxyCtClass(ClassPool pool, ProxyMixin[] mixins, Class<?> clazz)
throws Exception
{
- ClassPool pool = AspectManager.instance().findClassPool(clazz.getClassLoader());
- if (pool == null) throw new NullPointerException("Could not find ClassPool");
-
String classname = "AOPClassProxy$" + counter++;
CtClass template = pool.get("org.jboss.aop.proxy.ClassProxyTemplate");
@@ -303,9 +313,9 @@
return proxy;
}
- private static Class<?> generateProxy(Class<?> clazz, ProxyMixin[] mixins) throws Exception
+ private static Class<?> generateProxy(ClassPool pool, Class<?> clazz, ProxyMixin[] mixins) throws Exception
{
- CtClass proxy = createProxyCtClass(mixins, clazz);
+ CtClass proxy = createProxyCtClass(pool, mixins, clazz);
ProtectionDomain pd = clazz.getProtectionDomain();
Class<?> proxyClass = TransformerCommon.toClass(proxy, pd);
Map<Long, MethodPersistentReference> methodmap = ClassProxyFactory.getMethodMap(proxyClass);
@@ -333,7 +343,7 @@
{
long hash = org.jboss.aop.util.MethodHashing.methodHash(declaredMethods[i]);
if(!ignoredHash.contains(new Long(hash)))
- advised.put(new Long(hash), new MethodPersistentReference(declaredMethods[i], PersistentReference.REFERENCE_SOFT));
+ advised.put(new Long(hash), new MethodPersistentReference(declaredMethods[i], PersistentReference.REFERENCE_WEAK));
}
else
{
Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/proxy/container/ContainerProxyFactory.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/proxy/container/ContainerProxyFactory.java 2008-05-06 18:02:11 UTC (rev 73086)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/proxy/container/ContainerProxyFactory.java 2008-05-06 18:12:48 UTC (rev 73087)
@@ -23,6 +23,7 @@
import java.io.Externalizable;
import java.io.Serializable;
+import java.lang.ref.WeakReference;
import java.lang.reflect.Method;
import java.security.ProtectionDomain;
import java.util.ArrayList;
@@ -67,14 +68,18 @@
*/
public class ContainerProxyFactory
{
+ final static String DELEGATE = Delegate.class.getName();
+ final static String ASPECT_MANAGED = AspectManaged.class.getName();
+
@SuppressWarnings("unchecked") private static final HashMap EMPTY_HASHMAP = new HashMap();
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$";
private static Object maplock = new Object();
- private static WeakHashMap<Class<?>, Map<ContainerProxyCacheKey, Class<?>>> proxyCache = new WeakHashMap<Class<?>, Map<ContainerProxyCacheKey, Class<?>>>();
+ private static WeakHashMap<ClassLoader, WeakHashMap<Class<?>, Map<ContainerProxyCacheKey, WeakReference<Class<?>>>>> proxyCache = new WeakHashMap<ClassLoader, WeakHashMap<Class<?>, Map<ContainerProxyCacheKey, WeakReference<Class<?>>>>>();
private static volatile int counter = 0;
private static CtMethod setDelegateMethod;
@@ -125,24 +130,38 @@
// Don't make a proxy of a proxy !
if (Delegate.class.isAssignableFrom(clazz)) clazz = clazz.getSuperclass();
+ ClassPool pool = AspectManager.instance().findClassPool(clazz.getClassLoader());
+ if (pool == null) throw new NullPointerException("Could not find ClassPool");
+
Class<?> proxyClass = null;
synchronized (maplock)
{
- Map<ContainerProxyCacheKey, Class<?>> map = proxyCache.get(clazz);
+ WeakHashMap<Class<?>, Map<ContainerProxyCacheKey, WeakReference<Class<?>>>> proxiesForLoader = proxyCache.get(pool.getClassLoader());
+ if (proxiesForLoader == null)
+ {
+ proxiesForLoader = new WeakHashMap<Class<?>, Map<ContainerProxyCacheKey, WeakReference<Class<?>>>>();
+ proxyCache.put(pool.getClassLoader(), proxiesForLoader);
+ }
+
+ Map<ContainerProxyCacheKey, WeakReference<Class<?>>> map = proxiesForLoader.get(clazz);
if (map == null)
{
- map = new HashMap<ContainerProxyCacheKey, Class<?>>();
- proxyCache.put(clazz, map);
+ map = new HashMap<ContainerProxyCacheKey, WeakReference<Class<?>>>();
+ proxiesForLoader.put(clazz, map);
}
else
{
- proxyClass = map.get(key);
+ WeakReference<Class<?>> proxyClassRef = map.get(key);
+ if (proxyClassRef != null)
+ {
+ proxyClass = proxyClassRef.get();
+ }
}
if (proxyClass == null)
{
proxyClass = generateProxy(objectAsSuper, clazz, advisor, outOfVmProxy);
- map.put(key, proxyClass);
+ map.put(key, new WeakReference<Class<?>>(proxyClass));
}
}
return proxyClass;
@@ -152,8 +171,9 @@
{
ArrayList<InterfaceIntroduction> introductions = advisor.getInterfaceIntroductions();
CtClass proxy = createProxyCtClass(objectAsSuper, introductions, clazz, advisor, outOfVmProxy);
+// ClassLoader loader = determineClassLoaderToUse(clazz, proxy);
ProtectionDomain pd = clazz.getProtectionDomain();
- Class<?> proxyClass = TransformerCommon.toClass(proxy, pd);
+ Class<?> proxyClass = TransformerCommon.toClass(proxy, /*loader,*/ pd);
return proxyClass;
}
@@ -882,7 +902,7 @@
destFile.addAttribute(sig.copy(destFile.getConstPool(), EMPTY_HASHMAP));
}
}
-
+
private interface ProxyStrategy
{
/**
More information about the jboss-cvs-commits
mailing list