Author: iocanel
Date: Mon Jan 16 20:13:49 2012
New Revision: 1232143

URL: http://svn.apache.org/viewvc?rev=1232143&view=rev
Log:
[KARAF-1136] FeaturesServiceImpl will wait for at most 5 seconds for the 
RegionsPersistence service to become available, if need.

Modified:
    
karaf/trunk/features/core/src/main/java/org/apache/karaf/features/internal/FeaturesServiceImpl.java

Modified: 
karaf/trunk/features/core/src/main/java/org/apache/karaf/features/internal/FeaturesServiceImpl.java
URL: 
http://svn.apache.org/viewvc/karaf/trunk/features/core/src/main/java/org/apache/karaf/features/internal/FeaturesServiceImpl.java?rev=1232143&r1=1232142&r2=1232143&view=diff
==============================================================================
--- 
karaf/trunk/features/core/src/main/java/org/apache/karaf/features/internal/FeaturesServiceImpl.java
 (original)
+++ 
karaf/trunk/features/core/src/main/java/org/apache/karaf/features/internal/FeaturesServiceImpl.java
 Mon Jan 16 20:13:49 2012
@@ -47,6 +47,8 @@ import java.util.Queue;
 import java.util.Set;
 import java.util.TreeSet;
 import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.jar.JarInputStream;
 import java.util.jar.Manifest;
@@ -113,10 +115,12 @@ public class FeaturesServiceImpl impleme
     AtomicBoolean bootFeaturesInstalled = new AtomicBoolean();
     private List<FeaturesListener> listeners = new 
CopyOnWriteArrayList<FeaturesListener>();
     private Queue<RegionsPersistence> regionsPersistenceQueue = new 
LinkedList<RegionsPersistence>();
+    private CountDownLatch regionsPersistenceLatch = new CountDownLatch(1);
     private ThreadLocal<Repository> repo = new ThreadLocal<Repository>();
     private EventAdminListener eventAdminListener;
     private final Object refreshLock = new Object();
     private long refreshTimeout = 5000;
+    private long regionsPersistenceTimeout = 5000;
 
     public FeaturesServiceImpl() {
     }
@@ -172,8 +176,27 @@ public class FeaturesServiceImpl impleme
     }
 
 
+    /**
+     * Returns a RegionsPersistence service.
+     * @param timeout
+     * @return
+     */
+    protected RegionsPersistence getRegionsPersistence(long timeout) {
+        if (!regionsPersistenceQueue.isEmpty()) {
+            return regionsPersistenceQueue.peek();
+        } else {
+            try {
+                regionsPersistenceLatch.await(timeout, TimeUnit.MILLISECONDS);
+            } catch (InterruptedException e) {
+                LOGGER.warn("Interrupted while waittng for RegionsPersistence 
service",e);
+            }
+            return regionsPersistenceQueue.peek();
+        }
+    }
+
     public void registerRegionsPersistence(RegionsPersistence 
regionsPersistence) {
         regionsPersistenceQueue.add(regionsPersistence);
+        regionsPersistenceLatch.countDown();
     }
 
     public void unregisterRegionsPersistence(RegionsPersistence 
regionsPersistence) {
@@ -489,9 +512,13 @@ public class FeaturesServiceImpl impleme
             Bundle b = installBundleIfNeeded(state, bInfo, 
feature.getStartLevel(), verbose);
             bundles.add(b.getBundleId());
             state.bundleInfos.put(b.getBundleId(), bInfo);
-            RegionsPersistence regionsPersistence = 
regionsPersistenceQueue.peek();
-            if (region != null && state.installed.contains(b) && 
regionsPersistence != null) {
-                regionsPersistence.install(b, region);
+            if (region != null && state.installed.contains(b)) {
+                RegionsPersistence regionsPersistence = 
getRegionsPersistence(regionsPersistenceTimeout);
+                if (regionsPersistence != null) {
+                    regionsPersistence.install(b, region);
+                } else {
+                    throw new Exception("Unable to find RegionsPersistence 
service, while installing "+ feature.getName());
+                }
             }
         }
         state.features.put(feature, bundles);


Reply via email to