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