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