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


Reply via email to