You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by rm...@apache.org on 2011/12/22 16:15:20 UTC

svn commit: r1222273 - in /openejb/trunk/openejb: container/openejb-core/src/main/java/org/apache/openejb/util/proxy/Jdk13ProxyFactory.java server/openejb-ejbd/src/main/java/org/apache/openejb/server/ejbd/EjbServer.java

Author: rmannibucau
Date: Thu Dec 22 15:15:19 2011
New Revision: 1222273

URL: http://svn.apache.org/viewvc?rev=1222273&view=rev
Log:
trying to reconciliate classes in different classloader when creating proxies

Modified:
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/proxy/Jdk13ProxyFactory.java
    openejb/trunk/openejb/server/openejb-ejbd/src/main/java/org/apache/openejb/server/ejbd/EjbServer.java

Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/proxy/Jdk13ProxyFactory.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/proxy/Jdk13ProxyFactory.java?rev=1222273&r1=1222272&r2=1222273&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/proxy/Jdk13ProxyFactory.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/proxy/Jdk13ProxyFactory.java Thu Dec 22 15:15:19 2011
@@ -16,12 +16,12 @@
  */
 package org.apache.openejb.util.proxy;
 
-import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationTargetException;
+import org.apache.openejb.OpenEJBException;
+
 import java.lang.reflect.Proxy;
+import java.util.LinkedHashSet;
 import java.util.Properties;
-
-import org.apache.openejb.OpenEJBException;
+import java.util.Set;
 
 /**
  * @org.apache.xbean.XBean 
@@ -85,10 +85,52 @@ public class Jdk13ProxyFactory implement
                     return Proxy.newProxyInstance(tccl, interfaces, handler);
                 }
             } catch (ClassNotFoundException e1) {
-                throw e;
+                // maybe all interfaces are not in the same classloader (OSGi)
+                // trying to reconciliate it here
+                ClassLoader reconciliatedCl = reconciliate(interfaces);
+                Class homeClass;
+                try {
+                    homeClass = reconciliatedCl.loadClass(interfaces[0].getName());
+                    if (homeClass == interfaces[0]) {
+                        return Proxy.newProxyInstance(reconciliatedCl, interfaces, handler);
+                    }
+                } catch (ClassNotFoundException e2) {
+                    throw e;
+                }
             }
             throw e;
         }
     }
+
+    private static ClassLoader reconciliate(Class[] interfaces) {
+        Set<ClassLoader> classloaders = new LinkedHashSet<ClassLoader>();
+        for (Class<?> clazz : interfaces) {
+            classloaders.add(clazz.getClassLoader());
+        }
+        return new MultipleClassLoadersClassLoader(classloaders.toArray(new ClassLoader[classloaders.size()]));
+    }
+
+    private static class MultipleClassLoadersClassLoader extends ClassLoader {
+        private ClassLoader[] delegatingClassloaders;
+
+        public MultipleClassLoadersClassLoader(final ClassLoader[] classLoaders) {
+            super(classLoaders[0]);
+            delegatingClassloaders = classLoaders;
+        }
+
+        @Override public Class<?> loadClass(String name) throws ClassNotFoundException {
+            ClassNotFoundException ex = null;
+            for (ClassLoader cl : delegatingClassloaders) {
+                try {
+                    return cl.loadClass(name);
+                } catch (ClassNotFoundException cnfe) {
+                    if (ex == null) {
+                        ex = cnfe;
+                    }
+                }
+            }
+            throw ex;
+        }
+    }
 }
 

Modified: openejb/trunk/openejb/server/openejb-ejbd/src/main/java/org/apache/openejb/server/ejbd/EjbServer.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/server/openejb-ejbd/src/main/java/org/apache/openejb/server/ejbd/EjbServer.java?rev=1222273&r1=1222272&r2=1222273&view=diff
==============================================================================
--- openejb/trunk/openejb/server/openejb-ejbd/src/main/java/org/apache/openejb/server/ejbd/EjbServer.java (original)
+++ openejb/trunk/openejb/server/openejb-ejbd/src/main/java/org/apache/openejb/server/ejbd/EjbServer.java Thu Dec 22 15:15:19 2011
@@ -68,7 +68,13 @@ public class EjbServer implements org.ap
 
     public void service(InputStream inputStream, OutputStream outputStream) throws ServiceException, IOException {
         ServerFederation.setApplicationServer(server);
-        server.service(inputStream, outputStream);
+        final ClassLoader oldCl = Thread.currentThread().getContextClassLoader();
+        Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
+        try {
+            server.service(inputStream, outputStream);
+        } finally {
+            Thread.currentThread().setContextClassLoader(oldCl);
+        }
     }
 
     public String getIP() {