You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by bd...@apache.org on 2008/09/16 16:13:59 UTC

svn commit: r695889 - /incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/osgi/impl/BundleResourceProcessor.java

Author: bdelacretaz
Date: Tue Sep 16 07:13:59 2008
New Revision: 695889

URL: http://svn.apache.org/viewvc?rev=695889&view=rev
Log:
SLING-659 - avoid ConcurrentModificationException in OsgiControllerImpl.run

Modified:
    incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/osgi/impl/BundleResourceProcessor.java

Modified: incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/osgi/impl/BundleResourceProcessor.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/osgi/impl/BundleResourceProcessor.java?rev=695889&r1=695888&r2=695889&view=diff
==============================================================================
--- incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/osgi/impl/BundleResourceProcessor.java (original)
+++ incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/osgi/impl/BundleResourceProcessor.java Tue Sep 16 07:13:59 2008
@@ -23,9 +23,9 @@
 
 import java.io.InputStream;
 import java.util.HashMap;
-import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
 import java.util.Map;
-import java.util.Set;
 
 import org.apache.sling.jcr.jcrinstall.osgi.OsgiResourceProcessor;
 import org.osgi.framework.Bundle;
@@ -47,6 +47,7 @@
     private final PackageAdmin packageAdmin;
     private final Map<Long, Bundle> pendingBundles;
     private final Logger log = LoggerFactory.getLogger(this.getClass());
+    private final Object refreshLock = new Object();
     
     BundleResourceProcessor(BundleContext ctx, PackageAdmin packageAdmin) {
         this.ctx = ctx;
@@ -79,11 +80,15 @@
         }
         
         if(refresh) {
-            packageAdmin.resolveBundles(null);
-            packageAdmin.refreshPackages(null);
+            synchronized(refreshLock) {
+                packageAdmin.resolveBundles(null);
+                packageAdmin.refreshPackages(null);
+            }
         }
         
-        pendingBundles.put(new Long(b.getBundleId()), b);
+        synchronized(pendingBundles) {
+            pendingBundles.put(new Long(b.getBundleId()), b);
+        }
         
         return updated ? UPDATED : INSTALLED; 
     }
@@ -97,7 +102,9 @@
             if(b == null) {
                 log.debug("Bundle having id {} not found, cannot uninstall");
             } else {
-                pendingBundles.remove(new Long(b.getBundleId()));
+                synchronized(pendingBundles) {
+                    pendingBundles.remove(new Long(b.getBundleId()));
+                }
                 b.uninstall();
             }
         }
@@ -113,24 +120,30 @@
             return;
         }
         
-        final Iterator<Long> iter = pendingBundles.keySet().iterator(); 
-        while(iter.hasNext()) {
-            final Long id = iter.next();
+        final List<Long> toRemove = new LinkedList<Long>();
+        final List<Long> idList = new LinkedList<Long>();
+        synchronized(pendingBundles) {
+            for(Long id : pendingBundles.keySet()) {
+                idList.add(id);
+            }
+        }
+        
+        for(Long id : idList) {
             final Bundle bundle = ctx.getBundle(id.longValue());
             if(bundle == null) {
                 log.debug("Bundle id {} disappeared (bundle removed from framework?), removed from pending bundles queue");
-                iter.remove();
+                toRemove.add(id);
                 continue;
             }
             final int state = bundle.getState();
             
             if(bundle == null) {
                 log.debug("Bundle id {} not found in processResourceQueue(), removed from pending bundles queue");
-                iter.remove();
+                toRemove.add(id);
                 
             } else if ((state & Bundle.ACTIVE) > 0) {
                 log.info("Bundle {} is active, removed from pending bundles queue", bundle.getLocation());
-                iter.remove();
+                toRemove.add(id);
             
             } else if ((state & Bundle.STARTING) > 0) {
                 log.info("Bundle {} is starting.", bundle.getLocation());
@@ -140,17 +153,25 @@
                 
             } else if ((state & Bundle.UNINSTALLED) > 0) {
                 log.info("Bundle {} is uninstalled, removed from pending bundles queue", bundle.getLocation());
-                iter.remove();
+                toRemove.add(id);
                 
             } else if ((state & Bundle.RESOLVED) > 0) {
                 log.info("Bundle {} is resolved, trying to start it.", bundle.getLocation());
                 bundle.start();
-                packageAdmin.resolveBundles(null);
-                packageAdmin.refreshPackages(null);
-                
+                synchronized(refreshLock) {
+                    packageAdmin.resolveBundles(null);
+                    packageAdmin.refreshPackages(null);
+                }
+
             } else if ((state & Bundle.INSTALLED) > 0) {
                 log.debug("Bundle {} is installed but not resolved.", bundle.getLocation());
             }
         }
+        
+        synchronized(pendingBundles) {
+            for(Long id : toRemove) {
+                pendingBundles.remove(id);
+            }
+        }
     }
 }