Author: rmannibucau
Date: Thu Nov 22 10:24:10 2012
New Revision: 1412486

URL: http://svn.apache.org/viewvc?rev=1412486&view=rev
Log:
TOMEE-600 injecting a context managing local + remote

Modified:
    
openejb/trunk/openejb/arquillian/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/RemoteInitialContextObserver.java

Modified: 
openejb/trunk/openejb/arquillian/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/RemoteInitialContextObserver.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/arquillian/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/RemoteInitialContextObserver.java?rev=1412486&r1=1412485&r2=1412486&view=diff
==============================================================================
--- 
openejb/trunk/openejb/arquillian/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/RemoteInitialContextObserver.java
 (original)
+++ 
openejb/trunk/openejb/arquillian/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/RemoteInitialContextObserver.java
 Thu Nov 22 10:24:10 2012
@@ -28,6 +28,9 @@ import org.jboss.arquillian.test.spi.eve
 import javax.naming.Context;
 import javax.naming.InitialContext;
 import javax.naming.NamingException;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
 import java.util.Properties;
 
 public class RemoteInitialContextObserver {
@@ -54,11 +57,35 @@ public class RemoteInitialContextObserve
             props.setProperty(Context.INITIAL_CONTEXT_FACTORY, 
REMOTE_INITIAL_CONTEXT_FACTORY);
             props.setProperty(Context.PROVIDER_URL, "http://"; + 
httpContext.getHost() + ":" + httpContext.getPort() + "/tomee/ejb");
 
-            context.set(new InitialContext(props));
+            context.set((Context) 
Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), new 
Class<?>[]{ Context.class }, new MultipleContextHandler(new InitialContext(), 
new InitialContext(props))));
         } catch (ClassNotFoundException e) {
             // no-op
         } catch (NamingException e) {
             // no-op
         }
     }
+
+    private static class MultipleContextHandler implements InvocationHandler {
+        private final InitialContext[] contexts;
+
+        public MultipleContextHandler(final InitialContext... initialContexts) 
{
+            contexts = initialContexts;
+        }
+
+        @Override
+        public Object invoke(Object proxy, Method method, Object[] args) 
throws Throwable {
+            Exception err = null;
+            for (Context ctx : contexts) {
+                try {
+                    return method.invoke(ctx, args);
+                } catch (Exception e) {
+                    err = e;
+                }
+            }
+            if (err != null) {
+                throw err;
+            }
+            return null;
+        }
+    }
 }


Reply via email to