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 2010/01/14 11:27:16 UTC

svn commit: r899148 [2/2] - in /tomcat/tc6.0.x/trunk: ./ java/org/apache/el/parser/ java/org/apache/jasper/compiler/ test/org/apache/el/ test/org/apache/jasper/compiler/ webapps/docs/

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 ::= '&apos;' | '&quot;' | '\\' | '\"' | "\'" | '\>' | '\$' |
-     * 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-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org