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 2014/12/16 20:40:01 UTC

tomee git commit: not that happy about this thread local but easiest way to ensure to keep earlib webbeanscontext if needed

Repository: tomee
Updated Branches:
  refs/heads/develop 54bc07657 -> d0e363b13


not that happy about this thread local but easiest way to ensure to keep earlib webbeanscontext if needed


Project: http://git-wip-us.apache.org/repos/asf/tomee/repo
Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/d0e363b1
Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/d0e363b1
Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/d0e363b1

Branch: refs/heads/develop
Commit: d0e363b1377048885cce19aa3b4753a00d32734d
Parents: 54bc076
Author: Romain Manni-Bucau <rm...@apache.org>
Authored: Tue Dec 16 20:39:39 2014 +0100
Committer: Romain Manni-Bucau <rm...@apache.org>
Committed: Tue Dec 16 20:39:39 2014 +0100

----------------------------------------------------------------------
 .../apache/openejb/cdi/WebappBeanManager.java   | 29 ++++++++++++++++++--
 1 file changed, 26 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tomee/blob/d0e363b1/container/openejb-core/src/main/java/org/apache/openejb/cdi/WebappBeanManager.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/cdi/WebappBeanManager.java b/container/openejb-core/src/main/java/org/apache/openejb/cdi/WebappBeanManager.java
index 392b3ca..d4ba60e 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/cdi/WebappBeanManager.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/cdi/WebappBeanManager.java
@@ -24,6 +24,7 @@ import org.apache.webbeans.component.OwbBean;
 import org.apache.webbeans.container.BeanManagerImpl;
 import org.apache.webbeans.context.creational.CreationalContextImpl;
 import org.apache.webbeans.event.EventMetadataImpl;
+import org.apache.webbeans.util.Asserts;
 import org.apache.webbeans.util.WebBeansUtil;
 
 import javax.el.ELResolver;
@@ -31,6 +32,7 @@ import javax.el.ExpressionFactory;
 import javax.enterprise.context.spi.Context;
 import javax.enterprise.context.spi.Contextual;
 import javax.enterprise.context.spi.CreationalContext;
+import javax.enterprise.inject.UnsatisfiedResolutionException;
 import javax.enterprise.inject.spi.AnnotatedType;
 import javax.enterprise.inject.spi.Bean;
 import javax.enterprise.inject.spi.InjectionPoint;
@@ -44,6 +46,7 @@ import java.util.Set;
 import java.util.concurrent.CopyOnWriteArraySet;
 
 public class WebappBeanManager extends BeanManagerImpl {
+    private static final ThreadLocal<Boolean> USE_PARENT_BM = new ThreadLocal<>();
     private final WebappWebBeansContext webappCtx;
     private final InheritedBeanFilter filter;
     private Set<Bean<?>> deploymentBeans;
@@ -79,11 +82,31 @@ public class WebappBeanManager extends BeanManagerImpl {
 
     @Override
     public Object getInjectableReference(final InjectionPoint injectionPoint, final CreationalContext<?> ctx) {
-        try {
-            return super.getInjectableReference(injectionPoint, ctx);
-        } catch (final RuntimeException e) {
+        Asserts.assertNotNull(injectionPoint, "injectionPoint parameter can not be null");
+        if(injectionPoint == null)  {
+            return null;
+        }
+
+        final Boolean existing = USE_PARENT_BM.get();
+        if (existing != null && existing) { // shortcut the whole logic to keep the threadlocal set up correctly
             return getParentBm().getInjectableReference(injectionPoint, ctx);
         }
+
+        // we can do it cause there is caching but we shouldn't - easy way to overide OWB actually
+        final Bean<Object> injectedBean = (Bean<Object>)getInjectionResolver().getInjectionPointBean(injectionPoint);
+        try {
+            if (injectedBean != null && injectedBean == getParentBm().getInjectionResolver().getInjectionPointBean(injectionPoint)) {
+                USE_PARENT_BM.set(true);
+                try {
+                    return getParentBm().getInjectableReference(injectionPoint, ctx);
+                } finally {
+                    USE_PARENT_BM.remove();
+                }
+            }
+        } catch (final UnsatisfiedResolutionException ure) {
+            // skip, use this bean
+        }
+        return super.getInjectableReference(injectionPoint, ctx);
     }
 
     @Override