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