Author: mrdon
Date: Mon May 21 06:49:26 2007
New Revision: 540143

URL: http://svn.apache.org/viewvc?view=rev&rev=540143
Log:
Porting improvement for restful 2 to allow id parameters
WW-1939

Modified:
    
struts/struts2/trunk/core/src/main/java/org/apache/struts2/StrutsConstants.java
    
struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapper.java
    
struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/mapper/Restful2ActionMapper.java
    
struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/mapper/Restful2ActionMapperTest.java

Modified: 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/StrutsConstants.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/StrutsConstants.java?view=diff&rev=540143&r1=540142&r2=540143
==============================================================================
--- 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/StrutsConstants.java 
(original)
+++ 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/StrutsConstants.java 
Mon May 21 06:49:26 2007
@@ -151,4 +151,7 @@
     /** XWork default text provider */
     public static final String STRUTS_XWORKTEXTPROVIDER = 
"struts.xworkTextProvider";
 
+    /** The name of the parameter to create when mapping an id (used by some 
action mappers) */
+       public static final String STRUTS_ID_PARAMETER_NAME = 
"struts.mapper.idParameterName";
+
 }

Modified: 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapper.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapper.java?view=diff&rev=540143&r1=540142&r2=540143
==============================================================================
--- 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapper.java
 (original)
+++ 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapper.java
 Mon May 21 06:49:26 2007
@@ -485,11 +485,17 @@
 
         return uri.toString();
     }
+    
 
-    /**
+       public boolean isSlashesInActionNames() {
+               return allowSlashesInActionNames;
+       }
+       
+       /**
      * Defines a parameter action prefix
      */
     interface ParameterAction {
         void execute(String key, ActionMapping mapping);
     }
+
 }

Modified: 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/mapper/Restful2ActionMapper.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/mapper/Restful2ActionMapper.java?view=diff&rev=540143&r1=540142&r2=540143
==============================================================================
--- 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/mapper/Restful2ActionMapper.java
 (original)
+++ 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/mapper/Restful2ActionMapper.java
 Mon May 21 06:49:26 2007
@@ -21,6 +21,7 @@
 package org.apache.struts2.dispatcher.mapper;
 
 import com.opensymphony.xwork2.config.ConfigurationManager;
+import com.opensymphony.xwork2.inject.Inject;
 
 import javax.servlet.http.HttpServletRequest;
 import java.util.HashMap;
@@ -29,6 +30,7 @@
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.struts2.StrutsConstants;
 
 /**
  * <!-- START SNIPPET: description -->
@@ -84,6 +86,12 @@
 
     protected static final Log LOG = 
LogFactory.getLog(Restful2ActionMapper.class);
     public static final String HTTP_METHOD_PARAM = "__http_method";
+    private String idParameterName = null;
+    
+    public Restful2ActionMapper() {
+       setSlashesInActionNames("true");
+    }
+    
 
     /*
     * (non-Javadoc)
@@ -92,6 +100,9 @@
     */
     public ActionMapping getMapping(HttpServletRequest request, 
ConfigurationManager configManager) {
 
+       if (!isSlashesInActionNames()) {
+               throw new IllegalStateException("This action mapper requires 
the setting 'slashesInActionNames' to be set to 'true'");
+       }
         ActionMapping mapping = super.getMapping(request, configManager);
         
         if (mapping == null) {
@@ -137,6 +148,17 @@
                     }  else if (isPut(request)) {
                         mapping.setMethod("update");
                     }
+                    
+                    if (idParameterName != null) {
+                       if (mapping.getParams() == null) {
+                            mapping.setParams(new HashMap());
+                        }
+                       mapping.getParams().put(idParameterName, id);
+                    }
+                }
+                
+                if (idParameterName != null && lastSlashPos > -1) {
+                       actionName = actionName.substring(0, lastSlashPos);
                 }
             }
 
@@ -204,5 +226,16 @@
             return isPost(request) && 
"delete".equalsIgnoreCase(request.getParameter(HTTP_METHOD_PARAM));
         }
     }
+
+       public String getIdParameterName() {
+               return idParameterName;
+       }
+
+       @Inject(StrutsConstants.STRUTS_ID_PARAMETER_NAME)
+       public void setIdParameterName(String idParameterName) {
+               this.idParameterName = idParameterName;
+       }
+    
+    
 
 }

Modified: 
struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/mapper/Restful2ActionMapperTest.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/mapper/Restful2ActionMapperTest.java?view=diff&rev=540143&r1=540142&r2=540143
==============================================================================
--- 
struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/mapper/Restful2ActionMapperTest.java
 (original)
+++ 
struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/mapper/Restful2ActionMapperTest.java
 Mon May 21 06:49:26 2007
@@ -106,7 +106,6 @@
  
     public void testPutUpdate() throws Exception {
 
-        mapper.setSlashesInActionNames("true");
         req.setupGetRequestURI("/my/namespace/bar/1/foo/2");
         req.setupGetServletPath("/my/namespace/bar/1/foo/2");
         req.setupGetAttribute(null);
@@ -121,10 +120,29 @@
         assertEquals(1, mapping.getParams().size());
         assertEquals("1", mapping.getParams().get("bar"));
     }
+    
+    public void testPutUpdateWithIdParam() throws Exception {
+
+        mapper.setIdParameterName("id");
+        req.setupGetRequestURI("/my/namespace/bar/1/foo/2");
+        req.setupGetServletPath("/my/namespace/bar/1/foo/2");
+        req.setupGetAttribute(null);
+        req.addExpectedGetAttributeName("javax.servlet.include.servlet_path");
+        req.setupGetMethod("PUT");
+
+        ActionMapping mapping = mapper.getMapping(req, configManager);
+
+        assertEquals("/my/namespace", mapping.getNamespace());
+        assertEquals("foo", mapping.getName());
+        assertEquals("update", mapping.getMethod());
+        assertEquals(2, mapping.getParams().size());
+        assertEquals("1", mapping.getParams().get("bar"));
+        assertEquals("2", mapping.getParams().get("id"));
+        
+    }
 
     public void testPutUpdateWithFakePut() throws Exception {
 
-        mapper.setSlashesInActionNames("true");
         req.setupGetRequestURI("/my/namespace/bar/1/foo/2");
         req.setupGetServletPath("/my/namespace/bar/1/foo/2");
         req.setupAddParameter(Restful2ActionMapper.HTTP_METHOD_PARAM, "put");
@@ -144,7 +162,6 @@
 
     public void testDeleteRemove() throws Exception {
 
-        mapper.setSlashesInActionNames("true");
         req.setupGetRequestURI("/my/namespace/bar/1/foo/2");
         req.setupGetServletPath("/my/namespace/bar/1/foo/2");
         req.setupGetAttribute(null);
@@ -162,7 +179,6 @@
 
     public void testDeleteRemoveWithFakeDelete() throws Exception {
 
-        mapper.setSlashesInActionNames("true");
         req.setupGetRequestURI("/my/namespace/bar/1/foo/2");
         req.setupGetServletPath("/my/namespace/bar/1/foo/2");
         req.setupAddParameter(Restful2ActionMapper.HTTP_METHOD_PARAM, 
"DELETE");


Reply via email to