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 2012/12/15 21:28:34 UTC

svn commit: r1422347 - /openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/BeanContext.java

Author: rmannibucau
Date: Sat Dec 15 20:28:32 2012
New Revision: 1422347

URL: http://svn.apache.org/viewvc?rev=1422347&view=rev
Log:
TOMEE-658 if a lookup fail from an EJB trying again with global JNDIContext - easy way to share global part of jndi context for all ejbs

Modified:
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/BeanContext.java

Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/BeanContext.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/BeanContext.java?rev=1422347&r1=1422346&r2=1422347&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/BeanContext.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/BeanContext.java Sat Dec 15 20:28:32 2012
@@ -36,6 +36,7 @@ import org.apache.openejb.core.transacti
 import org.apache.openejb.core.transaction.TransactionPolicyFactory;
 import org.apache.openejb.core.transaction.TransactionType;
 import org.apache.openejb.loader.SystemInstance;
+import org.apache.openejb.spi.ContainerSystem;
 import org.apache.openejb.util.Duration;
 import org.apache.openejb.util.Index;
 import org.apache.openejb.util.LogCategory;
@@ -64,11 +65,14 @@ import javax.enterprise.context.spi.Cont
 import javax.enterprise.context.spi.CreationalContext;
 import javax.enterprise.inject.spi.Bean;
 import javax.naming.Context;
+import javax.naming.NameNotFoundException;
 import javax.persistence.EntityManagerFactory;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
+import java.lang.reflect.Proxy;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -253,7 +257,7 @@ public class BeanContext extends Deploym
         }
 
         this.moduleContext = moduleContext;
-        this.jndiContext = jndiContext;
+        this.jndiContext = (Context) Proxy.newProxyInstance(BeanContext.class.getClassLoader(), new Class[]{ Context.class }, new ContextHandler(jndiContext));
         this.localbean = localBean;
         this.componentType = componentType;
         this.beanClass = beanClass;
@@ -1684,4 +1688,28 @@ public class BeanContext extends Deploym
         private Class localInterface;
         private Method createMethod;
     }
+
+    private static class ContextHandler implements InvocationHandler {
+        private final Context delegate;
+
+        public ContextHandler(final Context jndiContext) {
+            delegate = jndiContext;
+        }
+
+        @Override
+        public Object invoke(final Object proxy, final Method method, final Object[] args) throws Throwable {
+            try {
+                return method.invoke(delegate, args);
+            } catch (InvocationTargetException nnfe) {
+                if (nnfe.getTargetException() instanceof NameNotFoundException && "lookup".equals(method.getName())) {
+                    try {
+                        return method.invoke(SystemInstance.get().getComponent(ContainerSystem.class).getJNDIContext(), args);
+                    } catch (InvocationTargetException nnfe2) {
+                        // ignore, let it be thrown
+                    }
+                }
+                throw nnfe;
+            }
+        }
+    }
 }