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
*