You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by to...@apache.org on 2017/07/28 09:01:25 UTC

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

Author: tommaso
Date: Fri Jul 28 09:01:25 2017
New Revision: 1803252

URL: http://svn.apache.org/viewvc?rev=1803252&view=rev
Log:
JCRVLT-196 - this closes apache/jackrabbit-filevault#12

Added:
    jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/api/RegexpPathMapping.java   (with props)
    jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/io/MappedArchive.java   (with props)
Modified:
    jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/api/package-info.java
    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/fs/io/package-info.java
    jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/fs/api/PathMappingTest.java
    jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/TestMappedImport.java
    jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/TestPackageInstall.java

Added: jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/api/RegexpPathMapping.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/api/RegexpPathMapping.java?rev=1803252&view=auto
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/api/RegexpPathMapping.java (added)
+++ jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/api/RegexpPathMapping.java Fri Jul 28 09:01:25 2017
@@ -0,0 +1,112 @@
+/*
+ * 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.fs.api;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.apache.jackrabbit.vault.fs.api.PathMapping;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+/**
+ * Implements a path mapping that supports regular expressions, i.e. {@code /etc/(.*)=/dummy/$1/custom}
+ * @since 3.1.42
+ */
+public final class RegexpPathMapping implements PathMapping {
+
+    private final Map<Pattern, String> pathsMapping = new HashMap<Pattern, String>();
+
+    /**
+     * Allows importing mappings specified in data structure such as Map or Properties.
+     *
+     * All null entries (both keys and values) are ignored.
+     *
+     * @param pathsMappingMap the data structure containing the mapping
+     * @return this
+     */
+    public <K, V> RegexpPathMapping addAllMappings(@Nonnull Map<K, V> pathsMappingMap) {
+        for (Entry<K, V> entry : pathsMappingMap.entrySet()) {
+            final K key = entry.getKey();
+            final V value = entry.getValue();
+            if (key != null && value != null) {
+                addMapping(String.valueOf(key), String.valueOf(value));
+            }
+        }
+        return this;
+    }
+
+    /**
+     * Add a new mapping based on regular expression.
+     *
+     * @param fromPattern the matching pattern, i.e. <code>/etc/(.*)</code>
+     * @param toPattern the replacing pattern, i.e. <code>/dummy/$1/custom</code>
+     * @return this
+     */
+    @Nonnull
+    public RegexpPathMapping addMapping(@Nonnull String fromPattern, @Nonnull String toPattern) {
+        pathsMapping.put(Pattern.compile(fromPattern), toPattern);
+        return this;
+    }
+
+    /**
+     * Merges the regexp mapping from the given base mapping.
+     *
+     * @param base base mapping
+     * @return this
+     */
+    @Nonnull
+    public RegexpPathMapping merge(@Nullable RegexpPathMapping base) {
+        if (base != null) {
+            this.pathsMapping.putAll(base.pathsMapping);
+        }
+        return this;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    @Nonnull
+    public String map(@Nonnull String path) {
+        return map(path, false);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    @Nonnull
+    public String map(@Nonnull String path, boolean reverse) {
+        if (reverse) {
+            throw new IllegalArgumentException("path mapping cannot be reversed with the regexp mapping");
+        } else {
+            for (Entry<Pattern, String> pathMapping : pathsMapping.entrySet()) {
+                Matcher matcher = pathMapping.getKey().matcher(path);
+                if (matcher.matches()) {
+                    return matcher.replaceAll(pathMapping.getValue());
+                }
+            }
+            return path;
+        }
+    }
+
+}

Propchange: jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/api/RegexpPathMapping.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/api/package-info.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/api/package-info.java?rev=1803252&r1=1803251&r2=1803252&view=diff
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/api/package-info.java (original)
+++ jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/api/package-info.java Fri Jul 28 09:01:25 2017
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-@Version("2.4.0")
+@Version("2.5.0")
 package org.apache.jackrabbit.vault.fs.api;
 
 import org.osgi.annotation.versioning.Version;
\ No newline at end of file

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=1803252&r1=1803251&r2=1803252&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 28 09:01:25 2017
@@ -227,11 +227,6 @@ public class Importer {
     private final ImportOptions opts;
 
     /**
-     * path mapping from the import options
-     */
-    private PathMapping pathMapping;
-
-    /**
      * the checkpoint state of the autosave. used for recovering from stale item errors during install.
      */
     private AutoSave cpAutosave;
@@ -366,11 +361,11 @@ public class Importer {
         }
 
         // check path remapping
-        pathMapping = opts.getPathMapping();
+        PathMapping pathMapping = opts.getPathMapping();
         if (pathMapping != null) {
             filter = filter.translate(pathMapping);
-        } else {
-            pathMapping = PathMapping.IDENTITY;
+            this.archive = archive = new MappedArchive(archive, pathMapping);
+            this.archive.open(true);
         }
 
         // set import mode if possible
@@ -594,9 +589,7 @@ public class Importer {
     private void prepare(Archive.Entry directory, TxInfo parentInfo, NamespaceResolver resolver)
             throws IOException, RepositoryException {
         Collection<? extends Archive.Entry> files = directory.getChildren();
-        if (files == null) {
-            return;
-        }
+
         // first process the directories
         for (Archive.Entry file: files) {
             if (file.isDirectory()) {
@@ -612,19 +605,6 @@ public class Importer {
                     repoPath = parentInfo.path + "/" + repoName;
                 }
 
-                // remap if needed
-                String mappedPath = pathMapping.map(repoPath);
-                if (!mappedPath.equals(repoPath)) {
-                    String mappedParent = Text.getRelativeParent(mappedPath, 1);
-                    if (!mappedParent.equals(parentInfo.path)) {
-                        log.warn("remapping other than renames not supported yet ({} -> {}).", repoPath, mappedPath);
-                    } else {
-                        log.debug("remapping detected {} -> {}", repoPath, mappedPath);
-                        repoPath = mappedPath;
-                        repoName = Text.getName(repoPath);
-                    }
-                }
-
                 TxInfo info = parentInfo.addChild(new TxInfo(parentInfo, repoPath));
                 log.trace("Creating directory artifact for {}", repoName);
                 Artifact parent = new DirectoryArtifact(repoName);
@@ -676,19 +656,6 @@ public class Importer {
                     subPackages.add(repoPath);
                 }
 
-                // remap if needed
-                String mappedPath = pathMapping.map(repoPath);
-                if (!mappedPath.equals(repoPath)) {
-                    String mappedParent = Text.getRelativeParent(mappedPath, 1);
-                    if (!mappedParent.equals(parentInfo.path)) {
-                        log.warn("remapping other than renames not supported yet ({} -> {}).", repoPath, mappedPath);
-                    } else {
-                        log.debug("remapping detected {} -> {}", repoPath, mappedPath);
-                        repoPath = mappedPath;
-                        repoName = Text.getName(repoPath);
-                    }
-                }
-
                 String repoBase = repoName;
                 String ext = "";
                 int idx = repoName.lastIndexOf('.');

Added: jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/io/MappedArchive.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/io/MappedArchive.java?rev=1803252&view=auto
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/io/MappedArchive.java (added)
+++ jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/io/MappedArchive.java Fri Jul 28 09:01:25 2017
@@ -0,0 +1,246 @@
+/*
+ * 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.fs.io;
+
+import org.apache.jackrabbit.vault.fs.api.PathMapping;
+import org.apache.jackrabbit.vault.fs.api.VaultInputSource;
+import org.apache.jackrabbit.vault.fs.config.MetaInf;
+import org.apache.jackrabbit.vault.util.Text;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.annotation.CheckForNull;
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+/**
+ * Implements an archive that remaps the entries of an underlying archive using a {@link PathMapping}.
+ */
+public class MappedArchive extends AbstractArchive {
+
+    /**
+     * default logger
+     */
+    private static final Logger log = LoggerFactory.getLogger(MappedArchive.class);
+
+    private final Archive base;
+
+    private final PathMapping mapping;
+
+    private final VirtualEntry root = new VirtualEntry();
+
+    private VirtualEntry jcrRoot;
+
+    public MappedArchive(Archive base, PathMapping mapping) {
+        this.base = base;
+        this.mapping = mapping;
+    }
+
+    @Override
+    public void open(boolean strict) throws IOException {
+        base.open(strict);
+        applyMapping(base.getRoot(), root);
+    }
+
+    /**
+     * Decorates the non jcr files without applying the mapping. this can be done with parallel traversal.
+     * @param src source entry parent
+     * @param dst destination entry parent
+     */
+    private void applyMapping(@Nonnull Entry src, @Nonnull VirtualEntry dst) {
+        for (Entry child: src.getChildren()) {
+            VirtualEntry dstChild = dst.add(child.getName(), child);
+            if ("/jcr_root".equals(dstChild.getPath())) {
+                jcrRoot = dstChild;
+                applyMapping(child, "");
+            } else {
+                applyMapping(child, dstChild);
+            }
+        }
+    }
+
+    /**
+     * Decorates the jcr entries while applying the path mapping. this cannot be done with parallel traversal, because
+     * the remapping could create holes in the entry tree.
+     *
+     * @param src the source entry
+     * @param jcrPath the jcr path of the source entry
+     */
+    private void applyMapping(@Nonnull Entry src, @Nonnull String jcrPath) {
+        for (Entry child: src.getChildren()) {
+            String path = jcrPath + "/" + child.getName();
+            String mappedPath = mapping.map(path);
+
+            // add entry to tree
+            String[] segments = Text.explode(mappedPath, '/');
+            VirtualEntry entry = jcrRoot;
+            for (String seg: segments) {
+                entry = entry.add(seg, null);
+            }
+            if (entry.baseEntry != null) {
+                log.warn("Path mapping maps multiple paths to the same destination: {} -> {}. ignoring this source.", path, mappedPath);
+            } else {
+                entry.baseEntry = child;
+            }
+
+            applyMapping(child, path);
+        }
+    }
+
+    @Override
+    @CheckForNull
+    public InputStream openInputStream(@Nullable Entry entry) throws IOException {
+        if (entry == null) {
+            return null;
+        }
+        return base.openInputStream(((VirtualEntry) entry).baseEntry);
+    }
+
+    @Override
+    @CheckForNull
+    public VaultInputSource getInputSource(@Nullable Entry entry) throws IOException {
+        if (entry == null) {
+            return null;
+        }
+        return base.getInputSource(((VirtualEntry) entry).baseEntry);
+    }
+
+    @Override
+    @Nonnull
+    public Entry getRoot() throws IOException {
+        return root;
+    }
+
+    @Override
+    public Entry getJcrRoot() throws IOException {
+        return jcrRoot;
+    }
+
+    @Override
+    @Nonnull
+    public MetaInf getMetaInf() {
+        return base.getMetaInf();
+    }
+
+    @Override
+    public void close() {
+        base.close();
+    }
+
+    /**
+     * Implements a entry for this archive
+     */
+    private static class VirtualEntry implements Entry {
+
+        @Nullable
+        private final VirtualEntry parent;
+
+        @Nonnull
+        private final String name;
+
+        @Nullable
+        private Archive.Entry baseEntry;
+
+        @Nullable
+        private Map<String, VirtualEntry> children;
+
+        private VirtualEntry() {
+            this.parent = null;
+            this.name = "";
+            this.baseEntry = null;
+        }
+
+        private VirtualEntry(@Nonnull VirtualEntry parent, @Nonnull String name, @Nullable Archive.Entry baseEntry) {
+            this.parent = parent;
+            this.name = name;
+            this.baseEntry = baseEntry;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        @Nonnull
+        public String getName() {
+            return name;
+        }
+
+        @Nonnull
+        public String getPath() {
+            return getPath(new StringBuilder()).toString();
+        }
+
+        @Nonnull
+        private StringBuilder getPath(@Nonnull StringBuilder sb) {
+            return parent == null ? sb : parent.getPath(sb).append('/').append(name);
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public boolean isDirectory() {
+            return baseEntry == null || baseEntry.isDirectory();
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        @Nonnull
+        public Collection<? extends Entry> getChildren() {
+            return children == null ? Collections.<Entry>emptyList() : children.values();
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        @Nullable
+        public Entry getChild(String name) {
+            return children == null ? null : children.get(name);
+        }
+
+        /**
+         * Adds a new child entry.
+         * @param name name
+         * @param baseEntry the base archive's entry or
+         * @return the new entry
+         */
+        @Nonnull
+        public VirtualEntry add(@Nonnull String name, @Nullable Archive.Entry baseEntry) {
+            if (children != null) {
+                VirtualEntry ret = children.get(name);
+                if (ret != null) {
+                    return ret;
+                }
+            }
+            VirtualEntry ve = new VirtualEntry(this, name, baseEntry);
+            if (children == null) {
+                children = new LinkedHashMap<String, VirtualEntry>();
+            }
+            children.put(name, ve);
+            return ve;
+        }
+    }
+}
\ No newline at end of file

Propchange: jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/io/MappedArchive.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/io/package-info.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/io/package-info.java?rev=1803252&r1=1803251&r2=1803252&view=diff
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/io/package-info.java (original)
+++ jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/io/package-info.java Fri Jul 28 09:01:25 2017
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-@Version("2.5.0")
+@Version("2.6.0")
 package org.apache.jackrabbit.vault.fs.io;
 
 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/fs/api/PathMappingTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/fs/api/PathMappingTest.java?rev=1803252&r1=1803251&r2=1803252&view=diff
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/fs/api/PathMappingTest.java (original)
+++ jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/fs/api/PathMappingTest.java Fri Jul 28 09:01:25 2017
@@ -16,6 +16,8 @@
  */
 package org.apache.jackrabbit.vault.fs.api;
 
+import static org.junit.Assert.assertEquals;
+
 import org.junit.Test;
 
 import static junit.framework.Assert.assertEquals;
@@ -77,4 +79,19 @@ public class PathMappingTest {
         assertEquals("/dest/foo/1/top/flop", map.map("/test/flop", true));
 
     }
+
+    @Test
+    public void testRegexpIdentityMapping() {
+        RegexpPathMapping pathMapping = new RegexpPathMapping();
+        assertEquals("/etc/my/fake/data", pathMapping.map("/etc/my/fake/data"));
+    }
+
+    @Test
+    public void testRegexpCorrectMapping() {
+        RegexpPathMapping pathMapping = new RegexpPathMapping();
+        pathMapping.addMapping("/etc/(.*)", "/dummy/$1/custom");
+
+        assertEquals("/dummy/my/fake/data/custom", pathMapping.map("/etc/my/fake/data"));
+    }
+
 }
\ No newline at end of file

Modified: jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/TestMappedImport.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/TestMappedImport.java?rev=1803252&r1=1803251&r2=1803252&view=diff
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/TestMappedImport.java (original)
+++ jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/TestMappedImport.java Fri Jul 28 09:01:25 2017
@@ -22,6 +22,7 @@ import java.io.IOException;
 import javax.jcr.RepositoryException;
 
 import org.apache.jackrabbit.vault.fs.api.MultiPathMapping;
+import org.apache.jackrabbit.vault.fs.api.RegexpPathMapping;
 import org.apache.jackrabbit.vault.fs.io.ImportOptions;
 import org.apache.jackrabbit.vault.packaging.JcrPackage;
 import org.apache.jackrabbit.vault.packaging.PackageException;
@@ -29,6 +30,8 @@ import org.apache.jackrabbit.vault.packa
 import org.junit.Ignore;
 import org.junit.Test;
 
+import static org.junit.Assert.assertNotNull;
+
 /**
  */
 public class TestMappedImport extends IntegrationTestBase {
@@ -167,7 +170,6 @@ public class TestMappedImport extends In
      * Tests if a non-trivial rename remapping works.
      * This is currently not supported
      */
-    @Ignore("JCRVLT-78")
     @Test
     public void testNonRename() throws RepositoryException, IOException, PackageException {
         JcrPackage pack = packMgr.upload(getStream("testpackages/tmp_foo.zip"), false);
@@ -178,7 +180,28 @@ public class TestMappedImport extends In
         opts.setPathMapping(mapping);
         pack.extract(opts);
 
-        assertNodeExists("/tmp/foo");
+        assertNodeMissing("/tmp/foo");
         assertNodeExists("/libs/foo");
     }
+
+    /**
+     * Tests if regexp remap works
+     */
+    @Test
+    public void  testInstallWithRegexp() throws RepositoryException, IOException, PackageException {
+        JcrPackage pack = packMgr.upload(getStream("testpackages/test_version.zip"), false);
+        assertNotNull(pack);
+
+        ImportOptions opts = getDefaultOptions();
+        RegexpPathMapping pathMapping = new RegexpPathMapping();
+        pathMapping.addMapping("/testroot/(.*)", "/root/$1");
+        opts.setPathMapping(pathMapping);
+
+        pack.install(opts);
+
+        assertNodeExists("/root/a");
+        assertNodeMissing("/testroot/a");
+    }
+
+
 }
\ No newline at end of file

Modified: jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/TestPackageInstall.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/TestPackageInstall.java?rev=1803252&r1=1803251&r2=1803252&view=diff
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/TestPackageInstall.java (original)
+++ jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/TestPackageInstall.java Fri Jul 28 09:01:25 2017
@@ -82,7 +82,7 @@ public class TestPackageInstall extends
      */
     @Test
     public void testUnwrapPreserveInstall() throws RepositoryException, IOException, PackageException {
-        
+
         JcrPackage pack = packMgr.upload(getStream("testpackages/tmp.zip"), true, true);
         assertNotNull(pack);
         assertTrue(pack.isValid());
@@ -106,7 +106,7 @@ public class TestPackageInstall extends
         assertTrue(pack.isValid());
         assertTrue(pack.isInstalled());
         assertEquals(lastUnpacked, pack.getDefinition().getLastUnpacked().getTimeInMillis());
-        
+
         // a package with a different created date should not preserve the status!
         pack = packMgr.upload(getStream("testpackages/tmp_with_modified_created_date.zip"), true, true);
         assertNotNull(pack);