Author: stefan
Date: Fri May  4 15:45:35 2012
New Revision: 1334040

URL: http://svn.apache.org/viewvc?rev=1334040&view=rev
Log:
OAK-85: NPE and wrong result on copy operation

Modified:
    
jackrabbit/oak/trunk/oak-it/mk/src/main/java/org/apache/jackrabbit/mk/test/MicroKernelIT.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/model/CommitBuilder.java

Modified: 
jackrabbit/oak/trunk/oak-it/mk/src/main/java/org/apache/jackrabbit/mk/test/MicroKernelIT.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-it/mk/src/main/java/org/apache/jackrabbit/mk/test/MicroKernelIT.java?rev=1334040&r1=1334039&r2=1334040&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-it/mk/src/main/java/org/apache/jackrabbit/mk/test/MicroKernelIT.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-it/mk/src/main/java/org/apache/jackrabbit/mk/test/MicroKernelIT.java
 Fri May  4 15:45:35 2012
@@ -263,6 +263,19 @@ public class MicroKernelIT extends Abstr
 
         assertTrue(mk.nodeExists("/test/child", null));
         assertTrue(mk.nodeExists("/test/copy/child", null));
+        JSONObject obj = parseJSONObject(mk.getNodes("/test", null, 99, 0, -1, 
null));
+        assertPropertyValue(obj, ":childNodeCount", 2l);
+        assertPropertyValue(obj, "copy/:childNodeCount", 1l);
+        assertPropertyValue(obj, "copy/child/:childNodeCount", 0l);
+
+        mk.commit("", "+\"/root\":{} +\"/root/N4\":{} 
*\"/root/N4\":\"/root/N4/N5\"", null, null);
+        assertTrue(mk.nodeExists("/root", null));
+        assertTrue(mk.nodeExists("/root/N4", null));
+        assertTrue(mk.nodeExists("/root/N4/N5", null));
+        obj = parseJSONObject(mk.getNodes("/root", null, 99, 0, -1, null));
+        assertPropertyValue(obj, ":childNodeCount", 1l);
+        assertPropertyValue(obj, "N4/:childNodeCount", 1l);
+        assertPropertyValue(obj, "N4/N5/:childNodeCount", 0l);
     }
 
     @Test

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=1334040&r1=1334039&r2=1334040&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  4 15:45:35 2012
@@ -77,14 +77,20 @@ public interface MicroKernel {
      *   ...
      * ]
      * </pre>
+     * The {@code path} parameter allows to filter the revisions by path, i.e.
+     * only those revisions that affected the subtree rooted at {@code path}
+     * will be included.
      *
      * @param since      timestamp (ms) of earliest revision to be returned
      * @param maxEntries maximum #entries to be returned;
      *                   if < 0, no limit will be applied.
+     * @param path       optional path filter; if {@code null} or {@code ""} 
the
+     *                   default ({@code"/"}) will be assumed, i.e. no filter
+     *                   will be applied
      * @return a list of revisions in chronological order in JSON format.
      * @throws MicroKernelException if an error occurs
      */
-    String /* jsonArray */ getRevisionHistory(long since, int maxEntries)
+    String /* jsonArray */ getRevisionHistory(long since, int maxEntries/*, 
String path*/)
             throws MicroKernelException;
 
     /**
@@ -127,6 +133,10 @@ public interface MicroKernel {
      * If {@code fromRevisionId} and {@code toRevisionId} are not in 
chronological
      * order the returned journal will be empty (i.e. {@code []})
      * <p/>
+     * The {@code path} parameter allows to filter the revisions by path, i.e.
+     * only those revisions that affected the subtree rooted at {@code path}
+     * will be included.
+     * <p/>
      * A {@code MicroKernelException} is thrown if either {@code 
fromRevisionId}
      * or {@code toRevisionId}  doesn't exist, denotes a <i>private</i> branch
      * revision or if another error occurs.
@@ -134,14 +144,14 @@ public interface MicroKernel {
      * @param fromRevisionId id of first revision to be returned in journal
      * @param toRevisionId   id of last revision to be returned in journal,
      *                       if {@code null} the current head revision is 
assumed
-     * @param filter         (optional) filter criteria
-     *                       (e.g. path, property names, etc);
-     *                       TODO specify format and semantics
+     * @param path           optional path filter; if {@code null} or {@code 
""}
+     *                       the default ({@code"/"}) will be assumed, i.e. no
+     *                       filter will be applied
      * @return a chronological list of revisions in JSON format
      * @throws MicroKernelException if an error occurs
      */
     String /* jsonArray */ getJournal(String fromRevisionId, String 
toRevisionId,
-                                      String filter)
+                                      String path)
             throws MicroKernelException;
 
     /**
@@ -149,17 +159,21 @@ public interface MicroKernel {
      * revisions. The changes will be consolidated if the specified range
      * covers intermediary revisions. {@code fromRevisionId} and {@code 
toRevisionId}
      * don't need not be in a specific chronological order.
+     * <p/>
+     * The {@code path} parameter allows to filter the revisions by path, i.e.
+     * only those revisions that affected the subtree rooted at {@code path}
+     * will be included.
      *
      * @param fromRevisionId a revision id, if {@code null} the current head 
revision is assumed
      * @param toRevisionId   another revision id, if {@code null} the current 
head revision is assumed
-     * @param filter         (optional) filter criteria
-     *                       (e.g. path, property names, etc);
-     *                       TODO specify format and semantics
+     * @param path           optional path filter; if {@code null} or {@code 
""}
+     *                       the default ({@code"/"}) will be assumed, i.e. no
+     *                       filter will be applied
      * @return JSON diff representation of the changes
      * @throws MicroKernelException if an error occurs
      */
     String /* JSON diff */ diff(String fromRevisionId, String toRevisionId,
-                                String filter)
+                                String path)
             throws MicroKernelException;
 
     //-------------------------------------------------------------< READ ops >
@@ -250,6 +264,20 @@ public interface MicroKernel {
      * <p/>
      * The {@code offset} and {@code count} parameters are only applied to the
      * direct child nodes of the root of the returned node tree.
+     * <p/>
+     * The {@code filter} parameter allows to specify the names of properties
+     * to be included or excluded.
+     * <p/>
+     * Format:
+     * <pre>
+     * {
+     *   incl: [ "foo", "foo1" ],
+     *   excl: [ "bar", "tmp" ]
+     * }
+     * </pre>
+     * TODO clarify (globbing) syntax, semantics and implicit default filter 
(OAK-75)
+     * <p/>
+     * For more information see {@link #getNodes(String, String)}.
      *
      * @param path       path denoting root of node tree to be retrieved
      * @param revisionId revision id, if {@code null} the current head 
revision is assumed
@@ -257,11 +285,11 @@ public interface MicroKernel {
      * @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 criteria
-     *                   (e.g. names of properties to be included, etc);
-     *                   TODO specify format and semantics
+     * @param filter     optional filter on property 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
+     * @see #getNodes(String, String)
      */
     String /* jsonTree */ getNodes(String path, String revisionId, int depth,
                                    long offset, int count, String filter)

Modified: 
jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/model/CommitBuilder.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/model/CommitBuilder.java?rev=1334040&r1=1334039&r2=1334040&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/model/CommitBuilder.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/model/CommitBuilder.java
 Fri May  4 15:45:35 2012
@@ -615,15 +615,16 @@ public class CommitBuilder {
                 throw new NotFoundException(srcPath);
             }
 
-            MutableNode destParent = getOrCreateStagedNode(destParentPath);
-            destParent.add(new ChildNode(destNodeName, srcCNE.getId()));
-
             if (staged.containsKey(srcPath)) {
                 // the copied subtree is modified
 
                 // update staging area
                 copyStagedNodes(srcPath, destPath, destPath);
             }
+
+            MutableNode destParent = getOrCreateStagedNode(destParentPath);
+            destParent.add(new ChildNode(destNodeName, srcCNE.getId()));
+
         }
 
         @Override


Reply via email to