WW-2783 Evaluate anchor. Fix suggested by Ralf Fischer.

git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/trunk@719704 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Nils-Helge Garli
2008-11-21 20:37:49 +00:00
parent dbedc4fae4
commit ad49562c48
3 changed files with 100 additions and 48 deletions
@@ -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();
@@ -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();
@@ -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<PortletMode, String> modeMap = new HashMap<PortletMode, String>();
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<PortletMode, String> modeMap = new HashMap<PortletMode, String>();
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<PortletMode, String> modeMap = new HashMap<PortletMode, String>();
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;
}
}