Author: lukaszlenart Date: Tue Oct 15 18:20:43 2013 New Revision: 1532467 URL: http://svn.apache.org/r1532467 Log: Changes archetypes version to match latest release
Modified: struts/struts2/branches/STRUTS_2_3_15_X/core/src/main/java/org/apache/struts2/StrutsConstants.java struts/struts2/branches/STRUTS_2_3_15_X/core/src/main/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapper.java struts/struts2/branches/STRUTS_2_3_15_X/core/src/main/java/org/apache/struts2/dispatcher/mapper/ParameterAction.java struts/struts2/branches/STRUTS_2_3_15_X/core/src/main/resources/org/apache/struts2/default.properties struts/struts2/branches/STRUTS_2_3_15_X/core/src/test/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapperTest.java struts/struts2/branches/STRUTS_2_3_15_X/src/site/resources/archetype-catalog.xml Modified: struts/struts2/branches/STRUTS_2_3_15_X/core/src/main/java/org/apache/struts2/StrutsConstants.java URL: http://svn.apache.org/viewvc/struts/struts2/branches/STRUTS_2_3_15_X/core/src/main/java/org/apache/struts2/StrutsConstants.java?rev=1532467&r1=1532466&r2=1532467&view=diff ============================================================================== --- struts/struts2/branches/STRUTS_2_3_15_X/core/src/main/java/org/apache/struts2/StrutsConstants.java (original) +++ struts/struts2/branches/STRUTS_2_3_15_X/core/src/main/java/org/apache/struts2/StrutsConstants.java Tue Oct 15 18:20:43 2013 @@ -258,4 +258,10 @@ public final class StrutsConstants { /** actions names' whitelist **/ public static final String STRUTS_ALLOWED_ACTION_NAMES = "struts.allowed.action.names"; + /** enables action: prefix **/ + public static final String STRUTS_MAPPER_ACTION_PREFIX_ENABLED = "struts.mapper.action.prefix.enabled"; + + /** enables access to actions in other namespaces than current with action: prefix **/ + public static final String STRUTS_MAPPER_ACTION_PREFIX_CROSSNAMESPACES = "struts.mapper.action.prefix.crossNamespaces"; + } Modified: struts/struts2/branches/STRUTS_2_3_15_X/core/src/main/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapper.java URL: http://svn.apache.org/viewvc/struts/struts2/branches/STRUTS_2_3_15_X/core/src/main/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapper.java?rev=1532467&r1=1532466&r2=1532467&view=diff ============================================================================== --- struts/struts2/branches/STRUTS_2_3_15_X/core/src/main/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapper.java (original) +++ struts/struts2/branches/STRUTS_2_3_15_X/core/src/main/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapper.java Tue Oct 15 18:20:43 2013 @@ -34,7 +34,6 @@ import org.apache.commons.lang3.StringUt import org.apache.struts2.RequestUtils; import org.apache.struts2.ServletActionContext; import org.apache.struts2.StrutsConstants; -import org.apache.struts2.dispatcher.ServletDispatcherResult; import org.apache.struts2.util.PrefixTrie; import javax.servlet.http.HttpServletRequest; @@ -170,13 +169,14 @@ public class DefaultActionMapper impleme protected static final String METHOD_PREFIX = "method:"; protected static final String ACTION_PREFIX = "action:"; - private static final String STRUTS2_ACTION_PREFIX_PARSED = "_struts2_action_prefix_parsed"; protected boolean allowDynamicMethodCalls = false; protected boolean allowSlashesInActionNames = false; protected boolean alwaysSelectFullNamespace = false; protected PrefixTrie prefixTrie = null; protected Pattern allowedActionNames = Pattern.compile("[a-zA-Z0-9._!/\\-]*"); + private boolean allowActionPrefix = false; + private boolean allowActionCrossNamespaceAccess = false; protected List<String> extensions = new ArrayList<String>() {{ add("action"); @@ -189,7 +189,7 @@ public class DefaultActionMapper impleme prefixTrie = new PrefixTrie() { { put(METHOD_PREFIX, new ParameterAction() { - public void execute(String key, ActionMapping mapping, HttpServletRequest request) { + public void execute(String key, ActionMapping mapping) { if (allowDynamicMethodCalls) { mapping.setMethod(key.substring(METHOD_PREFIX.length())); } @@ -197,9 +197,8 @@ public class DefaultActionMapper impleme }); put(ACTION_PREFIX, new ParameterAction() { - public void execute(final String key, ActionMapping mapping, HttpServletRequest request) { - if (request != null && request.getAttribute(STRUTS2_ACTION_PREFIX_PARSED) == null) { - request.setAttribute(STRUTS2_ACTION_PREFIX_PARSED, true); + public void execute(final String key, ActionMapping mapping) { + if (allowActionPrefix) { String name = key.substring(ACTION_PREFIX.length()); if (allowDynamicMethodCalls) { int bang = name.indexOf('!'); @@ -210,11 +209,17 @@ public class DefaultActionMapper impleme } } String actionName = cleanupActionName(name); - mapping.setName(actionName); - if (getDefaultExtension() != null) { - actionName = actionName + "." + getDefaultExtension(); + if (allowSlashesInActionNames && !allowActionCrossNamespaceAccess) { + if (actionName.startsWith("/")) { + actionName = actionName.substring(1); + } } - mapping.setResult(new ServletDispatcherResult(actionName)); + if (!allowSlashesInActionNames && !allowActionCrossNamespaceAccess) { + if (actionName.lastIndexOf("/") != -1) { + actionName = actionName.substring(actionName.lastIndexOf("/") + 1); + } + } + mapping.setName(actionName); } } }); @@ -254,6 +259,16 @@ public class DefaultActionMapper impleme this.allowedActionNames = Pattern.compile(allowedActionNames); } + @Inject(value = StrutsConstants.STRUTS_MAPPER_ACTION_PREFIX_ENABLED) + public void setAllowActionPrefix(String allowActionPrefix) { + this.allowActionPrefix = "true".equalsIgnoreCase(allowActionPrefix); + } + + @Inject(value = StrutsConstants.STRUTS_MAPPER_ACTION_PREFIX_CROSSNAMESPACES) + public void setAllowActionCrossNamespaceAccess(String allowActionCrossNamespaceAccess) { + this.allowActionCrossNamespaceAccess = "true".equalsIgnoreCase(allowActionCrossNamespaceAccess); + } + @Inject public void setContainer(Container container) { this.container = container; @@ -346,7 +361,7 @@ public class DefaultActionMapper impleme if (!uniqueParameters.contains(key)) { ParameterAction parameterAction = (ParameterAction) prefixTrie.get(key); if (parameterAction != null) { - parameterAction.execute(key, mapping, request); + parameterAction.execute(key, mapping); uniqueParameters.add(key); break; } Modified: struts/struts2/branches/STRUTS_2_3_15_X/core/src/main/java/org/apache/struts2/dispatcher/mapper/ParameterAction.java URL: http://svn.apache.org/viewvc/struts/struts2/branches/STRUTS_2_3_15_X/core/src/main/java/org/apache/struts2/dispatcher/mapper/ParameterAction.java?rev=1532467&r1=1532466&r2=1532467&view=diff ============================================================================== --- struts/struts2/branches/STRUTS_2_3_15_X/core/src/main/java/org/apache/struts2/dispatcher/mapper/ParameterAction.java (original) +++ struts/struts2/branches/STRUTS_2_3_15_X/core/src/main/java/org/apache/struts2/dispatcher/mapper/ParameterAction.java Tue Oct 15 18:20:43 2013 @@ -21,8 +21,6 @@ package org.apache.struts2.dispatcher.mapper; -import javax.servlet.http.HttpServletRequest; - /** * Defines a parameter action prefix. This is executed when the configured prefix key is matched in a parameter * name, allowing the implementation to manipulate the action mapping accordingly. For example, if the "action:foo" @@ -32,5 +30,7 @@ import javax.servlet.http.HttpServletReq * @since 2.1.0 */ public interface ParameterAction { - void execute(String key, ActionMapping mapping, HttpServletRequest request); + + void execute(String key, ActionMapping mapping); + } Modified: struts/struts2/branches/STRUTS_2_3_15_X/core/src/main/resources/org/apache/struts2/default.properties URL: http://svn.apache.org/viewvc/struts/struts2/branches/STRUTS_2_3_15_X/core/src/main/resources/org/apache/struts2/default.properties?rev=1532467&r1=1532466&r2=1532467&view=diff ============================================================================== --- struts/struts2/branches/STRUTS_2_3_15_X/core/src/main/resources/org/apache/struts2/default.properties (original) +++ struts/struts2/branches/STRUTS_2_3_15_X/core/src/main/resources/org/apache/struts2/default.properties Tue Oct 15 18:20:43 2013 @@ -116,6 +116,12 @@ struts.enable.DynamicMethodInvocation = ### "/foo/save". struts.enable.SlashesInActionNames = false +### Disables support for action: prefix +struts.mapper.action.prefix.enabled = false + +### Blocks access to actions in other namespace than current with action: prefix +struts.mapper.action.prefix.crossNamespaces = false + ### use alternative syntax that requires %{} in most places ### to evaluate expressions for String attributes for tags struts.tag.altSyntax=true Modified: struts/struts2/branches/STRUTS_2_3_15_X/core/src/test/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapperTest.java URL: http://svn.apache.org/viewvc/struts/struts2/branches/STRUTS_2_3_15_X/core/src/test/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapperTest.java?rev=1532467&r1=1532466&r2=1532467&view=diff ============================================================================== --- struts/struts2/branches/STRUTS_2_3_15_X/core/src/test/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapperTest.java (original) +++ struts/struts2/branches/STRUTS_2_3_15_X/core/src/test/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapperTest.java Tue Oct 15 18:20:43 2013 @@ -34,7 +34,6 @@ import org.apache.struts2.StrutsTestCase import org.apache.struts2.dispatcher.StrutsResultSupport; import org.apache.struts2.views.jsp.StrutsMockHttpServletRequest; -import javax.servlet.http.HttpServletRequest; import java.util.Arrays; import java.util.HashMap; import java.util.Map; @@ -400,7 +399,7 @@ public class DefaultActionMapperTest ext // === test special prefix === // =========================== - public void testActionPrefix() throws Exception { + public void testActionPrefixWhenDisabled() throws Exception { Map parameterMap = new HashMap(); parameterMap.put(DefaultActionMapper.ACTION_PREFIX + "myAction", ""); @@ -411,9 +410,89 @@ public class DefaultActionMapperTest ext DefaultActionMapper defaultActionMapper = new DefaultActionMapper(); ActionMapping actionMapping = defaultActionMapper.getMapping(request, configManager); + assertEquals("someServletPath", actionMapping.getName()); + } + + public void testActionPrefixWhenEnabled() throws Exception { + Map parameterMap = new HashMap(); + parameterMap.put(DefaultActionMapper.ACTION_PREFIX + "myAction", ""); + + StrutsMockHttpServletRequest request = new StrutsMockHttpServletRequest(); + request.setParameterMap(parameterMap); + request.setupGetServletPath("/someServletPath.action"); + + DefaultActionMapper defaultActionMapper = new DefaultActionMapper(); + defaultActionMapper.setAllowActionPrefix("true"); + ActionMapping actionMapping = defaultActionMapper.getMapping(request, configManager); + assertEquals("myAction", actionMapping.getName()); } + public void testActionPrefixWhenSlashesAndCrossNamespaceDisabled() throws Exception { + Map parameterMap = new HashMap(); + parameterMap.put(DefaultActionMapper.ACTION_PREFIX + "my/Action", ""); + + StrutsMockHttpServletRequest request = new StrutsMockHttpServletRequest(); + request.setParameterMap(parameterMap); + request.setupGetServletPath("/someServletPath.action"); + + DefaultActionMapper defaultActionMapper = new DefaultActionMapper(); + defaultActionMapper.setAllowActionPrefix("true"); + defaultActionMapper.setSlashesInActionNames("true"); + ActionMapping actionMapping = defaultActionMapper.getMapping(request, configManager); + + assertEquals("my/Action", actionMapping.getName()); + } + + public void testActionPrefixWhenSlashesButSlashesDisabledAndCrossNamespaceDisabled() throws Exception { + Map parameterMap = new HashMap(); + parameterMap.put(DefaultActionMapper.ACTION_PREFIX + "my/Action", ""); + + StrutsMockHttpServletRequest request = new StrutsMockHttpServletRequest(); + request.setParameterMap(parameterMap); + request.setupGetServletPath("/someServletPath.action"); + + DefaultActionMapper defaultActionMapper = new DefaultActionMapper(); + defaultActionMapper.setAllowActionPrefix("true"); + defaultActionMapper.setSlashesInActionNames("false"); + ActionMapping actionMapping = defaultActionMapper.getMapping(request, configManager); + + assertEquals("Action", actionMapping.getName()); + } + + public void testActionPrefixWhenSlashesButSlashesDisabledAndCrossNamespace() throws Exception { + Map parameterMap = new HashMap(); + parameterMap.put(DefaultActionMapper.ACTION_PREFIX + "my/Action", ""); + + StrutsMockHttpServletRequest request = new StrutsMockHttpServletRequest(); + request.setParameterMap(parameterMap); + request.setupGetServletPath("/someServletPath.action"); + + DefaultActionMapper defaultActionMapper = new DefaultActionMapper(); + defaultActionMapper.setAllowActionPrefix("true"); + defaultActionMapper.setAllowActionCrossNamespaceAccess("true"); + defaultActionMapper.setSlashesInActionNames("false"); + ActionMapping actionMapping = defaultActionMapper.getMapping(request, configManager); + + assertEquals("my/Action", actionMapping.getName()); + } + + public void testActionPrefixWhenCrossNamespace() throws Exception { + Map parameterMap = new HashMap(); + parameterMap.put(DefaultActionMapper.ACTION_PREFIX + "/my/Action", ""); + + StrutsMockHttpServletRequest request = new StrutsMockHttpServletRequest(); + request.setParameterMap(parameterMap); + request.setupGetServletPath("/someServletPath.action"); + + DefaultActionMapper defaultActionMapper = new DefaultActionMapper(); + defaultActionMapper.setAllowActionPrefix("true"); + defaultActionMapper.setAllowActionCrossNamespaceAccess("true"); + ActionMapping actionMapping = defaultActionMapper.getMapping(request, configManager); + + assertEquals("/my/Action", actionMapping.getName()); + } + public void testActionPrefix_fromImageButton() throws Exception { Map parameterMap = new HashMap(); parameterMap.put(DefaultActionMapper.ACTION_PREFIX + "myAction", ""); @@ -425,6 +504,7 @@ public class DefaultActionMapperTest ext request.setupGetServletPath("/someServletPath.action"); DefaultActionMapper defaultActionMapper = new DefaultActionMapper(); + defaultActionMapper.setAllowActionPrefix("true"); ActionMapping actionMapping = defaultActionMapper.getMapping(request, configManager); assertEquals("myAction", actionMapping.getName()); @@ -440,6 +520,7 @@ public class DefaultActionMapperTest ext request.setupGetServletPath("/someServletPath.action"); DefaultActionMapper defaultActionMapper = new DefaultActionMapper(); + defaultActionMapper.setAllowActionPrefix("true"); ActionMapping actionMapping = defaultActionMapper.getMapping(request, configManager); assertEquals("myAction", actionMapping.getName()); @@ -539,7 +620,7 @@ public class DefaultActionMapperTest ext DefaultActionMapper defaultActionMapper = new DefaultActionMapper(); defaultActionMapper.addParameterAction("foo", new ParameterAction() { - public void execute(String key, ActionMapping mapping, HttpServletRequest request) { + public void execute(String key, ActionMapping mapping) { mapping.setName("myAction"); } }); Modified: struts/struts2/branches/STRUTS_2_3_15_X/src/site/resources/archetype-catalog.xml URL: http://svn.apache.org/viewvc/struts/struts2/branches/STRUTS_2_3_15_X/src/site/resources/archetype-catalog.xml?rev=1532467&r1=1532466&r2=1532467&view=diff ============================================================================== --- struts/struts2/branches/STRUTS_2_3_15_X/src/site/resources/archetype-catalog.xml (original) +++ struts/struts2/branches/STRUTS_2_3_15_X/src/site/resources/archetype-catalog.xml Tue Oct 15 18:20:43 2013 @@ -7,42 +7,42 @@ <archetype> <groupId>org.apache.struts</groupId> <artifactId>struts2-archetype-blank</artifactId> - <version>2.3.15.2</version> + <version>2.3.15.3</version> <repository>http://repo1.maven.org/maven2/</repository> <description>Struts 2 Archetypes - Blank</description> </archetype> <archetype> <groupId>org.apache.struts</groupId> <artifactId>struts2-archetype-convention</artifactId> - <version>2.3.15.2</version> + <version>2.3.15.3</version> <repository>http://repo1.maven.org/maven2/</repository> <description>Struts 2 Archetypes - Blank Convention</description> </archetype> <archetype> <groupId>org.apache.struts</groupId> <artifactId>struts2-archetype-dbportlet</artifactId> - <version>2.3.15.2</version> + <version>2.3.15.3</version> <repository>http://repo1.maven.org/maven2/</repository> <description>Struts 2 Archetypes - Database Portlet</description> </archetype> <archetype> <groupId>org.apache.struts</groupId> <artifactId>struts2-archetype-plugin</artifactId> - <version>2.3.15.2</version> + <version>2.3.15.3</version> <repository>http://repo1.maven.org/maven2/</repository> <description>Struts 2 Archetypes - Plugin</description> </archetype> <archetype> <groupId>org.apache.struts</groupId> <artifactId>struts2-archetype-portlet</artifactId> - <version>2.3.15.2</version> + <version>2.3.15.3</version> <repository>http://repo1.maven.org/maven2/</repository> <description>Struts 2 Archetypes - Portlet</description> </archetype> <archetype> <groupId>org.apache.struts</groupId> <artifactId>struts2-archetype-starter</artifactId> - <version>2.3.15.2</version> + <version>2.3.15.3</version> <repository>http://repo1.maven.org/maven2/</repository> <description>Struts 2 Archetypes - Starter</description> </archetype>