You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2012/11/17 00:56:13 UTC

svn commit: r1410632 - in /tomcat/trunk: java/org/apache/jasper/tagplugins/jstl/Util.java java/org/apache/jasper/tagplugins/jstl/core/Out.java test/org/apache/jasper/tagplugins/jstl/core/TestOut.java test/webapp-3.0/bug54144.jsp

Author: markt
Date: Fri Nov 16 23:56:12 2012
New Revision: 1410632

URL: http://svn.apache.org/viewvc?rev=1410632&view=rev
Log:
Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=54144
Add required behaviour for Reader objects when used with c:out

Modified:
    tomcat/trunk/java/org/apache/jasper/tagplugins/jstl/Util.java
    tomcat/trunk/java/org/apache/jasper/tagplugins/jstl/core/Out.java
    tomcat/trunk/test/org/apache/jasper/tagplugins/jstl/core/TestOut.java
    tomcat/trunk/test/webapp-3.0/bug54144.jsp

Modified: tomcat/trunk/java/org/apache/jasper/tagplugins/jstl/Util.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/jasper/tagplugins/jstl/Util.java?rev=1410632&r1=1410631&r2=1410632&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/jasper/tagplugins/jstl/Util.java (original)
+++ tomcat/trunk/java/org/apache/jasper/tagplugins/jstl/Util.java Fri Nov 16 23:56:12 2012
@@ -179,11 +179,18 @@ public class Util {
      *
      * taken from org.apache.taglibs.standard.tag.common.core.Util
      */
-    @SuppressWarnings("null") // escapedBuffer cannot be null
     public static String escapeXml(String buffer) {
+        String result = escapeXml(buffer.toCharArray(), buffer.length());
+        if (result == null) {
+            return buffer;
+        } else {
+            return result;
+        }
+    }
+
+    @SuppressWarnings("null") // escapedBuffer cannot be null
+    public static String escapeXml(char[] arrayBuffer, int length) {
         int start = 0;
-        int length = buffer.length();
-        char[] arrayBuffer = buffer.toCharArray();
         StringBuilder escapedBuffer = null;
 
         for (int i = 0; i < length; i++) {
@@ -207,7 +214,7 @@ public class Util {
         }
         // no xml escaping was necessary
         if (start == 0) {
-            return buffer;
+            return null;
         }
         // add rest of unescaped portion
         if (start < length) {

Modified: tomcat/trunk/java/org/apache/jasper/tagplugins/jstl/core/Out.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/jasper/tagplugins/jstl/core/Out.java?rev=1410632&r1=1410631&r2=1410632&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/jasper/tagplugins/jstl/core/Out.java (original)
+++ tomcat/trunk/java/org/apache/jasper/tagplugins/jstl/core/Out.java Fri Nov 16 23:56:12 2012
@@ -19,11 +19,13 @@
 package org.apache.jasper.tagplugins.jstl.core;
 
 import java.io.IOException;
+import java.io.Reader;
 
 import javax.servlet.jsp.JspWriter;
 
 import org.apache.jasper.compiler.tagplugin.TagPlugin;
 import org.apache.jasper.compiler.tagplugin.TagPluginContext;
+import org.apache.jasper.tagplugins.jstl.Util;
 
 
 public final class Out implements TagPlugin {
@@ -39,24 +41,26 @@ public final class Out implements TagPlu
 
         //strValName, strEscapeXmlName & strDefName are two variables' name
         //standing for value, escapeXml and default attribute
+        String strObjectName = ctxt.getTemporaryVariableName();
         String strValName = ctxt.getTemporaryVariableName();
         String strDefName = ctxt.getTemporaryVariableName();
         String strEscapeXmlName = ctxt.getTemporaryVariableName();
         String strSkipBodyName = ctxt.getTemporaryVariableName();
 
         //according to the tag file, the value attribute is mandatory.
-        ctxt.generateJavaSource("String " + strValName + " = null;");
-        ctxt.generateJavaSource("if(");
+        ctxt.generateJavaSource("Object " + strObjectName + "=");
         ctxt.generateAttribute("value");
-        ctxt.generateJavaSource("!=null){");
-        ctxt.generateJavaSource("    " + strValName + " = (");
-        ctxt.generateAttribute("value");
-        ctxt.generateJavaSource(").toString();");
+        ctxt.generateJavaSource(";");
+        ctxt.generateJavaSource("String " + strValName + "=null;");
+        ctxt.generateJavaSource("if(!(" + strObjectName +
+                " instanceof Reader) && "+ strObjectName + " != null){");
+        ctxt.generateJavaSource(
+                strValName + " = " + strObjectName + ".toString();");
         ctxt.generateJavaSource("}");
 
         //initiate the strDefName with null.
         //if the default has been specified, then assign the value to it;
-        ctxt.generateJavaSource("String " + strDefName + " = null;\n");
+        ctxt.generateJavaSource("String " + strDefName + " = null;");
         if(hasDefault){
             ctxt.generateJavaSource("if(");
             ctxt.generateAttribute("default");
@@ -80,24 +84,45 @@ public final class Out implements TagPlu
         ctxt.generateJavaSource(
                 "boolean " + strSkipBodyName + " = " +
                 "org.apache.jasper.tagplugins.jstl.core.Out.output(out, " +
-                strValName + ", " + strDefName + ", " + strEscapeXmlName +
-                ");");
+                strObjectName + ", " + strValName + ", " + strDefName + ", " +
+                strEscapeXmlName + ");");
         ctxt.generateJavaSource("if(!" + strSkipBodyName + ") {");
         ctxt.generateBody();
         ctxt.generateJavaSource("}");
     }
 
-    public static boolean output(JspWriter out, String value, String defaultValue,
-            boolean escapeXml) throws IOException {
-        String v = value != null ? value : defaultValue;
-        if (v != null) {
-            if(escapeXml){
-                v = org.apache.jasper.tagplugins.jstl.Util.escapeXml(v);
+    public static boolean output(JspWriter out, Object input, String value,
+            String defaultValue, boolean escapeXml) throws IOException {
+        if (input instanceof Reader) {
+            char[] buffer = new char[8096];
+            int read = 0;
+            while (read != -1) {
+                read = ((Reader) input).read(buffer);
+                if (read != -1) {
+                    if (escapeXml) {
+                        String escaped = Util.escapeXml(buffer, read);
+                        if (escaped == null) {
+                            out.write(buffer, 0, read);
+                        } else {
+                            out.print(escaped);
+                        }
+                    } else {
+                        out.write(buffer, 0, read);
+                    }
+                }
             }
-            out.write(v);
             return true;
         } else {
-            return false;
+            String v = value != null ? value : defaultValue;
+            if (v != null) {
+                if(escapeXml){
+                    v = Util.escapeXml(v);
+                }
+                out.write(v);
+                return true;
+            } else {
+                return false;
+            }
         }
     }
 }

Modified: tomcat/trunk/test/org/apache/jasper/tagplugins/jstl/core/TestOut.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/jasper/tagplugins/jstl/core/TestOut.java?rev=1410632&r1=1410631&r2=1410632&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/jasper/tagplugins/jstl/core/TestOut.java (original)
+++ tomcat/trunk/test/org/apache/jasper/tagplugins/jstl/core/TestOut.java Fri Nov 16 23:56:12 2012
@@ -52,6 +52,7 @@ public class TestOut extends AbstractTes
         Assert.assertTrue(body.contains("OK - 1"));
         Assert.assertTrue(body.contains("OK - 2"));
         Assert.assertTrue(body.contains("OK - 3"));
+        Assert.assertTrue(body.contains("OK - 4"));
         Assert.assertFalse(body.contains("FAIL"));
     }
 }

Modified: tomcat/trunk/test/webapp-3.0/bug54144.jsp
URL: http://svn.apache.org/viewvc/tomcat/trunk/test/webapp-3.0/bug54144.jsp?rev=1410632&r1=1410631&r2=1410632&view=diff
==============================================================================
--- tomcat/trunk/test/webapp-3.0/bug54144.jsp (original)
+++ tomcat/trunk/test/webapp-3.0/bug54144.jsp Fri Nov 16 23:56:12 2012
@@ -15,12 +15,21 @@
   limitations under the License.
 --%>
 <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
-         pageEncoding="ISO-8859-1" session="false"%>
+         pageEncoding="ISO-8859-1" session="true"
+         import="java.io.Reader,java.io.StringReader"%>
 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
 <html>
   <body>
-    <p><c:out value="${session.doesNotExist}">OK - 1</c:out></p>
-    <p><c:out value="${session.doesNotExist}">${'OK - '}${1+1}</c:out></p>
+    <!-- Use of body as default value -->
+    <p><c:out value="${sessionScope.doesNotExist}">OK - 1</c:out></p>
+    <p><c:out value="${sessionScope.doesNotExist}">${'OK - '}${1+1}</c:out></p>
     <p><c:out value="${'OK - '}${1+1+1}">FAIL</c:out></p>
+
+    <!-- Special handling for Reader objects -->
+    <%
+    Reader r = new StringReader("OK - 4");
+    session.setAttribute("reader", r);
+    %>
+    <p><c:out value="${sessionScope.reader}" /></p>
   </body>
 </html>
\ No newline at end of file



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org