You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by st...@apache.org on 2012/05/25 16:17:51 UTC
svn commit: r1342630 - in /jackrabbit/oak/trunk:
oak-core/src/main/java/org/apache/jackrabbit/mk/wrapper/
oak-mk/src/main/java/org/apache/jackrabbit/mk/api/
oak-mk/src/main/java/org/apache/jackrabbit/mk/client/
oak-mk/src/main/java/org/apache/jackrabbi...
Author: stefan
Date: Fri May 25 14:17:51 2012
New Revision: 1342630
URL: http://svn.apache.org/viewvc?rev=1342630&view=rev
Log:
OAK-116: MicroKernel API: clarify semantics of getNodes depth, offset and count parameters
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/wrapper/LogWrapper.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/wrapper/MicroKernelWrapperBase.java
jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/api/MicroKernel.java
jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/client/Client.java
jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/core/MicroKernelImpl.java
jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/server/MicroKernelServlet.java
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/wrapper/LogWrapper.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/wrapper/LogWrapper.java?rev=1342630&r1=1342629&r2=1342630&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/wrapper/LogWrapper.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/wrapper/LogWrapper.java Fri May 25 14:17:51 2012
@@ -115,10 +115,10 @@ public class LogWrapper implements Micro
}
@Override
- public String getNodes(String path, String revisionId, int depth, long offset, int count, String filter) {
+ public String getNodes(String path, String revisionId, int depth, long offset, int maxChildNodes, String filter) {
try {
- logMethod("getNodes", path, revisionId, depth, offset, count, filter);
- String result = mk.getNodes(path, revisionId, depth, offset, count, filter);
+ logMethod("getNodes", path, revisionId, depth, offset, maxChildNodes, filter);
+ String result = mk.getNodes(path, revisionId, depth, offset, maxChildNodes, filter);
logResult(result);
return result;
} catch (Exception e) {
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/wrapper/MicroKernelWrapperBase.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/wrapper/MicroKernelWrapperBase.java?rev=1342630&r1=1342629&r2=1342630&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/wrapper/MicroKernelWrapperBase.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/wrapper/MicroKernelWrapperBase.java Fri May 25 14:17:51 2012
@@ -39,9 +39,9 @@ public abstract class MicroKernelWrapper
}
@Override
- public final String getNodes(String path, String revisionId, int depth, long offset, int count, String filter) {
+ public final String getNodes(String path, String revisionId, int depth, long offset, int maxChildNodes, String filter) {
JsopReader reader =
- getNodesStream(path, revisionId, depth, offset, count, filter);
+ getNodesStream(path, revisionId, depth, offset, maxChildNodes, filter);
if (reader != null) {
return reader.toString();
} else {
@@ -156,8 +156,8 @@ public abstract class MicroKernelWrapper
}
@Override
- public String getNodes(String path, String revisionId, int depth, long offset, int count, String filter) {
- return wrapped.getNodes(path, revisionId, depth, offset, count, filter);
+ public String getNodes(String path, String revisionId, int depth, long offset, int maxChildNodes, String filter) {
+ return wrapped.getNodes(path, revisionId, depth, offset, maxChildNodes, filter);
}
@Override
Modified: jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/api/MicroKernel.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/api/MicroKernel.java?rev=1342630&r1=1342629&r2=1342630&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/api/MicroKernel.java (original)
+++ jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/api/MicroKernel.java Fri May 25 14:17:51 2012
@@ -209,7 +209,7 @@ public interface MicroKernel {
/**
* Returns the node tree rooted at the specified parent node with the
- * specified depth, maximum child node count and offset. The depth of the
+ * specified depth, maximum child node maxChildNodes and offset. The depth of the
* returned tree is governed by the {@code depth} parameter:
* <table>
* <tr>
@@ -263,8 +263,13 @@ public interface MicroKernel {
* of returned child nodes, then the node has more child nodes than those
* included in the tree.</li>
* </ul>
- * The {@code offset} and {@code count} parameters are only applied to the
- * direct child nodes of the root of the returned node tree.
+ * The {@code offset} parameter is only applied to the direct child nodes
+ * of the root of the returned node tree. {@code maxChildNodes} however
+ * is applied on all hierarchy levels.
+ * <p/>
+ * An {@code IllegalArgumentException} is thrown if both an {@code offset}
+ * greater than zero and a {@code filter} on node names (see below) have been
+ * specified.
* <p/>
* The optional {@code filter} parameter allows to specify glob patterns for names of
* nodes and/or properties to be included or excluded.
@@ -311,19 +316,20 @@ public interface MicroKernel {
* it can be included by specifying a filter such as {@code {properties:["*", ":hash"]}}</li>
* </ul>
*
- * @param path path denoting root of node tree to be retrieved
- * @param revisionId revision id, if {@code null} the current head revision is assumed
- * @param depth maximum depth of returned tree
- * @param offset start position in the iteration order of child nodes (0 to start at the
- * beginning)
- * @param count maximum number of child nodes to retrieve (-1 for all)
- * @param filter optional filter on property and/or node names; if {@code null} or
- * {@code ""} the default filter will be assumed
+ * @param path path denoting root of node tree to be retrieved
+ * @param revisionId revision id, if {@code null} the current head revision is assumed
+ * @param depth maximum depth of returned tree
+ * @param offset start position in the iteration order of child nodes (0 to start at the
+ * beginning)
+ * @param maxChildNodes maximum number of sibling child nodes to retrieve (-1 for all)
+ * @param filter optional filter on property and/or node names; if {@code null} or
+ * {@code ""} the default filter will be assumed
* @return node tree in JSON format or {@code null} if the specified node does not exist
* @throws MicroKernelException if the specified revision does not exist or if another error occurs
+ * @throws IllegalArgumentException if both an {@code offset > 0} and a {@code filter} on node names have been specified
*/
String /* jsonTree */ getNodes(String path, String revisionId, int depth,
- long offset, int count, String filter)
+ long offset, int maxChildNodes, String filter)
throws MicroKernelException;
//------------------------------------------------------------< WRITE ops >
Modified: jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/client/Client.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/client/Client.java?rev=1342630&r1=1342629&r2=1342630&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/client/Client.java (original)
+++ jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/client/Client.java Fri May 25 14:17:51 2012
@@ -223,7 +223,7 @@ public class Client implements MicroKern
@Override
public String getNodes(String path, String revisionId, int depth,
- long offset, int count, String filter) throws MicroKernelException {
+ long offset, int maxChildNodes, String filter) throws MicroKernelException {
Request request = null;
@@ -233,7 +233,7 @@ public class Client implements MicroKern
request.addParameter("revision_id", revisionId);
request.addParameter("depth", depth);
request.addParameter("offset", offset);
- request.addParameter("count", count);
+ request.addParameter("maxChildNodes", maxChildNodes);
request.addParameter("filter", filter);
// OAK-48: MicroKernel.getNodes() should return null for not existing nodes instead of throwing an exception
String result = request.getString();
Modified: jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/core/MicroKernelImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/core/MicroKernelImpl.java?rev=1342630&r1=1342629&r2=1342630&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/core/MicroKernelImpl.java (original)
+++ jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/core/MicroKernelImpl.java Fri May 25 14:17:51 2012
@@ -314,7 +314,7 @@ public class MicroKernelImpl implements
}
}
- public String getNodes(String path, String revisionId, int depth, long offset, int count, String filter) throws MicroKernelException {
+ public String getNodes(String path, String revisionId, int depth, long offset, int maxChildNodes, String filter) throws MicroKernelException {
if (rep == null) {
throw new IllegalStateException("this instance has already been disposed");
}
@@ -328,9 +328,13 @@ public class MicroKernelImpl implements
}
NodeFilter nodeFilter = filter == null || filter.isEmpty() ? null : NodeFilter.parse(filter);
+ if (offset > 0 && nodeFilter != null && nodeFilter.getChildNodeFilter() != null) {
+ // both an offset > 0 and a filter on node names have been specified...
+ throw new IllegalArgumentException("offset > 0 with child node filter");
+ }
JsopBuilder buf = new JsopBuilder().object();
- toJson(buf, nodeState, depth, (int) offset, count, true, nodeFilter);
+ toJson(buf, nodeState, depth, (int) offset, maxChildNodes, true, nodeFilter);
return buf.endObject().toString();
} catch (Exception e) {
throw new MicroKernelException(e);
@@ -537,7 +541,7 @@ public class MicroKernelImpl implements
//-------------------------------------------------------< implementation >
void toJson(JsopBuilder builder, NodeState node,
- int depth, int offset, int count,
+ int depth, int offset, int maxChildNodes,
boolean inclVirtualProps, NodeFilter filter) {
for (PropertyState property : node.getProperties()) {
if (filter == null || filter.includeProperty(property.getName())) {
@@ -551,6 +555,7 @@ public class MicroKernelImpl implements
// unless it is explicitly excluded in the filter
builder.key(":childNodeCount").value(childCount);
}
+ // TODO check whether :hash has been explicitly included
if (filter != null && filter.includeProperty(":hash")) {
// :hash must be explicitly included in the filter
builder.key(":hash").value(rep.getRevisionStore().getId(node).toString());
@@ -563,6 +568,7 @@ public class MicroKernelImpl implements
// optimization for large child node lists:
// no need to iterate over the entire child node list if the filter
// does not include wildcards
+ int count = maxChildNodes == -1 ? Integer.MAX_VALUE : maxChildNodes;
for (String name : childFilter.getInclusionPatterns()) {
NodeState child = node.getChildNode(name);
if (child != null) {
@@ -574,9 +580,12 @@ public class MicroKernelImpl implements
}
}
if (incl) {
+ if (count-- <= 0) {
+ break;
+ }
builder.key(name).object();
if (depth > 0) {
- toJson(builder, child, depth - 1, 0, -1, inclVirtualProps, filter);
+ toJson(builder, child, depth - 1, 0, maxChildNodes, inclVirtualProps, filter);
}
builder.endObject();
}
@@ -585,11 +594,22 @@ public class MicroKernelImpl implements
return;
}
}
- for (ChildNodeEntry entry : node.getChildNodeEntries(offset, count)) {
+
+ int count = maxChildNodes == -1 ? Integer.MAX_VALUE : maxChildNodes;
+ if (maxChildNodes != -1
+ && filter != null
+ && filter.getChildNodeFilter() != null) {
+ // specific maxChildNodes limit and child node filter
+ maxChildNodes = -1;
+ }
+ for (ChildNodeEntry entry : node.getChildNodeEntries(offset, maxChildNodes)) {
if (filter == null || filter.includeNode(entry.getName())) {
+ if (count-- <= 0) {
+ break;
+ }
builder.key(entry.getName()).object();
if (depth > 0) {
- toJson(builder, entry.getNode(), depth - 1, 0, -1, inclVirtualProps, filter);
+ toJson(builder, entry.getNode(), depth - 1, 0, maxChildNodes, inclVirtualProps, filter);
}
builder.endObject();
}
Modified: jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/server/MicroKernelServlet.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/server/MicroKernelServlet.java?rev=1342630&r1=1342629&r2=1342630&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/server/MicroKernelServlet.java (original)
+++ jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/server/MicroKernelServlet.java Fri May 25 14:17:51 2012
@@ -229,11 +229,11 @@ class MicroKernelServlet {
String revisionId = request.getParameter("revision_id", headRevision);
int depth = request.getParameter("depth", 1);
long offset = request.getParameter("offset", 0L);
- int count = request.getParameter("count", -1);
+ int maxChildNodes = request.getParameter("maxChildNodes", -1);
String filter = request.getParameter("filter", "");
response.setContentType("application/json");
- String json = mk.getNodes(path, revisionId, depth, offset, count, filter);
+ String json = mk.getNodes(path, revisionId, depth, offset, maxChildNodes, filter);
// OAK-48: MicroKernel.getNodes() should return null for not existing nodes instead of throwing an exception
if (json == null) {
json = "null";