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