Author: mrdon Date: Sat Oct 27 07:28:10 2007 New Revision: 589114 URL: http://svn.apache.org/viewvc?rev=589114&view=rev Log: Adding support for Rails 2-stye 'animals/dog/edit'-style mappings where the last bit is interpreted as a method name
Modified: struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/RestActionMapper.java struts/sandbox/trunk/struts2-rest-plugin/src/test/java/org/apache/struts2/rest/RestActionMapperTest.java Modified: struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/RestActionMapper.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/RestActionMapper.java?rev=589114&r1=589113&r2=589114&view=diff ============================================================================== --- struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/RestActionMapper.java (original) +++ struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/RestActionMapper.java Sat Oct 27 07:28:10 2007 @@ -20,21 +20,19 @@ */ package org.apache.struts2.rest; -import java.util.HashMap; -import java.util.Iterator; - -import javax.servlet.http.HttpServletRequest; - -import org.apache.struts2.StrutsConstants; -import org.apache.struts2.dispatcher.mapper.ActionMapping; -import org.apache.struts2.dispatcher.mapper.DefaultActionMapper; - import com.opensymphony.xwork2.config.Configuration; import com.opensymphony.xwork2.config.ConfigurationManager; import com.opensymphony.xwork2.config.entities.PackageConfig; import com.opensymphony.xwork2.inject.Inject; import com.opensymphony.xwork2.util.logging.Logger; import com.opensymphony.xwork2.util.logging.LoggerFactory; +import org.apache.struts2.StrutsConstants; +import org.apache.struts2.dispatcher.mapper.ActionMapping; +import org.apache.struts2.dispatcher.mapper.DefaultActionMapper; + +import javax.servlet.http.HttpServletRequest; +import java.util.HashMap; +import java.util.Iterator; /** * <!-- START SNIPPET: description --> @@ -186,8 +184,18 @@ int lastSlashPos = fullName.lastIndexOf('/'); String id = null; if (lastSlashPos > -1) { + + // fun trickery to parse 'actionName/id/methodName' in the case of 'animals/dog/edit' + int prevSlashPos = fullName.lastIndexOf('/', lastSlashPos - 1); + if (prevSlashPos > -1) { + mapping.setMethod(fullName.substring(lastSlashPos+1)); + fullName = fullName.substring(0, lastSlashPos); + lastSlashPos = prevSlashPos; + } id = fullName.substring(lastSlashPos+1); } + + // If a method hasn't been explicitly named, try to guess using ReST-style patterns if (mapping.getMethod() == null) { Modified: struts/sandbox/trunk/struts2-rest-plugin/src/test/java/org/apache/struts2/rest/RestActionMapperTest.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-rest-plugin/src/test/java/org/apache/struts2/rest/RestActionMapperTest.java?rev=589114&r1=589113&r2=589114&view=diff ============================================================================== --- struts/sandbox/trunk/struts2-rest-plugin/src/test/java/org/apache/struts2/rest/RestActionMapperTest.java (original) +++ struts/sandbox/trunk/struts2-rest-plugin/src/test/java/org/apache/struts2/rest/RestActionMapperTest.java Sat Oct 27 07:28:10 2007 @@ -1,28 +1,30 @@ package org.apache.struts2.rest; -import java.util.HashMap; - -import org.apache.struts2.dispatcher.mapper.ActionMapping; - import com.opensymphony.xwork2.config.Configuration; import com.opensymphony.xwork2.config.ConfigurationManager; import com.opensymphony.xwork2.config.entities.PackageConfig; import com.opensymphony.xwork2.config.impl.DefaultConfiguration; - import junit.framework.TestCase; +import org.apache.struts2.dispatcher.mapper.ActionMapping; +import org.springframework.mock.web.MockHttpServletRequest; public class RestActionMapperTest extends TestCase { private RestActionMapper mapper; private ConfigurationManager configManager; private Configuration config; + private MockHttpServletRequest req; protected void setUp() throws Exception { super.setUp(); + req = new MockHttpServletRequest(); + req.setContextPath("/myapp"); + req.setMethod("GET"); + mapper = new RestActionMapper(); config = new DefaultConfiguration(); - PackageConfig pkg = new PackageConfig("myns", "/my/namespace", false, null); + PackageConfig pkg = new PackageConfig("myns", "/animals", false, null); PackageConfig pkg2 = new PackageConfig("my", "/my", false, null); config.addPackageConfig("mvns", pkg); config.addPackageConfig("my", pkg2); @@ -31,6 +33,93 @@ return config; } }; + } + + public void testGetMapping() throws Exception { + req.setRequestURI("/myapp/animals/dog"); + req.setServletPath("/animals/dog"); + + ActionMapping mapping = mapper.getMapping(req, configManager); + + assertEquals("/animals", mapping.getNamespace()); + assertEquals("dog", mapping.getName()); + assertEquals("index", mapping.getMethod()); + } + + public void testPostMapping() throws Exception { + req.setRequestURI("/myapp/animals/dog"); + req.setServletPath("/animals/dog"); + req.setMethod("POST"); + + ActionMapping mapping = mapper.getMapping(req, configManager); + + assertEquals("/animals", mapping.getNamespace()); + assertEquals("dog", mapping.getName()); + assertEquals("create", mapping.getMethod()); + } + + public void testDeleteMapping() throws Exception { + req.setRequestURI("/myapp/animals/dog/fido"); + req.setServletPath("/animals/dog/fido"); + req.setMethod("DELETE"); + + ActionMapping mapping = mapper.getMapping(req, configManager); + + assertEquals("/animals", mapping.getNamespace()); + assertEquals("dog", mapping.getName()); + assertEquals("destroy", mapping.getMethod()); + assertEquals("fido", ((String[])mapping.getParams().get("id"))[0]); + } + + public void testPutMapping() throws Exception { + req.setRequestURI("/myapp/animals/dog/fido"); + req.setServletPath("/animals/dog/fido"); + req.setMethod("PUT"); + + ActionMapping mapping = mapper.getMapping(req, configManager); + + assertEquals("/animals", mapping.getNamespace()); + assertEquals("dog", mapping.getName()); + assertEquals("update", mapping.getMethod()); + assertEquals("fido", ((String[])mapping.getParams().get("id"))[0]); + } + + public void testGetIdMapping() throws Exception { + req.setRequestURI("/myapp/animals/dog/fido"); + req.setServletPath("/animals/dog/fido"); + req.setMethod("GET"); + + ActionMapping mapping = mapper.getMapping(req, configManager); + + assertEquals("/animals", mapping.getNamespace()); + assertEquals("dog", mapping.getName()); + assertEquals("show", mapping.getMethod()); + assertEquals("fido", ((String[])mapping.getParams().get("id"))[0]); + } + + public void testNewMapping() throws Exception { + req.setRequestURI("/myapp/animals/dog/new"); + req.setServletPath("/animals/dog/new"); + req.setMethod("GET"); + + ActionMapping mapping = mapper.getMapping(req, configManager); + + assertEquals("/animals", mapping.getNamespace()); + assertEquals("dog", mapping.getName()); + assertEquals("editNew", mapping.getMethod()); + } + + public void testEditMapping() throws Exception { + req.setRequestURI("/myapp/animals/dog/fido/edit"); + req.setServletPath("/animals/dog/fido/edit"); + req.setMethod("GET"); + + ActionMapping mapping = mapper.getMapping(req, configManager); + + assertEquals("/animals", mapping.getNamespace()); + assertEquals("dog", mapping.getName()); + assertEquals("fido", ((String[])mapping.getParams().get("id"))[0]); + assertEquals("edit", mapping.getMethod()); } public void testParseNameAndNamespace() {