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/07/27 08:28:21 UTC

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

Author: tripod
Date: Fri Jul 27 08:28:20 2018
New Revision: 1836790

URL: http://svn.apache.org/viewvc?rev=1836790&view=rev
Log:
JCRVLT-309 Create helper filter that allows to limit the installation paths

Added:
    jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/ScopedWorkspaceFilter.java
    jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/ScopedFilterTest.java
    jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/TestPackageScopedInstall.java
    jackrabbit/commons/filevault/trunk/vault-core/src/test/resources/org/apache/jackrabbit/vault/fs/filter/workspacefilters/mixed.xml
    jackrabbit/commons/filevault/trunk/vault-core/src/test/resources/org/apache/jackrabbit/vault/packaging/integration/testpackages/mixed_package.zip
Modified:
    jackrabbit/commons/filevault/trunk/RELEASE-NOTES.txt
    jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/io/Importer.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/integration/TestFSPackageRegistry.java

Modified: jackrabbit/commons/filevault/trunk/RELEASE-NOTES.txt
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/RELEASE-NOTES.txt?rev=1836790&r1=1836789&r2=1836790&view=diff
==============================================================================
--- jackrabbit/commons/filevault/trunk/RELEASE-NOTES.txt (original)
+++ jackrabbit/commons/filevault/trunk/RELEASE-NOTES.txt Fri Jul 27 08:28:20 2018
@@ -44,6 +44,7 @@ Improvements:
     * [JCRVLT-304] - Add tests that cover combinations of node and property filters
     * [JCRVLT-306] - Document properties.xml format
     * [JCRVLT-277] - vault-davex: cleanup dependencies - suppression of commons-httpclient
+    * [JCRVLT-309] - Create helper filter that allows to limit the installation paths
 
 Improvements:
     * [JCRVLT-282] - Filevault bundle should be Java 1.7 Compatible

Modified: jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/io/Importer.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/io/Importer.java?rev=1836790&r1=1836789&r2=1836790&view=diff
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/io/Importer.java (original)
+++ jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/io/Importer.java Fri Jul 27 08:28:20 2018
@@ -53,6 +53,7 @@ import org.apache.jackrabbit.vault.fs.ap
 import org.apache.jackrabbit.vault.fs.api.NodeNameList;
 import org.apache.jackrabbit.vault.fs.api.PathFilterSet;
 import org.apache.jackrabbit.vault.fs.api.PathMapping;
+import org.apache.jackrabbit.vault.fs.api.ProgressTrackerListener;
 import org.apache.jackrabbit.vault.fs.api.SerializationType;
 import org.apache.jackrabbit.vault.fs.api.VaultInputSource;
 import org.apache.jackrabbit.vault.fs.api.WorkspaceFilter;
@@ -417,6 +418,9 @@ public class Importer {
             registerPrivileges(session);
             log.debug("Starting content import. autosave is {}", autoSave);
             track("Importing content...", "");
+            if (tracker != null) {
+                tracker.setMode(ProgressTrackerListener.Mode.PATHS);
+            }
         }
         cpAutosave = autoSave.copy();
         LinkedList<TxInfo> skipList = new LinkedList<TxInfo>();
@@ -451,6 +455,9 @@ public class Importer {
                 }
             }
         }
+        if (tracker != null) {
+            tracker.setMode(ProgressTrackerListener.Mode.TEXT);
+        }
         checkinNodes(session);
         applyMemberships(session);
         applyPatches();

Added: jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/ScopedWorkspaceFilter.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/ScopedWorkspaceFilter.java?rev=1836790&view=auto
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/ScopedWorkspaceFilter.java (added)
+++ jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/ScopedWorkspaceFilter.java Fri Jul 27 08:28:20 2018
@@ -0,0 +1,232 @@
+/*
+ * 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.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+
+import org.apache.jackrabbit.vault.fs.api.DumpContext;
+import org.apache.jackrabbit.vault.fs.api.ImportMode;
+import org.apache.jackrabbit.vault.fs.api.PathFilter;
+import org.apache.jackrabbit.vault.fs.api.PathFilterSet;
+import org.apache.jackrabbit.vault.fs.api.PathMapping;
+import org.apache.jackrabbit.vault.fs.api.ProgressTrackerListener;
+import org.apache.jackrabbit.vault.fs.api.WorkspaceFilter;
+import org.apache.jackrabbit.vault.fs.config.ConfigurationException;
+import org.apache.jackrabbit.vault.fs.config.DefaultWorkspaceFilter;
+import org.apache.jackrabbit.vault.util.Text;
+import org.w3c.dom.Element;
+
+/**
+ * Workspace filter wrapper that limits the filter in- or outside certain paths.
+ * This is mostly used to limit the scope of mixed content packages to either application or content.
+ */
+public class ScopedWorkspaceFilter extends DefaultWorkspaceFilter {
+
+    private static final String[] APP_ROOTS = {"/apps", "/libs" };
+
+    private final DefaultWorkspaceFilter base;
+
+    private final boolean allow;
+
+    private final String[] roots;
+
+    private final List<PathFilterSet> nodesFilterSets;
+
+    private final List<PathFilterSet> propsFilterSets;
+
+    public ScopedWorkspaceFilter(DefaultWorkspaceFilter base, boolean allow, String[] roots) {
+        this.base = base;
+        this.allow = allow;
+        this.roots = roots;
+
+        List<PathFilterSet> nodesFilterSets = new ArrayList<>();
+        List<PathFilterSet> propsFilterSets = new ArrayList<>();
+        for (PathFilterSet set: base.getFilterSets()) {
+            String root = set.getRoot();
+            if ("/".equals(root) || match(root)) {
+                nodesFilterSets.add(set);
+            }
+        }
+        for (PathFilterSet set: base.getPropertyFilterSets()) {
+            String root = set.getRoot();
+            if ("/".equals(root) || match(root)) {
+                propsFilterSets.add(set);
+            }
+        }
+        this.nodesFilterSets = Collections.unmodifiableList(nodesFilterSets);
+        this.propsFilterSets = Collections.unmodifiableList(propsFilterSets);
+    }
+
+    private boolean match(String path) {
+        if (allow) {
+            for (String root: roots) {
+                if (Text.isDescendantOrEqual(root, path)) {
+                    return true;
+                }
+            }
+            return false;
+        }
+
+        for (String root: roots) {
+            if (Text.isDescendantOrEqual(root, path)) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    public static ScopedWorkspaceFilter createApplicationScoped(DefaultWorkspaceFilter base) {
+        return new ScopedWorkspaceFilter(base, true, APP_ROOTS);
+    }
+
+    public static ScopedWorkspaceFilter createContentScoped(DefaultWorkspaceFilter base) {
+        return new ScopedWorkspaceFilter(base, false, APP_ROOTS);
+    }
+
+    @Override
+    public void add(PathFilterSet set) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public void add(PathFilterSet nodeFilter, PathFilterSet propFilter) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public void addPropertyFilterSet(PathFilterSet set) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public List<PathFilterSet> getFilterSets() {
+        return nodesFilterSets;
+    }
+
+    @Override
+    public List<PathFilterSet> getPropertyFilterSets() {
+        return propsFilterSets;
+    }
+
+    @Override
+    public PathFilterSet getCoveringFilterSet(String path) {
+        if (!match(path)) {
+            return null;
+        }
+        return base.getCoveringFilterSet(path);
+    }
+
+    @Override
+    public ImportMode getImportMode(String path) {
+        return base.getImportMode(path);
+    }
+
+    @Override
+    public void setImportMode(ImportMode importMode) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public boolean contains(String path) {
+        return match(path) && base.contains(path);
+    }
+
+    @Override
+    public boolean covers(String path) {
+        return match(path) && base.covers(path);
+    }
+
+    @Override
+    public boolean isAncestor(String path) {
+        for (PathFilterSet set: nodesFilterSets) {
+            if (set.isAncestor(path)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    @Override
+    public boolean isGloballyIgnored(String path) {
+        return base.isGloballyIgnored(path);
+    }
+
+    @Override
+    public WorkspaceFilter translate(PathMapping mapping) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public void load(File file) throws IOException, ConfigurationException {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public InputStream getSource() {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public String getSourceAsString() {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public void load(InputStream in) throws IOException, ConfigurationException {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    protected PathFilter readFilter(Element elem) throws ConfigurationException {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public void dump(DumpContext ctx, boolean isLast) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public void resetSource() {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public void setGlobalIgnored(PathFilter ignored) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public void dumpCoverage(Node rootNode, ProgressTrackerListener listener) throws RepositoryException {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public void dumpCoverage(Session session, ProgressTrackerListener listener, boolean skipJcrContent) throws RepositoryException {
+        throw new UnsupportedOperationException();
+    }
+}

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=1836790&r1=1836789&r2=1836790&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 Fri Jul 27 08:28:20 2018
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-@Version("2.7.0")
+@Version("2.8.0")
 package org.apache.jackrabbit.vault.packaging;
 
 import org.osgi.annotation.versioning.Version;
\ No newline at end of file

Added: jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/ScopedFilterTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/ScopedFilterTest.java?rev=1836790&view=auto
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/ScopedFilterTest.java (added)
+++ jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/ScopedFilterTest.java Fri Jul 27 08:28:20 2018
@@ -0,0 +1,64 @@
+/*
+ * 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.io.IOException;
+import java.util.List;
+
+import org.apache.jackrabbit.vault.fs.api.PathFilterSet;
+import org.apache.jackrabbit.vault.fs.config.ConfigurationException;
+import org.apache.jackrabbit.vault.fs.config.DefaultWorkspaceFilter;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+public class ScopedFilterTest {
+
+    @Test
+    public void testApplicationScoped() throws IOException, ConfigurationException {
+        DefaultWorkspaceFilter base = new DefaultWorkspaceFilter();
+        base.load(getClass().getResourceAsStream("../fs/filter/workspacefilters/mixed.xml"));
+
+        ScopedWorkspaceFilter filter = ScopedWorkspaceFilter.createApplicationScoped(base);
+
+        List<PathFilterSet> sets = filter.getFilterSets();
+        assertEquals("/apps/myproject/foo", sets.get(0).getRoot());
+        assertEquals("/libs/jackrabbit", sets.get(1).getRoot());
+        assertEquals("/", sets.get(2).getRoot());
+
+        assertTrue(filter.contains("/libs/jackrabbit/bar/test"));
+        assertFalse(filter.contains("/bar"));
+    }
+
+    @Test
+    public void testContentScoped() throws IOException, ConfigurationException {
+        DefaultWorkspaceFilter base = new DefaultWorkspaceFilter();
+        base.load(getClass().getResourceAsStream("../fs/filter/workspacefilters/mixed.xml"));
+
+        ScopedWorkspaceFilter filter = ScopedWorkspaceFilter.createContentScoped(base);
+
+        List<PathFilterSet> sets = filter.getFilterSets();
+        assertEquals("/bar", sets.get(0).getRoot());
+        assertEquals("/", sets.get(1).getRoot());
+
+        assertFalse(filter.contains("/libs/jackrabbit/bar/test"));
+        assertTrue(filter.contains("/bar"));
+    }
+}

Modified: jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/TestFSPackageRegistry.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/TestFSPackageRegistry.java?rev=1836790&r1=1836789&r2=1836790&view=diff
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/TestFSPackageRegistry.java (original)
+++ jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/TestFSPackageRegistry.java Fri Jul 27 08:28:20 2018
@@ -511,8 +511,8 @@ public class TestFSPackageRegistry exten
         Calendar after = Calendar.getInstance();
         assertFalse(plan.hasErrors());
 
-        assertTrue("Installation time for idC too late", registry.open(idC).getInstallationTime().compareTo(after) < 0);
-        assertTrue("Installation time for idC too early", registry.open(idC).getInstallationTime().compareTo(before) > 0);
+        assertTrue("Installation time for idC too late", registry.open(idC).getInstallationTime().compareTo(after) <= 0);
+        assertTrue("Installation time for idC too early", registry.open(idC).getInstallationTime().compareTo(before) >= 0);
 
     }
     

Added: jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/TestPackageScopedInstall.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/TestPackageScopedInstall.java?rev=1836790&view=auto
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/TestPackageScopedInstall.java (added)
+++ jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/TestPackageScopedInstall.java Fri Jul 27 08:28:20 2018
@@ -0,0 +1,107 @@
+/*
+ * 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.integration;
+
+import java.io.IOException;
+
+import javax.jcr.RepositoryException;
+
+import org.apache.jackrabbit.vault.fs.config.DefaultWorkspaceFilter;
+import org.apache.jackrabbit.vault.fs.io.ImportOptions;
+import org.apache.jackrabbit.vault.packaging.JcrPackage;
+import org.apache.jackrabbit.vault.packaging.PackageException;
+import org.apache.jackrabbit.vault.packaging.ScopedWorkspaceFilter;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.junit.Assert.assertNotNull;
+
+/**
+ * {@code TestPackageInstall}...
+ */
+public class TestPackageScopedInstall extends IntegrationTestBase {
+
+    @Before
+    public void beforeEach() {
+        clean("/libs");
+        clean("/tmp");
+    }
+
+    /**
+     * Installs a package that contains mixed content
+     */
+    @Test
+    public void testMixedContent() throws RepositoryException, IOException, PackageException {
+        assertNodeMissing("/libs/foo");
+        assertNodeMissing("/tmp/foo");
+
+        JcrPackage pack = packMgr.upload(getStream("testpackages/mixed_package.zip"), false);
+        assertNotNull(pack);
+
+        // just extract - no snapshots
+        ImportOptions opts = getDefaultOptions();
+        pack.extract(opts);
+        assertNodeExists("/tmp/foo");
+        assertNodeExists("/libs/foo");
+    }
+
+    /**
+     * Installs a package that contains mixed content but filtered for apps
+     */
+    @Test
+    public void testApplication() throws RepositoryException, IOException, PackageException {
+        assertNodeMissing("/libs/foo");
+        assertNodeMissing("/tmp/foo");
+
+        JcrPackage pack = packMgr.upload(getStream("testpackages/mixed_package.zip"), false);
+        assertNotNull(pack);
+
+        // just extract - no snapshots
+        ScopedWorkspaceFilter filter = ScopedWorkspaceFilter.createApplicationScoped(
+                (DefaultWorkspaceFilter) pack.getDefinition().getMetaInf().getFilter());
+
+        ImportOptions opts = getDefaultOptions();
+        opts.setFilter(filter);
+        pack.extract(opts);
+        assertNodeMissing("/tmp/foo");
+        assertNodeExists("/libs/foo");
+    }
+
+    /**
+     * Installs a package that contains mixed content but filtered for content
+     */
+    @Test
+    public void testContent() throws RepositoryException, IOException, PackageException {
+        assertNodeMissing("/libs/foo");
+        assertNodeMissing("/tmp/foo");
+
+        JcrPackage pack = packMgr.upload(getStream("testpackages/mixed_package.zip"), false);
+        assertNotNull(pack);
+
+        // just extract - no snapshots
+        ScopedWorkspaceFilter filter = ScopedWorkspaceFilter.createContentScoped((
+                DefaultWorkspaceFilter) pack.getDefinition().getMetaInf().getFilter());
+        ImportOptions opts = getDefaultOptions();
+        opts.setFilter(filter);
+        pack.extract(opts);
+        assertNodeExists("/tmp/foo");
+        assertNodeMissing("/libs/foo");
+    }
+
+
+}
\ No newline at end of file

Added: jackrabbit/commons/filevault/trunk/vault-core/src/test/resources/org/apache/jackrabbit/vault/fs/filter/workspacefilters/mixed.xml
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-core/src/test/resources/org/apache/jackrabbit/vault/fs/filter/workspacefilters/mixed.xml?rev=1836790&view=auto
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-core/src/test/resources/org/apache/jackrabbit/vault/fs/filter/workspacefilters/mixed.xml (added)
+++ jackrabbit/commons/filevault/trunk/vault-core/src/test/resources/org/apache/jackrabbit/vault/fs/filter/workspacefilters/mixed.xml Fri Jul 27 08:28:20 2018
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ 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.
+  -->
+<workspaceFilter version="1.0">
+    <filter root="/bar" mode="merge" type="cleanup"/>
+    <filter root="/apps/myproject/foo" />
+    <filter root="/libs/jackrabbit">
+        <include pattern="/libs/jackrabbit/foo(/.*)?" />
+    </filter>
+    <filter root="/">
+        <include pattern="/libs/jackrabbit/bar(/.*)?" />
+    </filter>
+</workspaceFilter>

Added: jackrabbit/commons/filevault/trunk/vault-core/src/test/resources/org/apache/jackrabbit/vault/packaging/integration/testpackages/mixed_package.zip
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-core/src/test/resources/org/apache/jackrabbit/vault/packaging/integration/testpackages/mixed_package.zip?rev=1836790&view=auto
==============================================================================
Binary files jackrabbit/commons/filevault/trunk/vault-core/src/test/resources/org/apache/jackrabbit/vault/packaging/integration/testpackages/mixed_package.zip (added) and jackrabbit/commons/filevault/trunk/vault-core/src/test/resources/org/apache/jackrabbit/vault/packaging/integration/testpackages/mixed_package.zip Fri Jul 27 08:28:20 2018 differ