Author: gnodet
Date: Thu Oct 19 08:47:08 2017
New Revision: 1812605

URL: http://svn.apache.org/viewvc?rev=1812605&view=rev
Log:
[FELIX-4740] Bundles don't start if no BundleEvent fired after reaching start 
level

Modified:
    
felix/trunk/fileinstall/src/main/java/org/apache/felix/fileinstall/internal/DirectoryWatcher.java

Modified: 
felix/trunk/fileinstall/src/main/java/org/apache/felix/fileinstall/internal/DirectoryWatcher.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/fileinstall/src/main/java/org/apache/felix/fileinstall/internal/DirectoryWatcher.java?rev=1812605&r1=1812604&r2=1812605&view=diff
==============================================================================
--- 
felix/trunk/fileinstall/src/main/java/org/apache/felix/fileinstall/internal/DirectoryWatcher.java
 (original)
+++ 
felix/trunk/fileinstall/src/main/java/org/apache/felix/fileinstall/internal/DirectoryWatcher.java
 Thu Oct 19 08:47:08 2017
@@ -138,6 +138,7 @@ public class DirectoryWatcher extends Th
     String fragmentScope;
     String optionalScope;
     boolean disableNio2;
+    int frameworkStartLevel;
 
     // Map of all installed artifacts
     final Map<File, Artifact> currentManagedArtifacts = new HashMap<File, 
Artifact>();
@@ -503,20 +504,25 @@ public class DirectoryWatcher extends Th
             }
         }
 
-        if (startBundles && isStateChanged())
-        {
-            // Try to start all the bundles that are not persistently stopped
-            startAllBundles();
-            
-            delayedStart.addAll(installedBundles);
-            delayedStart.removeAll(uninstalledBundles);
-            // Try to start newly installed bundles, or bundles which we 
missed on a previous round
-            startBundles(delayedStart);
-            consistentlyFailingBundles.clear();
-            consistentlyFailingBundles.addAll(delayedStart);
+        if (startBundles) {
+            int startLevel = 
systemBundle.adapt(FrameworkStartLevel.class).getStartLevel();
+            boolean doStart = isStateChanged() || startLevel != 
frameworkStartLevel;
+            frameworkStartLevel = startLevel;
+            if (doStart)
+            {
+                // Try to start all the bundles that are not persistently 
stopped
+                startAllBundles();
+
+                delayedStart.addAll(installedBundles);
+                delayedStart.removeAll(uninstalledBundles);
+                // Try to start newly installed bundles, or bundles which we 
missed on a previous round
+                startBundles(delayedStart);
+                consistentlyFailingBundles.clear();
+                consistentlyFailingBundles.addAll(delayedStart);
 
-            // set the state as unchanged to not reattempt starting failed 
bundles
-            setStateChanged(false);
+                // set the state as unchanged to not reattempt starting failed 
bundles
+                setStateChanged(false);
+            }
         }
     }
 
@@ -1233,7 +1239,6 @@ public class DirectoryWatcher extends Th
       */
     private boolean startBundle(Bundle bundle, boolean logFailures)
     {
-        FrameworkStartLevel startLevelSvc = 
systemBundle.adapt(FrameworkStartLevel.class);
         // Fragments can never be started.
         // Bundles can only be started transient when the start level of the 
framework is high
         // enough. Persistent (i.e. non-transient) starts will simply make the 
framework start the
@@ -1241,7 +1246,7 @@ public class DirectoryWatcher extends Th
         if (startBundles
                 && bundle.getState() != Bundle.UNINSTALLED
                 && !isFragment(bundle)
-                && startLevelSvc.getStartLevel() >= 
bundle.adapt(BundleStartLevel.class).getStartLevel())
+                && frameworkStartLevel >= 
bundle.adapt(BundleStartLevel.class).getStartLevel())
         {
             try
             {


Reply via email to