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;
+ }
+ }
+ }
}