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-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org