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();
}