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