EXTCDI-271 root-bean-manager support

git-svn-id: https://svn.apache.org/repos/asf/myfaces/extensions/cdi/trunk@1296792 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/core/api/src/main/java/org/apache/myfaces/extensions/cdi/core/api/provider/BeanManagerHolder.java b/core/api/src/main/java/org/apache/myfaces/extensions/cdi/core/api/provider/BeanManagerHolder.java
new file mode 100644
index 0000000..efff4fe
--- /dev/null
+++ b/core/api/src/main/java/org/apache/myfaces/extensions/cdi/core/api/provider/BeanManagerHolder.java
@@ -0,0 +1,38 @@
+/*

+ * Licensed to the Apache Software Foundation (ASF) under one

+ * or more contributor license agreements.  See the NOTICE file

+ * distributed with this work for additional information

+ * regarding copyright ownership.  The ASF licenses this file

+ * to you under the Apache License, Version 2.0 (the

+ * "License"); you may not use this file except in compliance

+ * with the License.  You may obtain a copy of the License at

+ *

+ *   http://www.apache.org/licenses/LICENSE-2.0

+ *

+ * Unless required by applicable law or agreed to in writing,

+ * software distributed under the License is distributed on an

+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY

+ * KIND, either express or implied.  See the License for the

+ * specific language governing permissions and limitations

+ * under the License.

+ */

+package org.apache.myfaces.extensions.cdi.core.api.provider;

+

+import javax.enterprise.inject.Typed;

+import javax.enterprise.inject.spi.BeanManager;

+

+@Typed()

+class BeanManagerHolder

+{

+    private BeanManager beanManager;

+

+    BeanManagerHolder(BeanManager beanManager)

+    {

+        this.beanManager = beanManager;

+    }

+

+    BeanManager getBeanManager()

+    {

+        return beanManager;

+    }

+}

diff --git a/core/api/src/main/java/org/apache/myfaces/extensions/cdi/core/api/provider/BeanManagerProvider.java b/core/api/src/main/java/org/apache/myfaces/extensions/cdi/core/api/provider/BeanManagerProvider.java
index 6f377e9..0912128 100644
--- a/core/api/src/main/java/org/apache/myfaces/extensions/cdi/core/api/provider/BeanManagerProvider.java
+++ b/core/api/src/main/java/org/apache/myfaces/extensions/cdi/core/api/provider/BeanManagerProvider.java
@@ -52,7 +52,7 @@
 {
     private static BeanManagerProvider bmp = null;
 
-    private volatile Map<ClassLoader, BeanManager> bms = new ConcurrentHashMap<ClassLoader, BeanManager>();
+    private volatile Map<ClassLoader, BeanManagerHolder> bms = new ConcurrentHashMap<ClassLoader, BeanManagerHolder>();
 
     /**
      * Returns if the {@link BeanManagerProvider} has been initialized
@@ -96,17 +96,39 @@
     {
         ClassLoader classLoader = ClassUtils.getClassLoader(null);
 
-        BeanManager result = bms.get(classLoader);
+        BeanManagerHolder resultHolder = bms.get(classLoader);
+        BeanManager result;
 
-        if (result == null)
+        if (resultHolder == null)
         {
             result = resolveBeanManagerViaJndi();
 
             if(result != null)
             {
-                bms.put(classLoader, result);
+                bms.put(classLoader, new RootBeanManagerHolder(result));
             }
         }
+        else
+        {
+            result = resultHolder.getBeanManager();
+
+            if (!(resultHolder instanceof RootBeanManagerHolder))
+            {
+                BeanManager jndiBeanManager = resolveBeanManagerViaJndi();
+
+                if (jndiBeanManager != null && /*same instance check:*/jndiBeanManager != result)
+                {
+                    setRootBeanManager(jndiBeanManager);
+
+                    result = jndiBeanManager;
+                }
+                else
+                {
+                    setRootBeanManager(result);
+                }
+            }
+        }
+
         return result;
     }
 
@@ -217,10 +239,26 @@
      */
     public void setBeanManager(@Observes AfterBeanDiscovery afterBeanDiscovery, BeanManager beanManager)
     {
+        setBeanManager(new BeanManagerHolder(beanManager));
+    }
+
+    public void setRootBeanManager(BeanManager beanManager)
+    {
+        setBeanManager(new RootBeanManagerHolder(beanManager));
+    }
+
+    private void setBeanManager(BeanManagerHolder beanManagerHolder)
+    {
         BeanManagerProvider bmpFirst = setBeanManagerProvider(this);
 
         ClassLoader cl = ClassUtils.getClassLoader(null);
-        bmpFirst.bms.put(cl, beanManager);
+
+        if (beanManagerHolder instanceof RootBeanManagerHolder ||
+                //the lat bm wins - as before, but don't replace a root-bmh with a normal bmh
+                (!(bmpFirst.bms.get(cl) instanceof RootBeanManagerHolder)))
+        {
+            bmpFirst.bms.put(cl, beanManagerHolder);
+        }
 
         CodiStartupBroadcaster.broadcastStartup();
     }
diff --git a/core/api/src/main/java/org/apache/myfaces/extensions/cdi/core/api/provider/RootBeanManagerHolder.java b/core/api/src/main/java/org/apache/myfaces/extensions/cdi/core/api/provider/RootBeanManagerHolder.java
new file mode 100644
index 0000000..299b669
--- /dev/null
+++ b/core/api/src/main/java/org/apache/myfaces/extensions/cdi/core/api/provider/RootBeanManagerHolder.java
@@ -0,0 +1,31 @@
+/*

+ * Licensed to the Apache Software Foundation (ASF) under one

+ * or more contributor license agreements.  See the NOTICE file

+ * distributed with this work for additional information

+ * regarding copyright ownership.  The ASF licenses this file

+ * to you under the Apache License, Version 2.0 (the

+ * "License"); you may not use this file except in compliance

+ * with the License.  You may obtain a copy of the License at

+ *

+ *   http://www.apache.org/licenses/LICENSE-2.0

+ *

+ * Unless required by applicable law or agreed to in writing,

+ * software distributed under the License is distributed on an

+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY

+ * KIND, either express or implied.  See the License for the

+ * specific language governing permissions and limitations

+ * under the License.

+ */

+package org.apache.myfaces.extensions.cdi.core.api.provider;

+

+import javax.enterprise.inject.Typed;

+import javax.enterprise.inject.spi.BeanManager;

+

+@Typed()

+class RootBeanManagerHolder extends BeanManagerHolder

+{

+    RootBeanManagerHolder(BeanManager beanManager)

+    {

+        super(beanManager);

+    }

+}

diff --git a/test-modules/base-test-infrastructure-module/src/main/java/org/apache/myfaces/extensions/cdi/test/strategy/AbstractCdiAwareTestStrategy.java b/test-modules/base-test-infrastructure-module/src/main/java/org/apache/myfaces/extensions/cdi/test/strategy/AbstractCdiAwareTestStrategy.java
index 585f44f..fae1e56 100644
--- a/test-modules/base-test-infrastructure-module/src/main/java/org/apache/myfaces/extensions/cdi/test/strategy/AbstractCdiAwareTestStrategy.java
+++ b/test-modules/base-test-infrastructure-module/src/main/java/org/apache/myfaces/extensions/cdi/test/strategy/AbstractCdiAwareTestStrategy.java
@@ -18,6 +18,7 @@
  */

 package org.apache.myfaces.extensions.cdi.test.strategy;

 

+import org.apache.myfaces.extensions.cdi.core.api.provider.BeanManagerProvider;

 import org.apache.myfaces.extensions.cdi.test.TestContainerFactory;

 import org.apache.myfaces.extensions.cdi.test.spi.CdiTestContainer;

 

@@ -82,6 +83,7 @@
     //@After

     public void after()

     {

+        BeanManagerProvider.getInstance().cleanupStoredBeanManagerOnShutdown(null);

         this.testContainer.stopContexts();

         this.testContainer.stopContainer();

     }