You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by dp...@apache.org on 2011/12/09 16:05:38 UTC

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

Author: dpfister
Date: Fri Dec  9 15:05:38 2011
New Revision: 1212468

URL: http://svn.apache.org/viewvc?rev=1212468&view=rev
Log:
Make ID generation for commits and nodes overridable

Added:
    jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/IdFactory.java   (with props)
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/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=1212468&r1=1212467&r2=1212468&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 Fri Dec  9 15:05:38 2011
@@ -42,6 +42,7 @@ public abstract class AbstractPersistenc
 
     private String headId;
     private final ReentrantReadWriteLock headLock = new ReentrantReadWriteLock();
+    protected IdFactory idFactory = IdFactory.getDigestFactory();
 
     Map<String, Object> cache;
 
@@ -111,7 +112,7 @@ public abstract class AbstractPersistenc
         String val = System.getProperty(CACHE_SIZE);
         return (val != null) ? Integer.parseInt(val) : DEFAULT_CACHE_SIZE;
     }
-
+    
     //--------------------------------------------------------< RevisionStore >
 
     public String putNode(Node node) throws Exception {

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=1212468&r1=1212467&r2=1212468&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 Fri Dec  9 15:05:38 2011
@@ -16,15 +16,9 @@
  */
 package org.apache.jackrabbit.mk.store;
 
-import com.sleepycat.je.Database;
-import com.sleepycat.je.DatabaseConfig;
-import com.sleepycat.je.DatabaseEntry;
-import com.sleepycat.je.Durability;
-import com.sleepycat.je.Environment;
-import com.sleepycat.je.EnvironmentConfig;
-import com.sleepycat.je.EnvironmentMutableConfig;
-import com.sleepycat.je.LockMode;
-import com.sleepycat.je.OperationStatus;
+import java.io.File;
+import java.io.InputStream;
+
 import org.apache.jackrabbit.mk.blobs.BlobStore;
 import org.apache.jackrabbit.mk.blobs.FileBlobStore;
 import org.apache.jackrabbit.mk.model.Commit;
@@ -34,9 +28,15 @@ import org.apache.jackrabbit.mk.model.St
 import org.apache.jackrabbit.mk.store.util.Serializer;
 import org.apache.jackrabbit.mk.util.StringUtils;
 
-import java.io.File;
-import java.io.InputStream;
-import java.security.MessageDigest;
+import com.sleepycat.je.Database;
+import com.sleepycat.je.DatabaseConfig;
+import com.sleepycat.je.DatabaseEntry;
+import com.sleepycat.je.Durability;
+import com.sleepycat.je.Environment;
+import com.sleepycat.je.EnvironmentConfig;
+import com.sleepycat.je.EnvironmentMutableConfig;
+import com.sleepycat.je.LockMode;
+import com.sleepycat.je.OperationStatus;
 
 /**
  *
@@ -135,7 +135,9 @@ public class BDbPersistenceManager exten
 
     @Override
     protected String writeNode(Node node) throws Exception {
-        return persist(Serializer.toBytes(node));
+        byte[] data = Serializer.toBytes(node);
+        byte[] rawId = idFactory.createNodeId(node, data);
+        return persist(data, rawId);
     }
 
     @Override
@@ -152,7 +154,9 @@ public class BDbPersistenceManager exten
 
     @Override
     protected String writeCommit(Commit commit) throws Exception {
-        return persist(Serializer.toBytes(commit));
+        byte[] data = Serializer.toBytes(commit);
+        byte[] rawId = idFactory.createRevisionId(commit, data);
+        return persist(data, rawId);
     }
 
     @Override
@@ -170,8 +174,7 @@ public class BDbPersistenceManager exten
         return blobStore.getBlobLength(blobId);
     }
 
-    protected String persist(byte[] bytes) throws Exception {
-        byte[] rawId = MessageDigest.getInstance("SHA-1").digest(bytes);
+    protected String persist(byte[] bytes, byte[] rawId) throws Exception {
         String id = StringUtils.convertBytesToHex(rawId);
 
         DatabaseEntry key = new DatabaseEntry(rawId);

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=1212468&r1=1212467&r2=1212468&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 Fri Dec  9 15:05:38 2011
@@ -16,6 +16,13 @@
  */
 package org.apache.jackrabbit.mk.store;
 
+import java.io.BufferedInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+
 import org.apache.jackrabbit.mk.blobs.BlobStore;
 import org.apache.jackrabbit.mk.blobs.FileBlobStore;
 import org.apache.jackrabbit.mk.model.Commit;
@@ -26,17 +33,6 @@ import org.apache.jackrabbit.mk.store.ut
 import org.apache.jackrabbit.mk.util.IOUtils;
 import org.apache.jackrabbit.mk.util.StringUtils;
 
-import java.io.BufferedInputStream;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.security.DigestOutputStream;
-import java.security.MessageDigest;
-
 /**
  *
  */
@@ -105,7 +101,9 @@ public class FSPersistenceManager extend
 
     @Override
     protected String writeNode(Node node) throws Exception {
-        return writeFile(new ByteArrayInputStream(Serializer.toBytes(node)));
+        byte[] bytes = Serializer.toBytes(node);
+        byte[] rawId = idFactory.createNodeId(node, bytes);
+        return writeFile(bytes, rawId);
     }
 
     @Override
@@ -127,7 +125,9 @@ public class FSPersistenceManager extend
 
     @Override
     protected String writeCommit(Commit commit) throws Exception {
-        return writeFile(new ByteArrayInputStream(Serializer.toBytes(commit)));
+        byte[] bytes = Serializer.toBytes(commit);
+        byte[] rawId = idFactory.createRevisionId(commit, bytes);
+        return writeFile(bytes, rawId);
     }
 
     @Override
@@ -152,31 +152,20 @@ public class FSPersistenceManager extend
         return new File(dataDir, buf.toString());
     }
 
-    private String writeFile(InputStream in) throws Exception {
-        MessageDigest digest = MessageDigest.getInstance("SHA-1");
-
+    private String writeFile(byte[] data, byte[] rawId) throws Exception {
         File tmp = File.createTempFile("tmp", null, dataDir);
+
         try {
             FileOutputStream fos = new FileOutputStream(tmp);
 
-            //OutputStream out = Channels.newOutputStream(fos.getChannel());
-            OutputStream out = fos;
-            DigestOutputStream dos = new DigestOutputStream(out, digest);
-
             try {
-                int read;
-                byte[] buf = new byte[8192];
-                while ((read = in.read(buf, 0, buf.length)) != -1) {
-                    dos.write(buf, 0, read);
-                }
+                fos.write(data);
             } finally {
-                dos.flush();
                 //fos.getChannel().force(true);
                 fos.close();
-                in.close();
             }
 
-            String id = StringUtils.convertBytesToHex(digest.digest());
+            String id = StringUtils.convertBytesToHex(rawId);
             File dst = getFile(id);
             if (dst.exists()) {
                 // already exists

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=1212468&r1=1212467&r2=1212468&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 Fri Dec  9 15:05:38 2011
@@ -29,7 +29,6 @@ import org.h2.jdbcx.JdbcConnectionPool;
 
 import java.io.File;
 import java.io.InputStream;
-import java.security.MessageDigest;
 import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
@@ -135,7 +134,7 @@ public class H2PersistenceManager extend
     @Override
     protected String writeNode(Node node) throws Exception {
         byte[] bytes = Serializer.toBytes(node);
-        byte[] rawId = MessageDigest.getInstance("SHA-1").digest(bytes);
+        byte[] rawId = idFactory.createNodeId(node, bytes);
         String id = StringUtils.convertBytesToHex(rawId);
 
         Connection con = cp.getConnection();
@@ -177,11 +176,11 @@ public class H2PersistenceManager extend
             con.close();
         }
     }
-
+    
     @Override
     protected String writeCommit(Commit commit) throws Exception {
         byte[] bytes = Serializer.toBytes(commit);
-        byte[] rawId = MessageDigest.getInstance("SHA-1").digest(bytes);
+        byte[] rawId = idFactory.createRevisionId(commit, bytes);
         String id = StringUtils.convertBytesToHex(rawId);
 
         Connection con = cp.getConnection();

Added: 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=1212468&view=auto
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/IdFactory.java (added)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/IdFactory.java Fri Dec  9 15:05:38 2011
@@ -0,0 +1,115 @@
+/*
+ * 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.security.MessageDigest;
+
+import org.apache.jackrabbit.mk.model.Commit;
+import org.apache.jackrabbit.mk.model.Node;
+import org.apache.jackrabbit.mk.util.AscendingClock;
+
+/**
+ * Create new revision and node ids based on commit data.
+ */
+abstract class IdFactory {
+
+    /**
+     * Create a new node id for some node.
+     * 
+     * @param commit commit
+     * @param serialized serialized data 
+     * @return raw revision 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 revision id for some commit.
+     * 
+     * @param commit commit
+     * @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)
+            throws Exception;
+    
+    /**
+     * Return a digest for some data.
+     * 
+     * @param data data
+     * @return digest
+     */
+    protected byte[] digest(byte[] data) throws Exception {
+        return MessageDigest.getInstance("SHA-1").digest(data);
+    }
+    
+    /**
+     * Convert a long value into a fixed-size byte array of size 16.
+     * 
+     * @param value value
+     * @return byte array
+     */
+    static byte[] longToBytes(long value) {
+        byte[] result = new byte[16];
+        
+        for (int i = result.length - 1; i >= 0 && value != 0; i--) {
+            result[i] = (byte) (value & 0xff);
+            value >>>= 8;
+        }
+        return result;
+    }
+    
+    /**
+     * Return the default factory that will create node and revision ids based
+     * on their content. 
+     * 
+     * @return factory
+     */
+    public static IdFactory getDigestFactory() {
+        return new IdFactory() {
+            @Override
+            public byte[] createRevisionId(Commit commit, byte[] serialized)
+                    throws Exception {
+                
+                return digest(serialized);
+            }
+        };
+    }
+    
+    /**
+     * Return a factory that will create node ids based on their content, while
+     * returning strictly ascending revision ids based on the current system time.
+     * 
+     * @return factory
+     */
+    public static IdFactory getAscendingClockFactory() {
+        return new IdFactory() {
+
+            private final AscendingClock clock = new AscendingClock(System.currentTimeMillis());
+            
+            @Override
+            public byte[] createRevisionId(Commit commit, byte[] serialized)
+                    throws Exception {
+                
+                return longToBytes(clock.time());
+            }
+        };
+    };
+}

Propchange: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/IdFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/IdFactory.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision Rev Url

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=1212468&r1=1212467&r2=1212468&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 Fri Dec  9 15:05:38 2011
@@ -16,6 +16,12 @@
  */
 package org.apache.jackrabbit.mk.store;
 
+import java.io.File;
+import java.io.InputStream;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
 import org.apache.jackrabbit.mk.blobs.BlobStore;
 import org.apache.jackrabbit.mk.blobs.MemoryBlobStore;
 import org.apache.jackrabbit.mk.model.Commit;
@@ -25,13 +31,6 @@ import org.apache.jackrabbit.mk.model.St
 import org.apache.jackrabbit.mk.store.util.Serializer;
 import org.apache.jackrabbit.mk.util.StringUtils;
 
-import java.io.File;
-import java.io.InputStream;
-import java.security.MessageDigest;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
 /**
  *
  */
@@ -76,7 +75,7 @@ public class InMemPersistenceManager ext
     @Override
     protected String writeNode(Node node) throws Exception {
         byte[] bytes = Serializer.toBytes(node);
-        String id = StringUtils.convertBytesToHex(MessageDigest.getInstance("SHA-1").digest(bytes));
+        String id = StringUtils.convertBytesToHex(idFactory.createNodeId(node, bytes));
 
         if (!nodes.containsKey(id)) {
             nodes.put(id, Serializer.fromBytes(id, bytes, Node.class));
@@ -98,7 +97,7 @@ public class InMemPersistenceManager ext
     @Override
     protected String writeCommit(Commit commit) throws Exception {
         byte[] bytes = Serializer.toBytes(commit);
-        String id = StringUtils.convertBytesToHex(MessageDigest.getInstance("SHA-1").digest(bytes));
+        String id = StringUtils.convertBytesToHex(idFactory.createRevisionId(commit, bytes));
 
         if (!commits.containsKey(id)) {
             commits.put(id, Serializer.fromBytes(id, bytes, Commit.class));

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=1212468&r1=1212467&r2=1212468&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 Dec  9 15:05:38 2011
@@ -16,6 +16,21 @@
  */
 package org.apache.jackrabbit.mk.store;
 
+import java.io.File;
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import org.apache.jackrabbit.mk.model.Commit;
+import org.apache.jackrabbit.mk.model.Node;
+import org.apache.jackrabbit.mk.model.StoredCommit;
+import org.apache.jackrabbit.mk.model.StoredNode;
+import org.apache.jackrabbit.mk.store.util.Serializer;
+import org.apache.jackrabbit.mk.util.IOUtils;
+import org.apache.jackrabbit.mk.util.StringUtils;
+import org.bson.types.ObjectId;
+
 import com.mongodb.BasicDBObject;
 import com.mongodb.DB;
 import com.mongodb.DBCollection;
@@ -26,21 +41,6 @@ import com.mongodb.WriteConcern;
 import com.mongodb.gridfs.GridFS;
 import com.mongodb.gridfs.GridFSDBFile;
 import com.mongodb.gridfs.GridFSInputFile;
-import org.apache.jackrabbit.mk.model.Commit;
-import org.apache.jackrabbit.mk.model.Node;
-import org.apache.jackrabbit.mk.model.StoredCommit;
-import org.apache.jackrabbit.mk.model.StoredNode;
-import org.apache.jackrabbit.mk.store.util.Serializer;
-import org.apache.jackrabbit.mk.util.IOUtils;
-import org.apache.jackrabbit.mk.util.StringUtils;
-import org.bson.types.ObjectId;
-
-import java.io.File;
-import java.io.InputStream;
-import java.security.MessageDigest;
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.Map;
 
 /**
  *
@@ -137,7 +137,7 @@ public class MongoPersistenceManager ext
     @Override
     protected String writeNode(Node node) throws Exception {
         byte[] bytes = Serializer.toBytes(node);
-        byte[] key = MessageDigest.getInstance("SHA-1").digest(bytes);
+        byte[] key = idFactory.createNodeId(node, bytes);
         String id = StringUtils.convertBytesToHex(key);
 
         BasicDBObject nodeObject;
@@ -185,7 +185,7 @@ public class MongoPersistenceManager ext
     @Override
     protected String writeCommit(Commit commit) throws Exception {
         byte[] bytes = Serializer.toBytes(commit);
-        byte[] key = MessageDigest.getInstance("SHA-1").digest(bytes);
+        byte[] key = idFactory.createRevisionId(commit, bytes);
         String id = StringUtils.convertBytesToHex(key);
 
         BasicDBObject commitObject;