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 2012/01/27 23:30:29 UTC

svn commit: r1236910 - in /jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk: model/ store/ store/util/

Author: stefan
Date: Fri Jan 27 22:30:28 2012
New Revision: 1236910

URL: http://svn.apache.org/viewvc?rev=1236910&view=rev
Log:
flat hierarchy support (WIP)

Added:
    jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/Binding.java
Removed:
    jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/util/PersistentId.java
Modified:
    jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/AbstractNode.java
    jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/ChildNodeEntriesBucket.java
    jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/Node.java
    jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/StoredNode.java
    jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/IdFactory.java
    jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/MongoPersistenceManager.java
    jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/util/Constants.java
    jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/util/Serializer.java

Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/AbstractNode.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/AbstractNode.java?rev=1236910&r1=1236909&r2=1236910&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/AbstractNode.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/AbstractNode.java Fri Jan 27 22:30:28 2012
@@ -16,6 +16,7 @@
  */
 package org.apache.jackrabbit.mk.model;
 
+import org.apache.jackrabbit.mk.store.Binding;
 import org.apache.jackrabbit.mk.store.RevisionProvider;
 import org.apache.jackrabbit.mk.store.NotFoundException;
 import org.apache.jackrabbit.mk.util.AbstractRangeIterator;
@@ -206,4 +207,9 @@ public abstract class AbstractNode imple
             }
         }
     }
+    
+    public String serialize(Binding binding) throws Exception {
+        // todo implement
+        throw new Exception("not yet implemented") ;
+    }
 }

Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/ChildNodeEntriesBucket.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/ChildNodeEntriesBucket.java?rev=1236910&r1=1236909&r2=1236910&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/ChildNodeEntriesBucket.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/ChildNodeEntriesBucket.java Fri Jan 27 22:30:28 2012
@@ -23,7 +23,7 @@ import java.util.HashMap;
  */
 public class ChildNodeEntriesBucket extends ChildNodeEntriesInlined {
 
-    ChildNodeEntriesBucket() {
+    public ChildNodeEntriesBucket() {
         // using stock HashMap since keeping insertion-order is not required
         entries = new HashMap<String, ChildNodeEntry>();
     }

Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/Node.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/Node.java?rev=1236910&r1=1236909&r2=1236910&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/Node.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/Node.java Fri Jan 27 22:30:28 2012
@@ -16,6 +16,7 @@
  */
 package org.apache.jackrabbit.mk.model;
 
+import org.apache.jackrabbit.mk.store.Binding;
 import org.apache.jackrabbit.mk.store.RevisionProvider;
 import org.apache.jackrabbit.mk.store.NotFoundException;
 
@@ -43,4 +44,6 @@ public interface Node {
     Node getNode(String relPath, RevisionProvider provider) throws NotFoundException, Exception;
 
     void diff(Node other, NodeDiffHandler handler);
+    
+    String serialize(Binding binding) throws Exception;
 }

Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/StoredNode.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/StoredNode.java?rev=1236910&r1=1236909&r2=1236910&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/StoredNode.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/StoredNode.java Fri Jan 27 22:30:28 2012
@@ -16,6 +16,7 @@
  */
 package org.apache.jackrabbit.mk.model;
 
+import org.apache.jackrabbit.mk.store.Binding;
 import org.apache.jackrabbit.mk.store.RevisionProvider;
 import org.apache.jackrabbit.mk.store.NotFoundException;
 import org.apache.jackrabbit.mk.util.UnmodifiableIterator;
@@ -31,6 +32,11 @@ public class StoredNode extends Abstract
 
     private final String id;
 
+    public static StoredNode deserialize(String id, Binding binding) throws Exception {
+        // todo implement
+        throw new Exception("not yet implemented");
+    }
+
     public StoredNode(String id, Map<String, String> properties, Iterator<ChildNodeEntry> cneIt) {
         this.id = id;
         this.properties.putAll(properties);

Added: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/Binding.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/Binding.java?rev=1236910&view=auto
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/Binding.java (added)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/Binding.java Fri Jan 27 22:30:28 2012
@@ -0,0 +1,35 @@
+/*
+ * 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.util.Map;
+
+/**
+ *
+ */
+public interface Binding {
+    
+    void write(String name, String value) throws Exception;
+    void write(String name, long value) throws Exception;
+    void write(String name, int value) throws Exception;
+    void write(String name, Map<String, String> col) throws Exception;
+    
+    String readString(String name) throws Exception;
+    long readLong(String name) throws Exception;
+    int readInt(String name) throws Exception;
+    void read(String name, Map<String, String> col) throws Exception;
+}

Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/IdFactory.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/IdFactory.java?rev=1236910&r1=1236909&r2=1236910&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/IdFactory.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/IdFactory.java Fri Jan 27 22:30:28 2012
@@ -18,6 +18,7 @@ package org.apache.jackrabbit.mk.store;
 
 import java.security.MessageDigest;
 
+import org.apache.jackrabbit.mk.model.ChildNodeEntriesBucket;
 import org.apache.jackrabbit.mk.model.Commit;
 import org.apache.jackrabbit.mk.model.Node;
 import org.apache.jackrabbit.mk.util.AscendingClock;
@@ -30,15 +31,27 @@ abstract class IdFactory {
     /**
      * Create a new node id for some node.
      * 
-     * @param commit commit
+     * @param node node
      * @param serialized serialized data 
-     * @return raw revision id as byte array
+     * @return raw node id as byte array
      * @throws Exception if an error occurs
      */
     public byte[] createNodeId(Node node, byte[] serialized) throws Exception {
         return digest(serialized);
     }
-    
+
+    /**
+     * Create a new bucket id for some bucket.
+     *
+     * @param bucket bucket
+     * @param serialized serialized data
+     * @return raw bucket id as byte array
+     * @throws Exception if an error occurs
+     */
+    public byte[] createBucketId(ChildNodeEntriesBucket bucket, byte[] serialized) throws Exception {
+        return digest(serialized);
+    }
+
     /**
      * Create a new revision id for some commit.
      * 

Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/MongoPersistenceManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/MongoPersistenceManager.java?rev=1236910&r1=1236909&r2=1236910&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/MongoPersistenceManager.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/MongoPersistenceManager.java Fri Jan 27 22:30:28 2012
@@ -55,6 +55,7 @@ public class MongoPersistenceManager ext
     private static final String HEAD_COLLECTION = "head";
     private static final String NODES_COLLECTION = "nodes";
     private static final String COMMITS_COLLECTION = "commits";
+    private static final String BUCKETS_COLLECTION = "buckets";
     private static final String ID_FIELD = ":id";
     private static final String DATA_FIELD = ":data";
     private static final String PROPERTIES_OBJECT = ":props";
@@ -64,6 +65,7 @@ public class MongoPersistenceManager ext
     private DB db;
     private DBCollection nodes;
     private DBCollection commits;
+    private DBCollection buckets;
     private GridFS fs;
 
     @Override
@@ -89,6 +91,11 @@ public class MongoPersistenceManager ext
                 new BasicDBObject(ID_FIELD, 1),
                 new BasicDBObject("unique", true));
 
+        buckets = db.getCollection(BUCKETS_COLLECTION);
+        buckets.ensureIndex(
+                new BasicDBObject(ID_FIELD, 1),
+                new BasicDBObject("unique", true));
+
         fs = new GridFS(db);
     }
 
@@ -168,7 +175,7 @@ public class MongoPersistenceManager ext
             BasicDBObject children = new BasicDBObject();
             while (it.hasNext()) {
                 ChildNodeEntry cne = it.next();
-                children.put(cne.getName(), cne.getId());
+                children.put(encodeName(cne.getName()), cne.getId());
             }
             nodeObject = new BasicDBObject(ID_FIELD, id)
                     .append(PROPERTIES_OBJECT, new BasicDBObject(encodeKeys(node.getProperties())))
@@ -271,14 +278,55 @@ public class MongoPersistenceManager ext
 
     @Override
     protected ChildNodeEntriesBucket readCNEBucket(String id) throws NotFoundException, Exception {
-        // todo implement
-        return null;
+        BasicDBObject key = new BasicDBObject();
+        if (BINARY_FORMAT) {
+            key.put(ID_FIELD, StringUtils.convertHexToBytes(id));
+        } else {
+            key.put(ID_FIELD, id);
+        }
+        DBObject bucketObject = buckets.findOne(key);
+        if (bucketObject != null) {
+            if (BINARY_FORMAT) {
+                byte[] bytes = (byte[]) bucketObject.get(DATA_FIELD);
+                return Serializer.fromBytes(id, bytes, ChildNodeEntriesBucket.class);
+            } else {
+                ChildNodeEntriesBucket bucket = new ChildNodeEntriesBucket();
+                for (String name : bucketObject.keySet()) {
+                    if (!name.equals(ID_FIELD)) {
+                        bucket.add(new ChildNodeEntry(decodeName(name), (String) bucketObject.get(name)));
+                    }
+                }
+                return bucket;
+            }
+        } else {
+            throw new NotFoundException(id);
+        }
     }
 
     @Override
     protected String writeCNEBucket(ChildNodeEntriesBucket bucket) throws Exception {
-        // todo implement
-        return null;
+        byte[] bytes = Serializer.toBytes(bucket);
+        byte[] key = idFactory.createBucketId(bucket, bytes);
+        String id = StringUtils.convertBytesToHex(key);
+
+        BasicDBObject bucketObject;
+        if (BINARY_FORMAT) {
+            bucketObject = new BasicDBObject(ID_FIELD, key).append(DATA_FIELD, bytes);
+        } else {
+            bucketObject = new BasicDBObject(ID_FIELD, id);
+            Iterator<ChildNodeEntry> it = bucket.getEntries(0, -1);
+            while (it.hasNext()) {
+                ChildNodeEntry cne = it.next();
+                bucketObject.append(encodeName(cne.getName()), cne.getId());
+            }
+        }
+        try {
+            buckets.insert(bucketObject);
+        } catch (MongoException.DuplicateKey ignore) {
+            // fall through
+        }
+
+        return id;
     }
 
     //-------------------------------------------------------< implementation >

Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/util/Constants.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/util/Constants.java?rev=1236910&r1=1236909&r2=1236910&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/util/Constants.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/util/Constants.java Fri Jan 27 22:30:28 2012
@@ -21,13 +21,10 @@ package org.apache.jackrabbit.mk.store.u
  */
 public interface Constants {
 
-    static final String[] TYPE_NAMES = {"node", "nodetree", "fatnode", "fatnodepart", "commit", "blob"};
-
-    static final int ANY = -1;
     static final int NODE = 0;
     static final int NODE_TREE = 1;
     static final int FAT_NODE = 2;
-    static final int FAT_NODE_PART = 3;
+    static final int FAT_NODE_BUCKET = 3;
     static final int COMMIT = 4;
     static final int BLOB = 5;
 }

Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/util/Serializer.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/util/Serializer.java?rev=1236910&r1=1236909&r2=1236910&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/util/Serializer.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/util/Serializer.java Fri Jan 27 22:30:28 2012
@@ -16,6 +16,7 @@
  */
 package org.apache.jackrabbit.mk.store.util;
 
+import org.apache.jackrabbit.mk.model.ChildNodeEntriesBucket;
 import org.apache.jackrabbit.mk.model.ChildNodeEntry;
 import org.apache.jackrabbit.mk.model.Commit;
 import org.apache.jackrabbit.mk.model.StoredCommit;
@@ -139,4 +140,38 @@ public class Serializer {
         return new StoredCommit(id, "".equals(parentId) ? null : parentId, commitTS, rootNodeId, "".equals(msg) ? null : msg);
     }
 
+    //---------------------------------------------------------------< Commit >
+
+    public static byte[] toBytes(ChildNodeEntriesBucket bucket) {
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+        try {
+            out.write(Constants.FAT_NODE_BUCKET);
+            IOUtils.writeVarInt(out, bucket.getCount());
+            for (Iterator<ChildNodeEntry> it = bucket.getEntries(0, -1); it.hasNext(); ) {
+                ChildNodeEntry entry = it.next();
+                IOUtils.writeString(out, entry.getName());
+                IOUtils.writeString(out, entry.getId());
+            }
+            out.close();
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+
+        return out.toByteArray();
+    }
+
+    public static ChildNodeEntriesBucket fromBytes(String id, byte[] bytes, Class<ChildNodeEntriesBucket> type) throws Exception {
+        ByteArrayInputStream in = new ByteArrayInputStream(bytes);
+        if (in.read() != Constants.FAT_NODE_BUCKET) {
+            throw new Exception("unknown data format");
+        }
+        int count = IOUtils.readVarInt(in);
+        ChildNodeEntriesBucket bucket = new ChildNodeEntriesBucket();
+        while (count-- > 0) {
+            String name = IOUtils.readString(in);
+            String value = IOUtils.readString(in);
+            bucket.add(new ChildNodeEntry(name, value));
+        }
+        return bucket;
+    }
 }