Author: wesw Date: Sun Apr 26 05:45:28 2009 New Revision: 768659 URL: http://svn.apache.org/viewvc?rev=768659&view=rev Log: WW-3090, patch from Denis Cabasson, having s:url w/o parameters refer back to called action
Added: struts/struts2/trunk/core/src/test/resources/org/apache/struts2/views/jsp/WW3090-struts.xml (with props) Modified: struts/struts2/trunk/core/src/main/java/org/apache/struts2/components/ServletUrlRenderer.java struts/struts2/trunk/core/src/test/java/org/apache/struts2/views/jsp/URLTagTest.java Modified: struts/struts2/trunk/core/src/main/java/org/apache/struts2/components/ServletUrlRenderer.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/components/ServletUrlRenderer.java?rev=768659&r1=768658&r2=768659&view=diff ============================================================================== --- struts/struts2/trunk/core/src/main/java/org/apache/struts2/components/ServletUrlRenderer.java (original) +++ struts/struts2/trunk/core/src/main/java/org/apache/struts2/components/ServletUrlRenderer.java Sun Apr 26 05:45:28 2009 @@ -69,8 +69,15 @@ } String result; + ActionInvocation ai = (ActionInvocation) ActionContext.getContext().get(ActionContext.ACTION_INVOCATION); if (urlComponent.getValue() == null && urlComponent.getAction() != null) { result = urlComponent.determineActionURL(urlComponent.getAction(), urlComponent.getNamespace(), urlComponent.getMethod(), urlComponent.getHttpServletRequest(), urlComponent.getHttpServletResponse(), urlComponent.getParameters(), scheme, urlComponent.isIncludeContext(), urlComponent.isEncode(), urlComponent.isForceAddSchemeHostAndPort(), urlComponent.isEscapeAmp()); + } else if (urlComponent.getValue() == null && urlComponent.getAction() == null && ai != null) { + // both are null, we will default to the current action + + final String action = ai.getProxy().getActionName(); + final String namespace = ai.getProxy().getNamespace(); + result = urlComponent.determineActionURL(action, namespace, urlComponent.getMethod(),urlComponent.getHttpServletRequest(), urlComponent.getHttpServletResponse(), urlComponent.getParameters(), scheme, urlComponent.isIncludeContext(), urlComponent.isEncode(), urlComponent.isForceAddSchemeHostAndPort(), urlComponent.isEscapeAmp()); } else { String _value = urlComponent.getValue(); Modified: struts/struts2/trunk/core/src/test/java/org/apache/struts2/views/jsp/URLTagTest.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/test/java/org/apache/struts2/views/jsp/URLTagTest.java?rev=768659&r1=768658&r2=768659&view=diff ============================================================================== --- struts/struts2/trunk/core/src/test/java/org/apache/struts2/views/jsp/URLTagTest.java (original) +++ struts/struts2/trunk/core/src/test/java/org/apache/struts2/views/jsp/URLTagTest.java Sun Apr 26 05:45:28 2009 @@ -21,14 +21,34 @@ package org.apache.struts2.views.jsp; +import java.io.File; +import java.io.StringWriter; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import javax.servlet.http.HttpSession; import javax.servlet.jsp.JspWriter; +import org.apache.struts2.ServletActionContext; import org.apache.struts2.components.URL; +import org.apache.struts2.dispatcher.ApplicationMap; +import org.apache.struts2.dispatcher.Dispatcher; +import org.apache.struts2.dispatcher.RequestMap; +import org.apache.struts2.dispatcher.SessionMap; +import org.apache.struts2.dispatcher.mapper.ActionMapping; +import org.apache.struts2.dispatcher.mapper.DefaultActionMapper; + +import com.mockobjects.dynamic.Mock; +import com.opensymphony.xwork2.ActionContext; +import com.opensymphony.xwork2.ActionProxy; +import com.opensymphony.xwork2.DefaultActionInvocation; +import com.opensymphony.xwork2.DefaultActionProxy; +import com.opensymphony.xwork2.DefaultActionProxyFactory; +import com.opensymphony.xwork2.config.providers.XWorkConfigurationProvider; +import com.opensymphony.xwork2.config.providers.XmlConfigurationProvider; +import com.opensymphony.xwork2.inject.Container; /** * Unit test for {...@link URLTag}. @@ -497,6 +517,107 @@ assertEquals("http://localhost/company.action", writer.toString()); } + + public void testEmptyActionCustomMapper() throws Exception { + Map<String,String> props = new HashMap<String, String>(); + props.put("config", "struts-default.xml,struts-plugin.xml,struts.xml,org/apache/struts2/views/jsp/WW3090-struts.xml"); + + this.tearDown(); + + Dispatcher du = this.initDispatcher(props); + + /** + * create our standard mock objects + */ + action = this.getAction(); + stack = ActionContext.getContext().getValueStack(); + context = stack.getContext(); + stack.push(action); + + request = new StrutsMockHttpServletRequest(); + request.setAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY, stack); + response = new StrutsMockHttpServletResponse(); + request.setSession(new StrutsMockHttpSession()); + request.setupGetServletPath("/"); + + writer = new StringWriter(); + + servletContext = new StrutsMockServletContext(); + servletContext.setRealPath(new File("nosuchfile.properties").getAbsolutePath()); + servletContext.setServletInfo("Resin"); + + pageContext = new StrutsMockPageContext(); + pageContext.setRequest(request); + pageContext.setResponse(response); + pageContext.setServletContext(servletContext); + + mockContainer = new Mock(Container.class); + + du.setConfigurationManager(configurationManager); + session = new SessionMap(request); + Map<String, Object> extraContext = du.createContextMap(new RequestMap(request), + request.getParameterMap(), + session, + new ApplicationMap(pageContext.getServletContext()), + request, + response, + pageContext.getServletContext()); + // let's not set the locale -- there is a test that checks if Dispatcher actually picks this up... + // ... but generally we want to just use no locale (let it stay system default) + extraContext.remove(ActionContext.LOCALE); + stack.getContext().putAll(extraContext); + + context.put(ServletActionContext.HTTP_REQUEST, request); + context.put(ServletActionContext.HTTP_RESPONSE, response); + context.put(ServletActionContext.SERVLET_CONTEXT, servletContext); + + ActionContext.setContext(new ActionContext(context)); + + // Make sure we have an action invocation available + ActionContext.getContext().setActionInvocation(new DefaultActionInvocation(null, true)); + DefaultActionProxyFactory apFactory = new DefaultActionProxyFactory(); + apFactory.setContainer(container); + ActionProxy ap = apFactory.createActionProxy("/", "hello", null); + ActionContext.getContext().getActionInvocation().init(ap); + + request.setScheme("http"); + request.setServerName("localhost"); + request.setServerPort(80); + + tag = new URLTag(); + tag.setPageContext(pageContext); + JspWriter jspWriter = new StrutsMockJspWriter(writer); + pageContext.setJspWriter(jspWriter); + + request.setRequestURI("/context/someAction.action"); + + tag.setAction(null); + tag.setValue(null); + tag.doStartTag(); + tag.doEndTag(); + + assertEquals("/hello.action-red", writer.toString()); + + writer = new StringWriter(); + jspWriter = new StrutsMockJspWriter(writer); + pageContext.setJspWriter(jspWriter); + + tag.doStartTag(); + tag.doEndTag(); + + assertEquals("/hello.action-blue", writer.toString()); + + writer = new StringWriter(); + jspWriter = new StrutsMockJspWriter(writer); + pageContext.setJspWriter(jspWriter); + + tag.doStartTag(); + tag.doEndTag(); + + assertEquals("/hello.action-red", writer.toString()); + + + } protected void setUp() throws Exception { super.setUp(); @@ -541,4 +662,23 @@ } + + public static class RedBlueActionMapper extends DefaultActionMapper { + + @Override + public String getUriFromActionMapping(ActionMapping mapping) { + String baseUri = super.getUriFromActionMapping(mapping); + HttpSession session = ServletActionContext.getRequest().getSession(); + if (session.getAttribute("redBlue")==null) { + // We are red + session.setAttribute("redBlue", 0); + return baseUri + "-red"; + } else { + // We are blue + session.removeAttribute("redBlue"); + return baseUri + "-blue"; + } + } + + } } Added: struts/struts2/trunk/core/src/test/resources/org/apache/struts2/views/jsp/WW3090-struts.xml URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/test/resources/org/apache/struts2/views/jsp/WW3090-struts.xml?rev=768659&view=auto ============================================================================== --- struts/struts2/trunk/core/src/test/resources/org/apache/struts2/views/jsp/WW3090-struts.xml (added) +++ struts/struts2/trunk/core/src/test/resources/org/apache/struts2/views/jsp/WW3090-struts.xml Sun Apr 26 05:45:28 2009 @@ -0,0 +1,12 @@ +<!DOCTYPE struts PUBLIC + "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" + "http://struts.apache.org/dtds/struts-2.0.dtd"> + +<struts> + + <!-- CUSTOM ACTION MAPPER --> + <bean type="org.apache.struts2.dispatcher.mapper.ActionMapper" + name="WW3090" class="org.apache.struts2.views.jsp.URLTagTest$RedBlueActionMapper" /> + <constant name="struts.mapper.class" value="WW3090" /> + +</struts> Propchange: struts/struts2/trunk/core/src/test/resources/org/apache/struts2/views/jsp/WW3090-struts.xml ------------------------------------------------------------------------------ svn:eol-style = native