You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by gn...@apache.org on 2014/03/18 13:34:51 UTC

svn commit: r1578844 - /felix/trunk/fileinstall/src/main/java/org/apache/felix/fileinstall/internal/DirectoryWatcher.java

Author: gnodet
Date: Tue Mar 18 12:34:51 2014
New Revision: 1578844

URL: http://svn.apache.org/r1578844
Log:
[FELIX-2702] Monitoring system state to check whether to reattempt
starting bundles.

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=1578844&r1=1578843&r2=1578844&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 Tue Mar 18 12:34:51 2014
@@ -147,6 +147,10 @@ public class DirectoryWatcher extends Th
     // Represents artifacts that could not be installed
     Map/* <File, Artifact> */ installationFailures = new HashMap/* <File, Artifact> */();
 
+    // flag (acces to which must be synchronized) that indicates wheter there's a change in state of system,
+    // which may result in an attempt to start the watched bundles
+    private Boolean stateChanged = Boolean.FALSE;
+
     public DirectoryWatcher(Dictionary properties, BundleContext context)
     {
         super("fileinstall-" + getThreadName(properties));
@@ -335,7 +339,8 @@ public class DirectoryWatcher extends Th
 
     public void bundleChanged(BundleEvent bundleEvent)
     {
-        if (bundleEvent.getType() == BundleEvent.UNINSTALLED)
+        int type = bundleEvent.getType();
+        if (type == BundleEvent.UNINSTALLED)
         {
             for (Iterator it = getArtifacts().iterator(); it.hasNext();)
             {
@@ -349,6 +354,10 @@ public class DirectoryWatcher extends Th
                 }
             }
         }
+        if (type == BundleEvent.INSTALLED || type == BundleEvent.RESOLVED || type == BundleEvent.UNINSTALLED ||
+            type == BundleEvent.UNRESOLVED || type == BundleEvent.UPDATED) {
+            setStateChanged(true);
+        }
     }
 
     private void process(Set files) throws InterruptedException
@@ -510,10 +519,12 @@ public class DirectoryWatcher extends Th
             {
                 // Refresh if any bundle got uninstalled or updated.
                 refresh((Bundle[]) toRefresh.toArray(new Bundle[toRefresh.size()]));
+                // set the state to reattempt starting managed bundles which aren't already STARTING or ACTIVE
+                setStateChanged(true);
             }
         }
 
-        if (startBundles)
+        if (startBundles && isStateChanged())
         {
             // Try to start all the bundles that are not persistently stopped
             startAllBundles();
@@ -522,6 +533,9 @@ public class DirectoryWatcher extends Th
             delayedStart.removeAll(uninstalledBundles);
             // Try to start newly installed bundles, or bundles which we missed on a previous round
             startBundles(delayedStart);
+
+            // set the state as unchanged to not reattempt starting failed bundles
+            setStateChanged(false);
         }
     }
 
@@ -1490,5 +1504,17 @@ public class DirectoryWatcher extends Th
             currentManagedArtifacts.remove(file);
         }
     }
+    
+    private void setStateChanged(boolean changed) {
+        synchronized (stateChanged) {
+            this.stateChanged = Boolean.valueOf(changed);
+        }
+    }
+
+    private boolean isStateChanged() {
+        synchronized (stateChanged) {
+            return stateChanged.booleanValue();
+        }
+    }
 
 }