public Oak() { this(new MemoryNodeStore()); // this(new DocumentMK.Builder().open()); // this(new LogWrapper(new DocumentMK.Builder().open())); }
/** * Returns a string representation the head state of this node store. */ public String toString() { return getRoot().toString(); }
@Nonnull @Override public synchronized NodeState merge(@Nonnull NodeBuilder builder, @Nonnull CommitHook commitHook, @Nonnull CommitInfo info) throws CommitFailedException { return memoryNodeStore.merge(builder, commitHook, info); }
@Before public void prepareRepository() throws Exception { MemoryNodeStore root = new MemoryNodeStore(); mount = new MemoryNodeStore(); NodeBuilder rootBuilder = root.getRoot().builder(); new InitialContent().initialize(rootBuilder); root.merge(rootBuilder, EmptyHook.INSTANCE, CommitInfo.EMPTY); mip = Mounts.newBuilder() .readOnlyMount("first", "/first") .build(); checker = new NamespacePrefixNodestoreChecker(); context = checker.createContext(root, mip); }
@Test public void cpCleanupWUnrelatedChanges() throws Exception { MemoryNodeStore store = new MemoryNodeStore(); IndexEditorProvider provider = new PropertyIndexEditorProvider(); NodeBuilder builder = store.getRoot().builder(); createIndexDefinition(builder.child(INDEX_DEFINITIONS_NAME), "rootIndex", true, false, ImmutableSet.of("foo"), null) .setProperty(ASYNC_PROPERTY_NAME, "async"); builder.child("testRoot").setProperty("foo", "abc"); store.merge(builder, EmptyHook.INSTANCE, CommitInfo.EMPTY); store.listCheckpoints().size() == 0); store.listCheckpoints().size() == 1); String firstCp = store.listCheckpoints().iterator().next(); builder = store.getRoot().builder(); builder.child("testRoot").child(":hidden"); store.merge(builder, EmptyHook.INSTANCE, CommitInfo.EMPTY); async.run(); store.listCheckpoints().size() == 1); String secondCp = store.listCheckpoints().iterator().next(); assertFalse("Store should keep only second checkpoint", secondCp.equals(firstCp)); assertEquals( secondCp, store.getRoot().getChildNode(ASYNC) .getString("async"));
@Test public void testNodeName() { NodeState root = new MemoryNodeStore().getRoot(); NodeBuilder builder = root.builder(); NodeBuilder file = builder.child("file"); file.setProperty(JCR_PRIMARYTYPE, NT_FILE); file.child(JCR_CONTENT); SimpleNodeAggregator agg = new SimpleNodeAggregator().newRuleWithName( NT_FILE, newArrayList(JCR_CONTENT)); String path = "/file/jcr:content"; List<String> actual = newArrayList(agg.getParents( builder.getNodeState(), path)); assertEquals(newArrayList("/file"), actual); }
@Test public void cpCleanupOrphaned() throws Exception { Clock clock = Clock.SIMPLE; MemoryNodeStore store = new MemoryNodeStore(); NodeBuilder builder = store.getRoot().builder(); createIndexDefinition(builder.child(INDEX_DEFINITIONS_NAME), "rootIndex", true, false, ImmutableSet.of("foo"), null) .setProperty(ASYNC_PROPERTY_NAME, "async"); builder.child("testRoot").setProperty("foo", "abc"); store.merge(builder, EmptyHook.INSTANCE, CommitInfo.EMPTY); store.listCheckpoints().size() == 0); async.run(); assertTrue("Expecting one checkpoint", store.listCheckpoints().size() == 1); String cp = store.listCheckpoints().iterator().next(); Map<String, String> info = store.checkpointInfo(cp); builder = store.getRoot().builder(); builder.child("testRoot").setProperty("foo", "def"); store.merge(builder, EmptyHook.INSTANCE, CommitInfo.EMPTY); async.run(); assertTrue("Expecting one checkpoint", store.listCheckpoints().size() == 1); cp = store.listCheckpoints().iterator().next(); c.setTimeInMillis(clock.getTime() - 2 * async.getLeaseTimeOut());
@Test public void commitContext() throws Exception{ MemoryNodeStore store = new MemoryNodeStore(); IndexEditorProvider provider = new PropertyIndexEditorProvider(); NodeBuilder builder = store.getRoot().builder(); createIndexDefinition(builder.child(INDEX_DEFINITIONS_NAME), "rootIndex", true, false, ImmutableSet.of("foo"), null) .setProperty(ASYNC_PROPERTY_NAME, "async"); builder.child("testRoot").setProperty("foo", "abc"); // merge it back in store.merge(builder, EmptyHook.INSTANCE, CommitInfo.EMPTY); AsyncIndexUpdate async = new AsyncIndexUpdate("async", store, provider); CommitInfoCollector infoCollector = new CommitInfoCollector(); store.addObserver(infoCollector); async.run(); assertFalse(infoCollector.infos.isEmpty()); assertNotNull(infoCollector.infos.get(0).getInfo().get(CommitContext.NAME)); }
MemoryNodeStore seed = new MemoryNodeStore(); NodeBuilder root = seed.getRoot().builder(); root.child("first"); root.child("second"); seed.merge(root, EmptyHook.INSTANCE, CommitInfo.EMPTY); String checkpoint1 = seed.checkpoint(TimeUnit.MINUTES.toMillis(10)); root = seed.getRoot().builder(); root.child("third"); seed.merge(root, EmptyHook.INSTANCE, CommitInfo.EMPTY); MemoryNodeStore target = new MemoryNodeStore(); NodeBuilder targetRootBuilder = target.getRoot().builder(); targetRootBuilder.child(CLUSTER_CONFIG_NODE); target.merge(targetRootBuilder, EmptyHook.INSTANCE, CommitInfo.EMPTY); icm.migrate(); NodeState targetRoot = target.getRoot(); NodeState checkpointTargetRoot = target.retrieve(checkpoint1); assertFalse("Node /first should not have been migrated", checkpointTargetRoot.hasChildNode("first")); assertTrue("Node /second should have been migrated", checkpointTargetRoot.hasChildNode("second"));
@Test public void changeCollectionEnabled() throws Exception{ injectDefaultServices(); Map<String,Object> config = ImmutableMap.<String, Object>of( "asyncConfigs", new String[] {"async:5"} ); context.registerService(IndexEditorProvider.class, new PropertyIndexEditorProvider()); MockOsgi.activate(service, context.bundleContext(), config); NodeBuilder builder = nodeStore.getRoot().builder(); createIndexDefinition(builder.child(INDEX_DEFINITIONS_NAME), "rootIndex", true, false, ImmutableSet.of("foo"), null) .setProperty(ASYNC_PROPERTY_NAME, "async"); builder.child("testRoot").setProperty("foo", "abc"); // merge it back in nodeStore.merge(builder, EmptyHook.INSTANCE, CommitInfo.EMPTY); CommitInfoCollector infoCollector = new CommitInfoCollector(); nodeStore.addObserver(infoCollector); AsyncIndexUpdate indexUpdate = getIndexUpdate("async"); indexUpdate.run(); CommitContext commitContext = (CommitContext) infoCollector.infos.get(0).getInfo().get(CommitContext.NAME); assertNotNull(commitContext); ChangeSet changeSet = (ChangeSet) commitContext.get(ChangeSet.COMMIT_CONTEXT_OBSERVATION_CHANGESET); assertNotNull(changeSet); }
@Override @NotNull public synchronized String checkpoint(long lifetime) { return checkpoint(lifetime, Collections.<String, String>emptyMap()); }
@Override public NodeState retrieve(@Nonnull String checkpoint) { if (inheritedCheckpoints.contains(checkpoint)) { return nodeStore.retrieve(checkpoint); } else if (checkpointMapping.containsKey(checkpoint)) { return memoryNodeStore.retrieve(checkpointMapping.get(checkpoint)); } else { return null; } }
@Override public Closeable addObserver(Observer observer) { return memoryNodeStore.addObserver(observer); } }
@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 cpCleanupWChanges() throws Exception { MemoryNodeStore store = new MemoryNodeStore(); IndexEditorProvider provider = new PropertyIndexEditorProvider(); NodeBuilder builder = store.getRoot().builder(); createIndexDefinition(builder.child(INDEX_DEFINITIONS_NAME), "rootIndex", true, false, ImmutableSet.of("foo"), null) .setProperty(ASYNC_PROPERTY_NAME, "async"); builder.child("testRoot").setProperty("foo", "abc"); store.merge(builder, EmptyHook.INSTANCE, CommitInfo.EMPTY); store.listCheckpoints().size() == 0); store.listCheckpoints().size() == 1); String firstCp = store.listCheckpoints().iterator().next(); builder = store.getRoot().builder(); builder.child("testRoot").setProperty("foo", "def"); store.merge(builder, EmptyHook.INSTANCE, CommitInfo.EMPTY); store.listCheckpoints().size() == 1); String secondCp = store.listCheckpoints().iterator().next(); assertFalse("Store should keep only second checkpoint", secondCp.equals(firstCp)); assertEquals( secondCp, store.getRoot().getChildNode(ASYNC) .getString("async"));
@Test public void testNodeNameWrongParentType() { NodeState root = new MemoryNodeStore().getRoot(); NodeBuilder builder = root.builder(); NodeBuilder file = builder.child("file"); file.setProperty(JCR_PRIMARYTYPE, NT_FILE + "_"); file.child(JCR_CONTENT); SimpleNodeAggregator agg = new SimpleNodeAggregator().newRuleWithName( NT_FILE, newArrayList(JCR_CONTENT)); String path = "/file/jcr:content"; List<String> actual = newArrayList(agg.getParents( builder.getNodeState(), path)); assertTrue(actual.isEmpty()); }
MemoryNodeStore store = new MemoryNodeStore(); final List<NodeState> rootStates = Lists.newArrayList(); store.addObserver(new Observer() { @Override public void contentChanged(@NotNull NodeState root, @Nullable CommitInfo info) { NodeBuilder builder = store.getRoot().builder(); createIndexDefinition(builder.child(INDEX_DEFINITIONS_NAME), "rootIndex", true, false, ImmutableSet.of("foo"), null) .setProperty(ASYNC_PROPERTY_NAME, "async"); builder.child("testRoot").setProperty("foo", "abc"); store.merge(builder, EmptyHook.INSTANCE, CommitInfo.EMPTY); builder = store.getRoot().builder(); builder.child("testRoot2").setProperty("foo", "abc"); store.merge(builder, EmptyHook.INSTANCE, CommitInfo.EMPTY); pre.run(); NodeState async = ns.getChildNode(ASYNC); String checkpointName = async.getString("async"); if (store.retrieve(checkpointName) == null && async.getProperty(AsyncIndexUpdate.leasify("async")) == null){ oldRootState.set(ns); store = new MemoryNodeStore(store.getRoot()) { @Override public NodeState getRoot() {
@Override @Nonnull public synchronized String checkpoint(long lifetime) { return checkpoint(lifetime, Collections.<String, String>emptyMap()); }