You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by ad...@apache.org on 2009/04/26 05:19:17 UTC

svn commit: r768633 - /ofbiz/trunk/framework/base/src/org/ofbiz/base/util/UtilXml.java

Author: adrianc
Date: Sun Apr 26 03:19:15 2009
New Revision: 768633

URL: http://svn.apache.org/viewvc?rev=768633&view=rev
Log:
A bunch of work in UtilXml.java:

1. Added methods to support DOM 3. They aren't used right now, but they are available if anyone wants to give it a try. Might be good for XML data exchange with payment processors and such.
2. Added JAXP TrAX methods to help replace deprecated org.apache.xml.* classes.

Modified:
    ofbiz/trunk/framework/base/src/org/ofbiz/base/util/UtilXml.java

Modified: ofbiz/trunk/framework/base/src/org/ofbiz/base/util/UtilXml.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/src/org/ofbiz/base/util/UtilXml.java?rev=768633&r1=768632&r2=768633&view=diff
==============================================================================
--- ofbiz/trunk/framework/base/src/org/ofbiz/base/util/UtilXml.java (original)
+++ ofbiz/trunk/framework/base/src/org/ofbiz/base/util/UtilXml.java Sun Apr 26 03:19:15 2009
@@ -34,15 +34,26 @@
 import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.DocumentBuilderFactory;
 import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerConfigurationException;
+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 javolution.util.FastList;
 
 import org.apache.xml.serialize.OutputFormat;
-import org.apache.xml.serialize.XMLSerializer;
+import org.w3c.dom.DOMConfiguration;
 import org.w3c.dom.Document;
 import org.w3c.dom.DocumentFragment;
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
+import org.w3c.dom.bootstrap.DOMImplementationRegistry;
+import org.w3c.dom.ls.DOMImplementationLS;
+import org.w3c.dom.ls.LSOutput;
+import org.w3c.dom.ls.LSSerializer;
 import org.xml.sax.EntityResolver;
 import org.xml.sax.ErrorHandler;
 import org.xml.sax.InputSource;
@@ -58,6 +69,156 @@
 
     public static final String module = UtilXml.class.getName();
 
+    // ----- DOM Level 3 Load and Save Methods -- //
+
+    /** Returns a <code>DOMImplementationLS</code> instance.
+     * @return A <code>DOMImplementationLS</code> instance
+     * @see <a href="http://www.w3.org/TR/2004/REC-DOM-Level-3-LS-20040407/">DOM Level 3 Load and Save Specification</a>
+     * @throws ClassCastException
+     * @throws ClassNotFoundException
+     * @throws InstantiationException
+     * @throws IllegalAccessException
+     */
+    public static DOMImplementationLS getDomLsImplementation() throws ClassCastException, ClassNotFoundException, InstantiationException, IllegalAccessException {
+        DOMImplementationRegistry registry = DOMImplementationRegistry.newInstance();
+        return (DOMImplementationLS)registry.getDOMImplementation("LS");
+    }
+
+    /** Returns a <code>LSOutput</code> instance.
+     * @param impl A <code>DOMImplementationLS</code> instance
+     * @param os Optional <code>OutputStream</code> instance
+     * @param encoding Optional character encoding, default is UTF-8
+     * @return A <code>LSOutput</code> instance
+     * @see <a href="http://www.w3.org/TR/2004/REC-DOM-Level-3-LS-20040407/">DOM Level 3 Load and Save Specification</a>
+     */
+    public static LSOutput createLSOutput(DOMImplementationLS impl, OutputStream os, String encoding) {
+        LSOutput out = impl.createLSOutput();
+        if (os != null) {
+            out.setByteStream(os);
+        }
+        if (encoding != null) {
+            out.setEncoding(encoding);
+        }
+        return out;
+    }
+
+    /** Returns a <code>LSSerializer</code> instance.
+     * @param impl A <code>DOMImplementationLS</code> instance
+     * @param includeXmlDeclaration If set to <code>true</code>,
+     * the xml declaration will be included in the output
+     * @param enablePrettyPrint If set to <code>true</code>, the
+     * output will be formatted in human-readable form. If set to
+     * <code>false</code>, the entire document will consist of a single line.
+     * @return A <code>LSSerializer</code> instance
+     * @see <a href="http://www.w3.org/TR/2004/REC-DOM-Level-3-LS-20040407/">DOM Level 3 Load and Save Specification</a>
+     */
+    public static LSSerializer createLSSerializer(DOMImplementationLS impl, boolean includeXmlDeclaration, boolean enablePrettyPrint) {
+        LSSerializer writer = impl.createLSSerializer();
+        DOMConfiguration domConfig = writer.getDomConfig();
+        domConfig.setParameter("xml-declaration", includeXmlDeclaration);
+        domConfig.setParameter("format-pretty-print", enablePrettyPrint);
+        return writer;
+    }
+
+    /** Serializes a DOM Element to an <code>OutputStream</code> using DOM 3.
+     * @param os The <code>OutputStream</code> instance to write to
+     * @param element The DOM <code>Element</code> object to be serialized
+     * @param encoding Optional character encoding
+     * @param includeXmlDeclaration If set to <code>true</code>,
+     * the xml declaration will be included in the output
+     * @param enablePrettyPrint If set to <code>true</code>, the
+     * output will be formatted in human-readable form. If set to
+     * <code>false</code>, the entire document will consist of a single line.
+     * @see <a href="http://www.w3.org/TR/2004/REC-DOM-Level-3-LS-20040407/">DOM Level 3 Load and Save Specification</a>
+     * @throws ClassCastException
+     * @throws ClassNotFoundException
+     * @throws InstantiationException
+     * @throws IllegalAccessException
+     */
+    public static void writeXmlDocument(OutputStream os, Element element, String encoding, boolean includeXmlDeclaration, boolean enablePrettyPrint) throws ClassCastException, ClassNotFoundException, InstantiationException, IllegalAccessException {
+        DOMImplementationLS impl = getDomLsImplementation();
+        LSOutput out = createLSOutput(impl, os, encoding);
+        LSSerializer writer = createLSSerializer(impl, includeXmlDeclaration, enablePrettyPrint);
+        writer.write(element, out);
+    }
+
+    // ----- TrAX Methods ----------------- //
+
+    /** Creates a JAXP TrAX Transformer suitable for pretty-printing an
+     * XML document. This method is provided as an alternative to the
+     * deprecated <code>org.apache.xml.serialize.OutputFormat</code> class.
+     * @param encoding Optional encoding, defaults to UTF-8
+     * @param omitXmlDeclaration If <code>true</code> the xml declaration
+     * will be omitted from the output
+     * @param indent If <code>true</code>, the output will be indented
+     * @param indentAmount If <code>indent</code> is <code>true</code>,
+     * the number of spaces to indent. Default is 4.
+     * @return A <code>Transformer</code> instance
+     * @see <a href="http://java.sun.com/javase/6/docs/api/javax/xml/transform/package-summary.html">JAXP TrAX</a>
+     * @throws TransformerConfigurationException
+     */
+    public static Transformer createOutputTransformer(String encoding, boolean omitXmlDeclaration, boolean indent, int indentAmount) throws TransformerConfigurationException {
+        StringBuilder sb = new StringBuilder();
+        sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
+        sb.append("<xsl:stylesheet xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" xmlns:xalan=\"http://xml.apache.org/xslt\" version=\"1.0\">\n");
+        sb.append("<xsl:output method=\"xml\" encoding=\"");
+        sb.append(encoding == null ? "UTF-8" : encoding);
+        sb.append("\"");
+        if (omitXmlDeclaration) {
+            sb.append(" omit-xml-declaration=\"yes\"");
+        }
+        sb.append(" indent=\"");
+        sb.append(indent ? "yes" : "no");
+        sb.append("\"");
+        if (indent) {
+            sb.append(" xalan:indent-amount=\"");
+            sb.append(indentAmount <= 0 ? 4 : indentAmount);
+            sb.append("\"");
+        }
+        sb.append("/>\n<xsl:strip-space elements=\"*\"/>\n");
+        sb.append("<xsl:template match=\"@*|node()\">\n");
+        sb.append("<xsl:copy><xsl:apply-templates select=\"@*|node()\"/></xsl:copy>\n");
+        sb.append("</xsl:template>\n</xsl:stylesheet>\n");
+        Debug.logInfo("stylesheet = \n" + sb, module);
+        ByteArrayInputStream bis = new ByteArrayInputStream(sb.toString().getBytes());
+        TransformerFactory transformerFactory = TransformerFactory.newInstance();
+        return transformerFactory.newTransformer(new StreamSource(bis));
+    }
+
+    /** Serializes a DOM <code>Element</code> to an <code>OutputStream</code>
+     * using JAXP TrAX.
+     * @param transformer A <code>Transformer</code> instance
+     * @param element The <code>Element</code> to serialize
+     * @param os The <code>OutputStream</code> to serialize to
+     * @see <a href="http://java.sun.com/javase/6/docs/api/javax/xml/transform/package-summary.html">JAXP TrAX</a>
+     * @throws TransformerException
+     */
+    public static void transformDomDocument(Transformer transformer, Element element, OutputStream os) throws TransformerException {
+        DOMSource source = new DOMSource(element);
+        StreamResult result = new StreamResult(os);
+        transformer.transform(source, result);
+    }
+
+    /** Serializes a DOM <code>Element</code> to an <code>OutputStream</code>
+     * using JAXP TrAX.
+     * @param element The <code>Element</code> to serialize
+     * @param os The <code>OutputStream</code> to serialize to
+     * @param encoding Optional encoding, defaults to UTF-8
+     * @param omitXmlDeclaration If <code>true</code> the xml declaration
+     * will be omitted from the output
+     * @param indent If <code>true</code>, the output will be indented
+     * @param indentAmount If <code>indent</code> is <code>true</code>,
+     * the number of spaces to indent. Default is 4.
+     * @see <a href="http://java.sun.com/javase/6/docs/api/javax/xml/transform/package-summary.html">JAXP TrAX</a>
+     * @throws TransformerException
+     */
+    public static void writeXmlDocument(Element element, OutputStream os, String encoding, boolean omitXmlDeclaration, boolean indent, int indentAmount) throws TransformerException {
+        Transformer transformer = createOutputTransformer(encoding, omitXmlDeclaration, indent, indentAmount);
+        transformDomDocument(transformer, element, os);
+    }
+
+    // ------------------------------------ //
+
     public static String writeXmlDocument(Document document) throws java.io.IOException {
         if (document == null) {
             Debug.logWarning("[UtilXml.writeXmlDocument] Document was null, doing nothing", module);
@@ -135,11 +296,16 @@
         }
         writeXmlDocument(os, document.getDocumentElement());
     }
+
+    @SuppressWarnings("deprecation")
     public static void writeXmlDocument(OutputStream os, Element element) throws java.io.IOException {
-        OutputFormat format = new OutputFormat(element.getOwnerDocument());
-        writeXmlDocument(os, element, format);
+        writeXmlDocument(os, element, new OutputFormat());
     }
 
+    /**
+     * @deprecated Use  <a href="#writeXmlDocument(org.w3c.dom.Element,%20java.io.OutputStream,%20java.lang.String,%20boolean,%20boolean,%20int)">writeXmlDocument(Element element, OutputStream os, String encoding, boolean omitXmlDeclaration, boolean indent, int indentAmount)</a>
+     */
+    @SuppressWarnings("deprecation")
     public static void writeXmlDocument(OutputStream os, Element element, OutputFormat format) throws java.io.IOException {
         if (element == null) {
             Debug.logWarning("[UtilXml.writeXmlDocument] Element was null, doing nothing", module);
@@ -149,10 +315,12 @@
             Debug.logWarning("[UtilXml.writeXmlDocument] OutputStream was null, doing nothing", module);
             return;
         }
-
-        XMLSerializer serializer = new XMLSerializer(os, format);
-        serializer.asDOMSerializer();
-        serializer.serialize(element);
+        try {
+            writeXmlDocument(element, os, format.getEncoding(), format.getOmitXMLDeclaration(), format.getIndenting(), format.getIndent());
+        } catch (Exception e) {
+            // Wrapping this exception for backwards compatibility
+            throw new IOException(e.getMessage());
+        }
     }
 
     public static Document readXmlDocument(String content)