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

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

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

doogie-3
Author: doogie
Date: Mon Jun 29 18:15:14 2009
New Revision: 789401

URL: http://svn.apache.org/viewvc?rev=789401&view=rev
Log:
Add readXmlDocument variants that can store the line/column numbers
of elements; nothing uses this yet.

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=789401&r1=789400&r2=789401&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 Mon Jun 29 18:15:14 2009
@@ -61,6 +61,16 @@
 import org.xml.sax.SAXParseException;
 import org.xml.sax.helpers.DefaultHandler;
 
+import org.apache.xerces.parsers.DOMParser;
+import org.apache.xerces.xni.Augmentations;
+import org.apache.xerces.xni.NamespaceContext;
+import org.apache.xerces.xni.QName;
+import org.apache.xerces.xni.XNIException;
+import org.apache.xerces.xni.XMLAttributes;
+import org.apache.xerces.xni.XMLLocator;
+import org.apache.xerces.xni.XMLResourceIdentifier;
+import org.apache.xerces.xni.XMLString;
+
 /**
  * Utilities methods to simplify dealing with JAXP & DOM XML parsing
  *
@@ -337,6 +347,16 @@
         return readXmlDocument(bis, validate, "Internal Content");
     }
 
+    public static Document readXmlDocument(String content, boolean validate, boolean withPosition)
+            throws SAXException, ParserConfigurationException, java.io.IOException {
+        if (content == null) {
+            Debug.logWarning("[UtilXml.readXmlDocument] content was null, doing nothing", module);
+            return null;
+        }
+        ByteArrayInputStream bis = new ByteArrayInputStream(content.getBytes("UTF-8"));
+        return readXmlDocument(bis, validate, "Internal Content", withPosition);
+    }
+
     public static Document readXmlDocument(URL url)
             throws SAXException, ParserConfigurationException, java.io.IOException {
         return readXmlDocument(url, true);
@@ -354,6 +374,17 @@
         return document;
     }
 
+    public static Document readXmlDocument(URL url, boolean validate, boolean withPosition)
+            throws SAXException, ParserConfigurationException, java.io.IOException {
+        if (url == null) {
+            Debug.logWarning("[UtilXml.readXmlDocument] URL was null, doing nothing", module);
+            return null;
+        }
+        InputStream is = url.openStream();
+        Document document = readXmlDocument(is, validate, url.toString(), withPosition);
+        is.close();
+        return document;
+    }
 
     /**
      * @deprecated
@@ -368,6 +399,11 @@
         return readXmlDocument(is, true, docDescription);
     }
 
+    public static Document readXmlDocument(InputStream is, String docDescription, boolean withPosition)
+            throws SAXException, ParserConfigurationException, java.io.IOException {
+        return readXmlDocument(is, true, docDescription, withPosition);
+    }
+
     public static Document readXmlDocument(InputStream is, boolean validate, String docDescription)
             throws SAXException, ParserConfigurationException, java.io.IOException {
         if (is == null) {
@@ -420,6 +456,117 @@
         return document;
     }
 
+    public static Document readXmlDocument(InputStream is, boolean validate, String docDescription, boolean withPosition)
+            throws SAXException, ParserConfigurationException, java.io.IOException {
+        if (!withPosition) {
+            return readXmlDocument(is, validate, docDescription);
+        }
+
+        if (is == null) {
+            Debug.logWarning("[UtilXml.readXmlDocument] InputStream was null, doing nothing", module);
+            return null;
+        }
+
+        long startTime = System.currentTimeMillis();
+
+        Document document = null;
+
+        DOMParser parser = new DOMParser() {
+            private XMLLocator locator;
+
+            private void setLineColumn(Node node) {
+                if (node.getUserData("startLine") != null) {
+                    return;
+                }
+                node.setUserData("startLine",locator.getLineNumber(), null);
+                node.setUserData("startColumn",locator.getColumnNumber(), null);
+            }
+
+            private void setLineColumn() {
+                try {
+                    Node node = (Node) getProperty("http://apache.org/xml/properties/dom/current-element-node");
+                    if (node != null) {
+                        setLineColumn(node);
+                    }
+                } catch (SAXException ex) {
+                    Debug.logWarning(ex, module);
+                }
+            }
+
+            private void setLastChildLineColumn() {
+                try {
+                    Node node = (Node) getProperty("http://apache.org/xml/properties/dom/current-element-node");
+                    if (node != null) {
+                       setLineColumn(node.getLastChild());
+                    }
+                } catch (SAXException ex) {
+                    Debug.logWarning(ex, module);
+                }
+            }
+
+            public void startGeneralEntity(String name, XMLResourceIdentifier identifier, String encoding, Augmentations augs) throws XNIException {
+                super.startGeneralEntity(name, identifier, encoding, augs);
+                setLineColumn();
+            }
+
+            public void comment(XMLString text, Augmentations augs) throws XNIException {
+                super.comment(text, augs);
+                setLastChildLineColumn();
+            }
+
+            public void processingInstruction(String target, XMLString data, Augmentations augs) throws XNIException {
+                super.processingInstruction(target, data, augs);
+                setLastChildLineColumn();
+            }
+
+            public void startDocument(XMLLocator locator, String encoding, NamespaceContext namespaceContext, Augmentations augs) throws XNIException {
+                super.startDocument(locator, encoding, namespaceContext, augs);
+                this.locator = locator;
+                setLineColumn();
+            }
+
+            public void doctypeDecl(String rootElement, String publicId, String systemId, Augmentations augs) throws XNIException {
+                super.doctypeDecl(rootElement, publicId, systemId, augs);
+            }
+
+            public void startElement(QName elementQName, XMLAttributes attrList, Augmentations augs) throws XNIException {
+                super.startElement(elementQName, attrList, augs);
+                setLineColumn();
+            }
+
+            public void characters(XMLString text, Augmentations augs) throws XNIException {
+                super.characters(text, augs);
+                setLastChildLineColumn();
+            }
+
+            public void ignorableWhitespace(XMLString text, Augmentations augs) throws XNIException {
+                super.ignorableWhitespace(text, augs);
+                setLastChildLineColumn();
+            }
+        };
+        parser.setFeature("http://xml.org/sax/features/namespaces", true);
+        parser.setFeature("http://xml.org/sax/features/validation", validate);
+        parser.setFeature("http://apache.org/xml/features/validation/schema", validate);
+        parser.setFeature("http://apache.org/xml/features/dom/defer-node-expansion", false);
+
+        // with a SchemaUrl, a URL object
+        //factory.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaLanguage", "http://www.w3.org/2001/XMLSchema");
+        //factory.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaSource", SchemaUrl);
+        if (validate) {
+            LocalResolver lr = new LocalResolver(new DefaultHandler());
+            ErrorHandler eh = new LocalErrorHandler(docDescription, lr);
+
+            parser.setEntityResolver(lr);
+            parser.setErrorHandler(eh);
+        }
+        parser.parse(new InputSource(is));
+        document = parser.getDocument();
+
+        double totalSeconds = (System.currentTimeMillis() - startTime)/1000.0;
+        if (Debug.verboseOn()) Debug.logVerbose("XML Read " + totalSeconds + "s: " + docDescription, module);
+        return document;
+    }
+
     public static Document makeEmptyXmlDocument() {
         return makeEmptyXmlDocument(null);
     }