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() {