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/10/27 15:20:16 UTC
svn commit: r1189741 - in /jackrabbit/sandbox/microkernel/src:
main/java/org/apache/jackrabbit/mk/ main/java/org/apache/jackrabbit/mk/index/
main/java/org/apache/jackrabbit/mk/json/
main/java/org/apache/jackrabbit/mk/store/ main/java/org/apache/jackrab...
Author: stefan
Date: Thu Oct 27 13:20:16 2011
New Revision: 1189741
URL: http://svn.apache.org/viewvc?rev=1189741&view=rev
Log:
support move&set within commit
misc. minor improvements
Modified:
jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/MicroKernelImpl.java
jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/index/Indexer.java
jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/json/JsopBuilder.java
jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/CommitBuilder.java
jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/util/PathUtils.java
jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/util/PathTest.java
Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/MicroKernelImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/MicroKernelImpl.java?rev=1189741&r1=1189740&r2=1189741&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/MicroKernelImpl.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/MicroKernelImpl.java Thu Oct 27 13:20:16 2011
@@ -211,7 +211,7 @@ public class MicroKernelImpl implements
if (node1 == null) {
if (node2 != null) {
buff.appendTag("+ ").key(path).object();
- toJson(buff, node2, Integer.MAX_VALUE, 0, -1);
+ toJson(buff, node2, Integer.MAX_VALUE, 0, -1, false);
return buff.endObject().newline().toString();
} else {
throw new MicroKernelException("path doesn't exist in the specified revisions: " + path);
@@ -252,7 +252,7 @@ public class MicroKernelImpl implements
buff.appendTag("+ ").
key(PathUtils.concat(nodePath, childName)).object();
try {
- toJson(buff, rep.getPersistenceManager().getNode(id), Integer.MAX_VALUE, 0, -1);
+ toJson(buff, rep.getPersistenceManager().getNode(id), Integer.MAX_VALUE, 0, -1, false);
} catch (Exception e) {
buff.value("ERROR: failed to retrieve node " + id);
}
@@ -316,7 +316,7 @@ public class MicroKernelImpl implements
buff.appendTag("+ ").
key(PathUtils.concat(nodePath, childName)).object();
try {
- toJson(buff, rep.getPersistenceManager().getNode(id), Integer.MAX_VALUE, 0, -1);
+ toJson(buff, rep.getPersistenceManager().getNode(id), Integer.MAX_VALUE, 0, -1, false);
} catch (Exception e) {
buff.value("ERROR: failed to retrieve node " + id);
}
@@ -368,7 +368,7 @@ public class MicroKernelImpl implements
public String getNodes(String path, String revisionId, int depth, long offset, int count) throws MicroKernelException {
try {
JsopBuilder buf = new JsopBuilder().object();
- toJson(buf, rep.getNode(revisionId, path), depth, offset, count);
+ toJson(buf, rep.getNode(revisionId, path), depth, offset, count, true);
return buf.endObject().toString();
} catch (Exception e) {
throw new MicroKernelException(e);
@@ -485,12 +485,14 @@ public class MicroKernelImpl implements
//-------------------------------------------------------< implementation >
- void toJson(JsopBuilder builder, Node node, int depth, long offset, int count) throws Exception {
+ void toJson(JsopBuilder builder, Node node, int depth, long offset, int count, boolean inclVirtualProps) throws Exception {
for (Map.Entry<String, String> prop : node.getProperties().entrySet()) {
builder.key(prop.getKey()).encodedValue(prop.getValue());
}
long childCount = node.getChildNodeCount();
- builder.key(":childNodeCount").value(childCount);
+ if (inclVirtualProps) {
+ builder.key(":childNodeCount").value(childCount);
+ }
if (childCount > 0 && depth >= 0) {
for (Map.Entry<String, String> child : node.getChildNodeEntries().entrySet()) {
if (offset-- > 0) {
@@ -502,7 +504,7 @@ public class MicroKernelImpl implements
builder.key(childName).object();
if (depth > 0) {
String childId = child.getValue();
- toJson(builder, rep.getPersistenceManager().getNode(childId), depth - 1, 0, -1);
+ toJson(builder, rep.getPersistenceManager().getNode(childId), depth - 1, 0, -1, inclVirtualProps);
}
builder.endObject();
}
Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/index/Indexer.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/index/Indexer.java?rev=1189741&r1=1189740&r2=1189741&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/index/Indexer.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/index/Indexer.java Thu Oct 27 13:20:16 2011
@@ -375,7 +375,7 @@ public class Indexer {
}
private boolean isInIndex(String path) {
- return PathUtils.isParent(indexRootNode, path) || indexRootNode.equals(path);
+ return PathUtils.isAncestor(indexRootNode, path) || indexRootNode.equals(path);
}
private void removeProperty(String path, String lastRevision) {
Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/json/JsopBuilder.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/json/JsopBuilder.java?rev=1189741&r1=1189740&r2=1189741&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/json/JsopBuilder.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/json/JsopBuilder.java Thu Oct 27 13:20:16 2011
@@ -57,10 +57,8 @@ public class JsopBuilder {
}
/**
- * Append an already formatted comment or whitespace. The comma flag is not
- * changed.
+ * Append a newline character.
*
- * @param string the string to append
* @return this
*/
public JsopBuilder newline() {
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=1189741&r1=1189740&r2=1189741&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 Oct 27 13:20:16 2011
@@ -225,19 +225,24 @@ public class CommitBuilder {
MutableNode getOrCreateStagedNode(String nodePath) throws Exception {
MutableNode node = staged.get(nodePath);
if (node == null) {
- node = new MutableNode(rep.getNode(baseRevId, nodePath));
- staged.put(nodePath, node);
- // make sure all direct ancestors are staged as well
- String p1 = nodePath;
- while (!PathUtils.denotesRoot(p1)) {
- String p0 = PathUtils.getParentPath(p1);
- MutableNode n0 = staged.get(p0);
- if (n0 != null) {
- break;
+ MutableNode parent = staged.get("/");
+ if (parent == null) {
+ parent = new MutableNode(rep.getNode(baseRevId, "/"));
+ staged.put("/", parent);
+ }
+ node = parent;
+ String names[] = PathUtils.split(nodePath);
+ for (int i = names.length - 1; i >= 0; i--) {
+ String path = PathUtils.getAncestorPath(nodePath, i);
+ node = staged.get(path);
+ if (node == null) {
+ // not yet staged, resolve id using staged parent
+ // to allow for staged move operations
+ String id = parent.getChildNodeEntries().get(names[names.length - i - 1]);
+ node = new MutableNode(rep.getPersistenceManager().getNode(id));
+ staged.put(path, node);
}
- n0 = new MutableNode(rep.getNode(baseRevId, p0));
- staged.put(p0, n0);
- p1 = p0;
+ parent = node;
}
}
return node;
Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/util/PathUtils.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/util/PathUtils.java?rev=1189741&r1=1189740&r2=1189741&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/util/PathUtils.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/util/PathUtils.java Thu Oct 27 13:20:16 2011
@@ -78,19 +78,40 @@ public class PathUtils {
* @return the parent path
*/
public static String getParentPath(String path) {
+ return getAncestorPath(path, 1);
+ }
+
+ /**
+ * Get the nth ancestor of a path. The 1st ancestor is the parent path,
+ * 2nd ancestor the grandparent path, and so on...
+ * <p/>
+ * If nth <= 0, the path argument is returned as is.
+ *
+ * @param path the path
+ * @return the ancestor path
+ */
+ public static String getAncestorPath(String path, int nth) {
assertValid(path);
- if (path.length() == 0 || denotesRootPath(path)) {
+ if (path.length() == 0 || denotesRootPath(path)
+ || nth <= 0) {
return path;
}
+
int end = path.length() - 1;
- int pos = path.lastIndexOf('/', end);
- if (pos > 0) {
- return path.substring(0, pos);
- } else if (pos == 0) {
- return "/";
+ int pos = -1;
+ while (nth-- > 0) {
+ pos = path.lastIndexOf('/', end);
+ if (pos > 0) {
+ end = pos - 1;
+ } else if (pos == 0) {
+ return "/";
+ } else {
+ return "";
+ }
}
- return "";
+
+ return path.substring(0, pos);
}
/**
@@ -232,16 +253,16 @@ public class PathUtils {
}
/**
- * Check if a path is the (direct or indirect) parent of another path.
+ * Check if a path is a (direct or indirect) ancestor of another path.
*
- * @param parent the parent path
- * @param path the possible child path
- * @return true if the path is a child of the parent
+ * @param ancestor the ancestor path
+ * @param path the potential offspring path
+ * @return true if the path is an offspring of the ancestor
*/
- public static boolean isParent(String parent, String path) {
- assertValid(parent);
+ public static boolean isAncestor(String ancestor, String path) {
+ assertValid(ancestor);
assertValid(path);
- return path.startsWith(parent) && path.length() > parent.length();
+ return path.startsWith(ancestor) && path.length() > ancestor.length();
}
/**
Modified: jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/util/PathTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/util/PathTest.java?rev=1189741&r1=1189740&r2=1189741&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/util/PathTest.java (original)
+++ jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/util/PathTest.java Thu Oct 27 13:20:16 2011
@@ -98,6 +98,18 @@ public class PathTest extends TestCase {
assertEquals("/", PathUtils.getParentPath("/" + parent));
assertEquals("/" + parent, PathUtils.getParentPath("/" + parent + "/" + child));
+ // getAncestorPath
+ assertEquals("/", PathUtils.getAncestorPath("/", 1));
+ assertEquals("/", PathUtils.getAncestorPath("/" + parent, 1));
+ assertEquals("/" + parent, PathUtils.getAncestorPath("/" + parent + "/" + child, 1));
+ assertEquals("/" + parent + "/" + child, PathUtils.getAncestorPath("/" + parent + "/" + child, 0));
+ assertEquals("/", PathUtils.getAncestorPath("/" + parent + "/" + child, 2));
+
+ assertEquals(PathUtils.getParentPath("/foo"), PathUtils.getAncestorPath("/foo", 1));
+ assertEquals(PathUtils.getParentPath("/foo/bar"), PathUtils.getAncestorPath("/foo/bar", 1));
+ assertEquals(PathUtils.getParentPath("foo/bar"), PathUtils.getAncestorPath("foo/bar", 1));
+ assertEquals(PathUtils.getParentPath("foo"), PathUtils.getAncestorPath("foo", 1));
+
// isAbsolute
assertEquals(true, PathUtils.isAbsolute("/"));
assertEquals(false, PathUtils.isAbsolute(parent));
@@ -106,12 +118,12 @@ public class PathTest extends TestCase {
assertEquals(true, PathUtils.isAbsolute("/" + parent + "/" + child));
assertEquals(false, PathUtils.isAbsolute(parent + "/" + child));
- // isParent
- assertTrue(PathUtils.isParent("/", "/" + parent));
- assertTrue(PathUtils.isParent(parent, parent + "/" + child));
- assertFalse(PathUtils.isParent("/", parent + "/" + child));
- assertTrue(PathUtils.isParent("/" + parent, "/" + parent + "/" + child));
- assertFalse(PathUtils.isParent(parent, child));
+ // isAncestor
+ assertTrue(PathUtils.isAncestor("/", "/" + parent));
+ assertTrue(PathUtils.isAncestor(parent, parent + "/" + child));
+ assertFalse(PathUtils.isAncestor("/", parent + "/" + child));
+ assertTrue(PathUtils.isAncestor("/" + parent, "/" + parent + "/" + child));
+ assertFalse(PathUtils.isAncestor(parent, child));
// relativize
assertEquals("", PathUtils.relativize("/", "/"));