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]>