Author: markt
Date: Wed Jun 24 20:12:03 2009
New Revision: 788167
URL: http://svn.apache.org/viewvc?rev=788167&view=rev
Log:
Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=36923
If EL is disabled, treat ${ as template text
This patch includes a port of the work from TC6 that removed the need for the
text replacement hack as part of the EL processing.
Modified:
tomcat/container/tc5.5.x/webapps/docs/changelog.xml
tomcat/jasper/tc5.5.x/src/share/org/apache/jasper/Constants.java
tomcat/jasper/tc5.5.x/src/share/org/apache/jasper/compiler/Compiler.java
tomcat/jasper/tc5.5.x/src/share/org/apache/jasper/compiler/Generator.java
tomcat/jasper/tc5.5.x/src/share/org/apache/jasper/compiler/JspDocumentParser.java
tomcat/jasper/tc5.5.x/src/share/org/apache/jasper/compiler/JspUtil.java
tomcat/jasper/tc5.5.x/src/share/org/apache/jasper/compiler/Parser.java
tomcat/jasper/tc5.5.x/src/share/org/apache/jasper/compiler/ParserController.java
tomcat/jasper/tc5.5.x/src/share/org/apache/jasper/compiler/Validator.java
Modified: tomcat/container/tc5.5.x/webapps/docs/changelog.xml
URL:
http://svn.apache.org/viewvc/tomcat/container/tc5.5.x/webapps/docs/changelog.xml?rev=788167&r1=788166&r2=788167&view=diff
==============================================================================
--- tomcat/container/tc5.5.x/webapps/docs/changelog.xml (original)
+++ tomcat/container/tc5.5.x/webapps/docs/changelog.xml Wed Jun 24 20:12:03 2009
@@ -163,6 +163,9 @@
<subsection name="Jasper">
<changelog>
<fix>
+ <bug>36923</bug>: Parse deactivated EL expressions correctly. (markt)
+ </fix>
+ <fix>
<bug>37515</bug>: Add options for Java 1.6 and 1.7 to the JDT compiler.
(markt)
</fix>
Modified: tomcat/jasper/tc5.5.x/src/share/org/apache/jasper/Constants.java
URL:
http://svn.apache.org/viewvc/tomcat/jasper/tc5.5.x/src/share/org/apache/jasper/Constants.java?rev=788167&r1=788166&r2=788167&view=diff
==============================================================================
--- tomcat/jasper/tc5.5.x/src/share/org/apache/jasper/Constants.java (original)
+++ tomcat/jasper/tc5.5.x/src/share/org/apache/jasper/Constants.java Wed Jun 24
20:12:03 2009
@@ -201,6 +201,7 @@
* Replacement char for "\$". This is the first unicode character in the
* private use area.
* XXX This is a hack to avoid changing EL interpreter to recognize "\$"
+ * @deprecated
*/
public static final char HACK_CHAR = '\ue000';
@@ -208,6 +209,7 @@
* Replacement string for "\$". This is the first unicode character in the
* private use area.
* XXX This is a hack to avoid changing EL interpreter to recognize "\$"
+ * @deprecated
*/
public static final String HACK_STR = "'\\ue000'";
Modified:
tomcat/jasper/tc5.5.x/src/share/org/apache/jasper/compiler/Compiler.java
URL:
http://svn.apache.org/viewvc/tomcat/jasper/tc5.5.x/src/share/org/apache/jasper/compiler/Compiler.java?rev=788167&r1=788166&r2=788167&view=diff
==============================================================================
--- tomcat/jasper/tc5.5.x/src/share/org/apache/jasper/compiler/Compiler.java
(original)
+++ tomcat/jasper/tc5.5.x/src/share/org/apache/jasper/compiler/Compiler.java
Wed Jun 24 20:12:03 2009
@@ -151,8 +151,28 @@
// Reset the temporary variable counter for the generator.
JspUtil.resetTemporaryVariableName();
+ /*
+ * The setting of isELIgnored changes the behaviour of the parser
+ * in subtle ways. To add to the 'fun', isELIgnored can be set in
+ * any file that forms part of the translation unit so setting it
+ * in a file included towards the end of the translation unit can
+ * change how the parser should have behaved when parsing content
+ * up to the point where isELIgnored was set. Arghh!
+ * Previous attempts to hack around this have only provided partial
+ * solutions. We now use two passes to parse the translation unit.
+ * The first just parses the directives and the second parses the
+ * whole translation unit once we know how isELIgnored has been
set.
+ * TODO There are some possible optimisations of this process.
+ */
// Parse the file
ParserController parserCtl = new ParserController(ctxt, this);
+
+ // Pass 1 - the directives
+ Node.Nodes directives =
+ parserCtl.parseDirectives(ctxt.getJspFile());
+ Validator.validateDirectives(this, directives);
+
+ // Pass 2 - the whole translation unit
pageNodes = parserCtl.parse(ctxt.getJspFile());
if (ctxt.isPrototypeMode()) {
@@ -163,8 +183,9 @@
return null;
}
- // Validate and process attributes
- Validator.validate(this, pageNodes);
+ // Validate and process attributes - don't re-validate the
+ // directives we validated in pass 1
+ Validator.validateExDirectives(this, pageNodes);
if (log.isDebugEnabled()) {
t2 = System.currentTimeMillis();
Modified:
tomcat/jasper/tc5.5.x/src/share/org/apache/jasper/compiler/Generator.java
URL:
http://svn.apache.org/viewvc/tomcat/jasper/tc5.5.x/src/share/org/apache/jasper/compiler/Generator.java?rev=788167&r1=788166&r2=788167&view=diff
==============================================================================
--- tomcat/jasper/tc5.5.x/src/share/org/apache/jasper/compiler/Generator.java
(original)
+++ tomcat/jasper/tc5.5.x/src/share/org/apache/jasper/compiler/Generator.java
Wed Jun 24 20:12:03 2009
@@ -761,7 +761,6 @@
}
return v;
} else if (attr.isELInterpreterInput()) {
- boolean replaceESC = v.indexOf(Constants.HACK_CHAR) > 0;
v =
JspUtil.interpreterCall(
this.isTagFile,
@@ -769,10 +768,6 @@
expectedType,
attr.getEL().getMapName(),
false);
- // XXX hack replacement
- if (replaceESC) {
- v = "(" + v + ").replace(" + Constants.HACK_STR + ", '$')";
- }
if (encode) {
return
"org.apache.jasper.runtime.JspRuntimeLibrary.URLEncode("
+ v
@@ -1896,17 +1891,6 @@
return;
}
- // Replace marker for \$ sequence with correct sequence
- if (text.indexOf(Constants.HACK_CHAR) > 0) {
- if (pageInfo.isELIgnored()) {
- text = text.replaceAll(String.valueOf(Constants.HACK_CHAR),
- "\\\\\\$");
- textSize++;
- } else {
- text = text.replace(Constants.HACK_CHAR, '$');
- }
- }
-
if (textSize <= 3) {
// Special case small text strings
n.setBeginJavaLine(out.getJavaLine());
@@ -2752,7 +2736,6 @@
}
} else if (attr.isELInterpreterInput()) {
// run attrValue through the expression interpreter
- boolean replaceESC = attrValue.indexOf(Constants.HACK_CHAR) >
0;
attrValue =
JspUtil.interpreterCall(
this.isTagFile,
@@ -2760,15 +2743,6 @@
c[0],
attr.getEL().getMapName(),
false);
- // XXX hack: Replace ESC with '$'
- if (replaceESC) {
- attrValue =
- "("
- + attrValue
- + ").replace("
- + Constants.HACK_STR
- + ", '$')";
- }
} else {
attrValue =
convertString(
Modified:
tomcat/jasper/tc5.5.x/src/share/org/apache/jasper/compiler/JspDocumentParser.java
URL:
http://svn.apache.org/viewvc/tomcat/jasper/tc5.5.x/src/share/org/apache/jasper/compiler/JspDocumentParser.java?rev=788167&r1=788166&r2=788167&view=diff
==============================================================================
---
tomcat/jasper/tc5.5.x/src/share/org/apache/jasper/compiler/JspDocumentParser.java
(original)
+++
tomcat/jasper/tc5.5.x/src/share/org/apache/jasper/compiler/JspDocumentParser.java
Wed Jun 24 20:12:03 2009
@@ -577,6 +577,9 @@
lastCh = ch;
}
} else if (lastCh == '\\' && ch == '$') {
+ if (pageInfo.isELIgnored()) {
+ ttext.write('\\');
+ }
ttext.write('$');
ch = 0; // Not start of EL anymore
} else {
Modified:
tomcat/jasper/tc5.5.x/src/share/org/apache/jasper/compiler/JspUtil.java
URL:
http://svn.apache.org/viewvc/tomcat/jasper/tc5.5.x/src/share/org/apache/jasper/compiler/JspUtil.java?rev=788167&r1=788166&r2=788167&view=diff
==============================================================================
--- tomcat/jasper/tc5.5.x/src/share/org/apache/jasper/compiler/JspUtil.java
(original)
+++ tomcat/jasper/tc5.5.x/src/share/org/apache/jasper/compiler/JspUtil.java Wed
Jun 24 20:12:03 2009
@@ -187,7 +187,7 @@
returnString = expression;
}
- return escapeXml(returnString.replace(Constants.HACK_CHAR, '$'));
+ return escapeXml(returnString);
}
/**
Modified: tomcat/jasper/tc5.5.x/src/share/org/apache/jasper/compiler/Parser.java
URL:
http://svn.apache.org/viewvc/tomcat/jasper/tc5.5.x/src/share/org/apache/jasper/compiler/Parser.java?rev=788167&r1=788166&r2=788167&view=diff
==============================================================================
--- tomcat/jasper/tc5.5.x/src/share/org/apache/jasper/compiler/Parser.java
(original)
+++ tomcat/jasper/tc5.5.x/src/share/org/apache/jasper/compiler/Parser.java Wed
Jun 24 20:12:03 2009
@@ -118,20 +118,19 @@
root.setJspConfigPageEncoding(jspConfigPageEnc);
root.setIsDefaultPageEncoding(isDefaultPageEncoding);
- if (directivesOnly) {
- parser.parseTagFileDirectives(root);
- return new Node.Nodes(root);
- }
-
- // For the Top level page, add inlcude-prelude and include-coda
+ // For the Top level page, add include-prelude and include-coda
PageInfo pageInfo = pc.getCompiler().getPageInfo();
- if (parent == null) {
+ if (parent == null && !isTagFile) {
parser.addInclude(root, pageInfo.getIncludePrelude());
}
- while (reader.hasMoreInput()) {
- parser.parseElements(root);
+ if (directivesOnly) {
+ parser.parseFileDirectives(root);
+ } else {
+ while (reader.hasMoreInput()) {
+ parser.parseElements(root);
+ }
}
- if (parent == null) {
+ if (parent == null && !isTagFile) {
parser.addInclude(root, pageInfo.getIncludeCoda());
}
@@ -294,10 +293,6 @@
if (ch == '\\' || ch == '\"' || ch == '\'' || ch == '>') {
buf.append(ch);
i += 2;
- } else if (ch == '$') {
- // Replace "\$" with some special char. XXX hack!
- buf.append(Constants.HACK_CHAR);
- i += 2;
} else {
buf.append('\\');
++i;
@@ -1415,7 +1410,7 @@
reader.pushChar();
break;
}
- else if( ch == '$' ) {
+ else if( ch == '$' && !pageInfo.isELIgnored()) {
if (!reader.hasMoreInput()) {
ttext.write('$');
break;
@@ -1436,15 +1431,10 @@
break;
}
// Look for \% or \$
- // Only recognize \$ if isELIgnored is false, but since it can
- // be set in a page directive, it cannot be determined yet.
+ // Only recognize \$ if isELIgnored is false
char next = (char)reader.peekChar();
- if (next == '%') {
+ if (next == '%' || (next == '$' && !pageInfo.isELIgnored())) {
ch = reader.nextChar();
- } else if(next == '$') {
- // Skip the $ and use a hack to flag this sequence
- reader.nextChar();
- ch = Constants.HACK_CHAR;
}
}
ttext.write(ch);
@@ -1582,7 +1572,7 @@
parseXMLScriptlet(parent);
} else if (reader.matches("<jsp:text")) {
parseXMLTemplateText(parent);
- } else if (reader.matches("${")) {
+ } else if (reader.matches("${") && !pageInfo.isELIgnored()) {
parseELExpression(parent);
} else if (reader.matches("<jsp:")) {
parseStandardAction(parent);
@@ -1927,7 +1917,7 @@
return JAVAX_BODY_CONTENT_TEMPLATE_TEXT;
}
- private void parseTagFileDirectives(Node parent)
+ private void parseFileDirectives(Node parent)
throws JasperException
{
reader.setSingleFile(true);
Modified:
tomcat/jasper/tc5.5.x/src/share/org/apache/jasper/compiler/ParserController.java
URL:
http://svn.apache.org/viewvc/tomcat/jasper/tc5.5.x/src/share/org/apache/jasper/compiler/ParserController.java?rev=788167&r1=788166&r2=788167&view=diff
==============================================================================
---
tomcat/jasper/tc5.5.x/src/share/org/apache/jasper/compiler/ParserController.java
(original)
+++
tomcat/jasper/tc5.5.x/src/share/org/apache/jasper/compiler/ParserController.java
Wed Jun 24 20:12:03 2009
@@ -102,6 +102,23 @@
}
/**
+ * Parses the directives of a JSP page or tag file. This is invoked by the
+ * compiler.
+ *
+ * @param inFileName The path to the JSP page or tag file to be parsed.
+ */
+ public Node.Nodes parseDirectives(String inFileName)
+ throws FileNotFoundException, JasperException, IOException {
+ // If we're parsing a packaged tag file or a resource included by it
+ // (using an include directive), ctxt.getTagFileJar() returns the
+ // JAR file from which to read the tag file or included resource,
+ // respectively.
+ isTagFile = ctxt.isTagFile();
+ directiveOnly = true;
+ return doParse(inFileName, null, ctxt.getTagFileJarUrl());
+ }
+
+ /**
* Processes an include directive with the given path.
*
* @param inFileName The path to the resource to be included.
Modified:
tomcat/jasper/tc5.5.x/src/share/org/apache/jasper/compiler/Validator.java
URL:
http://svn.apache.org/viewvc/tomcat/jasper/tc5.5.x/src/share/org/apache/jasper/compiler/Validator.java?rev=788167&r1=788166&r2=788167&view=diff
==============================================================================
--- tomcat/jasper/tc5.5.x/src/share/org/apache/jasper/compiler/Validator.java
(original)
+++ tomcat/jasper/tc5.5.x/src/share/org/apache/jasper/compiler/Validator.java
Wed Jun 24 20:12:03 2009
@@ -1118,7 +1118,6 @@
value, false, el,
dynamic);
} else {
- value = value.replace(Constants.HACK_CHAR, '$');
result = new Node.JspAttribute(qName, uri, localName,
value, false, null,
dynamic);
@@ -1437,15 +1436,13 @@
}
}
- public static void validate(Compiler compiler,
+ public static void validateDirectives(Compiler compiler,
Node.Nodes page) throws JasperException {
-
- /*
- * Visit the page/tag directives first, as they are global to the page
- * and are position independent.
- */
page.visit(new DirectiveVisitor(compiler));
-
+ }
+
+ public static void validateExDirectives(Compiler compiler, Node.Nodes page)
+ throws JasperException {
// Determine the default output content type
PageInfo pageInfo = compiler.getPageInfo();
String contentType = pageInfo.getContentType();
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]