You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@santuario.apache.org by mu...@apache.org on 2011/12/02 15:35:02 UTC

svn commit: r1209511 - /santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/utils/IdResolver.java

Author: mullan
Date: Fri Dec  2 14:35:02 2011
New Revision: 1209511

URL: http://svn.apache.org/viewvc?rev=1209511&view=rev
Log:
Tighten up the thread-safety: get/puts to element map are now done inside
synchronized blocks. Also, throw an exception if the same id is registered for
more than one element.

Modified:
    santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/utils/IdResolver.java

Modified: santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/utils/IdResolver.java
URL: http://svn.apache.org/viewvc/santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/utils/IdResolver.java?rev=1209511&r1=1209510&r2=1209511&view=diff
==============================================================================
--- santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/utils/IdResolver.java (original)
+++ santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/utils/IdResolver.java Fri Dec  2 14:35:02 2011
@@ -57,15 +57,23 @@ public class IdResolver {
      */
     public static void registerElementById(Element element, String idValue) {
         Document doc = element.getOwnerDocument();
-        Map<String, WeakReference<Element>> elementMap;
         synchronized (docMap) {
-            elementMap = docMap.get(doc);
+            Map<String, WeakReference<Element>> elementMap = docMap.get(doc);
             if (elementMap == null) {
                 elementMap = new WeakHashMap<String, WeakReference<Element>>();
                 docMap.put(doc, elementMap);
+                elementMap.put(idValue, new WeakReference<Element>(element));
+            } else {
+                WeakReference<Element> ref = elementMap.get(idValue);
+                if (ref != null) {
+                    if (!ref.get().equals(element)) {
+                        throw new IllegalArgumentException("ID is already registered");
+                    }
+                } else {
+                    elementMap.put(idValue, new WeakReference<Element>(element));
+                }
             }
         }
-        elementMap.put(idValue, new WeakReference<Element>(element));
     }
 
     /**
@@ -151,14 +159,13 @@ public class IdResolver {
         if (log.isDebugEnabled()) {
             log.debug("getElementByIdType() Search for ID " + id);
         }
-        Map<String, WeakReference<Element>> elementMap;
         synchronized (docMap) {
-            elementMap = docMap.get(doc);
-        }
-        if (elementMap != null) {
-            WeakReference<Element> weakReference = (WeakReference<Element>) elementMap.get(id);
-            if (weakReference != null) {
-                return (Element) weakReference.get();   
+            Map<String, WeakReference<Element>> elementMap = docMap.get(doc);
+            if (elementMap != null) {
+                WeakReference<Element> weakReference = elementMap.get(id);
+                if (weakReference != null) {
+                    return weakReference.get();
+                }
             }
         }
         return null;