Open Source Repository

Home /spring/spring-web-struts-3.0.5 | Repository Home



org/springframework/web/struts/DelegatingActionUtils.java
/*
 * Copyright 2002-2006 the original author or authors.
 *
 * Licensed 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.springframework.web.struts;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionServlet;
import org.apache.struts.config.ModuleConfig;

import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

/**
 * Common methods for letting Struts Actions work with a
 * Spring WebApplicationContext.
 *
 <p>As everything in Struts is based on concrete inheritance,
 * we have to provide an Action subclass (DelegatingActionProxy) and
 * two RequestProcessor subclasses (DelegatingRequestProcessor and
 * DelegatingTilesRequestProcessor). The only way to share common
 * functionality is a utility class like this one.
 *
 @author Juergen Hoeller
 @since 1.0.2
 @see DelegatingActionProxy
 @see DelegatingRequestProcessor
 @see DelegatingTilesRequestProcessor
 @deprecated as of Spring 3.0
 */
@Deprecated
public abstract class DelegatingActionUtils {

  /**
   * The name of the autowire init-param specified on the Struts ActionServlet:
   * "spring.autowire"
   */
  public static final String PARAM_AUTOWIRE = "spring.autowire";

  /**
   * The name of the dependency check init-param specified on the Struts ActionServlet:
   * "spring.dependencyCheck"
   */
  public static final String PARAM_DEPENDENCY_CHECK = "spring.dependencyCheck";

  /**
   * Value of the autowire init-param that indicates autowiring by name:
   * "byName"
   */
  public static final String AUTOWIRE_BY_NAME = "byName";

  /**
   * Value of the autowire init-param that indicates autowiring by type:
   * "byType"
   */
  public static final String AUTOWIRE_BY_TYPE = "byType";


  private static final Log logger = LogFactory.getLog(DelegatingActionUtils.class);


  /**
   * Fetch ContextLoaderPlugIn's WebApplicationContext from the ServletContext.
   <p>Checks for a module-specific context first, falling back to the
   * context for the default module else.
   @param actionServlet the associated ActionServlet
   @param moduleConfig the associated ModuleConfig (can be <code>null</code>)
   @return the WebApplicationContext, or <code>null</code> if none
   @see ContextLoaderPlugIn#SERVLET_CONTEXT_PREFIX
   */
  public static WebApplicationContext getWebApplicationContext(
      ActionServlet actionServlet, ModuleConfig moduleConfig) {

    WebApplicationContext wac = null;
    String modulePrefix = null;

    // Try module-specific attribute.
    if (moduleConfig != null) {
      modulePrefix = moduleConfig.getPrefix();
      wac = (WebApplicationContextactionServlet.getServletContext().getAttribute(
          ContextLoaderPlugIn.SERVLET_CONTEXT_PREFIX + modulePrefix);
    }

    // If not found, try attribute for default module.
    if (wac == null && !"".equals(modulePrefix)) {
      wac = (WebApplicationContextactionServlet.getServletContext().getAttribute(
          ContextLoaderPlugIn.SERVLET_CONTEXT_PREFIX);
    }

    return wac;
  }

  /**
   * Fetch ContextLoaderPlugIn's WebApplicationContext from the ServletContext.
   <p>Checks for a module-specific context first, falling back to the
   * context for the default module else.
   @param actionServlet the associated ActionServlet
   @param moduleConfig the associated ModuleConfig (can be <code>null</code>)
   @return the WebApplicationContext
   @throws IllegalStateException if no WebApplicationContext could be found
   @see ContextLoaderPlugIn#SERVLET_CONTEXT_PREFIX
   */
  public static WebApplicationContext getRequiredWebApplicationContext(
      ActionServlet actionServlet, ModuleConfig moduleConfigthrows IllegalStateException {

    WebApplicationContext wac = getWebApplicationContext(actionServlet, moduleConfig);
    // If no Struts-specific context found, throw an exception.
    if (wac == null) {
      throw new IllegalStateException(
          "Could not find ContextLoaderPlugIn's WebApplicationContext as ServletContext attribute [" +
          ContextLoaderPlugIn.SERVLET_CONTEXT_PREFIX + "]: Did you register [" +
          ContextLoaderPlugIn.class.getName() "]?");
    }
    return wac;
  }

  /**
   * Find most specific context available: check ContextLoaderPlugIn's
   * WebApplicationContext first, fall back to root WebApplicationContext else.
   <p>When checking the ContextLoaderPlugIn context: checks for a module-specific
   * context first, falling back to the context for the default module else.
   @param actionServlet the associated ActionServlet
   @param moduleConfig the associated ModuleConfig (can be <code>null</code>)
   @return the WebApplicationContext
   @throws IllegalStateException if no WebApplicationContext could be found
   @see #getWebApplicationContext
   @see org.springframework.web.context.support.WebApplicationContextUtils#getRequiredWebApplicationContext
   */
  public static WebApplicationContext findRequiredWebApplicationContext(
      ActionServlet actionServlet, ModuleConfig moduleConfigthrows IllegalStateException {

    WebApplicationContext wac = getWebApplicationContext(actionServlet, moduleConfig);
    // If no Struts-specific context found, fall back to root context.
    if (wac == null) {
      wac = WebApplicationContextUtils.getRequiredWebApplicationContext(actionServlet.getServletContext());
    }
    return wac;
  }

  /**
   * Default implementation of Action bean determination, taking
   * the mapping path and prepending the module prefix, if any.
   @param mapping the Struts ActionMapping
   @return the name of the Action bean
   @see org.apache.struts.action.ActionMapping#getPath
   @see org.apache.struts.config.ModuleConfig#getPrefix
   */
  public static String determineActionBeanName(ActionMapping mapping) {
    String prefix = mapping.getModuleConfig().getPrefix();
    String path = mapping.getPath();
    String beanName = prefix + path;
    if (logger.isDebugEnabled()) {
      logger.debug("DelegatingActionProxy with mapping path '" + path + "' and module prefix '" +
          prefix + "' delegating to Spring bean with name [" + beanName + "]");
    }
    return beanName;
  }

  /**
   * Determine the autowire mode from the "autowire" init-param of the
   * Struts ActionServlet, falling back to "AUTOWIRE_BY_TYPE" as default.
   @param actionServlet the Struts ActionServlet
   @return the autowire mode to use
   @see #PARAM_AUTOWIRE
   @see #AUTOWIRE_BY_NAME
   @see #AUTOWIRE_BY_TYPE
   @see org.springframework.beans.factory.config.AutowireCapableBeanFactory#autowireBeanProperties
   @see org.springframework.beans.factory.config.AutowireCapableBeanFactory#AUTOWIRE_BY_TYPE
   @see org.springframework.beans.factory.config.AutowireCapableBeanFactory#AUTOWIRE_BY_NAME
   */
  public static int getAutowireMode(ActionServlet actionServlet) {
    String autowire = actionServlet.getInitParameter(PARAM_AUTOWIRE);
    if (autowire != null) {
      if (AUTOWIRE_BY_NAME.equals(autowire)) {
        return AutowireCapableBeanFactory.AUTOWIRE_BY_NAME;
      }
      else if (!AUTOWIRE_BY_TYPE.equals(autowire)) {
        throw new IllegalArgumentException("ActionServlet 'autowire' parameter must be 'byName' or 'byType'");
      }
    }
    return AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE;
  }

  /**
   * Determine the dependency check to use from the "dependencyCheck" init-param
   * of the Struts ActionServlet, falling back to no dependency check as default.
   @param actionServlet the Struts ActionServlet
   @return whether to enforce a dependency check or not
   @see #PARAM_DEPENDENCY_CHECK
   @see org.springframework.beans.factory.config.AutowireCapableBeanFactory#autowireBeanProperties
   */
  public static boolean getDependencyCheck(ActionServlet actionServlet) {
    String dependencyCheck = actionServlet.getInitParameter(PARAM_DEPENDENCY_CHECK);
    return Boolean.valueOf(dependencyCheck).booleanValue();
  }

}