Author: mrdon Date: Wed Dec 27 16:55:27 2006 New Revision: 490622 URL: http://svn.apache.org/viewvc?view=rev&rev=490622 Log: Fix the redirect predirect prefix in the default action mapper WW-1571
Modified: struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapper.java struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapperTest.java struts/struts2/trunk/core/src/test/java/org/apache/struts2/views/jsp/StrutsMockHttpServletResponse.java Modified: struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapper.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapper.java?view=diff&rev=490622&r1=490621&r2=490622 ============================================================================== --- struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapper.java (original) +++ struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapper.java Wed Dec 27 16:55:27 2006 @@ -39,6 +39,7 @@ import com.opensymphony.xwork2.config.ConfigurationManager; import com.opensymphony.xwork2.config.entities.PackageConfig; import com.opensymphony.xwork2.inject.Inject; +import com.opensymphony.xwork2.inject.Container; /** * <!-- START SNIPPET: javadoc --> @@ -177,6 +178,8 @@ List extensions = new ArrayList() {{ add("action");}}; + private Container container; + public DefaultActionMapper() { prefixTrie = new PrefixTrie() { { @@ -206,6 +209,7 @@ put(REDIRECT_PREFIX, new ParameterAction() { public void execute(String key, ActionMapping mapping) { ServletRedirectResult redirect = new ServletRedirectResult(); + container.inject(redirect); redirect.setLocation(key.substring(REDIRECT_PREFIX .length())); mapping.setResult(redirect); @@ -217,6 +221,7 @@ String location = key.substring(REDIRECT_ACTION_PREFIX .length()); ServletRedirectResult redirect = new ServletRedirectResult(); + container.inject(redirect); String extension = getDefaultExtension(); if (extension != null) { location += "." + extension; @@ -237,6 +242,11 @@ @Inject(StrutsConstants.STRUTS_ENABLE_SLASHES_IN_ACTION_NAMES) public void setSlashesInActionNames(String allow) { allowSlashesInActionNames = "true".equals(allow); + } + + @Inject + public void setContainer(Container container) { + this.container = container; } /* Modified: struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapperTest.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapperTest.java?view=diff&rev=490622&r1=490621&r2=490622 ============================================================================== --- struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapperTest.java (original) +++ struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapperTest.java Wed Dec 27 16:55:27 2006 @@ -25,16 +25,24 @@ import org.apache.struts2.StrutsConstants; import org.apache.struts2.StrutsTestCase; +import org.apache.struts2.ServletActionContext; import org.apache.struts2.dispatcher.ServletRedirectResult; import org.apache.struts2.views.jsp.StrutsMockHttpServletRequest; +import org.apache.struts2.views.jsp.StrutsMockHttpServletResponse; import com.mockobjects.servlet.MockHttpServletRequest; +import com.mockobjects.dynamic.Mock; import com.opensymphony.xwork2.Result; +import com.opensymphony.xwork2.DefaultActionInvocation; +import com.opensymphony.xwork2.ActionInvocation; +import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.config.Configuration; import com.opensymphony.xwork2.config.ConfigurationManager; import com.opensymphony.xwork2.config.entities.PackageConfig; import com.opensymphony.xwork2.config.impl.DefaultConfiguration; +import javax.servlet.http.HttpServletResponse; + /** * DefaultActionMapper test case. * @@ -273,19 +281,30 @@ public void testRedirectPrefix() throws Exception { Map parameterMap = new HashMap(); - parameterMap.put(DefaultActionMapper.REDIRECT_PREFIX + "www.google.com", ""); + parameterMap.put(DefaultActionMapper.REDIRECT_PREFIX + "http://www.google.com", ""); StrutsMockHttpServletRequest request = new StrutsMockHttpServletRequest(); request.setupGetServletPath("/someServletPath.action"); request.setParameterMap(parameterMap); DefaultActionMapper defaultActionMapper = new DefaultActionMapper(); + defaultActionMapper.setContainer(container); ActionMapping actionMapping = defaultActionMapper.getMapping(request, configManager); Result result = actionMapping.getResult(); assertNotNull(result); assertTrue(result instanceof ServletRedirectResult); + Mock invMock = new Mock(ActionInvocation.class); + ActionInvocation inv = (ActionInvocation) invMock.proxy(); + ActionContext ctx = ActionContext.getContext(); + ctx.put(ServletActionContext.HTTP_REQUEST, request); + StrutsMockHttpServletResponse response = new StrutsMockHttpServletResponse(); + ctx.put(ServletActionContext.HTTP_RESPONSE, response); + invMock.expectAndReturn("getInvocationContext", ctx); + invMock.expectAndReturn("getStack", ctx.getValueStack()); + result.execute(inv); + assertEquals("http://www.google.com", response.getRedirectURL()); //TODO: need to test location but there's noaccess to the property/method, unless we use reflection } Modified: struts/struts2/trunk/core/src/test/java/org/apache/struts2/views/jsp/StrutsMockHttpServletResponse.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/test/java/org/apache/struts2/views/jsp/StrutsMockHttpServletResponse.java?view=diff&rev=490622&r1=490621&r2=490622 ============================================================================== --- struts/struts2/trunk/core/src/test/java/org/apache/struts2/views/jsp/StrutsMockHttpServletResponse.java (original) +++ struts/struts2/trunk/core/src/test/java/org/apache/struts2/views/jsp/StrutsMockHttpServletResponse.java Wed Dec 27 16:55:27 2006 @@ -35,6 +35,8 @@ public class StrutsMockHttpServletResponse extends MockHttpServletResponse { private Locale locale; private PrintWriter writer; + private int status; + private String redirectURL; public Locale getLocale() { return locale; @@ -44,6 +46,10 @@ this.locale = locale; } + public String getContentType() { + return null; //To change body of implemented methods use File | Settings | File Templates. + } + public PrintWriter getWriter() throws IOException { if (writer == null) return new PrintWriter(new ByteArrayOutputStream()); @@ -51,6 +57,10 @@ return writer; } + public void setCharacterEncoding(String string) { + //To change body of implemented methods use File | Settings | File Templates. + } + public void setWriter(PrintWriter writer) { this.writer = writer; } @@ -59,7 +69,30 @@ return s; } + public String encodeRedirectURL(String s) { + return s; + } + public String encodeUrl(String s) { return s; + } + + public void setStatus(int i) { + this.status = i; + super.setStatus(i); + } + + public int getStatus() { + return status; + } + + + public String getRedirectURL() { + return redirectURL; + } + + public void sendRedirect(String redirectURL) throws IOException { + this.redirectURL = redirectURL; + super.sendRedirect(redirectURL); } }