mirror of
https://github.com/apache/struts.git
synced 2026-08-11 09:36:57 +00:00
Adding support for selecting unknown namespaces for codebehind plugin
WW-1663 git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/trunk@498085 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
@@ -145,4 +145,6 @@ public final class StrutsConstants {
|
||||
|
||||
/** The name of the xwork converter implementation */
|
||||
public static final String STRUTS_XWORKCONVERTER = "struts.xworkConverter";
|
||||
|
||||
public static final String STRUTS_ALWAYS_SELECT_FULL_NAMESPACE = "struts.mapper.alwaysSelectFullNamespace";
|
||||
}
|
||||
|
||||
@@ -173,6 +173,8 @@ public class DefaultActionMapper implements ActionMapper {
|
||||
private boolean allowDynamicMethodCalls = true;
|
||||
|
||||
private boolean allowSlashesInActionNames = false;
|
||||
|
||||
private boolean alwaysSelectFullNamespace = false;
|
||||
|
||||
private PrefixTrie prefixTrie = null;
|
||||
|
||||
@@ -243,6 +245,11 @@ public class DefaultActionMapper implements ActionMapper {
|
||||
public void setSlashesInActionNames(String allow) {
|
||||
allowSlashesInActionNames = "true".equals(allow);
|
||||
}
|
||||
|
||||
@Inject(StrutsConstants.STRUTS_ALWAYS_SELECT_FULL_NAMESPACE)
|
||||
public void setAlwaysSelectFullNamespace(String val) {
|
||||
this.alwaysSelectFullNamespace = "true".equals(val);
|
||||
}
|
||||
|
||||
@Inject
|
||||
public void setContainer(Container container) {
|
||||
@@ -264,7 +271,7 @@ public class DefaultActionMapper implements ActionMapper {
|
||||
return null;
|
||||
}
|
||||
|
||||
parseNameAndNamespace(uri, mapping, configManager.getConfiguration());
|
||||
parseNameAndNamespace(uri, mapping, configManager);
|
||||
|
||||
handleSpecialParameters(request, mapping);
|
||||
|
||||
@@ -330,7 +337,7 @@ public class DefaultActionMapper implements ActionMapper {
|
||||
* The action mapping to populate
|
||||
*/
|
||||
void parseNameAndNamespace(String uri, ActionMapping mapping,
|
||||
Configuration config) {
|
||||
ConfigurationManager configManager) {
|
||||
String namespace, name;
|
||||
int lastSlash = uri.lastIndexOf("/");
|
||||
if (lastSlash == -1) {
|
||||
@@ -342,7 +349,13 @@ public class DefaultActionMapper implements ActionMapper {
|
||||
// namespace anyway if not found in root namespace.
|
||||
namespace = "/";
|
||||
name = uri.substring(lastSlash + 1);
|
||||
} else if (alwaysSelectFullNamespace) {
|
||||
// Simply select the namespace as everything before the last slash
|
||||
namespace = uri.substring(0, lastSlash);
|
||||
name = uri.substring(lastSlash + 1);
|
||||
} else {
|
||||
// Try to find the namespace in those defined, defaulting to ""
|
||||
Configuration config = configManager.getConfiguration();
|
||||
String prefix = uri.substring(0, lastSlash);
|
||||
namespace = "";
|
||||
// Find the longest matching namespace, defaulting to the default
|
||||
|
||||
@@ -161,4 +161,7 @@ struts.templateEngines=ftl,jsp,vm
|
||||
### A list of tag libraries available
|
||||
struts.tagLibraries=s
|
||||
|
||||
### Whether to always select the namespace to be everything before the last slash or not
|
||||
struts.mapper.alwaysSelectFullNamespace=false
|
||||
|
||||
### END SNIPPET: complete_file
|
||||
|
||||
+21
-5
@@ -154,6 +154,22 @@ public class DefaultActionMapperTest extends StrutsTestCase {
|
||||
assertEquals("actionName", mapping.getName());
|
||||
assertNull(mapping.getMethod());
|
||||
}
|
||||
|
||||
public void testGetMappingWithUnknownNamespaceButFullNamespaceSelect() throws Exception {
|
||||
setUp();
|
||||
req.setupGetRequestURI("/bo/foo/actionName.action");
|
||||
req.setupGetServletPath("/bo/foo/actionName.action");
|
||||
req.setupGetAttribute(null);
|
||||
req.addExpectedGetAttributeName("javax.servlet.include.servlet_path");
|
||||
|
||||
DefaultActionMapper mapper = new DefaultActionMapper();
|
||||
mapper.setAlwaysSelectFullNamespace("true");
|
||||
ActionMapping mapping = mapper.getMapping(req, configManager);
|
||||
|
||||
assertEquals("/bo/foo", mapping.getNamespace());
|
||||
assertEquals("actionName", mapping.getName());
|
||||
assertNull(mapping.getMethod());
|
||||
}
|
||||
|
||||
public void testGetUri() throws Exception {
|
||||
req.setupGetParameterMap(new HashMap());
|
||||
@@ -204,7 +220,7 @@ public class DefaultActionMapperTest extends StrutsTestCase {
|
||||
ActionMapping actionMapping = new ActionMapping();
|
||||
|
||||
DefaultActionMapper defaultActionMapper = new DefaultActionMapper();
|
||||
defaultActionMapper.parseNameAndNamespace("someAction", actionMapping, config);
|
||||
defaultActionMapper.parseNameAndNamespace("someAction", actionMapping, configManager);
|
||||
|
||||
assertEquals(actionMapping.getName(), "someAction");
|
||||
assertEquals(actionMapping.getNamespace(), "");
|
||||
@@ -214,7 +230,7 @@ public class DefaultActionMapperTest extends StrutsTestCase {
|
||||
ActionMapping actionMapping = new ActionMapping();
|
||||
|
||||
DefaultActionMapper defaultActionMapper = new DefaultActionMapper();
|
||||
defaultActionMapper.parseNameAndNamespace("/someAction", actionMapping, config);
|
||||
defaultActionMapper.parseNameAndNamespace("/someAction", actionMapping, configManager);
|
||||
|
||||
assertEquals(actionMapping.getName(), "someAction");
|
||||
assertEquals(actionMapping.getNamespace(), "/");
|
||||
@@ -224,7 +240,7 @@ public class DefaultActionMapperTest extends StrutsTestCase {
|
||||
ActionMapping actionMapping = new ActionMapping();
|
||||
|
||||
DefaultActionMapper defaultActionMapper = new DefaultActionMapper();
|
||||
defaultActionMapper.parseNameAndNamespace("/my/someAction", actionMapping, config);
|
||||
defaultActionMapper.parseNameAndNamespace("/my/someAction", actionMapping, configManager);
|
||||
|
||||
assertEquals(actionMapping.getName(), "someAction");
|
||||
assertEquals(actionMapping.getNamespace(), "/my");
|
||||
@@ -235,7 +251,7 @@ public class DefaultActionMapperTest extends StrutsTestCase {
|
||||
|
||||
DefaultActionMapper defaultActionMapper = new DefaultActionMapper();
|
||||
defaultActionMapper.setSlashesInActionNames("false");
|
||||
defaultActionMapper.parseNameAndNamespace("/foo/someAction", actionMapping, config);
|
||||
defaultActionMapper.parseNameAndNamespace("/foo/someAction", actionMapping, configManager);
|
||||
|
||||
assertEquals(actionMapping.getName(), "someAction");
|
||||
assertEquals(actionMapping.getNamespace(), "");
|
||||
@@ -246,7 +262,7 @@ public class DefaultActionMapperTest extends StrutsTestCase {
|
||||
|
||||
DefaultActionMapper defaultActionMapper = new DefaultActionMapper();
|
||||
defaultActionMapper.setSlashesInActionNames("true");
|
||||
defaultActionMapper.parseNameAndNamespace("/foo/someAction", actionMapping, config);
|
||||
defaultActionMapper.parseNameAndNamespace("/foo/someAction", actionMapping, configManager);
|
||||
|
||||
assertEquals(actionMapping.getName(), "foo/someAction");
|
||||
assertEquals(actionMapping.getNamespace(), "");
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
|
||||
<constant name="struts.codebehind.pathPrefix" value="/"/>
|
||||
<constant name="struts.codebehind.defaultPackage" value="codebehind-default"/>
|
||||
<constant name="struts.mapper.alwaysSelectFullNamespace" value="true" />
|
||||
|
||||
<package name="codebehind-default" extends="struts-default">
|
||||
</package>
|
||||
|
||||
Reference in New Issue
Block a user