package org.madore.damlengine; import java.io.OutputStream; import java.io.OutputStreamWriter; import javax.xml.XMLConstants; import javax.xml.namespace.NamespaceContext; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.DocumentBuilder; import org.w3c.dom.Document; // import org.xml.sax.EntityResolver; import org.apache.xerces.jaxp.DocumentBuilderFactoryImpl; public final class DamlEngine { public static final String XML_NS = XMLConstants.XML_NS_URI; public static final String XHTML_NS = "http://www.w3.org/1999/xhtml"; public static final String DAML_NS = "http://www.madore.org/~david/NS/daml/"; public static final class DamlNSMapping implements NamespaceContext { // This is used for XPath resolution (_not_ for parsing the document). public String getNamespaceURI(String prefix) { if ( prefix == null ) throw new IllegalArgumentException("getNamespaceURI() called with null prefix"); else if ( prefix.equals("") ) return XHTML_NS; else if ( prefix.equals("d") ) return DAML_NS; else if ( prefix.equals("xml") ) return XML_NS; else if ( prefix.equals("xmlns") ) return XMLConstants.XMLNS_ATTRIBUTE_NS_URI; else return XMLConstants.NULL_NS_URI; } public String getPrefix(String uri) { throw new UnsupportedOperationException("getPrefix() not implemented"); } public java.util.Iterator getPrefixes(String uri) { throw new UnsupportedOperationException("getPrefixes() not implemented"); } } private DamlEngine() { // Forbid instantiation throw new AssertionError("DamlEngine cannot be instantiated"); } public static class RootTodo extends TodoItem { public RootTodo(Context ctx) { super(ctx, null); } public void handle() { TodoItem it = TodoElement.getTodoElement(ctx.doc.getDocumentElement(), ctx, this); this.ownerDeque.registerAtEnd(it); } } public static void processDocument(Document doc, Context.WeblogSelectionContext wsc) { TodoDeque todoDeque = new TodoDeque(); Context ctx = new Context(doc); ctx.wsc = wsc; todoDeque.registerAtEnd(new RootTodo(ctx)); todoDeque.dispatchLoop(); } public static void processDocument(Document doc) { processDocument(doc, null); } public static void fullProcess(String fname, OutputStream out, Context.WeblogSelectionContext wsc) throws Exception { final Resolver resolver = new Resolver(); final DocumentBuilderFactory dbf = new DocumentBuilderFactoryImpl(); dbf.setNamespaceAware(true); dbf.setValidating(false); final DocumentBuilder db = dbf.newDocumentBuilder(); db.setEntityResolver(resolver); Document doc = db.parse(fname); processDocument(doc, wsc); doc.normalizeDocument(); Unparser unparser = new Unparser(doc, new OutputStreamWriter(out, "UTF-8"), "html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\""); unparser.unparse(); } public static void fullProcess(String fname, OutputStream out) throws Exception { fullProcess(fname, out, null); } public static void main(String[] args) throws Exception { if ( args.length == 0 ) { System.err.println("expecting filename as argument"); } for (String fname : args) { fullProcess (fname, System.out); } } }