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/10/31 06:46:41 UTC

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

Author: tripod
Date: Fri Oct 31 05:46:40 2014
New Revision: 1635675

URL: http://svn.apache.org/r1635675
Log:
JCRVLT-64 Nodes that have a user parent are not installed if they are in the same .content.xml as their parent

- fixed primary bug
- also fixed parts of JCRVLT-66 if the data is in the same aggregate.
  in case there is more content on separate aggregates, the remapping is not honoured.

Added:
    jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/api/MultiPathMapping.java
    jackrabbit/commons/filevault/trunk/vault-core/src/test/resources/org/apache/jackrabbit/vault/packaging/integration/testpackages/test_user_a_profile_picture.zip
Modified:
    jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/api/PathMapping.java
    jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/api/SimplePathMapping.java
    jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/io/DocViewSAXImporter.java
    jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/io/ImportInfoImpl.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/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/TestUserContentPackage.java

Added: jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/api/MultiPathMapping.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/api/MultiPathMapping.java?rev=1635675&view=auto
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/api/MultiPathMapping.java (added)
+++ jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/api/MultiPathMapping.java Fri Oct 31 05:46:40 2014
@@ -0,0 +1,87 @@
+/*
+ * 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 org.apache.jackrabbit.vault.util.Text;
+
+/**
+ * Implements a path mapping that supports multiple synlinks
+ * @since 3.1.10
+ */
+public class MultiPathMapping implements PathMapping {
+
+    private final Map<String, String> links = new HashMap<String, String>();
+
+    private final Map<String, String> reverseLinks = new HashMap<String, String>();
+
+    /**
+     * Creates a new link from the path {@code src} to the path {@code dst}
+     * @param src source path
+     * @param dst destination path
+     * @return this
+     */
+    public MultiPathMapping link(String src, String dst) {
+        links.put(src, dst);
+        reverseLinks.put(dst, src);
+        return this;
+    }
+
+    /**
+     * Merges the links from the given base mapping
+     * @param base base mapping
+     * @return this
+     */
+    public MultiPathMapping merge(MultiPathMapping base) {
+        if (base != null) {
+            this.links.putAll(base.links);
+            this.reverseLinks.putAll(base.reverseLinks);
+        }
+        return this;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String map(String path) {
+        return map(path, false);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String map(String path, boolean reverse) {
+        if (path == null || path.length() == 0 || "/".equals(path)) {
+            return path;
+        }
+        Map<String, String> lookup = reverse ? reverseLinks : links;
+        String[] segs = Text.explode(path, '/');
+        String ret = "";
+        for (String name: segs) {
+            ret += "/" + name;
+            String link = lookup.get(ret);
+            if (link != null) {
+                ret = link;
+            }
+        }
+        return ret;
+    }
+}
\ No newline at end of file

Modified: jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/api/PathMapping.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/api/PathMapping.java?rev=1635675&r1=1635674&r2=1635675&view=diff
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/api/PathMapping.java (original)
+++ jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/api/PathMapping.java Fri Oct 31 05:46:40 2014
@@ -27,9 +27,16 @@ public interface PathMapping {
      * Implements an identity mapping
      */
     PathMapping IDENTITY = new PathMapping() {
+
+        @Override
         public String map(String path) {
             return path;
         }
+
+        @Override
+        public String map(String path, boolean reverse) {
+            return path;
+        }
     };
 
     /**
@@ -38,4 +45,14 @@ public interface PathMapping {
      * @return the mapped path.
      */
     String map(String path);
+
+    /**
+     * Maps the given path to a new location.
+     * @param path the path
+     * @param reverse if {@code true} a reverse mapping is applied
+     * @return the mapped path.
+     */
+    String map(String path, boolean reverse);
+
+
 }
\ No newline at end of file

Modified: jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/api/SimplePathMapping.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/api/SimplePathMapping.java?rev=1635675&r1=1635674&r2=1635675&view=diff
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/api/SimplePathMapping.java (original)
+++ jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/api/SimplePathMapping.java Fri Oct 31 05:46:40 2014
@@ -39,7 +39,18 @@ public class SimplePathMapping implement
     /**
      * {@inheritDoc}
      */
+    @Override
     public String map(String path) {
+        return map(path, false);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String map(String path, boolean reverse) {
+        String strip = reverse ? this.root : this.strip;
+        String root = reverse ? this.strip : this.root;
         if (path.startsWith(strip)) {
             StringBuilder b = new StringBuilder(root);
             b.append(path.substring(strip.length()));

Modified: jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/io/DocViewSAXImporter.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/io/DocViewSAXImporter.java?rev=1635675&r1=1635674&r2=1635675&view=diff
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/io/DocViewSAXImporter.java (original)
+++ jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/io/DocViewSAXImporter.java Fri Oct 31 05:46:40 2014
@@ -306,7 +306,7 @@ public class DocViewSAXImporter extends 
     }
 
     private boolean isIncluded(Item item, int depth) throws RepositoryException {
-        String path = item.getPath();
+        String path = importInfo.getRemapped().map(item.getPath());
         return wspFilter.contains(path) && (depth == 0 || filter.contains(item, path, depth));
     }
 
@@ -676,16 +676,27 @@ public class DocViewSAXImporter extends 
             importInfo.onCreated(newPath);
             return;
         }
+        boolean isIncluded = wspFilter.contains(newPath);
 
         Node authNode = session.getNode(oldPath);
-        ImportMode mode = wspFilter.getImportMode(oldPath);
+        ImportMode mode = wspFilter.getImportMode(newPath);
+
         // if existing path is not the same as this, we need to register this so that further
         // nodes down the line (i.e. profiles, policies) are imported at the correct location
+        // we only follow existing authorizables for non-REPLACE mode and if ignoring this authorizable node
         // todo: check if this also works cross-aggregates
-        if (mode != ImportMode.REPLACE && !oldPath.equals(newPath)) {
+        if (mode != ImportMode.REPLACE || !isIncluded) {
             importInfo.onRemapped(oldPath, newPath);
         }
 
+        if (!isIncluded) {
+            // skip authorizable handling - always follow existing authorizable - regardless of mode
+            // todo: we also need to check any rep:Memberlist subnodes. see JCRVLT-69
+            stack = stack.push(new StackElement(authNode, false));
+            importInfo.onNop(oldPath);
+            return;
+        }
+
         switch (mode) {
             case MERGE:
                 // remember desired memberships.
@@ -697,7 +708,7 @@ public class DocViewSAXImporter extends 
 
                 log.info("Skipping import of existing authorizable '{}' due to MERGE import mode.", id);
                 stack = stack.push(new StackElement(authNode, false));
-                importInfo.onNop(oldPath);
+                importInfo.onNop(newPath);
                 break;
 
             case REPLACE:

Modified: jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/io/ImportInfoImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/io/ImportInfoImpl.java?rev=1635675&r1=1635674&r2=1635675&view=diff
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/io/ImportInfoImpl.java (original)
+++ jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/io/ImportInfoImpl.java Fri Oct 31 05:46:40 2014
@@ -32,7 +32,9 @@ import javax.jcr.Session;
 import javax.jcr.version.Version;
 
 import org.apache.jackrabbit.vault.fs.api.ImportInfo;
+import org.apache.jackrabbit.vault.fs.api.MultiPathMapping;
 import org.apache.jackrabbit.vault.fs.api.NodeNameList;
+import org.apache.jackrabbit.vault.fs.api.PathMapping;
 import org.apache.jackrabbit.vault.util.JcrConstants;
 import org.apache.jackrabbit.vault.util.PathComparator;
 import org.slf4j.Logger;
@@ -51,7 +53,7 @@ public class ImportInfoImpl implements I
 
     private final TreeMap<String, Info> infos = new TreeMap<String, Info>(new PathComparator());
 
-    private Map<String, String> remapped;
+    private MultiPathMapping mapping = null;
 
     /**
      * list of uuids of nodes that need to be checked-in after the import
@@ -82,10 +84,10 @@ public class ImportInfoImpl implements I
             numModified +=baseImpl.numModified;
             numErrors += baseImpl.numErrors;
             toVersion.addAll(baseImpl.toVersion);
-            if (remapped == null) {
-                remapped = baseImpl.remapped;
+            if (mapping == null) {
+                mapping = baseImpl.mapping;
             } else {
-                remapped.putAll(baseImpl.getRemapped());
+                mapping.merge(baseImpl.mapping);
             }
             if (memberships == null) {
                 memberships = baseImpl.memberships;
@@ -156,15 +158,24 @@ public class ImportInfoImpl implements I
         numErrors++;
     }
 
-    public void onRemapped(String oldPath, String newPath) {
-        if (remapped == null) {
-            remapped = new HashMap<String, String>();
+    /**
+     * remembers that a package path was remapped during import. e.g. when the importer follows and existing
+     * authorizable for MERGE and UPDATE modes.
+     *
+     * @param packagePath the original path as presented in the package
+     * @param followedPath the followed path during the import
+     */
+    public void onRemapped(String followedPath, String packagePath) {
+        if (!packagePath.equals(followedPath)) {
+            if (mapping == null) {
+                mapping = new MultiPathMapping();
+            }
+            mapping.link(followedPath, packagePath);
         }
-        remapped.put(oldPath, newPath);
     }
 
-    public Map<String, String> getRemapped() {
-        return remapped == null ? Collections.<String, String>emptyMap() : remapped;
+    public PathMapping getRemapped() {
+        return mapping == null ? PathMapping.IDENTITY : mapping;
     }
 
     private void addMod(String path, Type mod, Exception e) {

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=1635675&r1=1635674&r2=1635675&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 Oct 31 05:46:40 2014
@@ -965,7 +965,7 @@ public class Importer {
             // check if node was remapped. currently we just skip them as it's not clear how the filter should be
             // reapplied or what happens if the remapping links to a tree we already processed.
             // in this case we don't descend in any children and can clear them right away
-            if (imp.getRemapped().containsKey(info.path)) {
+            if (!imp.getRemapped().map(info.path, true).equals(info.path)) {
                 info.children = null;
             }
         }

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=1635675&r1=1635674&r2=1635675&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 Oct 31 05:46:40 2014
@@ -32,4 +32,49 @@ public class PathMappingTest {
         assertEquals("/content/products", map.map("/tmp/products"));
         assertEquals("/foo", map.map("/foo"));
     }
+
+    @Test
+    public void testSimpleReverse() {
+        PathMapping map = new SimplePathMapping("/tmp", "/content");
+        assertEquals("/tmp", map.map("/content", true));
+        assertEquals("/tmp/products", map.map("/content/products", true));
+        assertEquals("/foo", map.map("/foo", true));
+    }
+
+    @Test
+    public void testMulti() {
+        MultiPathMapping map = new MultiPathMapping();
+        map.link("/source/tree/a", "/dest/1");
+        map.link("/source/tree/b", "/dest/2");
+        map.link("/source/foo/a", "/dest/foo/1");
+        map.link("/dest/foo/1/top", "/test");
+
+        assertEquals("", map.map(""));
+        assertEquals("/", map.map("/"));
+        assertEquals("/content", map.map("/content"));
+        assertEquals("/dest/1", map.map("/source/tree/a"));
+        assertEquals("/dest/1/test", map.map("/source/tree/a/test"));
+        assertEquals("/dest/2/test", map.map("/source/tree/b/test"));
+        assertEquals("/dest/foo/1/test", map.map("/source/foo/a/test"));
+        assertEquals("/test/flop", map.map("/source/foo/a/top/flop"));
+   }
+
+    @Test
+    public void testMultiReverse() {
+        MultiPathMapping map = new MultiPathMapping();
+        map.link("/source/tree/a", "/dest/1");
+        map.link("/source/tree/b", "/dest/2");
+        map.link("/source/foo/a", "/dest/foo/1");
+        map.link("/dest/foo/1/top", "/test");
+
+        assertEquals("", map.map(""));
+        assertEquals("/", map.map("/"));
+        assertEquals("/content", map.map("/content"));
+        assertEquals("/source/tree/a", map.map("/dest/1", true));
+        assertEquals("/source/tree/b/test", map.map("/dest/2/test", true));
+        assertEquals("/source/tree/a/a/b/c/d", map.map("/dest/1/a/b/c/d", true));
+        assertEquals("/source/foo/a/test", map.map("/dest/foo/1/test", true));
+        assertEquals("/dest/foo/1/top/flop", map.map("/test/flop", true));
+
+    }
 }
\ No newline at end of file

Modified: jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/TestUserContentPackage.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/TestUserContentPackage.java?rev=1635675&r1=1635674&r2=1635675&view=diff
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/TestUserContentPackage.java (original)
+++ jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/TestUserContentPackage.java Fri Oct 31 05:46:40 2014
@@ -51,6 +51,7 @@ public class TestUserContentPackage exte
     private static final String NAME_PROFILE_FULLNAME = "profile/fullname";
     private static final String NAME_PROFILE_PROPERTY = "profile/profileProperty";
     private static final String NAME_PROFILE_NODE = "profile";
+    private static final String NAME_PROFILE_PICTURE_NODE = "profile/picture.txt";
     private static final String NAME_PROFILE_PRIVATE_NODE = "profile_private";
 
     @Override
@@ -110,7 +111,6 @@ public class TestUserContentPackage exte
     }
 
     @Test
-    @Ignore("JCRVLT-64")
     public void installUserA_Profile() throws RepositoryException, IOException, PackageException {
         // install default user at package path
         User userA = installUserA(ImportMode.REPLACE, true, true);
@@ -128,7 +128,6 @@ public class TestUserContentPackage exte
     }
 
     @Test
-    @Ignore("JCRVLT-65")
     public void installUserA_Profile_Moved() throws RepositoryException, IOException, PackageException {
         // install default user at package path
         User userA = installUserA(ImportMode.UPDATE, false, false);
@@ -145,6 +144,43 @@ public class TestUserContentPackage exte
         assertProperty(authPath + "/" + NAME_PROFILE_PROPERTY, "a");
     }
 
+    @Test
+    public void installUserA_Profile_Picture() throws RepositoryException, IOException, PackageException {
+        // install default user at package path
+        User userA = installUserA(ImportMode.REPLACE, true, true);
+        String authPath = userA.getPath();
+
+        assertPropertyMissing(authPath + "/" + NAME_PROFILE_PROPERTY);
+
+        // install updated profile
+        JcrPackage pack = packMgr.upload(getStream("testpackages/test_user_a_profile_picture.zip"), false);
+        assertNotNull(pack);
+        pack.install(getDefaultOptions());
+
+        assertProperty(authPath + "/" + NAME_PROFILE_FULLNAME, "Test User");
+        assertProperty(authPath + "/" + NAME_PROFILE_PROPERTY, "a");
+        assertNodeExists(authPath + "/" + NAME_PROFILE_PICTURE_NODE);
+    }
+
+    @Test
+    @Ignore("JCRVLT-65")
+    public void installUserA_Profile_Picture_Moved() throws RepositoryException, IOException, PackageException {
+        // install default user at package path
+        User userA = installUserA(ImportMode.UPDATE, false, false);
+        String authPath = userA.getPath();
+
+        assertPropertyMissing(authPath + "/" + NAME_PROFILE_PROPERTY);
+
+        // install updated profile
+        JcrPackage pack = packMgr.upload(getStream("testpackages/test_user_a_profile_picture.zip"), false);
+        assertNotNull(pack);
+        pack.install(getDefaultOptions());
+
+        assertProperty(authPath + "/" + NAME_PROFILE_FULLNAME, "Test User");
+        assertProperty(authPath + "/" + NAME_PROFILE_PROPERTY, "a");
+        assertNodeExists(authPath + "/" + NAME_PROFILE_PICTURE_NODE);
+    }
+
     private User installUserA(ImportMode mode, boolean usePkgPath, boolean expectPkgPath) throws RepositoryException, IOException, PackageException {
         UserManager mgr = ((JackrabbitSession) admin).getUserManager();
         assertNull("test-user-a must not exist", mgr.getAuthorizable(ID_TEST_USER_A));

Added: jackrabbit/commons/filevault/trunk/vault-core/src/test/resources/org/apache/jackrabbit/vault/packaging/integration/testpackages/test_user_a_profile_picture.zip
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-core/src/test/resources/org/apache/jackrabbit/vault/packaging/integration/testpackages/test_user_a_profile_picture.zip?rev=1635675&view=auto
==============================================================================
Files jackrabbit/commons/filevault/trunk/vault-core/src/test/resources/org/apache/jackrabbit/vault/packaging/integration/testpackages/test_user_a_profile_picture.zip (added) and jackrabbit/commons/filevault/trunk/vault-core/src/test/resources/org/apache/jackrabbit/vault/packaging/integration/testpackages/test_user_a_profile_picture.zip Fri Oct 31 05:46:40 2014 differ