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