protected MutableCachedNode createNode( SessionCache session, MutableCachedNode parent, String id, Name name, Name primaryType, Property... properties ) { NodeKey key = session.getRootKey().withId(id); return parent.createChild(session, key, name, propFactory.create(JcrLexicon.PRIMARY_TYPE, primaryType), properties); }
protected MutableCachedNode createNode( SessionCache session, MutableCachedNode parent, String id, Name name, Name primaryType, Property... properties ) { NodeKey key = session.getRootKey().withId(id); return parent.createChild(session, key, name, propFactory.create(JcrLexicon.PRIMARY_TYPE, primaryType), properties); }
void storeLock( ModeShapeLock lock ) { MutableCachedNode locksNode = mutableLocksNode(); Name name = names.create(lock.getLockToken()); List<Property> properties = new ArrayList<Property>(); properties.add(propertyFactory.create(JcrLexicon.PRIMARY_TYPE, ModeShapeLexicon.LOCK)); properties.add(propertyFactory.create(JcrLexicon.LOCK_OWNER, lock.getLockOwner())); properties.add(propertyFactory.create(JcrLexicon.LOCK_IS_DEEP, lock.isDeep())); properties.add(propertyFactory.create(ModeShapeLexicon.WORKSPACE, lock.getWorkspaceName())); properties.add(propertyFactory.create(ModeShapeLexicon.LOCK_TOKEN, lock.getLockToken())); properties.add(propertyFactory.create(ModeShapeLexicon.IS_SESSION_SCOPED, lock.isSessionScoped())); // Locks are always created by sessions and then held by them unless explicitly removed later ... properties.add(propertyFactory.create(ModeShapeLexicon.IS_HELD_BY_SESSION, true)); properties.add(propertyFactory.create(ModeShapeLexicon.LOCKING_SESSION, lock.getLockingSessionId())); properties.add(propertyFactory.create(ModeShapeLexicon.EXPIRATION_DATE, lock.getExpiryTime())); locksNode.createChild(system, lock.getLockKey(), name, properties); }
void storeLock( ModeShapeLock lock ) { MutableCachedNode locksNode = mutableLocksNode(); Name name = names.create(lock.getLockToken()); List<Property> properties = new ArrayList<Property>(); properties.add(propertyFactory.create(JcrLexicon.PRIMARY_TYPE, ModeShapeLexicon.LOCK)); properties.add(propertyFactory.create(JcrLexicon.LOCK_OWNER, lock.getLockOwner())); properties.add(propertyFactory.create(JcrLexicon.LOCK_IS_DEEP, lock.isDeep())); properties.add(propertyFactory.create(ModeShapeLexicon.WORKSPACE, lock.getWorkspaceName())); properties.add(propertyFactory.create(ModeShapeLexicon.LOCK_TOKEN, lock.getLockToken())); properties.add(propertyFactory.create(ModeShapeLexicon.IS_SESSION_SCOPED, lock.isSessionScoped())); // Locks are always created by sessions and then held by them unless explicitly removed later ... properties.add(propertyFactory.create(ModeShapeLexicon.IS_HELD_BY_SESSION, true)); properties.add(propertyFactory.create(ModeShapeLexicon.LOCKING_SESSION, lock.getLockingSessionId())); properties.add(propertyFactory.create(ModeShapeLexicon.EXPIRATION_DATE, lock.getExpiryTime())); locksNode.createChild(system, lock.getLockKey(), name, properties); }
public String readNamespacePrefix( String namespaceUri, boolean generateIfMissing ) { NodeKey key = keyForNamespaceUri(namespaceUri); CachedNode nsNode = system.getNode(key); if (nsNode != null) { // There's an existing node, so just read the prefix (e.g., the name) ... Segment segment = nsNode.getSegment(system); return prefixFor(segment); } if (!generateIfMissing) return null; // Create a new namespace node that uses this URI ... MutableCachedNode mutableNamespaces = mutableNamespacesNode(); List<Property> props = new ArrayList<Property>(3); props.add(propertyFactory.create(ModeShapeLexicon.URI, namespaceUri)); props.add(propertyFactory.create(ModeShapeLexicon.GENERATED, booleans.create(true))); props.add(propertyFactory.create(JcrLexicon.PRIMARY_TYPE, ModeShapeLexicon.NAMESPACE)); MutableCachedNode newNsNode = mutableNamespaces.createChild(system, key, GENERATED_NAMESPACE_NODE_NAME, props); return prefixFor(newNsNode.getSegment(system)); }
public String readNamespacePrefix( String namespaceUri, boolean generateIfMissing ) { NodeKey key = keyForNamespaceUri(namespaceUri); CachedNode nsNode = system.getNode(key); if (nsNode != null) { // There's an existing node, so just read the prefix (e.g., the name) ... Segment segment = nsNode.getSegment(system); return prefixFor(segment); } if (!generateIfMissing) return null; // Create a new namespace node that uses this URI ... MutableCachedNode mutableNamespaces = mutableNamespacesNode(); List<Property> props = new ArrayList<Property>(3); props.add(propertyFactory.create(ModeShapeLexicon.URI, namespaceUri)); props.add(propertyFactory.create(ModeShapeLexicon.GENERATED, booleans.create(true))); props.add(propertyFactory.create(JcrLexicon.PRIMARY_TYPE, ModeShapeLexicon.NAMESPACE)); MutableCachedNode newNsNode = mutableNamespaces.createChild(system, key, GENERATED_NAMESPACE_NODE_NAME, props); return prefixFor(newNsNode.getSegment(system)); }
private NodeKey store( MutableCachedNode indexDefn, IndexColumnDefinition columnDefn ) { // Find an existing node for this column definition ... final NodeKey key = nodeKey(indexDefn.getKey(), columnDefn); final Name name = ModeShapeLexicon.INDEX_COLUMN; MutableCachedNode columnDefnNode = null; if (!indexDefn.isNew()) { if (indexDefn.getChildReferences(system).hasChild(key)) { // The node already exists ... columnDefnNode = system.mutable(key); } } String propTypeName = org.modeshape.jcr.api.PropertyType.nameFromValue(columnDefn.getColumnType()).toUpperCase(); List<Property> props = new ArrayList<Property>(); props.add(propertyFactory.create(JcrLexicon.PRIMARY_TYPE, ModeShapeLexicon.INDEX_COLUMN)); props.add(propertyFactory.create(ModeShapeLexicon.PROPERTY_NAME, columnDefn.getPropertyName())); props.add(propertyFactory.create(ModeShapeLexicon.COLUMN_TYPE_NAME, propTypeName)); // Now either update the existing node or create a new node .. if (columnDefnNode != null) { // Update the properties ... columnDefnNode.setProperties(system, props); } else { // We have to create the node type node ... columnDefnNode = indexDefn.createChild(system, key, name, props); } return key; }
private NodeKey store( MutableCachedNode indexDefn, IndexColumnDefinition columnDefn ) { // Find an existing node for this column definition ... final NodeKey key = nodeKey(indexDefn.getKey(), columnDefn); final Name name = ModeShapeLexicon.INDEX_COLUMN; MutableCachedNode columnDefnNode = null; if (!indexDefn.isNew()) { if (indexDefn.getChildReferences(system).hasChild(key)) { // The node already exists ... columnDefnNode = system.mutable(key); } } String propTypeName = org.modeshape.jcr.api.PropertyType.nameFromValue(columnDefn.getColumnType()).toUpperCase(); List<Property> props = new ArrayList<Property>(); props.add(propertyFactory.create(JcrLexicon.PRIMARY_TYPE, ModeShapeLexicon.INDEX_COLUMN)); props.add(propertyFactory.create(ModeShapeLexicon.PROPERTY_NAME, columnDefn.getPropertyName())); props.add(propertyFactory.create(ModeShapeLexicon.COLUMN_TYPE_NAME, propTypeName)); // Now either update the existing node or create a new node .. if (columnDefnNode != null) { // Update the properties ... columnDefnNode.setProperties(system, props); } else { // We have to create the node type node ... columnDefnNode = indexDefn.createChild(system, key, name, props); } return key; }
@Test public void shouldReturnAllTransientNodeKeys() { NodeKey rootKey = session1.getRootKey(); MutableCachedNode root = session1.mutable(rootKey); NodeKey childAKey = root.createChild(session(), newKey("x-childA"), name("childA"), property("p1", "value A")).getKey(); NodeKey childBKey = root.createChild(session(), newKey("x-childB"), name("childB"), property("p1", "value B")).getKey(); Set<NodeKey> transientNodeKeys = session1.getChangedNodeKeys(); assertEquals(new HashSet<NodeKey>(Arrays.asList(rootKey, childAKey, childBKey)), transientNodeKeys); }
private void storeProjection( Projection projection, SessionCache systemSession ) { PropertyFactory propertyFactory = repository.context().getPropertyFactory(); // we need to store the projection mappings so that we don't loose that information NodeKey systemNodeKey = getSystemNode(systemSession).getKey(); MutableCachedNode systemNode = systemSession.mutable(systemNodeKey); ChildReference federationNodeRef = systemNode.getChildReferences(systemSession).getChild(ModeShapeLexicon.FEDERATION); if (federationNodeRef == null) { // there isn't a federation node present, so we need to add it try { Property primaryType = propertyFactory.create(JcrLexicon.PRIMARY_TYPE, ModeShapeLexicon.FEDERATION); systemNode.createChild(systemSession, systemNodeKey.withId("mode:federation"), ModeShapeLexicon.FEDERATION, primaryType); federationNodeRef = systemNode.getChildReferences(systemSession).getChild(ModeShapeLexicon.FEDERATION); } catch (Exception e) { throw new RuntimeException(e); } } NodeKey federationNodeKey = federationNodeRef.getKey(); MutableCachedNode federationNode = systemSession.mutable(federationNodeKey); Property primaryType = propertyFactory.create(JcrLexicon.PRIMARY_TYPE, ModeShapeLexicon.PROJECTION); Property externalNodeKeyProp = propertyFactory.create(ModeShapeLexicon.EXTERNAL_NODE_KEY, projection.getExternalNodeKey()); Property projectedNodeKeyProp = propertyFactory.create(ModeShapeLexicon.PROJECTED_NODE_KEY, projection.getProjectedNodeKey()); Property alias = propertyFactory.create(ModeShapeLexicon.PROJECTION_ALIAS, projection.getAlias()); federationNode.createChild(systemSession, federationNodeKey.withRandomId(), ModeShapeLexicon.PROJECTION, primaryType, externalNodeKeyProp, projectedNodeKeyProp, alias); }
private void storeProjection( Projection projection, SessionCache systemSession ) { PropertyFactory propertyFactory = repository.context().getPropertyFactory(); // we need to store the projection mappings so that we don't loose that information NodeKey systemNodeKey = getSystemNode(systemSession).getKey(); MutableCachedNode systemNode = systemSession.mutable(systemNodeKey); ChildReference federationNodeRef = systemNode.getChildReferences(systemSession).getChild(ModeShapeLexicon.FEDERATION); if (federationNodeRef == null) { // there isn't a federation node present, so we need to add it try { Property primaryType = propertyFactory.create(JcrLexicon.PRIMARY_TYPE, ModeShapeLexicon.FEDERATION); systemNode.createChild(systemSession, systemNodeKey.withId("mode:federation"), ModeShapeLexicon.FEDERATION, primaryType); federationNodeRef = systemNode.getChildReferences(systemSession).getChild(ModeShapeLexicon.FEDERATION); } catch (Exception e) { throw new RuntimeException(e); } } NodeKey federationNodeKey = federationNodeRef.getKey(); MutableCachedNode federationNode = systemSession.mutable(federationNodeKey); Property primaryType = propertyFactory.create(JcrLexicon.PRIMARY_TYPE, ModeShapeLexicon.PROJECTION); Property externalNodeKeyProp = propertyFactory.create(ModeShapeLexicon.EXTERNAL_NODE_KEY, projection.getExternalNodeKey()); Property projectedNodeKeyProp = propertyFactory.create(ModeShapeLexicon.PROJECTED_NODE_KEY, projection.getProjectedNodeKey()); Property alias = propertyFactory.create(ModeShapeLexicon.PROJECTION_ALIAS, projection.getAlias()); federationNode.createChild(systemSession, federationNodeKey.withRandomId(), ModeShapeLexicon.PROJECTION, primaryType, externalNodeKeyProp, projectedNodeKeyProp, alias); }
@Test public void shouldReturnTransientKeysAtOrBelowNode() { NodeKey rootKey = session1.getRootKey(); MutableCachedNode root = session1.mutable(rootKey); // root/childA MutableCachedNode childA = root.createChild(session(), newKey("x-childA"), name("childA"), property("p1", "value A")); // root/childA/childB MutableCachedNode childB = childA.createChild(session(), newKey("x-childB"), name("childB"), property("p1", "value B")); // root/childC MutableCachedNode childC = root.createChild(session(), newKey("x-childC"), name("childC"), property("p1", "value C")); assertEquals(new HashSet<NodeKey>(Arrays.asList(childA.getKey(), childB.getKey())), session1.getChangedNodeKeysAtOrBelow(childA)); assertEquals(new HashSet<NodeKey>(Arrays.asList(rootKey, childA.getKey(), childB.getKey(), childC.getKey())), session1.getChangedNodeKeysAtOrBelow(root)); assertEquals(new HashSet<NodeKey>(Arrays.asList(childC.getKey())), session1.getChangedNodeKeysAtOrBelow(childC)); }
@Test public void shouldReturnTransientKeysAtOrBelowNodeWithRemovedChild() { NodeKey rootKey = session1.getRootKey(); MutableCachedNode root = session1.mutable(rootKey); SessionCache sessionCache = session(); NodeKey childKey = newKey("x-childA"); MutableCachedNode child = root.createChild(sessionCache, childKey, name("childA"), property("p1", "value A")); session1.destroy(child.getKey()); assertEquals(new HashSet<NodeKey>(Arrays.asList(rootKey, childKey)), session1.getChangedNodeKeysAtOrBelow(root)); } }
@Test public void shouldAllowSessionToCreateAndAccessNewChildNodeOnExistingNodeBeforeSave() { // Make sure the property does not exist ... check(cache).noNode("/childB/newChild"); print(false); // Set property on existing node ... MutableCachedNode nodeB = check(session1).mutableNode("/childB"); NodeKey newKey = session1.createNodeKeyWithIdentifier("newChild"); long nanos = System.nanoTime(); MutableCachedNode newChild = nodeB.createChild(session(), newKey, name("newChild"), property("p1a", 344), property("p2", false)); print("Time (createChild): " + millis(Math.abs(System.nanoTime() - nanos)) + " ms"); assertThat(newChild.getPath(session1), is(path("/childB/newChild"))); check(session1).children(nodeB, "childC", "childD", "newChild"); check(session1).property("/childB/newChild", property("p1a", 344)); check(session1).property("/childB/newChild", property("p2", false)); // Make sure the other session doesn't see the new child ... check(session2).children(nodeB.getKey(), "childC", "childD"); print(false); nanos = System.nanoTime(); session1.save(); print(false); print("Time (save): " + millis(Math.abs(System.nanoTime() - nanos)) + " ms"); // Both sessions should see all 3 children ... check(session1).children(nodeB, "childC", "childD", "newChild"); check(session2).children(nodeB, "childC", "childD", "newChild"); check(session2).property("/childB/newChild", property("p1a", 344)); check(session2).property("/childB/newChild", property("p2", false)); }
@Test public void shouldAllowTransientlyRenamingChildNode() { MutableCachedNode root = session1.mutable(session1.getRootKey()); MutableCachedNode node = root.createChild(session(), newKey("node"), name("node"), property("p1", "value")); NodeKey childAKey = node.createChild(session(), newKey("x-childA"), name("childA"), property("p1", "value A")).getKey(); NodeKey childBKey = node.createChild(session(), newKey("x-childB"), name("childB"), property("p1", "value B")).getKey(); NodeKey childCKey = node.createChild(session(), newKey("x-childC"), name("childC"), property("p1", "value C")).getKey(); session1.save(); // Check the children ... node = check(session1).mutableNode(node.getKey(), "/node"); check(session1).node(childAKey, "/node/childA"); check(session1).node(childBKey, "/node/childB"); check(session1).node(childCKey, "/node/childC"); check(session1).children(node.getKey(), "childA", "childB", "childC"); // Now transiently rename child b ... node.renameChild(session1, childBKey, name("childD")); // Check that the session uses the new name ... CachedNode renamed = session1.getNode(childBKey); assertThat(renamed.getSegment(session1), is(segment("childD"))); check(session1).node("/node"); check(session1).node("/node/childA"); check(session1).node("/node/childC"); check(session1).node("/node/childD"); check(session1).noNode("/node/childB"); check(session1).children(node.getKey(), "childA", "childD", "childC"); }
@Test public void shouldAllowAccessingRenamedChildNodeAfterPersisting() { MutableCachedNode root = session1.mutable(session1.getRootKey()); MutableCachedNode node = root.createChild(session(), newKey("node"), name("node"), property("p1", "value")); NodeKey childAKey = node.createChild(session(), newKey("x-childA"), name("childA"), property("p1", "value A")).getKey(); NodeKey childBKey = node.createChild(session(), newKey("x-childB"), name("childB"), property("p1", "value B")).getKey(); NodeKey childCKey = node.createChild(session(), newKey("x-childC"), name("childC"), property("p1", "value C")).getKey(); session1.save(); // Check the children ... node = check(session1).mutableNode(node.getKey(), "/node"); check(session1).node(childAKey, "/node/childA"); check(session1).node(childBKey, "/node/childB"); check(session1).node(childCKey, "/node/childC"); check(session1).children(node.getKey(), "childA", "childB", "childC"); // Now transiently rename child b ... node.renameChild(session1, childBKey, name("childD")); // Now save ... session1.save(); check(session1).node("/node"); check(session1).node("/node/childA"); check(session1).node("/node/childC"); check(session1).node("/node/childD"); check(session1).noNode("/node/childB"); check(session1).children(node.getKey(), "childA", "childD", "childC"); }
@Test public void shouldSplitDocumentThatContainsTooManyChildReferences() throws Exception { // Create a bunch of children ... MutableCachedNode nodeB = check(session1).mutableNode("/childB"); for (int i = 0; i != 10; ++i) { NodeKey newKey = session1.createNodeKey(); nodeB.createChild(session(), newKey, name("newChild"), property("p1a", 344), property("p2", false)); } session1.save(); // Optimize the storage ... Document result = runInTransaction(() -> { NodeKey key = nodeB.getKey(); EditableDocument doc = workspaceCache.documentStore().edit(key.toString(), true); optimizer.optimizeChildrenBlocks(key, doc, 9, 5); return doc; }); print(false); print(result, true); }
@Test public void shouldSplitDocumentThatContainsTooManyChildReferencesIntoMultipleSegments() throws Exception { // Create a bunch of children ... MutableCachedNode nodeB = check(session1).mutableNode("/childB"); for (int i = 0; i != 10; ++i) { NodeKey newKey = session1.createNodeKey(); nodeB.createChild(session(), newKey, name("newChild"), property("p1a", 344), property("p2", false)); } session1.save(); Document result = runInTransaction(() -> { NodeKey key = nodeB.getKey(); EditableDocument doc = workspaceCache.documentStore().edit(key.toString(), true); optimizer.optimizeChildrenBlocks(key, doc, 5, 3); // will merge into a single block ... optimizer.optimizeChildrenBlocks(key, doc, 5, 3); // will split into two blocks ... return doc; }); print(false); print(result, true); }
nodeB.createChild(session(), newKey, name("newChild"), property("p1a", 344), property("p2", false));
create.start(); NodeKey newKey = session1.createNodeKey(); nodeB.createChild(session(), newKey, name("newChild"), property("p1a", 344), property("p2", false)); create.stop();