diff --git a/core/src/main/java/org/apache/struts2/components/Form.java b/core/src/main/java/org/apache/struts2/components/Form.java
index 948eed744..df24c7e30 100644
--- a/core/src/main/java/org/apache/struts2/components/Form.java
+++ b/core/src/main/java/org/apache/struts2/components/Form.java
@@ -382,7 +382,7 @@ public class Form extends ClosingUIBean {
}
}
if (action != null) {
- String result = PortletUrlHelper.buildUrl(action, namespace,
+ String result = PortletUrlHelper.buildUrl(action, namespace, null,
getParameters(), type, portletMode, windowState);
addParameter("action", result);
diff --git a/core/src/main/java/org/apache/struts2/components/URL.java b/core/src/main/java/org/apache/struts2/components/URL.java
index 97bdb8e09..1e503bffa 100644
--- a/core/src/main/java/org/apache/struts2/components/URL.java
+++ b/core/src/main/java/org/apache/struts2/components/URL.java
@@ -250,7 +250,7 @@ public class URL extends Component {
String result;
if (value == null && action != null) {
if (Dispatcher.getInstance().isPortletSupportActive() && PortletActionContext.isPortletRequest()) {
- result = PortletUrlHelper.buildUrl(action, namespace, parameters, portletUrlType, portletMode, windowState);
+ result = PortletUrlHelper.buildUrl(action, namespace, method, parameters, portletUrlType, portletMode, windowState);
}
else {
result = determineActionURL(action, namespace, method, req, res, parameters, scheme, includeContext, encode, forceAddSchemeHostAndPort, escapeAmp);
diff --git a/core/src/main/java/org/apache/struts2/portlet/util/PortletUrlHelper.java b/core/src/main/java/org/apache/struts2/portlet/util/PortletUrlHelper.java
index 8e0679ded..a6d334bc5 100644
--- a/core/src/main/java/org/apache/struts2/portlet/util/PortletUrlHelper.java
+++ b/core/src/main/java/org/apache/struts2/portlet/util/PortletUrlHelper.java
@@ -22,8 +22,8 @@ package org.apache.struts2.portlet.util;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
-import java.util.HashMap;
import java.util.Iterator;
+import java.util.LinkedHashMap;
import java.util.Map;
import java.util.StringTokenizer;
@@ -59,15 +59,16 @@ public class PortletUrlHelper {
*
* @param action The action the URL should invoke.
* @param namespace The namespace of the action to invoke.
+ * @param method The method of the action to invoke.
* @param params The parameters of the URL.
* @param type The type of the url, either action or render
* @param mode The PortletMode of the URL.
* @param state The WindowState of the URL.
* @return The URL String.
*/
- public static String buildUrl(String action, String namespace, Map params,
+ public static String buildUrl(String action, String namespace, String method, Map params,
String type, String mode, String state) {
- return buildUrl(action, namespace, params, null, type, mode, state,
+ return buildUrl(action, namespace, method, params, null, type, mode, state,
true, true);
}
@@ -76,9 +77,10 @@ public class PortletUrlHelper {
*
* @see #buildUrl(String, String, Map, String, String, String)
*/
- public static String buildUrl(String action, String namespace, Map params,
+ public static String buildUrl(String action, String namespace, String method, Map params,
String scheme, String type, String portletMode, String windowState,
boolean includeContext, boolean encodeResult) {
+ StringBuffer resultingAction = new StringBuffer();
RenderRequest request = PortletActionContext.getRenderRequest();
RenderResponse response = PortletActionContext.getRenderResponse();
LOG.debug("Creating url. Action = " + action + ", Namespace = "
@@ -102,15 +104,17 @@ public class PortletUrlHelper {
}
}
if (TextUtils.stringSet(namespace)) {
- StringBuffer sb = new StringBuffer();
- sb.append(namespace);
+ resultingAction.append(namespace);
if(!action.startsWith("/") && !namespace.endsWith("/")) {
- sb.append("/");
+ resultingAction.append("/");
}
- action = sb.append(action).toString();
+ resultingAction.append(action);
LOG.debug("Resulting actionPath: " + action);
}
- params.put(PortletActionConstants.ACTION_PARAM, new String[] { action });
+ if(TextUtils.stringSet(method)) {
+ resultingAction.append("!").append(method);
+ }
+ params.put(PortletActionConstants.ACTION_PARAM, new String[] { resultingAction.toString() });
PortletURL url = null;
if ("action".equalsIgnoreCase(type)) {
@@ -230,7 +234,7 @@ public class PortletUrlHelper {
public static Map ensureParamsAreStringArrays(Map params) {
Map result = null;
if (params != null) {
- result = new HashMap(params.size());
+ result = new LinkedHashMap(params.size());
Iterator it = params.keySet().iterator();
while (it.hasNext()) {
Object key = it.next();
diff --git a/core/src/test/java/org/apache/struts2/portlet/util/PortletUrlHelperTest.java b/core/src/test/java/org/apache/struts2/portlet/util/PortletUrlHelperTest.java
index 32af41967..43a7fd365 100644
--- a/core/src/test/java/org/apache/struts2/portlet/util/PortletUrlHelperTest.java
+++ b/core/src/test/java/org/apache/struts2/portlet/util/PortletUrlHelperTest.java
@@ -95,7 +95,7 @@ public class PortletUrlHelperTest extends TestCase {
renderRequestControl.replay();
renderResponseControl.replay();
portletUrlControl.replay();
- PortletUrlHelper.buildUrl("testAction", null,
+ PortletUrlHelper.buildUrl("testAction", null, null,
new HashMap(), null, null, null);
portletUrlControl.verify();
renderRequestControl.verify();
@@ -113,7 +113,7 @@ public class PortletUrlHelperTest extends TestCase {
renderRequestControl.replay();
renderResponseControl.replay();
portletUrlControl.replay();
- PortletUrlHelper.buildUrl("testAction", null,
+ PortletUrlHelper.buildUrl("testAction", null, null,
new HashMap(), null, "edit", null);
portletUrlControl.verify();
renderRequestControl.verify();
@@ -131,7 +131,7 @@ public class PortletUrlHelperTest extends TestCase {
renderRequestControl.replay();
renderResponseControl.replay();
portletUrlControl.replay();
- PortletUrlHelper.buildUrl("testAction", null,
+ PortletUrlHelper.buildUrl("testAction", null, null,
new HashMap(), null, null, "maximized");
portletUrlControl.verify();
renderRequestControl.verify();
@@ -149,7 +149,7 @@ public class PortletUrlHelperTest extends TestCase {
renderRequestControl.replay();
renderResponseControl.replay();
portletUrlControl.replay();
- PortletUrlHelper.buildUrl("testAction", null,
+ PortletUrlHelper.buildUrl("testAction", null, null,
new HashMap(), "action", null, null);
portletUrlControl.verify();
renderRequestControl.verify();