package com.guit.rebind.guitview; import com.google.gwt.core.ext.TreeLogger; import com.google.gwt.core.ext.TreeLogger.Type; import org.w3c.dom.Document; import org.xml.sax.ErrorHandler; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.net.URL; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; /** * Simplifies instantiation of the w3c XML parser, in just the style that * UiBinder likes it. Used by both prod and test. */ public class W3cDomHelper { private final DocumentBuilderFactory factory; private final DocumentBuilder builder; public W3cDomHelper(final TreeLogger logger) { factory = DocumentBuilderFactory.newInstance(); factory.setNamespaceAware(true); factory.setExpandEntityReferences(true); try { builder = factory.newDocumentBuilder(); } catch (ParserConfigurationException e) { throw new RuntimeException(e); } builder.setEntityResolver(new GwtResourceEntityResolver()); builder.setErrorHandler(new ErrorHandler() { public void error(SAXParseException exception) throws SAXException { logger.log(Type.ERROR, exception.getMessage()); logger.log(Type.DEBUG, "SAXParseException", exception); } public void fatalError(SAXParseException exception) throws SAXException { /* * Fatal errors seem to be no scarier than error errors, and simply * happen due to badly formed XML. */ logger.log(Type.ERROR, exception.getMessage()); logger.log(Type.DEBUG, "SAXParseException", exception); } public void warning(SAXParseException exception) throws SAXException { logger.log(Type.WARN, exception.getMessage()); logger.log(Type.DEBUG, "SAXParseException", exception); } }); } /** * Creates an XML document model with the given contents. Nice for testing. * * @param string the document contents */ public Document documentFor(String string) throws SAXException, IOException { return builder.parse(new ByteArrayInputStream(string.getBytes())); } public Document documentFor(URL url) throws SAXParseException { try { InputStream stream = url.openStream(); InputSource input = new InputSource(stream); input.setSystemId(url.toExternalForm()); return builder.parse(input); } catch (SAXParseException e) { // Let SAXParseExceptions through. throw e; } catch (SAXException e) { throw new RuntimeException(e); } catch (IOException e) { throw new RuntimeException(e); } } }