Author: nilsga Date: Sun Dec 7 11:32:45 2008 New Revision: 724182 URL: http://svn.apache.org/viewvc?rev=724182&view=rev Log: WW-2862 Added pass through to servlet renderer when specified or not in a portlet context.
Modified: struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/components/PortletUrlRenderer.java struts/struts2/trunk/plugins/portlet/src/test/java/org/apache/struts2/components/PortletUrlRendererTest.java Modified: struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/components/PortletUrlRenderer.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/components/PortletUrlRenderer.java?rev=724182&r1=724181&r2=724182&view=diff ============================================================================== --- struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/components/PortletUrlRenderer.java (original) +++ struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/components/PortletUrlRenderer.java Sun Dec 7 11:32:45 2008 @@ -25,6 +25,7 @@ import java.io.Writer; import org.apache.struts2.StrutsException; +import org.apache.struts2.portlet.context.PortletActionContext; import org.apache.struts2.portlet.util.PortletUrlHelper; import com.opensymphony.xwork2.ActionContext; @@ -40,47 +41,61 @@ public class PortletUrlRenderer implements UrlRenderer { /** + * The servlet renderer used when not executing in a portlet context. + */ + private UrlRenderer servletRenderer = null; + + public PortletUrlRenderer() { + this.servletRenderer = new ServletUrlRenderer(); + } + + /** * [EMAIL PROTECTED] */ public void renderUrl(Writer writer, URL urlComponent) { - String action = null; - if(urlComponent.action != null) { - action = urlComponent.findString(urlComponent.action); + if(PortletActionContext.getPortletContext() == null || "none".equalsIgnoreCase(urlComponent.portletUrlType)) { + servletRenderer.renderUrl(writer, urlComponent); } - String scheme = urlComponent.req.getScheme(); - - if (urlComponent.scheme != null) { - scheme = urlComponent.scheme; + else { + String action = null; + if(urlComponent.action != null) { + action = urlComponent.findString(urlComponent.action); + } + String scheme = urlComponent.req.getScheme(); + + if (urlComponent.scheme != null) { + scheme = urlComponent.scheme; + } + + String result; + urlComponent.namespace = urlComponent.determineNamespace(urlComponent.namespace, urlComponent.stack, urlComponent.req); + if (onlyActionSpecified(urlComponent)) { + 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); + } + else { + result = createDefaultUrl(urlComponent); + } + if ( urlComponent.anchor != null && urlComponent.anchor.length() > 0 ) { + result += '#' + urlComponent.findString(urlComponent.anchor); + } + + String var = urlComponent.getVar(); + + if (var != null) { + urlComponent.putInContext(result); + + // add to the request and page scopes as well + urlComponent.req.setAttribute(var, result); + } else { + try { + writer.write(result); + } catch (IOException e) { + throw new StrutsException("IOError: " + e.getMessage(), e); + } + } } - - String result; - urlComponent.namespace = urlComponent.determineNamespace(urlComponent.namespace, urlComponent.stack, urlComponent.req); - if (onlyActionSpecified(urlComponent)) { - 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); - } - else { - result = createDefaultUrl(urlComponent); - } - if ( urlComponent.anchor != null && urlComponent.anchor.length() > 0 ) { - result += '#' + urlComponent.findString(urlComponent.anchor); - } - - String var = urlComponent.getVar(); - - if (var != null) { - urlComponent.putInContext(result); - - // add to the request and page scopes as well - urlComponent.req.setAttribute(var, result); - } else { - try { - writer.write(result); - } catch (IOException e) { - throw new StrutsException("IOError: " + e.getMessage(), e); - } - } } private String createDefaultUrl(URL urlComponent) { @@ -104,47 +119,59 @@ * [EMAIL PROTECTED] */ public void renderFormUrl(Form formComponent) { - String namespace = formComponent.determineNamespace(formComponent.namespace, formComponent.getStack(), - formComponent.request); - String action = null; - if (formComponent.action != null) { - action = formComponent.findString(formComponent.action); - } - else { - ActionInvocation ai = (ActionInvocation) formComponent.getStack().getContext().get(ActionContext.ACTION_INVOCATION); - action = ai.getProxy().getActionName(); - } - String type = "action"; - if (TextUtils.stringSet(formComponent.method)) { - if ("GET".equalsIgnoreCase(formComponent.method.trim())) { - type = "render"; - } - } - if (action != null) { - String result = PortletUrlHelper.buildUrl(action, namespace, null, - formComponent.getParameters(), type, formComponent.portletMode, formComponent.windowState); - formComponent.addParameter("action", result); - - - // name/id: cut out anything between / and . should be the id and - // name - String id = formComponent.getId(); - if (id == null) { - int slash = action.lastIndexOf('/'); - int dot = action.indexOf('.', slash); - if (dot != -1) { - id = action.substring(slash + 1, dot); - } else { - id = action.substring(slash + 1); - } - formComponent.addParameter("id", formComponent.escape(id)); - } - } - + if(PortletActionContext.getPortletContext() == null) { + servletRenderer.renderFormUrl(formComponent); + } + else { + String namespace = formComponent.determineNamespace(formComponent.namespace, formComponent.getStack(), + formComponent.request); + String action = null; + if (formComponent.action != null) { + action = formComponent.findString(formComponent.action); + } + else { + ActionInvocation ai = (ActionInvocation) formComponent.getStack().getContext().get(ActionContext.ACTION_INVOCATION); + action = ai.getProxy().getActionName(); + } + String type = "action"; + if (TextUtils.stringSet(formComponent.method)) { + if ("GET".equalsIgnoreCase(formComponent.method.trim())) { + type = "render"; + } + } + if (action != null) { + String result = PortletUrlHelper.buildUrl(action, namespace, null, + formComponent.getParameters(), type, formComponent.portletMode, formComponent.windowState); + formComponent.addParameter("action", result); + + + // name/id: cut out anything between / and . should be the id and + // name + String id = formComponent.getId(); + if (id == null) { + int slash = action.lastIndexOf('/'); + int dot = action.indexOf('.', slash); + if (dot != -1) { + id = action.substring(slash + 1, dot); + } else { + id = action.substring(slash + 1); + } + formComponent.addParameter("id", formComponent.escape(id)); + } + } + } } public void beforeRenderUrl(URL urlComponent) { + if(PortletActionContext.getPortletContext() == null) { + servletRenderer.beforeRenderUrl(urlComponent); + } + } + + public void setServletRenderer(UrlRenderer nonPortletRenderer) { + this.servletRenderer = nonPortletRenderer; + } } Modified: struts/struts2/trunk/plugins/portlet/src/test/java/org/apache/struts2/components/PortletUrlRendererTest.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/portlet/src/test/java/org/apache/struts2/components/PortletUrlRendererTest.java?rev=724182&r1=724181&r2=724182&view=diff ============================================================================== --- struts/struts2/trunk/plugins/portlet/src/test/java/org/apache/struts2/components/PortletUrlRendererTest.java (original) +++ struts/struts2/trunk/plugins/portlet/src/test/java/org/apache/struts2/components/PortletUrlRendererTest.java Sun Dec 7 11:32:45 2008 @@ -21,18 +21,24 @@ package org.apache.struts2.components; +import java.io.IOException; import java.io.StringWriter; +import java.io.Writer; import java.util.HashMap; import java.util.Map; import javax.portlet.PortletMode; import javax.portlet.PortletURL; +import org.apache.struts2.StrutsStatics; import org.apache.struts2.StrutsTestCase; import org.apache.struts2.portlet.PortletActionConstants; +import org.apache.struts2.portlet.context.PortletActionContext; import org.apache.struts2.portlet.servlet.PortletServletRequest; import org.apache.struts2.portlet.servlet.PortletServletResponse; +import org.easymock.EasyMock; import org.springframework.mock.web.portlet.MockPortalContext; +import org.springframework.mock.web.portlet.MockPortletContext; import org.springframework.mock.web.portlet.MockPortletURL; import org.springframework.mock.web.portlet.MockRenderRequest; import org.springframework.mock.web.portlet.MockRenderResponse; @@ -49,12 +55,14 @@ MockPortletURL actionUrl; MockRenderRequest request; MockRenderResponse response; + MockPortletContext context; ActionContext ctx; ValueStack stack; public void setUp() throws Exception { super.setUp(); renderer = new PortletUrlRenderer(); + context = new MockPortletContext(); renderUrl = new MockPortletURL( new MockPortalContext(), "render"); actionUrl = new MockPortletURL( @@ -76,6 +84,7 @@ PortletActionConstants.RENDER_PHASE); ctx.put(PortletActionConstants.REQUEST, request); ctx.put(PortletActionConstants.RESPONSE, response); + ctx.put(StrutsStatics.STRUTS_PORTLET_CONTEXT, context); Map<PortletMode, String> modeMap = new HashMap<PortletMode, String>(); modeMap.put(PortletMode.VIEW, "/view"); @@ -185,6 +194,41 @@ } + public void testShouldPassThroughRenderUrlToServletUrlRendererIfNotPortletRequest() throws Exception { + UrlRenderer mockRenderer = EasyMock.createMock(UrlRenderer.class); + ActionContext.getContext().put(StrutsStatics.STRUTS_PORTLET_CONTEXT, null); + renderer.setServletRenderer(mockRenderer); + URL url = new URL(stack, new PortletServletRequest(request, null), new PortletServletResponse(response)); + StringWriter renderOutput = new StringWriter(); + mockRenderer.renderUrl(renderOutput, url); + EasyMock.replay(mockRenderer); + renderer.renderUrl(renderOutput, url); + EasyMock.verify(mockRenderer); + } + + public void testShouldPassThroughRenderFormUrlToServletUrlRendererIfNotPortletRequest() throws Exception { + UrlRenderer mockRenderer = EasyMock.createMock(UrlRenderer.class); + ActionContext.getContext().put(StrutsStatics.STRUTS_PORTLET_CONTEXT, null); + renderer.setServletRenderer(mockRenderer); + Form form = new Form(stack, new PortletServletRequest(request, null), new PortletServletResponse(response)); + mockRenderer.renderFormUrl(form); + EasyMock.replay(mockRenderer); + renderer.renderFormUrl(form); + EasyMock.verify(mockRenderer); + } + + public void testShouldPassThroughRenderUrlToServletUrlRendererWhenPortletUrlTypeIsNone() throws Exception { + UrlRenderer mockRenderer = EasyMock.createMock(UrlRenderer.class); + renderer.setServletRenderer(mockRenderer); + URL url = new URL(stack, new PortletServletRequest(request, null), new PortletServletResponse(response)); + url.setPortletUrlType("none"); + StringWriter renderOutput = new StringWriter(); + mockRenderer.renderUrl(renderOutput, url); + EasyMock.replay(mockRenderer); + renderer.renderUrl(renderOutput, url); + EasyMock.verify(mockRenderer); + } + private final static class TestObject { public String someProperty; }