You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ju...@apache.org on 2012/08/13 20:32:45 UTC

svn commit: r1372539 - /sling/trunk/bundles/jcr/webdav/src/main/java/org/apache/sling/jcr/webdav/impl/handler/SlingHandlerManager.java

Author: justin
Date: Mon Aug 13 18:32:45 2012
New Revision: 1372539

URL: http://svn.apache.org/viewvc?rev=1372539&view=rev
Log:
SLING-2559 - avoiding the setValue() call by queueing updates to the handler map and then using putAll()

Modified:
    sling/trunk/bundles/jcr/webdav/src/main/java/org/apache/sling/jcr/webdav/impl/handler/SlingHandlerManager.java

Modified: sling/trunk/bundles/jcr/webdav/src/main/java/org/apache/sling/jcr/webdav/impl/handler/SlingHandlerManager.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/jcr/webdav/src/main/java/org/apache/sling/jcr/webdav/impl/handler/SlingHandlerManager.java?rev=1372539&r1=1372538&r2=1372539&view=diff
==============================================================================
--- sling/trunk/bundles/jcr/webdav/src/main/java/org/apache/sling/jcr/webdav/impl/handler/SlingHandlerManager.java (original)
+++ sling/trunk/bundles/jcr/webdav/src/main/java/org/apache/sling/jcr/webdav/impl/handler/SlingHandlerManager.java Mon Aug 13 18:32:45 2012
@@ -19,6 +19,8 @@
 package org.apache.sling.jcr.webdav.impl.handler;
 
 import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
 import java.util.TreeMap;
@@ -58,19 +60,31 @@ public class SlingHandlerManager<Managed
 
             final ArrayList<ManagedType> ioHandlers = new ArrayList<ManagedType>(
                 entries.size());
+            final Map<ServiceReference, ManagedType> updates = new HashMap<ServiceReference, ManagedType>();
             for (Entry<ServiceReference, ManagedType> entry : entries) {
                 final ManagedType ioHandler;
                 if (entry.getValue() == null) {
+                    final ServiceReference key = entry.getKey();
                     // unckecked cast
                     ioHandler = (ManagedType) this.componentContext.locateService(
-                        referenceName, entry.getKey());
-                    entry.setValue(ioHandler);
+                        referenceName, key);
+                    // since we're inside the entries iterator, we can't update the map
+                    // defer updating the map until this loop is finished
+                    if (ioHandler != null) {
+                        updates.put(key, ioHandler);
+                    }
                 } else {
                     ioHandler = entry.getValue();
                 }
                 ioHandlers.add(ioHandler);
             }
 
+            if (!updates.isEmpty()) {
+                synchronized (this.handlerServices) {
+                    this.handlerServices.putAll(updates);
+                }
+            }
+
             // unckecked cast
             this.handlers = ioHandlers.toArray(type);
         }