You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by pa...@apache.org on 2017/02/24 14:43:54 UTC

svn commit: r1784280 - in /sling/trunk/installer: core/src/main/java/org/apache/sling/installer/core/impl/ it/ it/src/test/java/org/apache/sling/installer/it/

Author: pauls
Date: Fri Feb 24 14:43:53 2017
New Revision: 1784280

URL: http://svn.apache.org/viewvc?rev=1784280&view=rev
Log:
Remove resources added by a previous transform when an update transform results in a different entityid (SLING-6392).

Modified:
    sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/PersistentResourceList.java
    sling/trunk/installer/it/pom.xml
    sling/trunk/installer/it/src/test/java/org/apache/sling/installer/it/BundleInstallUpgradeDowngradeTest.java
    sling/trunk/installer/it/src/test/java/org/apache/sling/installer/it/MockInstallableResource.java
    sling/trunk/installer/it/src/test/java/org/apache/sling/installer/it/OsgiInstallerTestBase.java

Modified: sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/PersistentResourceList.java
URL: http://svn.apache.org/viewvc/sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/PersistentResourceList.java?rev=1784280&r1=1784279&r2=1784280&view=diff
==============================================================================
--- sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/PersistentResourceList.java (original)
+++ sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/PersistentResourceList.java Fri Feb 24 14:43:53 2017
@@ -29,10 +29,12 @@ import java.io.ObjectOutputStream;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Hashtable;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import org.apache.sling.installer.api.InstallableResource;
 import org.apache.sling.installer.api.event.InstallationListener;
@@ -308,6 +310,7 @@ public class PersistentResourceList {
         // remove resource from unknown list
         this.untransformedResources.remove(resource);
         try {
+            Set<String> entityIds = new HashSet<String>();
             for(int i=0; i<result.length; i++) {
                 // check the result
                 final TransformationResult tr = result[i];
@@ -322,6 +325,14 @@ public class PersistentResourceList {
                 }
                 final RegisteredResourceImpl clone =  (RegisteredResourceImpl)((RegisteredResourceImpl)resource).clone(result[i]);
                 this.checkInstallable(clone);
+                entityIds.add(clone.getEntityId());
+            }
+            for (EntityResourceList group : this.data.values())
+            {
+                if (!entityIds.contains(group.getResourceId()))
+                {
+                    group.remove(resource.getURL());
+                }
             }
         } catch (final IOException ioe) {
             logger.warn("Ignoring resource. Error during processing of " + resource, ioe);

Modified: sling/trunk/installer/it/pom.xml
URL: http://svn.apache.org/viewvc/sling/trunk/installer/it/pom.xml?rev=1784280&r1=1784279&r2=1784280&view=diff
==============================================================================
--- sling/trunk/installer/it/pom.xml (original)
+++ sling/trunk/installer/it/pom.xml Fri Feb 24 14:43:53 2017
@@ -34,7 +34,7 @@
 
     <properties>
         <exam.version>3.0.3</exam.version>
-        <url.version>2.4.7</url.version>
+        <url.version>2.5.2</url.version>
         <pax.exam.log.level>INFO</pax.exam.log.level>
         <pax.vm.options>-Xmx256M -XX:MaxPermSize=256m</pax.vm.options>
         <installer.configuration.version>1.1.3-SNAPSHOT</installer.configuration.version>

Modified: sling/trunk/installer/it/src/test/java/org/apache/sling/installer/it/BundleInstallUpgradeDowngradeTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/installer/it/src/test/java/org/apache/sling/installer/it/BundleInstallUpgradeDowngradeTest.java?rev=1784280&r1=1784279&r2=1784280&view=diff
==============================================================================
--- sling/trunk/installer/it/src/test/java/org/apache/sling/installer/it/BundleInstallUpgradeDowngradeTest.java (original)
+++ sling/trunk/installer/it/src/test/java/org/apache/sling/installer/it/BundleInstallUpgradeDowngradeTest.java Fri Feb 24 14:43:53 2017
@@ -19,6 +19,8 @@ package org.apache.sling.installer.it;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNull;
 
+import org.apache.sling.installer.api.InstallableResource;
+import org.apache.sling.installer.it.OsgiInstallerTestBase.BundleEvent;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -207,4 +209,44 @@ public class BundleInstallUpgradeDowngra
         }
 
     }
+
+    /**
+     * This test class assures that whenever a new bundle is 
+     * provided with the same url as an already installed bundle,
+     * the already installed bundle is uninstalled and the new one installed.
+     * @see <a href="https://issues.apache.org/jira/browse/SLING-6392">SLING-6392</a>
+     */
+    @Test
+    public void testReplaceBundleWithSameUrlButDifferentSymbolicName() throws Exception {
+        final String symbolicName = "osgi-installer-testbundle";
+        final String symbolicName2 = "osgi-installer-testA";
+        final String installableResourceId = "stable-id";
+        
+        assertNull("Test bundle must not be present before test", findBundle(symbolicName));
+        assertNull("Test A bundle must not be present before test", findBundle(symbolicName2));
+        {
+            //assertNull("Test bundle must be absent before installing", findBundle(symbolicName));
+            final Object listener = this.startObservingBundleEvents();
+            installer.updateResources(URL_SCHEME, getInstallableResource(
+                    getTestBundle(BUNDLE_BASE_NAME + "-testbundle-1.0.jar"), installableResourceId, "1", InstallableResource.DEFAULT_PRIORITY), null);
+            this.waitForBundleEvents(symbolicName + " must be installed", listener,
+                    new BundleEvent(symbolicName, "1.0", org.osgi.framework.BundleEvent.INSTALLED),
+                    new BundleEvent(symbolicName, "1.0", org.osgi.framework.BundleEvent.STARTED));
+            assertBundle("After installing", symbolicName, "1.0", Bundle.ACTIVE);
+        }
+
+        // now modify the bundle (having the same url but a different symbolic name and different digest)
+        {
+            final Object listener = this.startObservingBundleEvents();
+            installer.updateResources(URL_SCHEME, getInstallableResource(
+                    getTestBundle(BUNDLE_BASE_NAME + "-testA-1.0.jar"), installableResourceId, "2", InstallableResource.DEFAULT_PRIORITY), null);
+            this.waitForBundleEvents(symbolicName2 + " must be installed and " + symbolicName + " uninstalled", listener,
+                    new BundleEvent(symbolicName, "1.0", org.osgi.framework.BundleEvent.STOPPED),
+                    new BundleEvent(symbolicName, "1.0", org.osgi.framework.BundleEvent.UNINSTALLED),
+                    new BundleEvent(symbolicName2, "1.0", org.osgi.framework.BundleEvent.INSTALLED),
+                    new BundleEvent(symbolicName2, "1.0", org.osgi.framework.BundleEvent.STARTED));
+            assertBundle("After installing a different bundle with same id " + installableResourceId, symbolicName2, "1.0", Bundle.ACTIVE);
+            assertNull("Test bundle must not be present after removing it", findBundle(symbolicName));
+        }
+    }
 }
\ No newline at end of file

Modified: sling/trunk/installer/it/src/test/java/org/apache/sling/installer/it/MockInstallableResource.java
URL: http://svn.apache.org/viewvc/sling/trunk/installer/it/src/test/java/org/apache/sling/installer/it/MockInstallableResource.java?rev=1784280&r1=1784279&r2=1784280&view=diff
==============================================================================
--- sling/trunk/installer/it/src/test/java/org/apache/sling/installer/it/MockInstallableResource.java (original)
+++ sling/trunk/installer/it/src/test/java/org/apache/sling/installer/it/MockInstallableResource.java Fri Feb 24 14:43:53 2017
@@ -45,8 +45,8 @@ public class MockInstallableResource ext
                 InstallableResource.TYPE_BUNDLE, null);
     }
 
-    public MockInstallableResource(String uri, InputStream is, String digest, String type, Integer priority) {
-        super(uri, is,
+    public MockInstallableResource(String id, InputStream is, String digest, String type, Integer priority) {
+        super(id, is,
                 null, digest,
                 type != null ? type : InstallableResource.TYPE_BUNDLE, priority);
     }

Modified: sling/trunk/installer/it/src/test/java/org/apache/sling/installer/it/OsgiInstallerTestBase.java
URL: http://svn.apache.org/viewvc/sling/trunk/installer/it/src/test/java/org/apache/sling/installer/it/OsgiInstallerTestBase.java?rev=1784280&r1=1784279&r2=1784280&view=diff
==============================================================================
--- sling/trunk/installer/it/src/test/java/org/apache/sling/installer/it/OsgiInstallerTestBase.java (original)
+++ sling/trunk/installer/it/src/test/java/org/apache/sling/installer/it/OsgiInstallerTestBase.java Fri Feb 24 14:43:53 2017
@@ -408,14 +408,17 @@ public class OsgiInstallerTestBase imple
     }
 
     protected InstallableResource[] getInstallableResource(File testBundle, String digest, int priority) throws IOException {
-        final String url = testBundle.getAbsolutePath();
+        return getInstallableResource(testBundle, testBundle.getAbsolutePath(), digest, priority);
+    }
+
+    protected InstallableResource[] getInstallableResource(File testBundle, String id, String digest, int priority) throws IOException {
         if (digest == null) {
             digest = String.valueOf(testBundle.lastModified());
         }
-        final InstallableResource result = new MockInstallableResource(url, new FileInputStream(testBundle), digest, null, priority);
+        final InstallableResource result = new MockInstallableResource(id, new FileInputStream(testBundle), digest, null, priority);
         return new InstallableResource[] {result};
     }
-
+    
     protected InstallableResource[] getInstallableResource(String configPid, Dictionary<String, Object> data) {
         return getInstallableResource(configPid, copy(data), InstallableResource.DEFAULT_PRIORITY);
     }