Modified: tomcat/tc6.0.x/trunk/java/org/apache/el/parser/Token.java URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/el/parser/Token.java?rev=899148&r1=899147&r2=899148&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/java/org/apache/el/parser/Token.java (original) +++ tomcat/tc6.0.x/trunk/java/org/apache/el/parser/Token.java Thu Jan 14 10:27:15 2010 @@ -1,12 +1,19 @@ -/* Generated By:JavaCC: Do not edit this line. Token.java Version 4.1 */ -/* JavaCCOptions:TOKEN_EXTENDS=,KEEP_LINE_COL=null */ +/* Generated By:JavaCC: Do not edit this line. Token.java Version 5.0 */ +/* JavaCCOptions:TOKEN_EXTENDS=,KEEP_LINE_COL=null,SUPPORT_CLASS_VISIBILITY_PUBLIC=true */ package org.apache.el.parser; /** * Describes the input token stream. */ -public class Token { +public class Token implements java.io.Serializable { + + /** + * The version identifier for this Serializable class. + * Increment only if the <i>serialized</i> form of the + * class changes. + */ + private static final long serialVersionUID = 1L; /** * An integer that describes the kind of this token. This numbering @@ -75,7 +82,7 @@ */ public Token(int kind) { - this(kind, null); + this(kind, null); } /** @@ -83,8 +90,8 @@ */ public Token(int kind, String image) { - this.kind = kind; - this.image = image; + this.kind = kind; + this.image = image; } /** @@ -92,7 +99,7 @@ */ public String toString() { - return image; + return image; } /** @@ -109,16 +116,16 @@ */ public static Token newToken(int ofKind, String image) { - switch(ofKind) - { - default : return new Token(ofKind, image); - } + switch(ofKind) + { + default : return new Token(ofKind, image); + } } public static Token newToken(int ofKind) { - return newToken(ofKind, null); + return newToken(ofKind, null); } } -/* JavaCC - OriginalChecksum=384f0c8d72f06824f8ad2f5b33eb5e59 (do not edit this line) */ +/* JavaCC - OriginalChecksum=30123d1b46e789463a75610c8e254dce (do not edit this line) */
Modified: tomcat/tc6.0.x/trunk/java/org/apache/el/parser/TokenMgrError.java URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/el/parser/TokenMgrError.java?rev=899148&r1=899147&r2=899148&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/java/org/apache/el/parser/TokenMgrError.java (original) +++ tomcat/tc6.0.x/trunk/java/org/apache/el/parser/TokenMgrError.java Thu Jan 14 10:27:15 2010 @@ -1,4 +1,4 @@ -/* Generated By:JavaCC: Do not edit this line. TokenMgrError.java Version 4.1 */ +/* Generated By:JavaCC: Do not edit this line. TokenMgrError.java Version 5.0 */ /* JavaCCOptions: */ package org.apache.el.parser; @@ -6,135 +6,142 @@ public class TokenMgrError extends Error { - /* - * Ordinals for various reasons why an Error of this type can be thrown. - */ - - /** - * Lexical error occurred. - */ - static final int LEXICAL_ERROR = 0; - - /** - * An attempt was made to create a second instance of a static token manager. - */ - static final int STATIC_LEXER_ERROR = 1; - - /** - * Tried to change to an invalid lexical state. - */ - static final int INVALID_LEXICAL_STATE = 2; - - /** - * Detected (and bailed out of) an infinite loop in the token manager. - */ - static final int LOOP_DETECTED = 3; - - /** - * Indicates the reason why the exception is thrown. It will have - * one of the above 4 values. - */ - int errorCode; - - /** - * Replaces unprintable characters by their escaped (or unicode escaped) - * equivalents in the given string - */ - protected static final String addEscapes(String str) { - StringBuffer retval = new StringBuffer(); - char ch; - for (int i = 0; i < str.length(); i++) { - switch (str.charAt(i)) - { - case 0 : - continue; - case '\b': - retval.append("\\b"); - continue; - case '\t': - retval.append("\\t"); - continue; - case '\n': - retval.append("\\n"); - continue; - case '\f': - retval.append("\\f"); - continue; - case '\r': - retval.append("\\r"); - continue; - case '\"': - retval.append("\\\""); - continue; - case '\'': - retval.append("\\\'"); - continue; - case '\\': - retval.append("\\\\"); - continue; - default: - if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) { - String s = "0000" + Integer.toString(ch, 16); - retval.append("\\u" + s.substring(s.length() - 4, s.length())); - } else { - retval.append(ch); - } - continue; - } + /** + * The version identifier for this Serializable class. + * Increment only if the <i>serialized</i> form of the + * class changes. + */ + private static final long serialVersionUID = 1L; + + /* + * Ordinals for various reasons why an Error of this type can be thrown. + */ + + /** + * Lexical error occurred. + */ + static final int LEXICAL_ERROR = 0; + + /** + * An attempt was made to create a second instance of a static token manager. + */ + static final int STATIC_LEXER_ERROR = 1; + + /** + * Tried to change to an invalid lexical state. + */ + static final int INVALID_LEXICAL_STATE = 2; + + /** + * Detected (and bailed out of) an infinite loop in the token manager. + */ + static final int LOOP_DETECTED = 3; + + /** + * Indicates the reason why the exception is thrown. It will have + * one of the above 4 values. + */ + int errorCode; + + /** + * Replaces unprintable characters by their escaped (or unicode escaped) + * equivalents in the given string + */ + protected static final String addEscapes(String str) { + StringBuffer retval = new StringBuffer(); + char ch; + for (int i = 0; i < str.length(); i++) { + switch (str.charAt(i)) + { + case 0 : + continue; + case '\b': + retval.append("\\b"); + continue; + case '\t': + retval.append("\\t"); + continue; + case '\n': + retval.append("\\n"); + continue; + case '\f': + retval.append("\\f"); + continue; + case '\r': + retval.append("\\r"); + continue; + case '\"': + retval.append("\\\""); + continue; + case '\'': + retval.append("\\\'"); + continue; + case '\\': + retval.append("\\\\"); + continue; + default: + if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) { + String s = "0000" + Integer.toString(ch, 16); + retval.append("\\u" + s.substring(s.length() - 4, s.length())); + } else { + retval.append(ch); + } + continue; } - return retval.toString(); - } - - /** - * Returns a detailed message for the Error when it is thrown by the - * token manager to indicate a lexical error. - * Parameters : - * EOFSeen : indicates if EOF caused the lexical error - * curLexState : lexical state in which this error occurred - * errorLine : line number when the error occurred - * errorColumn : column number when the error occurred - * errorAfter : prefix that was seen before this error occurred - * curchar : the offending character - * Note: You can customize the lexical error message by modifying this method. - */ - protected static String LexicalError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar) { - return("Lexical error at line " + - errorLine + ", column " + - errorColumn + ". Encountered: " + - (EOFSeen ? "<EOF> " : ("\"" + addEscapes(String.valueOf(curChar)) + "\"") + " (" + (int)curChar + "), ") + - "after : \"" + addEscapes(errorAfter) + "\""); - } - - /** - * You can also modify the body of this method to customize your error messages. - * For example, cases like LOOP_DETECTED and INVALID_LEXICAL_STATE are not - * of end-users concern, so you can return something like : - * - * "Internal Error : Please file a bug report .... " - * - * from this method for such cases in the release version of your parser. - */ - public String getMessage() { - return super.getMessage(); - } - - /* - * Constructors of various flavors follow. - */ - - /** No arg constructor. */ - public TokenMgrError() { - } - - /** Constructor with message and reason. */ - public TokenMgrError(String message, int reason) { - super(message); - errorCode = reason; - } - - /** Full Constructor. */ - public TokenMgrError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar, int reason) { - this(LexicalError(EOFSeen, lexState, errorLine, errorColumn, errorAfter, curChar), reason); - } + } + return retval.toString(); + } + + /** + * Returns a detailed message for the Error when it is thrown by the + * token manager to indicate a lexical error. + * Parameters : + * EOFSeen : indicates if EOF caused the lexical error + * curLexState : lexical state in which this error occurred + * errorLine : line number when the error occurred + * errorColumn : column number when the error occurred + * errorAfter : prefix that was seen before this error occurred + * curchar : the offending character + * Note: You can customize the lexical error message by modifying this method. + */ + protected static String LexicalError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar) { + return("Lexical error at line " + + errorLine + ", column " + + errorColumn + ". Encountered: " + + (EOFSeen ? "<EOF> " : ("\"" + addEscapes(String.valueOf(curChar)) + "\"") + " (" + (int)curChar + "), ") + + "after : \"" + addEscapes(errorAfter) + "\""); + } + + /** + * You can also modify the body of this method to customize your error messages. + * For example, cases like LOOP_DETECTED and INVALID_LEXICAL_STATE are not + * of end-users concern, so you can return something like : + * + * "Internal Error : Please file a bug report .... " + * + * from this method for such cases in the release version of your parser. + */ + public String getMessage() { + return super.getMessage(); + } + + /* + * Constructors of various flavors follow. + */ + + /** No arg constructor. */ + public TokenMgrError() { + } + + /** Constructor with message and reason. */ + public TokenMgrError(String message, int reason) { + super(message); + errorCode = reason; + } + + /** Full Constructor. */ + public TokenMgrError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar, int reason) { + this(LexicalError(EOFSeen, lexState, errorLine, errorColumn, errorAfter, curChar), reason); + } } -/* JavaCC - OriginalChecksum=8048f4b229a762baa426e8e8436dbe9e (do not edit this line) */ +/* JavaCC - OriginalChecksum=a2ee073c8f4075f3b262dddea050e5ea (do not edit this line) */ Modified: tomcat/tc6.0.x/trunk/java/org/apache/jasper/compiler/Generator.java URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/jasper/compiler/Generator.java?rev=899148&r1=899147&r2=899148&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/java/org/apache/jasper/compiler/Generator.java (original) +++ tomcat/tc6.0.x/trunk/java/org/apache/jasper/compiler/Generator.java Thu Jan 14 10:27:15 2010 @@ -816,8 +816,8 @@ } return v; } else if (attr.isELInterpreterInput()) { - v = attributeValueWithEL(this.isTagFile, v, expectedType, - attr.getEL().getMapName()); + v = JspUtil.interpreterCall(this.isTagFile, v, expectedType, + attr.getEL().getMapName(), false); if (encode) { return "org.apache.jasper.runtime.JspRuntimeLibrary.URLEncode(" + v + ", request.getCharacterEncoding())"; @@ -835,76 +835,6 @@ } - /* - * When interpreting the EL attribute value, literals outside the EL - * must not be unescaped but the EL processor will unescape them. - * Therefore, make sure only the EL expressions are processed by the EL - * processor. - */ - private String attributeValueWithEL(boolean isTag, String tx, - Class<?> expectedType, String mapName) { - if (tx==null) return null; - Class<?> type = expectedType; - int size = tx.length(); - StringBuffer output = new StringBuffer(size); - boolean el = false; - int i = 0; - int mark = 0; - char ch; - - while(i < size){ - ch = tx.charAt(i); - - // Start of an EL expression - if (!el && i+1 < size && ch == '$' && tx.charAt(i+1)=='{') { - if (mark < i) { - if (output.length() > 0) { - output.append(" + "); - // Composite expression - must coerce to String - type = String.class; - } - output.append(quote(tx.substring(mark, i))); - } - mark = i; - el = true; - i += 2; - } else if (ch=='\\' && i+1 < size && - (tx.charAt(i+1)=='$' || tx.charAt(i+1)=='}')) { - // Skip an escaped $ or } - i += 2; - } else if (el && ch=='}') { - // End of an EL expression - if (output.length() > 0) { - output.append(" + "); - // Composite expression - must coerce to String - type = String.class; - } - if (i+1 < size) { - // Composite expression - must coerce to String - type = String.class; - } - output.append( - JspUtil.interpreterCall(isTag, - tx.substring(mark, i+1), type, - mapName, false)); - mark = i + 1; - el = false; - ++i; - } else { - // Nothing to see here - move to next character - ++i; - } - } - if (!el && mark < i) { - if (output.length() > 0) { - output.append(" + "); - } - output.append(quote(tx.substring(mark, i))); - } - return output.toString(); - } - - /** * Prints the attribute value specified in the param action, in the form * of name=value string. @@ -2933,8 +2863,8 @@ // run attrValue through the expression interpreter String mapName = (attr.getEL() != null) ? attr.getEL() .getMapName() : null; - attrValue = attributeValueWithEL(this.isTagFile, - attrValue, c[0], mapName); + attrValue = JspUtil.interpreterCall(this.isTagFile, attrValue, + c[0], mapName, false); } } else { attrValue = convertString(c[0], attrValue, localName, Modified: tomcat/tc6.0.x/trunk/java/org/apache/jasper/compiler/Parser.java URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/jasper/compiler/Parser.java?rev=899148&r1=899147&r2=899148&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/java/org/apache/jasper/compiler/Parser.java (original) +++ tomcat/tc6.0.x/trunk/java/org/apache/jasper/compiler/Parser.java Thu Jan 14 10:27:15 2010 @@ -74,11 +74,6 @@ private static final String JAVAX_BODY_CONTENT_TEMPLATE_TEXT = "JAVAX_BODY_CONTENT_TEMPLATE_TEXT"; - private static final boolean STRICT_QUOTE_ESCAPING = Boolean.valueOf( - System.getProperty( - "org.apache.jasper.compiler.Parser.STRICT_QUOTE_ESCAPING", - "true")).booleanValue(); - /** * The constructor */ @@ -245,66 +240,25 @@ err.jspError(start, "jsp.error.attribute.unterminated", watch); } - String ret = parseQuoted(start, reader.getText(start, stop), - watch.charAt(watch.length() - 1)); + String ret = null; + try { + char quote = 0; + if (watch.length() == 1) { + quote = watch.charAt(0); + } + ret = AttributeParser.getUnquoted(reader.getText(start, stop), + quote, pageInfo.isELIgnored()); + } catch (IllegalArgumentException iae) { + err.jspError(start, iae.getMessage()); + } if (watch.length() == 1) // quote return ret; - // putback delimiter '<%=' and '%>', since they are needed if the + // Put back delimiter '<%=' and '%>', since they are needed if the // attribute does not allow RTexpression. return "<%=" + ret + "%>"; } - /** - * QuotedChar ::= ''' | '"' | '\\' | '\"' | "\'" | '\>' | '\$' | - * Char - */ - private String parseQuoted(Mark start, String tx, char quote) - throws JasperException { - StringBuffer buf = new StringBuffer(); - int size = tx.length(); - int i = 0; - while (i < size) { - char ch = tx.charAt(i); - if (ch == '&') { - if (i + 5 < size && tx.charAt(i + 1) == 'a' - && tx.charAt(i + 2) == 'p' && tx.charAt(i + 3) == 'o' - && tx.charAt(i + 4) == 's' && tx.charAt(i + 5) == ';') { - buf.append('\''); - i += 6; - } else if (i + 5 < size && tx.charAt(i + 1) == 'q' - && tx.charAt(i + 2) == 'u' && tx.charAt(i + 3) == 'o' - && tx.charAt(i + 4) == 't' && tx.charAt(i + 5) == ';') { - buf.append('"'); - i += 6; - } else { - buf.append(ch); - ++i; - } - } else if (ch == '\\' && i + 1 < size) { - ch = tx.charAt(i + 1); - if (ch == '\\' || ch == '\"' || ch == '\'' || ch == '>') { - // \ " and ' are always unescaped regardless of if they are - // inside or outside of an EL expression. JSP.1.6 takes - // precedence over JSP.1.3.10 (confirmed with EG). - buf.append(ch); - i += 2; - } else { - buf.append('\\'); - ++i; - } - } else if (ch == quote && STRICT_QUOTE_ESCAPING) { - // Unescaped quote character - err.jspError(start, "jsp.error.attribute.noescape", tx, - "" + quote); - } else { - buf.append(ch); - ++i; - } - } - return buf.toString(); - } - private String parseScriptText(String tx) { CharArrayWriter cw = new CharArrayWriter(); int size = tx.length(); Copied: tomcat/tc6.0.x/trunk/test/org/apache/jasper/compiler/TestAttributeParser.java (from r898770, tomcat/trunk/test/org/apache/jasper/compiler/TestAttributeParser.java) URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/test/org/apache/jasper/compiler/TestAttributeParser.java?p2=tomcat/tc6.0.x/trunk/test/org/apache/jasper/compiler/TestAttributeParser.java&p1=tomcat/trunk/test/org/apache/jasper/compiler/TestAttributeParser.java&r1=898770&r2=899148&rev=899148&view=diff ============================================================================== --- tomcat/trunk/test/org/apache/jasper/compiler/TestAttributeParser.java (original) +++ tomcat/tc6.0.x/trunk/test/org/apache/jasper/compiler/TestAttributeParser.java Thu Jan 14 10:27:15 2010 @@ -24,7 +24,6 @@ import org.apache.el.ExpressionFactoryImpl; import org.apache.el.TestELEvaluation; -import org.apache.el.TestELInJsp; import org.apache.el.TesterFunctions; import org.apache.jasper.el.ELContextImpl; @@ -32,7 +31,7 @@ /** * Test the EL processing from JSP attributes. Similar tests may be found in - * {...@link TestELEvaluation} and {...@link TestELInJsp}. + * {...@link TestELEvaluation}. */ public class TestAttributeParser extends TestCase { Modified: tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml?rev=899148&r1=899147&r2=899148&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml (original) +++ tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml Thu Jan 14 10:27:15 2010 @@ -91,6 +91,14 @@ </fix> </changelog> </subsection> + <subsection name="Jasper"> + <changelog> + <fix> + <bug>48112</bug>: Correct handling of } character in literals when parsing + expressions. This also improves the fix for <bug>47413</bug>. (markt) + </fix> + </changelog> + </subsection> <subsection name="Webapps"> <changelog> <add> --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org