craigmcc 01/02/16 14:17:10 Modified: jasper/src/share/org/apache/jasper/compiler JspUtil.java TagLibraryInfoImpl.java TldLocationsCache.java jasper/src/share/org/apache/jasper/parser TreeNode.java Log: Stage 2 of making Jasper able to load an XML parser from a different class loader. * Modified TagLibraryInfoImpl (which parses TLDs) to use the new parsing routines instead of the old ones in JspUtil. * Added findChild("name") method to TreeNode, to optimize the very common case where there is only one child with a given name. * Updated TldLocationsCache (which scans web.xml files) to use the new findChild() method. * Deprecated the JspUtils.parseXMLDoc() method since nobody is now using it. Before going on to Stage 3 (parsing JSP pages in XML syntax), it is necessary to go implement the special classloader stuff. That's next. Revision Changes Path 1.8 +7 -3 jakarta-tomcat-4.0/jasper/src/share/org/apache/jasper/compiler/JspUtil.java Index: JspUtil.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/jasper/src/share/org/apache/jasper/compiler/JspUtil.java,v retrieving revision 1.7 retrieving revision 1.8 diff -u -r1.7 -r1.8 --- JspUtil.java 2000/11/30 21:47:55 1.7 +++ JspUtil.java 2001/02/16 22:17:02 1.8 @@ -1,7 +1,7 @@ /* - * $Header: /home/cvs/jakarta-tomcat-4.0/jasper/src/share/org/apache/jasper/compiler/JspUtil.java,v 1.7 2000/11/30 21:47:55 pierred Exp $ - * $Revision: 1.7 $ - * $Date: 2000/11/30 21:47:55 $ + * $Header: /home/cvs/jakarta-tomcat-4.0/jasper/src/share/org/apache/jasper/compiler/JspUtil.java,v 1.8 2001/02/16 22:17:02 craigmcc Exp $ + * $Revision: 1.8 $ + * $Date: 2001/02/16 22:17:02 $ * * ==================================================================== * @@ -191,6 +191,8 @@ /** * Parses the XML document contained in the InputStream. + * + * @deprecated Use ParserUtils.parseXMLDocument() instead */ public static Document parseXMLDoc(String uri, InputStream in) throws JasperException @@ -202,6 +204,8 @@ * Parses the XML document contained in the InputStream. * This XML document is either web.xml or a tld. * [The TLD has to be cached internally (see MyEntityResolver)] + * + * @deprecated Use ParserUtils.parseXMLDocument() instead */ public static Document parseXMLDocJaxp(String uri, InputStream in) throws JasperException 1.19 +149 -155 jakarta-tomcat-4.0/jasper/src/share/org/apache/jasper/compiler/TagLibraryInfoImpl.java Index: TagLibraryInfoImpl.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/jasper/src/share/org/apache/jasper/compiler/TagLibraryInfoImpl.java,v retrieving revision 1.18 retrieving revision 1.19 diff -u -r1.18 -r1.19 --- TagLibraryInfoImpl.java 2001/02/04 01:05:46 1.18 +++ TagLibraryInfoImpl.java 2001/02/16 22:17:04 1.19 @@ -1,7 +1,7 @@ /* - * $Header: /home/cvs/jakarta-tomcat-4.0/jasper/src/share/org/apache/jasper/compiler/TagLibraryInfoImpl.java,v 1.18 2001/02/04 01:05:46 glenn Exp $ - * $Revision: 1.18 $ - * $Date: 2001/02/04 01:05:46 $ + * $Header: /home/cvs/jakarta-tomcat-4.0/jasper/src/share/org/apache/jasper/compiler/TagLibraryInfoImpl.java,v 1.19 2001/02/16 22:17:04 craigmcc Exp $ + * $Revision: 1.19 $ + * $Date: 2001/02/16 22:17:04 $ * * The Apache Software License, Version 1.1 * @@ -62,6 +62,7 @@ import java.net.URL; import java.net.MalformedURLException; import java.net.JarURLConnection; +import java.util.Iterator; import java.util.zip.ZipInputStream; import java.util.zip.ZipEntry; import java.util.jar.*; @@ -89,8 +90,8 @@ import javax.servlet.jsp.tagext.VariableInfo; import javax.servlet.jsp.tagext.TagVariableInfo; -import org.w3c.dom.*; -import org.xml.sax.*; +// import org.w3c.dom.*; +// import org.xml.sax.*; import org.apache.jasper.JspCompilationContext; import org.apache.jasper.JasperException; @@ -98,6 +99,10 @@ import org.apache.jasper.logging.Logger; +import org.apache.jasper.parser.ParserUtils; +import org.apache.jasper.parser.TreeNode; + + /** * Implementation of the TagLibraryInfo class from the JSP spec. * @@ -109,8 +114,6 @@ static private final String TAGLIB_TLD = "META-INF/taglib.tld"; static private final String WEB_XML = "/WEB-INF/web.xml"; - Document tld; - Hashtable jarEntries; JspCompilationContext ctxt; @@ -263,45 +266,50 @@ private void parseTLD(String uri, InputStream in) throws JasperException { - tld = JspUtil.parseXMLDoc(uri, in); + Vector tagVector = new Vector(); - NodeList list = tld.getElementsByTagName("taglib"); - if (list.getLength() != 1) - throw new JasperException( - Constants.getString("jsp.error.more.than.one.taglib", - new Object[]{uri})); - - Element elem = (Element) list.item(0); - list = elem.getChildNodes(); - - for(int i = 0; i < list.getLength(); i++) { - Node tmp = list.item(i); - if (! (tmp instanceof Element)) continue; - Element e = (Element) tmp; - String tname = e.getTagName(); - if (tname.equals("tlibversion") || tname.equals("tlib-version")) { - this.tlibversion = JspUtil.getElementChildTextData(e); - } else if (tname.equals("jspversion") || tname.equals("jsp-version")) { - this.jspversion = JspUtil.getElementChildTextData(e); - } else if (tname.equals("shortname") || tname.equals("short-name")) { - this.shortname = JspUtil.getElementChildTextData(e); - } else if (tname.equals("uri")) { - this.urn = JspUtil.getElementChildTextData(e); - } else if (tname.equals("info")) { - this.info = JspUtil.getElementChildTextData(e); - } else if (tname.equals("validator")) { - this.tagLibraryValidator = createValidator(e); - } else if (tname.equals("tag")) - tagVector.addElement(createTagInfo(e)); + // Create an iterator over the child elements of our <taglib> element + ParserUtils pu = new ParserUtils(); + TreeNode tld = pu.parseXMLDocument(uri, in); + Iterator list = tld.findChildren(); + + // Process each child element of our <taglib> element + 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)) + this.shortname = element.getBody(); + else if ("uri".equals(tname)) + this.urn = element.getBody(); + else if ("info".equals(tname) || + "description".equals(tname)) + this.info = element.getBody(); + else if ("validator".equals(tname)) + this.tagLibraryValidator = createValidator(element); + else if ("tag".equals(tname)) + tagVector.addElement(createTagInfo(element)); + else if ("display-name".equals(tname) || // Ignored elements + "small-icon".equals(tname) || + "large-icon".equals(tname) || + "listener".equals(tname)) + ; else { Constants.message("jsp.warning.unknown.element.in.TLD", - new Object[] { - e.getTagName() - }, + new Object[] {tname}, Logger.WARNING ); - } + } + } @@ -309,7 +317,7 @@ tagVector.copyInto (this.tags); } - private TagInfo createTagInfo(Element elem) throws JasperException { + private TagInfo createTagInfo(TreeNode elem) throws JasperException { String name = null; String tagclass = null; String teiclass = null; @@ -321,46 +329,41 @@ Vector attributeVector = new Vector(); Vector variableVector = new Vector(); - NodeList list = elem.getChildNodes(); - for(int i = 0; i < list.getLength(); i++) { - Node tmp = list.item(i); - if (! (tmp instanceof Element)) continue; - Element e = (Element) tmp; - String tname = e.getTagName(); - if (tname.equals("name")) { - name = JspUtil.getElementChildTextData(e); - } else if (tname.equals("tagclass") || tname.equals("tag-class")) { - tagclass = JspUtil.getElementChildTextData(e); - } else if (tname.equals("teiclass") || tname.equals("tei-class")) { - teiclass = JspUtil.getElementChildTextData(e); - } else if (tname.equals("bodycontent") || tname.equals("body-content")) { - bodycontent = JspUtil.getElementChildTextData(e); - } else if (tname.equals("info") || tname.equals("tlib-description")) { - info = JspUtil.getElementChildTextData(e); - } else if (tname.equals("attribute")) { - attributeVector.addElement(createAttribute(e)); - - // JSP 1.2 - - } else if (tname.equals("display-name")) { - displayName = JspUtil.getElementChildTextData(e); - } else if (tname.equals("small-icon")) { - smallIcon = JspUtil.getElementChildTextData(e); - } else if (tname.equals("large-icon")) { - largeIcon = JspUtil.getElementChildTextData(e); - } else if (tname.equals("variable")) { - if (teiclass != null) { - // teiclass comes first in the tag element - // only need to make the check here - throw new JasperException( - Constants.getString("tld.error.variableNotAllowed")); - } - variableVector.addElement(createVariable(e)); - } else { + Iterator list = elem.findChildren(); + while (list.hasNext()) { + TreeNode element = (TreeNode) list.next(); + String tname = element.getName(); + + if ("name".equals(tname)) + name = element.getBody(); + else if ("tagclass".equals(tname) || + "tag-class".equals(tname)) + tagclass = element.getBody(); + else if ("teiclass".equals(tname) || + "tei-class".equals(tname)) + teiclass = element.getBody(); + else if ("bodycontent".equals(tname) || + "body-content".equals(tname)) + bodycontent = element.getBody(); + else if ("display-name".equals(tname)) + displayName = element.getBody(); + else if ("small-icon".equals(tname)) + smallIcon = element.getBody(); + else if ("large-icon".equals(tname)) + largeIcon = element.getBody(); + else if ("info".equals(tname) || + "description".equals(tname)) + info = element.getBody(); + else if ("variable".equals(tname)) { + if (teiclass != null) + throw new JasperException + (Constants.getString("tld.error.variableNotAllowed")); + variableVector.addElement(createVariable(element)); + } else if ("attribute".equals(tname)) + attributeVector.addElement(createAttribute(element)); + else { Constants.message("jsp.warning.unknown.element.in.tag", - new Object[] { - e.getTagName() - }, + new Object[] {tname}, Logger.WARNING ); } @@ -414,71 +417,66 @@ return taginfo; } - TagAttributeInfo createAttribute(Element elem) { + TagAttributeInfo createAttribute(TreeNode elem) { + // p("createAttribute\n" + elem); String name = null; boolean required = false, rtexprvalue = false, reqTime = false; String type = null; - NodeList list = elem.getChildNodes(); - for(int i = 0; i < list.getLength(); i++) { - Node tmp = list.item(i); - if (! (tmp instanceof Element)) continue; - Element e = (Element) tmp; - String tname = e.getTagName(); - if (tname.equals("name")) { - name = JspUtil.getElementChildTextData(e); - } else if (tname.equals("required")) { - String s = JspUtil.getElementChildTextData(e); - if (s != null) { - required = JspUtil.booleanValue(s); - } - } else if (tname.equals("rtexprvalue")) { - String s = JspUtil.getElementChildTextData(e); - if (s != null) { - rtexprvalue = JspUtil.booleanValue(s); - } - } else if (tname.equals("type")) { - type = JspUtil.getElementChildTextData(e); - } else + Iterator list = elem.findChildren(); + while (list.hasNext()) { + TreeNode element = (TreeNode) list.next(); + String tname = element.getName(); + + if ("name".equals(tname)) + name = element.getBody(); + else if ("required".equals(tname)) { + String s = element.getBody(); + if (s != null) + required = JspUtil.booleanValue(s); + } else if ("rtexprvalue".equals(tname)) { + String s = element.getBody(); + if (s != null) + rtexprvalue = JspUtil.booleanValue(s); + } else if ("type".equals(tname)) + type = element.getBody(); + else { Constants.message("jsp.warning.unknown.element.in.attribute", - new Object[] { - e.getTagName() - }, + new Object[] {tname}, Logger.WARNING ); + } } - // return new TagAttributeInfo(name, required, rtexprvalue, type); + // p("name=" + name + ", required=" + required + ", type=" + type + + // ", rtexprvalue=" + rtexprvalue); return new TagAttributeInfo(name, required, type, rtexprvalue); } - TagVariableInfo createVariable(Element elem) { + TagVariableInfo createVariable(TreeNode elem) { String nameGiven = null; String nameFromAttribute = null; String className = null; boolean declare = true; int scope = VariableInfo.NESTED; - NodeList list = elem.getChildNodes(); - for(int i=0; i<list.getLength(); i++) { - Node tmp = list.item(i); - if (!(tmp instanceof Element)) continue; - Element e = (Element) tmp; - String tname = e.getTagName(); - if (tname.equals("name-given")) { - nameGiven = JspUtil.getElementChildTextData(e); - } else if (tname.equals("name-from-attribute")) { - nameFromAttribute = JspUtil.getElementChildTextData(e); - } else if (tname.equals("variable-class")) { - className = JspUtil.getElementChildTextData(e); - } else if (tname.equals("declare")) { - String s = JspUtil.getElementChildTextData(e); + Iterator list = elem.findChildren(); + while (list.hasNext()) { + TreeNode element = (TreeNode) list.next(); + String tname = element.getName(); + if ("name-given".equals(tname)) + nameGiven = element.getBody(); + else if ("name-from-attribute".equals(tname)) + nameFromAttribute = element.getBody(); + else if ("variable-class".equals(tname)) + className = element.getBody(); + else if ("declare".equals(tname)) { + String s = element.getBody(); + if (s != null) + declare = JspUtil.booleanValue(s); + } else if ("scope".equals(tname)) { + String s = element.getBody(); if (s != null) { - declare = JspUtil.booleanValue(s); - } - } else if (tname.equals("scope")) { - String s = JspUtil.getElementChildTextData(e); - if (s != null) { if ("NESTED".equals(s)) { scope = VariableInfo.NESTED; } else if ("AT_BEGIN".equals(s)) { @@ -489,7 +487,7 @@ } } else { Constants.message("jsp.warning.unknown.element.in.variable", - new Object[] {e.getTagName()}, + new Object[] {tname}, Logger.WARNING); } } @@ -497,24 +495,22 @@ className, declare, scope); } - private TagLibraryValidator createValidator(Element elem) { + private TagLibraryValidator createValidator(TreeNode elem) { String validatorClass = null; Map initParams = new Hashtable(); - - NodeList list = elem.getChildNodes(); - for(int i=0; i<list.getLength(); i++) { - Node tmp = list.item(i); - if (!(tmp instanceof Element)) continue; - Element e = (Element) tmp; - String tname = e.getTagName(); - if (tname.equals("validator-class")) { - validatorClass = JspUtil.getElementChildTextData(e); - } else if (tname.equals("init-param")) { - String[] initParam = createInitParam(e); + + Iterator list = elem.findChildren(); + while (list.hasNext()) { + TreeNode element = (TreeNode) list.next(); + String tname = element.getName(); + if ("validator-class".equals(tname)) + validatorClass = element.getBody(); + else if ("init-param".equals(tname)) { + String[] initParam = createInitParam(element); initParams.put(initParam[0], initParam[1]); } else { Constants.message("jsp.warning.unknown.element.in.validator", //@@@ add in properties - new Object[] {e.getTagName()}, + new Object[] {tname}, Logger.WARNING); } } @@ -541,24 +537,22 @@ return tlv; } - String[] createInitParam(Element elem) { + String[] createInitParam(TreeNode elem) { String[] initParam = new String[2]; - NodeList list = elem.getChildNodes(); - for(int i=0; i<list.getLength(); i++) { - Node tmp = list.item(i); - if (!(tmp instanceof Element)) continue; - Element e = (Element) tmp; - String tname = e.getTagName(); - if (tname.equals("param-name")) { - initParam[0] = JspUtil.getElementChildTextData(e); - } else if (tname.equals("param-value")) { - initParam[1] = JspUtil.getElementChildTextData(e); - } else if (tname.equals("description")) { - // do nothing - } else { + Iterator list = elem.findChildren(); + while (list.hasNext()) { + TreeNode element = (TreeNode) list.next(); + String tname = element.getName(); + if ("param-name".equals(tname)) + initParam[0] = element.getBody(); + else if ("param-value".equals(tname)) + initParam[1] = element.getBody(); + else if ("description".equals(tname)) + ; // Do nothing + else { Constants.message("jsp.warning.unknown.element.in.initParam", //@@@ properties - new Object[] {e.getTagName()}, + new Object[] {tname}, Logger.WARNING); } } 1.5 +11 -16 jakarta-tomcat-4.0/jasper/src/share/org/apache/jasper/compiler/TldLocationsCache.java Index: TldLocationsCache.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/jasper/src/share/org/apache/jasper/compiler/TldLocationsCache.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- TldLocationsCache.java 2001/02/16 07:14:33 1.4 +++ TldLocationsCache.java 2001/02/16 22:17:05 1.5 @@ -163,19 +163,13 @@ // Parse the next <taglib> element TreeNode taglib = (TreeNode) taglibs.next(); String tagUri = null; - Iterator uris = taglib.findChildren("taglib-uri"); - while (uris.hasNext()) { - TreeNode uri = (TreeNode) uris.next(); - if (tagUri == null) - tagUri = uri.getBody(); - } String tagLoc = null; - Iterator locs = taglib.findChildren("taglib-location"); - while (locs.hasNext()) { - TreeNode loc = (TreeNode) locs.next(); - if (tagLoc == null) - tagLoc = loc.getBody(); - } + TreeNode child = taglib.findChild("taglib-uri"); + if (child != null) + tagUri = child.getBody(); + child = taglib.findChild("taglib-location"); + if (child != null) + tagLoc = child.getBody(); // Save this location if appropriate if (tagLoc == null) @@ -291,10 +285,11 @@ return null; } TreeNode taglib = (TreeNode) taglibs.next(); - Iterator uris = taglib.findChildren("uri"); - while (uris.hasNext()) { - TreeNode uri = (TreeNode) uris.next(); - return uri.getBody(); + TreeNode uri = taglib.findChild("uri"); + if (uri != null) { + String body = uri.getBody(); + if (body != null) + return body; } } return null; // No <uri> element is present 1.2 +22 -1 jakarta-tomcat-4.0/jasper/src/share/org/apache/jasper/parser/TreeNode.java Index: TreeNode.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/jasper/src/share/org/apache/jasper/parser/TreeNode.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- TreeNode.java 2001/02/16 07:14:34 1.1 +++ TreeNode.java 2001/02/16 22:17:08 1.2 @@ -72,7 +72,7 @@ * synchronized. * * @author Craig R. McClanahan - * @version $Revision: 1.1 $ $Date: 2001/02/16 07:14:34 $ + * @version $Revision: 1.2 $ $Date: 2001/02/16 22:17:08 $ */ public class TreeNode { @@ -203,6 +203,27 @@ return (Collections.EMPTY_LIST.iterator()); else return (attributes.keySet().iterator()); + + } + + + /** + * Return the first child node of this node with the specified name, + * if there is one; otherwise, return <code>null</code>. + * + * @param name Name of the desired child element + */ + public TreeNode findChild(String name) { + + if (children == null) + return (null); + Iterator items = children.iterator(); + while (items.hasNext()) { + TreeNode item = (TreeNode) items.next(); + if (name.equals(item.getName())) + return (item); + } + return (null); } --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, email: [EMAIL PROTECTED]