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/12/14 12:18:43 UTC

svn commit: r1214161 - in /jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk: MicroKernelImpl.java api/MicroKernel.java json/JsopTokenizer.java util/PathUtils.java

Author: stefan
Date: Wed Dec 14 11:18:43 2011
New Revision: 1214161

URL: http://svn.apache.org/viewvc?rev=1214161&view=rev
Log:
MicroKernel#commit: support absolute paths in diff

Modified:
    jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/MicroKernelImpl.java
    jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/api/MicroKernel.java
    jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/json/JsopTokenizer.java
    jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/util/PathUtils.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=1214161&r1=1214160&r2=1214161&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 Wed Dec 14 11:18:43 2011
@@ -381,6 +381,9 @@ public class MicroKernelImpl implements 
         if (rep == null) {
             throw new IllegalStateException("this instance has already been disposed");
         }
+        if (path.length() > 0 && !PathUtils.isAbsolute(path)) {
+            throw new IllegalArgumentException("absolute path expected: " + path);
+        }
         try {
             JsopTokenizer t = new JsopTokenizer(jsonDiff);
             CommitBuilder cb = rep.getCommitBuilder(revisionId, message);
@@ -389,12 +392,17 @@ public class MicroKernelImpl implements 
                 if (r == JsopTokenizer.END) {
                     break;
                 }
+                int pos; // used for error reporting
                 switch (r) {
                     case '+': {
-                        String relPath = t.readString();
+                        pos = t.getLastPos();
+                        String subPath = t.readString();
                         t.read(':');
                         t.read('{');
-                        String nodePath = PathUtils.concat(path, relPath);
+                        String nodePath = PathUtils.concat(path, subPath);
+                        if (!PathUtils.isAbsolute(nodePath)) {
+                            throw new Exception("absolute path expected: " + nodePath + ", pos: " + pos);
+                        }
                         String parentPath = PathUtils.getParentPath(nodePath);
                         String nodeName = PathUtils.getName(nodePath);
                         // build the list of added nodes recursively
@@ -406,12 +414,18 @@ public class MicroKernelImpl implements 
                         break;
                     }
                     case '-': {
-                        String relPath = t.readString();
-                        cb.removeNode(PathUtils.concat(path, relPath));
+                        pos = t.getLastPos();
+                        String subPath = t.readString();
+                        String targetPath = PathUtils.concat(path, subPath);
+                        if (!PathUtils.isAbsolute(targetPath)) {
+                            throw new Exception("absolute path expected: " + targetPath + ", pos: " + pos);
+                        }
+                        cb.removeNode(targetPath);
                         break;
                     }
                     case '^': {
-                        String relPath = t.readString();
+                        pos = t.getLastPos();
+                        String subPath = t.readString();
                         t.read(':');
                         String value;
                         if (t.matches(JsopTokenizer.NULL)) {
@@ -419,21 +433,33 @@ public class MicroKernelImpl implements 
                         } else {
                             value = t.readRawValue().trim();
                         }
-                        String nodePath = PathUtils.concat(path, relPath);
-                        String parentPath = PathUtils.getParentPath(nodePath);
-                        String propName = PathUtils.getName(nodePath);
+                        String targetPath = PathUtils.concat(path, subPath);
+                        if (!PathUtils.isAbsolute(targetPath)) {
+                            throw new Exception("absolute path expected: " + targetPath + ", pos: " + pos);
+                        }
+                        String parentPath = PathUtils.getParentPath(targetPath);
+                        String propName = PathUtils.getName(targetPath);
                         cb.setProperty(parentPath, propName, value);
                         break;
                     }
                     case '>': {
                         // TODO: support reorder syntax
-                        String relPath = t.readString();
+                        pos = t.getLastPos();
+                        String subPath = t.readString();
+                        String srcPath = PathUtils.concat(path, subPath);
+                        if (!PathUtils.isAbsolute(srcPath)) {
+                            throw new Exception("absolute path expected: " + srcPath + ", pos: " + pos);
+                        }
                         t.read(':');
+                        pos = t.getLastPos();
                         String targetPath = t.readString();
                         if (!PathUtils.isAbsolute(targetPath)) {
                             targetPath = PathUtils.concat(path, targetPath);
+                            if (!PathUtils.isAbsolute(targetPath)) {
+                                throw new Exception("absolute path expected: " + targetPath + ", pos: " + pos);
+                            }
                         }
-                        cb.moveNode(PathUtils.concat(path, relPath), targetPath);
+                        cb.moveNode(srcPath, targetPath);
                         break;
                     }
                     default:

Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/api/MicroKernel.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/api/MicroKernel.java?rev=1214161&r1=1214160&r2=1214161&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/api/MicroKernel.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/api/MicroKernel.java Wed Dec 14 11:18:43 2011
@@ -271,6 +271,9 @@ public interface MicroKernel {
 
     /**
      * Applies the specified changes on the specified target node.
+     * <p/>
+     * If <code>path.length() == 0</code> the paths specified in the
+     * <code>jsonDiff</code> are expected to be absolute.
      *
      * @param path       path denoting target node
      * @param jsonDiff   changes to be applied in JSON diff format.

Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/json/JsopTokenizer.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/json/JsopTokenizer.java?rev=1214161&r1=1214160&r2=1214161&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/json/JsopTokenizer.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/json/JsopTokenizer.java Wed Dec 14 11:18:43 2011
@@ -430,6 +430,10 @@ public class JsopTokenizer implements Js
         return pos;
     }
 
+    public int getLastPos() {
+        return lastPos;
+    }
+
     public void setPos(int pos) {
         this.pos = pos;
     }

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=1214161&r1=1214160&r2=1214161&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 Wed Dec 14 11:18:43 2011
@@ -230,25 +230,28 @@ public class PathUtils {
      * Concatenate path elements.
      *
      * @param parentPath the parent path
-     * @param relativePath the relative path to add
+     * @param subPath the subPath path to add
      * @return the concatenated path
      */
-    public static String concat(String parentPath, String relativePath) {
+    public static String concat(String parentPath, String subPath) {
         assertValid(parentPath);
-        assertValid(relativePath);
-        if (isAbsolutePath(relativePath)) {
-            throw new IllegalArgumentException("Cannot append absolute path " + relativePath);
-        } else if (relativePath.length() == 0) {
+        assertValid(subPath);
+        // special cases
+        if (parentPath.length() == 0) {
+            return subPath;
+        } else if (subPath.length() == 0) {
             return parentPath;
+        } else if (isAbsolutePath(subPath)) {
+            throw new IllegalArgumentException("Cannot append absolute path " + subPath);
         }
         int parentLen = parentPath.length();
         StringBuilder buff = new StringBuilder(
-                parentLen + 1 + relativePath.length());
+                parentLen + 1 + subPath.length());
         buff.append(parentPath);
         if (parentLen > 0 && !denotesRootPath(parentPath)) {
             buff.append('/');
         }
-        buff.append(relativePath);
+        buff.append(subPath);
         return buff.toString();
     }