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 2016/11/28 03:13:00 UTC

svn commit: r1771674 - 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: Mon Nov 28 03:12:59 2016
New Revision: 1771674

URL: http://svn.apache.org/viewvc?rev=1771674&view=rev
Log:
JCRVLT-140 Add support for extract subpackages without installing content

Added:
    jackrabbit/commons/filevault/trunk/vault-core/src/test/resources/org/apache/jackrabbit/vault/packaging/integration/testpackages/subsubtest.zip
Modified:
    jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/DependencyUtil.java
    jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/JcrPackage.java
    jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/JcrPackageDefinition.java
    jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/VersionRange.java
    jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/impl/JcrPackageDefinitionImpl.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/test/java/org/apache/jackrabbit/vault/packaging/DependencyTest.java
    jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/VersionTest.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/DependencyUtil.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/DependencyUtil.java?rev=1771674&r1=1771673&r2=1771674&view=diff
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/DependencyUtil.java (original)
+++ jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/DependencyUtil.java Mon Nov 28 03:12:59 2016
@@ -23,6 +23,7 @@ import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 
+import javax.annotation.Nonnull;
 import javax.jcr.RepositoryException;
 
 import org.slf4j.Logger;
@@ -121,4 +122,35 @@ public class DependencyUtil {
         }
     }
 
+    /**
+     * Checks if any of the dependencies matches the given id
+     * @param deps the list of dependencies
+     * @param id the id
+     * @return {@code true} if matches
+     */
+    public static boolean matches(@Nonnull Dependency[] deps, @Nonnull PackageId id) {
+        for (Dependency dep: deps) {
+            if (dep.matches(id)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Adds and exact dependency to the give package if it is not alreadyl contained in the given list.
+     * @param deps the original dependencies
+     * @param id the id to add
+     * @return the new array of dependencies, or {@code deps} if nothing changed.
+     */
+    public static Dependency[] addExact(@Nonnull Dependency[] deps, @Nonnull PackageId id) {
+        if (matches(deps, id)) {
+            return deps;
+        }
+        Dependency[] newDeps = new Dependency[deps.length + 1];
+        System.arraycopy(deps, 0, newDeps, 0, deps.length);
+        newDeps[deps.length] = new Dependency(id);
+        return newDeps;
+    }
+
 }
\ No newline at end of file

Modified: jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/JcrPackage.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/JcrPackage.java?rev=1771674&r1=1771673&r2=1771674&view=diff
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/JcrPackage.java (original)
+++ jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/JcrPackage.java Mon Nov 28 03:12:59 2016
@@ -119,6 +119,24 @@ public interface JcrPackage extends Comp
             throws RepositoryException, PackageException, IOException;
 
     /**
+     * Processes this package and extracts all sub packages. No content of this package or its sub packages is extracted
+     * and not snapshots are taken. If {@link ImportOptions#isNonRecursive()} is {@code true}, then only the direct
+     * sub packages are extracted. The extraction ensures that the sub packages have a dependency to their parent package.
+     *
+     * @param opts import options
+     * @return the list of subpackages that were extracted
+     * @throws RepositoryException if a repository error during installation occurs.
+     * @throws PackageException if an error during packaging occurs
+     * @throws IllegalStateException if the package is not valid.
+     * @throws IOException if an I/O error occurs
+     *
+     * @since 3.1.32
+     */
+    @Nonnull
+    PackageId[] extractSubpackages(@Nonnull ImportOptions opts)
+            throws RepositoryException, PackageException, IOException;
+
+    /**
      * Returns the dependencies that are not resolved. If the {@link DependencyHandling} is set to strict, the package
      * will not installed if any unresolved dependencies are listed.
      * @return the array of unresolved dependencies.

Modified: jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/JcrPackageDefinition.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/JcrPackageDefinition.java?rev=1771674&r1=1771673&r2=1771674&view=diff
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/JcrPackageDefinition.java (original)
+++ jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/JcrPackageDefinition.java Mon Nov 28 03:12:59 2016
@@ -242,6 +242,14 @@ public interface JcrPackageDefinition {
     Dependency[] getDependencies();
 
     /**
+     * Sets the dependencies to this definition and stores it in a node representation.
+     * @param dependencies the package dependencies
+     * @param autoSave if {@code true} the modifications are saved automatically.
+     * @since 3.1.32
+     */
+    void setDependencies(@Nonnull Dependency[] dependencies, boolean autoSave);
+
+    /**
      * Generic method to retrieve a string property of this definition.
      * @param name the name of the property.
      * @return the property value or {@code null} if it does not exist.

Modified: jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/VersionRange.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/VersionRange.java?rev=1771674&r1=1771673&r2=1771674&view=diff
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/VersionRange.java (original)
+++ jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/VersionRange.java Mon Nov 28 03:12:59 2016
@@ -62,6 +62,12 @@ public class VersionRange {
      * @throws IllegalArgumentException if bounds are not valid
      */
     public VersionRange(Version low, boolean lowIncl, Version high, boolean highIncl) {
+        if (low == Version.EMPTY) {
+            low = null;
+        }
+        if (high == Version.EMPTY) {
+            high = null;
+        }
         // check if range is valid
         if (low != null && high != null) {
             int comp = low.compareTo(high);

Modified: jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/impl/JcrPackageDefinitionImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/impl/JcrPackageDefinitionImpl.java?rev=1771674&r1=1771673&r2=1771674&view=diff
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/impl/JcrPackageDefinitionImpl.java (original)
+++ jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/impl/JcrPackageDefinitionImpl.java Mon Nov 28 03:12:59 2016
@@ -31,6 +31,7 @@ import javax.jcr.Property;
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
 import javax.jcr.Value;
+import javax.jcr.ValueFactory;
 
 import org.apache.jackrabbit.util.ISO8601;
 import org.apache.jackrabbit.vault.fs.Mounter;
@@ -328,6 +329,25 @@ public class JcrPackageDefinitionImpl im
     }
 
     /**
+     * {@inheritDoc}
+     */
+    public void setDependencies(@Nonnull Dependency[] dependencies, boolean autoSave) {
+        try {
+            final Value[] values = new Value[dependencies.length];
+            final ValueFactory fac = defNode.getSession().getValueFactory();
+            for (int i=0; i<dependencies.length; i++) {
+                values[i] = fac.createValue(dependencies[i].toString());
+            }
+            defNode.setProperty(PN_DEPENDENCIES, values);
+            if (autoSave) {
+                defNode.getSession().save();
+            }
+        } catch (RepositoryException e) {
+            log.error("Error during setDependencies()", e);
+        }
+    }
+
+    /**
      * Load the given properties from the content
      * @param props the properties to load
      */

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=1771674&r1=1771673&r2=1771674&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 Mon Nov 28 03:12:59 2016
@@ -42,7 +42,9 @@ import org.apache.commons.io.FileUtils;
 import org.apache.commons.io.IOUtils;
 import org.apache.jackrabbit.vault.fs.api.ImportMode;
 import org.apache.jackrabbit.vault.fs.api.ProgressTrackerListener;
+import org.apache.jackrabbit.vault.fs.api.VaultInputSource;
 import org.apache.jackrabbit.vault.fs.io.AccessControlHandling;
+import org.apache.jackrabbit.vault.fs.io.Archive;
 import org.apache.jackrabbit.vault.fs.io.ImportOptions;
 import org.apache.jackrabbit.vault.fs.io.MemoryArchive;
 import org.apache.jackrabbit.vault.fs.io.ZipArchive;
@@ -404,6 +406,13 @@ public class JcrPackageImpl implements J
                     JcrPackageDefinitionImpl def = (JcrPackageDefinitionImpl) p.getDefinition();
                     def.clearLastUnpacked(false);
 
+                    // add dependency to the parent package if required
+                    Dependency[] oldDeps = def.getDependencies();
+                    Dependency[] newDeps = DependencyUtil.addExact(oldDeps, pack.getId());
+                    if (oldDeps != newDeps) {
+                        def.setDependencies(newDeps, false);
+                    }
+
                     PackageId pId = def.getId();
                     String pName = pId.getName();
                     Version pVersion = pId.getVersion();
@@ -424,7 +433,8 @@ public class JcrPackageImpl implements J
                         // check that the listed package is actually from same name (so normally only version would differ)
                         // if that package is valid, installed, and the version is more recent than the one in our sub package
                         // then we can stop the loop here
-                        if (pName.equals(listedPackageId.getName()) && listedPackage.isValid() && listedPackage.isInstalled() && listedPackageId.getVersion().compareTo(pVersion) > 0) {
+                        if (pName.equals(listedPackageId.getName()) && listedPackage.isValid() && listedPackage.isInstalled()
+                                && listedPackageId.getVersion().compareTo(pVersion) > 0) {
                             newerPackageId = listedPackageId;
                             break;
                         }
@@ -488,6 +498,77 @@ public class JcrPackageImpl implements J
             }
         }
     }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Nonnull
+    @Override
+    public PackageId[] extractSubpackages(@Nonnull ImportOptions opts)
+            throws RepositoryException, PackageException, IOException {
+        Set<PackageId> processed = new HashSet<PackageId>();
+        extractSubpackages(opts, processed);
+        PackageId[] ret = processed.toArray(new PackageId[processed.size()]);
+        Arrays.sort(ret);
+        return ret;
+    }
+
+    private void extractSubpackages(@Nonnull ImportOptions opts, @Nonnull Set<PackageId> processed)
+            throws RepositoryException, PackageException, IOException {
+        VaultPackage pack = getPackage();
+
+        Archive a = pack.getArchive();
+        Archive.Entry packages = a.getEntry("/jcr_root/etc/packages");
+        if (packages == null) {
+            return;
+        }
+        List<Archive.Entry> entries = new LinkedList<Archive.Entry>();
+        findSubPackageEntries(entries, packages);
+
+        for (Archive.Entry e: entries) {
+            VaultInputSource in = a.getInputSource(e);
+            InputStream ins = null;
+            try {
+                ins = in.getByteStream();
+                JcrPackageImpl subPackage = (JcrPackageImpl) mgr.upload(ins, false, true);
+
+                // add dependency to this package
+                Dependency[] oldDeps = subPackage.getDefinition().getDependencies();
+                Dependency[] newDeps = DependencyUtil.addExact(oldDeps, pack.getId());
+                if (oldDeps != newDeps) {
+                    subPackage.getDefinition().setDependencies(newDeps, true);
+                }
+
+                PackageId id = subPackage.getDefinition().getId();
+                processed.add(id);
+                log.info("Extracted sub-package: {}", id);
+
+                if (!opts.isNonRecursive()) {
+                    subPackage.extractSubpackages(opts, processed);
+                }
+            } finally {
+                if (ins != null) {
+                    ins.close();
+                }
+            }
+        }
+    }
+
+    private void findSubPackageEntries(@Nonnull List<Archive.Entry> entries, @Nonnull Archive.Entry folder) {
+        for (Archive.Entry e: folder.getChildren()) {
+            final String name = e.getName();
+            if (e.isDirectory()) {
+                if (!".snapshot".equals(name)) {
+                    findSubPackageEntries(entries, e);
+                }
+            } else {
+                // only process files with .zip extension
+                if (name.endsWith(".zip")) {
+                    entries.add(e);
+                }
+            }
+        }
+    }
 
     /**
      * {@inheritDoc}

Modified: jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/DependencyTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/DependencyTest.java?rev=1771674&r1=1771673&r2=1771674&view=diff
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/DependencyTest.java (original)
+++ jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/DependencyTest.java Mon Nov 28 03:12:59 2016
@@ -86,6 +86,12 @@ public class DependencyTest extends Test
         assertEquals("group:name", d.toString());
     }
 
+    public void testToString5() {
+        PackageId id = new PackageId("group", "name", Version.EMPTY);
+        Dependency d = new Dependency(id);
+        assertEquals("group:name", d.toString());
+    }
+
     public void testParse() {
         Dependency[] d = Dependency.parse("name1,group2:name2,group3:name3:1.0,group4:name4:[1.0,2.0],:name5:[1.0,2.0]");
         assertEquals(5,d.length);

Modified: jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/VersionTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/VersionTest.java?rev=1771674&r1=1771673&r2=1771674&view=diff
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/VersionTest.java (original)
+++ jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/VersionTest.java Mon Nov 28 03:12:59 2016
@@ -48,6 +48,10 @@ public class VersionTest extends TestCas
         compare("6.1.58", "6.1.58.FP3", -1);
         compare("6.1.59", "6.1.58.FP3", 1);
         compare("6.1.58-FP3", "6.1.58-FP2", 1);
+        compare("6.1.58-FP3", "6.1.58.FP3", -1);  // expected -1
+        compare("6.1.58-FP3", "6.1.58.FP4", -1);  // expected –1
+        compare("6.1.58.FP3", "6.1.58-FP4", 1);  // expected 1
+        compare("6.1.58.FP3", "6.1.58.FP4", -1);  // expected -1
     }
 
     public void testOsgiCompare() {

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=1771674&r1=1771673&r2=1771674&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 Mon Nov 28 03:12:59 2016
@@ -22,10 +22,13 @@ import java.io.IOException;
 import javax.jcr.RepositoryException;
 
 import org.apache.jackrabbit.vault.fs.io.ImportOptions;
+import org.apache.jackrabbit.vault.packaging.Dependency;
 import org.apache.jackrabbit.vault.packaging.JcrPackage;
 import org.apache.jackrabbit.vault.packaging.PackageException;
+import org.apache.jackrabbit.vault.packaging.PackageId;
 import org.junit.Test;
 
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
@@ -59,6 +62,17 @@ public class TestSubPackages extends Int
 
         assertNodeMissing("/tmp/a");
         assertNodeMissing("/tmp/b");
+
+        // check for sub packages dependency
+        String expected = new Dependency(pack.getDefinition().getId()).toString();
+
+        JcrPackage p1 = packMgr.open(admin.getNode("/etc/packages/my_packages/sub_a.zip"));
+        assertEquals("has 1 dependency", 1, p1.getDefinition().getDependencies().length);
+        assertEquals("has dependency to parent package", expected, p1.getDefinition().getDependencies()[0].toString());
+        JcrPackage p2 = packMgr.open(admin.getNode("/etc/packages/my_packages/sub_b.zip"));
+        assertEquals("has 1 dependency", 1, p2.getDefinition().getDependencies().length);
+        assertEquals("has dependency to parent package", expected, p2.getDefinition().getDependencies()[0].toString());
+
     }
 
     /**
@@ -314,4 +328,116 @@ public class TestSubPackages extends Int
 
     }
 
+    /**
+     * Test if subpackage extraction works
+     */
+    @Test
+    public void testPackageExtract() throws IOException, RepositoryException, PackageException {
+        JcrPackage pack = packMgr.upload(getStream("testpackages/subtest.zip"), false);
+        assertNotNull(pack);
+
+        // install
+        ImportOptions opts = getDefaultOptions();
+        PackageId[] ids = pack.extractSubpackages(opts);
+
+        // check for sub packages
+        assertNodeExists("/etc/packages/my_packages/sub_a.zip");
+        assertNodeExists("/etc/packages/my_packages/sub_b.zip");
+
+        assertEquals("Package Id", ids[0].toString(), "my_packages:sub_a");
+        assertEquals("Package Id", ids[1].toString(), "my_packages:sub_b");
+    }
+
+    /**
+     * Test if extracted sub-packages have their parent package as dependency, even if not specified in their properties.
+     */
+    @Test
+    public void testSubPackageDependency() throws IOException, RepositoryException, PackageException {
+        JcrPackage pack = packMgr.upload(getStream("testpackages/subtest.zip"), false);
+        assertNotNull(pack);
+        PackageId pId = pack.getDefinition().getId();
+
+        // install
+        ImportOptions opts = getDefaultOptions();
+        pack.extractSubpackages(opts);
+
+        // check for sub packages dependency
+        String expected = new Dependency(pId).toString();
+
+        JcrPackage p1 = packMgr.open(admin.getNode("/etc/packages/my_packages/sub_a.zip"));
+        assertEquals("has 1 dependency", 1, p1.getDefinition().getDependencies().length);
+        assertEquals("has dependency to parent package", expected, p1.getDefinition().getDependencies()[0].toString());
+        JcrPackage p2 = packMgr.open(admin.getNode("/etc/packages/my_packages/sub_b.zip"));
+        assertEquals("has 1 dependency", 1, p2.getDefinition().getDependencies().length);
+        assertEquals("has dependency to parent package", expected, p2.getDefinition().getDependencies()[0].toString());
+    }
+
+    /**
+     * Test if subpackage extraction works recursively
+     */
+    @Test
+    public void testRecursivePackageExtract() throws IOException, RepositoryException, PackageException {
+        JcrPackage pack = packMgr.upload(getStream("testpackages/subsubtest.zip"), false);
+        assertNotNull(pack);
+
+        // install
+        ImportOptions opts = getDefaultOptions();
+        opts.setNonRecursive(false);
+        PackageId[] ids = pack.extractSubpackages(opts);
+
+        // check for sub packages
+        assertNodeExists("/etc/packages/my_packages/subtest.zip");
+        assertNodeExists("/etc/packages/my_packages/sub_a.zip");
+        assertNodeExists("/etc/packages/my_packages/sub_b.zip");
+
+        assertEquals("Package Id", ids[0].toString(), "my_packages:sub_a");
+        assertEquals("Package Id", ids[1].toString(), "my_packages:sub_b");
+        assertEquals("Package Id", ids[2].toString(), "my_packages:subtest");
+    }
+
+    /**
+     * Test if subpackage extraction works non-recursively
+     */
+    @Test
+    public void testNonRecursivePackageExtract() throws IOException, RepositoryException, PackageException {
+        JcrPackage pack = packMgr.upload(getStream("testpackages/subsubtest.zip"), false);
+        assertNotNull(pack);
+
+        // install
+        ImportOptions opts = getDefaultOptions();
+        opts.setNonRecursive(true);
+        PackageId[] ids = pack.extractSubpackages(opts);
+
+        // check for sub packages
+        assertNodeExists("/etc/packages/my_packages/subtest.zip");
+        assertNodeMissing("/etc/packages/my_packages/sub_a.zip");
+        assertNodeMissing("/etc/packages/my_packages/sub_b.zip");
+
+        assertEquals("Package Id", ids[0].toString(), "my_packages:subtest");
+    }
+
+    @Test
+    public void testSubPackageDependency2() throws IOException, RepositoryException, PackageException {
+        JcrPackage pack = packMgr.upload(getStream("testpackages/subsubtest.zip"), false);
+        assertNotNull(pack);
+
+        // install
+        ImportOptions opts = getDefaultOptions();
+        pack.extractSubpackages(opts);
+
+        JcrPackage p0 = packMgr.open(admin.getNode("/etc/packages/my_packages/subtest.zip"));
+        assertEquals("has 1 dependency", 1, p0.getDefinition().getDependencies().length);
+        assertEquals("has dependency to parent package",
+                new Dependency(pack.getDefinition().getId()), p0.getDefinition().getDependencies()[0]);
+
+        // check for sub packages dependency
+        String expected = new Dependency(p0.getDefinition().getId()).toString();
+        JcrPackage p1 = packMgr.open(admin.getNode("/etc/packages/my_packages/sub_a.zip"));
+        assertEquals("has 1 dependency", 1, p1.getDefinition().getDependencies().length);
+        assertEquals("has dependency to parent package", expected, p1.getDefinition().getDependencies()[0].toString());
+        JcrPackage p2 = packMgr.open(admin.getNode("/etc/packages/my_packages/sub_b.zip"));
+        assertEquals("has 1 dependency", 1, p2.getDefinition().getDependencies().length);
+        assertEquals("has dependency to parent package", expected, p2.getDefinition().getDependencies()[0].toString());
+    }
+
 }
\ No newline at end of file

Added: jackrabbit/commons/filevault/trunk/vault-core/src/test/resources/org/apache/jackrabbit/vault/packaging/integration/testpackages/subsubtest.zip
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-core/src/test/resources/org/apache/jackrabbit/vault/packaging/integration/testpackages/subsubtest.zip?rev=1771674&view=auto
==============================================================================
Binary files jackrabbit/commons/filevault/trunk/vault-core/src/test/resources/org/apache/jackrabbit/vault/packaging/integration/testpackages/subsubtest.zip (added) and jackrabbit/commons/filevault/trunk/vault-core/src/test/resources/org/apache/jackrabbit/vault/packaging/integration/testpackages/subsubtest.zip Mon Nov 28 03:12:59 2016 differ