summaryrefslogtreecommitdiffstats
path: root/org/madore/damlengine/DamlEngine.java
diff options
context:
space:
mode:
Diffstat (limited to 'org/madore/damlengine/DamlEngine.java')
-rw-r--r--org/madore/damlengine/DamlEngine.java70
1 files changed, 49 insertions, 21 deletions
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