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/12/01 14:01:12 UTC

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

Author: tripod
Date: Mon Dec  1 13:01:12 2014
New Revision: 1642676

URL: http://svn.apache.org/r1642676
Log:
JCRVLT-72 Add support for global remapping content during package installation.

- added initial support

Added:
    jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/TestMappedImport.java
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/fs/io/Importer.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=1642676&r1=1642675&r2=1642676&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 Mon Dec  1 13:01:12 2014
@@ -23,6 +23,7 @@ import java.util.regex.Pattern;
 import java.util.regex.PatternSyntaxException;
 
 import org.apache.jackrabbit.vault.fs.api.ImportMode;
+import org.apache.jackrabbit.vault.fs.api.PathMapping;
 import org.apache.jackrabbit.vault.fs.api.ProgressTrackerListener;
 import org.apache.jackrabbit.vault.fs.api.WorkspaceFilter;
 
@@ -57,6 +58,8 @@ public class ImportOptions {
 
     private ClassLoader hookClassLoader;
 
+    private PathMapping pathMapping = null;
+
     public ImportOptions() {
         // default constructor.
     }
@@ -81,6 +84,7 @@ public class ImportOptions {
             cndPattern = base.cndPattern;
             filter = base.filter;
             hookClassLoader = base.hookClassLoader;
+            pathMapping = base.pathMapping;
         }
     }
 
@@ -99,6 +103,7 @@ public class ImportOptions {
         ret.cndPattern = cndPattern;
         ret.filter = filter;
         ret.hookClassLoader = hookClassLoader;
+        ret.pathMapping = pathMapping;
         return ret;
     }
 
@@ -247,4 +252,23 @@ public class ImportOptions {
     public void setHookClassLoader(ClassLoader hookClassLoader) {
         this.hookClassLoader = hookClassLoader;
     }
+
+    /**
+     * Defines a path mapping that is applied to the incoming package paths and filter when installing the package.
+     *
+     * @since 3.1.14
+     * @return {@code null} if no path mapping is defined.
+     */
+    public PathMapping getPathMapping() {
+        return pathMapping;
+    }
+
+    /**
+     * Sets the path mapping
+     * @see #getPathMapping()
+     * @since 3.1.14
+     */
+    public void setPathMapping(PathMapping pathMapping) {
+        this.pathMapping = pathMapping;
+    }
 }
\ 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=1642676&r1=1642675&r2=1642676&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 Mon Dec  1 13:01:12 2014
@@ -225,6 +225,11 @@ 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;
@@ -358,6 +363,14 @@ public class Importer {
             filter = new DefaultWorkspaceFilter();
         }
 
+        // check path remapping
+        pathMapping = opts.getPathMapping();
+        if (pathMapping != null) {
+            filter = filter.translate(pathMapping);
+        } else {
+            pathMapping = PathMapping.IDENTITY;
+        }
+
         // set import mode if possible
         if (opts.getImportMode() != null) {
             if (filter instanceof DefaultWorkspaceFilter) {
@@ -596,6 +609,20 @@ public class Importer {
                     repoName = repoName.substring(0, repoName.length() - 4);
                     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.info("remapping detected {} -> {}", repoPath, mappedPath);
+                        repoPath = mappedPath;
+                        repoName = Text.getName(repoPath);
+                    }
+                }
+
                 TxInfo info = parentInfo.addChild(new TxInfo(parentInfo, repoPath));
                 log.debug("Creating directory artifact for {}", repoName);
                 Artifact parent = new DirectoryArtifact(repoName);
@@ -645,6 +672,20 @@ public class Importer {
                 if (repoPath.startsWith("/etc/packages/") && (repoPath.endsWith(".jar") || repoPath.endsWith(".zip"))) {
                     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.info("remapping detected {} -> {}", repoPath, mappedPath);
+                        repoPath = mappedPath;
+                        repoName = Text.getName(repoPath);
+                    }
+                }
+
                 String repoBase = repoName;
                 String ext = "";
                 int idx = repoName.lastIndexOf('.');
@@ -652,6 +693,7 @@ public class Importer {
                     repoBase = repoName.substring(0, idx);
                     ext = repoName.substring(idx);
                 }
+
                 SerializationType serType = SerializationType.GENERIC;
                 ArtifactType type = ArtifactType.PRIMARY;
                 VaultInputSource is = archive.getInputSource(file);

Added: 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=1642676&view=auto
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/TestMappedImport.java (added)
+++ jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/TestMappedImport.java Mon Dec  1 13:01:12 2014
@@ -0,0 +1,184 @@
+/*
+ * 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.api.MultiPathMapping;
+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.PackageId;
+import org.junit.Ignore;
+import org.junit.Test;
+
+/**
+ */
+public class TestMappedImport extends IntegrationTestBase {
+
+    @Test
+    public void testSimple() throws RepositoryException, IOException, PackageException {
+        JcrPackage pack = packMgr.upload(getStream("testpackages/tmp_foo.zip"), false);
+        ImportOptions opts = getDefaultOptions();
+
+        MultiPathMapping mapping = new MultiPathMapping();
+        mapping.link("/tmp/foo", "/tmp/mapped");
+        opts.setPathMapping(mapping);
+        pack.extract(opts);
+
+        assertNodeMissing("/tmp/foo");
+        assertNodeExists("/tmp/mapped");
+    }
+
+    /**
+     * Tests if uninstalling a remapped package works
+     */
+    @Ignore("JCRVLT-80")
+    @Test
+    public void testSimpleUninstall() throws RepositoryException, IOException, PackageException {
+        assertNodeMissing("/tmp/foo");
+        assertNodeMissing("/tmp/mapped");
+
+        JcrPackage pack = packMgr.upload(getStream("testpackages/tmp_foo.zip"), false);
+        PackageId id = pack.getDefinition().getId();
+        ImportOptions opts = getDefaultOptions();
+
+        MultiPathMapping mapping = new MultiPathMapping();
+        mapping.link("/tmp/foo", "/tmp/mapped");
+        opts.setPathMapping(mapping);
+        pack.install(opts);
+        pack.close();
+
+        assertNodeMissing("/tmp/foo");
+        assertNodeExists("/tmp/mapped");
+
+        pack = packMgr.open(id);
+        pack.uninstall(getDefaultOptions());
+        assertNodeMissing("/tmp/foo");
+        assertNodeMissing("/tmp/mapped");
+    }
+
+    /**
+     * Tests if installing the same package at multiple places works
+     */
+    @Test
+    public void testMultiInstall() throws RepositoryException, IOException, PackageException {
+        assertNodeMissing("/tmp/foo");
+        assertNodeMissing("/tmp/mapped0");
+        assertNodeMissing("/tmp/mapped1");
+
+        JcrPackage pack = packMgr.upload(getStream("testpackages/tmp_foo.zip"), false);
+        PackageId id = pack.getDefinition().getId();
+        ImportOptions opts = getDefaultOptions();
+
+        MultiPathMapping mapping = new MultiPathMapping();
+        mapping.link("/tmp/foo", "/tmp/mapped0");
+        opts.setPathMapping(mapping);
+        pack.install(opts);
+        pack.close();
+
+        assertNodeMissing("/tmp/foo");
+        assertNodeExists("/tmp/mapped0");
+
+        pack = packMgr.open(id);
+        opts = getDefaultOptions();
+        mapping = new MultiPathMapping();
+        mapping.link("/tmp/foo", "/tmp/mapped1");
+        opts.setPathMapping(mapping);
+        pack.install(opts);
+        pack.close();
+
+        assertNodeMissing("/tmp/foo");
+        assertNodeExists("/tmp/mapped1");
+
+    }
+
+    @Test
+    public void testSimpleDelete() throws RepositoryException, IOException, PackageException {
+        JcrPackage pack = packMgr.upload(getStream("testpackages/tmp_foo.zip"), false);
+        ImportOptions opts = getDefaultOptions();
+
+        MultiPathMapping mapping = new MultiPathMapping();
+        mapping.link("/tmp/foo", "/tmp/mapped");
+        opts.setPathMapping(mapping);
+        pack.extract(opts);
+
+        assertNodeMissing("/tmp/foo");
+        assertNodeExists("/tmp/mapped");
+
+        pack = packMgr.upload(getStream("testpackages/empty_tmp_foo.zip"), false);
+        pack.extract(opts);
+
+        assertNodeMissing("/tmp/mapped");
+    }
+
+    /**
+     * Tests if remapping within a generic artifact works.
+     * This is currently not implemented.
+     */
+    @Ignore("JCRVLT-79")
+    @Test
+    public void testGenericArtifact() throws RepositoryException, IOException, PackageException {
+        JcrPackage pack = packMgr.upload(getStream("testpackages/fullcoverage.zip"), false);
+        ImportOptions opts = getDefaultOptions();
+
+        MultiPathMapping mapping = new MultiPathMapping();
+        mapping.link("/tmp/fullcoverage/a", "/tmp/fullcoverage/mapped");
+        opts.setPathMapping(mapping);
+        pack.extract(opts);
+
+        assertNodeMissing("/tmp/fullcoverage/a");
+        assertNodeExists("/tmp/fullcoverage/mapped");
+    }
+
+    @Test
+    public void testNested() throws RepositoryException, IOException, PackageException {
+        JcrPackage pack = packMgr.upload(getStream("testpackages/tmp_foo.zip"), false);
+        ImportOptions opts = getDefaultOptions();
+
+        MultiPathMapping mapping = new MultiPathMapping();
+        mapping.link("/tmp/foo", "/tmp/mapped");
+        mapping.link("/tmp/mapped/bar/tobi", "/tmp/mapped/bar/roby");
+        opts.setPathMapping(mapping);
+        pack.extract(opts);
+
+        assertNodeMissing("/tmp/mapped/bar/tobi");
+        assertNodeExists("/tmp/mapped/bar/roby");
+    }
+
+    /**
+     * 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);
+        ImportOptions opts = getDefaultOptions();
+
+        MultiPathMapping mapping = new MultiPathMapping();
+        mapping.link("/tmp/foo", "/libs/foo");
+        opts.setPathMapping(mapping);
+        pack.extract(opts);
+
+        assertNodeExists("/tmp/foo");
+        assertNodeExists("/libs/foo");
+    }
+}
\ No newline at end of file