From 15649e66488b68f46219fff6f4878c31b61015aa Mon Sep 17 00:00:00 2001 From: slaws Date: Mon, 2 Nov 2009 16:44:00 +0000 Subject: TUSCANY-3312 - correct the fix for SCAProxy that previously relied on hash codes and is not correct. Change to relying on a weak reference inside to weak hash table to ensure that the proxy, and hence the class that it references, will be removed when the proxy is no longer required. git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@831966 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/tuscany/sca/core/invocation/SCAProxy.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) (limited to 'branches/sca-java-1.5.2/modules/core/src/main/java/org/apache/tuscany') diff --git a/branches/sca-java-1.5.2/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/SCAProxy.java b/branches/sca-java-1.5.2/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/SCAProxy.java index b591ccedd6..f2907638ad 100644 --- a/branches/sca-java-1.5.2/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/SCAProxy.java +++ b/branches/sca-java-1.5.2/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/SCAProxy.java @@ -18,6 +18,7 @@ */ package org.apache.tuscany.sca.core.invocation; +import java.lang.ref.WeakReference; import java.lang.reflect.InvocationHandler; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Proxy; @@ -33,7 +34,7 @@ public class SCAProxy extends Proxy // This is a cache containing the proxy class constructor for each business interface. // This improves performance compared to calling Proxy.newProxyInstance() // every time that a proxy is needed. - private static WeakHashMap cache = new WeakHashMap(); + private static WeakHashMap cache = new WeakHashMap>(); public static Object newProxyInstance(ClassLoader classloader, Class aclass[], InvocationHandler invocationhandler) throws IllegalArgumentException @@ -42,15 +43,18 @@ public class SCAProxy extends Proxy if(invocationhandler == null) throw new NullPointerException(); // Lookup cached constructor. aclass[0] is the reference's business interface. - Constructor proxyCTOR; + Constructor proxyCTOR = null; synchronized(cache) { - proxyCTOR = (Constructor) cache.get(aclass[0].hashCode()); + WeakReference ref = (WeakReference) cache.get(aclass[0]); + if (ref != null){ + proxyCTOR = ref.get(); + } } if(proxyCTOR == null) { Class proxyClass = getProxyClass(classloader, aclass); proxyCTOR = proxyClass.getConstructor(constructorParams); synchronized(cache){ - cache.put(aclass[0].hashCode(),proxyCTOR); + cache.put(aclass[0],new WeakReference(proxyCTOR)); } } return proxyCTOR.newInstance(new Object[] { invocationhandler }); -- cgit v1.2.3