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