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


Reply via email to