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/23 16:31:31 UTC

svn commit: r698192 - /incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/RepositoryObserver.java

Author: bdelacretaz
Date: Tue Sep 23 07:31:31 2008
New Revision: 698192

URL: http://svn.apache.org/viewvc?rev=698192&view=rev
Log:
SLING-660 - wait 1 sec after the last bundle event before uninstalling anything

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

Modified: incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/RepositoryObserver.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/RepositoryObserver.java?rev=698192&r1=698191&r2=698192&view=diff
==============================================================================
--- incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/RepositoryObserver.java (original)
+++ incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/RepositoryObserver.java Tue Sep 23 07:31:31 2008
@@ -38,8 +38,11 @@
 import javax.jcr.observation.Event;
 
 import org.apache.sling.jcr.api.SlingRepository;
-import org.apache.sling.jcr.jcrinstall.osgi.JcrInstallException;
 import org.apache.sling.jcr.jcrinstall.osgi.OsgiController;
+import org.osgi.framework.BundleEvent;
+import org.osgi.framework.BundleListener;
+import org.osgi.framework.FrameworkEvent;
+import org.osgi.framework.FrameworkListener;
 import org.osgi.service.component.ComponentContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -60,7 +63,7 @@
  *      name="service.vendor" 
  *      value="The Apache Software Foundation"
  */
-public class RepositoryObserver implements Runnable {
+public class RepositoryObserver implements Runnable, BundleListener {
 
     protected Set<WatchedFolder> folders;
     private RegexpFilter folderNameFilter;
@@ -75,6 +78,7 @@
     
     private Session session;
     private File serviceDataFile;
+    private long lastBundleEvent;
     
     private List<WatchedFolderCreationListener> listeners = new LinkedList<WatchedFolderCreationListener>();
     
@@ -94,13 +98,18 @@
     /** Scan delay for watched folders */
     protected long scanDelayMsec = 1000L;
     
-    protected static final Logger log = LoggerFactory.getLogger(WatchedFolder.class);
+    private final Logger log = LoggerFactory.getLogger(getClass());
     
     /** Upon activation, find folders to watch under our roots, and observe those
      *  roots to detect new folders to watch.
      */
     protected void activate(ComponentContext context) throws RepositoryException {
     	
+        if(context!=null) {
+            context.getBundleContext().addBundleListener(this);
+        }
+        lastBundleEvent = System.currentTimeMillis();
+        
     	// TODO make this more configurable?
     	final String [] roots = DEFAULT_ROOTS; 
     	filenameFilter = new RegexpFilter(DEFAULT_FILENAME_REGEXP);
@@ -153,10 +162,12 @@
         return result;
     }
     
-    protected void deactivate(ComponentContext oldContext) {
+    protected void deactivate(ComponentContext context) {
     	
         running = false;
         
+        context.getBundleContext().removeBundleListener(this);
+
     	for(WatchedFolder f : folders) {
     		f.cleanup();
     	}
@@ -248,7 +259,7 @@
         final Properties props = loadProperties(serviceDataFile);
         final String oldRegexp = props.getProperty(DATA_LAST_FOLDER_REGEXP);
         if(oldRegexp != null && !oldRegexp.equals(folderNameFilter.getRegexp())) {
-            log.info("Folder name regexp has changed uninstalling non-applicable resources ( {} -> {} )", 
+            log.info("Folder name regexp has changed, uninstalling non-applicable resources ( {} -> {} )", 
                     oldRegexp, folderNameFilter.getRegexp());
             for(String uri : osgiController.getInstalledUris()) {
                 try {
@@ -289,6 +300,24 @@
      */
     public void run() {
         log.info("{} thread {} starts", getClass().getSimpleName(), Thread.currentThread().getName());
+        
+        // Wait some time after receiving our last bundle event, to
+        // avoid uninstalling stuff while components might be starting
+        final long bundleEventDelayMsec = 1000;
+        boolean logged = false;
+        while(System.currentTimeMillis() - lastBundleEvent < bundleEventDelayMsec) {
+            if(!logged) {
+                log.info("Bundle events were detected in the last {} msec, waiting...", bundleEventDelayMsec);
+            }
+            logged = true;
+            
+            try {
+                Thread.sleep(100);
+            } catch(InterruptedException ignore) {
+                // ignore
+            }
+        }
+        log.info("No bundle events in the last {} msec, starting processing", bundleEventDelayMsec);
 
         handleInitialUninstalls();
         
@@ -361,4 +390,8 @@
             }
         }
     }
+
+    public void bundleChanged(BundleEvent event) {
+        lastBundleEvent = System.currentTimeMillis();
+    }
 }
\ No newline at end of file