summaryrefslogtreecommitdiffstats
path: root/branches/sca-java-1.5.2/modules/core/src/main/java/org/apache/tuscany
diff options
context:
space:
mode:
authorslaws <slaws@13f79535-47bb-0310-9956-ffa450edef68>2009-11-02 16:44:00 +0000
committerslaws <slaws@13f79535-47bb-0310-9956-ffa450edef68>2009-11-02 16:44:00 +0000
commit15649e66488b68f46219fff6f4878c31b61015aa (patch)
treed4a4b959f6b7321d879fd876e99166556fc73887 /branches/sca-java-1.5.2/modules/core/src/main/java/org/apache/tuscany
parentc5341a187453654131482566358dd1dd01464036 (diff)
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
Diffstat (limited to 'branches/sca-java-1.5.2/modules/core/src/main/java/org/apache/tuscany')
-rw-r--r--branches/sca-java-1.5.2/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/SCAProxy.java12
1 files changed, 8 insertions, 4 deletions
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<String, Object>();
+ private static WeakHashMap cache = new WeakHashMap<Class, WeakReference<Constructor>>();
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<Constructor> ref = (WeakReference<Constructor>) 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<Constructor>(proxyCTOR));
}
}
return proxyCTOR.newInstance(new Object[] { invocationhandler });