From 61fd1966c1ec105cb45e6a2e4bdc819af6fe9ca2 Mon Sep 17 00:00:00 2001 From: hns Date: Fri, 7 Jun 2002 18:31:54 +0000 Subject: [PATCH] removed memory leak where XmlUtil held strong static references on transactor threads. --- src/helma/objectmodel/dom/XmlUtil.java | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/src/helma/objectmodel/dom/XmlUtil.java b/src/helma/objectmodel/dom/XmlUtil.java index 05301d70..e4c519ea 100644 --- a/src/helma/objectmodel/dom/XmlUtil.java +++ b/src/helma/objectmodel/dom/XmlUtil.java @@ -2,7 +2,7 @@ package helma.objectmodel.dom; import java.io.InputStream; import java.io.IOException; -import java.util.HashMap; +import java.util.WeakHashMap; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.DocumentBuilder; @@ -22,22 +22,23 @@ import helma.objectmodel.TransientNode; public class XmlUtil { private static final DocumentBuilderFactory domBuilderFactory = javax.xml.parsers.DocumentBuilderFactory.newInstance(); - private static final HashMap domBuilders = new HashMap(); + private static final WeakHashMap domBuilders = new WeakHashMap(); - private static synchronized DocumentBuilder getDocumentBuilder() { - if ( domBuilders.containsKey (Thread.currentThread()) ) { - return (DocumentBuilder)domBuilders.get (Thread.currentThread()); - } else { - try { - DocumentBuilder d = domBuilderFactory.newDocumentBuilder(); - domBuilders.put (Thread.currentThread(),d); - return d; - } catch ( ParserConfigurationException e ) { + private static synchronized DocumentBuilder getDocumentBuilder() { + DocumentBuilder domBuilder = (DocumentBuilder) domBuilders.get (Thread.currentThread()); + if (domBuilder != null) { + return domBuilder; + } else { + try { + domBuilder = domBuilderFactory.newDocumentBuilder(); + domBuilders.put (Thread.currentThread(), domBuilder); + return domBuilder; + } catch ( ParserConfigurationException e ) { throw new RuntimeException ("Cannot build parser: "+e.toString()); } } } - + public static Document newDocument() { DocumentBuilder d = getDocumentBuilder(); return d.newDocument();