kinman 2003/12/04 11:37:58 Modified: jasper2/src/share/org/apache/jasper/compiler Parser.java TagFileProcessor.java jasper2/src/share/org/apache/jasper/resources messages.properties messages_es.properties messages_fr.properties messages_ja.properties Log: - Rewrite error checking when processing tag files to conform with the lastest JSP spec. Check that names declared in any of the following in a translation unit is unique. * name attribute in attribute directive * name-given attribute in variable directive * alias attribute in variable directive * dynamic-attributes attribute in tag directive except that dynamic-attributes attribute of the tag directive can be declared more than once with the same value. Also check that name-from-attribute attributes of variable directives are unique, and that they refer to attribte directives declared in the same translation unit, with the correct attribute values. Revision Changes Path 1.85 +4 -3 jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Parser.java Index: Parser.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Parser.java,v retrieving revision 1.84 retrieving revision 1.85 diff -u -r1.84 -r1.85 --- Parser.java 29 Oct 2003 21:53:43 -0000 1.84 +++ Parser.java 4 Dec 2003 19:37:58 -0000 1.85 @@ -1942,6 +1942,7 @@ reader.setSingleFile(true); reader.skipUntil("<"); while (reader.hasMoreInput()) { + start = reader.mark(); if (reader.matches("%--")) { parseComment(parent); } else if (reader.matches("%@")) { 1.53 +114 -93 jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/TagFileProcessor.java Index: TagFileProcessor.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/TagFileProcessor.java,v retrieving revision 1.52 retrieving revision 1.53 diff -u -r1.52 -r1.53 --- TagFileProcessor.java 2 Sep 2003 21:39:59 -0000 1.52 +++ TagFileProcessor.java 4 Dec 2003 19:37:58 -0000 1.53 @@ -68,6 +68,7 @@ import java.net.URLClassLoader; import java.util.Iterator; import java.util.Vector; +import java.util.HashMap; import javax.servlet.jsp.tagext.TagAttributeInfo; import javax.servlet.jsp.tagext.TagExtraInfo; @@ -145,6 +146,19 @@ private Vector attributeVector; private Vector variableVector; + private static final String ATTR_NAME = + "the name attribute of the attribute directive"; + private static final String VAR_NAME_GIVEN = + "the name-given attribute of the variable directive"; + private static final String VAR_NAME_FROM = + "the name-from-attribute attribute of the variable directive"; + private static final String VAR_ALIAS = + "the alias attribute of the variable directive"; + private static final String TAG_DYNAMIC = + "the dynamic-attributes attribute of the tag directive"; + private HashMap nameTable = new HashMap(); + private HashMap nameFromTable = new HashMap(); + public TagFileDirectiveVisitor(Compiler compiler, TagLibraryInfo tagLibInfo, String name, @@ -171,6 +185,9 @@ bodycontent); } dynamicAttrsMapName = n.getAttributeValue("dynamic-attributes"); + if (dynamicAttrsMapName != null) { + checkUniqueName(dynamicAttrsMapName, TAG_DYNAMIC, n); + } smallIcon = n.getAttributeValue("small-icon"); largeIcon = n.getAttributeValue("large-icon"); description = n.getAttributeValue("description"); @@ -210,9 +227,11 @@ type = "java.lang.String"; } - attributeVector.addElement( + TagAttributeInfo tagAttributeInfo = new TagAttributeInfo(attrName, required, type, rtexprvalue, - fragment)); + fragment); + attributeVector.addElement(tagAttributeInfo); + checkUniqueName(attrName, ATTR_NAME, n, tagAttributeInfo); } public void visit(Node.VariableDirective n) throws JasperException { @@ -265,6 +284,12 @@ * denotes the name of the variable that is being aliased */ nameGiven = alias; + checkUniqueName(nameFromAttribute, VAR_NAME_FROM, n); + checkUniqueName(alias, VAR_ALIAS, n); + } + else { + // name-given specified + checkUniqueName(nameGiven, VAR_NAME_GIVEN, n); } variableVector.addElement(new TagVariableInfo( @@ -332,6 +357,90 @@ tagVariableInfos, dynamicAttrsMapName); } + + static class NameEntry { + private String type; + private Node node; + private TagAttributeInfo attr; + + NameEntry(String type, Node node, TagAttributeInfo attr) { + this.type = type; + this.node = node; + this.attr = attr; + } + + String getType() { return type;} + Node getNode() { return node; } + TagAttributeInfo getTagAttributeInfo() { return attr; } + } + + /** + * Reports a translation error if names specified in attributes of + * directives are not unique in this translation unit. + * + * The value of the following attributes must be unique. + * 1. 'name' attribute of an attribute directive + * 2. 'name-given' attribute of a variable directive + * 3. 'alias' attribute of variable directive + * 4. 'dynamic-attributes' of a tag directive + * except that 'dynamic-attributes' can (and must) have the same + * value when it appears in multiple tag directives. + * + * Also, 'name-from' attribute of a variable directive cannot have + * the same value as that from another variable directive. + */ + private void checkUniqueName(String name, String type, Node n) + throws JasperException { + checkUniqueName(name, type, n, null); + } + + private void checkUniqueName(String name, String type, Node n, + TagAttributeInfo attr) + throws JasperException { + + HashMap table = (type == VAR_NAME_FROM)? nameFromTable: nameTable; + NameEntry nameEntry = (NameEntry) table.get(name); + if (nameEntry != null) { + if (type != TAG_DYNAMIC) { + int line = nameEntry.getNode().getStart().getLineNumber(); + err.jspError(n, "jsp.error.tagfile.nameNotUnique", + type, nameEntry.getType(), Integer.toString(line)); + } + } else { + table.put(name, new NameEntry(type, n, attr)); + } + } + + /** + * Perform miscellean checks after the nodes are visited. + */ + void postCheck() throws JasperException { + // Check that var.name-from-attributes has valid values. + Iterator iter = nameFromTable.keySet().iterator(); + while (iter.hasNext()) { + String nameFrom = (String) iter.next(); + NameEntry nameEntry = (NameEntry) nameTable.get(nameFrom); + NameEntry nameFromEntry = + (NameEntry) nameFromTable.get(nameFrom); + Node nameFromNode = nameFromEntry.getNode(); + if (nameEntry == null) { + err.jspError(nameFromNode, + "jsp.error.tagfile.nameFrom.noAttribute", + nameFrom); + } else { + Node node = nameEntry.getNode(); + TagAttributeInfo tagAttr = nameEntry.getTagAttributeInfo(); + if (! "java.lang.String".equals(tagAttr.getTypeName()) + || ! tagAttr.isRequired() + || tagAttr.canBeRequestTime()){ + err.jspError(nameFromNode, + "jsp.error.tagfile.nameFrom.badAttribute", + nameFrom, + Integer.toString(node.getStart().getLineNumber())); + } + } + } + } } /** @@ -367,97 +476,9 @@ = new TagFileDirectiveVisitor(pc.getCompiler(), tagLibInfo, name, path); page.visit(tagFileVisitor); - - /* - * TODO: need to check for uniqueness of attribute name, variable - * name-given, and variable alias. - */ - - /* - * It is illegal to have a variable.name-given or variable.alias equal - * to an attribute.name in the same tag file translation unit. - */ - Iterator attrsIter = tagFileVisitor.getAttributesVector().iterator(); - while (attrsIter.hasNext()) { - TagAttributeInfo attrInfo = (TagAttributeInfo) attrsIter.next(); - Iterator varsIter = tagFileVisitor.getVariablesVector().iterator(); - while (varsIter.hasNext()) { - TagVariableInfo varInfo = (TagVariableInfo) varsIter.next(); - String attrName = attrInfo.getName(); - if (attrName.equals(varInfo.getNameGiven())) { - err.jspError("jsp.error.tagfile.var_name_given_equals_attr_name", - path, attrName); - } - } - } - - /* - * It is illegal to have a variable.name-given equal another - * variable.alias in the same tag file translation unit. - */ - Iterator varsIter = tagFileVisitor.getVariablesVector().iterator(); - while (varsIter.hasNext()) { - TagVariableInfo varsInfo = (TagVariableInfo) varsIter.next(); - if (varsInfo.getNameFromAttribute() == null) { - // Only interested in aliases. - continue; - } - String nameGiven = varsInfo.getNameGiven(); - - Iterator varsIter2 = tagFileVisitor.getVariablesVector().iterator(); - while (varsIter2.hasNext()) { - TagVariableInfo varsInfo2 = (TagVariableInfo) varsIter2.next(); - if (varsInfo2.getNameFromAttribute() != null) { - // Only interest in non-aliases - continue; - } - if (nameGiven.equals(varsInfo2.getNameGiven())) { - err.jspError("jsp.error.tagfile.nameGiven_equals.alias", - path, nameGiven); - } - } - } - - checkDynamicAttributesUniqueness(tagFileVisitor, path, err); + tagFileVisitor.postCheck(); return tagFileVisitor.getTagInfo(); - } - - /* - * Reports a translation error if there is a tag directive with - * a 'dynamic-attributes' attribute equal to the value of a - * 'name-given' attribute of a variable directive or equal to the - * value of a 'name' attribute of an attribute directive in this - * translation unit. - */ - private static void checkDynamicAttributesUniqueness( - TagFileDirectiveVisitor tfv, - String path, - ErrorDispatcher err) - throws JasperException { - - String dynamicAttrsMapName = tfv.getDynamicAttributesMapName(); - if (dynamicAttrsMapName == null) { - return; - } - - Iterator attrs = tfv.getAttributesVector().iterator(); - while (attrs.hasNext()) { - TagAttributeInfo attrInfo = (TagAttributeInfo) attrs.next(); - if (dynamicAttrsMapName.equals(attrInfo.getName())) { - err.jspError("jsp.error.tagfile.tag_dynamic_attrs_equals_attr_name", - path, dynamicAttrsMapName); - } - } - - Iterator vars = tfv.getVariablesVector().iterator(); - while (vars.hasNext()) { - TagVariableInfo varInfo = (TagVariableInfo) vars.next(); - if (dynamicAttrsMapName.equals(varInfo.getNameGiven())) { - err.jspError("jsp.error.tagfile.tag_dynamic_attrs_equals_var_name_given", - path, dynamicAttrsMapName); - } - } } /** 1.135 +5 -5 jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/resources/messages.properties Index: messages.properties =================================================================== RCS file: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/resources/messages.properties,v retrieving revision 1.134 retrieving revision 1.135 diff -u -r1.134 -r1.135 --- messages.properties 29 Oct 2003 21:53:43 -0000 1.134 +++ messages.properties 4 Dec 2003 19:37:58 -0000 1.135 @@ -181,7 +181,7 @@ jsp.message.adding_jar=Adding jar {0} to my classpath jsp.message.compiling_with=Compiling with: {0} jsp.message.template_text=template text -jsp.error.missing_attribute=According to the TLD attribute {0} is mandatory for tag {1} +jsp.error.missing_attribute=According to the TLD or the tag file, attribute {0} is mandatory for tag {1} jsp.error.bad_attribute=Attribute {0} invalid for tag {1} according to TLD jsp.error.tld.unable_to_read=Unable to read TLD \"{1}\" from JAR file \"{0}\": {2} jsp.error.tld.unable_to_get_jar=Unable to get JAR resource \"{0}\" containing TLD: {1} @@ -336,9 +336,9 @@ jsp.error.attribute.standard.non_rt_with_expr=The {0} attribute of the {1} standard action does not accept any expressions jsp.error.scripting.variable.missing_name=Unable to determine scripting variable name from attribute {0} jasper.error.emptybodycontent.nonempty=According to TLD, tag {0} must be empty, but is not -jsp.error.tagfile.var_name_given_equals_attr_name=In tag file {0}, the name-given attribute or the alias attribute of a variable directive equals the name attribute of an attribute directive: {1} -jsp.error.tagfile.tag_dynamic_attrs_equals_var_name_given=In tag file {0}, the dynamic-attributes attribute of a tag directive equals the name-given attribute of a variable directive: {1} -jsp.error.tagfile.tag_dynamic_attrs_equals_attr_name=In tag file {0}, the dynamic-attributes attribute of a tag directive equals the name attribute of an attribute directive: {1} +jsp.error.tagfile.nameNotUnique=The value of {0} and the value of {1} in line {2} are the same. +jsp.error.tagfile.nameFrom.noAttribute=Cannot find an attribute directive with a name attribute with a value \"{0}\", the value of this name-from-attribute attribute. +jsp.error.tagfile.nameFrom.badAttribute=The attribute directive (declared in line {1} and whose name attribute is \"{0}\", the value of this name-from-attribute attribute) must be of type java.lang.String, is \"required\" and not a \"rtexprvalue\". jsp.error.page.noSession=Cannot access session scope in page that does not participate in any session jsp.error.useBean.noSession=Illegal for useBean to use session scope when JSP page declares (via page directive) that it does not participate in sessions jsp.error.xml.encodingByteOrderUnsupported = Given byte order for encoding \"{0}\" is not supported. 1.45 +4 -2 jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/resources/messages_es.properties Index: messages_es.properties =================================================================== RCS file: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/resources/messages_es.properties,v retrieving revision 1.44 retrieving revision 1.45 diff -u -r1.44 -r1.45 --- messages_es.properties 15 Aug 2003 00:06:10 -0000 1.44 +++ messages_es.properties 4 Dec 2003 19:37:58 -0000 1.45 @@ -211,7 +211,9 @@ jsp.error.attribute.custom.non_rt_with_expr= jsp.error.scripting.variable.missing_name= jasper.error.emptybodycontent.nonempty= -jsp.error.tagfile.var_name_given_equals_attr_name= +jsp.error.tagfile.nameNotUnique= +jsp.error.tagfile.nameFrom.noAttribute= +jsp.error.tagfile.nameFrom.badAttribute= jsp.error.useBean.noSession= jsp.error.xml.encodingByteOrderUnsupported= jsp.error.xml.encodingDeclInvalid= 1.30 +4 -2 jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/resources/messages_fr.properties Index: messages_fr.properties =================================================================== RCS file: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/resources/messages_fr.properties,v retrieving revision 1.29 retrieving revision 1.30 diff -u -r1.29 -r1.30 --- messages_fr.properties 15 Aug 2003 00:06:10 -0000 1.29 +++ messages_fr.properties 4 Dec 2003 19:37:58 -0000 1.30 @@ -281,7 +281,9 @@ jsp.error.attribute.custom.non_rt_with_expr=D''après la TLD, l''attribut {0} n''accepte aucune expression jsp.error.scripting.variable.missing_name=Incapable de déterminer le nom de variable scripting d''après l''attribut {0} jasper.error.emptybodycontent.nonempty=D''après la TLD, le tag {0} doit être vide, mais ne l''est pas -jsp.error.tagfile.var_name_given_equals_attr_name=Dans le fichier de tag {0}, l''attribut name-given ({1}) de la directive variable est égal au nom d''attribut de la directive attribute +jsp.error.tagfile.nameNotUnique= +jsp.error.tagfile.nameFrom.noAttribute= +jsp.error.tagfile.nameFrom.badAttribute= jsp.error.useBean.noSession=Il est illégal pour useBean d''utiliser une portée de session (session scope) quand la page JSP indique (via la directive de page) qu''elle ne participe pas aux sessions jsp.error.attributes.not.allowed = {0} ne doit avoir aucun attribut jsp.error.nested.jspattribute= 1.48 +4 -4 jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/resources/messages_ja.properties Index: messages_ja.properties =================================================================== RCS file: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/resources/messages_ja.properties,v retrieving revision 1.47 retrieving revision 1.48 diff -u -r1.47 -r1.48 --- messages_ja.properties 1 Dec 2003 21:37:43 -0000 1.47 +++ messages_ja.properties 4 Dec 2003 19:37:58 -0000 1.48 @@ -333,9 +333,9 @@ jsp.error.attribute.standard.non_rt_with_expr={1} \u6a19\u6e96\u30a2\u30af\u30b7\u30e7\u30f3\u306e {0} \u5c5e\u6027\u306f\u3069\u3093\u306a\u5f0f\u3082\u53d7\u3051\u4ed8\u3051\u307e\u305b\u3093 jsp.error.scripting.variable.missing_name=\u5c5e\u6027 {0} \u304b\u3089\u30b9\u30af\u30ea\u30d7\u30c8\u5909\u6570\u540d\u3092\u6c7a\u5b9a\u3067\u304d\u307e\u305b\u3093 jasper.error.emptybodycontent.nonempty=TLD\u306b\u5f93\u3063\u3066\u30bf\u30b0 {0} \u306f\u7a7a\u3067\u306a\u3051\u308c\u3070\u3044\u3051\u307e\u305b\u3093\u304c\u3001\u305d\u3046\u3067\u306f\u3042\u308a\u307e\u305b\u3093 -jsp.error.tagfile.var_name_given_equals_attr_name=\u30bf\u30b0\u30d5\u30a1\u30a4\u30eb {0} \u4e2d\u3067\u3001variable\u6307\u793a\u5b50\u306ename-given\u5c5e\u6027\u53c8\u306falias\u5c5e\u6027 ({1})\u304cattribute\u6307\u793a\u5b50\u306ename\u5c5e\u6027\u3068\u540c\u3058\u3067\u3059 -jsp.error.tagfile.tag_dynamic_attrs_equals_var_name_given=\u30bf\u30b0\u30d5\u30a1\u30a4\u30eb {0} \u4e2d\u3067\u3001tag\u6307\u793a\u5b50\u306edynamic-attributes\u5c5e\u6027\u304cvariable\u6307\u793a\u5b50\u306ename-given\u5c5e\u6027\u3068\u540c\u3058\u3067\u3059: {1} -jsp.error.tagfile.tag_dynamic_attrs_equals_attr_name=\u30bf\u30b0\u30d5\u30a1\u30a4\u30eb {0} \u4e2d\u3067\u3001tag\u6307\u793a\u5b50\u306edynamic-attributes\u5c5e\u6027\u304cattribute\u6307\u793a\u5b50\u306ename\u5c5e\u6027\u3068\u540c\u3058\u3067\u3059: {1} +jsp.error.tagfile.nameNotUnique= +jsp.error.tagfile.nameFrom.noAttribute= +jsp.error.tagfile.nameFrom.badAttribute= jsp.error.page.noSession=\u30bb\u30c3\u30b7\u30e7\u30f3\u306b\u52a0\u308f\u3063\u3066\u3044\u306a\u3044\u30da\u30fc\u30b8\u306e\u4e2d\u3067\u306f\u30bb\u30c3\u30b7\u30e7\u30f3\u30b9\u30b3\u30fc\u30d7\u306b\u30a2\u30af\u30bb\u30b9\u3067\u304d\u307e\u305b\u3093 jsp.error.useBean.noSession=JSP\u30da\u30fc\u30b8\u304c(page\u6307\u793a\u5b50\u306b\u3088\u308a)\u30bb\u30c3\u30b7\u30e7\u30f3\u4e2d\u3067\u5354\u8abf\u3057\u306a\u3044\u3053\u3068\u3092\u5ba3\u8a00\u3057\u3066\u3044\u308b\u6642\u3001\u30bb\u30c3\u30b7\u30e7\u30f3\u30b9\u30b3\u30fc\u30d7\u3092\u4f7f\u7528\u3059\u308b\u305f\u3081\u306euseBean\u304c\u4e0d\u6b63\u3067\u3059 jsp.error.xml.encodingByteOrderUnsupported = \u30a8\u30f3\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0 \"{0}\" \u306b\u6307\u5b9a\u3055\u308c\u305f\u30d0\u30a4\u30c8\u30aa\u30fc\u30c0\u306f\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u307e\u305b\u3093
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]