Author: rmannibucau
Date: Fri Dec 23 16:49:59 2011
New Revision: 1222746

URL: http://svn.apache.org/viewvc?rev=1222746&view=rev
Log:
copying the reconcialte classloder from openejb core jdkproxyfactory to the 
openejb client one (should a specific module be created?) and updating 
simple-osgi remote client test (from OSGi to a standard standalone openejb 
server))

Added:
    
openejb/trunk/openejb/examples/simple-osgi/simple-osgi-remote-client/src/main/java/org/superbiz/calculator/client/
    
openejb/trunk/openejb/examples/simple-osgi/simple-osgi-remote-client/src/main/java/org/superbiz/calculator/client/ClientUtil.java
    
openejb/trunk/openejb/examples/simple-osgi/simple-osgi-remote-client/src/main/java/org/superbiz/calculator/client/RemoteClientActivator.java
    
openejb/trunk/openejb/examples/simple-osgi/simple-osgi-remote-client/src/main/java/org/superbiz/calculator/client/RemoteClientMain.java
    openejb/trunk/openejb/examples/simple-osgi/standard-ejbd-server/
    openejb/trunk/openejb/examples/simple-osgi/standard-ejbd-server/pom.xml
    openejb/trunk/openejb/examples/simple-osgi/standard-ejbd-server/src/
    openejb/trunk/openejb/examples/simple-osgi/standard-ejbd-server/src/main/
    
openejb/trunk/openejb/examples/simple-osgi/standard-ejbd-server/src/main/java/
    
openejb/trunk/openejb/examples/simple-osgi/standard-ejbd-server/src/main/java/org/
    
openejb/trunk/openejb/examples/simple-osgi/standard-ejbd-server/src/main/java/org/superbiz/
    
openejb/trunk/openejb/examples/simple-osgi/standard-ejbd-server/src/main/java/org/superbiz/StandardEjbdServer.java
Removed:
    
openejb/trunk/openejb/examples/simple-osgi/simple-osgi-remote-client/src/main/java/org/superbiz/calculator/RemoteClientMain.java
Modified:
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/proxy/Jdk13ProxyFactory.java
    openejb/trunk/openejb/examples/simple-osgi/pom.xml
    openejb/trunk/openejb/examples/simple-osgi/simple-osgi-remote-client/pom.xml
    
openejb/trunk/openejb/examples/simple-osgi/simple-osgi-service-injection/pom.xml
    
openejb/trunk/openejb/server/openejb-client/src/main/java/org/apache/openejb/client/EJBObjectHandler.java
    
openejb/trunk/openejb/server/openejb-client/src/main/java/org/apache/openejb/client/proxy/Jdk13ProxyFactory.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=1222746&r1=1222745&r2=1222746&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
 Fri Dec 23 16:49:59 2011
@@ -63,7 +63,17 @@ public class Jdk13ProxyFactory implement
      * the specified invocation handler.
      */
     public Object newProxyInstance(Class interfce, 
org.apache.openejb.util.proxy.InvocationHandler h) throws 
IllegalArgumentException {
-        return Proxy.newProxyInstance(interfce.getClassLoader(), new 
Class[]{interfce}, h);
+        try {
+            return Proxy.newProxyInstance(interfce.getClassLoader(), new 
Class[]{ interfce }, h);
+        } catch (IllegalArgumentException iae) {
+            final ClassLoader reconciliatedCl = reconciliate(interfce);
+            try {
+                reconciliatedCl.loadClass(interfce.getName());
+                return Proxy.newProxyInstance(reconciliatedCl, new Class[]{ 
interfce }, h);
+            } catch (ClassNotFoundException e2) {
+                throw iae;
+            }
+        }
     }
 
     /*
@@ -102,7 +112,7 @@ public class Jdk13ProxyFactory implement
         }
     }
 
-    private static ClassLoader reconciliate(Class[] interfaces) {
+    private static ClassLoader reconciliate(Class<?>... interfaces) {
         Set<ClassLoader> classloaders = new LinkedHashSet<ClassLoader>();
         for (Class<?> clazz : interfaces) {
             classloaders.add(clazz.getClassLoader());

Modified: openejb/trunk/openejb/examples/simple-osgi/pom.xml
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/examples/simple-osgi/pom.xml?rev=1222746&r1=1222745&r2=1222746&view=diff
==============================================================================
--- openejb/trunk/openejb/examples/simple-osgi/pom.xml (original)
+++ openejb/trunk/openejb/examples/simple-osgi/pom.xml Fri Dec 23 16:49:59 2011
@@ -32,6 +32,7 @@
     <module>simple-osgi-remote-client</module>
     <module>simple-osgi-local-lookup-client</module>
     <module>simple-osgi-service-injection</module>
+    <module>standard-ejbd-server</module>
   </modules>
   <name>OpenEJB :: Examples :: Simple OSGi Stateless Pojo</name>
   <properties>
@@ -94,6 +95,12 @@
         <version>4.0.0-beta-2-SNAPSHOT</version>
         <scope>test</scope>
       </dependency>
+      <dependency>
+        <groupId>org.apache.felix</groupId>
+        <artifactId>org.osgi.core</artifactId>
+        <version>1.0.0</version>
+        <scope>provided</scope>
+      </dependency>
     </dependencies>
   </dependencyManagement>
 

Modified: 
openejb/trunk/openejb/examples/simple-osgi/simple-osgi-remote-client/pom.xml
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/examples/simple-osgi/simple-osgi-remote-client/pom.xml?rev=1222746&r1=1222745&r2=1222746&view=diff
==============================================================================
--- 
openejb/trunk/openejb/examples/simple-osgi/simple-osgi-remote-client/pom.xml 
(original)
+++ 
openejb/trunk/openejb/examples/simple-osgi/simple-osgi-remote-client/pom.xml 
Fri Dec 23 16:49:59 2011
@@ -11,6 +11,7 @@
 
   <artifactId>simple-osgi-remote-client</artifactId>
   <name>OpenEJB :: Examples :: Simple OSGi Stateless Pojo :: Remote 
Client</name>
+  <packaging>bundle</packaging>
 
   <dependencies>
     <!-- using scope compile to simplify the exec plugin usage -->
@@ -29,6 +30,10 @@
       <artifactId>simple-osgi-api</artifactId>
       <version>${project.version}</version>
     </dependency>
+    <dependency>
+      <groupId>org.apache.felix</groupId>
+      <artifactId>org.osgi.core</artifactId>
+    </dependency>
   </dependencies>
 
   <build>
@@ -45,7 +50,17 @@
           </execution>
         </executions>
         <configuration>
-          <mainClass>org.superbiz.calculator.RemoteClientMain</mainClass>
+          
<mainClass>org.superbiz.calculator.client.RemoteClientMain</mainClass>
+        </configuration>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.felix</groupId>
+        <artifactId>maven-bundle-plugin</artifactId>
+        <configuration>
+          <instructions>
+            <Import-Package>*</Import-Package>
+            
<Bundle-Activator>org.superbiz.calculator.client.RemoteClientActivator</Bundle-Activator>
+          </instructions>
         </configuration>
       </plugin>
     </plugins>

Added: 
openejb/trunk/openejb/examples/simple-osgi/simple-osgi-remote-client/src/main/java/org/superbiz/calculator/client/ClientUtil.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/examples/simple-osgi/simple-osgi-remote-client/src/main/java/org/superbiz/calculator/client/ClientUtil.java?rev=1222746&view=auto
==============================================================================
--- 
openejb/trunk/openejb/examples/simple-osgi/simple-osgi-remote-client/src/main/java/org/superbiz/calculator/client/ClientUtil.java
 (added)
+++ 
openejb/trunk/openejb/examples/simple-osgi/simple-osgi-remote-client/src/main/java/org/superbiz/calculator/client/ClientUtil.java
 Fri Dec 23 16:49:59 2011
@@ -0,0 +1,23 @@
+package org.superbiz.calculator.client;
+
+import org.apache.openejb.client.RemoteInitialContextFactory;
+import org.superbiz.osgi.calculator.CalculatorRemote;
+
+import javax.naming.Context;
+import javax.naming.InitialContext;
+import java.util.Properties;
+
+public final class ClientUtil {
+    private ClientUtil() {
+        // no-op
+    }
+
+    public static void invoke() throws Exception {
+        final Properties properties = new Properties();
+        properties.setProperty(Context.INITIAL_CONTEXT_FACTORY, 
RemoteInitialContextFactory.class.getName());
+        properties.setProperty(Context.PROVIDER_URL, "ejbd://localhost:4201");
+        Context remoteContext = new InitialContext(properties);
+        CalculatorRemote calculator = (CalculatorRemote) 
remoteContext.lookup("CalculatorBeanRemote");
+        System.out.println("Server answered: " + calculator.sayHello());
+    }
+}

Added: 
openejb/trunk/openejb/examples/simple-osgi/simple-osgi-remote-client/src/main/java/org/superbiz/calculator/client/RemoteClientActivator.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/examples/simple-osgi/simple-osgi-remote-client/src/main/java/org/superbiz/calculator/client/RemoteClientActivator.java?rev=1222746&view=auto
==============================================================================
--- 
openejb/trunk/openejb/examples/simple-osgi/simple-osgi-remote-client/src/main/java/org/superbiz/calculator/client/RemoteClientActivator.java
 (added)
+++ 
openejb/trunk/openejb/examples/simple-osgi/simple-osgi-remote-client/src/main/java/org/superbiz/calculator/client/RemoteClientActivator.java
 Fri Dec 23 16:49:59 2011
@@ -0,0 +1,26 @@
+package org.superbiz.calculator.client;
+
+
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+
+public class RemoteClientActivator implements BundleActivator {
+    @Override
+    public void start(BundleContext bundleContext) throws Exception {
+        final ClassLoader oldCl = 
Thread.currentThread().getContextClassLoader();
+        // set the bundle classloader to avoid to go back to AppClassloader 
and not found imported classes
+        
Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
+        try {
+            ClientUtil.invoke();
+        } catch (Exception e) {
+            System.out.println("error: " + e.getMessage());
+        } finally {
+            Thread.currentThread().setContextClassLoader(oldCl);
+        }
+    }
+
+    @Override
+    public void stop(BundleContext bundleContext) throws Exception {
+        // no-op
+    }
+}

Added: 
openejb/trunk/openejb/examples/simple-osgi/simple-osgi-remote-client/src/main/java/org/superbiz/calculator/client/RemoteClientMain.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/examples/simple-osgi/simple-osgi-remote-client/src/main/java/org/superbiz/calculator/client/RemoteClientMain.java?rev=1222746&view=auto
==============================================================================
--- 
openejb/trunk/openejb/examples/simple-osgi/simple-osgi-remote-client/src/main/java/org/superbiz/calculator/client/RemoteClientMain.java
 (added)
+++ 
openejb/trunk/openejb/examples/simple-osgi/simple-osgi-remote-client/src/main/java/org/superbiz/calculator/client/RemoteClientMain.java
 Fri Dec 23 16:49:59 2011
@@ -0,0 +1,11 @@
+package org.superbiz.calculator.client;
+
+public final class RemoteClientMain {
+    private RemoteClientMain() {
+        // no-op
+    }
+
+    public static void main(String[] args) throws Exception {
+        ClientUtil.invoke();
+    }
+}

Modified: 
openejb/trunk/openejb/examples/simple-osgi/simple-osgi-service-injection/pom.xml
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/examples/simple-osgi/simple-osgi-service-injection/pom.xml?rev=1222746&r1=1222745&r2=1222746&view=diff
==============================================================================
--- 
openejb/trunk/openejb/examples/simple-osgi/simple-osgi-service-injection/pom.xml
 (original)
+++ 
openejb/trunk/openejb/examples/simple-osgi/simple-osgi-service-injection/pom.xml
 Fri Dec 23 16:49:59 2011
@@ -21,7 +21,6 @@
     <dependency>
       <groupId>org.apache.felix</groupId>
       <artifactId>org.osgi.core</artifactId>
-      <version>1.0.0</version>
     </dependency>
   </dependencies>
 

Added: openejb/trunk/openejb/examples/simple-osgi/standard-ejbd-server/pom.xml
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/examples/simple-osgi/standard-ejbd-server/pom.xml?rev=1222746&view=auto
==============================================================================
--- openejb/trunk/openejb/examples/simple-osgi/standard-ejbd-server/pom.xml 
(added)
+++ openejb/trunk/openejb/examples/simple-osgi/standard-ejbd-server/pom.xml Fri 
Dec 23 16:49:59 2011
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0";
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd";>
+  <parent>
+    <artifactId>simple-osgi</artifactId>
+    <groupId>org.superbiz</groupId>
+    <version>1.1-SNAPSHOT</version>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+
+  <artifactId>standard-ejbd-server</artifactId>
+  <name>OpenEJB :: Examples :: Simple OSGi Stateless Pojo :: Standard 
Server</name>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.openejb</groupId>
+      <artifactId>javaee-api</artifactId>
+      <scope>compile</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.openejb</groupId>
+      <artifactId>openejb-core</artifactId>
+      <scope>compile</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.openejb</groupId>
+      <artifactId>openejb-ejbd</artifactId>
+      <version>4.0.0-beta-2-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>simple-osgi-api</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>simple-osgi-core</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+  </dependencies>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.codehaus.mojo</groupId>
+        <artifactId>exec-maven-plugin</artifactId>
+        <version>1.2.1</version>
+        <executions>
+          <execution>
+            <goals>
+              <goal>java</goal>
+            </goals>
+          </execution>
+        </executions>
+        <configuration>
+          <mainClass>org.superbiz.StandardEjbdServer</mainClass>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+</project>

Added: 
openejb/trunk/openejb/examples/simple-osgi/standard-ejbd-server/src/main/java/org/superbiz/StandardEjbdServer.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/examples/simple-osgi/standard-ejbd-server/src/main/java/org/superbiz/StandardEjbdServer.java?rev=1222746&view=auto
==============================================================================
--- 
openejb/trunk/openejb/examples/simple-osgi/standard-ejbd-server/src/main/java/org/superbiz/StandardEjbdServer.java
 (added)
+++ 
openejb/trunk/openejb/examples/simple-osgi/standard-ejbd-server/src/main/java/org/superbiz/StandardEjbdServer.java
 Fri Dec 23 16:49:59 2011
@@ -0,0 +1,33 @@
+package org.superbiz;
+
+import org.apache.openejb.OpenEjbContainer;
+import org.apache.openejb.localclient.LocalInitialContextFactory;
+
+import javax.ejb.embeddable.EJBContainer;
+import javax.naming.Context;
+import java.util.Properties;
+import java.util.concurrent.CountDownLatch;
+
+public final class StandardEjbdServer {
+    private StandardEjbdServer() {
+        // no-op
+    }
+
+    public static void main(String[] args) throws Exception {
+        final Properties properties = new Properties();
+        properties.setProperty(Context.INITIAL_CONTEXT_FACTORY, 
LocalInitialContextFactory.class.getName());
+        properties.setProperty(OpenEjbContainer.OPENEJB_EMBEDDED_REMOTABLE, 
Boolean.TRUE.toString());
+        final EJBContainer container = 
EJBContainer.createEJBContainer(properties);
+        final CountDownLatch latch = new CountDownLatch(1);
+
+        Runtime.getRuntime().addShutdownHook(new Thread() {
+            @Override
+            public void run() {
+                latch.countDown();
+                container.close();
+            }
+        });
+
+        latch.await();
+    }
+}

Modified: 
openejb/trunk/openejb/server/openejb-client/src/main/java/org/apache/openejb/client/EJBObjectHandler.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/server/openejb-client/src/main/java/org/apache/openejb/client/EJBObjectHandler.java?rev=1222746&r1=1222745&r2=1222746&view=diff
==============================================================================
--- 
openejb/trunk/openejb/server/openejb-client/src/main/java/org/apache/openejb/client/EJBObjectHandler.java
 (original)
+++ 
openejb/trunk/openejb/server/openejb-client/src/main/java/org/apache/openejb/client/EJBObjectHandler.java
 Fri Dec 23 16:49:59 2011
@@ -131,8 +131,15 @@ public abstract class EJBObjectHandler e
                 interfaces.addAll(ejb.businessClasses);
             }
             interfaces.add(EJBObjectProxy.class);
-            ejbObject = (EJBObjectProxy) 
ProxyManager.newProxyInstance(interfaces.toArray(new Class[]{}), this);
 
+            ClassLoader oldCl = Thread.currentThread().getContextClassLoader();
+            if (oldCl != getClass().getClassLoader()) {
+                
Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
+            }
+            ejbObject = (EJBObjectProxy) 
ProxyManager.newProxyInstance(interfaces.toArray(new Class[interfaces.size()]), 
this);
+            if (oldCl != getClass().getClassLoader()) {
+                
Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
+            }
         } catch (IllegalAccessException e) {
 
             e.printStackTrace();

Modified: 
openejb/trunk/openejb/server/openejb-client/src/main/java/org/apache/openejb/client/proxy/Jdk13ProxyFactory.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/server/openejb-client/src/main/java/org/apache/openejb/client/proxy/Jdk13ProxyFactory.java?rev=1222746&r1=1222745&r2=1222746&view=diff
==============================================================================
--- 
openejb/trunk/openejb/server/openejb-client/src/main/java/org/apache/openejb/client/proxy/Jdk13ProxyFactory.java
 (original)
+++ 
openejb/trunk/openejb/server/openejb-client/src/main/java/org/apache/openejb/client/proxy/Jdk13ProxyFactory.java
 Fri Dec 23 16:49:59 2011
@@ -19,7 +19,9 @@ package org.apache.openejb.client.proxy;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Proxy;
+import java.util.LinkedHashSet;
 import java.util.Properties;
+import java.util.Set;
 
 public class Jdk13ProxyFactory implements ProxyFactory {
 
@@ -114,7 +116,47 @@ public class Jdk13ProxyFactory implement
         }
 
         Jdk13InvocationHandler handler = new Jdk13InvocationHandler(h);
+        try {
+            return Proxy.newProxyInstance(interfaces[0].getClassLoader(), 
interfaces, handler);
+        } catch (IllegalArgumentException iae) {
+            final ClassLoader reconciliatedCl = reconciliate(interfaces);
+            try {
+                reconciliatedCl.loadClass(interfaces[0].getName());
+                return Proxy.newProxyInstance(reconciliatedCl, interfaces, 
handler);
+            } catch (ClassNotFoundException e2) {
+                throw iae;
+            }
+        }
+    }
 
-        return Proxy.newProxyInstance(interfaces[0].getClassLoader(), 
interfaces, handler);
+    private static ClassLoader reconciliate(Class<?>... interfaces) {
+        final 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;
+        }
     }
 }


Reply via email to