You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@deltaspike.apache.org by gp...@apache.org on 2014/11/08 12:26:17 UTC
deltaspike git commit: DELTASPIKE-772 delegate the bean-manager
lookup to the CDI container with CDI 1.1+
Repository: deltaspike
Updated Branches:
refs/heads/master c27d288e1 -> 51fa35e2e
DELTASPIKE-772 delegate the bean-manager lookup to the CDI container with CDI 1.1+
Project: http://git-wip-us.apache.org/repos/asf/deltaspike/repo
Commit: http://git-wip-us.apache.org/repos/asf/deltaspike/commit/51fa35e2
Tree: http://git-wip-us.apache.org/repos/asf/deltaspike/tree/51fa35e2
Diff: http://git-wip-us.apache.org/repos/asf/deltaspike/diff/51fa35e2
Branch: refs/heads/master
Commit: 51fa35e2e5831101ce523320b7f719f0db18dd6b
Parents: c27d288
Author: gpetracek <gp...@apache.org>
Authored: Sat Nov 8 12:24:36 2014 +0100
Committer: gpetracek <gp...@apache.org>
Committed: Sat Nov 8 12:24:36 2014 +0100
----------------------------------------------------------------------
.../core/api/provider/BeanManagerProvider.java | 61 +++++++++++++++++++-
1 file changed, 60 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/deltaspike/blob/51fa35e2/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/provider/BeanManagerProvider.java
----------------------------------------------------------------------
diff --git a/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/provider/BeanManagerProvider.java b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/provider/BeanManagerProvider.java
index a5d63e0..3ee9b1c 100644
--- a/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/provider/BeanManagerProvider.java
+++ b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/provider/BeanManagerProvider.java
@@ -26,10 +26,13 @@ import javax.enterprise.inject.spi.BeforeShutdown;
import javax.enterprise.inject.spi.Extension;
import javax.naming.InitialContext;
import javax.naming.NamingException;
+import java.lang.reflect.Method;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.logging.Level;
import java.util.logging.Logger;
+import org.apache.deltaspike.core.api.config.ConfigResolver;
import org.apache.deltaspike.core.util.ClassUtils;
@@ -60,8 +63,40 @@ public class BeanManagerProvider implements Extension
{
private static final Logger LOG = Logger.getLogger(BeanManagerProvider.class.getName());
+ //for CDI 1.1+ delegation
+ private static final Method CDI_CURRENT_METHOD;
+ private static final Method CDI_CURRENT_BEAN_MANAGER_METHOD;
+
private static BeanManagerProvider bmpSingleton;
+ static
+ {
+ Class cdiClass = ClassUtils.tryToLoadClassForName("javax.enterprise.inject.spi.CDI");
+
+ Method resolvedCdiCurrentMethod = null;
+ Method resolvedCdiBeanManagerMethod = null;
+ //only init methods if a cdi 1.1+ container is available and the delegation-mode isn't deactivated.
+ //deactivation is e.g. useful if owb is used in "parallel mode" in a weld-based server.
+ if (cdiClass != null && !"false".equalsIgnoreCase(
+ ConfigResolver.getPropertyValue("deltaspike.bean-manager.delegate_to_container", Boolean.TRUE.toString())))
+ {
+
+ try
+ {
+ resolvedCdiCurrentMethod = cdiClass.getDeclaredMethod("current");
+ resolvedCdiBeanManagerMethod = cdiClass.getDeclaredMethod("getBeanManager");
+ }
+ catch (Exception e)
+ {
+ LOG.log(Level.SEVERE, "Couldn't get method from " + cdiClass.getName(), e);
+ }
+ }
+
+ //null if no init happened e.g. due to CDI 1.0 or deactivated delegation-mode
+ CDI_CURRENT_METHOD = resolvedCdiCurrentMethod;
+ CDI_CURRENT_BEAN_MANAGER_METHOD = resolvedCdiBeanManagerMethod;
+ }
+
/**
* This data container is used for storing the BeanManager for each
* WebApplication. This is needed in EAR or other multi-webapp scenarios
@@ -162,6 +197,13 @@ public class BeanManagerProvider implements Extension
*/
public BeanManager getBeanManager()
{
+ BeanManager result = resolveBeanManagerViaStaticHelper();
+
+ if (result != null)
+ {
+ return result;
+ }
+
BeanManagerInfo bmi = getBeanManagerInfo(ClassUtils.getClassLoader(null));
// warn the user if he tries to use the BeanManager before container startup
@@ -178,7 +220,7 @@ public class BeanManagerProvider implements Extension
}
}
- BeanManager result = bmi.finalBm;
+ result = bmi.finalBm;
if (result == null)
{
@@ -276,6 +318,23 @@ public class BeanManagerProvider implements Extension
}
}
+ private BeanManager resolveBeanManagerViaStaticHelper()
+ {
+ if (CDI_CURRENT_METHOD != null && CDI_CURRENT_BEAN_MANAGER_METHOD != null)
+ {
+ try
+ {
+ Object cdiCurrentObject = CDI_CURRENT_METHOD.invoke(null);
+ return (BeanManager) CDI_CURRENT_BEAN_MANAGER_METHOD.invoke(cdiCurrentObject);
+ }
+ catch (Throwable t)
+ {
+ LOG.log(Level.FINEST, "failed to delegate bean-manager lookup -> fallback to default.", t);
+ }
+ }
+ return null;
+ }
+
/**
* Get or create the BeanManagerInfo for the given ClassLoader
*/