NodeCounterEditor(NodeCounterRoot root, MountInfoProvider mountInfoProvider) { this.root = root; this.name = "/"; this.parent = null; this.mountInfoProvider = mountInfoProvider; this.currentMount = mountInfoProvider.getDefaultMount(); this.mountCanChange = true; this.countOffsets = new HashMap<>(); }
NodeCounterEditor(NodeCounterRoot root, MountInfoProvider mountInfoProvider) { this.root = root; this.name = "/"; this.parent = null; this.mountInfoProvider = mountInfoProvider; this.currentMount = mountInfoProvider.getDefaultMount(); this.mountCanChange = true; this.countOffsets = new HashMap<>(); }
NodeCounterEditor(NodeCounterRoot root, MountInfoProvider mountInfoProvider) { this.root = root; this.name = "/"; this.parent = null; this.mountInfoProvider = mountInfoProvider; this.currentMount = mountInfoProvider.getDefaultMount(); this.mountCanChange = true; this.countOffsets = new HashMap<>(); }
CompositionContext(MountInfoProvider mip, NodeStore globalStore, List<MountedNodeStore> nonDefaultStores, CompositeNodeStoreMonitor nodeStateMonitor, CompositeNodeStoreMonitor nodeBuilderMonitor) { this.pathCache = new StringCache().withMonitor(nodeStateMonitor); this.mip = mip; this.globalStore = new MountedNodeStore(mip.getDefaultMount(), globalStore); this.nonDefaultStores = nonDefaultStores; ImmutableSet.Builder<MountedNodeStore> b = ImmutableSet.builder(); b.add(this.globalStore); b.addAll(this.nonDefaultStores); allStores = b.build(); this.nodeStoresByMount = allStores.stream().collect(Collectors.toMap(MountedNodeStore::getMount, Function.identity())); this.nodeStateMonitor = nodeStateMonitor; this.nodeBuilderMonitor = nodeBuilderMonitor; }
@Override public boolean close(long timestamp) throws IOException { // explicitly get writers for mounts which haven't got writers even at close. // This essentially ensures we respect DefaultIndexWriters#close's intent to // create empty index even if nothing has been written during re-index. stream(concat(singleton(mountInfoProvider.getDefaultMount()), mountInfoProvider.getNonDefaultMounts()) .spliterator(), false) .filter(m -> reindex && !m.isReadOnly()) // only needed when re-indexing for read-write mounts. // reindex for ro-mount doesn't make sense in this case anyway. .forEach(m -> getWriter(m)); // open default writers for mounts that passed all our tests boolean indexUpdated = false; for (LuceneIndexWriter w : writers.values()) { indexUpdated |= w.close(timestamp); } return indexUpdated; }
private List<LuceneIndexReader> createMountedReaders(LuceneIndexDefinition definition, NodeState defnState, String indexPath) throws IOException { ImmutableList.Builder<LuceneIndexReader> readers = ImmutableList.builder(); LuceneIndexReader reader = createReader(mountInfoProvider.getDefaultMount(), definition, defnState, indexPath); //Default mount is the first entry. This ensures that suggester, spellcheck can work on that untill they //support multiple readers if (reader != null) { readers.add(reader); } for (Mount m : mountInfoProvider.getNonDefaultMounts()) { reader = createReader(m, definition, defnState, indexPath); if (reader != null) { readers.add(reader); } } return readers.build(); }
private List<LuceneIndexReader> createMountedReaders(LuceneIndexDefinition definition, NodeState defnState, String indexPath) throws IOException { ImmutableList.Builder<LuceneIndexReader> readers = ImmutableList.builder(); LuceneIndexReader reader = createReader(mountInfoProvider.getDefaultMount(), definition, defnState, indexPath); //Default mount is the first entry. This ensures that suggester, spellcheck can work on that untill they //support multiple readers if (reader != null) { readers.add(reader); } for (Mount m : mountInfoProvider.getNonDefaultMounts()) { reader = createReader(m, definition, defnState, indexPath); // Although, it shouldn't matter much, but let's not add extra readers if they don't have any docs if (reader != null && reader.getReader() != null && reader.getReader().numDocs() > 0) { readers.add(reader); } } return readers.build(); }
Mount defMount = mountInfoProvider.getDefaultMount();
Mount defMount = mountInfoProvider.getDefaultMount();
private void initializeMounts() { fooMount = mip.getMountByName("foo"); roMount = mip.getMountByName("ro"); defaultMount = mip.getDefaultMount(); }
@Override public Context createContext(NodeStore globalStore, MountInfoProvider mip) { Context ctx = new Context(mip); // read definitions from oak:index, and pick all unique indexes NodeState indexDefs = globalStore.getRoot().getChildNode(INDEX_DEFINITIONS_NAME); for ( ChildNodeEntry indexDef : indexDefs.getChildNodeEntries() ) { if ( indexDef.getNodeState().hasProperty(UNIQUE_PROPERTY_NAME) && indexDef.getNodeState().getBoolean(UNIQUE_PROPERTY_NAME) ) { ctx.add(indexDef, mip.getDefaultMount(), indexDefs); ctx.track(new MountedNodeStore(mip.getDefaultMount() , globalStore)); } } return ctx; }
@Test public void defaultSetup() throws Exception { assertEquals( INDEX_CONTENT_NODE_NAME, getIndexNodeName(mip, "/foo", INDEX_CONTENT_NODE_NAME)); assertEquals(INDEX_CONTENT_NODE_NAME, getNodeForMount(mip.getDefaultMount(), INDEX_CONTENT_NODE_NAME)); }
@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 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 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 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()); }
@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)); } }
Mount defMount = mip.getDefaultMount(); NodeState indexedState = getNode(indexed, "/oak:index/foo/" + getNodeForMount(defMount) + "/abc"); assertTrue(indexedState.exists());
@Test public void mountWithCommitInWritableMount() throws Exception{ NodeState root = INITIAL_CONTENT; // Add index definition NodeBuilder builder = root.builder(); NodeBuilder index = createIndexDefinition(builder.child(INDEX_DEFINITIONS_NAME), "foo", true, false, ImmutableSet.of("foo"), null); index.setProperty("entryCount", -1); NodeState before = builder.getNodeState(); // Add some content and process it through the property index hook builder.child("content").setProperty("foo", "abc"); NodeState after = builder.getNodeState(); MountInfoProvider mip = Mounts.newBuilder() .readOnlyMount("foo", "/readOnly") .build(); CompositeHook hook = new CompositeHook( new EditorHook(new IndexUpdateProvider(new PropertyIndexEditorProvider().with(mip))), new EditorHook(new ValidatorProvider(){ protected Validator getRootValidator(NodeState before, NodeState after, CommitInfo info) { return new PrivateStoreValidator("/", mip); } }) ); NodeState indexed = hook.processCommit(before, after, CommitInfo.EMPTY); Mount defMount = mip.getDefaultMount(); assertTrue(getNode(indexed, pathInIndex(defMount, "/oak:index/foo", "/content", "abc")).exists()); }
@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())); }