/** * Adds a new Mount instance with the specified parameters * * @param name the name of the mount * @param readOnly true for read-only paths, false otherwise * @param pathsSupportingFragments the paths supporting fragments, see {@link Mount#getPathFragmentName()} * @param paths the paths handled by the mount * @return this builder instance */ public Builder mount(String name, boolean readOnly, List<String> pathsSupportingFragments, List<String> paths) { mounts.add(new MountInfo(name, readOnly, pathsSupportingFragments, paths)); return this; }
public MountInfo(String name, boolean readOnly, List<String> pathsSupportingFragments, List<String> includedPaths) { this.name = checkNotNull(name, "Mount name must not be null"); this.readOnly = readOnly; this.pathFragmentName = "oak:mount-" + name; this.includedPaths = cleanCopy(includedPaths); this.pathsSupportingFragments = ImmutableSet.copyOf(pathsSupportingFragments); }
@Test public void testSupportFragment() { MountInfo md = new MountInfo("foo", false, of("/apps", "/libs/*/site", "/content/*$", "/var$"), Collections.emptyList()); assertFalse(md.isSupportFragment("/")); assertTrue(md.isSupportFragment("/apps")); assertTrue(md.isSupportFragment("/apps/acme")); assertFalse(md.isSupportFragment("/libs")); assertFalse(md.isSupportFragment("/libs/acme")); assertTrue(md.isSupportFragment("/libs/acme/site")); assertTrue(md.isSupportFragment("/libs/acme/site/abc")); assertFalse(md.isSupportFragment("/content")); assertTrue(md.isSupportFragment("/content/site")); assertFalse(md.isSupportFragment("/content/site/abc")); assertTrue(md.isSupportFragment("/var")); assertFalse(md.isSupportFragment("/var/abc")); }
@Test public void testIsMounted() throws Exception{ MountInfo md = new MountInfo("foo", 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 testIsDirectlyUnder() { MountInfo md = new MountInfo("foo", 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")); assertFalse(md.isDirectlyUnder("/libs")); }
@Test public void testIsUnder() { MountInfo md = new MountInfo("foo", 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")); assertFalse(md.isUnder("/content/my/site")); assertFalse(md.isUnder("/libs")); assertFalse(md.isUnder("/tmp")); }
@Test public void testSupportFragmentUnder() { MountInfo md = new MountInfo("foo", false, of("/apps", "/libs/*/site", "/content/*$", "/var$"), Collections.emptyList()); assertTrue(md.isSupportFragmentUnder("/")); assertTrue(md.isSupportFragmentUnder("/apps")); assertTrue(md.isSupportFragmentUnder("/apps/acme")); assertTrue(md.isSupportFragmentUnder("/libs")); assertTrue(md.isSupportFragmentUnder("/libs/acme")); assertTrue(md.isSupportFragmentUnder("/libs/acme/site")); assertTrue(md.isSupportFragmentUnder("/libs/acme/site/abc")); assertTrue(md.isSupportFragmentUnder("/content")); assertTrue(md.isSupportFragmentUnder("/content/site")); assertFalse(md.isSupportFragmentUnder("/content/site/abc")); assertTrue(md.isSupportFragmentUnder("/var")); assertFalse(md.isSupportFragmentUnder("/var/abc")); }
@Override public boolean isMounted(String path) { if (path.contains(pathFragmentName)) { String parent = path.substring(0, path.indexOf(pathFragmentName)); parent = parent.substring(0, parent.lastIndexOf('/')); if (isSupportFragment(parent)) { return true; } } path = SANITIZE_PATH.apply(path); String previousPath = includedPaths.floor(path); return previousPath != null && (previousPath.equals(path) || isAncestor(previousPath, path)); }
public InitialContentMigrator(NodeStore targetNodeStore, NodeStore seedNodeStore, Mount seedMount) { this.targetNodeStore = targetNodeStore; this.seedNodeStore = seedNodeStore; this.seedMount = seedMount; this.includePaths = FilteringNodeState.ALL; this.excludeFragments = ImmutableSet.of(seedMount.getPathFragmentName()); if (seedMount instanceof MountInfo) { this.excludePaths = Sets.union(((MountInfo) seedMount).getIncludedPaths(), DEFAULT_IGNORED_PATHS); this.fragmentPaths = new HashSet<>(); for (String p : ((MountInfo) seedMount).getPathsSupportingFragments()) { fragmentPaths.add(stripPatternCharacters(p)); } } else { this.excludePaths = DEFAULT_IGNORED_PATHS; this.fragmentPaths = FilteringNodeState.ALL; } }
@Test public void testIsMountedWithFragments() { MountInfo md = new MountInfo("foo", false, of("/apps", "/libs/*/site", "/content/*$", "/var$"), Collections.emptyList()); assertFalse(md.isMounted("/oak:mount-foo")); assertTrue(md.isMounted("/apps/oak:mount-foo")); assertTrue(md.isMounted("/apps/oak:mount-foo/xyz")); assertTrue(md.isMounted("/apps/acme/oak:mount-foo")); assertTrue(md.isMounted("/apps/acme/oak:mount-foo/xyz")); assertFalse(md.isMounted("/libs/oak:mount-foo")); assertFalse(md.isMounted("/libs/acme/oak:mount-foo")); assertTrue(md.isMounted("/libs/acme/site/oak:mount-foo")); assertTrue(md.isMounted("/libs/acme/site/oak:mount-foo/xyz")); assertTrue(md.isMounted("/libs/acme/site/abc/oak:mount-foo")); assertFalse(md.isMounted("/oak:mount-foo")); assertFalse(md.isMounted("/content/oak:mount-foo")); assertTrue(md.isMounted("/content/site/oak:mount-foo")); assertTrue(md.isMounted("/content/site/oak:mount-foo/xyz")); assertFalse(md.isMounted("/content/site/abc/oak:mount-foo")); assertFalse(md.isMounted("/content/site/abc/oak:mount-foo/xyz")); assertTrue(md.isMounted("/var/oak:mount-foo")); assertFalse(md.isMounted("/var/abc/oak:mount-foo")); } }
@Override public boolean isMounted(String path) { if (path.contains(pathFragmentName)) { String parent = path.substring(0, path.indexOf(pathFragmentName)); parent = parent.substring(0, parent.lastIndexOf('/')); if (isSupportFragment(parent)) { return true; } } path = SANITIZE_PATH.apply(path); String previousPath = includedPaths.floor(path); return previousPath != null && (previousPath.equals(path) || isAncestor(previousPath, path)); }
/** * Adds a new Mount instance with the specified parameters * * @param name the name of the mount * @param readOnly true for read-only paths, false otherwise * @param pathsSupportingFragments the paths supporting fragments, see {@link Mount#getPathFragmentName()} * @param paths the paths handled by the mount * @return this builder instance */ public Builder mount(String name, boolean readOnly, List<String> pathsSupportingFragments, List<String> paths) { mounts.add(new MountInfo(name, readOnly, pathsSupportingFragments, paths)); return this; }
MountInfo(String name, boolean readOnly, List<String> pathsSupportingFragments, List<String> includedPaths) { this.name = checkNotNull(name, "Mount name must not be null"); this.readOnly = readOnly; this.pathFragmentName = "oak:mount-" + name; this.includedPaths = cleanCopy(includedPaths); this.pathsSupportingFragments = ImmutableSet.copyOf(pathsSupportingFragments); }
/** * Adds a new read-write {@link Mount} with the specified name and paths * * @param name the name of the mount * @param paths the paths handled by the mount * @return this builder instance */ public Builder mount(String name, String... paths) { mounts.add(new MountInfo(name, false, singletonList("/"), asList(paths))); return this; }
/** * Adds a new read-only Mount with the specified name and paths * * @param name the name of the mount * @param paths the paths handled by the mount * @return this builder instance */ public Builder readOnlyMount(String name, String... paths) { mounts.add(new MountInfo(name, true, singletonList("/"), asList(paths))); return this; }
/** * Adds a new read-write {@link Mount} with the specified name and paths * * @param name the name of the mount * @param paths the paths handled by the mount * @return this builder instance */ public Builder mount(String name, String... paths) { mounts.add(new MountInfo(name, false, singletonList("/"), asList(paths))); return this; }
/** * Adds a new read-only Mount with the specified name and paths * * @param name the name of the mount * @param paths the paths handled by the mount * @return this builder instance */ public Builder readOnlyMount(String name, String... paths) { mounts.add(new MountInfo(name, true, singletonList("/"), asList(paths))); return this; }