You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by db...@apache.org on 2007/08/03 03:20:42 UTC

svn commit: r562308 - /openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/BaseEjbProxyHandler.java

Author: dblevins
Date: Thu Aug  2 18:20:39 2007
New Revision: 562308

URL: http://svn.apache.org/viewvc?view=rev&rev=562308
Log:
Fixed issue with weak reference on a list getting garbage collected nearly immediately.  
My bad :)

Modified:
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/BaseEjbProxyHandler.java

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/BaseEjbProxyHandler.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/BaseEjbProxyHandler.java?view=diff&rev=562308&r1=562307&r2=562308
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/BaseEjbProxyHandler.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/BaseEjbProxyHandler.java Thu Aug  2 18:20:39 2007
@@ -35,6 +35,8 @@
 import java.util.List;
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.WeakHashMap;
+import java.util.Set;
 
 import javax.ejb.EJBException;
 import javax.ejb.NoSuchObjectLocalException;
@@ -92,7 +94,7 @@
     protected boolean doCrossClassLoaderCopy;
     private static final boolean REMOTE_COPY_ENABLED = parseRemoteCopySetting();
     protected final InterfaceType interfaceType;
-    private transient WeakReference<List<Class>> interfaces;
+    private transient WeakHashMap<Class,Object> interfaces;
     private transient WeakReference<Class> mainInterface;
 
     public BaseEjbProxyHandler(DeploymentInfo deploymentInfo, Object pk, InterfaceType interfaceType, List<Class> interfaces) {
@@ -107,19 +109,19 @@
             interfaces = new ArrayList<Class>(deploymentInfo.getInterfaces(objectInterfaceType));
         }
 
-        this.interfaces = new WeakReference(Collections.unmodifiableList(interfaces));
-
         this.doIntraVmCopy = !interfaceType.isLocal();
 
         if (!interfaceType.isLocal()){
             doIntraVmCopy = REMOTE_COPY_ENABLED;
         }
 
+        setInterfaces(interfaces);
+
         if (interfaceType.isHome()){
-            mainInterface = new WeakReference(deploymentInfo.getInterface(interfaceType));
+            setMainInterface(deploymentInfo.getInterface(interfaceType));
         } else {
             // Then arbitrarily pick the first interface
-            mainInterface = new WeakReference(interfaces.get(0));
+            setMainInterface(interfaces.get(0));
         }
     }
 
@@ -135,20 +137,21 @@
         // Home's only have one interface ever.  We don't
         // need to verify that the method invoked is in
         // it's interface.
-        if (interfaceType.isHome()) return getMainInterface();
+        Class mainInterface = getMainInterface();
+        if (interfaceType.isHome()) return mainInterface;
 
         Class declaringClass = method.getDeclaringClass();
 
         // If our "main" interface is or extends the method's declaring class
         // then we're good.  We know the main interface has the method being
         // invoked and it's safe to return it as the invoked interface.
-        if (declaringClass.isAssignableFrom(getMainInterface())){
-            return getMainInterface();
+        if (declaringClass.isAssignableFrom(mainInterface)){
+            return mainInterface;
         }
 
         // If the method being invoked isn't in the "main" interface
         // we need to find a suitable interface or throw an exception.
-        for (Class secondaryInterface : getInterfaces()) {
+        for (Class secondaryInterface : interfaces.keySet()) {
             if (declaringClass.isAssignableFrom(secondaryInterface)){
                 return secondaryInterface;
             }
@@ -159,14 +162,26 @@
         throw new IllegalStateException("Received method invocation and cannot determine corresponding business interface: method=" + method);
     }
 
-    public List<Class> getInterfaces() {
-        return interfaces.get();
-    }
-
     public Class getMainInterface() {
         return mainInterface.get();
     }
-    
+
+    private void setMainInterface(Class referent) {
+        mainInterface = new WeakReference<Class>(referent);
+    }
+
+    private void setInterfaces(List<Class> interfaces) {
+        this.interfaces = new WeakHashMap<Class,Object>(interfaces.size());
+        for (Class clazz : interfaces) {
+            this.interfaces.put(clazz, null);
+        }
+    }
+
+    public List<Class> getInterfaces() {
+        Set<Class> classes = interfaces.keySet();
+        return new ArrayList(classes);
+    }
+
     private static boolean parseRemoteCopySetting() {
         Properties properties = SystemInstance.get().getProperties();
         String value = properties.getProperty("openejb.localcopy");
@@ -553,8 +568,8 @@
     private void writeObject(java.io.ObjectOutputStream out) throws IOException {
         out.defaultWriteObject();
 
-        out.writeObject(interfaces.get());
-        out.writeObject(mainInterface.get());
+        out.writeObject(getInterfaces());
+        out.writeObject(getMainInterface());
     }
 
     private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, ClassNotFoundException {
@@ -569,8 +584,8 @@
             doCrossClassLoaderCopy = true;
         }
 
-        interfaces = new WeakReference<List<Class>>((List<Class>) in.readObject());
-        mainInterface = new WeakReference<Class>((Class) in.readObject());
+        setInterfaces((List<Class>) in.readObject());
+        setMainInterface((Class) in.readObject());
     }
 
 }