[Dive4elements-commits] [PATCH] Datacage: Always clone XML template for builders. If the first is not cloned they get interlinked somehow. Feels like a bug in Java's DOM implementation

Wald Commits scm-commit at wald.intevation.org
Mon Apr 22 17:01:25 CEST 2013


# HG changeset patch
# User Sascha L. Teichmann <teichmann at intevation.de>
# Date 1366642877 -7200
# Node ID d38004f0c52fc4a432c156d5a93191df424d96ec
# Parent  efbbfe32e9fe8f3a907d43269a762606be106870
Datacage: Always clone XML template for builders. If the first is not cloned they get interlinked somehow. Feels like a bug in Java's DOM implementation.

diff -r efbbfe32e9fe -r d38004f0c52f flys-artifacts/src/main/java/de/intevation/flys/artifacts/datacage/templating/BuilderPool.java
--- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/datacage/templating/BuilderPool.java	Mon Apr 22 16:18:16 2013 +0200
+++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/datacage/templating/BuilderPool.java	Mon Apr 22 17:01:17 2013 +0200
@@ -7,13 +7,9 @@
 
 import java.sql.SQLException;
 
-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.DOMResult;
-import javax.xml.transform.dom.DOMSource;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
 
 import org.apache.log4j.Logger;
 
@@ -46,32 +42,29 @@
 
         pool = new ArrayDeque<Builder>(poolSize);
         for (int i = 0; i < poolSize; ++i) {
-            Document doc = i > 0 // Clone all but the first.
-                ? cloneDocument(document)
-                : document;
-            pool.add(new Builder(doc));
+            pool.add(new Builder(cloneDocument(document)));
         }
     }
 
     private final static Document cloneDocument(Document document) {
+
         try {
-            TransformerFactory tfactory = TransformerFactory.newInstance();
-            Transformer xformer = tfactory.newTransformer();
-            DOMSource src = new DOMSource(document);
-            DOMResult dst = new DOMResult();
-            xformer.transform(src, dst);
-            return (Document)dst.getNode();
+            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+            DocumentBuilder db = dbf.newDocumentBuilder();
+
+            Node origRoot = document.getDocumentElement();
+
+            Document copy = db.newDocument();
+            Node copyRoot = copy.importNode(origRoot, true);
+            copy.appendChild(copyRoot);
+
+            return copy;
         }
-        catch (TransformerConfigurationException tce) {
-            log.error(tce);
-        }
-        catch (TransformerException te) {
-            log.error(te);
+        catch (ParserConfigurationException pce) {
+            log.error(pce);
         }
 
-        log.error(
-            "Returning original DOM document. " +
-            "This will result in threading errors!");
+        log.error("Returning original document. This will lead to threading issues.");
 
         return document;
     }


More information about the Dive4elements-commits mailing list