luehe 2002/09/09 17:36:24
Modified: jasper2/src/share/org/apache/jasper/compiler Tag:
tomcat_4_branch Generator.java Node.java
ScriptingVariabler.java
Log:
Fixed 12432: Can't compile JSP with nested custom tags that have VariableInfo
Revision Changes Path
No revision
No revision
1.35.2.8 +73 -94
jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Generator.java
Index: Generator.java
===================================================================
RCS file:
/home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Generator.java,v
retrieving revision 1.35.2.7
retrieving revision 1.35.2.8
diff -u -r1.35.2.7 -r1.35.2.8
--- Generator.java 9 Sep 2002 17:30:00 -0000 1.35.2.7
+++ Generator.java 10 Sep 2002 00:36:23 -0000 1.35.2.8
@@ -1144,27 +1144,15 @@
}
}
- Class tagHandlerClass = handlerInfo.getTagHandlerClass();
- boolean implementsIterationTag =
- IterationTag.class.isAssignableFrom(tagHandlerClass);
- boolean implementsBodyTag =
- BodyTag.class.isAssignableFrom(tagHandlerClass);
- boolean implementsTryCatchFinally =
- TryCatchFinally.class.isAssignableFrom(tagHandlerClass);
-
// Generate code for start tag, body, and end tag
- generateCustomStart(n, handlerInfo, tagHandlerVar, tagEvalVar,
- implementsIterationTag, implementsBodyTag,
- implementsTryCatchFinally);
+ generateCustomStart(n, handlerInfo, tagHandlerVar, tagEvalVar);
String tmpParent = parent;
parent = tagHandlerVar;
visitBody(n);
parent = tmpParent;
- generateCustomEnd(n, tagHandlerVar, tagEvalVar,
- implementsIterationTag, implementsBodyTag,
- implementsTryCatchFinally);
+ generateCustomEnd(n, tagHandlerVar, tagEvalVar);
if (n.isScriptless() && !n.hasScriptingVars()) {
// Generate end of method
@@ -1289,10 +1277,7 @@
private void generateCustomStart(Node.CustomTag n,
TagHandlerInfo handlerInfo,
String tagHandlerVar,
- String tagEvalVar,
- boolean implementsIterationTag,
- boolean implementsBodyTag,
- boolean implementsTryCatchFinally)
+ String tagEvalVar)
throws JasperException {
Class tagHandlerClass = handlerInfo.getTagHandlerClass();
@@ -1304,13 +1289,7 @@
// Declare AT_BEGIN scripting variables
declareScriptingVars(n, VariableInfo.AT_BEGIN);
-
- /*
- * Save current values of scripting variables, so that the
- * scripting variables may be synchronized without affecting their
- * original values
- */
- saveScriptingVars(n);
+ saveScriptingVars(n, VariableInfo.AT_BEGIN);
out.printin(tagHandlerClass.getName());
out.print(" ");
@@ -1332,7 +1311,7 @@
generateSetters(n, tagHandlerVar, handlerInfo);
- if (implementsTryCatchFinally) {
+ if (n.implementsTryCatchFinally()) {
out.printil("try {");
out.pushIndent();
}
@@ -1342,12 +1321,9 @@
out.print(tagHandlerVar);
out.println(".doStartTag();");
- if (!implementsIterationTag) {
+ if (!n.implementsBodyTag()) {
// Synchronize AT_BEGIN scripting variables
syncScriptingVars(n, VariableInfo.AT_BEGIN);
- // Declare and synchronize NESTED scripting variables
- declareScriptingVars(n, VariableInfo.NESTED);
- syncScriptingVars(n, VariableInfo.NESTED);
}
if (n.getBody() != null) {
@@ -1356,37 +1332,37 @@
out.println(" != javax.servlet.jsp.tagext.Tag.SKIP_BODY) {");
out.pushIndent();
- if (implementsIterationTag) {
- // Declare NESTED scripting variables
- declareScriptingVars(n, VariableInfo.NESTED);
-
- if (n.implementsBodyTag()) {
- out.printin("if (");
- out.print(tagEvalVar);
- out.println(" !=
javax.servlet.jsp.tagext.Tag.EVAL_BODY_INCLUDE) {");
- // Assume EVAL_BODY_BUFFERED
- out.pushIndent();
- out.printil("javax.servlet.jsp.tagext.BodyContent _bc =
pageContext.pushBody();");
- out.printil("_bc.clear();");
- out.printil("out = _bc;");
-
- out.printin(tagHandlerVar);
- out.println(".setBodyContent(_bc);");
- out.printin(tagHandlerVar);
- out.println(".doInitBody();");
-
- // Synchronize AT_BEGIN and NESTED scripting variables
- syncScriptingVars(n, VariableInfo.AT_BEGIN);
- syncScriptingVars(n, VariableInfo.NESTED);
+ // Declare NESTED scripting variables
+ declareScriptingVars(n, VariableInfo.NESTED);
+ saveScriptingVars(n, VariableInfo.NESTED);
+
+ if (n.implementsBodyTag()) {
+ out.printin("if (");
+ out.print(tagEvalVar);
+ out.println(" != javax.servlet.jsp.tagext.Tag.EVAL_BODY_INCLUDE)
{");
+ // Assume EVAL_BODY_BUFFERED
+ out.pushIndent();
+ out.printil("javax.servlet.jsp.tagext.BodyContent _bc =
pageContext.pushBody();");
+ out.printil("_bc.clear();");
+ out.printil("out = _bc;");
+
+ out.printin(tagHandlerVar);
+ out.println(".setBodyContent(_bc);");
+ out.printin(tagHandlerVar);
+ out.println(".doInitBody();");
+
+ // Synchronize AT_BEGIN and NESTED scripting variables
+ syncScriptingVars(n, VariableInfo.AT_BEGIN);
+ syncScriptingVars(n, VariableInfo.NESTED);
- out.popIndent();
- out.printil("}");
- } else {
- // Synchronize AT_BEGIN and NESTED scripting variables
- syncScriptingVars(n, VariableInfo.AT_BEGIN);
- syncScriptingVars(n, VariableInfo.NESTED);
- }
+ out.popIndent();
+ out.printil("}");
+ } else {
+ // Synchronize NESTED scripting variables
+ syncScriptingVars(n, VariableInfo.NESTED);
+ }
+ if (n.implementsIterationTag()) {
out.printil("do {");
out.pushIndent();
}
@@ -1395,34 +1371,33 @@
private void generateCustomEnd(Node.CustomTag n,
String tagHandlerVar,
- String tagEvalVar,
- boolean implementsIterationTag,
- boolean implementsBodyTag,
- boolean implementsTryCatchFinally) {
+ String tagEvalVar) {
VariableInfo[] varInfos = n.getVariableInfos();
TagVariableInfo[] tagVarInfos = n.getTagVariableInfos();
- if ((n.getBody() != null) && implementsIterationTag) {
- out.printin("int evalDoAfterBody = ");
- out.print(tagHandlerVar);
- out.println(".doAfterBody();");
-
- // Synchronize AT_BEGIN and NESTED scripting variables
- syncScriptingVars(n, VariableInfo.AT_BEGIN);
- syncScriptingVars(n, VariableInfo.NESTED);
+ if (n.getBody() != null) {
+ if (n.implementsIterationTag()) {
+ out.printin("int evalDoAfterBody = ");
+ out.print(tagHandlerVar);
+ out.println(".doAfterBody();");
+
+ // Synchronize AT_BEGIN and NESTED scripting variables
+ syncScriptingVars(n, VariableInfo.AT_BEGIN);
+ syncScriptingVars(n, VariableInfo.NESTED);
- out.printil("if (evalDoAfterBody !=
javax.servlet.jsp.tagext.BodyTag.EVAL_BODY_AGAIN)");
- out.pushIndent();
- out.printil("break;");
- out.popIndent();
+ out.printil("if (evalDoAfterBody !=
javax.servlet.jsp.tagext.BodyTag.EVAL_BODY_AGAIN)");
+ out.pushIndent();
+ out.printil("break;");
+ out.popIndent();
- out.popIndent();
- out.printil("} while (true);");
- }
+ out.popIndent();
+ out.printil("} while (true);");
+ }
+
+ restoreScriptingVars(n, VariableInfo.NESTED);
- if (n.getBody() != null) {
- if (implementsBodyTag) {
+ if (n.implementsBodyTag()) {
out.printin("if (");
out.print(tagEvalVar);
out.println(" != javax.servlet.jsp.tagext.Tag.EVAL_BODY_INCLUDE)");
@@ -1450,7 +1425,7 @@
syncScriptingVars(n, VariableInfo.AT_END);
// TryCatchFinally
- if (implementsTryCatchFinally) {
+ if (n.implementsTryCatchFinally()) {
out.popIndent(); // try
out.printil("} catch (Throwable _jspx_exception) {");
out.pushIndent();
@@ -1470,12 +1445,12 @@
out.println(");");
}
- if (implementsTryCatchFinally) {
+ if (n.implementsTryCatchFinally()) {
out.popIndent();
out.println("}");
}
- restoreScriptingVars(n);
+ restoreScriptingVars(n, VariableInfo.AT_BEGIN);
n.setEndJavaLine(out.getJavaLine());
}
@@ -1517,7 +1492,7 @@
* end element. This way, the scripting variables may be synchronized
* by the given tag without affecting their original values.
*/
- private void saveScriptingVars(Node.CustomTag n) {
+ private void saveScriptingVars(Node.CustomTag n, int scope) {
if (n.getCustomNestingLevel() == 0) {
return;
}
@@ -1530,18 +1505,20 @@
if (varInfos != null) {
for (int i=0; i<varInfos.length; i++) {
+ if (varInfos[i].getScope() != scope)
+ continue;
String varName = varInfos[i].getVarName();
String tmpVarName = "_jspx_" + varName + "_"
+ n.getCustomNestingLevel();
- out.printin(varInfos[i].getClassName());
- out.print(" ");
- out.print(tmpVarName);
+ out.printin(tmpVarName);
out.print(" = ");
out.print(varName);
out.println(";");
}
} else {
for (int i=0; i<tagVarInfos.length; i++) {
+ if (tagVarInfos[i].getScope() != scope)
+ continue;
String varName = tagVarInfos[i].getNameGiven();
if (varName == null) {
varName = n.getTagData().getAttributeString(
@@ -1549,9 +1526,7 @@
}
String tmpVarName = "_jspx_" + varName + "_"
+ n.getCustomNestingLevel();
- out.printin(tagVarInfos[i].getClassName());
- out.print(" ");
- out.print(tmpVarName);
+ out.printin(tmpVarName);
out.print(" = ");
out.print(varName);
out.println(";");
@@ -1566,7 +1541,7 @@
* restore its scripting variables to their original values that were
* saved in the tag's start element.
*/
- private void restoreScriptingVars(Node.CustomTag n) {
+ private void restoreScriptingVars(Node.CustomTag n, int scope) {
if (n.getCustomNestingLevel() == 0) {
return;
}
@@ -1579,6 +1554,8 @@
if (varInfos != null) {
for (int i=0; i<varInfos.length; i++) {
+ if (varInfos[i].getScope() != scope)
+ continue;
String varName = varInfos[i].getVarName();
String tmpVarName = "_jspx_" + varName + "_"
+ n.getCustomNestingLevel();
@@ -1589,6 +1566,8 @@
}
} else {
for (int i=0; i<tagVarInfos.length; i++) {
+ if (tagVarInfos[i].getScope() != scope)
+ continue;
String varName = tagVarInfos[i].getNameGiven();
if (varName == null) {
varName = n.getTagData().getAttributeString(
1.15.2.3 +17 -3
jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Node.java
Index: Node.java
===================================================================
RCS file:
/home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Node.java,v
retrieving revision 1.15.2.2
retrieving revision 1.15.2.3
diff -u -r1.15.2.2 -r1.15.2.3
--- Node.java 17 Aug 2002 00:14:23 -0000 1.15.2.2
+++ Node.java 10 Sep 2002 00:36:23 -0000 1.15.2.3
@@ -675,7 +675,9 @@
private Class tagHandlerClass;
private VariableInfo[] varInfos;
private int customNestingLevel;
+ private boolean implementsIterationTag;
private boolean implementsBodyTag;
+ private boolean implementsTryCatchFinally;
private Vector atBeginScriptingVars;
private Vector atEndScriptingVars;
private Vector nestedScriptingVars;
@@ -693,8 +695,12 @@
this.customNestingLevel = makeCustomNestingLevel();
this.tagHandlerClass = tagHandlerClass;
+ this.implementsIterationTag =
+ IterationTag.class.isAssignableFrom(tagHandlerClass);
this.implementsBodyTag =
BodyTag.class.isAssignableFrom(tagHandlerClass);
+ this.implementsTryCatchFinally =
+ TryCatchFinally.class.isAssignableFrom(tagHandlerClass);
}
public void accept(Visitor v) throws JasperException {
@@ -795,8 +801,16 @@
return tagHandlerClass;
}
+ public boolean implementsIterationTag() {
+ return implementsIterationTag;
+ }
+
public boolean implementsBodyTag() {
return implementsBodyTag;
+ }
+
+ public boolean implementsTryCatchFinally() {
+ return implementsTryCatchFinally;
}
public TagVariableInfo[] getTagVariableInfos() {
1.1.2.3 +24 -40
jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/ScriptingVariabler.java
Index: ScriptingVariabler.java
===================================================================
RCS file:
/home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/ScriptingVariabler.java,v
retrieving revision 1.1.2.2
retrieving revision 1.1.2.3
diff -u -r1.1.2.2 -r1.1.2.3
--- ScriptingVariabler.java 19 Aug 2002 21:16:46 -0000 1.1.2.2
+++ ScriptingVariabler.java 10 Sep 2002 00:36:24 -0000 1.1.2.3
@@ -124,11 +124,17 @@
Vector vec = new Vector();
Integer ownRange = null;
- Node.CustomTag parent = n.getCustomTagParent();
- if (parent == null)
- ownRange = MAX_SCOPE;
- else
- ownRange = parent.getNumCount();
+ if (scope == VariableInfo.AT_BEGIN
+ || scope == VariableInfo.AT_END) {
+ Node.CustomTag parent = n.getCustomTagParent();
+ if (parent == null)
+ ownRange = MAX_SCOPE;
+ else
+ ownRange = parent.getNumCount();
+ } else {
+ // NESTED
+ ownRange = n.getNumCount();
+ }
if (varInfos != null) {
for (int i=0; i<varInfos.length; i++) {
@@ -138,22 +144,11 @@
}
String varName = varInfos[i].getVarName();
- if (scope == VariableInfo.AT_BEGIN
- || scope == VariableInfo.AT_END
- || (scope == VariableInfo.NESTED
- && !n.implementsBodyTag())) {
- Integer currentRange =
- (Integer) scriptVars.get(varName);
- if (currentRange == null
- || ownRange.compareTo(currentRange) > 0) {
- scriptVars.put(varName, ownRange);
- vec.add(varInfos[i]);
- }
- } else {
- // scope equals NESTED AND node implements BodyTag
- if (n.getCustomNestingLevel() == 0) {
- vec.add(varInfos[i]);
- }
+ Integer currentRange = (Integer) scriptVars.get(varName);
+ if (currentRange == null
+ || ownRange.compareTo(currentRange) > 0) {
+ scriptVars.put(varName, ownRange);
+ vec.add(varInfos[i]);
}
}
} else {
@@ -168,22 +163,11 @@
tagVarInfos[i].getNameFromAttribute());
}
- if (scope == VariableInfo.AT_BEGIN
- || scope == VariableInfo.AT_END
- || (scope == VariableInfo.NESTED
- && !n.implementsBodyTag())) {
- Integer currentRange =
- (Integer) scriptVars.get(varName);
- if (currentRange == null
- || ownRange.compareTo(currentRange) > 0) {
- scriptVars.put(varName, ownRange);
- vec.add(tagVarInfos[i]);
- }
- } else {
- // scope equals NESTED AND node implements BodyTag
- if (n.getCustomNestingLevel() == 0) {
- vec.add(tagVarInfos[i]);
- }
+ Integer currentRange = (Integer) scriptVars.get(varName);
+ if (currentRange == null
+ || ownRange.compareTo(currentRange) > 0) {
+ scriptVars.put(varName, ownRange);
+ vec.add(tagVarInfos[i]);
}
}
}
--
To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>