Author: lukaszlenart
Date: Thu Feb 18 13:52:47 2010
New Revision: 911403
URL: http://svn.apache.org/viewvc?rev=911403&view=rev
Log:
Solved WW-3355 - handling empty action extensiomn in proper way
Modified:
struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapper.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=911403&r1=911402&r2=911403&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
Thu Feb 18 13:52:47 2010
@@ -21,67 +21,71 @@
package org.apache.struts2.dispatcher.mapper;
-import java.util.*;
-
-import javax.servlet.http.HttpServletRequest;
-
+import com.opensymphony.xwork2.ActionContext;
+import com.opensymphony.xwork2.config.Configuration;
+import com.opensymphony.xwork2.config.ConfigurationManager;
+import com.opensymphony.xwork2.config.entities.PackageConfig;
+import com.opensymphony.xwork2.inject.Container;
+import com.opensymphony.xwork2.inject.Inject;
import org.apache.struts2.RequestUtils;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.StrutsConstants;
import org.apache.struts2.dispatcher.ServletRedirectResult;
import org.apache.struts2.util.PrefixTrie;
-import com.opensymphony.xwork2.ActionContext;
-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.inject.Container;
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
/**
* <!-- START SNIPPET: javadoc -->
- *
+ * <p/>
* Default action mapper implementation, using the standard *.[ext] (where ext
* usually "action") pattern. The extension is looked up from the Struts
* configuration key <b>struts.action.extension</b>.
- *
+ * <p/>
* <p/> To help with dealing with buttons and other related requirements, this
* mapper (and other {...@link ActionMapper}s, we hope) has the ability to
name a
* button with some predefined prefix and have that button name alter the
* execution behaviour. The four prefixes are:
- *
+ * <p/>
* <ul>
- *
+ * <p/>
* <li>Method prefix - <i>method:default</i></li>
- *
+ * <p/>
* <li>Action prefix - <i>action:dashboard</i></li>
- *
+ * <p/>
* <li>Redirect prefix - <i>redirect:cancel.jsp</i></li>
- *
+ * <p/>
* <li>Redirect-action prefix - <i>redirectAction:cancel</i></li>
- *
+ * <p/>
* </ul>
- *
+ * <p/>
* <p/> In addition to these four prefixes, this mapper also understands the
* action naming pattern of <i>foo!bar</i> in either the extension form (eg:
* foo!bar.action) or in the prefix form (eg: action:foo!bar). This syntax
tells
* this mapper to map to the action named <i>foo</i> and the method <i>bar</i>.
- *
+ * <p/>
* <!-- END SNIPPET: javadoc -->
- *
+ * <p/>
* <p/> <b>Method Prefix</b> <p/>
- *
+ * <p/>
* <!-- START SNIPPET: method -->
- *
+ * <p/>
* With method-prefix, instead of calling baz action's execute() method (by
* default if it isn't overriden in struts.xml to be something else), the baz
* action's anotherMethod() will be called. A very elegant way determine which
* button is clicked. Alternatively, one would have submit button set a
* particular value on the action when clicked, and the execute() method
decides
* on what to do with the setted value depending on which button is clicked.
- *
+ * <p/>
* <!-- END SNIPPET: method -->
- *
+ * <p/>
* <pre>
* <!-- START SNIPPET: method-example -->
* <s:form action="baz">
@@ -91,18 +95,18 @@
* </s:form>
* <!-- END SNIPPET: method-example -->
* </pre>
- *
+ * <p/>
* <p/> <b>Action prefix</b> <p/>
- *
+ * <p/>
* <!-- START SNIPPET: action -->
- *
+ * <p/>
* With action-prefix, instead of executing baz action's execute() method (by
* default if it isn't overriden in struts.xml to be something else), the
* anotherAction action's execute() method (assuming again if it isn't
overriden
* with something else in struts.xml) will be executed.
- *
+ * <p/>
* <!-- END SNIPPET: action -->
- *
+ * <p/>
* <pre>
* <!-- START SNIPPET: action-example -->
* <s:form action="baz">
@@ -112,18 +116,18 @@
* </s:form>
* <!-- END SNIPPET: action-example -->
* </pre>
- *
+ * <p/>
* <p/> <b>Redirect prefix</b> <p/>
- *
+ * <p/>
* <!-- START SNIPPET: redirect -->
- *
+ * <p/>
* With redirect-prefix, instead of executing baz action's execute() method (by
* default it isn't overriden in struts.xml to be something else), it will get
* redirected to, in this case to www.google.com. Internally it uses
* ServletRedirectResult to do the task.
- *
+ * <p/>
* <!-- END SNIPPET: redirect -->
- *
+ * <p/>
* <pre>
* <!-- START SNIPPET: redirect-example -->
* <s:form action="baz">
@@ -133,19 +137,19 @@
* </s:form>
* <!-- END SNIPPET: redirect-example -->
* </pre>
- *
+ * <p/>
* <p/> <b>Redirect-action prefix</b> <p/>
- *
+ * <p/>
* <!-- START SNIPPET: redirect-action -->
- *
+ * <p/>
* With redirect-action-prefix, instead of executing baz action's execute()
* method (by default it isn't overriden in struts.xml to be something else),
it
* will get redirected to, in this case 'dashboard.action'. Internally it uses
* ServletRedirectResult to do the task and read off the extension from the
* struts.properties.
- *
+ * <p/>
* <!-- END SNIPPET: redirect-action -->
- *
+ * <p/>
* <pre>
* <!-- START SNIPPET: redirect-action-example -->
* <s:form action="baz">
@@ -155,7 +159,6 @@
* </s:form>
* <!-- END SNIPPET: redirect-action-example -->
* </pre>
- *
*/
public class DefaultActionMapper implements ActionMapper {
@@ -175,7 +178,10 @@
protected PrefixTrie prefixTrie = null;
- protected List<String> extensions = new ArrayList<String>() {{
add("action"); add("");}};
+ protected List<String> extensions = new ArrayList<String>() {{
+ add("action");
+ add("");
+ }};
protected Container container;
@@ -186,7 +192,7 @@
public void execute(String key, ActionMapping mapping) {
if (allowDynamicMethodCalls) {
mapping.setMethod(key.substring(
- METHOD_PREFIX.length()));
+ METHOD_PREFIX.length()));
}
}
});
@@ -237,10 +243,10 @@
/**
* Adds a parameter action. Should only be called during initialization
*
- * @param prefix The string prefix to trigger the action
+ * @param prefix The string prefix to trigger the action
* @param parameterAction The parameter action to execute
* @since 2.1.0
- */
+ */
protected void addParameterAction(String prefix, ParameterAction
parameterAction) {
prefixTrie.put(prefix, parameterAction);
}
@@ -293,8 +299,9 @@
*
* @see
org.apache.struts2.dispatcher.mapper.ActionMapper#getMapping(javax.servlet.http.HttpServletRequest)
*/
+
public ActionMapping getMapping(HttpServletRequest request,
- ConfigurationManager configManager) {
+ ConfigurationManager configManager) {
ActionMapping mapping = new ActionMapping();
String uri = getUri(request);
@@ -339,13 +346,11 @@
* Special parameters, as described in the class-level comment, are
searched
* for and handled.
*
- * @param request
- * The request
- * @param mapping
- * The action mapping
+ * @param request The request
+ * @param mapping The action mapping
*/
public void handleSpecialParameters(HttpServletRequest request,
- ActionMapping mapping) {
+ ActionMapping mapping) {
// handle special parameter prefixes.
Set<String> uniqueParameters = new HashSet<String>();
Map parameterMap = request.getParameterMap();
@@ -357,7 +362,7 @@
if (key.endsWith(".x") || key.endsWith(".y")) {
key = key.substring(0, key.length() - 2);
}
-
+
// Ensure a parameter doesn't get processed twice
if (!uniqueParameters.contains(key)) {
ParameterAction parameterAction = (ParameterAction) prefixTrie
@@ -374,13 +379,11 @@
/**
* Parses the name and namespace from the uri
*
- * @param uri
- * The uri
- * @param mapping
- * The action mapping to populate
+ * @param uri The uri
+ * @param mapping The action mapping to populate
*/
protected void parseNameAndNamespace(String uri, ActionMapping mapping,
- ConfigurationManager configManager) {
+ ConfigurationManager configManager) {
String namespace, name;
int lastSlash = uri.lastIndexOf("/");
if (lastSlash == -1) {
@@ -437,8 +440,7 @@
/**
* Drops the extension from the action name
*
- * @param name
- * The action name
+ * @param name The action name
* @return The action name without its extension
* @deprecated Since 2.1, use {...@link
#dropExtension(java.lang.String,org.apache.struts2.dispatcher.mapper.ActionMapping)}
instead
*/
@@ -449,8 +451,7 @@
/**
* Drops the extension from the action name, storing it in the mapping for
later use
*
- * @param name
- * The action name
+ * @param name The action name
* @param mapping The action mapping to store the extension in
* @return The action name without its extension
*/
@@ -493,8 +494,7 @@
/**
* Gets the uri from the request
*
- * @param request
- * The request
+ * @param request The request
* @return The uri
*/
protected String getUri(HttpServletRequest request) {
@@ -519,6 +519,7 @@
*
* @see
org.apache.struts2.dispatcher.mapper.ActionMapper#getUriFromActionMapping(org.apache.struts2.dispatcher.mapper.ActionMapping)
*/
+
public String getUriFromActionMapping(ActionMapping mapping) {
StringBuilder uri = new StringBuilder();
@@ -542,7 +543,6 @@
String extension = mapping.getExtension();
if (extension == null) {
- extension = getDefaultExtension();
// Look for the current extension, if available
ActionContext context = ActionContext.getContext();
if (context != null) {
@@ -551,26 +551,28 @@
extension = orig.getExtension();
}
}
+ if (extension == null) {
+ extension = getDefaultExtension();
+ }
}
if (extension != null) {
-
if (extension.length() == 0 || (extension.length() > 0 &&
uri.indexOf('.' + extension) == -1)) {
if (extension.length() > 0) {
uri.append(".").append(extension);
}
- if (params.length() > 0) {
- uri.append(params);
- }
}
}
+ if (params.length() > 0) {
+ uri.append(params);
+ }
return uri.toString();
}
- public boolean isSlashesInActionNames() {
- return allowSlashesInActionNames;
- }
+ public boolean isSlashesInActionNames() {
+ return allowSlashesInActionNames;
+ }
}