You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@struts.apache.org by ge...@apache.org on 2006/05/25 21:42:50 UTC

svn commit: r409443 - /struts/action/trunk/core/src/main/java/org/apache/struts/chain/commands/servlet/PerformForward.java

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