[jboss-svn-commits] JBL Code SVN: r31357 - labs/jbossesb/branches/JBESB_4_7_CP/product/rosetta/src/org/jboss/internal/soa/esb/util.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Tue Feb 2 05:35:25 EST 2010


Author: kevin.conner at jboss.com
Date: 2010-02-02 05:35:25 -0500 (Tue, 02 Feb 2010)
New Revision: 31357

Modified:
   labs/jbossesb/branches/JBESB_4_7_CP/product/rosetta/src/org/jboss/internal/soa/esb/util/XMLHelper.java
Log:
Reuse DocumentBuilder: JBESB-3162

Modified: labs/jbossesb/branches/JBESB_4_7_CP/product/rosetta/src/org/jboss/internal/soa/esb/util/XMLHelper.java
===================================================================
--- labs/jbossesb/branches/JBESB_4_7_CP/product/rosetta/src/org/jboss/internal/soa/esb/util/XMLHelper.java	2010-02-02 06:18:25 UTC (rev 31356)
+++ labs/jbossesb/branches/JBESB_4_7_CP/product/rosetta/src/org/jboss/internal/soa/esb/util/XMLHelper.java	2010-02-02 10:35:25 UTC (rev 31357)
@@ -31,6 +31,7 @@
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.net.URL;
+import java.util.concurrent.atomic.AtomicReference;
 
 import javax.xml.namespace.QName;
 import javax.xml.parsers.DocumentBuilder;
@@ -94,6 +95,10 @@
      */
     private static final DocumentBuilderFactory DOCUMENT_BUILDER_FACTORY ;
     /**
+     * The Document builder for document creation (not parsing).
+     */
+    private static final AtomicReference<DocumentBuilder> DOCUMENT_BUILDER = new AtomicReference<DocumentBuilder>();
+    /**
      * The event writer creator for DOM documents.
      */
     private static final EventWriterCreator EVENT_WRITER_CREATOR ;
@@ -600,8 +605,7 @@
     public static Document createDocument(XMLEventReader reader)
         throws ParserConfigurationException, XMLStreamException
     {
-        final DocumentBuilder builder = DOCUMENT_BUILDER_FACTORY.newDocumentBuilder() ;
-        final Document doc = builder.newDocument() ;
+        final Document doc = getNewDocument() ;
         final XMLEventWriter writer = EVENT_WRITER_CREATOR.createXMLEventWriter(doc);
         XMLHelper.copyXMLEventStream(reader, writer) ;
         return doc;
@@ -619,6 +623,46 @@
         final XMLEventReader reader = EVENT_READER_CREATOR.createXMLEventReader(node);
         XMLHelper.copyXMLEventStream(reader, writer, omitDoc) ;
     }
+    
+    /**
+     * Create a new document.
+     * @return the new document
+     * @throws ParserConfigurationException for errors during creation
+     */
+    private static Document getNewDocument()
+        throws ParserConfigurationException
+    {
+        final DocumentBuilder builder = getCreationDocumentBuilder() ;
+        synchronized(builder)
+        {
+            // synchronized as it is not guaranteed to be thread safe
+            return builder.newDocument() ;
+        }
+    }
+    
+    /**
+     * Get the document builder for creation
+     * @return The document builder
+     * @throws ParserConfigurationException for errors during creation
+     */
+    private static DocumentBuilder getCreationDocumentBuilder()
+        throws ParserConfigurationException
+    {
+        final DocumentBuilder current = DOCUMENT_BUILDER.get() ;
+        if (current != null)
+        {
+            return current ;
+        }
+        final DocumentBuilder newBuilder = DOCUMENT_BUILDER_FACTORY.newDocumentBuilder() ;
+        if (DOCUMENT_BUILDER.compareAndSet(null, newBuilder))
+        {
+            return newBuilder ;
+        }
+        else
+        {
+            return DOCUMENT_BUILDER.get() ;
+        }
+    }
 
     static
     {



More information about the jboss-svn-commits mailing list