Author: cziegeler
Date: Tue Aug 24 12:47:04 2010
New Revision: 988515

URL: http://svn.apache.org/viewvc?rev=988515&view=rev
Log:
SLING-1663 : OSGi Install should recognize system bundle updates

Added:
    
sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/tasks/SystemBundleUpdateTask.java
   (with props)
Modified:
    
sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/OsgiInstallerImpl.java
    
sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/tasks/BundleTaskCreator.java
    
sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/tasks/BundleUpdateTask.java

Modified: 
sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/OsgiInstallerImpl.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/OsgiInstallerImpl.java?rev=988515&r1=988514&r2=988515&view=diff
==============================================================================
--- 
sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/OsgiInstallerImpl.java
 (original)
+++ 
sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/OsgiInstallerImpl.java
 Tue Aug 24 12:47:04 2010
@@ -117,7 +117,7 @@ public class OsgiInstallerImpl
                }
 
                retriesScheduled = false;
-                if(executeTasks(tasks) > 0) {
+                if (executeTasks(tasks) > 0) {
                     Logger.logDebug("Tasks have been executed, saving 
persistentList");
                     persistentList.save();
                 }
@@ -129,7 +129,7 @@ public class OsgiInstallerImpl
             } catch(Exception e) {
                 Logger.logWarn(e.toString(), e);
                 try {
-                    Thread.sleep(1000);
+                    Thread.sleep(1500);
                 } catch(InterruptedException ignored) {
                 }
             }
@@ -338,7 +338,7 @@ public class OsgiInstallerImpl
             }
         };
         int counter = 0;
-        while(!tasks.isEmpty()) {
+        while (!tasks.isEmpty()) {
             OsgiInstallerTask t = null;
             synchronized (tasks) {
                 t = tasks.first();

Modified: 
sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/tasks/BundleTaskCreator.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/tasks/BundleTaskCreator.java?rev=988515&r1=988514&r2=988515&view=diff
==============================================================================
--- 
sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/tasks/BundleTaskCreator.java
 (original)
+++ 
sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/tasks/BundleTaskCreator.java
 Tue Aug 24 12:47:04 2010
@@ -153,7 +153,7 @@ public class BundleTaskCreator {
                if (toActivate == null) {
                    // None of our resources are installable, remove 
corresponding bundle if present
                    // and if we installed it
-                   if (getBundleInfo(resources.first()) != null) {
+                   if (firstResource != null && getBundleInfo(firstResource) 
!= null) {
                        if (this.getInstalledBundleVersion(symbolicName) == 
null) {
                            Logger.logInfo("Bundle " + symbolicName
                                 + " was not installed by this module, not 
removed");
@@ -165,8 +165,6 @@ public class BundleTaskCreator {
 
                } else {
                        final BundleInfo info = getBundleInfo(toActivate);
-                       final Version newVersion = new 
Version((String)toActivate.getAttributes().get(Constants.BUNDLE_VERSION));
-               RegisteredResource toUpdate = null;
                        if (info == null) {
                            // bundle is not installed yet: install and save 
digest to avoid
                            // unnecessary updates
@@ -174,15 +172,17 @@ public class BundleTaskCreator {
                                        this));
                                digestToSave = toActivate.getDigest();
                        } else {
+                   RegisteredResource toUpdate = null;
+                   final Version newVersion = new 
Version((String)toActivate.getAttributes().get(Constants.BUNDLE_VERSION));
                            final int compare = 
info.version.compareTo(newVersion);
-                if(compare < 0) {
+                if (compare < 0) {
                     // installed version is lower -> update
                     toUpdate = toActivate;
-                } else if(compare > 0) {
+                } else if (compare > 0) {
                        // installed version is higher -> downgrade only if
                     // we installed that version
                     final String installedVersion = 
this.getInstalledBundleVersion(info.symbolicName);
-                    if(info.version.toString().equals(installedVersion)) {
+                    if (info.version.toString().equals(installedVersion)) {
                         toUpdate = toActivate;
                         Logger.logInfo("Bundle " + info.symbolicName + " " + 
installedVersion
                                     + " was installed by this module, 
downgrading to " + newVersion);
@@ -190,29 +190,33 @@ public class BundleTaskCreator {
                         Logger.logInfo("Bundle " + info.symbolicName + " " + 
installedVersion
                                     + " was not installed by this module, not 
downgraded");
                     }
-                           } else if(compare == 0 && 
this.isSnapshot(newVersion)){
+                           } else if (compare == 0 && 
this.isSnapshot(newVersion)){
                                // installed, same version but SNAPSHOT
                     toUpdate = toActivate;
                            }
+                // Save the digest of installed and updated resources, keyed by
+                // bundle symbolic name, to avoid unnecessary updates
+                if (toUpdate != null) {
+                    final String previousDigest = digests.get(symbolicName);
+                    if(toUpdate.getDigest().equals(previousDigest)) {
+                        Logger.logDebug("Ignoring update of " + toUpdate + ", 
digest didn't change");
+                        digestToSave = previousDigest;
+                    } else {
+                        Logger.logDebug("Scheduling update of " + toUpdate + 
", digest has changed");
+                        if ( 
Constants.SYSTEM_BUNDLE_SYMBOLICNAME.equals(symbolicName) ) {
+                            tasks.add(new SystemBundleUpdateTask(toUpdate, 
this));
+                        } else {
+                            tasks.add(new BundleUpdateTask(toUpdate,
+                                this));
+                        }
+                        digestToSave = toUpdate.getDigest();
+                    }
+                }
                        }
 
-                       // Save the digest of installed and updated resources, 
keyed by
-                       // bundle symbolic name, to avoid unnecessary updates
-                       if (toUpdate != null) {
-                           final String previousDigest = 
digests.get(symbolicName);
-                           if(toUpdate.getDigest().equals(previousDigest)) {
-                               Logger.logDebug("Ignoring update of " + 
toUpdate + ", digest didn't change");
-                    digestToSave = previousDigest;
-                           } else {
-                               Logger.logDebug("Scheduling update of " + 
toUpdate + ", digest has changed");
-                               tasks.add(new BundleUpdateTask(toUpdate,
-                                       this));
-                               digestToSave = toUpdate.getDigest();
-                           }
-                       }
 
-                       if(digestToSave == null) {
-                           if(symbolicName != null) {
+                       if (digestToSave == null) {
+                           if (symbolicName != null) {
                                digests.remove(symbolicName);
                            }
                        } else {
@@ -258,7 +262,11 @@ public class BundleTaskCreator {
      */
     public Bundle getMatchingBundle(String bundleSymbolicName) {
         if (bundleSymbolicName != null) {
-            Bundle[] bundles = bundleContext.getBundles();
+            // check if this is the system bundle
+            if ( 
Constants.SYSTEM_BUNDLE_SYMBOLICNAME.equals(bundleSymbolicName) ) {
+                return bundleContext.getBundle(0);
+            }
+            final Bundle[] bundles = bundleContext.getBundles();
             for (Bundle bundle : bundles) {
                 if (bundleSymbolicName.equals(bundle.getSymbolicName())) {
                     return bundle;

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=988515&r1=988514&r2=988515&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 Aug 24 12:47:04 2010
@@ -18,6 +18,7 @@
  */
 package org.apache.sling.osgi.installer.impl.tasks;
 
+import java.io.IOException;
 import java.io.InputStream;
 
 import org.apache.sling.osgi.installer.impl.Logger;
@@ -60,16 +61,27 @@ public class BundleUpdateTask extends Os
     public void execute(OsgiInstallerContext ctx) {
         final String symbolicName = 
(String)resource.getAttributes().get(Constants.BUNDLE_SYMBOLICNAME);
         final Bundle b = this.creator.getMatchingBundle(symbolicName);
-        if(b == null) {
+        if (b == null) {
             throw new IllegalStateException("Bundle to update (" + 
symbolicName + ") not found");
         }
+        final Version newVersion = new 
Version((String)resource.getAttributes().get(Constants.BUNDLE_VERSION));
 
+        // check for system bundle update
+        if ( Constants.SYSTEM_BUNDLE_SYMBOLICNAME.equals(symbolicName) ) {
+            logExecution();
+            try {
+                this.creator.saveInstalledBundleInfo(b.getSymbolicName(), 
resource.getDigest(), newVersion.toString());
+            } catch (final IOException e) {
+                Logger.logWarn("Removing failing tasks - unable to retry: " + 
this, e);
+                return;
+            }
+        }
         // Do not update if same version, unless snapshot
         boolean snapshot = false;
        final Version currentVersion = new 
Version((String)b.getHeaders().get(Constants.BUNDLE_VERSION));
-       final Version newVersion = new 
Version((String)resource.getAttributes().get(Constants.BUNDLE_VERSION));
        snapshot = this.creator.isSnapshot(newVersion);
-       if(currentVersion.equals(newVersion) && !snapshot) {
+       if (currentVersion.equals(newVersion) && !snapshot) {
+           // TODO : Isn't this already checked in the task creator?
            Logger.logDebug("Same version is already installed, and not a 
snapshot, ignoring update:" + resource);
                return;
        }
@@ -78,16 +90,16 @@ public class BundleUpdateTask extends Os
             // If snapshot and ready to update, cancel if digest didn't change 
- as the list
             // of RegisteredResources is not saved, this might not have been 
detected earlier,
             // if the snapshot was installed and the installer was later 
restarted
-            if(snapshot) {
+            if (snapshot) {
                 final String oldDigest = 
this.creator.getInstalledBundleDigest(b);
-                if(resource.getDigest().equals(oldDigest)) {
+                if (resource.getDigest().equals(oldDigest)) {
                     Logger.logDebug("Snapshot digest did not change, ignoring 
update:" + resource);
                     return;
                 }
             }
 
             logExecution();
-            if(b.getState() == Bundle.ACTIVE) {
+            if (b.getState() == Bundle.ACTIVE) {
                 // bundle was active before the update - restart it once 
updated, but
                 // in sequence, not right now
                 ctx.addTaskToCurrentCycle(new BundleStartTask(b.getBundleId(), 
this.creator));

Added: 
sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/tasks/SystemBundleUpdateTask.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/tasks/SystemBundleUpdateTask.java?rev=988515&view=auto
==============================================================================
--- 
sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/tasks/SystemBundleUpdateTask.java
 (added)
+++ 
sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/tasks/SystemBundleUpdateTask.java
 Tue Aug 24 12:47:04 2010
@@ -0,0 +1,116 @@
+/*
+ * 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.tasks;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.apache.sling.osgi.installer.impl.Logger;
+import org.apache.sling.osgi.installer.impl.OsgiInstallerContext;
+import org.apache.sling.osgi.installer.impl.OsgiInstallerTask;
+import org.apache.sling.osgi.installer.impl.RegisteredResource;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleException;
+import org.osgi.framework.Constants;
+import org.osgi.framework.Version;
+
+/**
+ * Update the system bundle from a RegisteredResource.
+ */
+public class SystemBundleUpdateTask extends OsgiInstallerTask {
+
+    private static final String BUNDLE_UPDATE_ORDER = "99-";
+
+    private final RegisteredResource resource;
+
+    private final BundleTaskCreator creator;
+
+    public SystemBundleUpdateTask(final RegisteredResource r,
+            final BundleTaskCreator creator) {
+        this.creator = creator;
+        this.resource = r;
+    }
+
+    @Override
+    public String toString() {
+        return getClass().getSimpleName() + ": " + resource;
+    }
+
+    @Override
+    public void execute(OsgiInstallerContext ctx) {
+        final String symbolicName = 
(String)resource.getAttributes().get(Constants.BUNDLE_SYMBOLICNAME);
+        final Bundle b = this.creator.getMatchingBundle(symbolicName);
+        if (b == null) {
+            throw new IllegalStateException("Bundle to update (" + 
symbolicName + ") not found");
+        }
+        final Version newVersion = new 
Version((String)resource.getAttributes().get(Constants.BUNDLE_VERSION));
+
+        logExecution();
+        InputStream is = null;
+        try {
+            is = resource.getInputStream();
+            if (is == null) {
+                throw new IllegalStateException(
+                        "RegisteredResource provides null InputStream, cannot 
update bundle: "
+                        + resource);
+            }
+            this.creator.saveInstalledBundleInfo(b.getSymbolicName(), 
resource.getDigest(), newVersion.toString());
+            // delayed system bundle update
+            final InputStream backgroundIS = is;
+            is = null;
+            final Thread t = new Thread(new Runnable() {
+
+                /**
+                 * @see java.lang.Runnable#run()
+                 */
+                public void run() {
+                    try {
+                        Thread.sleep(800);
+                    } catch(InterruptedException ignored) {
+                    }
+                    try {
+                        b.update(backgroundIS);
+                    } catch (final BundleException be) {
+                        Logger.logWarn("Unable to update system bundle", be);
+                    } finally {
+                        try {
+                            backgroundIS.close();
+                        } catch (IOException ignore) {}
+                    }
+                }
+            });
+            t.setDaemon(true);
+            t.start();
+        } catch (final IOException e) {
+            Logger.logWarn("Removing failing tasks - unable to retry: " + 
this, e);
+        } finally {
+            if ( is != null ) {
+                try {
+                    is.close();
+                } catch (IOException ignore) {}
+            }
+        }
+    }
+
+    @Override
+    public String getSortKey() {
+        return BUNDLE_UPDATE_ORDER + resource.getURL();
+    }
+
+}
\ No newline at end of file

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

Propchange: 
sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/tasks/SystemBundleUpdateTask.java
------------------------------------------------------------------------------
    svn:keywords = author date id revision rev url

Propchange: 
sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/tasks/SystemBundleUpdateTask.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain


Reply via email to