Author: cziegeler
Date: Sat Jan 22 15:57:26 2011
New Revision: 1062180
URL: http://svn.apache.org/viewvc?rev=1062180&view=rev
Log:
SLING-1949 : Improve removal of bundles if the bundle is installed more than
once
Modified:
sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/Activator.java
sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/tasks/BundleRemoveTask.java
sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/tasks/BundleTaskCreator.java
sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/tasks/BundleUpdateTask.java
sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/tasks/SystemBundleUpdateTask.java
sling/trunk/installer/core/src/test/java/org/apache/sling/installer/core/impl/tasks/MockBundleTaskCreator.java
Modified:
sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/Activator.java
URL:
http://svn.apache.org/viewvc/sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/Activator.java?rev=1062180&r1=1062179&r2=1062180&view=diff
==============================================================================
---
sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/Activator.java
(original)
+++
sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/Activator.java
Sat Jan 22 15:57:26 2011
@@ -19,6 +19,7 @@
package org.apache.sling.installer.core.impl;
import java.util.ArrayList;
+import java.util.Dictionary;
import java.util.Hashtable;
import java.util.List;
@@ -122,9 +123,10 @@ public class Activator implements Bundle
for(final Class<?> serviceClass : serviceClasses) {
final InternalService service = (InternalService)
serviceClass.newInstance();
- final Hashtable<String, String> props = new Hashtable<String,
String>();
+ final Dictionary<String, Object> props = new Hashtable<String,
Object>();
props.put(Constants.SERVICE_DESCRIPTION, service.getDescription());
props.put(Constants.SERVICE_VENDOR, VENDOR);
+ props.put(Constants.SERVICE_RANKING, new Integer(-100));
final String[] serviceInterfaces;
if ( service instanceof ResourceTransformer && service instanceof
InstallTaskFactory ) {
Modified:
sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/tasks/BundleRemoveTask.java
URL:
http://svn.apache.org/viewvc/sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/tasks/BundleRemoveTask.java?rev=1062180&r1=1062179&r2=1062180&view=diff
==============================================================================
---
sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/tasks/BundleRemoveTask.java
(original)
+++
sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/tasks/BundleRemoveTask.java
Sat Jan 22 15:57:26 2011
@@ -47,7 +47,8 @@ public class BundleRemoveTask extends Ab
*/
public void execute(InstallationContext ctx) {
final String symbolicName =
(String)getResource().getAttribute(Constants.BUNDLE_SYMBOLICNAME);
- final Bundle b = this.creator.getMatchingBundle(symbolicName);
+ final String version =
(String)getResource().getAttribute(Constants.BUNDLE_VERSION);
+ final Bundle b = this.creator.getMatchingBundle(symbolicName, version);
if (b == null) {
// nothing to do, so just stop
this.setFinishedState(ResourceState.IGNORED);
Modified:
sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/tasks/BundleTaskCreator.java
URL:
http://svn.apache.org/viewvc/sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/tasks/BundleTaskCreator.java?rev=1062180&r1=1062179&r2=1062180&view=diff
==============================================================================
---
sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/tasks/BundleTaskCreator.java
(original)
+++
sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/tasks/BundleTaskCreator.java
Sat Jan 22 15:57:26 2011
@@ -18,6 +18,9 @@
*/
package org.apache.sling.installer.core.impl.tasks;
+import java.util.ArrayList;
+import java.util.List;
+
import org.apache.sling.installer.api.InstallableResource;
import org.apache.sling.installer.api.tasks.InstallTask;
import org.apache.sling.installer.api.tasks.InstallTaskFactory;
@@ -156,22 +159,26 @@ public class BundleTaskCreator implement
}
}
final String symbolicName =
(String)toActivate.getAttribute(Constants.BUNDLE_SYMBOLICNAME);
- final BundleInfo info = this.getBundleInfo(symbolicName);
// Uninstall
final InstallTask result;
if (toActivate.getState() == ResourceState.UNINSTALL) {
+ // find the info with the exact version
+ final BundleInfo info = this.getBundleInfo(symbolicName,
+ (String)toActivate.getAttribute(Constants.BUNDLE_VERSION));
// Remove corresponding bundle if present and if we
installed it
- if (info != null
- && info.version.equals(new
Version((String)toActivate.getAttribute(Constants.BUNDLE_VERSION))) ) {
+ if ( info != null ) {
result = new BundleRemoveTask(resourceList, this);
} else {
- logger.info("Bundle {} was not installed by this module,
not removed", symbolicName);
+ logger.debug("Bundle {}:{} is not installed anymore -
nothing to remove.", symbolicName,
+ toActivate.getAttribute(Constants.BUNDLE_VERSION));
result = new ChangeStateTask(resourceList,
ResourceState.IGNORED);
}
// Install
} else {
+ // for install and update, we want the bundle with the
highest version
+ final BundleInfo info = this.getBundleInfo(symbolicName, null);
// check if we should start the bundle as we installed it
in the previous run
if (info == null) {
// bundle is not installed yet: install
@@ -210,8 +217,8 @@ public class BundleTaskCreator implement
return result;
}
- protected BundleInfo getBundleInfo(final String symbolicName) {
- final Bundle b = this.getMatchingBundle(symbolicName);
+ protected BundleInfo getBundleInfo(final String symbolicName, final
String version) {
+ final Bundle b = this.getMatchingBundle(symbolicName, version);
if (b == null) {
return null;
}
@@ -221,20 +228,45 @@ public class BundleTaskCreator implement
/**
* Finds the bundle with given symbolic name in our bundle context.
*/
- public Bundle getMatchingBundle(String bundleSymbolicName) {
+ public Bundle getMatchingBundle(final String bundleSymbolicName, final
String version) {
+ Bundle match = null;
if (bundleSymbolicName != null) {
// check if this is the system bundle
if (
Constants.SYSTEM_BUNDLE_SYMBOLICNAME.equals(bundleSymbolicName) ) {
return bundleContext.getBundle(0);
}
+ final List<Bundle> matchingBundles = new ArrayList<Bundle>();
final Bundle[] bundles = bundleContext.getBundles();
for (Bundle bundle : bundles) {
if (bundleSymbolicName.equals(bundle.getSymbolicName())) {
- return bundle;
+ matchingBundles.add(bundle);
+ }
+ }
+ if ( matchingBundles.size() > 0 ) {
+ final Version searchVersion = (version == null ? null : new
Version(version));
+ if ( searchVersion == null ||
searchVersion.compareTo(getBundleVersion(matchingBundles.get(0))) == 0 ) {
+ match = matchingBundles.get(0);
+ }
+ for(int i=1; i<matchingBundles.size(); i++) {
+ final Bundle current = matchingBundles.get(i);
+ if ( searchVersion == null ) {
+ if (
getBundleVersion(match).compareTo(getBundleVersion(current)) < 0 ) {
+ match = current;
+ }
+ } else {
+ if (
searchVersion.compareTo(getBundleVersion(current)) == 0 ) {
+ match = current;
+ break;
+ }
+ }
}
}
}
- return null;
+ return match;
+ }
+
+ private Version getBundleVersion(final Bundle b) {
+ return new
Version((String)b.getHeaders().get(Constants.BUNDLE_VERSION));
}
/**
Modified:
sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/tasks/BundleUpdateTask.java
URL:
http://svn.apache.org/viewvc/sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/tasks/BundleUpdateTask.java?rev=1062180&r1=1062179&r2=1062180&view=diff
==============================================================================
---
sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/tasks/BundleUpdateTask.java
(original)
+++
sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/tasks/BundleUpdateTask.java
Sat Jan 22 15:57:26 2011
@@ -49,7 +49,7 @@ public class BundleUpdateTask extends Ab
*/
public void execute(InstallationContext ctx) {
final String symbolicName =
(String)getResource().getAttribute(Constants.BUNDLE_SYMBOLICNAME);
- final Bundle b = this.creator.getMatchingBundle(symbolicName);
+ final Bundle b = this.creator.getMatchingBundle(symbolicName, null);
if (b == null) {
this.getLogger().debug("Bundle to update ({}) not found",
symbolicName);
this.setFinishedState(ResourceState.IGNORED);
Modified:
sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/tasks/SystemBundleUpdateTask.java
URL:
http://svn.apache.org/viewvc/sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/tasks/SystemBundleUpdateTask.java?rev=1062180&r1=1062179&r2=1062180&view=diff
==============================================================================
---
sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/tasks/SystemBundleUpdateTask.java
(original)
+++
sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/tasks/SystemBundleUpdateTask.java
Sat Jan 22 15:57:26 2011
@@ -51,7 +51,7 @@ public class SystemBundleUpdateTask exte
return;
}
final String symbolicName =
(String)getResource().getAttribute(Constants.BUNDLE_SYMBOLICNAME);
- final Bundle b = this.creator.getMatchingBundle(symbolicName);
+ final Bundle b = this.creator.getMatchingBundle(symbolicName, null);
if (b == null) {
throw new IllegalStateException("Bundle to update (" +
symbolicName + ") not found");
}
Modified:
sling/trunk/installer/core/src/test/java/org/apache/sling/installer/core/impl/tasks/MockBundleTaskCreator.java
URL:
http://svn.apache.org/viewvc/sling/trunk/installer/core/src/test/java/org/apache/sling/installer/core/impl/tasks/MockBundleTaskCreator.java?rev=1062180&r1=1062179&r2=1062180&view=diff
==============================================================================
---
sling/trunk/installer/core/src/test/java/org/apache/sling/installer/core/impl/tasks/MockBundleTaskCreator.java
(original)
+++
sling/trunk/installer/core/src/test/java/org/apache/sling/installer/core/impl/tasks/MockBundleTaskCreator.java
Sat Jan 22 15:57:26 2011
@@ -39,7 +39,11 @@ class MockBundleTaskCreator extends Bund
}
@Override
- protected BundleInfo getBundleInfo(String symbolicName) {
- return fakeBundleInfo.get(symbolicName);
+ protected BundleInfo getBundleInfo(String symbolicName, String version) {
+ BundleInfo info = fakeBundleInfo.get(symbolicName);
+ if ( version == null || info.version.compareTo(new Version(version))
== 0 ) {
+ return info;
+ }
+ return null;
}
}