public Builder addMount(String mountName, NodeStore store) { checkNotNull(store, "store"); checkNotNull(mountName, "mountName"); Mount mount = checkNotNull(mip.getMountByName(mountName), "No mount with name %s found in %s", mountName, mip); nonDefaultStores.add(new MountedNodeStore(mount, store)); return this; }
private void initializeMounts() { fooMount = mip.getMountByName("foo"); roMount = mip.getMountByName("ro"); defaultMount = mip.getDefaultMount(); }
@Test public void nonDefaultMounts() throws Exception{ MountInfoProvider mip = Mounts.newBuilder() .mount("foo", "/a", "/b") .mount("bar", "/x", "/y") .build(); Collection<Mount> mounts = mip.getNonDefaultMounts(); assertEquals(2, mounts.size()); assertFalse(mounts.contains(mip.getDefaultMount())); assertNotNull(mip.getMountByName("foo")); assertNotNull(mip.getMountByName("bar")); assertNull(mip.getMountByName("boom")); }
@Test public void readOnlyMounting() throws Exception{ MountInfoProvider mip = Mounts.newBuilder() .mount("foo", "/a", "/b") .readOnlyMount("bar", "/x", "/y") .build(); assertTrue(mip.getMountByName("bar").isReadOnly()); assertFalse(mip.getMountByName("foo").isReadOnly()); }
@Test public void testPermissionProviderName() { assertEquals("oak.default", MountPermissionProvider.getPermissionRootName(mountInfoProvider.getDefaultMount(), "oak.default")); assertEquals("oak:mount-testMount-oak.default", MountPermissionProvider .getPermissionRootName(mountInfoProvider.getMountByName("testMount"), "oak.default")); }
@Test public void mountWithConfig_Name() throws Exception{ MockOsgi.activate(service, context.bundleContext(), ImmutableMap.<String, Object>of( "mountedPaths", new String[] {"/a", "/b"}, "mountName", "foo", "readOnlyMount", true )); MountInfoProvider provider = context.getService(MountInfoProvider.class); assertEquals(1, provider.getNonDefaultMounts().size()); Mount m = provider.getMountByName(MountInfoProviderService.PROP_MOUNT_NAME_DEFAULT); assertNull(m); Mount defMount = provider.getDefaultMount(); assertNotNull(defMount); m = provider.getMountByName("foo"); assertEquals(m, provider.getMountByPath("/a")); assertEquals(defMount, provider.getMountByPath("/x")); assertTrue(m.isReadOnly()); }
private void check(String path) { Tree tree = TreeUtil.getTree(TreeFactory.createReadOnlyTree(mount.getRoot()), path); ErrorHolder errorHolder = new ErrorHolder(); checker.check(new MountedNodeStore(mip.getMountByName("first"), mount), tree, errorHolder, context); errorHolder.end(); }
@Test public void mountWithConfig_Paths() throws Exception{ MockOsgi.activate(service, context.bundleContext(), ImmutableMap.<String, Object>of("mountedPaths", new String[] {"/a", "/b"})); MountInfoProvider provider = context.getService(MountInfoProvider.class); assertEquals(1, provider.getNonDefaultMounts().size()); Mount m = provider.getMountByName(MountInfoProviderService.PROP_MOUNT_NAME_DEFAULT); assertNotNull(m); Mount defMount = provider.getDefaultMount(); assertNotNull(defMount); assertFalse(m.isReadOnly()); assertEquals(m, provider.getMountByPath("/a")); assertEquals(defMount, provider.getMountByPath("/x")); }
@Test(expected = IllegalRepositoryStateException.class) public void referenceableNodeIsDetected() throws CommitFailedException { MemoryNodeStore root = new MemoryNodeStore(); MemoryNodeStore mount = new MemoryNodeStore(); NodeBuilder builder = mount.getRoot().builder(); builder.child("first") .setProperty(PropertyStates.createProperty(JcrConstants.JCR_MIXINTYPES, Collections.singletonList(JcrConstants.MIX_REFERENCEABLE), Type.NAMES)) .setProperty(JcrConstants.JCR_UUID, UUID.randomUUID().toString()); mount.merge(builder, EmptyHook.INSTANCE, CommitInfo.EMPTY); MountInfoProvider mip = Mounts.newBuilder() .readOnlyMount("first", "/first") .build(); NodeTypeMountedNodeStoreChecker checker = new NodeTypeMountedNodeStoreChecker(JcrConstants.MIX_REFERENCEABLE, "test error"); Context context = checker.createContext(root, mip); ErrorHolder errorHolder = new ErrorHolder(); checker.check(new MountedNodeStore(mip.getMountByName("first"), mount), TreeFactory.createReadOnlyTree(mount.getRoot()).getChild("first"), errorHolder, context); errorHolder.end(); }
@Before public void createFixture() throws CommitFailedException { globalStore = new MemoryNodeStore(); mountedStore = new MemoryNodeStore(); NodeBuilder rootBuilder = mountedStore.getRoot().builder(); rootBuilder.setChildNode("first").setChildNode("second").setChildNode("third"); rootBuilder.setChildNode("not-covered"); mountedStore.merge(rootBuilder, EmptyHook.INSTANCE, CommitInfo.EMPTY); mip = Mounts.newBuilder() .readOnlyMount("first", "/first") .build(); mount = mip.getMountByName("first"); }
@Test public void referenceableNodeInWhitelistIsSkipped() throws CommitFailedException { MemoryNodeStore root = new MemoryNodeStore(); MemoryNodeStore mount = new MemoryNodeStore(); NodeBuilder builder = mount.getRoot().builder(); builder.child("first") .setProperty(PropertyStates.createProperty(JcrConstants.JCR_PRIMARYTYPE, JcrConstants.NT_RESOURCE, Type.NAME)) .setProperty(PropertyStates.createProperty(JcrConstants.JCR_MIXINTYPES, Collections.singletonList(JcrConstants.MIX_REFERENCEABLE), Type.NAMES)) .setProperty(JcrConstants.JCR_UUID, UUID.randomUUID().toString()); mount.merge(builder, EmptyHook.INSTANCE, CommitInfo.EMPTY); MountInfoProvider mip = Mounts.newBuilder() .readOnlyMount("first", "/first") .build(); NodeTypeMountedNodeStoreChecker checker = new NodeTypeMountedNodeStoreChecker(JcrConstants.MIX_REFERENCEABLE, "test error", JcrConstants.NT_RESOURCE); Context context = checker.createContext(root, mip); ErrorHolder errorHolder = new ErrorHolder(); checker.check(new MountedNodeStore(mip.getMountByName("first"), mount), TreeFactory.createReadOnlyTree(mount.getRoot()).getChild("first"), errorHolder, context); errorHolder.end(); } }
@Test public void contributingStoreReturnsInfinity() { MountInfoProvider mip = Mounts.newBuilder().readOnlyMount("libs", "/libs", "/libs1", "/libs2", "/libs3", "/libs4").build(); NodeStore globalStore = new MemoryNodeStore(); NodeStore libsStore = new MemoryNodeStore(); List<MountedNodeStore> mounts = Lists.newArrayList(); mounts.add(new MountedNodeStore(mip.getMountByName("libs"), libsStore)); CompositeNodeStore compositeNodeStore = new CompositeNodeStore(mip, globalStore, mounts); CompositeNodeStoreBuilder b = new CompositeNodeStoreBuilder(compositeNodeStore.ctx); TestingNodeState globalTestingNS = b.configureMount("/", 5); TestingNodeState libsTestingNS = b.configureMount("/libs", MAX_VALUE); CompositeNodeState mns = b.getNodeState(); assertEquals(MAX_VALUE, mns.getChildNodeCount(100)); assertEquals(5, globalTestingNS.fetchedChildren); assertEquals(0, libsTestingNS.fetchedChildren); globalTestingNS.fetchedChildren = 0; libsTestingNS.fetchedChildren = 0; assertEquals(MAX_VALUE, mns.builder().getChildNodeCount(100)); assertEquals(5, globalTestingNS.fetchedChildren); assertEquals(0, libsTestingNS.fetchedChildren); }
@Test public void customNodeName() throws Exception { MountInfoProvider mip = Mounts.newBuilder() .mount("foo", "/a", "/b").build(); Mount m = mip.getMountByName("foo"); assertEquals(":index", getIndexNodeName(mip, "/foo", INDEX_CONTENT_NODE_NAME)); assertEquals(":index", getNodeForMount(mip.getDefaultMount(), INDEX_CONTENT_NODE_NAME)); assertEquals(":" + m.getPathFragmentName() + "-index", getIndexNodeName(mip, "/a", INDEX_CONTENT_NODE_NAME)); assertEquals(":" + m.getPathFragmentName() + "-index", getNodeForMount(m, INDEX_CONTENT_NODE_NAME)); } }
@Test public void noConflict() throws Exception { MemoryNodeStore globalStore = new MemoryNodeStore(); MemoryNodeStore mountedStore = new MemoryNodeStore(); populateStore(globalStore, b -> b.child("first").setProperty("foo", "baz")); populateStore(mountedStore, b -> b.child("libs").child("first").setProperty("foo", "bar")); UniqueIndexNodeStoreChecker checker = new UniqueIndexNodeStoreChecker(); Context ctx = checker.createContext(globalStore, mip); ErrorHolder error = new ErrorHolder(); checker.check(new MountedNodeStore(mip.getMountByName("libs"), mountedStore), TreeFactory.createReadOnlyTree(mountedStore.getRoot()), error, ctx); error.end(); }
public void run() throws CommitFailedException { MemoryNodeStore root = new MemoryNodeStore(INITIAL_CONTENT); MemoryNodeStore mount = new MemoryNodeStore(); NodeBuilder mountBuilder = mount.getRoot().builder(); initMountContent(mountBuilder); mount.merge(mountBuilder, EmptyHook.INSTANCE, CommitInfo.EMPTY); MountInfoProvider mip = Mounts.newBuilder() .readOnlyMount("first", "/first") .build(); NodeTypeDefinitionNodeStoreChecker checker = new NodeTypeDefinitionNodeStoreChecker(); Context context = checker.createContext(root, mip); ErrorHolder errorHolder = new ErrorHolder(); checker.check(new MountedNodeStore(mip.getMountByName("first"), mount), TreeFactory.createReadOnlyTree(mount.getRoot()), errorHolder, context); errorHolder.end(); }
/** * Tests that if a mount has an index clash but the path does not belong to the mount no error is reported */ @Test public void noConflict_mountHasDuplicateOutsideOfPath() throws Exception { MemoryNodeStore globalStore = new MemoryNodeStore(); MemoryNodeStore mountedStore = new MemoryNodeStore(); populateStore(globalStore, b -> b.child("first").setProperty("foo", "bar")); populateStore(mountedStore, b -> b.child("second").setProperty("foo", "bar")); UniqueIndexNodeStoreChecker checker = new UniqueIndexNodeStoreChecker(); Context ctx = checker.createContext(globalStore, mip); ErrorHolder error = new ErrorHolder(); checker.check(new MountedNodeStore(mip.getMountByName("libs"), mountedStore), TreeFactory.createReadOnlyTree(mountedStore.getRoot()), error, ctx); error.end(); }
@Test public void uuidConflict_threeStores() throws Exception { MemoryNodeStore globalStore = new MemoryNodeStore(); MemoryNodeStore mountedStore = new MemoryNodeStore(); MemoryNodeStore mountedStore2 = new MemoryNodeStore(); populateStore(globalStore, b -> b.child("first").setProperty("foo", "bar")); populateStore(globalStore, b -> b.child("second").setProperty("foo", "baz")); populateStore(mountedStore, b -> b.child("libs").child("first").setProperty("foo", "bar")); populateStore(mountedStore2, b -> b.child("apps").child("first").setProperty("foo", "baz")); UniqueIndexNodeStoreChecker checker = new UniqueIndexNodeStoreChecker(); Context ctx = checker.createContext(globalStore, mip); exception.expect(IllegalRepositoryStateException.class); exception.expectMessage("2 errors were found"); exception.expectMessage("clash for value bar: 'duplicate unique index entry'"); exception.expectMessage("clash for value baz: 'duplicate unique index entry'"); ErrorHolder error = new ErrorHolder(); checker.check(new MountedNodeStore(mip.getMountByName("libs"), mountedStore), TreeFactory.createReadOnlyTree(mountedStore.getRoot()), error, ctx); checker.check(new MountedNodeStore(mip.getMountByName("apps"), mountedStore2), TreeFactory.createReadOnlyTree(mountedStore.getRoot()), error, ctx); error.end(); }
@Test public void uuidConflict_twoStores() throws Exception { MemoryNodeStore globalStore = new MemoryNodeStore(); MemoryNodeStore mountedStore = new MemoryNodeStore(); populateStore(globalStore, b -> b.child("first").setProperty("foo", "bar")); populateStore(mountedStore, b -> b.child("libs").child("first").setProperty("foo", "bar")); UniqueIndexNodeStoreChecker checker = new UniqueIndexNodeStoreChecker(); Context ctx = checker.createContext(globalStore, mip); exception.expect(IllegalRepositoryStateException.class); exception.expectMessage("1 errors were found"); exception.expectMessage("clash for value bar: 'duplicate unique index entry'"); ErrorHolder error = new ErrorHolder(); checker.check(new MountedNodeStore(mip.getMountByName("libs"), mountedStore), TreeFactory.createReadOnlyTree(mountedStore.getRoot()), error, ctx); error.end(); }
/** * Tests that if a mount has an index clash but the path does not belog to the global mount no error is reported * */ @Test public void noConflict_globalMountHasDuplicateOutsideOfPath() throws Exception { MemoryNodeStore globalStore = new MemoryNodeStore(); MemoryNodeStore mountedStore = new MemoryNodeStore(); populateStore(globalStore, b -> b.child("libs").child("first").setProperty("foo", "bar")); populateStore(mountedStore, b -> b.child("libs").child("second").setProperty("foo", "bar")); UniqueIndexNodeStoreChecker checker = new UniqueIndexNodeStoreChecker(); Context ctx = checker.createContext(globalStore, mip); ErrorHolder error = new ErrorHolder(); checker.check(new MountedNodeStore(mip.getMountByName("libs"), mountedStore), TreeFactory.createReadOnlyTree(mountedStore.getRoot()), error, ctx); error.end(); }
@Test public void multiplexingWriter() throws Exception{ newLucenePropertyIndex("lucene", "foo"); MountInfoProvider mip = Mounts.newBuilder() .mount("foo", "/libs", "/apps").build(); EditorHook hook = new EditorHook( new IndexUpdateProvider( new LuceneIndexEditorProvider(null, new ExtractedTextCache(0, 0), null, mip))); NodeState indexed = hook.processCommit(EMPTY_NODE, builder.getNodeState(), CommitInfo.EMPTY); builder = indexed.builder(); NodeState before = indexed; builder.child("content").child("en").setProperty("foo", "bar"); builder.child("libs").child("install").setProperty("foo", "bar"); NodeState after = builder.getNodeState(); indexed = hook.processCommit(before, after, CommitInfo.EMPTY); builder = indexed.builder(); assertEquals(1, numDocs(mip.getMountByName("foo"))); assertEquals(1, numDocs(mip.getDefaultMount())); }