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/04/15 12:34:42 UTC

svn commit: r1092657 - in /jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk: MicroKernelImpl.java api/MicroKernel.java store/Commit.java store/MutableCommit.java store/MutableNode.java store/Node.java store/ObjectStore.java

Author: stefan
Date: Fri Apr 15 10:34:41 2011
New Revision: 1092657

URL: http://svn.apache.org/viewvc?rev=1092657&view=rev
Log:
MicroKernel prototype (WIP)

Added:
    jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/MutableCommit.java
    jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/MutableNode.java
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/store/Commit.java
    jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/Node.java
    jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/ObjectStore.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=1092657&r1=1092656&r2=1092657&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 Fri Apr 15 10:34:41 2011
@@ -68,20 +68,20 @@ public class MicroKernelImpl implements 
         return null;
     }
 
-    public boolean nodeExists(String idOrPath, String revisionId) throws MicroKernelException {
+    public boolean nodeExists(String path, String revisionId) throws MicroKernelException {
         if (rep == null) {
             throw new IllegalStateException("this instance has already been disposed");
         }
 
         try {
-            rep.getNode(idOrPath, revisionId);
+            rep.getNode(path, revisionId);
             return true;
         } catch (Exception e) {
             return false;
         }
     }
 
-    public String getNodes(String idOrPath, int depth, String revisionId) throws MicroKernelException {
+    public String getNodes(String path, int depth, String revisionId) throws MicroKernelException {
         if (rep == null) {
             throw new IllegalStateException("this instance has already been disposed");
         }
@@ -91,7 +91,7 @@ public class MicroKernelImpl implements 
         return null;
     }
 
-    public String getChildNodes(String idOrPath, long offset, long count, int depth, String revisionId) throws MicroKernelException {
+    public String getChildNodes(String path, long offset, long count, int depth, String revisionId) throws MicroKernelException {
         if (rep == null) {
             throw new IllegalStateException("this instance has already been disposed");
         }
@@ -101,19 +101,19 @@ public class MicroKernelImpl implements 
         return null;
     }
 
-    public long getChildNodeCount(String idOrPath, String revisionId) throws MicroKernelException {
+    public long getChildNodeCount(String path, String revisionId) throws MicroKernelException {
         if (rep == null) {
             throw new IllegalStateException("this instance has already been disposed");
         }
 
         try {
-            return rep.getNode(idOrPath, revisionId).getChildNodeEntries().size();
+            return rep.getNode(path, revisionId).getChildNodeEntries().size();
         } catch (Exception e) {
             throw new MicroKernelException(e);
         }
     }
 
-    public String commit(String idOrPath, String jsonDiff, String revisionId) throws MicroKernelException {
+    public String commit(String path, String jsonDiff, String revisionId) throws MicroKernelException {
         if (rep == null) {
             throw new IllegalStateException("this instance has already been disposed");
         }

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=1092657&r1=1092656&r2=1092657&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 Fri Apr 15 10:34:41 2011
@@ -145,12 +145,12 @@ public interface MicroKernel {
     /**
      * Determines whether the specified node exists.
      *
-     * @param idOrPath identifier or path denoting node
+     * @param path path denoting node
      * @param revisionId revision
      * @return <code>true</code> if the specified node exists, otherwise <code>false</code>
      * @throws MicroKernelException if an error occurs
      */
-    boolean nodeExists(String idOrPath, String revisionId) throws MicroKernelException;
+    boolean nodeExists(String path, String revisionId) throws MicroKernelException;
 
     /**
      * Returns the node tree rooted at the specified parent node. The depth of
@@ -182,7 +182,8 @@ public interface MicroKernel {
      * although they might not be included in the tree.</li>
      * <li><code>:childNodeCount > lengthOf(:childNodes)</code> indicates that the
      * node does have more child nodes than those included in the tree. Large number
-     * of child nodes can be retrieved in chunks using the {@link #getChildNodes} method</li>
+     * of child nodes can be retrieved in chunks using the
+     * {@link #getChildNodes(String, long, long, int, String)} method</li>
      * </ul>
      *
      * TBD: Simpler and more intuitive format, albeit not strictly JSON compliant
@@ -207,21 +208,21 @@ public interface MicroKernel {
      * }
      * </pre>
      *
-     * @param idOrPath identifier or path denoting root of node tree to be retrieved
+     * @param path path denoting root of node tree to be retrieved
      * @param depth maximum depth of returned tree
      * @param revisionId revision
      * @return node tree in JSON format
      * @throws MicroKernelException if an error occurs
      */
-    String /* jsonTree */ getNodes(String idOrPath, int depth, String revisionId) throws MicroKernelException;
+    String /* jsonTree */ getNodes(String path, int depth, String revisionId) throws MicroKernelException;
 
     // specialized methods for reading flat hierarchies
 
     /**
-     * Similar to {@link #getNodes}, except that this method returns an array
-     * of child node trees and allows for reading large lists of child nodes
-     * in chunks (by specifying appropriate values for <code>offset</code>
-     * and <code>count</code>).
+     * Similar to {@link #getNodes(String, int, String)}, except that this method
+     * returns an array of child node trees and allows for reading large lists
+     * of child nodes in chunks (by specifying appropriate values for
+     * <code>offset</code> and <code>count</code>).
      * <p/>
      * The depth of the returned trees is governed by the <code>depth</code> parameter:
      * <table>
@@ -239,7 +240,7 @@ public interface MicroKernel {
      * ]
      * </pre>
      *
-     * @param idOrPath identifier or path denoting parent node
+     * @param path path denoting parent node
      * @param offset start position in child node list
      * @param count maximum number of child nodes to retrieve
      * @param depth maximum depth of returned trees
@@ -247,19 +248,19 @@ public interface MicroKernel {
      * @return array of node tree in JSON format
      * @throws MicroKernelException if an error occurs
      */
-    String /* array of jsonTrees */ getChildNodes(String idOrPath, long offset, long count, int depth, String revisionId) throws MicroKernelException;
+    String /* array of jsonTrees */ getChildNodes(String path, long offset, long count, int depth, String revisionId) throws MicroKernelException;
 
     /**
      * Returns the number of child nodes of the specified parent node.
      *
      * @todo if we represent the number of child nodes as a special property on the parent (":childNodeCount") there's probably no need for a specific api method (TBD)
      *
-     * @param idOrPath identifier or path denoting parent node
+     * @param path path denoting parent node
      * @param revisionId revision
      * @return number of child nodes
      * @throws MicroKernelException if an error occurs
      */
-    long /* count */ getChildNodeCount(String idOrPath, String revisionId)
+    long /* count */ getChildNodeCount(String path, String revisionId)
             throws MicroKernelException;
 
 
@@ -268,13 +269,13 @@ public interface MicroKernel {
     /**
      * Applies the specified changes on the specified target node.
      *
-     * @param idOrPath identifier or path denoting target node
+     * @param path path denoting target node
      * @param jsonDiff changes to be applied in JSON diff format.
      * @param revisionId revision the changes are based on
      * @return id of newly created revision
      * @throws MicroKernelException if an error occurs
      */
-    String /* revisionId */ commit(String idOrPath, String jsonDiff, String revisionId)
+    String /* revisionId */ commit(String path, String jsonDiff, String revisionId)
             throws MicroKernelException;
 
 

Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/Commit.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/Commit.java?rev=1092657&r1=1092656&r2=1092657&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/Commit.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/Commit.java Fri Apr 15 10:34:41 2011
@@ -16,6 +16,11 @@
  */
 package org.apache.jackrabbit.mk.store;
 
+import java.io.ByteArrayInputStream;
+import java.io.DataInputStream;
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * Immutable Commit object...
  */
@@ -27,11 +32,15 @@ public class Commit extends StoredObject
     // id of root node associated with this commit
     final String rootNodeId;
 
-    public Commit(String id, String rootNodeId, String[] parentIds) {
+    // commit timestamp
+    final long commitTS;
+
+    protected Commit(String id, String rootNodeId, long commitTS, List<String> parentIds) {
         super(id);
 
         this.rootNodeId = rootNodeId;
-        this.parentIds = parentIds;
+        this.parentIds = parentIds.toArray(new String[parentIds.size()]);
+        this.commitTS = commitTS;
     }
 
     public String getRootNodeId() {
@@ -41,4 +50,24 @@ public class Commit extends StoredObject
     public String[] getParentIds() {
         return parentIds;
     }
+
+    public long getCommitTS() {
+        return commitTS;
+    }
+
+    //--------------------------------------------------------< serialization >
+
+    public static Commit fromBytes(String id, byte[] data) throws Exception {
+        ByteArrayInputStream bais = new ByteArrayInputStream(data);
+        DataInputStream in = new DataInputStream(bais);
+        String rootNodeId = in.readUTF();
+        long commitTS = in.readLong();
+        int count = in.readInt();
+        List<String> parentIds = new ArrayList<String>(count);
+        while (count-- > 0) {
+            parentIds.add(in.readUTF());
+        }
+        in.close();
+        return new Commit(id, rootNodeId, commitTS, parentIds);
+    }
 }

Added: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/MutableCommit.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/MutableCommit.java?rev=1092657&view=auto
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/MutableCommit.java (added)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/MutableCommit.java Fri Apr 15 10:34:41 2011
@@ -0,0 +1,82 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.mk.store;
+
+import java.io.ByteArrayOutputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *
+ */
+public class MutableCommit {
+
+    // id of root node associated with this commit
+    String rootNodeId;
+
+    // commit timestamp
+    long commitTS;
+
+    // id's of parent commits
+    final List<String> parentIds;
+
+    public MutableCommit() {
+        parentIds = new ArrayList<String>();
+    }
+
+    public List<String> getParentIds() {
+        return parentIds;
+    }
+
+
+    public String getRootNodeId() {
+        return rootNodeId;
+    }
+
+    public void setRootNodeId(String rootNodeId) {
+        this.rootNodeId = rootNodeId;
+    }
+
+    public long getCommitTS() {
+        return commitTS;
+    }
+
+    public void setCommitTS(long commitTS) {
+        this.commitTS = commitTS;
+    }
+
+    //--------------------------------------------------------< serialization >
+
+    public byte[] toBytes() {
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        DataOutputStream out = new DataOutputStream(baos);
+        try {
+            out.writeUTF(rootNodeId);
+            out.writeLong(commitTS);
+            out.write(parentIds.size());
+            for (String commitId : parentIds) {
+                out.writeUTF(commitId);
+            }
+            out.close();
+        } catch (IOException safeToIgnore) {
+        }
+
+        return baos.toByteArray();
+    }
+}

Added: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/MutableNode.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/MutableNode.java?rev=1092657&view=auto
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/MutableNode.java (added)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/MutableNode.java Fri Apr 15 10:34:41 2011
@@ -0,0 +1,90 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.mk.store;
+
+import java.io.ByteArrayOutputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+/**
+ *
+ */
+public class MutableNode {
+
+    final String baseRevId;
+
+    final Map<String, String> properties;
+
+    // map keeping insertion order
+    final LinkedHashMap<String, String> childEntries;
+
+
+    public MutableNode(String baseRevId) {
+        this.baseRevId = baseRevId;
+        this.properties = new HashMap<String, String>();
+        this.childEntries = new LinkedHashMap<String, String>();
+    }
+
+    public MutableNode(String baseRevId, Node existing) {
+        this.baseRevId = baseRevId;
+        this.properties = new HashMap<String, String>(existing.getProperties());
+        this.childEntries = new LinkedHashMap<String, String>(existing.getChildNodeEntries());
+    }
+
+    public String getBaseRevId() {
+        return baseRevId;
+    }
+
+    public Map<String, String> getProperties() {
+        return properties;
+    }
+
+    /**
+     * Returns a map of names and id's which keeps insertion order.
+     *
+     * @return
+     */
+    public Map<String, String> getChildEntries() {
+        return childEntries;
+    }
+
+    //--------------------------------------------------------< serialization >
+
+    public byte[] toBytes() {
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        DataOutputStream out = new DataOutputStream(baos);
+        try {
+            out.write(properties.size());
+            for (Map.Entry<String, String> entry : properties.entrySet()) {
+                out.writeUTF(entry.getKey());
+                out.writeUTF(entry.getValue());
+            }
+            out.write(childEntries.size());
+            for (Map.Entry<String, String> entry : childEntries.entrySet()) {
+                out.writeUTF(entry.getKey());
+                out.writeUTF(entry.getValue());
+            }
+            out.close();
+        } catch (IOException safeToIgnore) {
+        }
+
+        return baos.toByteArray();
+    }
+}

Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/Node.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/Node.java?rev=1092657&r1=1092656&r2=1092657&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/Node.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/Node.java Fri Apr 15 10:34:41 2011
@@ -16,6 +16,9 @@
  */
 package org.apache.jackrabbit.mk.store;
 
+import java.io.ByteArrayInputStream;
+import java.io.DataInputStream;
+import java.io.IOException;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.LinkedHashMap;
@@ -28,18 +31,15 @@ import java.util.Map;
 public class Node extends StoredObject {
 
     final Map<String, String> properties;
+    // map keeping insertion order
     final LinkedHashMap<String, String> childEntries;
 
-    public Node(String id,
+    protected Node(String id,
                 Map<String, String> properties,
-                List<ChildNodeEntry> children) {
+                LinkedHashMap<String, String> childEntries) {
         super(id);
-        this.properties = new HashMap<String, String>();
-        this.properties.putAll(properties);
-        childEntries = new LinkedHashMap<String, String>(children.size());
-        for (ChildNodeEntry cne : children) {
-            childEntries.put(cne.getName(), cne.getId());
-        }
+        this.properties = properties;
+        this.childEntries = childEntries;
     }
 
     public Map<String, String> getProperties() {
@@ -55,23 +55,26 @@ public class Node extends StoredObject {
         return Collections.unmodifiableMap(childEntries);
     }
 
-    //--------------------------------------------------------< inner classes >
-    public static class ChildNodeEntry {
-
-        final String name;
-        final String id;
+    //--------------------------------------------------------< serialization >
 
-        public ChildNodeEntry(String name, String id) {
-            this.name = name;
-            this.id = id;
+    public static Node fromBytes(String id, byte[] data) throws Exception {
+        ByteArrayInputStream bais = new ByteArrayInputStream(data);
+        DataInputStream in = new DataInputStream(bais);
+        int count = in.readInt();
+        Map<String, String> props = new HashMap<String, String>(count);
+        while (count-- > 0) {
+            String name = in.readUTF();
+            String value = in.readUTF();
+            props.put(name, value);
         }
-
-        public String getName() {
-            return name;
-        }
-
-        public String getId() {
-            return id;
+        count = in.readInt();
+        LinkedHashMap<String, String> childEntries = new LinkedHashMap<String, String>(count);
+        while (count-- > 0) {
+            String name = in.readUTF();
+            String childId = in.readUTF();
+            childEntries.put(name, childId);
         }
+        in.close();
+        return new Node(id, props, childEntries);
     }
 }

Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/ObjectStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/ObjectStore.java?rev=1092657&r1=1092656&r2=1092657&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/ObjectStore.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/ObjectStore.java Fri Apr 15 10:34:41 2011
@@ -54,16 +54,20 @@ public class ObjectStore implements Cons
 
     public Node getNode(String id) throws Exception {
         byte[] data = store.get(id, NODE);
-        // todo deserialize Node object
-        Node node = null;
-        return node;
+        return Node.fromBytes(id, data);
+    }
+
+    public String putNode(MutableNode node) throws Exception {
+        return store.put(NODE, node.toBytes());
     }
 
     public Commit getCommit(String id) throws Exception {
         byte[] data = store.get(id, COMMIT);
-        // todo deserialize Commit object
-        Commit commit = null;
-        return commit;
+        return Commit.fromBytes(id, data);
+    }
+
+    public String putCommit(MutableCommit commit) throws Exception {
+        return store.put(COMMIT, commit.toBytes());
     }
 
     public Commit getHeadCommit() throws Exception {