Author: bdelacretaz
Date: Wed Sep 10 04:53:08 2008
New Revision: 693802

URL: http://svn.apache.org/viewvc?rev=693802&view=rev
Log:
SLING-646 - check for deleted resources at startup

Modified:
    
incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/RepositoryObserver.java
    
incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/WatchedFolder.java
    
incubator/sling/trunk/extensions/jcrinstall/src/test/java/org/apache/sling/jcr/jcrinstall/jcr/impl/FindWatchedFoldersTest.java
    
incubator/sling/trunk/extensions/jcrinstall/src/test/java/org/apache/sling/jcr/jcrinstall/jcr/impl/ResourceDetectionTest.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=693802&r1=693801&r2=693802&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
 Wed Sep 10 04:53:08 2008
@@ -95,6 +95,15 @@
             folders.addAll(findWatchedFolders(root));
         }
         
+        // Check if any deletions happened while this
+        // service was inactive
+        for(WatchedFolder wf : folders) {
+            try {
+                wf.checkDeletions();
+            } catch(Exception e) {
+                log.warn("Exception in activate() / checkDeletions", e);
+            }
+        }
     }
     
     protected void deactivate(ComponentContext oldContext) {

Modified: 
incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/WatchedFolder.java
URL: 
http://svn.apache.org/viewvc/incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/WatchedFolder.java?rev=693802&r1=693801&r2=693802&view=diff
==============================================================================
--- 
incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/WatchedFolder.java
 (original)
+++ 
incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/WatchedFolder.java
 Wed Sep 10 04:53:08 2008
@@ -125,6 +125,8 @@
     protected void scan() throws Exception {
         log.debug("Scanning {}", path);
         
+        checkDeletions();
+        
         Node folder = null;
         if(session.itemExists(path)) {
                Item i = session.getItem(path);
@@ -137,9 +139,6 @@
                log.info("Folder {} does not exist (or not anymore), cannot 
scan", path);
                return;
         }
-               
-        
-        // TODO: check deletions
         
         // Check adds and updates, for all child nodes that are files
         final NodeIterator it = folder.getNodes();
@@ -153,6 +152,19 @@
         }
     }
     
+    /** Check for deleted resources and uninstall them */
+    void checkDeletions() throws Exception {
+        // Check deletions
+        for(String uri : controller.getInstalledUris()) {
+            if(uri.startsWith(path)) {
+                if(!session.itemExists(uri)) {
+                    log.debug("Resource {} has been deleted, uninstalling");
+                    controller.uninstall(uri);
+                }
+            }
+        }
+    }
+    
     /** Install or update the given resource, as needed */ 
     protected void installOrUpdate(String path, InputStream data, Long 
lastModified) throws IOException, JcrInstallException {
        final long currentLastModified = controller.getLastModified(path);

Modified: 
incubator/sling/trunk/extensions/jcrinstall/src/test/java/org/apache/sling/jcr/jcrinstall/jcr/impl/FindWatchedFoldersTest.java
URL: 
http://svn.apache.org/viewvc/incubator/sling/trunk/extensions/jcrinstall/src/test/java/org/apache/sling/jcr/jcrinstall/jcr/impl/FindWatchedFoldersTest.java?rev=693802&r1=693801&r2=693802&view=diff
==============================================================================
--- 
incubator/sling/trunk/extensions/jcrinstall/src/test/java/org/apache/sling/jcr/jcrinstall/jcr/impl/FindWatchedFoldersTest.java
 (original)
+++ 
incubator/sling/trunk/extensions/jcrinstall/src/test/java/org/apache/sling/jcr/jcrinstall/jcr/impl/FindWatchedFoldersTest.java
 Wed Sep 10 04:53:08 2008
@@ -18,12 +18,16 @@
  */
 package org.apache.sling.jcr.jcrinstall.jcr.impl;
 
+import java.util.HashSet;
 import java.util.Set;
 
 import javax.jcr.Session;
 
 import org.apache.sling.commons.testing.jcr.RepositoryTestBase;
 import org.apache.sling.jcr.api.SlingRepository;
+import org.apache.sling.jcr.jcrinstall.osgi.OsgiController;
+import org.jmock.Expectations;
+import org.jmock.Mockery;
 
 /** Test the "find watched folders" feature of the RepositoryObserver */
 public class FindWatchedFoldersTest extends RepositoryTestBase {
@@ -32,6 +36,8 @@
     Session session;
     private EventHelper eventHelper; 
     private ContentHelper contentHelper;
+    private Mockery mockery;
+    private OsgiController osgiController;
     
     @Override
     protected void tearDown() throws Exception {
@@ -50,12 +56,18 @@
         eventHelper = new EventHelper(session);
         contentHelper = new ContentHelper(session);
         contentHelper.cleanupContent();
+        mockery = new Mockery();
+        osgiController = mockery.mock(OsgiController.class);
+        final Set<String> installedUri = new HashSet<String>();
+        mockery.checking(new Expectations() {{
+            allowing(osgiController).getInstalledUris(); 
will(returnValue(installedUri));
+        }});
     }
     
     public void testInitialFind() throws Exception {
        
        contentHelper.setupContent();
-        final RepositoryObserver ro = 
MiscHelper.createRepositoryObserver(repo, null);
+        final RepositoryObserver ro = 
MiscHelper.createRepositoryObserver(repo, osgiController);
         ro.activate(null);
         
         final Set<WatchedFolder> wfSet = MiscHelper.getWatchedFolders(ro);
@@ -69,7 +81,7 @@
     
     public void testNewWatchedFolderDetection() throws Exception {
        contentHelper.setupContent();
-        final RepositoryObserver ro = 
MiscHelper.createRepositoryObserver(repo, null);
+        final RepositoryObserver ro = 
MiscHelper.createRepositoryObserver(repo, osgiController);
         ro.activate(null);
 
         final String newPaths [] = { "libs/tnwf/install", "apps/tnwf/install" 
};

Modified: 
incubator/sling/trunk/extensions/jcrinstall/src/test/java/org/apache/sling/jcr/jcrinstall/jcr/impl/ResourceDetectionTest.java
URL: 
http://svn.apache.org/viewvc/incubator/sling/trunk/extensions/jcrinstall/src/test/java/org/apache/sling/jcr/jcrinstall/jcr/impl/ResourceDetectionTest.java?rev=693802&r1=693801&r2=693802&view=diff
==============================================================================
--- 
incubator/sling/trunk/extensions/jcrinstall/src/test/java/org/apache/sling/jcr/jcrinstall/jcr/impl/ResourceDetectionTest.java
 (original)
+++ 
incubator/sling/trunk/extensions/jcrinstall/src/test/java/org/apache/sling/jcr/jcrinstall/jcr/impl/ResourceDetectionTest.java
 Wed Sep 10 04:53:08 2008
@@ -20,6 +20,8 @@
 
 import java.io.ByteArrayInputStream;
 import java.io.InputStream;
+import java.util.HashSet;
+import java.util.Set;
 
 import javax.jcr.Session;
 
@@ -78,14 +80,14 @@
         final InputStream data = new ByteArrayInputStream(dummyJar.getBytes());
         final long lastModifiedA = System.currentTimeMillis();
         final long lastModifiedB = lastModifiedA + 1;
-        
+        final Set<String> installedUri = new HashSet<String>();
         final OsgiController c = mockery.mock(OsgiController.class);
-        final RepositoryObserver ro = 
MiscHelper.createRepositoryObserver(repo, c);
-        ro.activate(null);
         
         // Define the whole sequence of calls to OsgiController,
         // Using getLastModified calls to mark the test phases
         mockery.checking(new Expectations() {{
+            allowing(c).getInstalledUris(); will(returnValue(installedUri));
+            
             one(c).getLastModified("phase1"); 
             inSequence(sequence);
             one(c).getLastModified(dummyJar); will(returnValue(-1L));
@@ -106,11 +108,15 @@
             inSequence(sequence);
         }});
         
+        final RepositoryObserver ro = 
MiscHelper.createRepositoryObserver(repo, c);
+        ro.activate(null);
+        
         // Add two files, run one cycle must install the bundles
         c.getLastModified("phase1");
         contentHelper.createOrUpdateFile(dummyJar, data, lastModifiedA);
         eventHelper.waitForEvents(5000L);
         ro.runOneCycle();
+        installedUri.add(dummyJar);
         
         // Updating with the same timestamp must not call install again
         c.getLastModified("phase2");
@@ -137,20 +143,22 @@
         };
         final InputStream data = new ByteArrayInputStream("hello".getBytes());
         final long lastModifiedA = System.currentTimeMillis();
-        
+        final Set<String> installedUri = new HashSet<String>();
         final OsgiController c = mockery.mock(OsgiController.class);
-        final RepositoryObserver ro = 
MiscHelper.createRepositoryObserver(repo, c);
-        ro.activate(null);
         
         // Define the whole sequence of calls to OsgiController,
         // Using getLastModified calls to mark the test phases
         mockery.checking(new Expectations() {{
+            allowing(c).getInstalledUris(); will(returnValue(installedUri));
             allowing(c).getLastModified(with(any(String.class))); 
will(returnValue(-1L)); 
             one(c).installOrUpdate(with(equal(resources[0])), 
with(equal(lastModifiedA)), with(any(InputStream.class)));
             one(c).installOrUpdate(with(equal(resources[1])), 
with(equal(lastModifiedA)), with(any(InputStream.class)));
             one(c).installOrUpdate(with(equal(resources[2])), 
with(equal(lastModifiedA)), with(any(InputStream.class)));
         }});
         
+        final RepositoryObserver ro = 
MiscHelper.createRepositoryObserver(repo, c);
+        ro.activate(null);
+        
         // Add two files, run one cycle must install the bundles
         for(String file : resources) {
             contentHelper.createOrUpdateFile(file, data, lastModifiedA);
@@ -160,4 +168,27 @@
         
         mockery.assertIsSatisfied();
     }
-}
+    
+    public void testInitialDeletions() throws Exception {
+        contentHelper.setupContent();
+        
+        final Set<String> installedUri = new HashSet<String>();
+        installedUri.add("/libs/foo/bar/install/dummy.jar");
+        installedUri.add("/libs/foo/bar/install/dummy.cfg");
+        
+        final OsgiController c = mockery.mock(OsgiController.class);
+        final RepositoryObserver ro = 
MiscHelper.createRepositoryObserver(repo, c);
+        
+        mockery.checking(new Expectations() {{
+            allowing(c).getInstalledUris(); will(returnValue(installedUri));
+            allowing(c).getLastModified(with(any(String.class))); 
will(returnValue(-1L)); 
+            one(c).uninstall("/libs/foo/bar/install/dummy.jar");
+            one(c).uninstall("/libs/foo/bar/install/dummy.cfg");
+        }});
+        
+        // Activating with installed resources that are not in
+        // the repository must cause them to be uninstalled
+        ro.activate(null);
+        mockery.assertIsSatisfied();
+    }
+}
\ No newline at end of file


Reply via email to