You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by tr...@apache.org on 2018/06/19 05:07:04 UTC

svn commit: r1833779 - in /jackrabbit/commons/filevault/trunk/vault-core/src: main/java/org/apache/jackrabbit/vault/packaging/ main/java/org/apache/jackrabbit/vault/packaging/impl/ test/java/org/apache/jackrabbit/vault/packaging/ test/java/org/apache/j...

Author: tripod
Date: Tue Jun 19 05:07:04 2018
New Revision: 1833779

URL: http://svn.apache.org/viewvc?rev=1833779&view=rev
Log:
JCRVLT-301 Do not always skip installation of sub packages (closes #27)

Added:
    jackrabbit/commons/filevault/trunk/vault-core/src/test/resources/org/apache/jackrabbit/vault/packaging/integration/testpackages/subtest_extract_contains_older_version_force_downgrade.zip
Modified:
    jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/SubPackageHandling.java
    jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/impl/JcrPackageImpl.java
    jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/package-info.java
    jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/SubPackageHandlingTest.java
    jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/IntegrationTestBase.java
    jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/TestSubPackages.java

Modified: jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/SubPackageHandling.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/SubPackageHandling.java?rev=1833779&r1=1833778&r2=1833779&view=diff
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/SubPackageHandling.java (original)
+++ jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/SubPackageHandling.java Tue Jun 19 05:07:04 2018
@@ -40,7 +40,12 @@ import org.apache.jackrabbit.util.Text;
  *
  *  Note that 'ignore' is currently not really supported as sub packages are part of the normal package content and
  *  behaves the same as 'add'. Future implementations will transport the sub packages outside of the normal package
- *  content, e.g. in a META-INF/vault/subpackages/ folder (see JCRVLT-33).
+ *  content, e.g. in a META-INF/vault/subpackages/ folder (see <a href="https://issues.apache.org/jira/browse/JCRVLT-33">JCRVLT-33</a>).
+ *  
+ *  <p>
+ *  The sub package handling is being specified in the package properties xml within property {@link PackageProperties#NAME_SUB_PACKAGE_HANDLING}.
+ *  </p>
+ *  @see PackageProperties
  */
 public class SubPackageHandling {
 
@@ -49,12 +54,12 @@ public class SubPackageHandling {
      */
     public enum Option {
         /**
-         * adds and installs the package using {@link JcrPackage#install(org.apache.jackrabbit.vault.fs.io.ImportOptions)}
+         * adds and installs the package using {@link JcrPackage#install(org.apache.jackrabbit.vault.fs.io.ImportOptions)} in case a newer version has not already been installed
          */
         INSTALL,
 
         /**
-         * adds and extracts the package using {@link JcrPackage#extract(org.apache.jackrabbit.vault.fs.io.ImportOptions)}
+         * adds and extracts the package using {@link JcrPackage#extract(org.apache.jackrabbit.vault.fs.io.ImportOptions)} in case a newer version has not already been installed
          */
         EXTRACT,
 
@@ -66,7 +71,19 @@ public class SubPackageHandling {
         /**
          * ignores the sub package completely
          */
-        IGNORE
+        IGNORE,
+        
+        /**
+         * adds and installs the package using {@link JcrPackage#install(org.apache.jackrabbit.vault.fs.io.ImportOptions)} even in case a newer version has already been installed
+         * (allows downgrades)
+         */
+        FORCE_INSTALL,
+        
+        /**
+         * adds and extracts the package using {@link JcrPackage#extract(org.apache.jackrabbit.vault.fs.io.ImportOptions)} even in case a newer version has already been installed
+         * (allows downgrades)
+         */
+        FORCE_EXTRACT
     }
 
     public static class Entry {

Modified: jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/impl/JcrPackageImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/impl/JcrPackageImpl.java?rev=1833779&r1=1833778&r2=1833779&view=diff
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/impl/JcrPackageImpl.java (original)
+++ jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/impl/JcrPackageImpl.java Tue Jun 19 05:07:04 2018
@@ -23,9 +23,11 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Map;
 import java.util.Properties;
 import java.util.Set;
 
@@ -403,6 +405,8 @@ public class JcrPackageImpl implements J
         // process sub packages
         Session s = node.getSession();
         List<JcrPackageImpl> subPacks = new LinkedList<JcrPackageImpl>();
+        // contains a value only if a more recent version of the package with the given id (from the key) is already installed
+        Map<PackageId, PackageId> newerPackageIdPerSubPackage = new HashMap<PackageId, PackageId>();
         for (String path: subPackages) {
             if (s.nodeExists(path)) {
                 JcrPackageImpl p = new JcrPackageImpl(mgr, s.getNode(path));
@@ -453,9 +457,6 @@ public class JcrPackageImpl implements J
                     JcrPackageManager pkgMgr = new JcrPackageManagerImpl(s, mgr.getPackRootPaths()); // todo: use registry instead ?
                     List<JcrPackage> listPackages = pkgMgr.listPackages(pId.getGroup(), true);
 
-                    // keep some status variable if a more recent is found in the next loop
-                    PackageId newerPackageId = null;
-
                     // loop in the list of packages returned previously by package manager
                     for (JcrPackage listedPackage: listPackages) {
                         JcrPackageDefinition listedPackageDef = listedPackage.getDefinition();
@@ -471,16 +472,11 @@ public class JcrPackageImpl implements J
                         // then we can stop the loop here
                         if (pName.equals(listedPackageId.getName()) && listedPackage.isValid() && listedPackage.isInstalled()
                                 && listedPackageId.getVersion().compareTo(pVersion) > 0) {
-                            newerPackageId = listedPackageId;
+                            newerPackageIdPerSubPackage.put(pId, listedPackageId);
                             break;
                         }
                     }
-                    // if a more recent version of that subpackage was found we don't need to add it to the list of sub packages to eventually extract later on.
-                    if (newerPackageId != null) {
-                        log.debug("Skipping installation of subpackage '{}' due to newer installed version: '{}'", pId, newerPackageId);
-                    } else {
-                        subPacks.add(p);
-                    }
+                    subPacks.add(p);
                 }
             }
         }
@@ -500,14 +496,25 @@ public class JcrPackageImpl implements J
                 boolean skip = false;
                 PackageId id = p.getDefinition().getId();
                 SubPackageHandling.Option option = sb.getOption(id);
-                String msg;
-                if (option == SubPackageHandling.Option.ADD || option == SubPackageHandling.Option.IGNORE) {
-                    msg = "skipping installation of subpackage " + id + " due to option " + option;
-                    skip = true;
-                } else if (option == SubPackageHandling.Option.INSTALL) {
-                    msg = "Starting installation of subpackage " + id;
-                } else {
-                    msg = "Starting extraction of subpackage " + id;
+                String msg = null;
+                // should the package be skipped due to a newer version already installed?
+                if (option == SubPackageHandling.Option.INSTALL || option == SubPackageHandling.Option.EXTRACT) {
+                    PackageId newerPackageId = newerPackageIdPerSubPackage.get(id);
+                    if (newerPackageId != null) {
+                        msg = String.format("Skipping installation of subpackage '%s' due to newer installed version: '%s'", id, newerPackageId);
+                        skip = true;
+                    }
+                }
+                
+                if (!skip) {
+                    if (option == SubPackageHandling.Option.ADD || option == SubPackageHandling.Option.IGNORE) {
+                        msg = "Skipping installation of subpackage " + id + " due to option " + option;
+                        skip = true;
+                    } else if (option == SubPackageHandling.Option.INSTALL || option == SubPackageHandling.Option.FORCE_INSTALL) {
+                        msg = "Starting installation of subpackage " + id;
+                    } else {
+                        msg = "Starting extraction of subpackage " + id;
+                    }
                 }
                 if (options.isDryRun()) {
                     msg = "Dry run: " + msg;
@@ -518,7 +525,7 @@ public class JcrPackageImpl implements J
                     log.debug(msg);
                 }
                 if (!skip) {
-                    if (createSnapshot && option == SubPackageHandling.Option.INSTALL) {
+                    if (createSnapshot && (option == SubPackageHandling.Option.INSTALL || option == SubPackageHandling.Option.FORCE_INSTALL)) {
                         p.extract(options, true, true);
                         subIds.add(id);
                     } else {

Modified: jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/package-info.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/package-info.java?rev=1833779&r1=1833778&r2=1833779&view=diff
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/package-info.java (original)
+++ jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/package-info.java Tue Jun 19 05:07:04 2018
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-@Version("2.6.1")
+@Version("2.7.0")
 package org.apache.jackrabbit.vault.packaging;
 
 import org.osgi.annotation.versioning.Version;
\ No newline at end of file

Modified: jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/SubPackageHandlingTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/SubPackageHandlingTest.java?rev=1833779&r1=1833778&r2=1833779&view=diff
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/SubPackageHandlingTest.java (original)
+++ jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/SubPackageHandlingTest.java Tue Jun 19 05:07:04 2018
@@ -89,5 +89,7 @@ public class SubPackageHandlingTest exte
         assertEquals("foo:bar", SubPackageHandling.fromString("foo:bar;illegal").getString());
         assertEquals("foo:bar", SubPackageHandling.fromString("foo:bar;install").getString());
         assertEquals("*:*,foo:bar;add", SubPackageHandling.fromString("*;install,foo:bar;add").getString());
+        assertEquals("*:*;force_install", SubPackageHandling.fromString("*;force_install").getString());
+        assertEquals("*:*;force_extract", SubPackageHandling.fromString("*;force_extract").getString());
     }
 }
\ No newline at end of file

Modified: jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/IntegrationTestBase.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/IntegrationTestBase.java?rev=1833779&r1=1833778&r2=1833779&view=diff
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/IntegrationTestBase.java (original)
+++ jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/IntegrationTestBase.java Tue Jun 19 05:07:04 2018
@@ -358,10 +358,25 @@ public class IntegrationTestBase  {
         }
     }
 
+    /**
+     * Returns a ZipVaultPackage from either a directory (exploded package) or a package zip file
+     * @param name
+     * @return VaultPackage
+     * @throws IOException
+     */
     public VaultPackage loadVaultPackage(String name) throws IOException {
         return new ZipVaultPackage(getFileArchive(name), true);
     }
 
+    /**
+     * Returns an ZipVaultPackage which has been extracted in the repository.
+     * 
+     * @param name either the name of a zip file or the name of a directory which contains an exploded package
+     * @return an extracted vault package
+     * @throws IOException
+     * @throws PackageException
+     * @throws RepositoryException
+     */
     public VaultPackage extractVaultPackage(String name) throws IOException, PackageException, RepositoryException {
         return extractVaultPackage(name, null);
     }

Modified: jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/TestSubPackages.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/TestSubPackages.java?rev=1833779&r1=1833778&r2=1833779&view=diff
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/TestSubPackages.java (original)
+++ jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/TestSubPackages.java Tue Jun 19 05:07:04 2018
@@ -26,6 +26,7 @@ import java.util.List;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipInputStream;
 
+import javax.jcr.PathNotFoundException;
 import javax.jcr.RepositoryException;
 
 import org.apache.jackrabbit.vault.fs.io.ImportOptions;
@@ -382,6 +383,34 @@ public class TestSubPackages extends Int
         assertNodeExists("/tmp/a");
     }
 
+    @Test
+    public void testDowngradeInstallationOfSubpackages() throws PathNotFoundException, RepositoryException, IOException, PackageException {
+        try (JcrPackage packNewer = packMgr.upload(getStream("testpackages/subtest_extract_contains_newer_version.zip"), false)) {
+            assertNotNull(packNewer);
+    
+            // install package that contains newer version of the sub package first
+            ImportOptions opts = getDefaultOptions();
+            packNewer.install(opts);
+        }
+        // check for sub packages version 1.0.1 exists
+        assertPackageNodeExists(PACKAGE_ID_SUB_TEST_101);
+        try (JcrPackage subPackage = packMgr.open(admin.getNode(getInstallationPath(PACKAGE_ID_SUB_TEST_101)))) {
+            assertTrue(subPackage.isInstalled());
+        }
+        assertNodeExists("/tmp/b");
+        
+        // now install package which is supposed to downgrade
+        try (JcrPackage packOlder = packMgr.upload(getStream("testpackages/subtest_extract_contains_older_version_force_downgrade.zip"), false)) {
+            assertNotNull(packOlder);
+            packOlder.install(getDefaultOptions());
+        }
+        assertPackageNodeExists(PACKAGE_ID_SUB_TEST_10);
+        try (JcrPackage subPackage = packMgr.open(admin.getNode(getInstallationPath(PACKAGE_ID_SUB_TEST_10)))) {
+            assertTrue("Older Subpackage is not installed, although it is explicitly requested to downgrade", subPackage.isInstalled());
+        }
+        assertNodeExists("/tmp/a");
+    }
+
     /**
      * Test if subpackage extraction works
      */

Added: jackrabbit/commons/filevault/trunk/vault-core/src/test/resources/org/apache/jackrabbit/vault/packaging/integration/testpackages/subtest_extract_contains_older_version_force_downgrade.zip
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-core/src/test/resources/org/apache/jackrabbit/vault/packaging/integration/testpackages/subtest_extract_contains_older_version_force_downgrade.zip?rev=1833779&view=auto
==============================================================================
Binary files jackrabbit/commons/filevault/trunk/vault-core/src/test/resources/org/apache/jackrabbit/vault/packaging/integration/testpackages/subtest_extract_contains_older_version_force_downgrade.zip (added) and jackrabbit/commons/filevault/trunk/vault-core/src/test/resources/org/apache/jackrabbit/vault/packaging/integration/testpackages/subtest_extract_contains_older_version_force_downgrade.zip Tue Jun 19 05:07:04 2018 differ