Author: mrdon
Date: Sat Jun 18 17:27:26 2005
New Revision: 191314

URL: http://svn.apache.org/viewcvs?rev=191314&view=rev
Log:
 * Added a command that sets the original URI (servletPath) of the
   request.  This allows code to retrieve the URI that started the 
   request despite what forwards may have occurred.  This could have
   also been done as added code to the SelectModule command, but I
   wasn't sure how "pure" we wanted commands to be.
 * Changed the "action" attribute of the Form taglib to be optional.  If
   omitted, the original URI of the request will be used.
  
PR: 6686  

Added:
    
struts/core/trunk/src/share/org/apache/struts/chain/commands/AbstractSetOriginalURI.java
    
struts/core/trunk/src/share/org/apache/struts/chain/commands/servlet/SetOriginalURI.java
    
struts/core/trunk/src/test/org/apache/struts/chain/commands/servlet/TestSetOriginalURI.java
Modified:
    struts/core/trunk/conf/share/chain-config.xml
    struts/core/trunk/src/share/org/apache/struts/Globals.java
    struts/taglib/trunk/doc/userGuide/struts-html.xml
    struts/taglib/trunk/src/java/org/apache/struts/taglib/html/FormTag.java

Modified: struts/core/trunk/conf/share/chain-config.xml
URL: 
http://svn.apache.org/viewcvs/struts/core/trunk/conf/share/chain-config.xml?rev=191314&r1=191313&r2=191314&view=diff
==============================================================================
--- struts/core/trunk/conf/share/chain-config.xml (original)
+++ struts/core/trunk/conf/share/chain-config.xml Sat Jun 18 17:27:26 2005
@@ -117,6 +117,11 @@
       <!-- Identify the Locale for this request -->
       <command
           className="org.apache.struts.chain.commands.servlet.SelectLocale"/>
+ 
+
+      <!-- Set (if needed) the URI of the original request -->
+      <command
+          className="org.apache.struts.chain.commands.servlet.SetOriginalURI"/>
           
           
       <!-- Set (if needed) no cache HTTP response headers -->

Modified: struts/core/trunk/src/share/org/apache/struts/Globals.java
URL: 
http://svn.apache.org/viewcvs/struts/core/trunk/src/share/org/apache/struts/Globals.java?rev=191314&r1=191313&r2=191314&view=diff
==============================================================================
--- struts/core/trunk/src/share/org/apache/struts/Globals.java (original)
+++ struts/core/trunk/src/share/org/apache/struts/Globals.java Sat Jun 18 
17:27:26 2005
@@ -73,6 +73,14 @@
     public static final String MODULE_PREFIXES_KEY =
         "org.apache.struts.globals.MODULE_PREFIXES";
 
+   /**
+     * The request attribute under which we store the original URI of the 
+     * request.
+     * @since Struts 1.3
+     */
+    public static final String ORIGINAL_URI_KEY =
+        "org.apache.struts.globals.ORIGINAL_URI_KEY";
+
     /**
      * The request attributes key under which your action should store an
      * <code>org.apache.struts.action.ActionErrors</code> object, if you

Added: 
struts/core/trunk/src/share/org/apache/struts/chain/commands/AbstractSetOriginalURI.java
URL: 
http://svn.apache.org/viewcvs/struts/core/trunk/src/share/org/apache/struts/chain/commands/AbstractSetOriginalURI.java?rev=191314&view=auto
==============================================================================
--- 
struts/core/trunk/src/share/org/apache/struts/chain/commands/AbstractSetOriginalURI.java
 (added)
+++ 
struts/core/trunk/src/share/org/apache/struts/chain/commands/AbstractSetOriginalURI.java
 Sat Jun 18 17:27:26 2005
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2003,2004 The Apache Software Foundation.
+ *
+ * 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.apache.struts.chain.commands;
+
+
+import org.apache.struts.Globals;
+import org.apache.struts.chain.contexts.ActionContext;
+import org.apache.struts.config.ModuleConfig;
+
+
+/**
+ * <p>Check to original uri is set, and if not, set it for this
+ * request.</p>
+ *
+ * @version $Rev: 179995 $ $Date: 2005-06-04 07:58:46 -0700 (Sat, 04 Jun 2005) 
$
+ */
+
+public abstract class AbstractSetOriginalURI extends ActionCommandBase {
+
+
+    // ---------------------------------------------------------- Public 
Methods
+
+
+    /**
+     * <p>Check to original uri is set, and if not, set it for this
+     * request.</p>
+     *
+     * @param actionCtx The <code>Context</code> for the current request
+     *
+     * @return <code>false</code> so that processing continues
+     */
+    public boolean execute(ActionContext actionCtx) throws Exception {
+        // Set the original uri if not already set
+        if 
(!actionCtx.getRequestScope().containsKey(Globals.ORIGINAL_URI_KEY)) {
+            setOriginalURI(actionCtx);
+        }    
+        return (false);
+
+    }
+
+
+    // ------------------------------------------------------- Protected 
Methods
+
+
+    /**
+     * <p>Set the original uri.</p>
+     *
+     * @param context The <code>Context</code> for this request
+     */
+    protected abstract void setOriginalURI(ActionContext context);
+
+
+}

Added: 
struts/core/trunk/src/share/org/apache/struts/chain/commands/servlet/SetOriginalURI.java
URL: 
http://svn.apache.org/viewcvs/struts/core/trunk/src/share/org/apache/struts/chain/commands/servlet/SetOriginalURI.java?rev=191314&view=auto
==============================================================================
--- 
struts/core/trunk/src/share/org/apache/struts/chain/commands/servlet/SetOriginalURI.java
 (added)
+++ 
struts/core/trunk/src/share/org/apache/struts/chain/commands/servlet/SetOriginalURI.java
 Sat Jun 18 17:27:26 2005
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2003,2004 The Apache Software Foundation.
+ *
+ * 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.apache.struts.chain.commands.servlet;
+
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.struts.Globals;
+import org.apache.struts.chain.commands.AbstractSetOriginalURI;
+import org.apache.struts.chain.contexts.ActionContext;
+import org.apache.struts.chain.contexts.ServletActionContext;
+
+
+/**
+ * <p>Set the servlet path.</p>
+ *
+ * @version $Rev: 179995 $ $Date: 2005-06-04 07:58:46 -0700 (Sat, 04 Jun 2005) 
$
+ */
+
+public class SetOriginalURI extends AbstractSetOriginalURI {
+
+
+    // ------------------------------------------------------- Protected 
Methods
+
+
+    protected void setOriginalURI(ActionContext context) {
+
+        ServletActionContext swcontext = (ServletActionContext) context;
+        HttpServletRequest request = swcontext.getRequest();
+
+        request.setAttribute(Globals.ORIGINAL_URI_KEY, 
request.getServletPath());
+
+    }
+
+
+}

Added: 
struts/core/trunk/src/test/org/apache/struts/chain/commands/servlet/TestSetOriginalURI.java
URL: 
http://svn.apache.org/viewcvs/struts/core/trunk/src/test/org/apache/struts/chain/commands/servlet/TestSetOriginalURI.java?rev=191314&view=auto
==============================================================================
--- 
struts/core/trunk/src/test/org/apache/struts/chain/commands/servlet/TestSetOriginalURI.java
 (added)
+++ 
struts/core/trunk/src/test/org/apache/struts/chain/commands/servlet/TestSetOriginalURI.java
 Sat Jun 18 17:27:26 2005
@@ -0,0 +1,63 @@
+package org.apache.struts.chain.commands.servlet;
+
+import junit.framework.TestCase;
+
+import org.apache.commons.chain.web.servlet.ServletWebContext;
+import org.apache.struts.Globals;
+import org.apache.struts.chain.commands.UnauthorizedActionException;
+import org.apache.struts.chain.contexts.ServletActionContext;
+import org.apache.struts.config.ActionConfig;
+import org.apache.struts.mock.MockActionServlet;
+import org.apache.struts.mock.MockHttpServletRequest;
+import org.apache.struts.mock.MockHttpServletResponse;
+import org.apache.struts.mock.MockPrincipal;
+import org.apache.struts.mock.MockServletConfig;
+import org.apache.struts.mock.MockServletContext;
+
+/* JUnitTest case for class: 
org.apache.struts.chain.commands.servlet.SetOriginalURI */
+public class TestSetOriginalURI extends TestCase {
+
+    SetOriginalURI command = null;
+
+    public TestSetOriginalURI(String _name) {
+        super(_name);
+    }
+
+
+    /* setUp method for test case */
+    protected void setUp() throws Exception {
+       this.command = new SetOriginalURI();
+    }
+
+    /* tearDown method for test case */
+    protected void tearDown() {
+    }
+
+    public void testSetOriginalURI() throws Exception {
+        MockHttpServletRequest request = new MockHttpServletRequest("foo/", 
"bar.do", null, null);
+        MockServletConfig servletConfig = new MockServletConfig();
+        MockServletContext servletContext = new MockServletContext();
+        MockActionServlet servlet = new MockActionServlet(servletContext, 
servletConfig);
+        servlet.initInternal();
+        ServletActionContext saContext = new 
ServletActionContext(servletContext, request, new MockHttpServletResponse());
+        saContext.setActionServlet(servlet);
+
+        
+        boolean result = command.execute(saContext);
+        assertTrue(!result);
+        String uri = (String)request.getAttribute(Globals.ORIGINAL_URI_KEY);
+        assertTrue("Original uri not correct: "+uri, "bar.do".equals(uri));
+        
+        
+        request.setPathElements("foo/", "bar2.do", null, null);
+        uri = (String)request.getAttribute(Globals.ORIGINAL_URI_KEY);
+        assertTrue("Original uri not correct: "+uri, "bar.do".equals(uri));
+
+    }
+
+    /* Executes the test case */
+    public static void main(String[] argv) {
+        String[] testCaseList = {TestSetOriginalURI.class.getName()};
+        junit.textui.TestRunner.main(testCaseList);
+    }
+}

Modified: struts/taglib/trunk/doc/userGuide/struts-html.xml
URL: 
http://svn.apache.org/viewcvs/struts/taglib/trunk/doc/userGuide/struts-html.xml?rev=191314&r1=191313&r2=191314&view=diff
==============================================================================
--- struts/taglib/trunk/doc/userGuide/struts-html.xml (original)
+++ struts/taglib/trunk/doc/userGuide/struts-html.xml Sat Jun 18 17:27:26 2005
@@ -1625,13 +1625,15 @@
 
         <attribute>
             <name>action</name>
-            <required>true</required>
+            <required>false</required>
             <rtexprvalue>true</rtexprvalue>
             <info>
                         <p>The URL to which this form will be submitted.  This
                         value is also used to select the ActionMapping we are
                         assumed to be processing, from which we can identify
-                        the appropriate form bean and scope.</p>
+                        the appropriate form bean and scope.  If a value is not
+                        provided, the original URI (servletPath) for the 
request is 
+                        used. </p>
 
                         <p>If you are using extension mapping for selecting the
                         controller servlet, this value should be equal to the

Modified: 
struts/taglib/trunk/src/java/org/apache/struts/taglib/html/FormTag.java
URL: 
http://svn.apache.org/viewcvs/struts/taglib/trunk/src/java/org/apache/struts/taglib/html/FormTag.java?rev=191314&r1=191313&r2=191314&view=diff
==============================================================================
--- struts/taglib/trunk/src/java/org/apache/struts/taglib/html/FormTag.java 
(original)
+++ struts/taglib/trunk/src/java/org/apache/struts/taglib/html/FormTag.java Sat 
Jun 18 17:27:26 2005
@@ -747,6 +747,15 @@
      * @exception JspException if a required value cannot be looked up
      */
     protected void lookup() throws JspException {
+        
+        // If the action is not specified, use the original request uri
+        if (this.action == null) {
+            HttpServletRequest request = 
+                    (HttpServletRequest) pageContext.getRequest();
+            String uri = 
(String)request.getAttribute(Globals.ORIGINAL_URI_KEY);
+            setAction(uri);
+            
+        }    
 
         // Look up the module configuration information we need
         moduleConfig = TagUtils.getInstance().getModuleConfig(pageContext);



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to