package org.limewire.util; import java.io.IOException; import java.io.StringReader; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.w3c.dom.Document; 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; /** * Provides utilities to retrieve XML documents. */ public class XMLUtils { private static Log LOG = LogFactory.getLog(XMLUtils.class); private XMLUtils() {} /** * Returns a newly created document from the given XML. * Any errors while parsing will be printed to the XMLUtils.class log. */ public static Document getDocument(String xml) throws IOException { return getDocument(xml, null, new LogErrorHandler(LOG)); } /** * Returns a newly created document from the given XML. * Any errors while parsing will be printed to the given log. */ public static Document getDocument(String xml, Log log) throws IOException { return getDocument(xml, null, new LogErrorHandler(log)); } /** * Returns a newly created document from the given XML. * Any errors while parsing will be printed to the errorHandler. */ public static Document getDocument(String xml, ErrorHandler errorHandler) throws IOException { return getDocument(xml, null, errorHandler); } /** * Returns a newly created document from the given XML. * Any errors while parsing will be printed to the errorHandler. * The given EntityResolver will be used if it is non-null. */ public static Document getDocument(String xml, EntityResolver resolver, ErrorHandler errorHandler) throws IOException { try { DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); InputSource is = new InputSource(new StringReader(xml)); if(resolver != null) builder.setEntityResolver(resolver); builder.setErrorHandler(errorHandler); return builder.parse(is); } catch(IOException ioe) { if(LOG.isErrorEnabled()) LOG.error("Unable to parse: " + xml, ioe); throw ioe; } catch(SAXException sax) { if(LOG.isErrorEnabled()) LOG.error("Unable to parse: " + xml, sax); throw (IOException)new IOException().initCause(sax); } catch (ParserConfigurationException bad) { LOG.error("Unable to create parser", bad); throw (IOException)new IOException().initCause(bad); } } /** * Provides a default implementation of <code>ErrorHandler</code>. * <code>LogErrorHandler</code> prints warnings, errors and fatal * errors to a log. */ public static class LogErrorHandler implements ErrorHandler { private final Log log; public LogErrorHandler(Log log) { this.log = log; } public void error(SAXParseException exception) throws SAXException { log.error("Parse error", exception); } public void fatalError(SAXParseException exception) throws SAXException { log.error("Parse fatal error", exception); throw exception; } public void warning(SAXParseException exception) throws SAXException { log.error("Parse warning", exception); } } }