You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicemix.apache.org by jg...@apache.org on 2009/11/12 17:31:35 UTC

svn commit: r835431 - /servicemix/smx3/branches/servicemix-3.2/common/servicemix-soap2/src/main/java/org/apache/servicemix/soap/util/DomUtil.java

Author: jgenender
Date: Thu Nov 12 16:31:35 2009
New Revision: 835431

URL: http://svn.apache.org/viewvc?rev=835431&view=rev
Log:
Added thread safety to the DocumentBuilder code

Modified:
    servicemix/smx3/branches/servicemix-3.2/common/servicemix-soap2/src/main/java/org/apache/servicemix/soap/util/DomUtil.java

Modified: servicemix/smx3/branches/servicemix-3.2/common/servicemix-soap2/src/main/java/org/apache/servicemix/soap/util/DomUtil.java
URL: http://svn.apache.org/viewvc/servicemix/smx3/branches/servicemix-3.2/common/servicemix-soap2/src/main/java/org/apache/servicemix/soap/util/DomUtil.java?rev=835431&r1=835430&r2=835431&view=diff
==============================================================================
--- servicemix/smx3/branches/servicemix-3.2/common/servicemix-soap2/src/main/java/org/apache/servicemix/soap/util/DomUtil.java (original)
+++ servicemix/smx3/branches/servicemix-3.2/common/servicemix-soap2/src/main/java/org/apache/servicemix/soap/util/DomUtil.java Thu Nov 12 16:31:35 2009
@@ -45,10 +45,26 @@
  */
 public class DomUtil {
 
+    private static TransformerFactory transformerFactory = TransformerFactory.newInstance();
     private static DocumentBuilderFactory documentBuilderFactory;
-    private static DocumentBuilder documentBuilder;
-    private static TransformerFactory transformerFactory;
-    
+    static {
+        documentBuilderFactory = DocumentBuilderFactory.newInstance();
+        documentBuilderFactory.setNamespaceAware(true);
+    }
+
+    private static final ThreadLocal<DocumentBuilder> documentBuilderLocal =
+            new ThreadLocal<DocumentBuilder>() {
+                @Override
+                protected DocumentBuilder initialValue() {
+                    try {
+                        return documentBuilderFactory.newDocumentBuilder();
+                    } catch (ParserConfigurationException e) {
+                        throw new Fault(e);
+                    }
+                }
+            };
+
+
     public static Document createDocument() {
         try {
             return getDocumentBuilder().newDocument();
@@ -56,10 +72,10 @@
             throw new Fault(e);
         }
     }
-    
+
     public static Document parse(InputStream is) {
         try {
-            return getDocumentBuilderFactory().newDocumentBuilder().parse(is);
+            return getDocumentBuilder().parse(is);
         } catch (SAXException e) {
             throw new Fault(e);
         } catch (IOException e) {
@@ -68,7 +84,7 @@
             throw new Fault(e);
         }
     }
-    
+
     public static Document parse(Source source) {
         try {
             Document doc = createDocument();
@@ -84,11 +100,6 @@
     }
 
     public static DocumentBuilderFactory getDocumentBuilderFactory() {
-        if (documentBuilderFactory == null) {
-            DocumentBuilderFactory f = DocumentBuilderFactory.newInstance();
-            f.setNamespaceAware(true);
-            documentBuilderFactory = f;
-        }
         return documentBuilderFactory;
     }
 
@@ -97,16 +108,10 @@
      * (e.g. {@link DocumentBuilder#newDocument})
      */
     public static DocumentBuilder getDocumentBuilder() throws ParserConfigurationException {
-        if (documentBuilder == null) {
-            documentBuilder = getDocumentBuilderFactory().newDocumentBuilder();
-        }
-        return documentBuilder;
+        return documentBuilderLocal.get();
     }
-    
+
     public static TransformerFactory getTransformerFactory() {
-        if (transformerFactory == null) {
-            transformerFactory =  TransformerFactory.newInstance();
-        }
         return transformerFactory;
     }
 
@@ -125,7 +130,7 @@
         }
         return null;
     }
-    
+
     /**
      * Returns the text of the element
      */
@@ -154,7 +159,7 @@
         }
         return null;
     }
-    
+
     public static Element createElement(Node parent, QName name) {
         Document doc = parent instanceof Document ? (Document) parent : parent.getOwnerDocument();
         Element element;
@@ -162,28 +167,28 @@
             element = doc.createElementNS(name.getNamespaceURI(), name.getPrefix() + ":" + name.getLocalPart());
             String attr = recursiveGetAttributeValue(parent, XMLConstants.XMLNS_ATTRIBUTE + ":" + name.getPrefix());
             if (attr == null || !attr.equals(name.getNamespaceURI())) {
-                element.setAttribute(XMLConstants.XMLNS_ATTRIBUTE + ":" + name.getPrefix(), 
+                element.setAttribute(XMLConstants.XMLNS_ATTRIBUTE + ":" + name.getPrefix(),
                                      name.getNamespaceURI());
             }
         } else if (name.getNamespaceURI() != null && name.getNamespaceURI().length() > 0) {
             element = doc.createElementNS(name.getNamespaceURI(), name.getLocalPart());
             String attr = recursiveGetAttributeValue(parent, XMLConstants.XMLNS_ATTRIBUTE);
             if (attr == null || !attr.equals(name.getNamespaceURI())) {
-                element.setAttribute(XMLConstants.XMLNS_ATTRIBUTE, 
+                element.setAttribute(XMLConstants.XMLNS_ATTRIBUTE,
                                      name.getNamespaceURI());
             }
         } else {
             element = doc.createElementNS(null, name.getLocalPart());
             String attr = recursiveGetAttributeValue(parent, XMLConstants.XMLNS_ATTRIBUTE);
             if (attr == null || attr.length() > 0) {
-                element.setAttribute(XMLConstants.XMLNS_ATTRIBUTE, 
+                element.setAttribute(XMLConstants.XMLNS_ATTRIBUTE,
                                      "");
             }
         }
         parent.appendChild(element);
         return element;
     }
-    
+
     /**
      * Creates a QName instance from the given namespace context for the given qualifiedName
      *