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 2009/10/13 18:49:34 UTC

svn commit: r824840 - in /sling/trunk/installer/osgi: installer/src/main/java/org/apache/sling/osgi/installer/impl/ installer/src/main/java/org/apache/sling/osgi/installer/impl/tasks/ installer/src/test/java/org/apache/sling/osgi/installer/impl/ it/src...

Author: bdelacretaz
Date: Tue Oct 13 16:49:33 2009
New Revision: 824840

URL: http://svn.apache.org/viewvc?rev=824840&view=rev
Log:
SLING-1148 - RegisteredResource persisted in the bundle storage area

Added:
    sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/PersistentResourceList.java   (with props)
    sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/PersistentResourceListTest.java   (with props)
    sling/trunk/installer/osgi/it/src/test/java/org/apache/sling/osgi/installer/it/RemovedResourceDetectionTest.java   (with props)
Modified:
    sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/BundleTaskCreator.java
    sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/ConfigurationPid.java
    sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/OsgiInstallerThread.java
    sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/RegisteredResourceComparator.java
    sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/RegisteredResourceImpl.java
    sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/tasks/BundleUpdateTask.java
    sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/MockBundleResource.java

Modified: sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/BundleTaskCreator.java
URL: http://svn.apache.org/viewvc/sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/BundleTaskCreator.java?rev=824840&r1=824839&r2=824840&view=diff
==============================================================================
--- sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/BundleTaskCreator.java (original)
+++ sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/BundleTaskCreator.java Tue Oct 13 16:49:33 2009
@@ -87,7 +87,7 @@
 			
 		} else {
 			final BundleInfo info = getBundleInfo(ctx, toActivate);
-			final Version newVersion = (Version)toActivate.getAttributes().get(Constants.BUNDLE_VERSION);
+			final Version newVersion = new Version((String)toActivate.getAttributes().get(Constants.BUNDLE_VERSION));
 			if(info == null) {
 			    // bundle is not installed yet: install and save digest to avoid
 			    // unnecessary updates

Modified: sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/ConfigurationPid.java
URL: http://svn.apache.org/viewvc/sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/ConfigurationPid.java?rev=824840&r1=824839&r2=824840&view=diff
==============================================================================
--- sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/ConfigurationPid.java (original)
+++ sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/ConfigurationPid.java Tue Oct 13 16:49:33 2009
@@ -18,13 +18,16 @@
  */
 package org.apache.sling.osgi.installer.impl;
 
+import java.io.Serializable;
+
 import org.apache.sling.osgi.installer.impl.tasks.ConfigInstallTask;
 
 /** Builds configration PIDs out of filenames, examples:
  *      o.a.s.foo.bar.cfg -> pid = o.a.s.foo.bar
  *      o.a.s.foo.bar-a.cfg -> pid = o.a.s.foo.bar, factory pid = a 
  */
-public class ConfigurationPid {
+public class ConfigurationPid implements Serializable {
+    private static final long serialVersionUID = 1L;
     private final String configPid;
     private final String factoryPid;
 

Modified: sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/OsgiInstallerThread.java
URL: http://svn.apache.org/viewvc/sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/OsgiInstallerThread.java?rev=824840&r1=824839&r2=824840&view=diff
==============================================================================
--- sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/OsgiInstallerThread.java (original)
+++ sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/OsgiInstallerThread.java Tue Oct 13 16:49:33 2009
@@ -18,6 +18,7 @@
  */
 package org.apache.sling.osgi.installer.impl;
 
+import java.io.File;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -25,7 +26,6 @@
 import java.util.HashSet;
 import java.util.LinkedList;
 import java.util.List;
-import java.util.Map;
 import java.util.Set;
 import java.util.SortedSet;
 import java.util.TreeSet;
@@ -58,8 +58,8 @@
     private boolean retriesScheduled;
     
     /** Group our RegisteredResource by OSGi entity */ 
-    private Map<String, SortedSet<RegisteredResource>>registeredResources = 
-        new HashMap<String, SortedSet<RegisteredResource>>();
+    private final HashMap<String, SortedSet<RegisteredResource>> registeredResources;
+    private final PersistentResourceList persistentList;
     
     private final BundleTaskCreator bundleTaskCreator = new BundleTaskCreator();
     private final ConfigTaskCreator configTaskCreator = new ConfigTaskCreator();
@@ -67,6 +67,9 @@
     OsgiInstallerThread(OsgiInstallerContext ctx) {
         setName(getClass().getSimpleName());
         this.ctx = ctx;
+        final File f = ctx.getBundleContext().getDataFile("RegisteredResourceList.ser");
+        persistentList = new PersistentResourceList(ctx,f);
+        registeredResources = persistentList.getData();
     }
 
     void deactivate() {
@@ -106,7 +109,12 @@
             	}
             	
             	retriesScheduled = false;
-                executeTasks();
+                if(executeTasks() > 0) {
+                    if(ctx.getLogService() != null) {
+                        ctx.getLogService().log(LogService.LOG_DEBUG, "Tasks have been executed, saving persistentList");
+                    }
+                    persistentList.save();
+                }
                 
                 // Some integration tests depend on this delay, make sure to
                 // rerun/adapt them if changing this value
@@ -329,17 +337,20 @@
         }
     }
     
-    private void executeTasks() throws Exception {
+    private int executeTasks() throws Exception {
+        int counter = 0;
         while(!tasks.isEmpty()) {
             OsgiInstallerTask t = null;
             synchronized (tasks) {
                 t = tasks.first();
             }
             t.execute(ctx);
+            counter++;
             synchronized (tasks) {
                 tasks.remove(t);
             }
         }
+        return counter;
     }
     
     private void cleanupInstallableResources() {

Added: sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/PersistentResourceList.java
URL: http://svn.apache.org/viewvc/sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/PersistentResourceList.java?rev=824840&view=auto
==============================================================================
--- sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/PersistentResourceList.java (added)
+++ sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/PersistentResourceList.java Tue Oct 13 16:49:33 2009
@@ -0,0 +1,78 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sling.osgi.installer.impl;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.util.HashMap;
+import java.util.SortedSet;
+
+import org.osgi.service.log.LogService;
+
+/** Persistent list of RegisteredResource, used by installer to
+ *  keep track of all registered resources
+ */
+class PersistentResourceList {
+    private final HashMap<String, SortedSet<RegisteredResource>> data;
+    private final File dataFile;
+    
+    @SuppressWarnings("unchecked")
+    PersistentResourceList(OsgiInstallerContext ctx, File dataFile) {
+        this.dataFile = dataFile;
+        
+        ObjectInputStream ois = null;
+        HashMap<String, SortedSet<RegisteredResource>> restoredData = null;
+        try {
+            ois = new ObjectInputStream(new FileInputStream(dataFile));
+            restoredData = (HashMap<String, SortedSet<RegisteredResource>>)ois.readObject();
+        } catch(Exception e) {
+            if(ctx.getLogService() != null) {
+                ctx.getLogService().log(LogService.LOG_INFO, 
+                        "Unable to restore data, starting with empty list (" + e.toString());
+            }
+        } finally {
+            if(ois != null) {
+                try {
+                    ois.close();
+                } catch(IOException ignore) {
+                    // ignore
+                }
+            }
+        }
+        
+        data = restoredData != null ? restoredData : new HashMap<String, SortedSet<RegisteredResource>>();
+    }
+    
+    HashMap<String, SortedSet<RegisteredResource>>  getData() {
+        return data;
+    }
+
+    void save() throws IOException {
+        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(dataFile));
+        try {
+            oos.writeObject(data);
+        } finally {
+            oos.close();
+        }
+    }
+}

Propchange: sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/PersistentResourceList.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/PersistentResourceList.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision Rev URL

Modified: sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/RegisteredResourceComparator.java
URL: http://svn.apache.org/viewvc/sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/RegisteredResourceComparator.java?rev=824840&r1=824839&r2=824840&view=diff
==============================================================================
--- sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/RegisteredResourceComparator.java (original)
+++ sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/RegisteredResourceComparator.java Tue Oct 13 16:49:33 2009
@@ -18,6 +18,7 @@
  */
 package org.apache.sling.osgi.installer.impl;
 
+import java.io.Serializable;
 import java.util.Comparator;
 
 import org.osgi.framework.Constants;
@@ -28,7 +29,9 @@
  * 	name, config PID, etc.) in sorted sets, and this comparator is used
  *  to sort the resources in the sets.
  */
-class RegisteredResourceComparator implements Comparator<RegisteredResource >{
+class RegisteredResourceComparator implements Comparator<RegisteredResource>, Serializable {
+
+    private static final long serialVersionUID = 1L;
 
     public int compare(RegisteredResource a, RegisteredResource b) {
     	final boolean aBundle = a.getResourceType() == RegisteredResource.ResourceType.BUNDLE;
@@ -59,8 +62,8 @@
         
         // Then by version
         if(result == 0) {
-            final Version va = (Version)a.getAttributes().get(Constants.BUNDLE_VERSION);
-            final Version vb = (Version)b.getAttributes().get(Constants.BUNDLE_VERSION);
+            final Version va = new Version((String)a.getAttributes().get(Constants.BUNDLE_VERSION));
+            final Version vb = new Version((String)b.getAttributes().get(Constants.BUNDLE_VERSION));
             isSnapshot = va!= null && va.toString().contains(OsgiInstallerImpl.MAVEN_SNAPSHOT_MARKER);
             if(va != null && vb != null) {
                 // higher version has more priority, must come first so invert comparison

Modified: sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/RegisteredResourceImpl.java
URL: http://svn.apache.org/viewvc/sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/RegisteredResourceImpl.java?rev=824840&r1=824839&r2=824840&view=diff
==============================================================================
--- sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/RegisteredResourceImpl.java (original)
+++ sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/RegisteredResourceImpl.java Tue Oct 13 16:49:33 2009
@@ -26,6 +26,7 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
+import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Dictionary;
@@ -43,14 +44,14 @@
 import org.apache.sling.osgi.installer.impl.propertyconverter.PropertyValue;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.Constants;
-import org.osgi.framework.Version;
 
 /** A resource that's been registered in the OSGi controller.
  * 	Data can be either an InputStream or a Dictionary, and we store
  *  it locally to avoid holding up to classes or data from our 
  *  clients, in case those disappear while we're installing stuff. 
  */
-public class RegisteredResourceImpl implements RegisteredResource { 
+public class RegisteredResourceImpl implements RegisteredResource, Serializable { 
+    private static final long serialVersionUID = 1L;
 	private final String url;
 	private final String urlScheme;
 	private final String digest;
@@ -303,7 +304,7 @@
     	
         if(m != null) {
             attributes.put(Constants.BUNDLE_SYMBOLICNAME, sn);
-            attributes.put(Constants.BUNDLE_VERSION, new Version(v));
+            attributes.put(Constants.BUNDLE_VERSION, v.toString());
         }
     }
     

Modified: sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/tasks/BundleUpdateTask.java
URL: http://svn.apache.org/viewvc/sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/tasks/BundleUpdateTask.java?rev=824840&r1=824839&r2=824840&view=diff
==============================================================================
--- sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/tasks/BundleUpdateTask.java (original)
+++ sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/tasks/BundleUpdateTask.java Tue Oct 13 16:49:33 2009
@@ -60,7 +60,7 @@
         boolean snapshot = false;
         if(b != null) {
         	final Version currentVersion = new Version((String)b.getHeaders().get(Constants.BUNDLE_VERSION));
-        	final Version newVersion = (Version)resource.getAttributes().get(Constants.BUNDLE_VERSION);
+        	final Version newVersion = new Version((String)resource.getAttributes().get(Constants.BUNDLE_VERSION));
         	snapshot = ctx.isSnapshot(newVersion);
         	if(currentVersion.equals(newVersion) && !snapshot) {
         		if(ctx.getLogService() != null) {

Modified: sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/MockBundleResource.java
URL: http://svn.apache.org/viewvc/sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/MockBundleResource.java?rev=824840&r1=824839&r2=824840&view=diff
==============================================================================
--- sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/MockBundleResource.java (original)
+++ sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/MockBundleResource.java Tue Oct 13 16:49:33 2009
@@ -20,18 +20,19 @@
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.Serializable;
 import java.util.Dictionary;
 import java.util.HashMap;
 import java.util.Map;
 
 import org.apache.sling.osgi.installer.InstallableResource;
 import org.osgi.framework.Constants;
-import org.osgi.framework.Version;
 
 /** Mock RegisteredResource that simulates a bundle */
-public class MockBundleResource implements RegisteredResource {
+public class MockBundleResource implements RegisteredResource, Serializable {
 
-	private final Map<String, Object> attributes = new HashMap<String, Object>();
+    private static final long serialVersionUID = 1L;
+    private final Map<String, Object> attributes = new HashMap<String, Object>();
 	private boolean installable = true;
 	private final String digest;
 	private final int priority;
@@ -44,7 +45,7 @@
     
 	MockBundleResource(String symbolicName, String version, int priority) {
 		attributes.put(Constants.BUNDLE_SYMBOLICNAME, symbolicName);
-		attributes.put(Constants.BUNDLE_VERSION, new Version(version));
+		attributes.put(Constants.BUNDLE_VERSION, version);
 		digest = symbolicName + "." + version;
 		this.priority = priority;
 		serialNumber = getNextSerialNumber();
@@ -52,7 +53,7 @@
 	
     MockBundleResource(String symbolicName, String version, int priority, String digest) {
         attributes.put(Constants.BUNDLE_SYMBOLICNAME, symbolicName);
-        attributes.put(Constants.BUNDLE_VERSION, new Version(version));
+        attributes.put(Constants.BUNDLE_VERSION, version);
         this.digest = digest;
         this.priority = priority;
         serialNumber = getNextSerialNumber();

Added: sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/PersistentResourceListTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/PersistentResourceListTest.java?rev=824840&view=auto
==============================================================================
--- sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/PersistentResourceListTest.java (added)
+++ sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/PersistentResourceListTest.java Tue Oct 13 16:49:33 2009
@@ -0,0 +1,121 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sling.osgi.installer.impl;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.ObjectOutputStream;
+import java.util.Iterator;
+import java.util.SortedSet;
+import java.util.TreeSet;
+
+import org.junit.Test;
+import org.osgi.framework.Constants;
+import org.osgi.framework.Version;
+
+/** Test the PersistentResourceList */
+public class PersistentResourceListTest {
+    private final static int TEST_SCALE = 5;
+    private final static String FAKE = "fakebundle.";
+    
+    @Test
+    public void testFileNotFound() {
+        File f = new File("NONEXISTENT");
+        PersistentResourceList p = new PersistentResourceList(new MockOsgiInstallerContext(), f);
+        assertNotNull(p.getData());
+    }
+    
+    @Test
+    public void testBadDataFile() throws IOException {
+        File f  = File.createTempFile(getClass().getSimpleName(), ".ser");
+        f.deleteOnExit();
+        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(f));
+        try {
+            oos.writeObject("Some data that's not what we expect");
+        } finally {
+            oos.close();
+        }
+        PersistentResourceList p = new PersistentResourceList(new MockOsgiInstallerContext(), f);
+        assertNotNull(p.getData());
+        assertEquals("Constructor must fail gracefully with invalid data file", 0, p.getData().size());
+    }
+    
+    @Test
+    public void testTestData() {
+        File f = new File("NONEXISTENT");
+        PersistentResourceList p = new PersistentResourceList(new MockOsgiInstallerContext(), f);
+        assertNotNull(p.getData());
+        addTestData(p);
+        assertTestData(p);
+    }
+    
+    @Test
+    public void testSaveAndRetrieve() throws IOException {
+        File f  = File.createTempFile(getClass().getSimpleName(), ".ser");
+        f.deleteOnExit();
+        {
+            PersistentResourceList p = new PersistentResourceList(new MockOsgiInstallerContext(), f);
+            addTestData(p);
+            p.save();
+        }
+        {
+            PersistentResourceList p = new PersistentResourceList(new MockOsgiInstallerContext(), f);
+            assertTestData(p);
+        }
+    }
+    
+    private void addTestData(PersistentResourceList p) {
+        for(int i = 0; i < TEST_SCALE; i++) {
+            final String symbolicName = FAKE + i;
+            TreeSet<RegisteredResource> s = new TreeSet<RegisteredResource>(new RegisteredResourceComparator());
+            for(int j= TEST_SCALE - 2; j >= 1; j--) {
+                s.add(new MockBundleResource(symbolicName, getFakeVersion(i, j)));
+            }
+            p.getData().put(symbolicName, s);
+        }
+    }
+    
+    private void assertTestData(PersistentResourceList p) {
+        for(int i = 0; i < TEST_SCALE; i++) {
+            final String symbolicName = FAKE + i;
+            SortedSet<RegisteredResource> s = p.getData().get(symbolicName);
+            assertNotNull(symbolicName + " must be found", s);
+            Iterator<RegisteredResource> it = s.iterator();
+            for(int j= TEST_SCALE - 2; j >= 1; j--) {
+                RegisteredResource r = it.next();
+                assertNotNull("RegisteredResource " + j + " must be found");
+                String sn = (String)r.getAttributes().get(Constants.BUNDLE_SYMBOLICNAME);
+                assertEquals("RegisteredResource " + j + " symbolic name must match", symbolicName, sn);
+                Version v = new Version((String)r.getAttributes().get(Constants.BUNDLE_VERSION));
+                assertEquals("RegisteredResource " + j + " version must match", getFakeVersion(i, j), v.toString());
+            }
+            s.add(new MockBundleResource(symbolicName, "2." + i));
+            s.add(new MockBundleResource(symbolicName, "3." + i));
+            p.getData().put(symbolicName, s);
+        }
+    }
+    
+    private String getFakeVersion(int i, int j) {
+        return j + "." + i + ".0";
+    }
+}

Propchange: sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/PersistentResourceListTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/PersistentResourceListTest.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision Rev URL

Added: sling/trunk/installer/osgi/it/src/test/java/org/apache/sling/osgi/installer/it/RemovedResourceDetectionTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/installer/osgi/it/src/test/java/org/apache/sling/osgi/installer/it/RemovedResourceDetectionTest.java?rev=824840&view=auto
==============================================================================
--- sling/trunk/installer/osgi/it/src/test/java/org/apache/sling/osgi/installer/it/RemovedResourceDetectionTest.java (added)
+++ sling/trunk/installer/osgi/it/src/test/java/org/apache/sling/osgi/installer/it/RemovedResourceDetectionTest.java Tue Oct 13 16:49:33 2009
@@ -0,0 +1,86 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.sling.osgi.installer.it;
+
+import static org.junit.Assert.assertNull;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.sling.osgi.installer.InstallableResource;
+import org.apache.sling.osgi.installer.OsgiInstaller;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.ops4j.pax.exam.Option;
+import org.ops4j.pax.exam.junit.JUnit4TestRunner;
+import org.osgi.framework.Bundle;
+
+/** Verify that the removal of resources is detected even if
+ *  the OsgiController was stopped when resource was removed.
+ */
+@RunWith(JUnit4TestRunner.class)
+public class RemovedResourceDetectionTest extends OsgiInstallerTestBase {
+    
+    @org.ops4j.pax.exam.junit.Configuration
+    public static Option[] configuration() {
+        return defaultConfiguration();
+    }
+    
+    @Before
+    public void setUp() {
+        setupInstaller();
+    }
+    
+    @After
+    public void tearDown() {
+        super.tearDown();
+    }
+    
+    @Test
+    public void testRemoveResourceAndRestart() throws Exception {
+        
+        final String symbolicNameA = "osgi-installer-testbundle";
+        final String symbolicNameB = "osgi-installer-testB";
+        
+        // Install two bundles and verify
+        assertNull(symbolicNameA + " must be absent before installing", findBundle(symbolicNameA));
+        resetCounters();
+        installer.addResource(getInstallableResource(
+                getTestBundle(BUNDLE_BASE_NAME + "-testbundle-1.1.jar")));
+        waitForInstallerAction(OsgiInstaller.WORKER_THREAD_BECOMES_IDLE_COUNTER, 1);
+        assertBundle("After initial install", symbolicNameA, "1.1", Bundle.ACTIVE);
+        
+        assertNull(symbolicNameB + " must be absent before installing", findBundle(symbolicNameB));
+        resetCounters();
+        installer.addResource(getInstallableResource(
+                getTestBundle(BUNDLE_BASE_NAME + "-testB-1.0.jar")));
+        waitForInstallerAction(OsgiInstaller.WORKER_THREAD_BECOMES_IDLE_COUNTER, 1);
+        assertBundle("After initial install", symbolicNameB, "1.0", Bundle.ACTIVE);
+        
+        // Restart installer, register only second bundle and verify that first one is gone
+        restartInstaller();
+        resetCounters();
+        final List<InstallableResource> data = new ArrayList<InstallableResource>();
+        data.add(getInstallableResource(getTestBundle(BUNDLE_BASE_NAME + "-testB-1.0.jar")));
+        installer.registerResources(data, URL_SCHEME);
+        waitForInstallerAction(OsgiInstaller.WORKER_THREAD_BECOMES_IDLE_COUNTER, 1);
+        assertBundle("After installer restart", symbolicNameB, "1.0", Bundle.ACTIVE);
+        assertNull("Bundle not in second list should be removed", findBundle(symbolicNameA));
+    }
+}
\ No newline at end of file

Propchange: sling/trunk/installer/osgi/it/src/test/java/org/apache/sling/osgi/installer/it/RemovedResourceDetectionTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: sling/trunk/installer/osgi/it/src/test/java/org/apache/sling/osgi/installer/it/RemovedResourceDetectionTest.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision Rev URL