You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by st...@apache.org on 2011/04/21 16:05:39 UTC
svn commit: r1095722 -
/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/CommitBuilder.java
Author: stefan
Date: Thu Apr 21 14:05:39 2011
New Revision: 1095722
URL: http://svn.apache.org/viewvc?rev=1095722&view=rev
Log:
MicroKernel prototype (WIP)
Modified:
jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/CommitBuilder.java
Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/CommitBuilder.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/CommitBuilder.java?rev=1095722&r1=1095721&r2=1095722&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/CommitBuilder.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/CommitBuilder.java Thu Apr 21 14:05:39 2011
@@ -18,7 +18,9 @@ package org.apache.jackrabbit.mk.store;
import org.apache.jackrabbit.mk.Repository;
+import java.util.ArrayList;
import java.util.Collections;
+import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
@@ -46,52 +48,41 @@ public class CommitBuilder {
}
public void addNode(String parentNodePath, String nodeName, Map<String, String> properties) throws Exception {
- MutableNode modParent = getStagedNode(parentNodePath);
+ MutableNode modParent = getOrCreateStagedNode(parentNodePath);
if (modParent.getChildNodeEntries().containsKey(nodeName)) {
throw new Exception("there's already a child node with name '" + nodeName + "'");
}
MutableNode newChild = new MutableNode(baseRevId);
newChild.getProperties().putAll(properties);
- String newId = store.computeId(newChild.toBytes());
+ modParent.getChildNodeEntries().put(nodeName, ""); // value will be computed on commit
String newPath = "/".equals(parentNodePath) ? "/" + nodeName : parentNodePath + "/" + nodeName;
staged.put(newPath, newChild);
-
- updateParents(parentNodePath, nodeName, newId);
}
public void removeNode(String nodePath) throws Exception {
String parentPath = getParentPath(nodePath);
String nodeName = getName(nodePath);
- MutableNode parent = getStagedNode(parentPath);
+ MutableNode parent = getOrCreateStagedNode(parentPath);
if (!parent.getChildNodeEntries().containsKey(nodeName)) {
throw new Exception("node not found");
}
parent.getChildNodeEntries().remove(nodeName);
- if (!"/".equals(parentPath)) {
- updateParents(getParentPath(parentPath), getName(parentPath), store.computeId(parent.toBytes()));
- }
}
public void setProperty(String nodePath, String propName, String propValue) throws Exception {
- MutableNode node = getStagedNode(nodePath);
+ MutableNode node = getOrCreateStagedNode(nodePath);
node.getProperties().put(propName, propValue);
- if (!"/".equals(nodePath)) {
- updateParents(getParentPath(nodePath), getName(nodePath), store.computeId(node.toBytes()));
- }
}
public void setProperties(String nodePath, Map<String, String> properties) throws Exception {
- MutableNode node = getStagedNode(nodePath);
+ MutableNode node = getOrCreateStagedNode(nodePath);
node.getProperties().clear();
node.getProperties().putAll(properties);
- if (!"/".equals(nodePath)) {
- updateParents(getParentPath(nodePath), getName(nodePath), store.computeId(node.toBytes()));
- }
}
public String /* new revId */ doCommit() throws Exception {
@@ -99,11 +90,35 @@ public class CommitBuilder {
// todo implement merge
}
+ ArrayList<String> orderedPaths = new ArrayList<String>(staged.keySet());
+ Collections.sort(orderedPaths, new Comparator<String>() {
+ public int compare(String path1, String path2) {
+ // paths should be ordered by depth, descending
+ int result = getDepth(path2) - getDepth(path1);
+ return (result != 0) ? result : 1;
+ }
+
+ int getDepth(String path) {
+ if ("/".equals(path)) {
+ return 0;
+ }
+ int count = 0;
+ for (char c : path.toCharArray()) {
+ if (c == '/') {
+ count++;
+ }
+ }
+ return count;
+ }
+ });
+ // iterate over staged entries in depth-descending order
String rootNodeId = null;
- for (Map.Entry<String, MutableNode> entry : staged.entrySet()) {
- String id = store.putNode(entry.getValue());
- if (entry.getKey().equals("/")) {
+ for (String path : orderedPaths) {
+ String id = store.putNode(staged.get(path));
+ if (path.equals("/")) {
rootNodeId = id;
+ } else {
+ staged.get(getParentPath(path)).getChildNodeEntries().put(getName(path), id);
}
}
if (rootNodeId == null) {
@@ -116,10 +131,14 @@ public class CommitBuilder {
newCommit.setRootNodeId(rootNodeId);
String newRevId = store.putCommit(newCommit);
store.setHeadCommit(newRevId);
+
+ // reset instance in order to be reusable
+ staged.clear();
+
return newRevId;
}
- MutableNode getStagedNode(String nodePath) throws Exception {
+ MutableNode getOrCreateStagedNode(String nodePath) throws Exception {
MutableNode node = staged.get(nodePath);
if (node == null) {
node = new MutableNode(baseRevId, rep.getNode(baseRevId, nodePath));
@@ -140,14 +159,6 @@ public class CommitBuilder {
return node;
}
- void updateParents(String path, String childName, String childId) throws Exception {
- MutableNode node = staged.get(path);
- node.getChildNodeEntries().put(childName, childId);
- if (!"/".equals(path)) {
- updateParents(getParentPath(path), getName(path), store.computeId(node.toBytes()));
- }
- }
-
static String getParentPath(String path) {
int pos = path.lastIndexOf('/');
if (pos > 0) {