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"));