From 3365a175e1721e0fda7a56ad53e24a7e337c13cf Mon Sep 17 00:00:00 2001 From: "David A. Madore" Date: Sun, 4 Sep 2011 20:19:48 +0200 Subject: Eliminate use of DocumentBuilder (use DOM LS everywhere) + use validation to catch undefined entities. There seems to be no way to catch the undefined entity error (when it is considered a validation error, e.g., when the document has an external subset) other than by turning on validation. So we register an error handler to throw away useless validation errors. --- org/madore/damlengine/DamlEngine.java | 70 ++++++++++++++++++++++++----------- 1 file changed, 49 insertions(+), 21 deletions(-) (limited to 'org/madore/damlengine/DamlEngine.java') diff --git a/org/madore/damlengine/DamlEngine.java b/org/madore/damlengine/DamlEngine.java index c0010b6..7bc81bd 100644 --- a/org/madore/damlengine/DamlEngine.java +++ b/org/madore/damlengine/DamlEngine.java @@ -1,5 +1,6 @@ package org.madore.damlengine; +import java.util.MissingResourceException; import java.util.regex.Pattern; import java.util.regex.Matcher; import java.io.InputStream; @@ -12,12 +13,13 @@ import java.io.BufferedReader; import java.io.PrintStream; import javax.xml.XMLConstants; import javax.xml.namespace.NamespaceContext; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.ParserConfigurationException; -import org.w3c.dom.Document; -// import org.xml.sax.EntityResolver; -import org.apache.xerces.jaxp.DocumentBuilderFactoryImpl; +import org.w3c.dom.*; +import org.w3c.dom.ls.DOMImplementationLS; +import org.w3c.dom.ls.LSParser; +import org.w3c.dom.ls.LSInput; +import org.apache.xerces.dom.DOMImplementationSourceImpl; +import org.apache.xerces.xni.parser.XMLErrorHandler; +import org.apache.xerces.xni.parser.XMLParseException; public final class DamlEngine { @@ -54,19 +56,37 @@ public final class DamlEngine { } } - public static final class GetDocumentBuilder { - static final DocumentBuilder db; - static { - final Resolver resolver = new Resolver(); - final DocumentBuilderFactory dbf = new DocumentBuilderFactoryImpl(); - dbf.setNamespaceAware(true); - dbf.setValidating(false); - try { - db = dbf.newDocumentBuilder(); - } catch (ParserConfigurationException e) { - throw new RuntimeException(e); + public static class SelectiveErrorHandler implements XMLErrorHandler { + public void warning(String domain, String key, XMLParseException exc) { + System.err.println("warning: line "+exc.getLineNumber() + +": "+exc.getMessage()); + } + public void error(String domain, String key, XMLParseException exc) { + if ( domain.equals("http://www.w3.org/TR/1998/REC-xml-19980210") + && key.equals("MSG_ELEMENT_NOT_DECLARED") ) + return; + System.err.println("error: line "+exc.getLineNumber() + +": "+exc.getMessage()); + } + public void fatalError(String domain, String key, XMLParseException exc) { + System.err.println("fatal error: line "+exc.getLineNumber() + +": "+exc.getMessage()); + throw exc; + } + } + + public static final class IncantDOM { + static DOMImplementation domi; + public static DOMImplementation getDOMI() { + if ( domi == null ) { + DOMImplementationSource source + = new DOMImplementationSourceImpl(); + domi = source.getDOMImplementation("XML 3.0 Core 3.0 LS 3.0"); + if ( domi == null ) + throw new MissingResourceException("failed to obtain DOM implementation", + "org.w3c.dom.ls.DOMImplementationLS", ""); } - db.setEntityResolver(resolver); + return domi; } } @@ -103,9 +123,17 @@ public final class DamlEngine { Context.WeblogSelectionContext wsc) throws Exception { - final DocumentBuilder db = GetDocumentBuilder.db; - - Document doc = db.parse(in); + final DOMImplementationLS domils + = (DOMImplementationLS)(IncantDOM.getDOMI()); + LSParser par + = domils.createLSParser(DOMImplementationLS.MODE_SYNCHRONOUS, null); + par.getDomConfig().setParameter("resource-resolver", new Resolver()); + par.getDomConfig().setParameter("http://xml.org/sax/features/validation", true); + par.getDomConfig().setParameter("http://xml.org/sax/features/namespaces", true); + par.getDomConfig().setParameter("http://apache.org/xml/properties/internal/error-handler", new SelectiveErrorHandler()); + LSInput input = domils.createLSInput(); + input.setByteStream(in); + Document doc = par.parse(input); processDocument(doc, wsc); doc.normalizeDocument(); Unparser unparser -- cgit v1.2.3