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 2014/02/18 07:19:43 UTC

svn commit: r1569209 - in /jackrabbit/commons/filevault/trunk/vault-core/src: main/java/org/apache/jackrabbit/vault/fs/io/ main/java/org/apache/jackrabbit/vault/packaging/ main/java/org/apache/jackrabbit/vault/packaging/impl/ test/java/org/apache/jackr...

Author: tripod
Date: Tue Feb 18 06:19:43 2014
New Revision: 1569209

URL: http://svn.apache.org/r1569209
Log:
JCRVLT-30 Allow package definition to specify recursive install behavior

Added:
    jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/SubPackageHandling.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/resources/org/apache/jackrabbit/vault/packaging/integration/testpackages/subtest_extract_a.zip
    jackrabbit/commons/filevault/trunk/vault-core/src/test/resources/org/apache/jackrabbit/vault/packaging/integration/testpackages/subtest_ignore_a.zip
Modified:
    jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/io/ImportOptions.java
    jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/PackageProperties.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/impl/PackagePropertiesImpl.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/fs/io/ImportOptions.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/io/ImportOptions.java?rev=1569209&r1=1569208&r2=1569209&view=diff
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/io/ImportOptions.java (original)
+++ jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/io/ImportOptions.java Tue Feb 18 06:19:43 2014
@@ -152,10 +152,20 @@ public class ImportOptions {
         this.acHandling = acHandling;
     }
 
+    /**
+     * Defines the package installation should recursively install sub packages. Note that if this flag is enabled,
+     * the {@link org.apache.jackrabbit.vault.packaging.SubPackageHandling} configuration has no effect, as sub packages
+     * are not evaluated at all.
+     *
+     * @return {@code true} if package installation should not install sub packages.
+     */
     public boolean isNonRecursive() {
         return nonRecursive;
     }
 
+    /**
+     * @see #isNonRecursive()
+     */
     public void setNonRecursive(boolean nonRecursive) {
         this.nonRecursive = nonRecursive;
     }

Modified: jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/PackageProperties.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/PackageProperties.java?rev=1569209&r1=1569208&r2=1569209&view=diff
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/PackageProperties.java (original)
+++ jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/PackageProperties.java Tue Feb 18 06:19:43 2014
@@ -123,6 +123,12 @@ public interface PackageProperties {
     String NAME_DISABLE_INTERMEDIATE_SAVE = "noIntermediateSaves";
 
     /**
+     * Name of the flag that configures the sub package handling
+     * @since 3.1
+     */
+    String NAME_SUB_PACKAGE_HANDLING = "subPackageHandling";
+
+    /**
      * the prefix for an install hook property. eg:
      * 'installhook.test1.class = ....'
      */
@@ -199,6 +205,12 @@ public interface PackageProperties {
     AccessControlHandling getACHandling();
 
     /**
+     * Returns the sub package handling configuration
+     * @return the sub package handling configuration.
+     */
+    SubPackageHandling getSubPackageHandling();
+
+    /**
      * Returns the date property with the given name or {@code null} if it does not exist or if the value cannot be
      * converted to a date.
      * @param name the property name

Added: 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=1569209&view=auto
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/SubPackageHandling.java (added)
+++ jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/SubPackageHandling.java Tue Feb 18 06:19:43 2014
@@ -0,0 +1,187 @@
+/*
+ * 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.jackrabbit.vault.packaging;
+
+import java.util.Collections;
+import java.util.LinkedList;
+import java.util.List;
+
+import org.apache.jackrabbit.util.Text;
+
+/**
+ * The sub package handling specifies how sub package are handled during recursive package installation. This
+ * configuration consists of a list of {@link org.apache.jackrabbit.vault.packaging.SubPackageHandling.Entry}s that
+ * match against a given {@link org.apache.jackrabbit.vault.packaging.PackageId}. The version of the package id is
+ * ignored.
+ * <p/>
+ * The sub package handling can be specified in the package properties as a string of the following format:
+ * <xmp>
+ *     subPackageHandling := instruction { "," instruction };
+ *     instruction := packageIdFilter { ";" option }
+ *     packageIdFilter := packageNameFilter | groupNameFilter ":" packageNameFilter;
+ *     groupNameFilter := "*" | groupName;
+ *     packageNameFilter := "*" | packageName;
+ *     option := "install" | "extract" | "add" | "ignore";
+ * </xmp>
+ *
+ *  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).
+ */
+public class SubPackageHandling {
+
+    /**
+     * The sub package option
+     */
+    public enum Option {
+        /**
+         * adds and installs the package using {@link JcrPackage#install(org.apache.jackrabbit.vault.fs.io.ImportOptions)}
+         */
+        INSTALL,
+
+        /**
+         * adds and extracts the package using {@link JcrPackage#extract(org.apache.jackrabbit.vault.fs.io.ImportOptions)}
+         */
+        EXTRACT,
+
+        /**
+         * adds the package using {@link JcrPackageManager#upload}
+         */
+        ADD,
+
+        /**
+         * ignores the sub package completely
+         */
+        IGNORE
+    }
+
+    public static class Entry {
+
+        private final String groupName;
+
+        private final String packageName;
+
+        private final Option option;
+
+        public Entry(String groupName, String packageName, Option option) {
+            this.groupName = groupName == null || groupName.isEmpty() ? "*" : groupName;
+            this.packageName = packageName == null || packageName.isEmpty() ? "*" : packageName;
+            this.option = option;
+        }
+
+        public String getGroupName() {
+            return groupName;
+        }
+
+        public String getPackageName() {
+            return packageName;
+        }
+
+        public Option getOption() {
+            return option;
+        }
+    }
+
+    /**
+     * The default handling
+     */
+    public static final SubPackageHandling DEFAULT = new SubPackageHandling(Collections.<Entry>emptyList());
+
+    private final List<Entry> entries;
+
+    public SubPackageHandling() {
+        this(new LinkedList<Entry>());
+    }
+
+    private SubPackageHandling(List<Entry> entries) {
+        this.entries = entries;
+    }
+
+    /**
+     * Parses a options string as described above and returns a new SubPackageHandling instance.
+     * @param str the string to parse
+     * @return the configuration or {@code null} if the string is malformed.
+     */
+    public static SubPackageHandling fromString(String str) {
+        if (str == null || str.isEmpty()) {
+            return SubPackageHandling.DEFAULT;
+        }
+        SubPackageHandling sp = new SubPackageHandling();
+        for (String instruction: Text.explode(str, ',')) {
+            String[] opts = Text.explode(instruction.trim(), ';');
+            if (opts.length >  0) {
+                PackageId id = PackageId.fromString(opts[0]);
+                Option opt = Option.INSTALL;
+                if (opts.length > 1) {
+                    try {
+                        opt = Option.valueOf(opts[1].toUpperCase());
+                    } catch (IllegalArgumentException e) {
+                        // ignore
+                    }
+                }
+                sp.getEntries().add(new Entry(id.getGroup(), id.getName(), opt));
+            }
+        }
+        return sp;
+    }
+
+    /**
+     * Gets the option from the entries list that matches the package last. If no entry match, it returns
+     * {@link org.apache.jackrabbit.vault.packaging.SubPackageHandling.Option#INSTALL}
+     * @param id the package id to match
+     * @return the option.
+     */
+    public Option getOption(PackageId id) {
+        Option opt = null;
+        for (Entry e: entries) {
+            if (!"*".equals(e.groupName) && !id.getGroup().equals(e.groupName)) {
+                continue;
+            }
+            if (!"*".equals(e.packageName) && !id.getName().equals(e.packageName)) {
+                continue;
+            }
+            opt = e.option;
+        }
+        return opt == null ? Option.INSTALL : opt;
+    }
+
+    /**
+     * Returns the modifiable list of entries.
+     * @return the list of entries
+     */
+    public List<Entry> getEntries() {
+        return entries;
+    }
+
+    /**
+     * Returns the parseable string representation of this configuration.
+     * @return the string representation.
+     */
+    public String getString() {
+        StringBuilder sb = new StringBuilder();
+        for (Entry e: entries) {
+            if (sb.length() > 0) {
+                sb.append(",");
+            }
+            sb.append(e.getGroupName()).append(":").append(e.getPackageName());
+            if (e.option != Option.INSTALL) {
+                sb.append(';').append(e.option.toString().toLowerCase());
+            }
+        }
+        return sb.toString();
+    }
+}
\ No newline at end of file

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=1569209&r1=1569208&r2=1569209&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 Feb 18 06:19:43 2014
@@ -48,6 +48,7 @@ import org.apache.jackrabbit.vault.packa
 import org.apache.jackrabbit.vault.packaging.JcrPackageDefinition;
 import org.apache.jackrabbit.vault.packaging.PackageException;
 import org.apache.jackrabbit.vault.packaging.PackageId;
+import org.apache.jackrabbit.vault.packaging.SubPackageHandling;
 import org.apache.jackrabbit.vault.packaging.VaultPackage;
 import org.apache.jackrabbit.vault.util.JcrConstants;
 import org.apache.jackrabbit.vault.util.Text;
@@ -380,7 +381,7 @@ public class JcrPackageImpl implements J
         // get a copy of the import options (bug 35164)
         ImportOptions opts = options.copy();
         // check for disable intermediate saves (GRANITE-1047)
-        if ( this.getDefinition().getBoolean(JcrPackageDefinition.PN_DISABLE_INTERMEDIATE_SAVE) ) {
+        if (this.getDefinition().getBoolean(JcrPackageDefinition.PN_DISABLE_INTERMEDIATE_SAVE) ) {
             // MAX_VALUE disables saving completely, therefore we have to use a lower value!
             opts.setAutoSaveThreshold(Integer.MAX_VALUE - 1);
         }
@@ -427,10 +428,21 @@ public class JcrPackageImpl implements J
                     throw e;
                 }
             }
-            String[] subIds = new String[subPacks.size()];
-            int i=0;
+            List<String> subIds = new LinkedList<String>();
+            SubPackageHandling sb = pack.getSubPackageHandling();
             for (JcrPackageImpl p: subPacks) {
-                String msg = "Starting extraction of subpackage " + p.getPackage().getId();
+                boolean skip = false;
+                PackageId id = p.getPackage().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;
+                }
                 if (options.isDryRun()) {
                     msg = "Dry run: " + msg;
                 }
@@ -439,13 +451,19 @@ public class JcrPackageImpl implements J
                 } else {
                     log.info(msg);
                 }
-                p.extract(options, createSnapshot, true);
+                if (!skip) {
+                    if (createSnapshot && option == SubPackageHandling.Option.INSTALL) {
+                        p.extract(options, true, true);
+                        subIds.add(id.toString());
+                    } else {
+                        p.extract(options, false, true);
+                    }
+                }
                 p.close();
-                subIds[i++] = p.getDefinition().getId().toString();
             }
             // register sub packages in snapshot for uninstall
             if (snap != null) {
-                snap.getDefinition().getNode().setProperty(JcrPackageDefinition.PN_SUB_PACKAGES, subIds);
+                snap.getDefinition().getNode().setProperty(JcrPackageDefinition.PN_SUB_PACKAGES, subIds.toArray(new String[subIds.size()]));
                 snap.getDefinition().getNode().save();
             }
         }

Modified: jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/impl/PackagePropertiesImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/impl/PackagePropertiesImpl.java?rev=1569209&r1=1569208&r2=1569209&view=diff
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/impl/PackagePropertiesImpl.java (original)
+++ jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/impl/PackagePropertiesImpl.java Tue Feb 18 06:19:43 2014
@@ -25,6 +25,7 @@ import org.apache.jackrabbit.vault.fs.io
 import org.apache.jackrabbit.vault.packaging.Dependency;
 import org.apache.jackrabbit.vault.packaging.PackageId;
 import org.apache.jackrabbit.vault.packaging.PackageProperties;
+import org.apache.jackrabbit.vault.packaging.SubPackageHandling;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -132,6 +133,13 @@ public abstract class PackagePropertiesI
     /**
      * {@inheritDoc}
      */
+    public SubPackageHandling getSubPackageHandling() {
+        return SubPackageHandling.fromString(getProperty(NAME_SUB_PACKAGE_HANDLING));
+    }
+
+    /**
+     * {@inheritDoc}
+     */
     public boolean requiresRoot() {
         return "true".equals(getProperty(NAME_REQUIRES_ROOT));
     }

Added: 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=1569209&view=auto
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/SubPackageHandlingTest.java (added)
+++ jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/SubPackageHandlingTest.java Tue Feb 18 06:19:43 2014
@@ -0,0 +1,93 @@
+/*
+ * 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.jackrabbit.vault.packaging;
+
+import junit.framework.TestCase;
+
+/**
+ * <code>SubPackageHandlingTest</code>...
+ */
+public class SubPackageHandlingTest extends TestCase {
+
+    public void testDefault() {
+        SubPackageHandling sp = new SubPackageHandling();
+        assertEquals(SubPackageHandling.Option.INSTALL, sp.getOption(PackageId.fromString("foo:bar")));
+        assertEquals(SubPackageHandling.Option.INSTALL, sp.getOption(PackageId.fromString("foo:bar:1.0")));
+    }
+
+    public void testStaticDefault() {
+        SubPackageHandling sp = SubPackageHandling.DEFAULT;
+        assertEquals(SubPackageHandling.Option.INSTALL, sp.getOption(PackageId.fromString("foo:bar")));
+        assertEquals(SubPackageHandling.Option.INSTALL, sp.getOption(PackageId.fromString("foo:bar:1.0")));
+    }
+
+    public void testMatchAll() {
+        SubPackageHandling sp = new SubPackageHandling();
+        sp.getEntries().add(new SubPackageHandling.Entry("*", "*", SubPackageHandling.Option.ADD));
+        assertEquals(SubPackageHandling.Option.ADD, sp.getOption(PackageId.fromString("foo:bar")));
+        assertEquals(SubPackageHandling.Option.ADD, sp.getOption(PackageId.fromString("foo:bar:1.0")));
+    }
+
+    public void testMatchAllGroup() {
+        SubPackageHandling sp = new SubPackageHandling();
+        sp.getEntries().add(new SubPackageHandling.Entry("foo", "*", SubPackageHandling.Option.ADD));
+        assertEquals(SubPackageHandling.Option.ADD, sp.getOption(PackageId.fromString("foo:bar")));
+        assertEquals(SubPackageHandling.Option.ADD, sp.getOption(PackageId.fromString("foo:baz")));
+        assertEquals(SubPackageHandling.Option.INSTALL, sp.getOption(PackageId.fromString("noo:bar:1.0")));
+    }
+
+    public void testMatchAllPackage() {
+        SubPackageHandling sp = new SubPackageHandling();
+        sp.getEntries().add(new SubPackageHandling.Entry("*", "bar", SubPackageHandling.Option.ADD));
+        assertEquals(SubPackageHandling.Option.ADD, sp.getOption(PackageId.fromString("foo:bar")));
+        assertEquals(SubPackageHandling.Option.ADD, sp.getOption(PackageId.fromString("loo:bar")));
+        assertEquals(SubPackageHandling.Option.INSTALL, sp.getOption(PackageId.fromString("foo:baz:1.0")));
+    }
+
+    public void testMatchSpecific() {
+        SubPackageHandling sp = new SubPackageHandling();
+        sp.getEntries().add(new SubPackageHandling.Entry("foo", "bar", SubPackageHandling.Option.ADD));
+        assertEquals(SubPackageHandling.Option.ADD, sp.getOption(PackageId.fromString("foo:bar")));
+        assertEquals(SubPackageHandling.Option.INSTALL, sp.getOption(PackageId.fromString("zoo:bar")));
+        assertEquals(SubPackageHandling.Option.INSTALL, sp.getOption(PackageId.fromString("foo:baz:1.0")));
+    }
+
+    public void testMatchOrder() {
+        SubPackageHandling sp = new SubPackageHandling();
+        sp.getEntries().add(new SubPackageHandling.Entry("foo", "*", SubPackageHandling.Option.ADD));
+        sp.getEntries().add(new SubPackageHandling.Entry("foo", "bar", SubPackageHandling.Option.EXTRACT));
+        assertEquals(SubPackageHandling.Option.ADD, sp.getOption(PackageId.fromString("foo:baz")));
+        assertEquals(SubPackageHandling.Option.EXTRACT, sp.getOption(PackageId.fromString("foo:bar")));
+    }
+
+    public void testParse() {
+        assertEquals("", SubPackageHandling.fromString("").getString());
+        assertEquals("foo:bar", SubPackageHandling.fromString("foo:bar").getString());
+        assertEquals("*:bar", SubPackageHandling.fromString("*:bar").getString());
+        assertEquals("*:bar", SubPackageHandling.fromString(":bar").getString());
+        assertEquals("*:bar", SubPackageHandling.fromString("bar").getString());
+        assertEquals("foo:*", SubPackageHandling.fromString("foo:*").getString());
+        assertEquals("*:*", SubPackageHandling.fromString("*:*").getString());
+        assertEquals("foo:bar;add", SubPackageHandling.fromString("foo:bar;add").getString());
+        assertEquals("foo:bar;extract", SubPackageHandling.fromString("foo:bar;extract").getString());
+        assertEquals("foo:bar;ignore", SubPackageHandling.fromString("foo:bar;ignore").getString());
+        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());
+    }
+}
\ No newline at end of file

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=1569209&r1=1569208&r2=1569209&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 Feb 18 06:19:43 2014
@@ -51,11 +51,62 @@ public class TestSubPackages extends Int
         assertNodeExists("/etc/packages/my_packages/sub_a.zip");
         assertNodeExists("/etc/packages/my_packages/sub_b.zip");
 
+        // check for snapshots
+        assertNodeMissing("/etc/packages/my_packages/.snapshot/sub_a.zip");
+        assertNodeMissing("/etc/packages/my_packages/.snapshot/sub_b.zip");
+
         assertNodeMissing("/tmp/a");
         assertNodeMissing("/tmp/b");
     }
 
     /**
+     * Installs a package that contains sub packages recursive but has a sub package handling that ignores A
+     */
+    @Test
+    public void testRecursiveIgnoreA() throws RepositoryException, IOException, PackageException {
+        JcrPackage pack = packMgr.upload(getStream("testpackages/subtest_ignore_a.zip"), false);
+        assertNotNull(pack);
+
+        // install
+        ImportOptions opts = getDefaultOptions();
+        opts.setNonRecursive(false);
+        pack.install(opts);
+
+        // check for sub packages
+        assertNodeExists("/etc/packages/my_packages/sub_a.zip"); // todo: ignore should ignore A completely
+        assertNodeExists("/etc/packages/my_packages/sub_b.zip");
+
+        assertNodeMissing("/tmp/a");
+        assertNodeExists("/tmp/b");
+    }
+
+    /**
+     * Installs a package that contains sub packages recursive but has a sub package handling that only extracts A
+     */
+    @Test
+    public void testRecursiveExtractA() throws RepositoryException, IOException, PackageException {
+        JcrPackage pack = packMgr.upload(getStream("testpackages/subtest_extract_a.zip"), false);
+        assertNotNull(pack);
+
+        // install
+        ImportOptions opts = getDefaultOptions();
+        opts.setNonRecursive(false);
+        pack.install(opts);
+
+        // check for sub packages
+        assertNodeExists("/etc/packages/my_packages/sub_a.zip");
+        assertNodeExists("/etc/packages/my_packages/sub_b.zip");
+
+        // check for snapshots
+        assertNodeMissing("/etc/packages/my_packages/.snapshot/sub_a.zip");
+        assertNodeExists("/etc/packages/my_packages/.snapshot/sub_b.zip");
+
+        assertNodeExists("/tmp/a");
+        assertNodeExists("/tmp/b");
+    }
+
+
+    /**
      * Installs a package that contains sub packages recursive
      */
     @Test
@@ -72,6 +123,10 @@ public class TestSubPackages extends Int
         assertNodeExists("/etc/packages/my_packages/sub_a.zip");
         assertNodeExists("/etc/packages/my_packages/sub_b.zip");
 
+        // check for snapshots
+        assertNodeExists("/etc/packages/my_packages/.snapshot/sub_a.zip");
+        assertNodeExists("/etc/packages/my_packages/.snapshot/sub_b.zip");
+
         assertNodeExists("/tmp/a");
         assertNodeExists("/tmp/b");
     }

Added: jackrabbit/commons/filevault/trunk/vault-core/src/test/resources/org/apache/jackrabbit/vault/packaging/integration/testpackages/subtest_extract_a.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_a.zip?rev=1569209&view=auto
==============================================================================
Files jackrabbit/commons/filevault/trunk/vault-core/src/test/resources/org/apache/jackrabbit/vault/packaging/integration/testpackages/subtest_extract_a.zip (added) and jackrabbit/commons/filevault/trunk/vault-core/src/test/resources/org/apache/jackrabbit/vault/packaging/integration/testpackages/subtest_extract_a.zip Tue Feb 18 06:19:43 2014 differ

Added: jackrabbit/commons/filevault/trunk/vault-core/src/test/resources/org/apache/jackrabbit/vault/packaging/integration/testpackages/subtest_ignore_a.zip
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-core/src/test/resources/org/apache/jackrabbit/vault/packaging/integration/testpackages/subtest_ignore_a.zip?rev=1569209&view=auto
==============================================================================
Files jackrabbit/commons/filevault/trunk/vault-core/src/test/resources/org/apache/jackrabbit/vault/packaging/integration/testpackages/subtest_ignore_a.zip (added) and jackrabbit/commons/filevault/trunk/vault-core/src/test/resources/org/apache/jackrabbit/vault/packaging/integration/testpackages/subtest_ignore_a.zip Tue Feb 18 06:19:43 2014 differ