Author: lukaszlenart Date: Tue Apr 10 18:07:16 2012 New Revision: 1311895 URL: http://svn.apache.org/viewvc?rev=1311895&view=rev Log: WW-3795 allows specify location as a relative for result type plainText and add possibility to extend class by overriding protected methods
Modified: struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/PlainTextResult.java struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/PlainTextResultTest.java Modified: struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/PlainTextResult.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/PlainTextResult.java?rev=1311895&r1=1311894&r2=1311895&view=diff ============================================================================== --- struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/PlainTextResult.java (original) +++ struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/PlainTextResult.java Tue Apr 10 18:07:16 2012 @@ -27,6 +27,7 @@ import com.opensymphony.xwork2.util.logg import javax.servlet.ServletContext; import javax.servlet.http.HttpServletResponse; +import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.PrintWriter; @@ -112,53 +113,27 @@ public class PlainTextResult extends Str * @see org.apache.struts2.dispatcher.StrutsResultSupport#doExecute(java.lang.String, com.opensymphony.xwork2.ActionInvocation) */ protected void doExecute(String finalLocation, ActionInvocation invocation) throws Exception { - // verify charset - Charset charset = null; - if (charSet != null) { - if (Charset.isSupported(charSet)) { - charset = Charset.forName(charSet); - } - else { - if (LOG.isWarnEnabled()) { - LOG.warn("charset ["+charSet+"] is not recognized "); - } - charset = null; - } - } + Charset charset = readCharset(); HttpServletResponse response = (HttpServletResponse) invocation.getInvocationContext().get(HTTP_RESPONSE); - ServletContext servletContext = (ServletContext) invocation.getInvocationContext().get(SERVLET_CONTEXT); - - - if (charset != null) { - response.setContentType("text/plain; charset="+charSet); - } - else { - response.setContentType("text/plain"); - } - response.setHeader("Content-Disposition", "inline"); + applyCharset(charset, response); + applyAdditionalHeaders(response); + String location = adjustLocation(finalLocation); PrintWriter writer = response.getWriter(); InputStreamReader reader = null; try { - InputStream resourceAsStream = servletContext.getResourceAsStream(finalLocation); + InputStream resourceAsStream = readStream(invocation, location); + logWrongStream(finalLocation, resourceAsStream); if (charset != null) { reader = new InputStreamReader(resourceAsStream, charset); } else { reader = new InputStreamReader(resourceAsStream); } - if (resourceAsStream == null) { - if (LOG.isWarnEnabled()) { - LOG.warn("resource at location ["+finalLocation+"] cannot be obtained (return null) from ServletContext !!! "); - } - } else { - char[] buffer = new char[BUFFER_SIZE]; - int charRead; - while((charRead = reader.read(buffer)) != -1) { - writer.write(buffer, 0, charRead); - } + if (resourceAsStream != null) { + sendStream(writer, reader); } } finally { if (reader != null) @@ -169,4 +144,60 @@ public class PlainTextResult extends Str } } } + + protected InputStream readStream(ActionInvocation invocation, String location) { + ServletContext servletContext = (ServletContext) invocation.getInvocationContext().get(SERVLET_CONTEXT); + return servletContext.getResourceAsStream(location); + } + + protected void logWrongStream(String finalLocation, InputStream resourceAsStream) { + if (resourceAsStream == null) { + if (LOG.isWarnEnabled()) { + LOG.warn("Resource at location [" + finalLocation + "] cannot be obtained (return null) from ServletContext !!! "); + } + } + } + + protected void sendStream(PrintWriter writer, InputStreamReader reader) throws IOException { + char[] buffer = new char[BUFFER_SIZE]; + int charRead; + while((charRead = reader.read(buffer)) != -1) { + writer.write(buffer, 0, charRead); + } + } + + protected String adjustLocation(String location) { + if (location.charAt(0) != '/') { + return "/" + location; + } + return location; + } + + protected void applyAdditionalHeaders(HttpServletResponse response) { + response.setHeader("Content-Disposition", "inline"); + } + + protected void applyCharset(Charset charset, HttpServletResponse response) { + if (charset != null) { + response.setContentType("text/plain; charset=" + charSet); + } else { + response.setContentType("text/plain"); + } + } + + protected Charset readCharset() { + Charset charset = null; + if (charSet != null) { + if (Charset.isSupported(charSet)) { + charset = Charset.forName(charSet); + } else { + if (LOG.isWarnEnabled()) { + LOG.warn("charset [" + charSet + "] is not recognized "); + } + charset = null; + } + } + return charset; + } + } Modified: struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/PlainTextResultTest.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/PlainTextResultTest.java?rev=1311895&r1=1311894&r2=1311895&view=diff ============================================================================== --- struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/PlainTextResultTest.java (original) +++ struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/PlainTextResultTest.java Tue Apr 10 18:07:16 2012 @@ -21,23 +21,19 @@ package org.apache.struts2.dispatcher; -import java.io.InputStream; -import java.io.PrintWriter; -import java.io.StringWriter; - -import junit.framework.TestCase; - +import com.opensymphony.xwork2.ActionContext; +import com.opensymphony.xwork2.mock.MockActionInvocation; +import com.opensymphony.xwork2.util.ClassLoaderUtil; +import com.opensymphony.xwork2.util.ValueStack; import org.apache.struts2.StrutsStatics; import org.apache.struts2.StrutsTestCase; import org.apache.struts2.views.jsp.AbstractUITagTest; import org.apache.struts2.views.jsp.StrutsMockHttpServletResponse; import org.apache.struts2.views.jsp.StrutsMockServletContext; -import com.opensymphony.xwork2.util.ClassLoaderUtil; -import com.opensymphony.xwork2.util.ValueStackFactory; -import com.opensymphony.xwork2.ActionContext; -import com.opensymphony.xwork2.mock.MockActionInvocation; -import com.opensymphony.xwork2.util.ValueStack; +import java.io.InputStream; +import java.io.PrintWriter; +import java.io.StringWriter; /** * Test case for PlainTextResult. @@ -80,6 +76,29 @@ public class PlainTextResultTest extends } } + public void testPlainTextWithoutSlash() throws Exception { + PlainTextResult result = new PlainTextResult(); + result.setLocation("someJspFile.jsp"); + + response.setExpectedContentType("text/plain"); + response.setExpectedHeader("Content-Disposition", "inline"); + InputStream jspResourceInputStream = + ClassLoaderUtil.getResourceAsStream("org/apache/struts2/dispatcher/someJspFile.jsp", PlainTextResultTest.class); + + + try { + servletContext.setResourceAsStream(jspResourceInputStream); + result.execute(invocation); + + String r = AbstractUITagTest.normalize(stringWriter.getBuffer().toString(), true); + String e = AbstractUITagTest.normalize(readAsString("org/apache/struts2/dispatcher/someJspFile.jsp"), true); + assertEquals(r, e); + } + finally { + jspResourceInputStream.close(); + } + } + public void testPlainTextWithEncoding() throws Exception { PlainTextResult result = new PlainTextResult(); result.setLocation("/someJspFile.jsp");