diff --git a/core/src/main/java/org/apache/struts2/components/ServletUrlRenderer.java b/core/src/main/java/org/apache/struts2/components/ServletUrlRenderer.java index ca729041e..cc9424160 100644 --- a/core/src/main/java/org/apache/struts2/components/ServletUrlRenderer.java +++ b/core/src/main/java/org/apache/struts2/components/ServletUrlRenderer.java @@ -82,7 +82,7 @@ public class ServletUrlRenderer implements UrlRenderer { result = UrlHelper.buildUrl(_value, urlComponent.req, urlComponent.res, urlComponent.parameters, scheme, urlComponent.includeContext, urlComponent.encode, urlComponent.forceAddSchemeHostAndPort, urlComponent.escapeAmp); } if ( urlComponent.anchor != null && urlComponent.anchor.length() > 0 ) { - result += '#' + urlComponent.anchor; + result += '#' + urlComponent.findString(urlComponent.anchor); } String var = urlComponent.getVar(); diff --git a/plugins/portlet/src/main/java/org/apache/struts2/components/PortletUrlRenderer.java b/plugins/portlet/src/main/java/org/apache/struts2/components/PortletUrlRenderer.java index d0416b1de..faa2ede4e 100644 --- a/plugins/portlet/src/main/java/org/apache/struts2/components/PortletUrlRenderer.java +++ b/plugins/portlet/src/main/java/org/apache/struts2/components/PortletUrlRenderer.java @@ -43,6 +43,10 @@ public class PortletUrlRenderer implements UrlRenderer { * {@inheritDoc} */ public void renderUrl(Writer writer, URL urlComponent) { + String action = null; + if(urlComponent.action != null) { + action = urlComponent.findString(urlComponent.action); + } String scheme = urlComponent.req.getScheme(); if (urlComponent.scheme != null) { @@ -52,7 +56,7 @@ public class PortletUrlRenderer implements UrlRenderer { String result; urlComponent.namespace = urlComponent.determineNamespace(urlComponent.namespace, urlComponent.stack, urlComponent.req); if (onlyActionSpecified(urlComponent)) { - result = PortletUrlHelper.buildUrl(urlComponent.action, urlComponent.namespace, urlComponent.method, urlComponent.parameters, urlComponent.portletUrlType, urlComponent.portletMode, urlComponent.windowState); + result = PortletUrlHelper.buildUrl(action, urlComponent.namespace, urlComponent.method, urlComponent.parameters, urlComponent.portletUrlType, urlComponent.portletMode, urlComponent.windowState); } else if(onlyValueSpecified(urlComponent)){ result = PortletUrlHelper.buildResourceUrl(urlComponent.value, urlComponent.parameters); } @@ -60,7 +64,7 @@ public class PortletUrlRenderer implements UrlRenderer { result = createDefaultUrl(urlComponent); } if ( urlComponent.anchor != null && urlComponent.anchor.length() > 0 ) { - result += '#' + urlComponent.anchor; + result += '#' + urlComponent.findString(urlComponent.anchor); } String var = urlComponent.getVar(); diff --git a/plugins/portlet/src/test/java/org/apache/struts2/components/PortletUrlRendererTest.java b/plugins/portlet/src/test/java/org/apache/struts2/components/PortletUrlRendererTest.java index c132e6ffe..f8aa24a84 100644 --- a/plugins/portlet/src/test/java/org/apache/struts2/components/PortletUrlRendererTest.java +++ b/plugins/portlet/src/test/java/org/apache/struts2/components/PortletUrlRendererTest.java @@ -44,11 +44,43 @@ import com.opensymphony.xwork2.util.ValueStack; public class PortletUrlRendererTest extends StrutsTestCase { - PortletUrlRenderer renderer; + PortletUrlRenderer renderer; + MockPortletURL renderUrl; + MockPortletURL actionUrl; + MockRenderRequest request; + MockRenderResponse response; + ActionContext ctx; + ValueStack stack; public void setUp() throws Exception { super.setUp(); - renderer = new PortletUrlRenderer(); + renderer = new PortletUrlRenderer(); + renderUrl = new MockPortletURL( + new MockPortalContext(), "render"); + actionUrl = new MockPortletURL( + new MockPortalContext(), "action"); + request = new MockRenderRequest(); + response = new MockRenderResponse() { + @Override + public PortletURL createActionURL() { + return actionUrl; + } + @Override + public PortletURL createRenderURL() { + return renderUrl; + } + }; + + ctx = ActionContext.getContext(); + ctx.put(PortletActionConstants.PHASE, + PortletActionConstants.RENDER_PHASE); + ctx.put(PortletActionConstants.REQUEST, request); + ctx.put(PortletActionConstants.RESPONSE, response); + + Map modeMap = new HashMap(); + modeMap.put(PortletMode.VIEW, "/view"); + ctx.put(PortletActionConstants.MODE_NAMESPACE_MAP, modeMap); + stack = ctx.getValueStack(); } /** @@ -57,26 +89,7 @@ public class PortletUrlRendererTest extends StrutsTestCase { */ public void testShouldIncludeCurrentNamespaceIfNoNamespaceSpecifiedForRenderUrl() throws Exception { - final MockPortletURL portletUrl = new MockPortletURL( - new MockPortalContext(), "render"); - MockRenderRequest request = new MockRenderRequest(); - MockRenderResponse response = new MockRenderResponse() { - @Override - public PortletURL createRenderURL() { - return portletUrl; - } - }; - - ActionContext ctx = ActionContext.getContext(); - ctx.put(PortletActionConstants.PHASE, - PortletActionConstants.RENDER_PHASE); - ctx.put(PortletActionConstants.REQUEST, request); - ctx.put(PortletActionConstants.RESPONSE, response); - - Map modeMap = new HashMap(); - modeMap.put(PortletMode.VIEW, "/view"); - ctx.put(PortletActionConstants.MODE_NAMESPACE_MAP, modeMap); - ValueStack stack = ctx.getValueStack(); + URL url = new URL(stack, new PortletServletRequest(request, null), new PortletServletResponse(response)); @@ -92,7 +105,7 @@ public class PortletUrlRendererTest extends StrutsTestCase { StringWriter renderOutput = new StringWriter(); renderer.renderUrl(renderOutput, url); - String action = portletUrl + String action = renderUrl .getParameter(PortletActionConstants.ACTION_PARAM); assertEquals("/view/current_namespace/testAction", action); } @@ -103,26 +116,7 @@ public class PortletUrlRendererTest extends StrutsTestCase { */ public void testShouldIncludeCurrentNamespaceIfNoNamespaceSpecifiedForRenderFormUrl() throws Exception { - final MockPortletURL portletUrl = new MockPortletURL( - new MockPortalContext(), "render"); - MockRenderRequest request = new MockRenderRequest(); - MockRenderResponse response = new MockRenderResponse() { - @Override - public PortletURL createActionURL() { - return portletUrl; - } - }; - ActionContext ctx = ActionContext.getContext(); - ctx.put(PortletActionConstants.PHASE, - PortletActionConstants.RENDER_PHASE); - ctx.put(PortletActionConstants.REQUEST, request); - ctx.put(PortletActionConstants.RESPONSE, response); - - Map modeMap = new HashMap(); - modeMap.put(PortletMode.VIEW, "/view"); - ctx.put(PortletActionConstants.MODE_NAMESPACE_MAP, modeMap); - ValueStack stack = ctx.getValueStack(); Form form = new Form(stack, new PortletServletRequest(request, null), new PortletServletResponse(response)); @@ -135,11 +129,65 @@ public class PortletUrlRendererTest extends StrutsTestCase { ai.setAction(new Object()); ctx.setActionInvocation(ai); - StringWriter renderOutput = new StringWriter(); renderer.renderFormUrl(form); - String action = portletUrl + String action = actionUrl .getParameter(PortletActionConstants.ACTION_PARAM); assertEquals("/view/current_namespace/testAction", action); - } + } + + public void testShouldEvaluateActionAsOGNLExpression() throws Exception { + + TestObject obj = new TestObject(); + obj.someProperty = "EvaluatedProperty"; + stack.push(obj); + MockActionInvocation ai = new MockActionInvocation(); + MockActionProxy ap = new MockActionProxy(); + ap.setActionName("testAction"); + ap.setNamespace(""); + ai.setProxy(ap); + ai.setStack(stack); + ctx.setActionInvocation(ai); + + URL url = new URL(stack, new PortletServletRequest(request, null), + new PortletServletResponse(response)); + url.setAction("%{someProperty}"); + + StringWriter renderOutput = new StringWriter(); + renderer.renderUrl(renderOutput, url); + + String action = renderUrl + .getParameter(PortletActionConstants.ACTION_PARAM); + assertEquals("/view/EvaluatedProperty", action); + + } + + public void testShouldEvaluateAnchorAsOGNLExpression() throws Exception { + + TestObject obj = new TestObject(); + obj.someProperty = "EvaluatedProperty"; + stack.push(obj); + MockActionInvocation ai = new MockActionInvocation(); + MockActionProxy ap = new MockActionProxy(); + ap.setActionName("testAction"); + ap.setNamespace(""); + ai.setProxy(ap); + ai.setStack(stack); + ctx.setActionInvocation(ai); + + URL url = new URL(stack, new PortletServletRequest(request, null), + new PortletServletResponse(response)); + url.setAnchor("%{someProperty}"); + + StringWriter renderOutput = new StringWriter(); + renderer.renderUrl(renderOutput, url); + assertTrue(renderOutput.toString().indexOf("#EvaluatedProperty") != -1); + + } + + private final static class TestObject { + public String someProperty; + } + + }