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/04/19 16:46:30 UTC

svn commit: r1327973 - in /jackrabbit/oak/trunk: oak-core/src/main/java/org/apache/jackrabbit/mk/client/ oak-core/src/main/java/org/apache/jackrabbit/mk/index/ oak-core/src/main/java/org/apache/jackrabbit/mk/server/ oak-core/src/main/java/org/apache/ja...

Author: stefan
Date: Thu Apr 19 14:46:29 2012
New Revision: 1327973

URL: http://svn.apache.org/viewvc?rev=1327973&view=rev
Log:
 OAK-45: Add support for branching and merging of private copies to MicroKernel (WIP)

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/client/Client.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/IndexWrapper.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/server/MicroKernelServlet.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/simple/SimpleKernelImpl.java
    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-core/src/main/java/org/apache/jackrabbit/mk/wrapper/SecurityWrapper.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/wrapper/VirtualRepositoryWrapper.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/core/MicroKernelImpl.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/client/Client.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/client/Client.java?rev=1327973&r1=1327972&r2=1327973&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/client/Client.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/client/Client.java Thu Apr 19 14:46:29 2012
@@ -266,6 +266,39 @@ public class Client implements MicroKern
         }
     }
 
+    public synchronized String branch(String trunkRevisionId)
+            throws MicroKernelException {
+
+        Request request = null;
+
+        try {
+            request = createRequest("branch");
+            request.addParameter("trunk_revision_id", trunkRevisionId);
+            return request.getString();
+        } catch (IOException e) {
+            throw toMicroKernelException(e);
+        } finally {
+            IOUtils.closeQuietly(request);
+        }
+    }
+
+    public synchronized String merge(String branchRevisionId, String message)
+            throws MicroKernelException {
+
+        Request request = null;
+
+        try {
+            request = createRequest("merge");
+            request.addParameter("branch_revision_id", branchRevisionId);
+            request.addParameter("message", message);
+            return request.getString();
+        } catch (IOException e) {
+            throw toMicroKernelException(e);
+        } finally {
+            IOUtils.closeQuietly(request);
+        }
+    }
+
     public synchronized long getLength(String blobId) throws MicroKernelException {
         Request request = null;
 

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/IndexWrapper.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/IndexWrapper.java?rev=1327973&r1=1327972&r2=1327973&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/IndexWrapper.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/IndexWrapper.java Thu Apr 19 14:46:29 2012
@@ -80,6 +80,14 @@ public class IndexWrapper extends MicroK
         return mk.write(in);
     }
 
+    public String branch(String trunkRevisionId) {
+        return mk.branch(trunkRevisionId);
+    }
+
+    public String merge(String branchRevisionId, String message) {
+        return mk.merge(branchRevisionId, message);
+    }
+
     public String commitStream(String rootPath, JsopReader jsonDiff, String revisionId, String message) {
         if (!rootPath.startsWith(INDEX_PATH)) {
             String rev = mk.commitStream(rootPath, jsonDiff, revisionId, message);

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/server/MicroKernelServlet.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/server/MicroKernelServlet.java?rev=1327973&r1=1327972&r2=1327973&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/server/MicroKernelServlet.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/server/MicroKernelServlet.java Thu Apr 19 14:46:29 2012
@@ -82,6 +82,8 @@ class MicroKernelServlet {
         COMMANDS.put("getChildNodeCount", new GetChildNodeCount());
         COMMANDS.put("getNodes", new GetNodes());
         COMMANDS.put("commit", new Commit());
+        COMMANDS.put("branch", new Branch());
+        COMMANDS.put("merge", new Merge());
         COMMANDS.put("getLength", new GetLength());
         COMMANDS.put("read", new Read());
         COMMANDS.put("write", new Write());
@@ -253,6 +255,37 @@ class MicroKernelServlet {
         }        
     }
 
+    static class Branch implements Command {
+
+        public void execute(MicroKernel mk, Request request, Response response)
+                throws IOException, MicroKernelException {
+
+            String headRevision = mk.getHeadRevision();
+
+            String trunkRevisionId = request.getParameter("trunk_revision_id", headRevision);
+
+            String newRevision = mk.branch(trunkRevisionId);
+
+            response.setContentType("text/plain");
+            response.write(newRevision);
+        }
+    }
+
+    static class Merge implements Command {
+
+        public void execute(MicroKernel mk, Request request, Response response)
+                throws IOException, MicroKernelException {
+
+            String branchRevisionId = request.getParameter("branch_revision_id");
+            String message = request.getParameter("message");
+
+            String newRevision = mk.merge(branchRevisionId, message);
+
+            response.setContentType("text/plain");
+            response.write(newRevision);
+        }
+    }
+
     static class GetLength implements Command {
 
         public void execute(MicroKernel mk, Request request, Response response)

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/simple/SimpleKernelImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/simple/SimpleKernelImpl.java?rev=1327973&r1=1327972&r2=1327973&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/simple/SimpleKernelImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/simple/SimpleKernelImpl.java Thu Apr 19 14:46:29 2012
@@ -17,6 +17,7 @@
 package org.apache.jackrabbit.mk.simple;
 
 import org.apache.jackrabbit.mk.api.MicroKernel;
+import org.apache.jackrabbit.mk.api.MicroKernelException;
 import org.apache.jackrabbit.mk.blobs.AbstractBlobStore;
 import org.apache.jackrabbit.mk.blobs.FileBlobStore;
 import org.apache.jackrabbit.mk.blobs.MemoryBlobStore;
@@ -567,4 +568,13 @@ public class SimpleKernelImpl extends Mi
         return "simple:" + name;
     }
 
+    public String branch(String trunkRevisionId) throws MicroKernelException {
+        // TODO OAK-45 support
+        throw new UnsupportedOperationException();
+    }
+
+    public String merge(String branchRevisionId, String message) throws MicroKernelException {
+        // TODO OAK-45 support
+        throw new UnsupportedOperationException();
+    }
 }

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=1327973&r1=1327972&r2=1327973&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 Thu Apr 19 14:46:29 2012
@@ -207,6 +207,30 @@ public class LogWrapper implements Micro
         }
     }
 
+    public String branch(String trunkRevisionId) {
+        try {
+            logMethod("branch", trunkRevisionId);
+            String result = mk.branch(trunkRevisionId);
+            logResult(result);
+            return result;
+        } catch (Exception e) {
+            logException(e);
+            throw convert(e);
+        }
+    }
+
+    public String merge(String branchRevisionId, String message) {
+        try {
+            logMethod("merge", branchRevisionId, message);
+            String result = mk.merge(branchRevisionId, message);
+            logResult(result);
+            return result;
+        } catch (Exception e) {
+            logException(e);
+            throw convert(e);
+        }
+    }
+
     private void logMethod(String methodName, Object... args) {
         StringBuilder buff = new StringBuilder("mk");
         buff.append(id).append('.').append(methodName).append('(');

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=1327973&r1=1327972&r2=1327973&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 Thu Apr 19 14:46:29 2012
@@ -117,6 +117,14 @@ public abstract class MicroKernelWrapper
                 return wrapped.commit(path, jsonDiff, revisionId, message);
             }
 
+            public String branch(String trunkRevisionId) {
+                return wrapped.branch(trunkRevisionId);
+            }
+
+            public String merge(String branchRevisionId, String message) {
+                return wrapped.merge(branchRevisionId, message);
+            }
+
             public String diff(String fromRevisionId, String toRevisionId, String path) {
                 return wrapped.diff(fromRevisionId, toRevisionId, path);
             }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/wrapper/SecurityWrapper.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/wrapper/SecurityWrapper.java?rev=1327973&r1=1327972&r2=1327973&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/wrapper/SecurityWrapper.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/wrapper/SecurityWrapper.java Thu Apr 19 14:46:29 2012
@@ -334,6 +334,16 @@ public class SecurityWrapper extends Mic
         return mk.write(in);
     }
 
+    public String branch(String trunkRevisionId) {
+        // TODO OAK-45 support
+        return mk.branch(trunkRevisionId);
+    }
+
+    public String merge(String branchRevisionId, String message) {
+        // TODO OAK-45 support
+        return mk.merge(branchRevisionId, message);
+    }
+
     private NodeImpl filterAccess(String path, NodeImpl n) {
         if (!checkRights(path, false)) {
             return null;

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/wrapper/VirtualRepositoryWrapper.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/wrapper/VirtualRepositoryWrapper.java?rev=1327973&r1=1327972&r2=1327973&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/wrapper/VirtualRepositoryWrapper.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/wrapper/VirtualRepositoryWrapper.java Thu Apr 19 14:46:29 2012
@@ -324,5 +324,14 @@ public class VirtualRepositoryWrapper ex
         return mk.write(in);
     }
 
+    public String branch(String trunkRevisionId) {
+        // TODO OAK-45 support
+        return mk.branch(trunkRevisionId);
+    }
+
+    public String merge(String branchRevisionId, String message) {
+        // TODO OAK-45 support
+        return mk.merge(branchRevisionId, message);
+    }
 }
 

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=1327973&r1=1327972&r2=1327973&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 Thu Apr 19 14:46:29 2012
@@ -109,7 +109,8 @@ public interface MicroKernel {
      * </pre>
      *
      * @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 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
@@ -262,7 +263,8 @@ public interface MicroKernel {
      *
      * @param path path denoting target node
      * @param jsonDiff changes to be applied in JSON diff format.
-     * @param revisionId id of revision the changes are based on, if {@code null} the current head revision is assumed
+     * @param revisionId id of revision the changes are based on,
+     *                   if {@code null} the current head revision is assumed
      * @param message commit message
      * @return id of newly created revision
      * @throws MicroKernelException if an error occurs
@@ -270,6 +272,45 @@ public interface MicroKernel {
     String /* revisionId */ commit(String path, String jsonDiff, String revisionId, String message)
             throws MicroKernelException;
 
+    /**
+     * Creates a <i>private</i> branch revision off the specified <i>public</i>
+     * trunk revision.
+     * <p/>
+     * A {@code MicroKernelException} is thrown if {@code trunkRevisionId} doesn't
+     * exist, if it's not a <i>trunk</i> revision (i.e. it's not reachable
+     * by traversing the revision history backwards starting from the current
+     * head revision) or if another error occurs.
+     *
+     * @param trunkRevisionId id of public trunk revision to base branch on,
+     *                        if {@code null} the current head revision is assumed
+     * @return id of newly created private branch revision
+     * @throws MicroKernelException if {@code trunkRevisionId} doesn't exist,
+     *                              if it's not a <i>trunk</i> revision
+     *                              or if another error occurs
+     * @see #merge(String, String)
+     */
+    String /* revisionId */ branch(String trunkRevisionId)
+            throws MicroKernelException;
+
+    /**
+     * Merges the specified <i>private</i> branch revision with the current
+     * head revision.
+     * <p/>
+     * A {@code MicroKernelException} is thrown if {@code branchRevisionId} doesn't
+     * exist, if it's not a branch revision, if the merge fails because of
+     * conflicting changes or if another error occurs.
+     *
+     * @param branchRevisionId id of private branch revision
+     * @param message commit message
+     * @return id of newly created head revision
+     * @throws MicroKernelException if {@code branchRevisionId} doesn't exist,
+     *                              if it's not a branch revision, if the merge
+     *                              fails because of conflicting changes or if
+     *                              another error occurs.
+     * @see #branch(String)
+     */
+    String /* revisionId */ merge(String branchRevisionId, String message)
+            throws MicroKernelException;
 
     //--------------------------------------------------< BLOB READ/WRITE ops >
 

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=1327973&r1=1327972&r2=1327973&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 Thu Apr 19 14:46:29 2012
@@ -411,14 +411,14 @@ public class MicroKernelImpl implements 
         }
     }
 
-    public String branch(String publicRevisionId) throws MicroKernelException {
+    public String branch(String trunkRevisionId) throws MicroKernelException {
         // create a private branch
 
         if (rep == null) {
             throw new IllegalStateException("this instance has already been disposed");
         }
 
-        Id revId = publicRevisionId == null ? getHeadRevisionId() : Id.fromString(publicRevisionId);
+        Id revId = trunkRevisionId == null ? getHeadRevisionId() : Id.fromString(trunkRevisionId);
 
         try {
             CommitBuilder cb = rep.getCommitBuilder(revId, "");
@@ -428,18 +428,17 @@ public class MicroKernelImpl implements 
         }
     }
 
-    public String merge(String privateRevisionId) throws MicroKernelException {
-        // create a private branch
+    public String merge(String branchRevisionId, String message) throws MicroKernelException {
+        // merge a private branch with current head revision
 
         if (rep == null) {
             throw new IllegalStateException("this instance has already been disposed");
         }
 
-        Id revId = Id.fromString(privateRevisionId);
+        Id revId = Id.fromString(branchRevisionId);
 
         try {
-            CommitBuilder cb = rep.getCommitBuilder(revId, "");
-            return cb.doMerge().toString();
+            return rep.getCommitBuilder(revId, message).doMerge().toString();
         } catch (Exception e) {
             throw new MicroKernelException(e);
         }