You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@struts.apache.org by rg...@apache.org on 2012/02/28 01:35:04 UTC

svn commit: r1294420 - /struts/struts2/trunk/plugins/cdi/src/main/java/org/apache/struts2/cdi/CdiObjectFactory.java

Author: rgielen
Date: Tue Feb 28 00:35:04 2012
New Revision: 1294420

URL: http://svn.apache.org/viewvc?rev=1294420&view=rev
Log:
WW-3767:
- added support for servlet container JNDI lookup key java:comp/env/BeanManager
- added support for custom configuration constant to override standard lookup

Modified:
    struts/struts2/trunk/plugins/cdi/src/main/java/org/apache/struts2/cdi/CdiObjectFactory.java

Modified: struts/struts2/trunk/plugins/cdi/src/main/java/org/apache/struts2/cdi/CdiObjectFactory.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/cdi/src/main/java/org/apache/struts2/cdi/CdiObjectFactory.java?rev=1294420&r1=1294419&r2=1294420&view=diff
==============================================================================
--- struts/struts2/trunk/plugins/cdi/src/main/java/org/apache/struts2/cdi/CdiObjectFactory.java (original)
+++ struts/struts2/trunk/plugins/cdi/src/main/java/org/apache/struts2/cdi/CdiObjectFactory.java Tue Feb 28 00:35:04 2012
@@ -20,6 +20,7 @@
 package org.apache.struts2.cdi;
 
 import com.opensymphony.xwork2.ObjectFactory;
+import com.opensymphony.xwork2.inject.Inject;
 import com.opensymphony.xwork2.util.logging.Logger;
 import com.opensymphony.xwork2.util.logging.LoggerFactory;
 
@@ -35,6 +36,13 @@ import java.util.concurrent.ConcurrentHa
 /**
  * CdiObjectFactory allows Struts 2 managed objects, like Actions, Interceptors or Results, to be injected by a Contexts
  * and Dependency Injection container (JSR299 / WebBeans).
+ * The BeanManager instance will be searched in the container's JNDI context, according to following algorithm:
+ * <ul>
+ *     <li>if a value for configuration constant <code>struts.objectFactory.cdi.jndiKey</code> is given, this key will be looked up</li>
+ *     <li>if no BeanManager found so far, look under {@link #CDI_JNDIKEY_BEANMANAGER_COMP}</li>
+ *     <li>if no BeanManager found so far, look under {@link #CDI_JNDIKEY_BEANMANAGER_APP}</li>
+ *     <li>if no BeanManager found so far, look under {@link #CDI_JNDIKEY_BEANMANAGER_COMP_ENV}</li>
+ * </ul>
  */
 public class CdiObjectFactory extends ObjectFactory {
 
@@ -48,8 +56,20 @@ public class CdiObjectFactory extends Ob
      * The key under which the BeanManager can be found according to JBoss Weld docs
      */
     public static final String CDI_JNDIKEY_BEANMANAGER_APP = "java:app/BeanManager";
+	/**
+	 * The key under which the BeanManager can be found in pure Servlet containers according to JBoss Weld docs.
+	 */
+	public static final String CDI_JNDIKEY_BEANMANAGER_COMP_ENV = "java:comp/env/BeanManager";
 
-    protected BeanManager beanManager;
+
+	private String jndiKey;
+
+	@Inject(value = "struts.objectFactory.cdi.jndiKey", required = false)
+	public void setJndiKey( String jndiKey ) {
+		this.jndiKey = jndiKey;
+	}
+
+	protected BeanManager beanManager;
     protected CreationalContext ctx;
 
     Map<Class<?>, InjectionTarget<?>> injectionTargetCache = new ConcurrentHashMap<Class<?>, InjectionTarget<?>>();
@@ -66,33 +86,72 @@ public class CdiObjectFactory extends Ob
         }
     }
 
-    /**
-     * Try to find the CDI BeanManager from JNDI context. First the key {@link #CDI_JNDIKEY_BEANMANAGER_COMP} will be
-     * tested. If nothing is found there, the key {@link #CDI_JNDIKEY_BEANMANAGER_APP} will be checked.
-     *
-     * @return the BeanManager, if found. <tt>null</tt> otherwise.
-     */
-    protected BeanManager findBeanManager() {
-        BeanManager bm;
-        try {
-            Context initialContext = new InitialContext();
-            LOG.info("[findBeanManager]: Checking for BeanManager under JNDI key " + CDI_JNDIKEY_BEANMANAGER_COMP);
-            try {
-                bm = (BeanManager) initialContext.lookup(CdiObjectFactory.CDI_JNDIKEY_BEANMANAGER_COMP);
-            } catch (NamingException e) {
-                LOG.warn("[findBeanManager]: Lookup failed.", e);
-                LOG.info("[findBeanManager]: Checking for BeanManager under JNDI key " + CDI_JNDIKEY_BEANMANAGER_APP);
-                bm = (BeanManager) initialContext.lookup(CdiObjectFactory.CDI_JNDIKEY_BEANMANAGER_APP);
-            }
-            LOG.info("[findBeanManager]: BeanManager found.");
-            return bm;
-        } catch (NamingException e) {
-            LOG.error("Could not get BeanManager from JNDI context", e);
-        }
-        return null;
-    }
+	/**
+	 * Try to find the CDI BeanManager from JNDI context. First, if provided, the key given by
+	 * struts.objectFactory.cdi.jndiKey will be checked. Then, if nothing was found or no explicit configuration was
+	 * given, the key {@link #CDI_JNDIKEY_BEANMANAGER_COMP} will be tested. If nothing is found there, the key {@link
+	 * #CDI_JNDIKEY_BEANMANAGER_APP} will be checked. If still nothing is found there, the key {@link
+	 * #CDI_JNDIKEY_BEANMANAGER_COMP_ENV} will be checked.
+	 *
+	 * @return the BeanManager, if found. <tt>null</tt> otherwise.
+	 */
+	protected BeanManager findBeanManager() {
+		BeanManager bm = null;
+		try {
+			Context initialContext = new InitialContext();
+			if (jndiKey != null && jndiKey.trim().length() > 0) {
+				// Check explicit configuration first, if given
+				bm = lookup(initialContext, jndiKey);
+			}
+			if (bm == null) {
+				// Check CDI default
+				bm = lookup(initialContext, CDI_JNDIKEY_BEANMANAGER_COMP);
+			}
+			if (bm == null) {
+				// Check WELD default
+				bm = lookup(initialContext, CDI_JNDIKEY_BEANMANAGER_APP);
+			}
+			if (bm == null) {
+				// Check Tomcat / Jetty default
+				bm = lookup(initialContext, CDI_JNDIKEY_BEANMANAGER_COMP_ENV);
+			}
+			if (bm == null) {
+				if (LOG.isErrorEnabled()) {
+					LOG.error("[findBeanManager]: Could not find BeanManager instance for any given JNDI key, giving up");
+				}
+			}
+		} catch ( NamingException e ) {
+			if (LOG.isErrorEnabled()) {
+				LOG.error("[findBeanManager]: Unable to get InitialContext for BeanManager lookup", e);
+			}
+		}
+		return bm;
+	}
+
+	/**
+	 * Lookup the given JNDI key in the given context.
+	 *
+	 * @param context the context to use for lookup.
+	 * @param jndiKeyToCheck the key to lookup.
+	 *
+	 * @return the BeanManager, if found; <tt>null</tt> if not found or {@link javax.naming.NamingException} was thrown.
+	 */
+	protected BeanManager lookup( Context context, String jndiKeyToCheck ) {
+		if (LOG.isInfoEnabled()) {
+			LOG.info("[lookup]: Checking for BeanManager under JNDI key " + jndiKeyToCheck);
+		}
+		BeanManager result = null;
+		try {
+			result = (BeanManager) context.lookup(jndiKeyToCheck);
+		} catch ( NamingException e ) {
+			if (LOG.isDebugEnabled()) {
+				LOG.debug("[lookup]: BeanManager lookup failed for JNDI key " + jndiKeyToCheck, e);
+			}
+		}
+		return result;
+	}
 
-    @Override
+	@Override
     @SuppressWarnings("unchecked")
     public Object buildBean(String className, Map<String, Object> extraContext, boolean injectInternal)
             throws Exception {