Author: markt Date: Mon Jan 13 13:46:33 2014 New Revision: 1557714 URL: http://svn.apache.org/r1557714 Log: Back-port from XML processing improvements (part 8) Switch ParserUtils to use the new ErrorHandler Back-port of http://svn.apache.org/r1547947 and http://svn.apache.org/r1556840
Modified: tomcat/tc6.0.x/trunk/STATUS.txt tomcat/tc6.0.x/trunk/java/org/apache/jasper/xmlparser/ParserUtils.java tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/descriptor/XmlErrorHandler.java Modified: tomcat/tc6.0.x/trunk/STATUS.txt URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/STATUS.txt?rev=1557714&r1=1557713&r2=1557714&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/STATUS.txt (original) +++ tomcat/tc6.0.x/trunk/STATUS.txt Mon Jan 13 13:46:33 2014 @@ -61,17 +61,6 @@ PATCHES PROPOSED TO BACKPORT: requires Ant >= 1.8.0). -1: -* Back-port from XML processing improvements (part 8) - Switch ParserUtils to use the new ErrorHandler - Back-port of http://svn.apache.org/r1547947 - http://people.apache.org/~markt/patches/2014-01-08-xml-prep-part8-tc6-v1.patch - plus - http://svn.apache.org/1556840 to address kkolinko's comment - +1: markt, remm - +1: kkolinko (would be better with a fix to BZ 55974, so that the first - error is reported like the old code does, not a random one) - -1: - * Back-port from XML processing improvements (part 9) Switch JspDocumentParser to an DefaultHandler2 Back-port of http://svn.apache.org/r1547948 Modified: tomcat/tc6.0.x/trunk/java/org/apache/jasper/xmlparser/ParserUtils.java URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/jasper/xmlparser/ParserUtils.java?rev=1557714&r1=1557713&r2=1557714&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/java/org/apache/jasper/xmlparser/ParserUtils.java (original) +++ tomcat/tc6.0.x/trunk/java/org/apache/jasper/xmlparser/ParserUtils.java Mon Jan 13 13:46:33 2014 @@ -23,11 +23,11 @@ import javax.xml.parsers.DocumentBuilder import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; -import org.apache.jasper.Constants; import org.apache.jasper.JasperException; import org.apache.jasper.compiler.Localizer; -import org.apache.juli.logging.Log; -import org.apache.juli.logging.LogFactory; +import org.apache.tomcat.util.descriptor.DigesterFactory; +import org.apache.tomcat.util.descriptor.LocalResolver; +import org.apache.tomcat.util.descriptor.XmlErrorHandler; import org.w3c.dom.Comment; import org.w3c.dom.Document; import org.w3c.dom.NamedNodeMap; @@ -35,7 +35,6 @@ import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.w3c.dom.Text; import org.xml.sax.EntityResolver; -import org.xml.sax.ErrorHandler; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; @@ -52,14 +51,11 @@ import org.xml.sax.SAXParseException; public class ParserUtils { /** - * An error handler for use when parsing XML documents. - */ - static ErrorHandler errorHandler = new MyErrorHandler(); - - /** * An entity resolver for use when parsing XML documents. */ - static EntityResolver entityResolver = new MyEntityResolver(); + static EntityResolver entityResolver; + + private final EntityResolver entityResolverInstance; /** * @deprecated Unused. Will be removed in Tomcat 7. @@ -81,9 +77,15 @@ public class ParserUtils { public ParserUtils(boolean useValidation) { this.useValidation = useValidation; + if (entityResolver == null) { + this.entityResolverInstance = new LocalResolver( + DigesterFactory.SERVLET_API_PUBLIC_IDS, + DigesterFactory.SERVLET_API_SYSTEM_IDS, false); + } else { + this.entityResolverInstance = entityResolver; + } } - // --------------------------------------------------------- Public Methods /** @@ -108,9 +110,14 @@ public class ParserUtils { factory.setNamespaceAware(true); factory.setValidating(useValidation); DocumentBuilder builder = factory.newDocumentBuilder(); - builder.setEntityResolver(entityResolver); - builder.setErrorHandler(errorHandler); + builder.setEntityResolver(entityResolverInstance); + XmlErrorHandler handler = new XmlErrorHandler(); + builder.setErrorHandler(handler); document = builder.parse(is); + if (!handler.getErrors().isEmpty()) { + // throw the first to indicate there was a error during processing + throw handler.getErrors().iterator().next(); + } } catch (ParserConfigurationException ex) { throw new JasperException (Localizer.getMessage("jsp.error.parse.xml", location), ex); @@ -150,6 +157,17 @@ public class ParserUtils { return (parseXMLDocument(uri, new InputSource(is))); } + /** + * Set the EntityResolver. + * This is needed when the dtds and Jasper itself are in different + * classloaders (e.g. OSGi environment). + * + * @param er EntityResolver to use. + */ + public static void setEntityResolver(EntityResolver er) { + + entityResolver = er; + } // ------------------------------------------------------ Protected Methods @@ -202,51 +220,3 @@ public class ParserUtils { return (treeNode); } } - - -// ------------------------------------------------------------ Private Classes - -class MyEntityResolver implements EntityResolver { - - public InputSource resolveEntity(String publicId, String systemId) - throws SAXException { - for (int i = 0; i < Constants.CACHED_DTD_PUBLIC_IDS.length; i++) { - String cachedDtdPublicId = Constants.CACHED_DTD_PUBLIC_IDS[i]; - if (cachedDtdPublicId.equals(publicId)) { - String resourcePath = Constants.CACHED_DTD_RESOURCE_PATHS[i]; - InputStream input = this.getClass().getResourceAsStream( - resourcePath); - if (input == null) { - throw new SAXException(Localizer.getMessage( - "jsp.error.internal.filenotfound", resourcePath)); - } - InputSource isrc = new InputSource(input); - return isrc; - } - } - Log log = LogFactory.getLog(MyEntityResolver.class); - if (log.isDebugEnabled()) - log.debug("Resolve entity failed" + publicId + " " + systemId); - log.error(Localizer.getMessage("jsp.error.parse.xml.invalidPublicId", - publicId)); - return null; - } -} - -class MyErrorHandler implements ErrorHandler { - - public void warning(SAXParseException ex) throws SAXException { - Log log = LogFactory.getLog(MyErrorHandler.class); - if (log.isDebugEnabled()) - log.debug("ParserUtils: warning ", ex); - // We ignore warnings - } - - public void error(SAXParseException ex) throws SAXException { - throw ex; - } - - public void fatalError(SAXParseException ex) throws SAXException { - throw ex; - } -} \ No newline at end of file Modified: tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/descriptor/XmlErrorHandler.java URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/descriptor/XmlErrorHandler.java?rev=1557714&r1=1557713&r2=1557714&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/descriptor/XmlErrorHandler.java (original) +++ tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/descriptor/XmlErrorHandler.java Mon Jan 13 13:46:33 2014 @@ -16,8 +16,8 @@ */ package org.apache.tomcat.util.descriptor; -import java.util.HashSet; -import java.util.Set; +import java.util.ArrayList; +import java.util.List; import org.apache.juli.logging.Log; import org.apache.tomcat.util.res.StringManager; @@ -30,9 +30,9 @@ public class XmlErrorHandler implements private static final StringManager sm = StringManager.getManager(Constants.PACKAGE_NAME); - private final Set<SAXParseException> errors = new HashSet<SAXParseException>(); + private final List<SAXParseException> errors = new ArrayList<SAXParseException>(); - private final Set<SAXParseException> warnings = new HashSet<SAXParseException>(); + private final List<SAXParseException> warnings = new ArrayList<SAXParseException>(); public void error(SAXParseException exception) throws SAXException { // Collect non-fatal errors @@ -49,12 +49,12 @@ public class XmlErrorHandler implements warnings.add(exception); } - public Set<SAXParseException> getErrors() { + public List<SAXParseException> getErrors() { // Internal use only - don't worry about immutability return errors; } - public Set<SAXParseException> getWarnings() { + public List<SAXParseException> getWarnings() { // Internal use only - don't worry about immutability return warnings; } --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org