package org.jboss.seam.util; import java.io.ByteArrayInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.net.UnknownHostException; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; import org.xml.sax.EntityResolver; import org.xml.sax.InputSource; import org.xml.sax.SAXException; public class XML { public static Element getRootElement(InputStream stream) throws DocumentException { try { SAXReader saxReader = new SAXReader(); saxReader.setEntityResolver(new DTDEntityResolver()); saxReader.setMergeAdjacentText(true); return saxReader.read(stream).getRootElement(); } catch (DocumentException e) { Throwable nested = e.getNestedException(); if (nested!= null) { if (nested instanceof FileNotFoundException) { throw new RuntimeException("Can't find schema/DTD reference: " + nested.getMessage(), e); } else if (nested instanceof UnknownHostException) { throw new RuntimeException("Cannot connect to host from schema/DTD reference: " + nested.getMessage() + " - check that your schema/DTD reference is current", e); } } throw e; } } /** * Parses an XML document safely, as to not resolve any external DTDs */ public static Element getRootElementSafely(InputStream stream) throws DocumentException { SAXReader saxReader = new SAXReader(); saxReader.setEntityResolver(new NullEntityResolver()); saxReader.setMergeAdjacentText(true); return saxReader.read(stream).getRootElement(); } public static class NullEntityResolver implements EntityResolver { private static final byte[] empty = new byte[0]; public InputSource resolveEntity(String systemId, String publicId) throws SAXException, IOException { return new InputSource(new ByteArrayInputStream(empty)); } } }