From 3b475d3d0c4a3966fbf3e2e4b70c6f3cb530eca6 Mon Sep 17 00:00:00 2001 From: remm Date: Tue, 31 Oct 2006 16:28:55 +0000 Subject: [PATCH] - Add parsing of implicit.tld for tag files. git-svn-id: https://svn.apache.org/repos/asf/tomcat/tc6.0.x/trunk@469542 13f79535-47bb-0310-9956-ffa450edef68 --- .../jasper/compiler/ImplicitTagLibraryInfo.java | 224 +++++++++++++-------- .../jasper/resources/LocalStrings.properties | 2 + 2 files changed, 147 insertions(+), 79 deletions(-) diff --git a/java/org/apache/jasper/compiler/ImplicitTagLibraryInfo.java b/java/org/apache/jasper/compiler/ImplicitTagLibraryInfo.java index 6a59a246a..dbe9c1ec7 100644 --- a/java/org/apache/jasper/compiler/ImplicitTagLibraryInfo.java +++ b/java/org/apache/jasper/compiler/ImplicitTagLibraryInfo.java @@ -17,13 +17,22 @@ package org.apache.jasper.compiler; -import java.util.*; +import java.io.InputStream; +import java.util.Collection; +import java.util.Hashtable; +import java.util.Iterator; +import java.util.Set; +import java.util.Vector; + import javax.servlet.jsp.tagext.FunctionInfo; -import javax.servlet.jsp.tagext.TagLibraryInfo; -import javax.servlet.jsp.tagext.TagInfo; import javax.servlet.jsp.tagext.TagFileInfo; -import org.apache.jasper.JspCompilationContext; +import javax.servlet.jsp.tagext.TagInfo; +import javax.servlet.jsp.tagext.TagLibraryInfo; + import org.apache.jasper.JasperException; +import org.apache.jasper.JspCompilationContext; +import org.apache.jasper.xmlparser.ParserUtils; +import org.apache.jasper.xmlparser.TreeNode; /** * Class responsible for generating an implicit tag library containing tag @@ -40,6 +49,7 @@ class ImplicitTagLibraryInfo extends TagLibraryInfo { private static final String TAGS_SHORTNAME = "tags"; private static final String TLIB_VERSION = "1.0"; private static final String JSP_VERSION = "2.0"; + private static final String IMPLICIT_TLD = "implicit.tld"; // Maps tag names to tag file paths private Hashtable tagFileMap; @@ -52,59 +62,115 @@ class ImplicitTagLibraryInfo extends TagLibraryInfo { * Constructor. */ public ImplicitTagLibraryInfo(JspCompilationContext ctxt, - ParserController pc, - PageInfo pi, - String prefix, - String tagdir, - ErrorDispatcher err) throws JasperException { + ParserController pc, + PageInfo pi, + String prefix, + String tagdir, + ErrorDispatcher err) throws JasperException { super(prefix, null); - this.pc = pc; - this.pi = pi; - this.tagFileMap = new Hashtable(); - this.vec = new Vector(); + this.pc = pc; + this.pi = pi; + this.tagFileMap = new Hashtable(); + this.vec = new Vector(); // Implicit tag libraries have no functions: this.functions = new FunctionInfo[0]; - tlibversion = TLIB_VERSION; - jspversion = JSP_VERSION; - - if (!tagdir.startsWith(WEB_INF_TAGS)) { - err.jspError("jsp.error.invalid.tagdir", tagdir); - } - - // Determine the value of the subelement of the - // "imaginary" element - if (tagdir.equals(WEB_INF_TAGS) - || tagdir.equals( WEB_INF_TAGS + "/")) { - shortname = TAGS_SHORTNAME; - } else { - shortname = tagdir.substring(WEB_INF_TAGS.length()); - shortname = shortname.replace('/', '-'); - } - - // Populate mapping of tag names to tag file paths - Set dirList = ctxt.getResourcePaths(tagdir); - if (dirList != null) { - Iterator it = dirList.iterator(); - while (it.hasNext()) { - String path = (String) it.next(); - if (path.endsWith(TAG_FILE_SUFFIX) - || path.endsWith(TAGX_FILE_SUFFIX)) { - /* - * Use the filename of the tag file, without the .tag or - * .tagx extension, respectively, as the subelement - * of the "imaginary" element - */ - String suffix = path.endsWith(TAG_FILE_SUFFIX) ? - TAG_FILE_SUFFIX : TAGX_FILE_SUFFIX; - String tagName = path.substring(path.lastIndexOf("/") + 1); - tagName = tagName.substring(0, - tagName.lastIndexOf(suffix)); - tagFileMap.put(tagName, path); - } - } - } + tlibversion = TLIB_VERSION; + jspversion = JSP_VERSION; + + if (!tagdir.startsWith(WEB_INF_TAGS)) { + err.jspError("jsp.error.invalid.tagdir", tagdir); + } + + // Determine the value of the subelement of the + // "imaginary" element + if (tagdir.equals(WEB_INF_TAGS) + || tagdir.equals( WEB_INF_TAGS + "/")) { + shortname = TAGS_SHORTNAME; + } else { + shortname = tagdir.substring(WEB_INF_TAGS.length()); + shortname = shortname.replace('/', '-'); + } + + // Populate mapping of tag names to tag file paths + Set dirList = ctxt.getResourcePaths(tagdir); + if (dirList != null) { + Iterator it = dirList.iterator(); + while (it.hasNext()) { + String path = (String) it.next(); + if (path.endsWith(TAG_FILE_SUFFIX) + || path.endsWith(TAGX_FILE_SUFFIX)) { + /* + * Use the filename of the tag file, without the .tag or + * .tagx extension, respectively, as the subelement + * of the "imaginary" element + */ + String suffix = path.endsWith(TAG_FILE_SUFFIX) ? + TAG_FILE_SUFFIX : TAGX_FILE_SUFFIX; + String tagName = path.substring(path.lastIndexOf("/") + 1); + tagName = tagName.substring(0, + tagName.lastIndexOf(suffix)); + tagFileMap.put(tagName, path); + } else if (path.endsWith(IMPLICIT_TLD)) { + InputStream in = null; + try { + in = ctxt.getResourceAsStream(path); + if (in != null) { + + // Add implicit TLD to dependency list + if (pi != null) { + pi.addDependant(path); + } + + ParserUtils pu = new ParserUtils(); + TreeNode tld = pu.parseXMLDocument(uri, in); + + if (tld.findAttribute("version") != null) { + this.jspversion = tld.findAttribute("version"); + } + + // Process each child element of our element + Iterator list = tld.findChildren(); + + while (list.hasNext()) { + TreeNode element = (TreeNode) list.next(); + String tname = element.getName(); + + if ("tlibversion".equals(tname) // JSP 1.1 + || "tlib-version".equals(tname)) { // JSP 1.2 + this.tlibversion = element.getBody(); + } else if ("jspversion".equals(tname) + || "jsp-version".equals(tname)) { + this.jspversion = element.getBody(); + } else if ("shortname".equals(tname) || "short-name".equals(tname)) { + // Ignore + } else { + // All other elements are invalid + err.jspError("jsp.error.invalid.implicit", path); + } + } + try { + double version = Double.parseDouble(this.jspversion); + if (version < 2.0) { + err.jspError("jsp.error.invalid.implicit.version", path); + } + } catch (NumberFormatException e) { + err.jspError("jsp.error.invalid.implicit.version", path); + } + } + } finally { + if (in != null) { + try { + in.close(); + } catch (Throwable t) { + } + } + } + } + } + } + } /** @@ -116,36 +182,36 @@ class ImplicitTagLibraryInfo extends TagLibraryInfo { */ public TagFileInfo getTagFile(String shortName) { - TagFileInfo tagFile = super.getTagFile(shortName); - if (tagFile == null) { - String path = (String) tagFileMap.get(shortName); - if (path == null) { - return null; - } - - TagInfo tagInfo = null; - try { - tagInfo = TagFileProcessor.parseTagFileDirectives(pc, - shortName, - path, - this); - } catch (JasperException je) { - throw new RuntimeException(je.toString(), je); - } - - tagFile = new TagFileInfo(shortName, path, tagInfo); - vec.addElement(tagFile); - - this.tagFiles = new TagFileInfo[vec.size()]; - vec.copyInto(this.tagFiles); - } - - return tagFile; + TagFileInfo tagFile = super.getTagFile(shortName); + if (tagFile == null) { + String path = (String) tagFileMap.get(shortName); + if (path == null) { + return null; + } + + TagInfo tagInfo = null; + try { + tagInfo = TagFileProcessor.parseTagFileDirectives(pc, + shortName, + path, + this); + } catch (JasperException je) { + throw new RuntimeException(je.toString(), je); + } + + tagFile = new TagFileInfo(shortName, path, tagInfo); + vec.addElement(tagFile); + + this.tagFiles = new TagFileInfo[vec.size()]; + vec.copyInto(this.tagFiles); + } + + return tagFile; } - + public TagLibraryInfo[] getTagLibraryInfos() { Collection coll = pi.getTaglibs(); return (TagLibraryInfo[]) coll.toArray(new TagLibraryInfo[0]); } - + } diff --git a/java/org/apache/jasper/resources/LocalStrings.properties b/java/org/apache/jasper/resources/LocalStrings.properties index f664790ee..94e7b5ac1 100644 --- a/java/org/apache/jasper/resources/LocalStrings.properties +++ b/java/org/apache/jasper/resources/LocalStrings.properties @@ -77,6 +77,8 @@ jsp.error.invalid.forward=Invalid forward tag jsp.error.unknownException=Unhandled error! You might want to consider having an error page \ to report such errors more gracefully jsp.error.invalid.directive=Invalid directive +jsp.error.invalid.implicit=Invalid implicit TLD for tag file at {0} +jsp.error.invalid.implicit.version=Invalid JSP version defined in implicit TLD for tag file at {0} jsp.error.directive.istagfile={0} directive cannot be used in a tag file jsp.error.directive.isnottagfile={0} directive can only be used in a tag file jsp.error.tagfile.tld.name=The \"name\" attribute of the tag directive has a value {0} while the \"name\" tag of the \"tag-file\" element in the TLD is {1} -- 2.11.0