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 2012/02/24 16:03:23 UTC

svn commit: r1293282 - in /jackrabbit/sandbox/microkernel: ./ src/main/java/org/apache/jackrabbit/mk/ src/main/java/org/apache/jackrabbit/mk/store/

Author: dpfister
Date: Fri Feb 24 15:03:23 2012
New Revision: 1293282

URL: http://svn.apache.org/viewvc?rev=1293282&view=rev
Log:
Separate RevisionStore from AbstractPersistenceManager
- provide separate PersistenceManager interface
- provide caching in DefaultRevisionStore
- use BlobStore interface instead of blob methods in PersistenceManager

Added:
    jackrabbit/sandbox/microkernel/:hash.zip   (with props)
    jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/DefaultRevisionStore.java   (with props)
    jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/PersistenceManager.java   (with props)
    jackrabbit/sandbox/microkernel/wstest.html   (with props)
Removed:
    jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/AbstractPersistenceManager.java
Modified:
    jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/Repository.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

Added: jackrabbit/sandbox/microkernel/:hash.zip
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/%3Ahash.zip?rev=1293282&view=auto
==============================================================================
Binary file - no diff available.

Propchange: jackrabbit/sandbox/microkernel/:hash.zip
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/Repository.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/Repository.java?rev=1293282&r1=1293281&r2=1293282&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/Repository.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/Repository.java Fri Feb 24 15:03:23 2012
@@ -24,12 +24,7 @@ import org.apache.jackrabbit.mk.model.Co
 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.AbstractPersistenceManager;
-import org.apache.jackrabbit.mk.store.BDbPersistenceManager;
-import org.apache.jackrabbit.mk.store.FSPersistenceManager;
-import org.apache.jackrabbit.mk.store.H2PersistenceManager;
-import org.apache.jackrabbit.mk.store.InMemPersistenceManager;
-import org.apache.jackrabbit.mk.store.MongoPersistenceManager;
+import org.apache.jackrabbit.mk.store.DefaultRevisionStore;
 import org.apache.jackrabbit.mk.store.NotFoundException;
 import org.apache.jackrabbit.mk.store.RevisionStore;
 import org.apache.jackrabbit.mk.util.PathUtils;
@@ -42,7 +37,7 @@ public class Repository {
     final String homeDir;
     boolean initialized;
 
-    final AbstractPersistenceManager pm;
+    private final DefaultRevisionStore rs;
 
     public Repository(String homeDir) throws Exception {
         File home = new File(homeDir == null ? "." : homeDir, ".mk");
@@ -51,11 +46,7 @@ public class Repository {
         }
         this.homeDir = home.getCanonicalPath();
 
-        pm = new H2PersistenceManager();
-        //pm = new InMemPersistenceManager();
-        //pm = new MongoPersistenceManager();
-        //pm = new BDbPersistenceManager();
-        //pm = new FSPersistenceManager();
+        rs = new DefaultRevisionStore();
 
         initialized = false;
     }
@@ -66,7 +57,7 @@ public class Repository {
         }
 
         File home = new File(homeDir);
-        pm.initialize(home);
+        rs.initialize(home);
 
         initialized = true;
     }
@@ -76,7 +67,7 @@ public class Repository {
             return;
         }
 
-        pm.close();
+        rs.close();
 
         initialized = false;
     }
@@ -86,28 +77,28 @@ public class Repository {
             throw new IllegalStateException("not initialized");
         }
 
-        return pm;
+        return rs;
     }
 
     public String getHeadRevision() throws Exception {
         if (!initialized) {
             throw new IllegalStateException("not initialized");
         }
-        return pm.getHeadCommitId();
+        return rs.getHeadCommitId();
     }
 
     public StoredCommit getHeadCommit() throws Exception {
         if (!initialized) {
             throw new IllegalStateException("not initialized");
         }
-        return pm.getHeadCommit();
+        return rs.getHeadCommit();
     }
 
     public StoredCommit getCommit(String id) throws NotFoundException, Exception {
         if (!initialized) {
             throw new IllegalStateException("not initialized");
         }
-        return pm.getCommit(id);
+        return rs.getCommit(id);
     }
 
     /**
@@ -123,14 +114,14 @@ public class Repository {
             throw new IllegalStateException("not initialized");
         }
 
-        StoredNode root = pm.getRootNode(revId);
+        StoredNode root = rs.getRootNode(revId);
         if (PathUtils.denotesRoot(path)) {
             return root;
         }
 
         //return root.getNode(path.substring(1), pm);
         String[] ids = resolvePath(revId, path);
-        return pm.getNode(ids[ids.length - 1]);
+        return rs.getNode(ids[ids.length - 1]);
     }
 
     public boolean nodeExists(String revId, String path) {
@@ -144,13 +135,13 @@ public class Repository {
 
         try {
             String[] names = PathUtils.split(path);
-            Node parent = pm.getRootNode(revId);
+            Node parent = rs.getRootNode(revId);
             for (int i = 0; i < names.length; i++) {
                 ChildNodeEntry cne = parent.getChildNodeEntry(names[i]);
                 if (cne == null) {
                     return false;
                 }
-                parent = pm.getNode(cne.getId());
+                parent = rs.getNode(cne.getId());
             }
             return true;
         } catch (Exception e) {
@@ -159,7 +150,7 @@ public class Repository {
     }
 
     public CommitBuilder getCommitBuilder(String revId, String msg) throws Exception {
-        return new CommitBuilder(revId, msg, pm);
+        return new CommitBuilder(revId, msg, rs);
 
     }
 
@@ -177,7 +168,7 @@ public class Repository {
             throw new IllegalArgumentException("illegal path");
         }
 
-        Commit commit = pm.getCommit(revId);
+        Commit commit = rs.getCommit(revId);
 
         if (PathUtils.denotesRoot(nodePath)) {
             return new String[]{commit.getRootNodeId()};
@@ -187,7 +178,7 @@ public class Repository {
 
         // get root node
         ids[0] = commit.getRootNodeId();
-        Node parent = pm.getNode(ids[0]);
+        Node parent = rs.getNode(ids[0]);
         // traverse path and remember id of each element
         for (int i = 0; i < names.length; i++) {
             ChildNodeEntry cne = parent.getChildNodeEntry(names[i]);
@@ -195,7 +186,7 @@ public class Repository {
                 throw new NotFoundException(nodePath);
             }
             ids[i + 1] = cne.getId();
-            parent = pm.getNode(cne.getId());
+            parent = rs.getNode(cne.getId());
         }
         return ids;
     }

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=1293282&r1=1293281&r2=1293282&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 Feb 24 15:03:23 2012
@@ -19,15 +19,11 @@ package org.apache.jackrabbit.mk.store;
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 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.ChildNodeEntriesMap;
 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.util.StringUtils;
 
 import com.sleepycat.je.Database;
@@ -43,23 +39,22 @@ import com.sleepycat.je.OperationStatus;
 /**
  *
  */
-public class BDbPersistenceManager extends AbstractPersistenceManager {
+public class BDbPersistenceManager implements PersistenceManager {
 
     private final static byte[] HEAD_ID = new byte[]{0};
     private Environment dbEnv;
     private Database db;
     private Database head;
-    private BlobStore blobStore;
 
-    @Override
-    protected void doInitialize(File homeDir) throws Exception {
+    // TODO: make this configurable
+    private IdFactory idFactory = IdFactory.getDigestFactory();
+    
+    public void initialize(File homeDir) throws Exception {
         File dbDir = new File(homeDir, "db");
         if (!dbDir.exists()) {
             dbDir.mkdir();
         }
 
-        blobStore = new FileBlobStore(new File(homeDir, "blobs").getCanonicalPath());
-
         EnvironmentConfig envConfig = new EnvironmentConfig();
         //envConfig.setTransactional(true);
         envConfig.setAllowCreate(true);
@@ -86,8 +81,7 @@ public class BDbPersistenceManager exten
         });
     }
 
-    @Override
-    protected void doClose() {
+    public void close() {
         try {
             if (db.getConfig().getDeferredWrite()) {
                 db.sync();
@@ -103,8 +97,7 @@ public class BDbPersistenceManager exten
         }
     }
 
-    @Override
-    protected String readHead() throws Exception {
+    public String readHead() throws Exception {
         DatabaseEntry key = new DatabaseEntry(HEAD_ID);
         DatabaseEntry data = new DatabaseEntry();
 
@@ -115,29 +108,26 @@ public class BDbPersistenceManager exten
         }
     }
 
-    @Override
-    protected void writeHead(String id) throws Exception {
+    public void writeHead(String id) throws Exception {
         DatabaseEntry key = new DatabaseEntry(HEAD_ID);
         DatabaseEntry data = new DatabaseEntry(StringUtils.convertHexToBytes(id));
 
         head.put(null, key, data);
     }
 
-    @Override
-    protected StoredNode readNode(String id) throws NotFoundException, Exception {
+    public Binding readNodeBinding(String id) throws NotFoundException, Exception {
         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 StoredNode.deserialize(id, this, new BinaryBinding(in));
+            return new BinaryBinding(in);
         } else {
             throw new NotFoundException(id);
         }
     }
 
-    @Override
-    protected String writeNode(Node node) throws Exception {
+    public String writeNode(Node node) throws Exception {
         ByteArrayOutputStream out = new ByteArrayOutputStream();
         node.serialize(new BinaryBinding(out));
         byte[] bytes = out.toByteArray();
@@ -145,8 +135,7 @@ public class BDbPersistenceManager exten
         return persist(bytes, rawId);
     }
 
-    @Override
-    protected StoredCommit readCommit(String id) throws NotFoundException, Exception {
+    public StoredCommit readCommit(String id) throws NotFoundException, Exception {
         DatabaseEntry key = new DatabaseEntry(StringUtils.convertHexToBytes(id));
         DatabaseEntry data = new DatabaseEntry();
 
@@ -158,8 +147,7 @@ public class BDbPersistenceManager exten
         }
     }
 
-    @Override
-    protected String writeCommit(Commit commit) throws Exception {
+    public String writeCommit(Commit commit) throws Exception {
         ByteArrayOutputStream out = new ByteArrayOutputStream();
         commit.serialize(new BinaryBinding(out));
         byte[] bytes = out.toByteArray();
@@ -167,23 +155,7 @@ public class BDbPersistenceManager exten
         return persist(bytes, rawId);
     }
 
-    @Override
-    protected String writeBlob(InputStream in) throws Exception {
-        return blobStore.writeBlob(in);
-    }
-
-    @Override
-    protected int readBlob(String blobId, long pos, byte[] buff, int off, int length) throws NotFoundException, Exception {
-        return blobStore.readBlob(blobId, pos, buff, off, length);
-    }
-
-    @Override
-    protected long blobLength(String blobId) throws NotFoundException, Exception {
-        return blobStore.getBlobLength(blobId);
-    }
-
-    @Override
-    protected ChildNodeEntriesMap readCNEMap(String id) throws NotFoundException, Exception {
+    public ChildNodeEntriesMap readCNEMap(String id) throws NotFoundException, Exception {
         DatabaseEntry key = new DatabaseEntry(StringUtils.convertHexToBytes(id));
         DatabaseEntry data = new DatabaseEntry();
 
@@ -195,8 +167,7 @@ public class BDbPersistenceManager exten
         }
     }
 
-    @Override
-    protected String writeCNEMap(ChildNodeEntriesMap map) throws Exception {
+    public String writeCNEMap(ChildNodeEntriesMap map) throws Exception {
         ByteArrayOutputStream out = new ByteArrayOutputStream();
         map.serialize(new BinaryBinding(out));
         byte[] bytes = out.toByteArray();

Added: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/DefaultRevisionStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/DefaultRevisionStore.java?rev=1293282&view=auto
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/DefaultRevisionStore.java (added)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/DefaultRevisionStore.java Fri Feb 24 15:03:23 2012
@@ -0,0 +1,280 @@
+/*
+ * 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 org.apache.jackrabbit.mk.blobs.BlobStore;
+import org.apache.jackrabbit.mk.blobs.FileBlobStore;
+import org.apache.jackrabbit.mk.model.ChildNodeEntriesMap;
+import org.apache.jackrabbit.mk.model.Commit;
+import org.apache.jackrabbit.mk.model.MutableCommit;
+import org.apache.jackrabbit.mk.model.Node;
+import org.apache.jackrabbit.mk.model.MutableNode;
+import org.apache.jackrabbit.mk.model.StoredCommit;
+import org.apache.jackrabbit.mk.model.StoredNode;
+import org.apache.jackrabbit.mk.util.SimpleLRUCache;
+
+import java.io.File;
+import java.io.InputStream;
+import java.util.Collections;
+import java.util.Map;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
+
+/**
+ * Default revision store implementation, passing calls to a <code>PersistenceManager</code>
+ * and a <code>BlobStore</code>, respectively and providing caching. 
+ */
+public class DefaultRevisionStore implements RevisionStore {
+
+    public static final String CACHE_SIZE = "mk.cacheSize";
+    public static final int DEFAULT_CACHE_SIZE = 10000;
+
+    private boolean initialized;
+
+    private String headId;
+    private final ReentrantReadWriteLock headLock = new ReentrantReadWriteLock();
+    private PersistenceManager pm;
+    private BlobStore blobStore;
+    private boolean blobStoreNeedsClose;
+
+    private Map<String, Object> cache;
+
+    public void initialize(File homeDir) throws Exception {
+        if (initialized) {
+            throw new IllegalStateException("already initialized");
+        }
+
+        cache = Collections.synchronizedMap(SimpleLRUCache.<String, Object>newInstance(determineInitialCacheSize()));
+
+        pm = new H2PersistenceManager();
+        //pm = new InMemPersistenceManager();
+        //pm = new MongoPersistenceManager();
+        //pm = new BDbPersistenceManager();
+        //pm = new FSPersistenceManager();
+        pm.initialize(homeDir);
+        
+        if (pm instanceof BlobStore) {
+            blobStore = (BlobStore) pm;
+        } else {
+            blobStore = new FileBlobStore(new File(homeDir, "blobs").getCanonicalPath());
+            blobStoreNeedsClose = true;
+        }
+
+        // make sure we've got a HEAD commit
+        headId = pm.readHead();
+        if (headId == null || headId.length() == 0) {
+            // assume virgin repository
+            String rootNodeId = pm.writeNode(new MutableNode(this));
+            MutableCommit initialCommit = new MutableCommit();
+            initialCommit.setCommitTS(System.currentTimeMillis());
+            initialCommit.setRootNodeId(rootNodeId);
+            headId = pm.writeCommit(initialCommit);
+            pm.writeHead(headId);
+        }
+
+        initialized = true;
+    }
+
+    public void close() {
+        verifyInitialized();
+
+        cache.clear();
+
+        if (blobStoreNeedsClose) {
+            blobStore.close();
+        }
+        pm.close();
+        
+        initialized = false;
+    }
+
+    protected void verifyInitialized() {
+        if (!initialized) {
+            throw new IllegalStateException("not initialized");
+        }
+    }
+
+    protected int determineInitialCacheSize() {
+        String val = System.getProperty(CACHE_SIZE);
+        return (val != null) ? Integer.parseInt(val) : DEFAULT_CACHE_SIZE;
+    }
+    
+    //--------------------------------------------------------< RevisionStore >
+
+    public String putNode(Node node) throws Exception {
+        verifyInitialized();
+
+        PersistHook callback = null;
+        if (node instanceof PersistHook) {
+            callback = (PersistHook) node;
+            callback.prePersist(this);
+        }
+
+        String id = pm.writeNode(node);
+        
+        if (callback != null)  {
+            callback.postPersist(this);
+        }
+        
+        cache.put(id, new StoredNode(id, node, this));
+
+        return id;
+    }
+
+    public String putCNEMap(ChildNodeEntriesMap map) throws Exception {
+        verifyInitialized();
+
+        PersistHook callback = null;
+        if (map instanceof PersistHook) {
+            callback = (PersistHook) map;
+            callback.prePersist(this);
+        }
+
+       String id = pm.writeCNEMap(map);
+
+        if (callback != null)  {
+            callback.postPersist(this);
+        }
+
+        cache.put(id, map);
+
+        return id;
+    }
+
+    public String putCommit(Commit commit) throws Exception {
+        verifyInitialized();
+
+        PersistHook callback = null;
+        if (commit instanceof PersistHook) {
+            callback = (PersistHook) commit;
+            callback.prePersist(this);
+        }
+
+        String id = pm.writeCommit(commit);
+
+        if (callback != null)  {
+            callback.postPersist(this);
+        }
+
+        cache.put(id, new StoredCommit(id, commit));
+
+        return id;
+    }
+
+    public void setHeadCommitId(String commitId) throws Exception {
+        verifyInitialized();
+
+        headLock.writeLock().lock();
+        try {
+            pm.writeHead(commitId);
+            headId = commitId;
+        } finally {
+            headLock.writeLock().unlock();
+        }
+    }
+
+    public void lockHead() {
+        headLock.writeLock().lock();
+    }
+
+    public void unlockHead() {
+        headLock.writeLock().unlock();
+    }
+
+    public String putBlob(InputStream in) throws Exception {
+        verifyInitialized();
+
+        return blobStore.writeBlob(in);
+    }
+
+    //-----------------------------------------------------< RevisionProvider >
+
+    public StoredNode getNode(String id) throws NotFoundException, Exception {
+        verifyInitialized();
+
+        StoredNode node = (StoredNode) cache.get(id);
+        if (node != null) {
+            return node;
+        }
+
+        Binding nodeBinding = pm.readNodeBinding(id);
+        node = StoredNode.deserialize(id, this, nodeBinding);
+
+        cache.put(id, node);
+
+        return node;
+    }
+
+    public ChildNodeEntriesMap getCNEMap(String id) throws NotFoundException, Exception {
+        verifyInitialized();
+
+        ChildNodeEntriesMap map = (ChildNodeEntriesMap) cache.get(id);
+        if (map != null) {
+            return map;
+        }
+
+        map = pm.readCNEMap(id);
+
+        cache.put(id, map);
+
+        return map;
+    }
+
+    public StoredCommit getCommit(String id) throws NotFoundException, Exception {
+        verifyInitialized();
+
+        StoredCommit commit = (StoredCommit) cache.get(id);
+        if (commit != null) {
+            return commit;
+        }
+
+        commit = pm.readCommit(id);
+        cache.put(id, commit);
+
+        return commit;
+    }
+
+    public StoredNode getRootNode(String commitId) throws NotFoundException, Exception {
+        return getNode(getCommit(commitId).getRootNodeId());
+    }
+
+    public StoredCommit getHeadCommit() throws Exception {
+        return getCommit(getHeadCommitId());
+    }
+
+    public String getHeadCommitId() throws Exception {
+        verifyInitialized();
+
+        headLock.readLock().lock();
+        try {
+            return headId;
+        } finally {
+            headLock.readLock().unlock();
+        }
+    }
+
+    public int getBlob(String blobId, long pos, byte[] buff, int off, int length) throws NotFoundException, Exception {
+        verifyInitialized();
+
+        return blobStore.readBlob(blobId, pos, buff, off, length);
+    }
+
+    public long getBlobLength(String blobId) throws NotFoundException, Exception {
+        verifyInitialized();
+
+        return blobStore.getBlobLength(blobId);
+    }
+}

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

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

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=1293282&r1=1293281&r2=1293282&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 Feb 24 15:03:23 2012
@@ -21,49 +21,40 @@ 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.ChildNodeEntriesMap;
 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.util.IOUtils;
 import org.apache.jackrabbit.mk.util.StringUtils;
 
 /**
  *
  */
-public class FSPersistenceManager extends AbstractPersistenceManager {
+public class FSPersistenceManager implements PersistenceManager {
 
     private File dataDir;
     private File head;
-    private BlobStore blobStore;
-
-    @Override
-    protected void doInitialize(File homeDir) throws Exception {
-        blobStore = new FileBlobStore(new File(homeDir, "blobs").getCanonicalPath());
 
+    // TODO: make this configurable
+    private IdFactory idFactory = IdFactory.getDigestFactory();
+    
+    public void initialize(File homeDir) throws Exception {
         dataDir = new File(homeDir, "data");
         if (!dataDir.exists()) {
             dataDir.mkdir();
         }
-
         head = new File(homeDir, "HEAD");
         if (!head.exists()) {
             writeHead("");
         }
-
     }
 
-    @Override
-    protected void doClose() {
+    public void close() {
     }
 
-    @Override
-    protected String readHead() throws Exception {
+    public String readHead() throws Exception {
         FileInputStream in = new FileInputStream(head);
         try {
             return IOUtils.readString(in);
@@ -72,8 +63,7 @@ public class FSPersistenceManager extend
         }
     }
 
-    @Override
-    protected void writeHead(String id) throws Exception {
+    public void writeHead(String id) throws Exception {
         FileOutputStream out = new FileOutputStream(head);
         try {
             IOUtils.writeString(out, id);
@@ -82,13 +72,12 @@ public class FSPersistenceManager extend
         }
     }
 
-    @Override
-    protected StoredNode readNode(String id) throws NotFoundException, Exception {
+    public Binding readNodeBinding(String id) throws NotFoundException, Exception {
         File f = getFile(id);
         if (f.exists()) {
             BufferedInputStream in = new BufferedInputStream(new FileInputStream(f));
             try {
-                return StoredNode.deserialize(id, this, new BinaryBinding(in));
+                return new BinaryBinding(in);
             } finally {
                 in.close();
             }
@@ -97,8 +86,7 @@ public class FSPersistenceManager extend
         }
     }
 
-    @Override
-    protected String writeNode(Node node) throws Exception {
+    public String writeNode(Node node) throws Exception {
         ByteArrayOutputStream out = new ByteArrayOutputStream();
         node.serialize(new BinaryBinding(out));
         byte[] bytes = out.toByteArray();
@@ -106,8 +94,7 @@ public class FSPersistenceManager extend
         return writeFile(bytes, rawId);
     }
 
-    @Override
-    protected StoredCommit readCommit(String id) throws NotFoundException, Exception {
+    public StoredCommit readCommit(String id) throws NotFoundException, Exception {
         File f = getFile(id);
         if (f.exists()) {
             BufferedInputStream in = new BufferedInputStream(new FileInputStream(f));
@@ -121,8 +108,7 @@ public class FSPersistenceManager extend
         }
     }
 
-    @Override
-    protected String writeCommit(Commit commit) throws Exception {
+    public String writeCommit(Commit commit) throws Exception {
         ByteArrayOutputStream out = new ByteArrayOutputStream();
         commit.serialize(new BinaryBinding(out));
         byte[] bytes = out.toByteArray();
@@ -130,23 +116,7 @@ public class FSPersistenceManager extend
         return writeFile(bytes, rawId);
     }
 
-    @Override
-    protected String writeBlob(InputStream in) throws Exception {
-        return blobStore.writeBlob(in);
-    }
-
-    @Override
-    protected int readBlob(String blobId, long pos, byte[] buff, int off, int length) throws NotFoundException, Exception {
-        return blobStore.readBlob(blobId, pos, buff, off, length);
-    }
-
-    @Override
-    protected long blobLength(String blobId) throws NotFoundException, Exception {
-        return blobStore.getBlobLength(blobId);
-    }
-
-    @Override
-    protected ChildNodeEntriesMap readCNEMap(String id) throws NotFoundException, Exception {
+    public ChildNodeEntriesMap readCNEMap(String id) throws NotFoundException, Exception {
         File f = getFile(id);
         if (f.exists()) {
             BufferedInputStream in = new BufferedInputStream(new FileInputStream(f));
@@ -160,8 +130,7 @@ public class FSPersistenceManager extend
         }
     }
 
-    @Override
-    protected String writeCNEMap(ChildNodeEntriesMap map) throws Exception {
+    public String writeCNEMap(ChildNodeEntriesMap map) throws Exception {
         ByteArrayOutputStream out = new ByteArrayOutputStream();
         map.serialize(new BinaryBinding(out));
         byte[] bytes = out.toByteArray();

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=1293282&r1=1293281&r2=1293282&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 Feb 24 15:03:23 2012
@@ -16,20 +16,16 @@
  */
 package org.apache.jackrabbit.mk.store;
 
-import org.apache.jackrabbit.mk.blobs.BlobStore;
-import org.apache.jackrabbit.mk.blobs.FileBlobStore;
 import org.apache.jackrabbit.mk.model.ChildNodeEntriesMap;
 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.util.StringUtils;
 import org.h2.jdbcx.JdbcConnectionPool;
 
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.File;
-import java.io.InputStream;
 import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
@@ -38,15 +34,18 @@ import java.sql.Statement;
 /**
  *
  */
-public class H2PersistenceManager extends AbstractPersistenceManager {
+public class H2PersistenceManager implements PersistenceManager {
 
     private static final boolean FAST = Boolean.getBoolean("mk.fastDb");
 
     private JdbcConnectionPool cp;
-    private BlobStore blobStore;
+    
+    // TODO: make this configurable
+    private IdFactory idFactory = IdFactory.getDigestFactory();
+
+    //---------------------------------------------------< PersistenceManager >
 
-    @Override
-    protected void doInitialize(File homeDir) throws Exception {
+    public void initialize(File homeDir) throws Exception {
         File dbDir = new File(homeDir, "db");
         if (!dbDir.exists()) {
             dbDir.mkdir();
@@ -70,19 +69,16 @@ public class H2PersistenceManager extend
             store.setConnectionPool(cp);
             blobStore = store;
 */
-            blobStore = new FileBlobStore(new File(homeDir, "blobs").getCanonicalPath());
         } finally {
             con.close();
         }
     }
 
-    @Override
-    protected void doClose() {
+    public void close() {
         cp.dispose();
     }
 
-    @Override
-    protected String readHead() throws Exception {
+    public String readHead() throws Exception {
         Connection con = cp.getConnection();
         try {
             PreparedStatement stmt = con.prepareStatement("select * from head");
@@ -98,8 +94,7 @@ public class H2PersistenceManager extend
         }
     }
 
-    @Override
-    protected void writeHead(String id) throws Exception {
+    public void writeHead(String id) throws Exception {
         Connection con = cp.getConnection();
         try {
             PreparedStatement stmt = con.prepareStatement("update head set id=?");
@@ -111,8 +106,7 @@ public class H2PersistenceManager extend
         }
     }
 
-    @Override
-    protected StoredNode readNode(String id) throws NotFoundException, Exception {
+    public Binding readNodeBinding(String id) throws NotFoundException, Exception {
         Connection con = cp.getConnection();
         try {
             PreparedStatement stmt = con.prepareStatement("select DATA from REVS where ID = ?");
@@ -121,7 +115,7 @@ public class H2PersistenceManager extend
                 ResultSet rs = stmt.executeQuery();
                 if (rs.next()) {
                     ByteArrayInputStream in = new ByteArrayInputStream(rs.getBytes(1));
-                    return StoredNode.deserialize(id, this, new BinaryBinding(in));
+                    return new BinaryBinding(in);
                 } else {
                     throw new NotFoundException(id);
                 }
@@ -133,8 +127,7 @@ public class H2PersistenceManager extend
         }
     }
 
-    @Override
-    protected String writeNode(Node node) throws Exception {
+    public String writeNode(Node node) throws Exception {
         ByteArrayOutputStream out = new ByteArrayOutputStream();
         node.serialize(new BinaryBinding(out));
         byte[] bytes = out.toByteArray();
@@ -160,8 +153,7 @@ public class H2PersistenceManager extend
         return id;
     }
 
-    @Override
-    protected StoredCommit readCommit(String id) throws NotFoundException, Exception {
+    public StoredCommit readCommit(String id) throws NotFoundException, Exception {
         Connection con = cp.getConnection();
         try {
             PreparedStatement stmt = con.prepareStatement("select DATA from REVS where ID = ?");
@@ -182,8 +174,7 @@ public class H2PersistenceManager extend
         }
     }
     
-    @Override
-    protected String writeCommit(Commit commit) throws Exception {
+    public String writeCommit(Commit commit) throws Exception {
         ByteArrayOutputStream out = new ByteArrayOutputStream();
         commit.serialize(new BinaryBinding(out));
         byte[] bytes = out.toByteArray();
@@ -209,23 +200,7 @@ public class H2PersistenceManager extend
         return id;
     }
 
-    @Override
-    protected String writeBlob(InputStream in) throws Exception {
-        return blobStore.writeBlob(in);
-    }
-
-    @Override
-    protected int readBlob(String blobId, long pos, byte[] buff, int off, int length) throws NotFoundException, Exception {
-        return blobStore.readBlob(blobId, pos, buff, off, length);
-    }
-
-    @Override
-    protected long blobLength(String blobId) throws NotFoundException, Exception {
-        return blobStore.getBlobLength(blobId);
-    }
-
-    @Override
-    protected ChildNodeEntriesMap readCNEMap(String id) throws NotFoundException, Exception {
+    public ChildNodeEntriesMap readCNEMap(String id) throws NotFoundException, Exception {
         Connection con = cp.getConnection();
         try {
             PreparedStatement stmt = con.prepareStatement("select DATA from REVS where ID = ?");
@@ -246,8 +221,7 @@ public class H2PersistenceManager extend
         }
     }
 
-    @Override
-    protected String writeCNEMap(ChildNodeEntriesMap map) throws Exception {
+    public String writeCNEMap(ChildNodeEntriesMap map) throws Exception {
         ByteArrayOutputStream out = new ByteArrayOutputStream();
         map.serialize(new BinaryBinding(out));
         byte[] bytes = out.toByteArray();

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=1293282&r1=1293281&r2=1293282&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 Feb 24 15:03:23 2012
@@ -30,67 +30,61 @@ import org.apache.jackrabbit.mk.model.Ch
 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.util.StringUtils;
 
 /**
  *
  */
-public class InMemPersistenceManager extends AbstractPersistenceManager {
+public class InMemPersistenceManager implements PersistenceManager, BlobStore {
 
-
-    private final Map<String, StoredNode> nodes = Collections.synchronizedMap(new HashMap<String, StoredNode>());
+    private final Map<String, byte[]> nodes = Collections.synchronizedMap(new HashMap<String, byte[]>());
     private final Map<String, StoredCommit> commits = Collections.synchronizedMap(new HashMap<String, StoredCommit>());
     private final Map<String, ChildNodeEntriesMap> cneMaps = Collections.synchronizedMap(new HashMap<String, ChildNodeEntriesMap>());
     private final BlobStore blobs = new MemoryBlobStore();
 
     private String head;
 
-    @Override
-    protected void doInitialize(File homeDir) throws Exception {
+    // TODO: make this configurable
+    private IdFactory idFactory = IdFactory.getDigestFactory();
+    
+    public void initialize(File homeDir) throws Exception {
         head = null;
     }
 
-    @Override
-    protected void doClose() {
+    public void close() {
     }
 
-    @Override
-    protected String readHead() throws Exception {
+    public String readHead() throws Exception {
         return head;
     }
 
-    @Override
-    protected void writeHead(String id) throws Exception {
+    public void writeHead(String id) throws Exception {
         head = id;
     }
 
-    @Override
-    protected StoredNode readNode(String id) throws NotFoundException, Exception {
-        StoredNode node = nodes.get(id);
-        if (node != null) {
-            return node;
+    public Binding readNodeBinding(String id) throws NotFoundException, Exception {
+        byte[] bytes = nodes.get(id);
+        if (bytes != null) {
+            return new BinaryBinding(new ByteArrayInputStream(bytes));
         } else {
             throw new NotFoundException(id);
         }
     }
 
-    @Override
-    protected String writeNode(Node node) throws Exception {
+    public String writeNode(Node node) throws Exception {
         ByteArrayOutputStream out = new ByteArrayOutputStream();
         node.serialize(new BinaryBinding(out));
         byte[] bytes = out.toByteArray();
         String id = StringUtils.convertBytesToHex(idFactory.createContentId(bytes));
 
         if (!nodes.containsKey(id)) {
-            nodes.put(id, StoredNode.deserialize(id, this, new BinaryBinding(new ByteArrayInputStream(bytes))));
+            nodes.put(id, bytes);
         }
 
         return id;
     }
 
-    @Override
-    protected StoredCommit readCommit(String id) throws NotFoundException, Exception {
+    public StoredCommit readCommit(String id) throws NotFoundException, Exception {
         StoredCommit commit = commits.get(id);
         if (commit != null) {
             return commit;
@@ -99,8 +93,7 @@ public class InMemPersistenceManager ext
         }
     }
 
-    @Override
-    protected String writeCommit(Commit commit) throws Exception {
+    public String writeCommit(Commit commit) throws Exception {
         ByteArrayOutputStream out = new ByteArrayOutputStream();
         commit.serialize(new BinaryBinding(out));
         byte[] bytes = out.toByteArray();
@@ -113,23 +106,7 @@ public class InMemPersistenceManager ext
         return id;
     }
 
-    @Override
-    protected String writeBlob(InputStream in) throws Exception {
-        return blobs.writeBlob(in);
-    }
-
-    @Override
-    protected int readBlob(String blobId, long pos, byte[] buff, int off, int length) throws NotFoundException, Exception {
-        return blobs.readBlob(blobId, pos, buff, off, length);
-    }
-
-    @Override
-    protected long blobLength(String blobId) throws NotFoundException, Exception {
-        return blobs.getBlobLength(blobId);
-    }
-
-    @Override
-    protected ChildNodeEntriesMap readCNEMap(String id) throws NotFoundException, Exception {
+    public ChildNodeEntriesMap readCNEMap(String id) throws NotFoundException, Exception {
         ChildNodeEntriesMap map = cneMaps.get(id);
         if (map != null) {
             return map;
@@ -138,8 +115,7 @@ public class InMemPersistenceManager ext
         }
     }
 
-    @Override
-    protected String writeCNEMap(ChildNodeEntriesMap map) throws Exception {
+    public String writeCNEMap(ChildNodeEntriesMap map) throws Exception {
         ByteArrayOutputStream out = new ByteArrayOutputStream();
         map.serialize(new BinaryBinding(out));
         byte[] bytes = out.toByteArray();
@@ -151,4 +127,22 @@ public class InMemPersistenceManager ext
 
         return id;
     }
+    
+    //------------------------------------------------------------< BlobStore >
+
+    public String addBlob(String tempFilePath) throws Exception {
+        return blobs.addBlob(tempFilePath);
+    }
+
+    public String writeBlob(InputStream in) throws Exception {
+        return blobs.writeBlob(in);
+    }
+
+    public int readBlob(String blobId, long pos, byte[] buff, int off, int length) throws NotFoundException, Exception {
+        return blobs.readBlob(blobId, pos, buff, off, length);
+    }
+
+    public long getBlobLength(String blobId) throws Exception {
+        return blobs.getBlobLength(blobId);
+    }
 }

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=1293282&r1=1293281&r2=1293282&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 Feb 24 15:03:23 2012
@@ -22,11 +22,13 @@ import java.io.File;
 import java.io.InputStream;
 import java.util.Iterator;
 
+import org.apache.jackrabbit.mk.blobs.BlobStore;
+import org.apache.jackrabbit.mk.fs.FilePath;
 import org.apache.jackrabbit.mk.model.ChildNodeEntriesMap;
 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.util.ExceptionFactory;
 import org.apache.jackrabbit.mk.util.IOUtils;
 import org.apache.jackrabbit.mk.util.StringUtils;
 import org.bson.types.ObjectId;
@@ -45,7 +47,7 @@ import com.mongodb.gridfs.GridFSInputFil
 /**
  *
  */
-public class MongoPersistenceManager extends AbstractPersistenceManager {
+public class MongoPersistenceManager implements PersistenceManager, BlobStore {
 
     private static final boolean BINARY_FORMAT = false;
 
@@ -63,8 +65,10 @@ public class MongoPersistenceManager ext
     private DBCollection cneMaps;
     private GridFS fs;
 
-    @Override
-    protected void doInitialize(File homeDir) throws Exception {
+    // TODO: make this configurable
+    private IdFactory idFactory = IdFactory.getDigestFactory();
+    
+    public void initialize(File homeDir) throws Exception {
         con = new Mongo();
         //con = new Mongo("localhost", 27017);
 
@@ -94,15 +98,13 @@ public class MongoPersistenceManager ext
         fs = new GridFS(db);
     }
 
-    @Override
-    protected void doClose() {
+    public void close() {
         con.close();
         con = null;
         db = null;
     }
 
-    @Override
-    protected String readHead() throws Exception {
+    public String readHead() throws Exception {
         DBObject entry = db.getCollection(HEAD_COLLECTION).findOne();
         if (entry == null) {
             return null;
@@ -110,14 +112,12 @@ public class MongoPersistenceManager ext
         return (String) entry.get(ID_FIELD);
     }
 
-    @Override
-    protected void writeHead(String id) throws Exception {
+    public void writeHead(String id) throws Exception {
         // capped collection of size 1
         db.getCollection(HEAD_COLLECTION).insert(new BasicDBObject(ID_FIELD, id));
     }
 
-    @Override
-    protected StoredNode readNode(String id) throws NotFoundException, Exception {
+    public Binding readNodeBinding(String id) throws NotFoundException, Exception {
         BasicDBObject key = new BasicDBObject();
         if (BINARY_FORMAT) {
             key.put(ID_FIELD, StringUtils.convertHexToBytes(id));
@@ -129,17 +129,16 @@ public class MongoPersistenceManager ext
             // todo support partitioned child node lists
             if (BINARY_FORMAT) {
                 byte[] bytes = (byte[]) nodeObject.get(DATA_FIELD);
-                return StoredNode.deserialize(id, this, new BinaryBinding(new ByteArrayInputStream(bytes)));
+                return new BinaryBinding(new ByteArrayInputStream(bytes));
             } else {
-                return StoredNode.deserialize(id, this, new DBObjectBinding(nodeObject));
+                return new DBObjectBinding(nodeObject);
             }
         } else {
             throw new NotFoundException(id);
         }
     }
-
-    @Override
-    protected String writeNode(Node node) throws Exception {
+    
+    public String writeNode(Node node) throws Exception {
         ByteArrayOutputStream out = new ByteArrayOutputStream();
         node.serialize(new BinaryBinding(out));
         byte[] bytes = out.toByteArray();
@@ -163,8 +162,7 @@ public class MongoPersistenceManager ext
         return id;
     }
 
-    @Override
-    protected StoredCommit readCommit(String id) throws NotFoundException, Exception {
+    public StoredCommit readCommit(String id) throws NotFoundException, Exception {
         BasicDBObject key = new BasicDBObject();
         if (BINARY_FORMAT) {
             key.put(ID_FIELD, StringUtils.convertHexToBytes(id));
@@ -184,8 +182,7 @@ public class MongoPersistenceManager ext
         }
     }
 
-    @Override
-    protected String writeCommit(Commit commit) throws Exception {
+    public String writeCommit(Commit commit) throws Exception {
         ByteArrayOutputStream out = new ByteArrayOutputStream();
         commit.serialize(new BinaryBinding(out));
         byte[] bytes = out.toByteArray();
@@ -208,43 +205,7 @@ public class MongoPersistenceManager ext
         return id;
     }
 
-    @Override
-    protected String writeBlob(InputStream in) throws Exception {
-        GridFSInputFile f = fs.createFile(in, true);
-        //f.save(0x20000);   // save in 128k chunks
-        f.save();
-
-        return f.getId().toString();
-    }
-
-    @Override
-    protected int readBlob(String blobId, long pos, byte[] buff, int off, int length) throws NotFoundException, Exception {
-        GridFSDBFile f = fs.findOne(new ObjectId(blobId));
-        if (f == null) {
-            throw new NotFoundException(blobId);
-        }
-        // todo provide a more efficient implementation
-        InputStream in = f.getInputStream();
-        try {
-            in.skip(pos);
-            return in.read(buff, off, length);
-        } finally {
-            IOUtils.closeQuietly(in);
-        }
-    }
-
-    @Override
-    protected long blobLength(String blobId) throws NotFoundException, Exception {
-        GridFSDBFile f = fs.findOne(new ObjectId(blobId));
-        if (f == null) {
-            throw new NotFoundException(blobId);
-        }
-
-        return f.getLength();
-    }
-
-    @Override
-    protected ChildNodeEntriesMap readCNEMap(String id) throws NotFoundException, Exception {
+    public ChildNodeEntriesMap readCNEMap(String id) throws NotFoundException, Exception {
         BasicDBObject key = new BasicDBObject();
         if (BINARY_FORMAT) {
             key.put(ID_FIELD, StringUtils.convertHexToBytes(id));
@@ -264,8 +225,7 @@ public class MongoPersistenceManager ext
         }
     }
 
-    @Override
-    protected String writeCNEMap(ChildNodeEntriesMap map) throws Exception {
+    public String writeCNEMap(ChildNodeEntriesMap map) throws Exception {
         ByteArrayOutputStream out = new ByteArrayOutputStream();
         map.serialize(new BinaryBinding(out));
         byte[] bytes = out.toByteArray();
@@ -288,6 +248,56 @@ public class MongoPersistenceManager ext
         return id;
     }
 
+    //------------------------------------------------------------< BlobStore >
+
+    public String addBlob(String tempFilePath) throws Exception {
+        try {
+            FilePath file = FilePath.get(tempFilePath);
+            try {
+                InputStream in = file.newInputStream();
+                return writeBlob(in);
+            } finally {
+                file.delete();
+            }
+        } catch (Exception e) {
+            throw ExceptionFactory.convert(e);
+        }
+    }
+
+    public String writeBlob(InputStream in) throws Exception {
+        GridFSInputFile f = fs.createFile(in, true);
+        //f.save(0x20000);   // save in 128k chunks
+        f.save();
+
+        return f.getId().toString();
+    }
+
+    public int readBlob(String blobId, long pos, byte[] buff, int off,
+            int length) throws Exception {
+
+        GridFSDBFile f = fs.findOne(new ObjectId(blobId));
+        if (f == null) {
+            throw new NotFoundException(blobId);
+        }
+        // todo provide a more efficient implementation
+        InputStream in = f.getInputStream();
+        try {
+            in.skip(pos);
+            return in.read(buff, off, length);
+        } finally {
+            IOUtils.closeQuietly(in);
+        }
+    }
+
+    public long getBlobLength(String blobId) throws Exception {
+        GridFSDBFile f = fs.findOne(new ObjectId(blobId));
+        if (f == null) {
+            throw new NotFoundException(blobId);
+        }
+
+        return f.getLength();
+    }
+    
     //-------------------------------------------------------< implementation >
 
     protected final static String ENCODED_DOT = "_x46_";

Added: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/PersistenceManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/PersistenceManager.java?rev=1293282&view=auto
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/PersistenceManager.java (added)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/PersistenceManager.java Fri Feb 24 15:03:23 2012
@@ -0,0 +1,54 @@
+/*
+ * 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.File;
+
+import org.apache.jackrabbit.mk.model.ChildNodeEntriesMap;
+import org.apache.jackrabbit.mk.model.Commit;
+import org.apache.jackrabbit.mk.model.Node;
+import org.apache.jackrabbit.mk.model.StoredCommit;
+
+/**
+ * Defines the methods exposed by a persistence manager, that stores head
+ * revision id, nodes, child node entries and blobs.
+ * 
+ * TODO: convert model type (e.g. Commit) arguments into byte arrays or similar
+ *       primitive types (such as in #readNodeBinding).
+ */
+public interface PersistenceManager {
+
+    void initialize(File homeDir) throws Exception;
+
+    void close();
+
+    String readHead() throws Exception;
+
+    void writeHead(String id) throws Exception;
+
+    Binding readNodeBinding(String id) throws NotFoundException, Exception;
+
+    String writeNode(Node node) throws Exception;
+
+    ChildNodeEntriesMap readCNEMap(String id) throws NotFoundException, Exception;
+
+    String writeCNEMap(ChildNodeEntriesMap map) throws Exception;
+
+    StoredCommit readCommit(String id) throws NotFoundException, Exception;
+
+    String writeCommit(Commit commit) throws Exception;
+}

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

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

Added: jackrabbit/sandbox/microkernel/wstest.html
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/wstest.html?rev=1293282&view=auto
==============================================================================
--- jackrabbit/sandbox/microkernel/wstest.html (added)
+++ jackrabbit/sandbox/microkernel/wstest.html Fri Feb 24 15:03:23 2012
@@ -0,0 +1,65 @@
+<!DOCTYPE html>
+<meta charset="utf-8" />
+<title>WebSocket Test</title>
+<script language="javascript" type="text/javascript">
+var wsUri = "ws://echo.websocket.org/"; 
+//wsUri = "ws://localhost:28080/"; 
+var output;  
+
+function init()
+{ 
+output = document.getElementById("output");
+testWebSocket();
+}
+
+function testWebSocket()
+{
+websocket = new WebSocket(wsUri);
+websocket.onopen = function(evt) { onOpen(evt) };
+websocket.onclose = function(evt) { onClose(evt) };
+websocket.onmessage = function(evt) { onMessage(evt) };
+websocket.onerror = function(evt) { onError(evt) };
+}
+
+function onOpen(evt)
+{
+writeToScreen("CONNECTED");
+doSend("WebSocket rocks");
+}
+
+function onClose(evt)
+{
+writeToScreen("DISCONNECTED");
+}
+
+function onMessage(evt)
+{
+writeToScreen('<span style="color: blue;">RESPONSE: ' + evt.data+'</span>');
+websocket.close();
+}
+
+function onError(evt)
+{
+writeToScreen('<span style="color: red;">ERROR:</span> ' + evt.data);
+}
+
+function doSend(message)
+{
+writeToScreen("SENT: " + message);
+websocket.send(message);
+}
+
+function writeToScreen(message)
+{
+var pre = document.createElement("p");
+pre.style.wordWrap = "break-word";
+pre.innerHTML = message;
+output.appendChild(pre);
+}
+
+window.addEventListener("load", init, false);
+</script>
+
+<h2>WebSocket Test</h2>
+<div id="output"></div>
+</html>

Propchange: jackrabbit/sandbox/microkernel/wstest.html
------------------------------------------------------------------------------
    svn:eol-style = native