From 4a3917176de2df7f33a85511d067f31e50dcc1b2 Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Tue, 8 May 2018 07:58:34 +0200 Subject: [PATCH] Avoids parsing namespace when using existing namespace --- .../apache/struts2/dispatcher/PostbackResult.java | 2 ++ .../dispatcher/ServletActionRedirectResult.java | 2 ++ .../struts2/dispatcher/StrutsResultSupport.java | 4 +++- .../portlet/result/PortletActionRedirectResult.java | 2 ++ .../com/opensymphony/xwork2/ActionChainResult.java | 13 +++++-------- 5 files changed, 14 insertions(+), 9 deletions(-) diff --git a/core/src/main/java/org/apache/struts2/dispatcher/PostbackResult.java b/core/src/main/java/org/apache/struts2/dispatcher/PostbackResult.java index 89e340048..f6a81e44a 100644 --- a/core/src/main/java/org/apache/struts2/dispatcher/PostbackResult.java +++ b/core/src/main/java/org/apache/struts2/dispatcher/PostbackResult.java @@ -127,6 +127,8 @@ public class PostbackResult extends StrutsResultSupport { if (actionName != null) { actionName = conditionalParse(actionName, invocation); + parseLocation = false; + if (namespace == null) { namespace = invocation.getProxy().getNamespace(); } else { diff --git a/core/src/main/java/org/apache/struts2/dispatcher/ServletActionRedirectResult.java b/core/src/main/java/org/apache/struts2/dispatcher/ServletActionRedirectResult.java index 5e0f835b5..baaf4aec0 100644 --- a/core/src/main/java/org/apache/struts2/dispatcher/ServletActionRedirectResult.java +++ b/core/src/main/java/org/apache/struts2/dispatcher/ServletActionRedirectResult.java @@ -164,6 +164,8 @@ public class ServletActionRedirectResult extends ServletRedirectResult implement */ public void execute(ActionInvocation invocation) throws Exception { actionName = conditionalParse(actionName, invocation); + parseLocation = false; + if (namespace == null) { namespace = invocation.getProxy().getNamespace(); } else { diff --git a/core/src/main/java/org/apache/struts2/dispatcher/StrutsResultSupport.java b/core/src/main/java/org/apache/struts2/dispatcher/StrutsResultSupport.java index bbcffa3b2..930c088b0 100644 --- a/core/src/main/java/org/apache/struts2/dispatcher/StrutsResultSupport.java +++ b/core/src/main/java/org/apache/struts2/dispatcher/StrutsResultSupport.java @@ -118,6 +118,8 @@ public abstract class StrutsResultSupport implements Result, StrutsStatics { private String location; private String lastFinalLocation; + protected boolean parseLocation = true; + public StrutsResultSupport() { this(null, true, false); } @@ -187,7 +189,7 @@ public abstract class StrutsResultSupport implements Result, StrutsStatics { * @throws Exception if an error occurs while executing the result. */ public void execute(ActionInvocation invocation) throws Exception { - lastFinalLocation = conditionalParse(location, invocation); + lastFinalLocation = parseLocation ? conditionalParse(location, invocation) : location; doExecute(lastFinalLocation, invocation); } diff --git a/plugins/portlet/src/main/java/org/apache/struts2/portlet/result/PortletActionRedirectResult.java b/plugins/portlet/src/main/java/org/apache/struts2/portlet/result/PortletActionRedirectResult.java index 04729c1f5..ce7c02b84 100644 --- a/plugins/portlet/src/main/java/org/apache/struts2/portlet/result/PortletActionRedirectResult.java +++ b/plugins/portlet/src/main/java/org/apache/struts2/portlet/result/PortletActionRedirectResult.java @@ -174,6 +174,8 @@ public class PortletActionRedirectResult extends PortletResult { */ public void execute(ActionInvocation invocation) throws Exception { actionName = conditionalParse(actionName, invocation); + parseLocation = false; + String portletNamespace = (String)invocation.getInvocationContext().get(PortletConstants.PORTLET_NAMESPACE); if (portletMode != null) { Map namespaceMap = getNamespaceMap(invocation); diff --git a/xwork-core/src/main/java/com/opensymphony/xwork2/ActionChainResult.java b/xwork-core/src/main/java/com/opensymphony/xwork2/ActionChainResult.java index 170c56796..9aeb0def5 100644 --- a/xwork-core/src/main/java/com/opensymphony/xwork2/ActionChainResult.java +++ b/xwork-core/src/main/java/com/opensymphony/xwork2/ActionChainResult.java @@ -197,17 +197,14 @@ public class ActionChainResult implements Result { * @param invocation the DefaultActionInvocation calling the action call stack */ public void execute(ActionInvocation invocation) throws Exception { - // if the finalNamespace wasn't explicitly defined, assume the current one - if (this.namespace == null) { - this.namespace = invocation.getProxy().getNamespace(); - } - ValueStack stack = ActionContext.getContext().getValueStack(); - String finalNamespace = TextParseUtil.translateVariables(namespace, stack); + String finalNamespace = this.namespace != null + ? TextParseUtil.translateVariables(namespace, stack) + : invocation.getProxy().getNamespace(); String finalActionName = TextParseUtil.translateVariables(actionName, stack); String finalMethodName = this.methodName != null - ? TextParseUtil.translateVariables(this.methodName, stack) - : null; + ? TextParseUtil.translateVariables(this.methodName, stack) + : null; if (isInChainHistory(finalNamespace, finalActionName, finalMethodName)) { addToHistory(finalNamespace, finalActionName, finalMethodName);