sling-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From fmesc...@apache.org
Subject svn commit: r884426 - /sling/trunk/launchpad/base/src/main/java/org/apache/sling/launchpad/base/impl/BootstrapInstaller.java
Date Thu, 26 Nov 2009 07:09:01 GMT
Author: fmeschbe
Date: Thu Nov 26 07:09:00 2009
New Revision: 884426

URL: http://svn.apache.org/viewvc?rev=884426&view=rev
Log:
SLING-1189 apply patch by Justin Edelson (thanks) to support more fine grained bundle update
decision based on optional (non-standard) Bnd-LastModified header

Modified:
    sling/trunk/launchpad/base/src/main/java/org/apache/sling/launchpad/base/impl/BootstrapInstaller.java

Modified: sling/trunk/launchpad/base/src/main/java/org/apache/sling/launchpad/base/impl/BootstrapInstaller.java
URL: http://svn.apache.org/viewvc/sling/trunk/launchpad/base/src/main/java/org/apache/sling/launchpad/base/impl/BootstrapInstaller.java?rev=884426&r1=884425&r2=884426&view=diff
==============================================================================
--- sling/trunk/launchpad/base/src/main/java/org/apache/sling/launchpad/base/impl/BootstrapInstaller.java
(original)
+++ sling/trunk/launchpad/base/src/main/java/org/apache/sling/launchpad/base/impl/BootstrapInstaller.java
Thu Nov 26 07:09:00 2009
@@ -101,6 +101,11 @@
     private static final String[] BUNDLE_EXTENSIONS = { ".jar", ".war" };
 
     /**
+     * The header which contains the bundle's last modified date.
+     */
+    static final String BND_LAST_MODIFIED_HEADER = "Bnd-LastModified";
+
+    /**
      * The start level to be assigned to bundles found in the (old style)
      * {@link #PATH_CORE_BUNDLES resources/corebundles} location (value is 1).
      */
@@ -760,7 +765,8 @@
         // if the new version and the current version are the same, reinstall if
         // the version is a snapshot
         if (newVersion.equals(installedVersion)
-            && installedVersionProp.endsWith("SNAPSHOT")) {
+            && installedVersionProp.endsWith("SNAPSHOT")
+            && isNewerSnapshot(installedBundle, manifest)) {
             logger.log(Logger.LOG_INFO, "Forcing upgrade of SNAPSHOT bundle: "
                 + installedBundle.getSymbolicName());
             return false;
@@ -769,6 +775,55 @@
         return newVersion.compareTo(installedVersion) <= 0;
     }
 
+    /**
+     * Determine if the bundle containing the passed manfiest is a newer
+     * SNAPSHOT than the already-installed bundle.
+     *
+     * @param installedBundle the already-installed bundle
+     * @param manifest the manifest of the to-be-installed bundle
+     * @return true if the to-be-installed bundle is newer or if the comparison
+     *         fails for some reason
+     */
+    private boolean isNewerSnapshot(Bundle installedBundle, Manifest manifest) {
+        String installedDate = (String) installedBundle.getHeaders().get(
+            BND_LAST_MODIFIED_HEADER);
+        String toBeInstalledDate = manifest.getMainAttributes().getValue(
+            BND_LAST_MODIFIED_HEADER);
+        if (installedDate == null) {
+            logger.log(Logger.LOG_DEBUG, String.format(
+                "Currently installed bundle %s doesn't have a %s header",
+                installedBundle.getSymbolicName(), BND_LAST_MODIFIED_HEADER));
+            return true;
+        }
+        if (toBeInstalledDate == null) {
+            logger.log(Logger.LOG_DEBUG, String.format(
+                "Candidate bundle %s doesn't have a %s header",
+                installedBundle.getSymbolicName(), BND_LAST_MODIFIED_HEADER));
+            return true;
+        }
+
+        long installedTime, toBeInstalledTime = 0;
+        try {
+            installedTime = Long.valueOf(installedDate);
+        } catch (NumberFormatException e) {
+            logger.log(Logger.LOG_DEBUG, String.format(
+                "%s header of currently installed bundle %s isn't parseable.",
+                BND_LAST_MODIFIED_HEADER, installedBundle.getSymbolicName()));
+            return true;
+        }
+        try {
+            toBeInstalledTime = Long.valueOf(toBeInstalledDate);
+        } catch (NumberFormatException e) {
+            logger.log(Logger.LOG_DEBUG, String.format(
+                "%s header of candidate bundle %s isn't parseable.",
+                BND_LAST_MODIFIED_HEADER, installedBundle.getSymbolicName()));
+            return true;
+        }
+
+        return toBeInstalledTime > installedTime;
+
+    }
+
     // ---------- Bundle Installation marker file
 
     private boolean isAlreadyInstalled(BundleContext context,



Mime
View raw message