Skip to content

Commit

Permalink
Changes archetypes version to match latest release
Browse files Browse the repository at this point in the history
  • Loading branch information
lukaszlenart committed Oct 15, 2013
1 parent 9a3d105 commit 0c8366c
Show file tree
Hide file tree
Showing 6 changed files with 131 additions and 23 deletions.
6 changes: 6 additions & 0 deletions core/src/main/java/org/apache/struts2/StrutsConstants.java
Original file line number Diff line number Diff line change
Expand Up @@ -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";

}
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@
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;
Expand Down Expand Up @@ -170,13 +169,14 @@ public class DefaultActionMapper implements ActionMapper {

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");
Expand All @@ -189,17 +189,16 @@ public DefaultActionMapper() {
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()));
}
}
});

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('!');
Expand All @@ -210,11 +209,17 @@ public void execute(final String key, ActionMapping mapping, HttpServletRequest
}
}
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);
}
}
});
Expand Down Expand Up @@ -254,6 +259,16 @@ public void setAllowedActionNames(String allowedActionNames) {
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;
Expand Down Expand Up @@ -346,7 +361,7 @@ public void handleSpecialParameters(HttpServletRequest request, ActionMapping ma
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;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand All @@ -32,5 +30,7 @@
* @since 2.1.0
*/
public interface ParameterAction {
void execute(String key, ActionMapping mapping, HttpServletRequest request);

void execute(String key, ActionMapping mapping);

}
6 changes: 6 additions & 0 deletions core/src/main/resources/org/apache/struts2/default.properties
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,12 @@ struts.enable.DynamicMethodInvocation = false
### "/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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@
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;
Expand Down Expand Up @@ -400,7 +399,7 @@ public void testParseNameAndNamespace_AllowSlashes() throws Exception {
// === test special prefix ===
// ===========================

public void testActionPrefix() throws Exception {
public void testActionPrefixWhenDisabled() throws Exception {
Map parameterMap = new HashMap();
parameterMap.put(DefaultActionMapper.ACTION_PREFIX + "myAction", "");

Expand All @@ -411,9 +410,89 @@ public void testActionPrefix() throws Exception {
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", "");
Expand All @@ -425,6 +504,7 @@ public void testActionPrefix_fromImageButton() throws Exception {
request.setupGetServletPath("/someServletPath.action");

DefaultActionMapper defaultActionMapper = new DefaultActionMapper();
defaultActionMapper.setAllowActionPrefix("true");
ActionMapping actionMapping = defaultActionMapper.getMapping(request, configManager);

assertEquals("myAction", actionMapping.getName());
Expand All @@ -440,6 +520,7 @@ public void testActionPrefix_fromIEImageButton() throws Exception {
request.setupGetServletPath("/someServletPath.action");

DefaultActionMapper defaultActionMapper = new DefaultActionMapper();
defaultActionMapper.setAllowActionPrefix("true");
ActionMapping actionMapping = defaultActionMapper.getMapping(request, configManager);

assertEquals("myAction", actionMapping.getName());
Expand Down Expand Up @@ -539,7 +620,7 @@ public void testCustomActionPrefix() throws Exception {

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");
}
});
Expand Down
12 changes: 6 additions & 6 deletions src/site/resources/archetype-catalog.xml
Original file line number Diff line number Diff line change
Expand Up @@ -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>
Expand Down

0 comments on commit 0c8366c

Please sign in to comment.