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");


Reply via email to