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/31 18:44:54 UTC

svn commit: r1238711 - /jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/

Author: stefan
Date: Tue Jan 31 17:44:54 2012
New Revision: 1238711

URL: http://svn.apache.org/viewvc?rev=1238711&view=rev
Log:
refactoring serialization code

Modified:
    jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/AbstractPersistenceManager.java
    jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/BDbPersistenceManager.java
    jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/FSPersistenceManager.java
    jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/H2PersistenceManager.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/InMemPersistenceManager.java
    jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/MongoPersistenceManager.java

Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/AbstractPersistenceManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/AbstractPersistenceManager.java?rev=1238711&r1=1238710&r2=1238711&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/AbstractPersistenceManager.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/AbstractPersistenceManager.java Tue Jan 31 17:44:54 2012
@@ -256,6 +256,6 @@ public abstract class AbstractPersistenc
     
     public byte[] toBytes(Node node, ByteArrayOutputStream out) throws Exception {
         node.serialize(new BinaryBinding(out));
-        return idFactory.createNodeId(node, out.toByteArray());
+        return idFactory.createContentId(out.toByteArray());
     }
 }

Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/BDbPersistenceManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/BDbPersistenceManager.java?rev=1238711&r1=1238710&r2=1238711&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/BDbPersistenceManager.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/BDbPersistenceManager.java Tue Jan 31 17:44:54 2012
@@ -141,7 +141,7 @@ public class BDbPersistenceManager exten
         ByteArrayOutputStream out = new ByteArrayOutputStream();
         node.serialize(new BinaryBinding(out));
         byte[] bytes = out.toByteArray();
-        byte[] rawId = idFactory.createNodeId(node, bytes);
+        byte[] rawId = idFactory.createContentId(bytes);
         return persist(bytes, rawId);
     }
 
@@ -163,7 +163,7 @@ public class BDbPersistenceManager exten
         ByteArrayOutputStream out = new ByteArrayOutputStream();
         commit.serialize(new BinaryBinding(out));
         byte[] bytes = out.toByteArray();
-        byte[] rawId = idFactory.createRevisionId(commit, bytes);
+        byte[] rawId = idFactory.createCommitId(bytes);
         return persist(bytes, rawId);
     }
 
@@ -184,14 +184,24 @@ public class BDbPersistenceManager exten
 
     @Override
     protected ChildNodeEntriesBucket readCNEBucket(String id) throws NotFoundException, Exception {
-        // todo implement
-        return null;
+        DatabaseEntry key = new DatabaseEntry(StringUtils.convertHexToBytes(id));
+        DatabaseEntry data = new DatabaseEntry();
+
+        if (db.get(null, key, data, LockMode.DEFAULT) == OperationStatus.SUCCESS) {
+            ByteArrayInputStream in = new ByteArrayInputStream(data.getData());
+            return ChildNodeEntriesBucket.deserialize(id, new BinaryBinding(in));
+        } else {
+            throw new NotFoundException(id);
+        }
     }
 
     @Override
     protected String writeCNEBucket(ChildNodeEntriesBucket bucket) throws Exception {
-        // todo implement
-        return null;
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+        bucket.serialize(new BinaryBinding(out));
+        byte[] bytes = out.toByteArray();
+        byte[] rawId = idFactory.createContentId(bytes);
+        return persist(bytes, rawId);
     }
 
     //-------------------------------------------------------< implementation >

Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/FSPersistenceManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/FSPersistenceManager.java?rev=1238711&r1=1238710&r2=1238711&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/FSPersistenceManager.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/FSPersistenceManager.java Tue Jan 31 17:44:54 2012
@@ -102,7 +102,7 @@ public class FSPersistenceManager extend
         ByteArrayOutputStream out = new ByteArrayOutputStream();
         node.serialize(new BinaryBinding(out));
         byte[] bytes = out.toByteArray();
-        byte[] rawId = idFactory.createNodeId(node, bytes);
+        byte[] rawId = idFactory.createContentId(bytes);
         return writeFile(bytes, rawId);
     }
 
@@ -126,7 +126,7 @@ public class FSPersistenceManager extend
         ByteArrayOutputStream out = new ByteArrayOutputStream();
         commit.serialize(new BinaryBinding(out));
         byte[] bytes = out.toByteArray();
-        byte[] rawId = idFactory.createRevisionId(commit, bytes);
+        byte[] rawId = idFactory.createCommitId(bytes);
         return writeFile(bytes, rawId);
     }
 
@@ -147,14 +147,26 @@ public class FSPersistenceManager extend
 
     @Override
     protected ChildNodeEntriesBucket readCNEBucket(String id) throws NotFoundException, Exception {
-        // todo implement
-        return null;
+        File f = getFile(id);
+        if (f.exists()) {
+            BufferedInputStream in = new BufferedInputStream(new FileInputStream(f));
+            try {
+                return ChildNodeEntriesBucket.deserialize(id, new BinaryBinding(in));
+            } finally {
+                in.close();
+            }
+        } else {
+            throw new NotFoundException(id);
+        }
     }
 
     @Override
     protected String writeCNEBucket(ChildNodeEntriesBucket bucket) throws Exception {
-        // todo implement
-        return null;
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+        bucket.serialize(new BinaryBinding(out));
+        byte[] bytes = out.toByteArray();
+        byte[] rawId = idFactory.createContentId(bytes);
+        return writeFile(bytes, rawId);
     }
 
     //-------------------------------------------------------< implementation >

Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/H2PersistenceManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/H2PersistenceManager.java?rev=1238711&r1=1238710&r2=1238711&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/H2PersistenceManager.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/H2PersistenceManager.java Tue Jan 31 17:44:54 2012
@@ -17,7 +17,6 @@
 package org.apache.jackrabbit.mk.store;
 
 import org.apache.jackrabbit.mk.blobs.BlobStore;
-import org.apache.jackrabbit.mk.blobs.DbBlobStore;
 import org.apache.jackrabbit.mk.blobs.FileBlobStore;
 import org.apache.jackrabbit.mk.model.ChildNodeEntriesBucket;
 import org.apache.jackrabbit.mk.model.Commit;
@@ -139,7 +138,7 @@ public class H2PersistenceManager extend
         ByteArrayOutputStream out = new ByteArrayOutputStream();
         node.serialize(new BinaryBinding(out));
         byte[] bytes = out.toByteArray();
-        byte[] rawId = idFactory.createNodeId(node, bytes);
+        byte[] rawId = idFactory.createContentId(bytes);
         String id = StringUtils.convertBytesToHex(rawId);
 
         Connection con = cp.getConnection();
@@ -188,7 +187,7 @@ public class H2PersistenceManager extend
         ByteArrayOutputStream out = new ByteArrayOutputStream();
         commit.serialize(new BinaryBinding(out));
         byte[] bytes = out.toByteArray();
-        byte[] rawId = idFactory.createRevisionId(commit, bytes);
+        byte[] rawId = idFactory.createCommitId(bytes);
         String id = StringUtils.convertBytesToHex(rawId);
 
         Connection con = cp.getConnection();
@@ -227,13 +226,50 @@ public class H2PersistenceManager extend
 
     @Override
     protected ChildNodeEntriesBucket readCNEBucket(String id) throws NotFoundException, Exception {
-        // todo implement
-        return null;
+        Connection con = cp.getConnection();
+        try {
+            PreparedStatement stmt = con.prepareStatement("select DATA from REVS where ID = ?");
+            try {
+                stmt.setBytes(1, StringUtils.convertHexToBytes(id));
+                ResultSet rs = stmt.executeQuery();
+                if (rs.next()) {
+                    ByteArrayInputStream in = new ByteArrayInputStream(rs.getBytes(1));
+                    return ChildNodeEntriesBucket.deserialize(id, new BinaryBinding(in));
+                } else {
+                    throw new NotFoundException(id);
+                }
+            } finally {
+                stmt.close();
+            }
+        } finally {
+            con.close();
+        }
     }
 
     @Override
     protected String writeCNEBucket(ChildNodeEntriesBucket bucket) throws Exception {
-        // todo implement
-        return null;
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+        bucket.serialize(new BinaryBinding(out));
+        byte[] bytes = out.toByteArray();
+        byte[] rawId = idFactory.createContentId(bytes);
+        String id = StringUtils.convertBytesToHex(rawId);
+
+        Connection con = cp.getConnection();
+        try {
+            PreparedStatement stmt = con
+                    .prepareStatement(
+                            "insert into REVS (ID, DATA) select ?, ? where not exists (select 1 from revs where ID = ?)");
+            try {
+                stmt.setBytes(1, rawId);
+                stmt.setBytes(2, bytes);
+                stmt.setBytes(3, rawId);
+                stmt.executeUpdate();
+            } finally {
+                stmt.close();
+            }
+        } finally {
+            con.close();
+        }
+        return id;
     }
 }
\ No newline at end of file

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=1238711&r1=1238710&r2=1238711&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 Tue Jan 31 17:44:54 2012
@@ -24,43 +24,33 @@ import org.apache.jackrabbit.mk.model.No
 import org.apache.jackrabbit.mk.util.AscendingClock;
 
 /**
- * Create new revision and node ids based on commit data.
+ * Create new commit and internal content object ids based on serialized data.
  */
 abstract class IdFactory {
 
     /**
-     * Create a new node id for some node.
-     * 
-     * @param node node
-     * @param serialized serialized data 
-     * @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.
+     * Creates a new id based on the specified serialized data.
+     * <p/>
+     * The general contract of <code>createContentId</code> is:
+     * <p/>
+     * <code>createId(data1).equals(createId(data2)) == Arrays.equals(data1, data2)</code>
      *
-     * @param bucket bucket
      * @param serialized serialized data
-     * @return raw bucket id as byte array
+     * @return raw node id as byte array
      * @throws Exception if an error occurs
      */
-    public byte[] createBucketId(ChildNodeEntriesBucket bucket, byte[] serialized) throws Exception {
+    public byte[] createContentId(byte[] serialized) throws Exception {
         return digest(serialized);
     }
 
     /**
-     * Create a new revision id for some commit.
+     * Create a new id for some commit.
      * 
-     * @param commit commit
-     * @param serialized serialized data 
+     * @param serialized serialized data
      * @return raw revision id as byte array
      * @throws Exception if an error occurs
      */
-    public abstract byte[] createRevisionId(Commit commit, byte[] serialized)
+    public abstract byte[] createCommitId(byte[] serialized)
             throws Exception;
     
     /**
@@ -98,7 +88,7 @@ abstract class IdFactory {
     public static IdFactory getDigestFactory() {
         return new IdFactory() {
             @Override
-            public byte[] createRevisionId(Commit commit, byte[] serialized)
+            public byte[] createCommitId(byte[] serialized)
                     throws Exception {
                 
                 return digest(serialized);
@@ -118,7 +108,7 @@ abstract class IdFactory {
             private final AscendingClock clock = new AscendingClock(System.currentTimeMillis());
             
             @Override
-            public byte[] createRevisionId(Commit commit, byte[] serialized)
+            public byte[] createCommitId(byte[] serialized)
                     throws Exception {
                 
                 return longToBytes(clock.time());

Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/InMemPersistenceManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/InMemPersistenceManager.java?rev=1238711&r1=1238710&r2=1238711&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/InMemPersistenceManager.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/InMemPersistenceManager.java Tue Jan 31 17:44:54 2012
@@ -41,6 +41,7 @@ public class InMemPersistenceManager ext
 
     private final Map<String, StoredNode> nodes = Collections.synchronizedMap(new HashMap<String, StoredNode>());
     private final Map<String, StoredCommit> commits = Collections.synchronizedMap(new HashMap<String, StoredCommit>());
+    private final Map<String, ChildNodeEntriesBucket> buckets = Collections.synchronizedMap(new HashMap<String, ChildNodeEntriesBucket>());
     private final BlobStore blobs = new MemoryBlobStore();
 
     private String head;
@@ -79,7 +80,7 @@ public class InMemPersistenceManager ext
         ByteArrayOutputStream out = new ByteArrayOutputStream();
         node.serialize(new BinaryBinding(out));
         byte[] bytes = out.toByteArray();
-        String id = StringUtils.convertBytesToHex(idFactory.createNodeId(node, bytes));
+        String id = StringUtils.convertBytesToHex(idFactory.createContentId(bytes));
 
         if (!nodes.containsKey(id)) {
             nodes.put(id, StoredNode.deserialize(id, new BinaryBinding(new ByteArrayInputStream(bytes))));
@@ -103,7 +104,7 @@ public class InMemPersistenceManager ext
         ByteArrayOutputStream out = new ByteArrayOutputStream();
         commit.serialize(new BinaryBinding(out));
         byte[] bytes = out.toByteArray();
-        String id = StringUtils.convertBytesToHex(idFactory.createRevisionId(commit, bytes));
+        String id = StringUtils.convertBytesToHex(idFactory.createCommitId(bytes));
 
         if (!commits.containsKey(id)) {
             commits.put(id, StoredCommit.deserialize(id, new BinaryBinding(new ByteArrayInputStream(bytes))));
@@ -129,13 +130,25 @@ public class InMemPersistenceManager ext
 
     @Override
     protected ChildNodeEntriesBucket readCNEBucket(String id) throws NotFoundException, Exception {
-        // todo implement
-        return null;
+        ChildNodeEntriesBucket bucket = buckets.get(id);
+        if (bucket != null) {
+            return bucket;
+        } else {
+            throw new NotFoundException(id);
+        }
     }
 
     @Override
     protected String writeCNEBucket(ChildNodeEntriesBucket bucket) throws Exception {
-        // todo implement
-        return null;
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+        bucket.serialize(new BinaryBinding(out));
+        byte[] bytes = out.toByteArray();
+        String id = StringUtils.convertBytesToHex(idFactory.createContentId(bytes));
+
+        if (!buckets.containsKey(id)) {
+            buckets.put(id, ChildNodeEntriesBucket.deserialize(id, new BinaryBinding(new ByteArrayInputStream(bytes))));
+        }
+
+        return id;
     }
 }

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=1238711&r1=1238710&r2=1238711&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 Tue Jan 31 17:44:54 2012
@@ -166,7 +166,7 @@ public class MongoPersistenceManager ext
         ByteArrayOutputStream out = new ByteArrayOutputStream();
         node.serialize(new BinaryBinding(out));
         byte[] bytes = out.toByteArray();
-        byte[] key = idFactory.createNodeId(node, bytes);
+        byte[] key = idFactory.createContentId(bytes);
         String id = StringUtils.convertBytesToHex(key);
 
         // todo support partitioned child node lists
@@ -223,7 +223,7 @@ public class MongoPersistenceManager ext
         ByteArrayOutputStream out = new ByteArrayOutputStream();
         commit.serialize(new BinaryBinding(out));
         byte[] bytes = out.toByteArray();
-        byte[] key = idFactory.createRevisionId(commit, bytes);
+        byte[] key = idFactory.createCommitId(bytes);
         String id = StringUtils.convertBytesToHex(key);
 
         BasicDBObject commitObject;
@@ -313,7 +313,7 @@ public class MongoPersistenceManager ext
         ByteArrayOutputStream out = new ByteArrayOutputStream();
         bucket.serialize(new BinaryBinding(out));
         byte[] bytes = out.toByteArray();
-        byte[] key = idFactory.createBucketId(bucket, bytes);
+        byte[] key = idFactory.createContentId(bytes);
         String id = StringUtils.convertBytesToHex(key);
 
         BasicDBObject bucketObject;