Author: tomekr
Date: Thu Apr  6 08:39:50 2017
New Revision: 1790365

URL: http://svn.apache.org/viewvc?rev=1790365&view=rev
Log:
OAK-6042: Allow to support mount path fragments under specified subtrees

Modified:
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/multiplex/MountInfo.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/multiplex/MountInfoProviderService.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/multiplex/MultiplexingContext.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/multiplex/SimpleMountInfoProvider.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/mount/Mount.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/mount/Mounts.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/mount/package-info.java
    
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/multiplex/MountInfoTest.java

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/multiplex/MountInfo.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/multiplex/MountInfo.java?rev=1790365&r1=1790364&r2=1790365&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/multiplex/MountInfo.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/multiplex/MountInfo.java
 Thu Apr  6 08:39:50 2017
@@ -16,7 +16,6 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-
 package org.apache.jackrabbit.oak.plugins.multiplex;
 
 import java.io.PrintWriter;
@@ -52,17 +51,17 @@ final class MountInfo implements Mount {
     private final boolean readOnly;
     private final boolean defaultMount;
     private final String pathFragmentName;
-    private final boolean supportFragment;
+    private final NavigableSet<String> pathsSupportingFragments;
     private final NavigableSet<String> includedPaths;
 
-    public MountInfo(String name, boolean readOnly, boolean defaultMount, 
boolean supportFragment,
+    public MountInfo(String name, boolean readOnly, boolean defaultMount, 
List<String> pathsSupportingFragments,
             List<String> includedPaths) {
         this.name = checkNotNull(name, "Mount name must not be null");
         this.readOnly = readOnly;
         this.defaultMount = defaultMount;
         this.pathFragmentName = "oak:mount-" + name;
         this.includedPaths = cleanCopy(includedPaths);
-        this.supportFragment = supportFragment;
+        this.pathsSupportingFragments = cleanCopy(pathsSupportingFragments);
     }
 
     @Override
@@ -81,7 +80,7 @@ final class MountInfo implements Mount {
 
     @Override
     public boolean isMounted(String path) {
-        if (supportFragment && path.contains(pathFragmentName)){
+        if (isSupportFragment(path) && path.contains(pathFragmentName)){
             return true;
         }
 
@@ -107,8 +106,10 @@ final class MountInfo implements Mount {
     }
 
     @Override
-    public boolean isSupportFragment() {
-        return supportFragment;
+    public boolean isSupportFragment(String path) {
+        path = SANITIZE_PATH.apply(path);
+        String previousPath = pathsSupportingFragments.floor(path);
+        return previousPath != null && (previousPath.equals(path) || 
isAncestor(previousPath, path));
     }
 
     @Override

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/multiplex/MountInfoProviderService.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/multiplex/MountInfoProviderService.java?rev=1790365&r1=1790364&r2=1790365&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/multiplex/MountInfoProviderService.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/multiplex/MountInfoProviderService.java
 Thu Apr  6 08:39:50 2017
@@ -63,13 +63,13 @@ public class MountInfoProviderService {
     )
     private static final String PROP_MOUNT_READONLY = "readOnlyMount";
 
-    private static final boolean PROP_MOUNT_SUPPORT_FRAGMENT_DEFAULT = true;
+    private static final String[] PROP_PATHS_SUPPORTING_FRAGMENTS_DEFAULT = 
new String[] {"/"};
 
-    @Property(label = "Support fragment",
-            description = "If enabled then oak:mount-* nodes will be included 
to this mount",
-            boolValue = PROP_MOUNT_SUPPORT_FRAGMENT_DEFAULT
+    @Property(label = "Paths supporting fragments",
+            description = "oak:mount-* under this paths will be included to 
mounts",
+            value = {"/"}
     )
-    private static final String PROP_MOUNT_SUPPORT_FRAGMENT = 
"supportFragment";
+    private static final String PROP_PATHS_SUPPORTING_FRAGMENTS = 
"pathsSupportingFragments";
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
@@ -80,15 +80,11 @@ public class MountInfoProviderService {
         String[] paths = 
PropertiesUtil.toStringArray(config.get(PROP_MOUNT_PATHS));
         String mountName = 
PropertiesUtil.toString(config.get(PROP_MOUNT_NAME), PROP_MOUNT_NAME_DEFAULT);
         boolean readOnly = 
PropertiesUtil.toBoolean(config.get(PROP_MOUNT_READONLY), 
PROP_MOUNT_READONLY_DEFAULT);
-        boolean supportFragment = 
PropertiesUtil.toBoolean(config.get(PROP_MOUNT_SUPPORT_FRAGMENT), 
PROP_MOUNT_SUPPORT_FRAGMENT_DEFAULT);
+        String[] pathsSupportingFragments = 
PropertiesUtil.toStringArray(PROP_PATHS_SUPPORTING_FRAGMENTS, 
PROP_PATHS_SUPPORTING_FRAGMENTS_DEFAULT);
 
         MountInfoProvider mip = Mounts.defaultMountInfoProvider();
         if (paths != null) {
-            List<String> trimmedPaths = new ArrayList<String>(paths.length);
-            for (String path : paths) {
-                trimmedPaths.add(path.trim());
-            }
-            Mount mi = new MountInfo(mountName.trim(), readOnly, false, 
supportFragment, trimmedPaths);
+            Mount mi = new MountInfo(mountName.trim(), readOnly, false, 
trim(pathsSupportingFragments), trim(paths));
             mip = new SimpleMountInfoProvider(Collections.singletonList(mi));
             log.info("Enabling mount for {}", mi);
         } else {
@@ -98,6 +94,14 @@ public class MountInfoProviderService {
         reg = bundleContext.registerService(MountInfoProvider.class.getName(), 
mip, null);
     }
 
+    private static List<String> trim(String[] array) {
+        List<String> result = new ArrayList<>(array.length);
+        for (String s : array) {
+            result.add(s.trim());
+        }
+        return result;
+    }
+
     @Deactivate
     private void deactivate() {
         if (reg != null) {

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/multiplex/MultiplexingContext.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/multiplex/MultiplexingContext.java?rev=1790365&r1=1790364&r2=1790365&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/multiplex/MultiplexingContext.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/multiplex/MultiplexingContext.java
 Thu Apr  6 08:39:50 2017
@@ -52,8 +52,6 @@ class MultiplexingContext {
 
     private final Map<Mount, MountedNodeStore> nodeStoresByMount;
 
-    private final boolean pathFragmentSupport;
-
     MultiplexingContext(MountInfoProvider mip, NodeStore globalStore, 
List<MountedNodeStore> nonDefaultStores) {
         this.mip = mip;
         this.globalStore = new MountedNodeStore(mip.getDefaultMount(), 
globalStore);
@@ -64,12 +62,6 @@ class MultiplexingContext {
                 return input.getMount();
             }
         }));
-        pathFragmentSupport = Iterables.tryFind(nonDefaultStores, new 
Predicate<MountedNodeStore>() {
-            @Override
-            public boolean apply(MountedNodeStore input) {
-                return input.getMount().isSupportFragment();
-            }
-        }).isPresent();
     }
 
     MountedNodeStore getGlobalStore() {
@@ -107,8 +99,13 @@ class MultiplexingContext {
         });
     }
 
-    boolean shouldBeMultiplexed(String path) {
-        if (pathFragmentSupport) {
+    boolean shouldBeMultiplexed(final String path) {
+        if (Iterables.tryFind(nonDefaultStores, new 
Predicate<MountedNodeStore>() {
+            @Override
+            public boolean apply(MountedNodeStore input) {
+                return input.getMount().isSupportFragment(path);
+            }
+        }).isPresent()) {
             return true;
         }
         return !mip.getMountsPlacedUnder(path).isEmpty();
@@ -135,7 +132,7 @@ class MultiplexingContext {
             final Mount mount = mountedNodeStore.getMount();
             if (mounts.contains(mount)) {
                 mountedStores.add(mountedNodeStore);
-            } else if (hasChildrenContainingPathFragmentName(mountedNodeStore, 
childrenProvider)) {
+            } else if (hasChildrenContainingPathFragmentName(mountedNodeStore, 
path, childrenProvider)) {
                 mountedStores.add(mountedNodeStore);
             }
         }
@@ -143,9 +140,9 @@ class MultiplexingContext {
         return mountedStores;
     }
 
-    private boolean hasChildrenContainingPathFragmentName(MountedNodeStore 
mns, Function<MountedNodeStore, Iterable<String>> childrenProvider) {
+    private boolean hasChildrenContainingPathFragmentName(MountedNodeStore 
mns, String parentPath, Function<MountedNodeStore, Iterable<String>> 
childrenProvider) {
         final Mount mount = mns.getMount();
-        if (!mount.isSupportFragment()) {
+        if (!mount.isSupportFragment(parentPath)) {
             return false;
         }
         return tryFind(childrenProvider.apply(mns), new Predicate<String>() {

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/multiplex/SimpleMountInfoProvider.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/multiplex/SimpleMountInfoProvider.java?rev=1790365&r1=1790364&r2=1790365&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/multiplex/SimpleMountInfoProvider.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/multiplex/SimpleMountInfoProvider.java
 Thu Apr  6 08:39:50 2017
@@ -20,6 +20,7 @@
 package org.apache.jackrabbit.oak.plugins.multiplex;
 
 import java.util.Collection;
+import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 
@@ -110,12 +111,12 @@ public class SimpleMountInfoProvider imp
         private final List<Mount> mounts = Lists.newArrayListWithCapacity(1);
 
         public Builder mount(String name, String... paths) {
-            mounts.add(new MountInfo(name, false, false, true, asList(paths)));
+            mounts.add(new MountInfo(name, false, false, asList("/"), 
asList(paths)));
             return this;
         }
 
         public Builder readOnlyMount(String name, String... paths) {
-            mounts.add(new MountInfo(name, true, false, true, asList(paths)));
+            mounts.add(new MountInfo(name, true, false, asList("/"), 
asList(paths)));
             return this;
         }
 

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/mount/Mount.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/mount/Mount.java?rev=1790365&r1=1790364&r2=1790365&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/mount/Mount.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/mount/Mount.java
 Thu Apr  6 08:39:50 2017
@@ -75,12 +75,13 @@ public interface Mount {
     String getPathFragmentName();
 
     /**
-     * Checks if this mount supports mounting nodes containing the path 
fragment
-     * (see {@link #getPathFragmentName()}).
+     * Checks if this mount supports mounting nodes containing the fragment
+     * (see {@link #getPathFragmentName()}) under the given path.
      *
-     * @return true if the path fragment mounts are supported
+     * @param path ancestor path
+     * @return true if the path fragment mounts are supported in the given 
subtree
      */
-    boolean isSupportFragment();
+    boolean isSupportFragment(String path);
 
     /**
      * Checks if given path belongs to this <code>Mount</code>

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/mount/Mounts.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/mount/Mounts.java?rev=1790365&r1=1790364&r2=1790365&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/mount/Mounts.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/mount/Mounts.java
 Thu Apr  6 08:39:50 2017
@@ -102,7 +102,7 @@ public final class Mounts {
         }
 
         @Override
-        public boolean isSupportFragment() {
+        public boolean isSupportFragment(String path) {
             return false;
         }
 

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/mount/package-info.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/mount/package-info.java?rev=1790365&r1=1790364&r2=1790365&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/mount/package-info.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/mount/package-info.java
 Thu Apr  6 08:39:50 2017
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-@Version("2.2.0")
+@Version("3.0.0")
 package org.apache.jackrabbit.oak.spi.mount;
 
 import aQute.bnd.annotation.Version;
\ No newline at end of file

Modified: 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/multiplex/MountInfoTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/multiplex/MountInfoTest.java?rev=1790365&r1=1790364&r2=1790365&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/multiplex/MountInfoTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/multiplex/MountInfoTest.java
 Thu Apr  6 08:39:50 2017
@@ -25,22 +25,26 @@ import static org.junit.Assert.assertTru
 
 import org.junit.Test;
 
+import java.util.Collections;
+
 public class MountInfoTest {
 
     @Test
     public void testIsMounted() throws Exception{
-        MountInfo md = new MountInfo("foo", false, false, true, of("/a", 
"/b"));
+        MountInfo md = new MountInfo("foo", false, false, of("/x/y"), of("/a", 
"/b"));
         assertTrue(md.isMounted("/a"));
         assertTrue(md.isMounted("/b"));
         assertTrue(md.isMounted("/b/c/d"));
         assertTrue("dynamic mount path not recognized", 
md.isMounted("/x/y/oak:mount-foo/a"));
+        assertTrue("dynamic mount path not recognized", 
md.isMounted("/x/y/z/oak:mount-foo/a"));
         assertFalse(md.isMounted("/x/y"));
         assertFalse(md.isMounted("/x/y/foo"));
+        assertFalse(md.isMounted("/d/c/oak:mount-foo/a"));
     }
 
     @Test
     public void testIsUnder() {
-        MountInfo md = new MountInfo("foo", false, false, true, of("/apps", 
"/etc/config", "/content/my/site", "/var"));
+        MountInfo md = new MountInfo("foo", false, false, 
Collections.<String>emptyList(), of("/apps", "/etc/config", "/content/my/site", 
"/var"));
         assertTrue(md.isUnder("/etc"));
         assertTrue(md.isUnder("/content"));
         assertTrue(md.isUnder("/content/my"));
@@ -51,7 +55,7 @@ public class MountInfoTest {
 
     @Test
     public void testIsDirectlyUnder() {
-        MountInfo md = new MountInfo("foo", false, false, true, of("/apps", 
"/etc/my/config", "/var"));
+        MountInfo md = new MountInfo("foo", false, false, 
Collections.<String>emptyList(), of("/apps", "/etc/my/config", "/var"));
         assertFalse(md.isDirectlyUnder("/etc"));
         assertTrue(md.isDirectlyUnder("/etc/my"));
         assertFalse(md.isDirectlyUnder("/etc/my/config"));


Reply via email to