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); }