Index: oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/multiplex/MountInfo.java =================================================================== --- oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/multiplex/MountInfo.java (revision 1752297) +++ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/multiplex/MountInfo.java (working copy) @@ -29,10 +29,11 @@ import org.apache.jackrabbit.oak.spi.mount.Mount; +import static com.google.common.base.Preconditions.checkNotNull; import static org.apache.jackrabbit.oak.commons.PathUtils.isAncestor; -final class MountInfo { - +final class MountInfo implements Mount { + private static final Function SANITIZE_PATH = new Function() { @Override public String apply(String input) { @@ -42,23 +43,25 @@ return input; } }; - - private final Mount mount; + + private final String name; + private final boolean readOnly; + private final boolean defaultMount; + private final String pathFragmentName; private final List includedPaths; - public MountInfo(Mount mount, List includedPaths){ - this.mount = mount; + public MountInfo(String name, boolean readOnly, boolean defaultMount, + List includedPaths) { + this.name = checkNotNull(name, "Mount name must not be null"); + this.readOnly = readOnly; + this.defaultMount = defaultMount; + this.pathFragmentName = "oak:" + name; this.includedPaths = cleanCopy(includedPaths); } - public Mount getMount() { - return mount; - } - + @Override public boolean isUnder(String path) { - path = SANITIZE_PATH.apply(path); - for (String includedPath : includedPaths) { if (isAncestor(path, includedPath)) { return true; @@ -68,9 +71,9 @@ return false; } - public boolean isMounted(String path){ - - if (path.contains(mount.getPathFragmentName())){ + @Override + public boolean isMounted(String path) { + if (path.contains(pathFragmentName)){ return true; } @@ -87,18 +90,65 @@ } @Override + public String getName() { + return name; + } + + @Override + public boolean isReadOnly() { + return readOnly; + } + + @Override + public boolean isDefault() { + return defaultMount; + } + + @Override + public String getPathFragmentName() { + return pathFragmentName; + } + + private static ImmutableList cleanCopy(List includedPaths) { + // ensure that paths don't have trailing slashes - this triggers an assertion in PahtUtils isAncestor + return ImmutableList.copyOf(Iterables.transform(includedPaths, SANITIZE_PATH)); + } + + @Override public String toString() { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); - pw.print(mount); + String readAttr = readOnly ? "r" : "rw"; + String displayName = defaultMount ? "default" : name; + pw.print(displayName + "(" + readAttr + ")"); for (String path : includedPaths) { pw.printf("\t%s%n", path); } return sw.toString(); } - - private ImmutableList cleanCopy(List includedPaths) { - // ensure that paths don't have trailing slashes - this triggers an assertion in PahtUtils isAncestor - return ImmutableList.copyOf(Iterables.transform(includedPaths, SANITIZE_PATH)); + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((name == null) ? 0 : name.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + MountInfo other = (MountInfo) obj; + if (name == null) { + if (other.name != null) + return false; + } else if (!name.equals(other.name)) + return false; + return true; } } Index: oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/multiplex/MountInfoProviderService.java =================================================================== --- oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/multiplex/MountInfoProviderService.java (revision 1752297) +++ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/multiplex/MountInfoProviderService.java (working copy) @@ -73,13 +73,12 @@ boolean readOnly = PropertiesUtil.toBoolean(config.get(PROP_MOUNT_READONLY), PROP_MOUNT_READONLY_DEFAULT); MountInfoProvider mip = MountInfoProvider.DEFAULT; - if (paths != null){ - Mount mount = new Mount(mountName.trim(), readOnly); + if (paths != null) { List trimmedPaths = new ArrayList(paths.length); - for (String path : paths){ + for (String path : paths) { trimmedPaths.add(path.trim()); } - MountInfo mi = new MountInfo(mount, trimmedPaths); + Mount mi = new MountInfo(mountName.trim(), readOnly, false, trimmedPaths); mip = new SimpleMountInfoProvider(Collections.singletonList(mi)); log.info("Enabling mount for {}", mi); } else { Index: oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/multiplex/SimpleMountInfoProvider.java =================================================================== --- oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/multiplex/SimpleMountInfoProvider.java (revision 1752297) +++ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/multiplex/SimpleMountInfoProvider.java (working copy) @@ -23,7 +23,6 @@ import java.util.List; import java.util.Map; -import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; import com.google.common.collect.Maps; @@ -33,15 +32,14 @@ import static java.util.Arrays.asList; /** - * A simple and inefficient implementation to manage mountpoints + * A simple and inefficient implementation to manage mount points */ public class SimpleMountInfoProvider implements MountInfoProvider { - private final List mountInfos; + private final Map mounts; private final boolean hasMounts; - public SimpleMountInfoProvider(List mountInfos){ - this.mountInfos = ImmutableList.copyOf(mountInfos); + public SimpleMountInfoProvider(List mountInfos) { this.mounts = getMounts(mountInfos); this.hasMounts = !mountInfos.isEmpty(); //TODO add validation of mountpoints @@ -49,9 +47,9 @@ @Override public Mount getMountByPath(String path) { - for (MountInfo md : mountInfos){ - if (md.isMounted(path)){ - return md.getMount(); + for (Mount m : mounts.values()){ + if (m.isMounted(path)){ + return m; } } return Mount.DEFAULT; @@ -72,13 +70,12 @@ return hasMounts; } - @Override public Collection getMountsPlacedUnder(String path) { Collection mounts = Lists.newArrayList(); - for ( MountInfo mount : mountInfos ) { + for ( Mount mount : this.mounts.values()) { if ( mount.isUnder(path) ) { - mounts.add(mount.getMount()); + mounts.add(mount); } } return mounts; @@ -91,15 +88,15 @@ } public static final class Builder { - private final List mounts = Lists.newArrayListWithCapacity(1); + private final List mounts = Lists.newArrayListWithCapacity(1); public Builder mount(String name, String... paths) { - mounts.add(new MountInfo(new Mount(name), asList(paths))); + mounts.add(new MountInfo(name, false, false, asList(paths))); return this; } public Builder readOnlyMount(String name, String... paths) { - mounts.add(new MountInfo(new Mount(name, true), asList(paths))); + mounts.add(new MountInfo(name, true, false, asList(paths))); return this; } @@ -110,10 +107,10 @@ //~----------------------------------------< private > - private static Map getMounts(List mountInfos) { + private static Map getMounts(List mountInfos) { Map mounts = Maps.newHashMap(); - for (MountInfo mi : mountInfos){ - mounts.put(mi.getMount().getName(), mi.getMount()); + for (Mount mi : mountInfos){ + mounts.put(mi.getName(), mi); } return ImmutableMap.copyOf(mounts); } Index: oak-core/src/main/java/org/apache/jackrabbit/oak/spi/mount/Mount.java =================================================================== --- oak-core/src/main/java/org/apache/jackrabbit/oak/spi/mount/Mount.java (revision 1752297) +++ oak-core/src/main/java/org/apache/jackrabbit/oak/spi/mount/Mount.java (working copy) @@ -19,74 +19,55 @@ package org.apache.jackrabbit.oak.spi.mount; -import static com.google.common.base.Preconditions.checkNotNull; +public interface Mount { -public final class Mount { /** - * Default Mount info which indicates that no explicit mount - * is created for given path + * Default Mount info which indicates that no explicit mount is created for + * given path */ - public static final Mount DEFAULT = new Mount("", false, true); + public static final Mount DEFAULT = new Mount() { - private final String name; - private final boolean readOnly; - private final boolean defaultMount; - private final String pathFragmentName; + @Override + public String getName() { + return ""; + } - public Mount(String name){ - this(name, false); - } + @Override + public boolean isReadOnly() { + return false; + } - public Mount(String name, boolean readOnly) { - this(name, readOnly, false); - } + @Override + public boolean isDefault() { + return true; + } - private Mount(String name, boolean readOnly, boolean defaultMount){ - this.name = checkNotNull(name, "Mount name must not be null"); - this.readOnly = readOnly; - this.defaultMount = defaultMount; - this.pathFragmentName = "oak:" + name; - } + @Override + public String getPathFragmentName() { + return "oak:"; + } - public String getName() { - return name; - } + @Override + public boolean isMounted(String path) { + return true; + } - public boolean isReadOnly() { - return readOnly; - } + @Override + public boolean isUnder(String path) { + return false; + } - public boolean isDefault(){ - return defaultMount; - } + }; - /** - * Decorated mount name which is meant to be used for constructing path - * which should become part of given mount - */ - public String getPathFragmentName() { - return pathFragmentName; - } + String getName(); - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + boolean isReadOnly(); - Mount mount = (Mount) o; + public boolean isDefault(); - return name.equals(mount.name); - } + String getPathFragmentName(); - @Override - public int hashCode() { - return name.hashCode(); - } + boolean isMounted(String path); - @Override - public String toString() { - String readAttr = readOnly ? "r" : "rw"; - String displayName = defaultMount ? "default" : name; - return displayName + "(" + readAttr + ")"; - } + boolean isUnder(String path); } Index: oak-core/src/main/java/org/apache/jackrabbit/oak/spi/mount/MountInfoProvider.java =================================================================== --- oak-core/src/main/java/org/apache/jackrabbit/oak/spi/mount/MountInfoProvider.java (revision 1752297) +++ oak-core/src/main/java/org/apache/jackrabbit/oak/spi/mount/MountInfoProvider.java (working copy) @@ -45,7 +45,8 @@ public boolean hasNonDefaultMounts() { return false; } - + + @Override public Collection getMountsPlacedUnder(String path) { return Collections.emptySet(); }; @@ -79,12 +80,12 @@ * Return true if there are explicit mounts configured */ boolean hasNonDefaultMounts(); - + /** * Returns all mounts placed under the specified path * * @param path the path under which mounts are to be found * @return a collection of mounts, possibly empty */ - Collection getMountsPlacedUnder(String path); + Collection getMountsPlacedUnder(String path); } Index: oak-core/src/main/java/org/apache/jackrabbit/oak/spi/mount/package-info.java =================================================================== --- oak-core/src/main/java/org/apache/jackrabbit/oak/spi/mount/package-info.java (revision 1752297) +++ oak-core/src/main/java/org/apache/jackrabbit/oak/spi/mount/package-info.java (working copy) @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -@Version("1.0.0") +@Version("2.0.0") @Export(optional = "provide:=true") package org.apache.jackrabbit.oak.spi.mount; Index: oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/multiplex/MountInfoTest.java =================================================================== --- oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/multiplex/MountInfoTest.java (revision 1752297) +++ oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/multiplex/MountInfoTest.java (working copy) @@ -19,17 +19,17 @@ package org.apache.jackrabbit.oak.plugins.multiplex; -import org.apache.jackrabbit.oak.spi.mount.Mount; -import org.junit.Test; - import static com.google.common.collect.ImmutableList.of; -import static org.junit.Assert.*; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import org.junit.Test; public class MountInfoTest { @Test public void mountNameInPath() throws Exception{ - MountInfo md = new MountInfo(new Mount("foo"), of("/a", "/b")); + MountInfo md = new MountInfo("foo", false, false, of("/a", "/b")); assertTrue(md.isMounted("/a")); assertTrue(md.isMounted("/b")); assertTrue(md.isMounted("/b/c/d")); Index: oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/multiplex/SimpleMountInfoProviderTest.java =================================================================== --- oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/multiplex/SimpleMountInfoProviderTest.java (revision 1752297) +++ oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/multiplex/SimpleMountInfoProviderTest.java (working copy) @@ -35,7 +35,7 @@ public class SimpleMountInfoProviderTest { @Test public void defaultMount() throws Exception { - MountInfoProvider mip = new SimpleMountInfoProvider(Collections.emptyList()); + MountInfoProvider mip = new SimpleMountInfoProvider(Collections.emptyList()); assertNotNull(mip.getMountByPath("/a")); assertTrue(mip.getMountByPath("/a").isDefault());