Author: germuska Date: Thu May 25 12:42:49 2006 New Revision: 409443 URL: http://svn.apache.org/viewvc?rev=409443&view=rev Log: Fix so that the module value of the ForwardConfig is correctly used, instead of always using the context's module config.
Also, a lot of simple rearrangement of code to improve readability. Modified: struts/action/trunk/core/src/main/java/org/apache/struts/chain/commands/servlet/PerformForward.java Modified: struts/action/trunk/core/src/main/java/org/apache/struts/chain/commands/servlet/PerformForward.java URL: http://svn.apache.org/viewvc/struts/action/trunk/core/src/main/java/org/apache/struts/chain/commands/servlet/PerformForward.java?rev=409443&r1=409442&r2=409443&view=diff ============================================================================== --- struts/action/trunk/core/src/main/java/org/apache/struts/chain/commands/servlet/PerformForward.java (original) +++ struts/action/trunk/core/src/main/java/org/apache/struts/chain/commands/servlet/PerformForward.java Thu May 25 12:42:49 2006 @@ -15,6 +15,8 @@ */ package org.apache.struts.chain.commands.servlet; +import java.io.IOException; + import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.struts.action.ActionServlet; @@ -25,8 +27,11 @@ import org.apache.struts.config.ModuleConfig; import org.apache.struts.util.MessageResources; import org.apache.struts.util.RequestUtils; +import org.apache.struts.util.ModuleUtils; import javax.servlet.RequestDispatcher; +import javax.servlet.ServletContext; +import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -51,76 +56,74 @@ protected void perform(ActionContext context, ForwardConfig forwardConfig) throws Exception { ServletActionContext sacontext = (ServletActionContext) context; - String forwardPath = forwardConfig.getPath(); - String uri; + String uri = forwardConfig.getPath();; - if (forwardPath == null) { - // Retrieve internal message resources + if (uri == null) { ActionServlet servlet = sacontext.getActionServlet(); MessageResources resources = servlet.getInternal(); - throw new IllegalArgumentException(resources.getMessage( - "forwardPathNull")); + throw new IllegalArgumentException(resources.getMessage("forwardPathNull")); } - ModuleConfig moduleConfig = context.getModuleConfig(); + HttpServletRequest request = sacontext.getRequest(); + ServletContext servletContext = sacontext.getContext(); + HttpServletResponse response = sacontext.getResponse(); + + if (uri.startsWith("/")) { + uri = resolveModuleRelativePath(forwardConfig, servletContext, request); + } - // Resolve module-relative paths - if (forwardPath.startsWith("/")) { - uri = RequestUtils.forwardURL(sacontext.getRequest(), - forwardConfig, moduleConfig); + + if (response.isCommitted() && !forwardConfig.getRedirect()) { + handleAsInclude(uri, servletContext, request, response); + } else if (forwardConfig.getRedirect()) { + handleAsRedirect(uri, request, response); } else { - uri = forwardPath; + handleAsForward(uri, servletContext, request, response); } + } - HttpServletRequest request = sacontext.getRequest(); + private String resolveModuleRelativePath(ForwardConfig forwardConfig, ServletContext servletContext, HttpServletRequest request) { + String prefix = forwardConfig.getModule(); + ModuleConfig moduleConfig = ModuleUtils.getInstance().getModuleConfig(prefix, request, servletContext); + return RequestUtils.forwardURL(request,forwardConfig, moduleConfig); + } - // Use of actions within tiles, jsp:include or c:import requires to - // convert forward (w/o redirect) to an include - // if response has been committed - HttpServletResponse response = sacontext.getResponse(); + private void handleAsForward(String uri, ServletContext servletContext, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + RequestDispatcher rd = servletContext.getRequestDispatcher(uri); - if (response.isCommitted() && !forwardConfig.getRedirect()) { - RequestDispatcher rd = - sacontext.getContext().getRequestDispatcher(uri); + if (LOG.isDebugEnabled()) { + LOG.debug("Forwarding to " + uri); + } - if (rd == null) { - response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, - "Error getting RequestDispatcher for " + uri); - - return; - } - - if (LOG.isDebugEnabled()) { - LOG.debug("Including " + uri); - } - - rd.include(request, response); + rd.forward(request, response); + } - return; + private void handleAsRedirect(String uri, HttpServletRequest request, HttpServletResponse response) throws IOException { + if (uri.startsWith("/")) { + uri = request.getContextPath() + uri; + } + + if (LOG.isDebugEnabled()) { + LOG.debug("Redirecting to " + uri); } - // Perform redirect or forward - if (forwardConfig.getRedirect()) { - if (uri.startsWith("/")) { - uri = request.getContextPath() + uri; - } - - if (LOG.isDebugEnabled()) { - LOG.debug("Redirecting to " + uri); - } + response.sendRedirect(response.encodeRedirectURL(uri)); + } - sacontext.getResponse().sendRedirect(sacontext.getResponse() - .encodeRedirectURL(uri)); - } else { - RequestDispatcher rd = - sacontext.getContext().getRequestDispatcher(uri); + private void handleAsInclude(String uri, ServletContext servletContext, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { + RequestDispatcher rd = servletContext.getRequestDispatcher(uri); - if (LOG.isDebugEnabled()) { - LOG.debug("Forwarding to " + uri); - } + if (rd == null) { + response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, + "Error getting RequestDispatcher for " + uri); + return; + } - rd.forward(request, sacontext.getResponse()); + if (LOG.isDebugEnabled()) { + LOG.debug("Including " + uri); } + + rd.include(request, response); } }