Author: mrdon Date: Fri Jun 20 06:48:18 2008 New Revision: 669895 URL: http://svn.apache.org/viewvc?rev=669895&view=rev Log: Ensuring that the mapper sets the namespace to / when available and no other namespace is found WW-2461
Modified: struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapper.java struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapperTest.java 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?rev=669895&r1=669894&r2=669895&view=diff ============================================================================== --- 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 Fri Jun 20 06:48:18 2008 @@ -400,18 +400,26 @@ Configuration config = configManager.getConfiguration(); String prefix = uri.substring(0, lastSlash); namespace = ""; + boolean rootAvailable = false; // Find the longest matching namespace, defaulting to the default - for (Iterator i = config.getPackageConfigs().values().iterator(); i - .hasNext();) { - String ns = ((PackageConfig) i.next()).getNamespace(); + for (Object cfg : config.getPackageConfigs().values()) { + String ns = ((PackageConfig) cfg).getNamespace(); if (ns != null && prefix.startsWith(ns) && (prefix.length() == ns.length() || prefix.charAt(ns.length()) == '/')) { if (ns.length() > namespace.length()) { namespace = ns; } } + if ("/".equals(ns)) { + rootAvailable = true; + } } name = uri.substring(namespace.length() + 1); + + // Still none found, use root namespace if found + if (rootAvailable && "".equals(namespace)) { + namespace = "/"; + } } if (!allowSlashesInActionNames && name != null) { Modified: struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapperTest.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapperTest.java?rev=669895&r1=669894&r2=669895&view=diff ============================================================================== --- struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapperTest.java (original) +++ struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapperTest.java Fri Jun 20 06:48:18 2008 @@ -116,7 +116,7 @@ assertNull(mapping.getMethod()); } - public void testGetMappingWithSlashedNameAtRoot() throws Exception { + public void testGetMappingWithSlashedNameAtRootButNoSlashPackage() throws Exception { req.setupGetRequestURI("/foo/actionName.action"); req.setupGetServletPath("/foo/actionName.action"); @@ -132,6 +132,37 @@ assertNull(mapping.getMethod()); } + public void testGetMappingWithSlashedNameAtRoot() throws Exception { + config = new DefaultConfiguration(); + PackageConfig pkg = new PackageConfig.Builder("myns") + .namespace("/my/namespace").build(); + PackageConfig pkg2 = new PackageConfig.Builder("my").namespace("/my").build(); + PackageConfig pkg3 = new PackageConfig.Builder("root").namespace("/").build(); + config.addPackageConfig("mvns", pkg); + config.addPackageConfig("my", pkg2); + config.addPackageConfig("root", pkg3); + configManager = new ConfigurationManager() { + public Configuration getConfiguration() { + return config; + } + }; + + req.setupGetRequestURI("/foo/actionName.action"); + req.setupGetServletPath("/foo/actionName.action"); + req.setupGetAttribute(null); + req.addExpectedGetAttributeName("javax.servlet.include.servlet_path"); + + DefaultActionMapper mapper = new DefaultActionMapper(); + mapper.setSlashesInActionNames("true"); + ActionMapping mapping = mapper.getMapping(req, configManager); + + assertEquals("/", mapping.getNamespace()); + assertEquals("foo/actionName", mapping.getName()); + assertNull(mapping.getMethod()); + } + + + public void testGetMappingWithNamespaceSlash() throws Exception { req.setupGetRequestURI("/my.hh/abc.action");