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

svn commit: r1780163 - in /jackrabbit/oak/trunk/oak-core/src: main/java/org/apache/jackrabbit/oak/plugins/multiplex/ main/java/org/apache/jackrabbit/oak/spi/mount/ test/java/org/apache/jackrabbit/oak/plugins/multiplex/

Author: tomekr
Date: Wed Jan 25 10:16:17 2017
New Revision: 1780163

URL: http://svn.apache.org/viewvc?rev=1780163&view=rev
Log:
OAK-5494: Allow to disable mounting path fragments in the MultiplexingNodeStore

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/MountedNodeStore.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=1780163&r1=1780162&r2=1780163&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 Wed Jan 25 10:16:17 2017
@@ -52,15 +52,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> includedPaths;
 
-    public MountInfo(String name, boolean readOnly, boolean defaultMount,
+    public MountInfo(String name, boolean readOnly, boolean defaultMount, boolean supportFragment,
             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;
     }
 
     @Override
@@ -79,7 +81,7 @@ final class MountInfo implements Mount {
 
     @Override
     public boolean isMounted(String path) {
-        if (path.contains(pathFragmentName)){
+        if (supportFragment && path.contains(pathFragmentName)){
             return true;
         }
 
@@ -105,6 +107,11 @@ final class MountInfo implements Mount {
     }
 
     @Override
+    public boolean isSupportFragment() {
+        return supportFragment;
+    }
+
+    @Override
     public String getPathFragmentName() {
         return pathFragmentName;
     }

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=1780163&r1=1780162&r2=1780163&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 Wed Jan 25 10:16:17 2017
@@ -63,6 +63,14 @@ public class MountInfoProviderService {
     )
     private static final String PROP_MOUNT_READONLY = "readOnlyMount";
 
+    private static final boolean PROP_MOUNT_SUPPORT_FRAGMENT_DEFAULT = true;
+
+    @Property(label = "Support fragment",
+            description = "If enabled then oak:mount-* nodes will be included to this mount",
+            boolValue = PROP_MOUNT_SUPPORT_FRAGMENT_DEFAULT
+    )
+    private static final String PROP_MOUNT_SUPPORT_FRAGMENT = "supportFragment";
+
     private final Logger log = LoggerFactory.getLogger(getClass());
 
     private ServiceRegistration reg;
@@ -72,6 +80,7 @@ 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);
 
         MountInfoProvider mip = Mounts.defaultMountInfoProvider();
         if (paths != null) {
@@ -79,7 +88,7 @@ public class MountInfoProviderService {
             for (String path : paths) {
                 trimmedPaths.add(path.trim());
             }
-            Mount mi = new MountInfo(mountName.trim(), readOnly, false, trimmedPaths);
+            Mount mi = new MountInfo(mountName.trim(), readOnly, false, supportFragment, trimmedPaths);
             mip = new SimpleMountInfoProvider(Collections.singletonList(mi));
             log.info("Enabling mount for {}", mi);
         } else {

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/multiplex/MountedNodeStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/multiplex/MountedNodeStore.java?rev=1780163&r1=1780162&r2=1780163&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/multiplex/MountedNodeStore.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/multiplex/MountedNodeStore.java Wed Jan 25 10:16:17 2017
@@ -39,16 +39,4 @@ class MountedNodeStore {
     public NodeStore getNodeStore() {
         return nodeStore;
     }
-
-    boolean hasChildren(Iterable<String> children) {
-        // since we can't possibly know if a node matching the
-        // 'oak:mount-*' pattern exists below a given path
-        // we are forced to iterate for each node store
-        for (String childNodeName : children) {
-            if (childNodeName.startsWith(getMount().getPathFragmentName())) {
-                return true;
-            }
-        }
-        return false;
-    }
 }
\ No newline at end of file

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=1780163&r1=1780162&r2=1780163&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 Wed Jan 25 10:16:17 2017
@@ -34,6 +34,7 @@ import java.util.Map;
 
 import static com.google.common.collect.ImmutableMap.copyOf;
 import static com.google.common.collect.Iterables.concat;
+import static com.google.common.collect.Iterables.tryFind;
 import static com.google.common.collect.Lists.newArrayList;
 import static com.google.common.collect.Maps.uniqueIndex;
 import static java.util.Collections.singleton;
@@ -114,18 +115,30 @@ class MultiplexingContext {
 
         // query the mounts next
         for (MountedNodeStore mountedNodeStore : nonDefaultStores) {
-            if (mounts.contains(mountedNodeStore.getMount())) {
+            final Mount mount = mountedNodeStore.getMount();
+            if (mounts.contains(mount)) {
+                mountedStores.add(mountedNodeStore);
+            } else if (hasChildrenContainingPathFragmentName(mountedNodeStore, childrenProvider)) {
                 mountedStores.add(mountedNodeStore);
-            } else {
-                if (mountedNodeStore.hasChildren(childrenProvider.apply(mountedNodeStore))) {
-                    mountedStores.add(mountedNodeStore);
-                }
             }
         }
 
         return mountedStores;
     }
 
+    private boolean hasChildrenContainingPathFragmentName(MountedNodeStore mns, Function<MountedNodeStore, Iterable<String>> childrenProvider) {
+        final Mount mount = mns.getMount();
+        if (!mount.isSupportFragment()) {
+            return false;
+        }
+        return tryFind(childrenProvider.apply(mns), new Predicate<String>() {
+            @Override
+            public boolean apply(String input) {
+                return input.contains(mount.getPathFragmentName());
+            }
+        }).isPresent();
+    }
+
     Iterable<MountedNodeStore> getAllMountedNodeStores() {
         return concat(singleton(globalStore), nonDefaultStores);
     }

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=1780163&r1=1780162&r2=1780163&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 Wed Jan 25 10:16:17 2017
@@ -110,12 +110,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, asList(paths)));
+            mounts.add(new MountInfo(name, false, false, true, asList(paths)));
             return this;
         }
 
         public Builder readOnlyMount(String name, String... paths) {
-            mounts.add(new MountInfo(name, true, false, asList(paths)));
+            mounts.add(new MountInfo(name, true, false, true, 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=1780163&r1=1780162&r2=1780163&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 Wed Jan 25 10:16:17 2017
@@ -75,6 +75,14 @@ public interface Mount {
     String getPathFragmentName();
 
     /**
+     * Checks if this mount supports mounting nodes containing the path fragment
+     * (see {@link #getPathFragmentName()}).
+     *
+     * @return true if the path fragment mounts are supported
+     */
+    boolean isSupportFragment();
+
+    /**
      * Checks if given path belongs to this <code>Mount</code>
      *
      * @param path path to check

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=1780163&r1=1780162&r2=1780163&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 Wed Jan 25 10:16:17 2017
@@ -102,6 +102,11 @@ public final class Mounts {
         }
 
         @Override
+        public boolean isSupportFragment() {
+            return false;
+        }
+
+        @Override
         public boolean isMounted(String path) {
             for (Mount m : mounts) {
                 if (m.isMounted(path)) {

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=1780163&r1=1780162&r2=1780163&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 Wed Jan 25 10:16:17 2017
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-@Version("2.1.0")
+@Version("2.2.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=1780163&r1=1780162&r2=1780163&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 Wed Jan 25 10:16:17 2017
@@ -29,7 +29,7 @@ public class MountInfoTest {
 
     @Test
     public void testIsMounted() throws Exception{
-        MountInfo md = new MountInfo("foo", false, false, of("/a", "/b"));
+        MountInfo md = new MountInfo("foo", false, false, true, of("/a", "/b"));
         assertTrue(md.isMounted("/a"));
         assertTrue(md.isMounted("/b"));
         assertTrue(md.isMounted("/b/c/d"));
@@ -40,7 +40,7 @@ public class MountInfoTest {
 
     @Test
     public void testIsUnder() {
-        MountInfo md = new MountInfo("foo", false, false, of("/apps", "/etc/config", "/content/my/site", "/var"));
+        MountInfo md = new MountInfo("foo", false, false, true, of("/apps", "/etc/config", "/content/my/site", "/var"));
         assertTrue(md.isUnder("/etc"));
         assertTrue(md.isUnder("/content"));
         assertTrue(md.isUnder("/content/my"));
@@ -51,7 +51,7 @@ public class MountInfoTest {
 
     @Test
     public void testIsDirectlyUnder() {
-        MountInfo md = new MountInfo("foo", false, false, of("/apps", "/etc/my/config", "/var"));
+        MountInfo md = new MountInfo("foo", false, false, true, of("/apps", "/etc/my/config", "/var"));
         assertFalse(md.isDirectlyUnder("/etc"));
         assertTrue(md.isDirectlyUnder("/etc/my"));
         assertFalse(md.isDirectlyUnder("/etc/my/config"));