X-Git-Url: http://wamblee.org/gitweb/?a=blobdiff_plain;f=support%2Fgeneral%2Fsrc%2Fmain%2Fjava%2Forg%2Fwamblee%2Fxml%2FDomUtils.java;h=44a9f8ee8268a4cb946d7bc6adb7478e21a84f34;hb=36320098ebdbe884869a9e04682a8a0291d25600;hp=356fd34279bce5d091c617f4b5213c73572fa066;hpb=17775e14ecfb286e59f67117e5cee7e21e95ab1f;p=utils diff --git a/support/general/src/main/java/org/wamblee/xml/DomUtils.java b/support/general/src/main/java/org/wamblee/xml/DomUtils.java index 356fd342..44a9f8ee 100644 --- a/support/general/src/main/java/org/wamblee/xml/DomUtils.java +++ b/support/general/src/main/java/org/wamblee/xml/DomUtils.java @@ -12,47 +12,47 @@ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */ + */ package org.wamblee.xml; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -import org.apache.xml.serialize.OutputFormat; -import org.apache.xml.serialize.XMLSerializer; - -import org.dom4j.DocumentException; - -import org.dom4j.io.DOMReader; -import org.dom4j.io.DOMWriter; - -import org.w3c.dom.Attr; -import org.w3c.dom.Document; -import org.w3c.dom.Element; -import org.w3c.dom.NamedNodeMap; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; - -import org.xml.sax.SAXException; - import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; - import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.TreeMap; +import java.util.logging.Level; +import java.util.logging.Logger; import javax.xml.XMLConstants; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerException; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamSource; import javax.xml.validation.Schema; import javax.xml.validation.SchemaFactory; +import javax.xml.validation.Validator; + +import org.w3c.dom.Attr; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NamedNodeMap; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.w3c.dom.bootstrap.DOMImplementationRegistry; +import org.w3c.dom.ls.DOMImplementationLS; +import org.w3c.dom.ls.LSException; +import org.w3c.dom.ls.LSInput; +import org.w3c.dom.ls.LSParser; +import org.xml.sax.SAXException; /** * Some basic XML utilities for common reoccuring tasks for DOM documents. @@ -60,7 +60,8 @@ import javax.xml.validation.SchemaFactory; * @author Erik Brakkee */ public final class DomUtils { - private static final Log LOG = LogFactory.getLog(DomUtils.class); + private static final Logger LOG = Logger + .getLogger(DomUtils.class.getName()); /** * Disabled default constructor. @@ -96,21 +97,30 @@ public final class DomUtils { */ public static Document read(InputStream aIs) throws XMLException { try { - DocumentBuilder builder = DocumentBuilderFactory.newInstance() - .newDocumentBuilder(); + DOMImplementationRegistry registry = DOMImplementationRegistry + .newInstance(); - return builder.parse(aIs); - } catch (SAXException e) { + DOMImplementationLS impl = (DOMImplementationLS) registry + .getDOMImplementation("LS"); + + LSParser builder = impl.createLSParser( + DOMImplementationLS.MODE_SYNCHRONOUS, null); + LSInput input = impl.createLSInput(); + input.setByteStream(aIs); + return builder.parse(input); + } catch (IllegalAccessException e) { throw new XMLException(e.getMessage(), e); - } catch (IOException e) { + } catch (InstantiationException e) { throw new XMLException(e.getMessage(), e); - } catch (ParserConfigurationException e) { + } catch (ClassNotFoundException e) { + throw new XMLException(e.getMessage(), e); + } catch (LSException e) { throw new XMLException(e.getMessage(), e); } finally { try { aIs.close(); } catch (Exception e) { - LOG.warn("Error closing XML file", e); + LOG.log(Level.WARNING, "Error closing XML file", e); } } } @@ -129,34 +139,29 @@ public final class DomUtils { public static Document readAndValidate(InputStream aIs, InputStream aSchema) throws XMLException { try { + Document doc = read(aIs); final Schema schema = SchemaFactory.newInstance( XMLConstants.W3C_XML_SCHEMA_NS_URI).newSchema( new StreamSource(aSchema)); + Validator validator = schema.newValidator(); + validator.validate(new DOMSource(doc)); - final DocumentBuilderFactory factory = DocumentBuilderFactory - .newInstance(); - factory.setValidating(true); - factory.setNamespaceAware(true); - factory.setSchema(schema); - - return factory.newDocumentBuilder().parse(aIs); + return doc; } catch (SAXException e) { throw new XMLException(e.getMessage(), e); } catch (IOException e) { throw new XMLException(e.getMessage(), e); - } catch (ParserConfigurationException e) { - throw new XMLException(e.getMessage(), e); } finally { try { aSchema.close(); } catch (Exception e) { - LOG.warn("Error closing schema", e); + LOG.log(Level.WARNING, "Error closing schema", e); } try { aIs.close(); } catch (Exception e) { - LOG.warn("Error closing XML file", e); + LOG.log(Level.WARNING, "Error closing XML file", e); } } } @@ -172,8 +177,15 @@ public final class DomUtils { */ public static void serialize(Document aDocument, OutputStream aOs) throws IOException { - XMLSerializer serializer = new XMLSerializer(aOs, new OutputFormat()); - serializer.serialize(aDocument); + try { + TransformerFactory factory = TransformerFactory.newInstance(); + Transformer identityTransform = factory.newTransformer(); + DOMSource source = new DOMSource(aDocument); + StreamResult result = new StreamResult(aOs); + identityTransform.transform(source, result); + } catch (TransformerException e) { + throw new IOException(e.getMessage(), e); + } } /** @@ -192,32 +204,6 @@ public final class DomUtils { return os.toString(); } - /** - * Converts a dom4j document into a w3c DOM document. - * - * @param aDocument - * Document to convert. - * - * @return W3C DOM document. - * - */ - public static Document convert(org.dom4j.Document aDocument) - throws DocumentException { - return new DOMWriter().write(aDocument); - } - - /** - * Converts a W3C DOM document into a dom4j document. - * - * @param aDocument - * Document to convert. - * - * @return Dom4j document. - */ - public static org.dom4j.Document convert(Document aDocument) { - return new DOMReader().read(aDocument); - } - /** * Removes duplicate attributes from a DOM tree.This is useful for * postprocessing the output of JTidy as a workaround for a bug in JTidy.