According to JSP.7.4 ("The Tag Library Descriptor Format"), it is illegal for a tag to define scripting variables in both its TLD and TagExtraInfo class.
Jasper already enforces this, but its code generator makes separate method calls for declaring/synchronizing scripting variables from a TLD and those from the TagExtraInfo class, like this: // Update AT_BEGIN variables updateVariableInfos(varInfos, VariableInfo.AT_BEGIN, false); updateTagVariableInfos(tagVarInfos, n.getTagData(), This can be simplified, since if "varInfos" is non-null, "tagVarInfos" must be null, and vice-versa. The proposed patch collapses the above method calls into one. Also, the code generator makes separate method calls to declare AT_BEGIN scripting variables outside the try-finally block, and then synchronizing them inside the try-finally block. Now that try-finally has been flattened, no separate declaration of AT_BEGIN variables is required, that is, AT_BEGIN variables can be declared when they are first synchronized (after a call to doStartTag()), just as NESTED and AT_END variables. This makes declareVariableInfos() and declareTagVariableInfos() redundant As a summary, the attached patch replaces declareVariableInfos(), declareTagVariableInfos(), updateVariableInfos(), and updateTagVariableInfos() with a single syncScriptingVariables(). Jan
? build ? build.xml.SAVE Index: src/share/org/apache/jasper/compiler/Generator.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Generator.java,v retrieving revision 1.15 diff -u -r1.15 Generator.java --- src/share/org/apache/jasper/compiler/Generator.java 24 May 2002 00:35:41 -0000 1.15 +++ src/share/org/apache/jasper/compiler/Generator.java 24 May 2002 22:12:51 -0000 @@ -981,11 +981,6 @@ out.println("();"); generateSetters(n, tagHandlerVar, handlerInfo); - // Declare AT_BEGIN variables - declareVariableInfos(varInfos, VariableInfo.AT_BEGIN); - declareTagVariableInfos(tagVarInfos, n.getTagData(), - VariableInfo.AT_BEGIN); - if (implementsTryCatchFinally) { out.printil("try {"); out.pushIndent(); @@ -1004,10 +999,9 @@ boolean isBodyTag = BodyTag.class.isAssignableFrom(tagHandlerClass); - // Update AT_BEGIN variables - updateVariableInfos(varInfos, VariableInfo.AT_BEGIN, false); - updateTagVariableInfos(tagVarInfos, n.getTagData(), - VariableInfo.AT_BEGIN, false); + // Declare and synchronize AT_BEGIN scripting variables + syncScriptingVariables(varInfos, tagVarInfos, n.getTagData(), + VariableInfo.AT_BEGIN, true); if (n.getBody() != null) { out.printin("if ("); @@ -1042,14 +1036,12 @@ } } - // Declare and update NESTED variables - updateVariableInfos(varInfos, VariableInfo.NESTED, true); - updateTagVariableInfos(tagVarInfos, n.getTagData(), + // Declare and synchronize NESTED scripting variables + syncScriptingVariables(varInfos, tagVarInfos, n.getTagData(), VariableInfo.NESTED, true); - // Update AT_BEGIN variables - updateVariableInfos(varInfos, VariableInfo.AT_BEGIN, false); - updateTagVariableInfos(tagVarInfos, n.getTagData(), + // Synchronize AT_BEGIN scripting variables + syncScriptingVariables(varInfos, tagVarInfos, n.getTagData(), VariableInfo.AT_BEGIN, false); }; @@ -1074,9 +1066,8 @@ out.println(".doAfterBody() == javax.servlet.jsp.tagext.BodyTag.EVAL_BODY_AGAIN);"); } - // Update AT_BEGIN variables - updateVariableInfos(varInfos, VariableInfo.AT_BEGIN, false); - updateTagVariableInfos(tagVarInfos, n.getTagData(), + // Synchronize AT_BEGIN scripting variables + syncScriptingVariables(varInfos, tagVarInfos, n.getTagData(), VariableInfo.AT_BEGIN, false); if (n.getBody() != null) { @@ -1125,94 +1116,57 @@ out.println(".release();"); } - // Declare and update AT_END variables - updateVariableInfos(varInfos, VariableInfo.AT_END, true); - updateTagVariableInfos(tagVarInfos, n.getTagData(), + // Declare and synchronize AT_END variables + syncScriptingVariables(varInfos, tagVarInfos, n.getTagData(), VariableInfo.AT_END, true); n.setEndJavaLine(out.getJavaLine()); } - private void declareVariableInfos(VariableInfo[] varInfos, int scope) { - if (varInfos == null) - return; - - for (int i=0; i<varInfos.length; i++) { - if ((varInfos[i].getScope() == scope) - && varInfos[i].getDeclare()) { - out.printin(varInfos[i].getClassName()); - out.print(" "); - out.print(varInfos[i].getVarName()); - out.println(" = null;"); - } - } - } - - private void updateVariableInfos(VariableInfo[] varInfos, int scope, - boolean declare) { - if (varInfos == null) - return; - - for (int i=0; i<varInfos.length; i++) { - if (varInfos[i].getScope() == scope) { - if (declare && varInfos[i].getDeclare()) { - out.printin(varInfos[i].getClassName() + " "); - } - out.printin(varInfos[i].getVarName()); - out.print(" = ("); - out.print(varInfos[i].getClassName()); - out.print(") pageContext.findAttribute("); - out.print(quote(varInfos[i].getVarName())); - out.println(");"); - } - } - } + private void syncScriptingVariables(VariableInfo[] varInfos, + TagVariableInfo[] tagVarInfos, + TagData tagData, + int scope, + boolean declare) { - private void declareTagVariableInfos(TagVariableInfo[] tagVarInfos, - TagData tagData, int scope) { - if (tagVarInfos == null) + if ((varInfos == null) && (tagVarInfos == null)) { return; - - for (int i=0; i<tagVarInfos.length; i++) { - String name = tagVarInfos[i].getNameGiven(); - if (name == null) { - name = tagData.getAttributeString( - tagVarInfos[i].getNameFromAttribute()); - } - if ((tagVarInfos[i].getScope() == scope) - && tagVarInfos[i].getDeclare()) { - out.printin(tagVarInfos[i].getClassName()); - out.print(" "); - out.print(name); - out.println(" = null;"); - } } - } - private void updateTagVariableInfos(TagVariableInfo[] tagVarInfos, - TagData tagData, int scope, - boolean declare) { - if (tagVarInfos == null) - return; - - for (int i=0; i<tagVarInfos.length; i++) { - String name = tagVarInfos[i].getNameGiven(); - if (name == null) { - name = tagData.getAttributeString( - tagVarInfos[i].getNameFromAttribute()); + if (varInfos != null) { + for (int i=0; i<varInfos.length; i++) { + if (varInfos[i].getScope() == scope) { + if (declare && varInfos[i].getDeclare()) { + out.printin(varInfos[i].getClassName() + " "); + } + out.printin(varInfos[i].getVarName()); + out.print(" = ("); + out.print(varInfos[i].getClassName()); + out.print(") pageContext.findAttribute("); + out.print(quote(varInfos[i].getVarName())); + out.println(");"); + } } - if (tagVarInfos[i].getScope() == scope) { - if (declare && tagVarInfos[i].getDeclare()) { - out.printin(tagVarInfos[i].getClassName() + " "); + } else { + for (int i=0; i<tagVarInfos.length; i++) { + String name = tagVarInfos[i].getNameGiven(); + if (name == null) { + name = tagData.getAttributeString( + tagVarInfos[i].getNameFromAttribute()); + } + if (tagVarInfos[i].getScope() == scope) { + if (declare && tagVarInfos[i].getDeclare()) { + out.printin(tagVarInfos[i].getClassName() + " "); + } + out.printin(name); + out.print(" = ("); + out.print(tagVarInfos[i].getClassName()); + out.print(") pageContext.findAttribute("); + out.print(quote(name)); + out.println(");"); } - out.printin(name); - out.print(" = ("); - out.print(tagVarInfos[i].getClassName()); - out.print(") pageContext.findAttribute("); - out.print(quote(name)); - out.println(");"); } - } + } } private String replace(String name, char replace, String with) { Index: src/share/org/apache/jasper/resources/messages.properties =================================================================== RCS file: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/resources/messages.properties,v retrieving revision 1.6 diff -u -r1.6 messages.properties --- src/share/org/apache/jasper/resources/messages.properties 16 May 2002 20:59:21 -0000 1.6 +++ src/share/org/apache/jasper/resources/messages.properties 24 May 2002 22:12:51 +-0000 @@ -127,7 +127,7 @@ jsp.warning.unknown.element.in.attribute=Warning: Unknown element {0} in attribute jsp.error.more.than.one.taglib=More than one taglib in the TLD: {0} jsp.warning.teiclass.is.null=Could not load TagExtraInfo class {0}: {1} -jsp.warning.teiclass.is.nonnull=variable susbelement defined in tld when TagExtraInfo class {0} is non-null +jsp.warning.teiclass.is.nonnull=variable subelement defined in tld when TagExtraInfo +class {0} is non-null jsp.error.parse.error.in.TLD=Parse Error in the tag library descriptor: {0} jsp.error.unable.to.open.TLD=Unable to open the tag library descriptor: {0} jsp.buffer.size.zero=Buffer size <= 0
-- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>