Author: mszefler
Date: Wed Dec 13 16:10:48 2006
New Revision: 486900

URL: http://svn.apache.org/viewvc?view=rev&rev=486900
Log:
Fix dangerous use of unsynchronzied cache. 

Modified:
    
incubator/ode/trunk/jbi/src/main/java/org/apache/ode/jbi/msgmap/BaseXmlMapper.java

Modified: 
incubator/ode/trunk/jbi/src/main/java/org/apache/ode/jbi/msgmap/BaseXmlMapper.java
URL: 
http://svn.apache.org/viewvc/incubator/ode/trunk/jbi/src/main/java/org/apache/ode/jbi/msgmap/BaseXmlMapper.java?view=diff&rev=486900&r1=486899&r2=486900
==============================================================================
--- 
incubator/ode/trunk/jbi/src/main/java/org/apache/ode/jbi/msgmap/BaseXmlMapper.java
 (original)
+++ 
incubator/ode/trunk/jbi/src/main/java/org/apache/ode/jbi/msgmap/BaseXmlMapper.java
 Wed Dec 13 16:10:48 2006
@@ -19,6 +19,8 @@
 
 package org.apache.ode.jbi.msgmap;
 
+import java.util.Collections;
+import java.util.Map;
 import java.util.WeakHashMap;
 
 import javax.xml.parsers.DocumentBuilderFactory;
@@ -43,7 +45,7 @@
     private TransformerFactory _transformerFactory;
 
     /** Cache of the parsed messages. */
-    private static WeakHashMap<Source, Document> __parsed = new 
WeakHashMap<Source, Document>();
+    private static Map<Source, Document> __parsed = 
Collections.synchronizedMap(new WeakHashMap<Source, Document>());
 
     protected BaseXmlMapper() {
         _transformerFactory = TransformerFactory.newInstance();
@@ -51,6 +53,9 @@
     }
 
     protected Element parse(Source content) throws MessageTranslationException 
{
+        
+        // Check for the message in the cache. note that we are using a 
synchronized map here,
+        // so that we are thread safe, although it is possible for the parse 
to happen twice. 
         Document parsed = __parsed.get(content);
         if (parsed != null)
             return parsed.getDocumentElement();
@@ -68,6 +73,7 @@
             DOMResult domresult = new DOMResult();
             txer.transform(content, domresult);
             parsed = (Document) domresult.getNode();
+            // Again, synchronized map... 
             __parsed.put(content, parsed);
             return parsed.getDocumentElement();
         } catch (TransformerException e) {


Reply via email to