Author: tschneider
Date: Tue Nov 20 14:45:21 2007
New Revision: 596862
URL: http://svn.apache.org/viewvc?rev=596862&view=rev
Log:
Added action mapper to mimic the webwork behavior for redirection of actions in
the default namespace.
In S2, an action in the default namespace have "" being returned as the
namespace, in webwork, the package name would be used.
Added:
struts/sandbox/trunk/struts2-webwork2-plugin/src/main/java/org/apache/struts2/dispatcher/
struts/sandbox/trunk/struts2-webwork2-plugin/src/main/java/org/apache/struts2/dispatcher/mapper/
struts/sandbox/trunk/struts2-webwork2-plugin/src/main/java/org/apache/struts2/dispatcher/mapper/WebworkActionMapper.java
Modified:
struts/sandbox/trunk/struts2-webwork2-plugin/src/main/resources/struts-plugin.xml
Added:
struts/sandbox/trunk/struts2-webwork2-plugin/src/main/java/org/apache/struts2/dispatcher/mapper/WebworkActionMapper.java
URL:
http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-webwork2-plugin/src/main/java/org/apache/struts2/dispatcher/mapper/WebworkActionMapper.java?rev=596862&view=auto
==============================================================================
---
struts/sandbox/trunk/struts2-webwork2-plugin/src/main/java/org/apache/struts2/dispatcher/mapper/WebworkActionMapper.java
(added)
+++
struts/sandbox/trunk/struts2-webwork2-plugin/src/main/java/org/apache/struts2/dispatcher/mapper/WebworkActionMapper.java
Tue Nov 20 14:45:21 2007
@@ -0,0 +1,146 @@
+package org.apache.struts2.dispatcher.mapper;
+
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.struts2.RequestUtils;
+import org.apache.struts2.dispatcher.ServletRedirectResult;
+import org.apache.struts2.util.PrefixTrie;
+
+import com.opensymphony.xwork2.config.ConfigurationManager;
+
+public class WebworkActionMapper extends DefaultActionMapper {
+ static final String METHOD_PREFIX = "method:";
+ static final String ACTION_PREFIX = "action:";
+ static final String REDIRECT_PREFIX = "redirect:";
+ static final String REDIRECT_ACTION_PREFIX = "redirect-action:";
+
+ PrefixTrie prefixTrie = new PrefixTrie() {
+ {
+ put(METHOD_PREFIX, new ParameterAction() {
+ public void execute(String key, ActionMapping
mapping) {
+
mapping.setMethod(key.substring(METHOD_PREFIX.length()));
+ }
+ });
+
+ put(ACTION_PREFIX, new ParameterAction() {
+ public void execute(String key, ActionMapping
mapping) {
+ String name =
key.substring(ACTION_PREFIX.length());
+ int bang = name.indexOf('!');
+ if (bang != -1) {
+ String method =
name.substring(bang + 1);
+ mapping.setMethod(method);
+ name = name.substring(0, bang);
+ }
+
+ mapping.setName(name);
+ }
+ });
+
+ put(REDIRECT_PREFIX, new ParameterAction() {
+ public void execute(String key, ActionMapping
mapping) {
+ ServletRedirectResult redirect = new
ServletRedirectResult();
+ redirect.setLocation(key
+
.substring(REDIRECT_PREFIX.length()));
+ mapping.setResult(redirect);
+ }
+ });
+
+ put(REDIRECT_ACTION_PREFIX, new ParameterAction() {
+ public void execute(String key, ActionMapping
mapping) {
+ String location =
key.substring(REDIRECT_ACTION_PREFIX
+ .length());
+ ServletRedirectResult redirect = new
ServletRedirectResult();
+ String extension =
getDefaultExtension();
+ if (extension != null) {
+ location += "." + extension;
+ }
+ redirect.setLocation(location);
+ mapping.setResult(redirect);
+ }
+ });
+ }
+ };
+
+ public ActionMapping getMapping(HttpServletRequest request,
+ ConfigurationManager manager) {
+ ActionMapping mapping = new ActionMapping();
+ String uri = getUri(request);
+
+ parseNameAndNamespace(uri, mapping);
+
+ handleSpecialParameters(request, mapping);
+
+ if (mapping.getName() == null) {
+ return null;
+ }
+
+ // handle "name!method" convention.
+ String name = mapping.getName();
+ int exclamation = name.lastIndexOf("!");
+ if (exclamation != -1) {
+ mapping.setName(name.substring(0, exclamation));
+ mapping.setMethod(name.substring(exclamation + 1));
+ }
+ mapping.setParams(new LinkedHashMap(request.getParameterMap()));
+ return mapping;
+ }
+
+ protected void parseNameAndNamespace(String uri, ActionMapping mapping)
{
+ String namespace, name;
+ int lastSlash = uri.lastIndexOf("/");
+ if (lastSlash == -1) {
+ namespace = "";
+ name = uri;
+ } else if (lastSlash == 0) {
+ // ww-1046, assume it is the root namespace, it will
fallback to
+ // default
+ // namespace anyway if not found in root namespace.
+ namespace = "/";
+ name = uri.substring(lastSlash + 1);
+ } else {
+ namespace = uri.substring(0, lastSlash);
+ name = uri.substring(lastSlash + 1);
+ }
+ mapping.setNamespace(namespace);
+ mapping.setName(dropExtension(name));
+ }
+
+ String dropExtension(String name) {
+ if (extensions == null) {
+ return name;
+ }
+ Iterator it = extensions.iterator();
+ while (it.hasNext()) {
+ String extension = "." + (String) it.next();
+ if (name.endsWith(extension)) {
+ name = name.substring(0, name.length() -
extension.length());
+ return name;
+ }
+ }
+ return null;
+ }
+
+ String getUri(HttpServletRequest request) {
+ // handle http dispatcher includes.
+ String uri = (String) request
+
.getAttribute("javax.servlet.include.servlet_path");
+ if (uri != null) {
+ return uri;
+ }
+
+ uri = RequestUtils.getServletPath(request);
+ if (uri != null && !"".equals(uri)) {
+ return uri;
+ }
+
+ uri = request.getRequestURI();
+ return uri.substring(request.getContextPath().length());
+ }
+
+ interface ParameterAction {
+ void execute(String key, ActionMapping mapping);
+ }
+}
Modified:
struts/sandbox/trunk/struts2-webwork2-plugin/src/main/resources/struts-plugin.xml
URL:
http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-webwork2-plugin/src/main/resources/struts-plugin.xml?rev=596862&r1=596861&r2=596862&view=diff
==============================================================================
---
struts/sandbox/trunk/struts2-webwork2-plugin/src/main/resources/struts-plugin.xml
(original)
+++
struts/sandbox/trunk/struts2-webwork2-plugin/src/main/resources/struts-plugin.xml
Tue Nov 20 14:45:21 2007
@@ -6,6 +6,8 @@
<struts>
- <bean type="org.apache.struts2.views.TagLibrary" name="ww"
class="org.apache.struts2.views.DefaultTagLibrary" />
-
+ <bean type="org.apache.struts2.dispatcher.mapper.ActionMapper"
name="webwork" class="org.apache.struts2.dispatcher.mapper.WebworkActionMapper"
/>
+ <constant name="struts.mapper.class" value="webwork" />
+
+ <bean type="org.apache.struts2.views.TagLibrary" name="ww"
class="org.apache.struts2.views.DefaultTagLibrary" />
</struts>