You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by ju...@apache.org on 2012/09/17 14:54:06 UTC

svn commit: r1386591 [1/7] - in /jackrabbit/oak/trunk: ./ oak-mongomk-api/ oak-mongomk-api/src/ oak-mongomk-api/src/main/ oak-mongomk-api/src/main/java/ oak-mongomk-api/src/main/java/org/ oak-mongomk-api/src/main/java/org/apache/ oak-mongomk-api/src/ma...

Author: jukka
Date: Mon Sep 17 12:54:01 2012
New Revision: 1386591

URL: http://svn.apache.org/viewvc?rev=1386591&view=rev
Log:
OAK-293: MongoDB-based MicroKernel

Contributed by Philipp Marx.

Added:
    jackrabbit/oak/trunk/oak-mongomk/
    jackrabbit/oak/trunk/oak-mongomk-api/
    jackrabbit/oak/trunk/oak-mongomk-api/pom.xml   (with props)
    jackrabbit/oak/trunk/oak-mongomk-api/src/
    jackrabbit/oak/trunk/oak-mongomk-api/src/main/
    jackrabbit/oak/trunk/oak-mongomk-api/src/main/java/
    jackrabbit/oak/trunk/oak-mongomk-api/src/main/java/org/
    jackrabbit/oak/trunk/oak-mongomk-api/src/main/java/org/apache/
    jackrabbit/oak/trunk/oak-mongomk-api/src/main/java/org/apache/jackrabbit/
    jackrabbit/oak/trunk/oak-mongomk-api/src/main/java/org/apache/jackrabbit/mongomk/
    jackrabbit/oak/trunk/oak-mongomk-api/src/main/java/org/apache/jackrabbit/mongomk/api/
    jackrabbit/oak/trunk/oak-mongomk-api/src/main/java/org/apache/jackrabbit/mongomk/api/BlobStore.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk-api/src/main/java/org/apache/jackrabbit/mongomk/api/NodeStore.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk-api/src/main/java/org/apache/jackrabbit/mongomk/api/command/
    jackrabbit/oak/trunk/oak-mongomk-api/src/main/java/org/apache/jackrabbit/mongomk/api/command/AbstractCommand.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk-api/src/main/java/org/apache/jackrabbit/mongomk/api/command/Command.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk-api/src/main/java/org/apache/jackrabbit/mongomk/api/command/CommandExecutor.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk-api/src/main/java/org/apache/jackrabbit/mongomk/api/model/
    jackrabbit/oak/trunk/oak-mongomk-api/src/main/java/org/apache/jackrabbit/mongomk/api/model/Commit.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk-api/src/main/java/org/apache/jackrabbit/mongomk/api/model/Instruction.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk-api/src/main/java/org/apache/jackrabbit/mongomk/api/model/InstructionVisitor.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk-api/src/main/java/org/apache/jackrabbit/mongomk/api/model/Node.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk-impl/
    jackrabbit/oak/trunk/oak-mongomk-impl/pom.xml   (with props)
    jackrabbit/oak/trunk/oak-mongomk-impl/src/
    jackrabbit/oak/trunk/oak-mongomk-impl/src/main/
    jackrabbit/oak/trunk/oak-mongomk-impl/src/main/java/
    jackrabbit/oak/trunk/oak-mongomk-impl/src/main/java/org/
    jackrabbit/oak/trunk/oak-mongomk-impl/src/main/java/org/apache/
    jackrabbit/oak/trunk/oak-mongomk-impl/src/main/java/org/apache/jackrabbit/
    jackrabbit/oak/trunk/oak-mongomk-impl/src/main/java/org/apache/jackrabbit/mongomk/
    jackrabbit/oak/trunk/oak-mongomk-impl/src/main/java/org/apache/jackrabbit/mongomk/impl/
    jackrabbit/oak/trunk/oak-mongomk-impl/src/main/java/org/apache/jackrabbit/mongomk/impl/MongoMicroKernel.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk-impl/src/main/java/org/apache/jackrabbit/mongomk/impl/NodeFilter.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk-impl/src/main/java/org/apache/jackrabbit/mongomk/impl/builder/
    jackrabbit/oak/trunk/oak-mongomk-impl/src/main/java/org/apache/jackrabbit/mongomk/impl/builder/CommitBuilder.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk-impl/src/main/java/org/apache/jackrabbit/mongomk/impl/builder/NodeBuilder.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk-impl/src/main/java/org/apache/jackrabbit/mongomk/impl/command/
    jackrabbit/oak/trunk/oak-mongomk-impl/src/main/java/org/apache/jackrabbit/mongomk/impl/command/CommandExecutorImpl.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk-impl/src/main/java/org/apache/jackrabbit/mongomk/impl/json/
    jackrabbit/oak/trunk/oak-mongomk-impl/src/main/java/org/apache/jackrabbit/mongomk/impl/json/DefaultJsopHandler.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk-impl/src/main/java/org/apache/jackrabbit/mongomk/impl/json/JsonUtil.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk-impl/src/main/java/org/apache/jackrabbit/mongomk/impl/json/JsopParser.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk-impl/src/main/java/org/apache/jackrabbit/mongomk/impl/model/
    jackrabbit/oak/trunk/oak-mongomk-impl/src/main/java/org/apache/jackrabbit/mongomk/impl/model/AddNodeInstructionImpl.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk-impl/src/main/java/org/apache/jackrabbit/mongomk/impl/model/AddPropertyInstructionImpl.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk-impl/src/main/java/org/apache/jackrabbit/mongomk/impl/model/CommitImpl.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk-impl/src/main/java/org/apache/jackrabbit/mongomk/impl/model/CopyNodeInstructionImpl.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk-impl/src/main/java/org/apache/jackrabbit/mongomk/impl/model/MoveNodeInstructionImpl.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk-impl/src/main/java/org/apache/jackrabbit/mongomk/impl/model/NodeImpl.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk-impl/src/main/java/org/apache/jackrabbit/mongomk/impl/model/RemoveNodeInstructionImpl.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk-impl/src/main/java/org/apache/jackrabbit/mongomk/impl/model/SetPropertyInstructionImpl.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk-impl/src/test/
    jackrabbit/oak/trunk/oak-mongomk-impl/src/test/java/
    jackrabbit/oak/trunk/oak-mongomk-impl/src/test/java/org/
    jackrabbit/oak/trunk/oak-mongomk-impl/src/test/java/org/apache/
    jackrabbit/oak/trunk/oak-mongomk-impl/src/test/java/org/apache/jackrabbit/
    jackrabbit/oak/trunk/oak-mongomk-impl/src/test/java/org/apache/jackrabbit/mongomk/
    jackrabbit/oak/trunk/oak-mongomk-impl/src/test/java/org/apache/jackrabbit/mongomk/builder/
    jackrabbit/oak/trunk/oak-mongomk-impl/src/test/java/org/apache/jackrabbit/mongomk/builder/CommitBuilderImplTest.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk-impl/src/test/java/org/apache/jackrabbit/mongomk/builder/NodeBuilderTest.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk-impl/src/test/java/org/apache/jackrabbit/mongomk/impl/
    jackrabbit/oak/trunk/oak-mongomk-impl/src/test/java/org/apache/jackrabbit/mongomk/impl/InstructionAssert.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk-impl/src/test/java/org/apache/jackrabbit/mongomk/impl/NodeAssert.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk-impl/src/test/java/org/apache/jackrabbit/mongomk/impl/json/
    jackrabbit/oak/trunk/oak-mongomk-impl/src/test/java/org/apache/jackrabbit/mongomk/impl/json/JsopParserTest.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk-perf/
    jackrabbit/oak/trunk/oak-mongomk-perf/pom.xml   (with props)
    jackrabbit/oak/trunk/oak-mongomk-perf/src/
    jackrabbit/oak/trunk/oak-mongomk-perf/src/main/
    jackrabbit/oak/trunk/oak-mongomk-perf/src/main/java/
    jackrabbit/oak/trunk/oak-mongomk-perf/src/main/java/org/
    jackrabbit/oak/trunk/oak-mongomk-perf/src/main/java/org/apache/
    jackrabbit/oak/trunk/oak-mongomk-perf/src/main/java/org/apache/jackrabbit/
    jackrabbit/oak/trunk/oak-mongomk-perf/src/main/java/org/apache/jackrabbit/mongomk/
    jackrabbit/oak/trunk/oak-mongomk-perf/src/main/java/org/apache/jackrabbit/mongomk/perf/
    jackrabbit/oak/trunk/oak-mongomk-perf/src/main/java/org/apache/jackrabbit/mongomk/perf/BlobStoreFS.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk-perf/src/main/java/org/apache/jackrabbit/mongomk/perf/Config.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk-perf/src/main/java/org/apache/jackrabbit/mongomk/perf/MicroKernelPerf.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk-perf/src/main/java/org/apache/jackrabbit/mongomk/perf/MicroKernelPerfClient.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk-perf/src/main/java/org/apache/jackrabbit/mongomk/perf/MicroKernelPerfMaster.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk-perf/src/main/java/org/apache/jackrabbit/mongomk/perf/PrepareEnvironment.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk-perf/src/main/java/org/apache/jackrabbit/mongomk/perf/RandomJsopGenerator.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk-perf/src/main/java/org/apache/jackrabbit/mongomk/performance/
    jackrabbit/oak/trunk/oak-mongomk-perf/src/main/java/org/apache/jackrabbit/mongomk/performance/write/
    jackrabbit/oak/trunk/oak-mongomk-perf/src/main/java/org/apache/jackrabbit/mongomk/performance/write/MultipleMksWriteNodesTest.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk-perf/src/main/java/org/apache/jackrabbit/mongomk/performance/write/MultipleNodesTestBase.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk-perf/src/main/java/org/apache/jackrabbit/mongomk/performance/write/TestUtil.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk-perf/src/main/java/org/apache/jackrabbit/mongomk/performance/write/WriteNodesTest.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk-perf/src/main/resources/
    jackrabbit/oak/trunk/oak-mongomk-perf/src/main/resources/config.cfg
    jackrabbit/oak/trunk/oak-mongomk-perf/src/main/resources/log4j.cfg
    jackrabbit/oak/trunk/oak-mongomk-test/
    jackrabbit/oak/trunk/oak-mongomk-test/pom.xml   (with props)
    jackrabbit/oak/trunk/oak-mongomk-test/src/
    jackrabbit/oak/trunk/oak-mongomk-test/src/test/
    jackrabbit/oak/trunk/oak-mongomk-test/src/test/java/
    jackrabbit/oak/trunk/oak-mongomk-test/src/test/java/org/
    jackrabbit/oak/trunk/oak-mongomk-test/src/test/java/org/apache/
    jackrabbit/oak/trunk/oak-mongomk-test/src/test/java/org/apache/jackrabbit/
    jackrabbit/oak/trunk/oak-mongomk-test/src/test/java/org/apache/jackrabbit/mongomk/
    jackrabbit/oak/trunk/oak-mongomk-test/src/test/java/org/apache/jackrabbit/mongomk/test/
    jackrabbit/oak/trunk/oak-mongomk-test/src/test/java/org/apache/jackrabbit/mongomk/test/it/
    jackrabbit/oak/trunk/oak-mongomk-test/src/test/java/org/apache/jackrabbit/mongomk/test/it/MongoDataStoreIT.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk-test/src/test/java/org/apache/jackrabbit/mongomk/test/it/MongoEverythingIT.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk-test/src/test/java/org/apache/jackrabbit/mongomk/test/it/MongoMicroKernelFixture.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk-test/src/test/java/org/apache/jackrabbit/mongomk/test/it/MongoMicroKernelIT.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk-test/src/test/resources/
    jackrabbit/oak/trunk/oak-mongomk-test/src/test/resources/META-INF/
    jackrabbit/oak/trunk/oak-mongomk-test/src/test/resources/META-INF/services/
    jackrabbit/oak/trunk/oak-mongomk-test/src/test/resources/META-INF/services/org.apache.jackrabbit.mk.test.MicroKernelFixture
    jackrabbit/oak/trunk/oak-mongomk-test/src/test/resources/config.cfg
    jackrabbit/oak/trunk/oak-mongomk/pom.xml   (with props)
    jackrabbit/oak/trunk/oak-mongomk/src/
    jackrabbit/oak/trunk/oak-mongomk/src/main/
    jackrabbit/oak/trunk/oak-mongomk/src/main/java/
    jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/
    jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/
    jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/
    jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/
    jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/BlobStoreMongo.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/MongoConnection.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/NodeStoreMongo.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/command/
    jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/command/CommitCommandMongo.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/command/ConflictingCommitException.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/command/GetBlobLengthCommandMongo.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/command/GetHeadRevisionCommandMongo.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/command/GetNodesCommandMongo.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/command/NodeExistsCommandMongo.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/command/ReadBlobCommandMongo.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/command/WriteBlobCommandMongo.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/model/
    jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/model/CommitCommandInstructionVisitor.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/model/CommitMongo.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/model/HeadMongo.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/model/NodeMongo.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/
    jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/AbstractQuery.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/FetchHeadQuery.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/FetchHeadRevisionQuery.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/FetchNodeByPathQuery.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/FetchNodesByPathAndDepthQuery.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/FetchNodesForRevisionQuery.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/FetchValidCommitsQuery.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/FetchValidRevisionsQuery.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/QueryUtils.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/ReadAndIncHeadRevisionQuery.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/SaveAndSetHeadRevisionQuery.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/SaveCommitQuery.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/SaveNodesQuery.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/util/
    jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/util/MongoUtil.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk/src/test/
    jackrabbit/oak/trunk/oak-mongomk/src/test/java/
    jackrabbit/oak/trunk/oak-mongomk/src/test/java/com/
    jackrabbit/oak/trunk/oak-mongomk/src/test/java/com/mongodb/
    jackrabbit/oak/trunk/oak-mongomk/src/test/java/com/mongodb/DBCollection.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/
    jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/
    jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/
    jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/
    jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/BaseMongoTest.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/MongoAssert.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/command/
    jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/command/CommitCommandMongoTest.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/command/ConcurrentCommitCommandMongoTest.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/command/GetBlobLengthCommandMongoTest.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/command/GetHeadRevisionCommandMongoTest.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/command/GetNodesCommandMongoTest.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/command/NodeExistsCommandMongoTest.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/command/ReadBlobCommandMongoTest.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/command/WriteBlobCommandMongoTest.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/query/
    jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/query/FetchNodesByPathAndDepthQueryTest.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/query/FetchNodesForRevisionQueryTest.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/query/FetchValidCommitsQueryTest.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/scenario/
    jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/scenario/SimpleNodeScenario.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk/src/test/resources/
    jackrabbit/oak/trunk/oak-mongomk/src/test/resources/config.cfg
Modified:
    jackrabbit/oak/trunk/pom.xml

Added: jackrabbit/oak/trunk/oak-mongomk-api/pom.xml
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mongomk-api/pom.xml?rev=1386591&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-mongomk-api/pom.xml (added)
+++ jackrabbit/oak/trunk/oak-mongomk-api/pom.xml Mon Sep 17 12:54:01 2012
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+   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.
+  -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
+                             http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.jackrabbit</groupId>
+    <artifactId>oak-parent</artifactId>
+    <version>0.5-SNAPSHOT</version>
+  </parent>
+
+  <artifactId>oak-mongomk-api</artifactId>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.jackrabbit</groupId>
+      <artifactId>oak-mk</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+  </dependencies>
+
+</project>

Propchange: jackrabbit/oak/trunk/oak-mongomk-api/pom.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/oak/trunk/oak-mongomk-api/src/main/java/org/apache/jackrabbit/mongomk/api/BlobStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mongomk-api/src/main/java/org/apache/jackrabbit/mongomk/api/BlobStore.java?rev=1386591&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-mongomk-api/src/main/java/org/apache/jackrabbit/mongomk/api/BlobStore.java (added)
+++ jackrabbit/oak/trunk/oak-mongomk-api/src/main/java/org/apache/jackrabbit/mongomk/api/BlobStore.java Mon Sep 17 12:54:01 2012
@@ -0,0 +1,73 @@
+/*
+ * 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.mongomk.api;
+
+import java.io.InputStream;
+
+import org.apache.jackrabbit.mk.api.MicroKernel;
+
+/**
+ * The <code>BlobStore</code> interface deals with all blob related operations of the {@link MicroKernel}.
+ *
+ * <p>
+ * Since binary storage and node storage most likely use different backend technologies two separate interfaces for
+ * these operations are provided.
+ * </p>
+ *
+ * <p>
+ * This interface is not only a partly {@code MicroKernel} but also provides a different layer of abstraction by
+ * converting the {@link String} parameters into higher level objects to ease the development for implementors of the
+ * {@code MicroKernel}.
+ * </p>
+ *
+ * @see NodeStore
+ *
+ * @author <a href="mailto:pmarx@adobe.com>Philipp Marx</a>
+ */
+public interface BlobStore {
+
+    /**
+     * @see MicroKernel#getLength(String)
+     *
+     * @param blobId The id of the blob.
+     * @return The length in bytes.
+     * @throws Exception If an error occurred while getting the blob lenght.
+     */
+    long getBlobLength(String blobId) throws Exception;
+
+    /**
+     * @see MicroKernel#read(String, long, byte[], int, int)
+     *
+     * @param blobId The id of the blob.
+     * @param blobOffset The offset to read from.
+     * @param buffer The buffer to read the binary data into.
+     * @param bufferOffset The offset to read into the buffer.
+     * @param length The length of the data to read.
+     * @return The actual number of bytes which were read.
+     * @throws Exception If an error occurred while reading the blob data.
+     */
+    int readBlob(String blobId, long blobOffset, byte[] buffer, int bufferOffset, int length) throws Exception;
+
+    /**
+     * @see MicroKernel#write(InputStream)
+     *
+     * @param is The {@link InputStream} containing the data which should be written.
+     * @return The id of the blob.
+     * @throws Exception If an error occurred while writing the data.
+     */
+    String writeBlob(InputStream is) throws Exception;
+}

Propchange: jackrabbit/oak/trunk/oak-mongomk-api/src/main/java/org/apache/jackrabbit/mongomk/api/BlobStore.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/oak/trunk/oak-mongomk-api/src/main/java/org/apache/jackrabbit/mongomk/api/NodeStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mongomk-api/src/main/java/org/apache/jackrabbit/mongomk/api/NodeStore.java?rev=1386591&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-mongomk-api/src/main/java/org/apache/jackrabbit/mongomk/api/NodeStore.java (added)
+++ jackrabbit/oak/trunk/oak-mongomk-api/src/main/java/org/apache/jackrabbit/mongomk/api/NodeStore.java Mon Sep 17 12:54:01 2012
@@ -0,0 +1,118 @@
+/*
+ * 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.mongomk.api;
+
+import org.apache.jackrabbit.mk.api.MicroKernel;
+import org.apache.jackrabbit.mongomk.api.model.Commit;
+import org.apache.jackrabbit.mongomk.api.model.Node;
+
+/**
+ * The <code>NodeStore</code> interface deals with all node related operations of the {@link MicroKernel}.
+ *
+ * <p>
+ * Since binary storage and node storage most likely use different backend technologies two separate interfaces for
+ * these operations are provided.
+ * </p>
+ *
+ * <p>
+ * This interface is not only a partly {@code MicroKernel} but also provides a different layer of abstraction by
+ * converting the {@link String} parameters into higher level objects to ease the development for implementors of the
+ * {@code MicroKernel}.
+ * </p>
+ *
+ * @see BlobStore
+ *
+ * @author <a href="mailto:pmarx@adobe.com>Philipp Marx</a>
+ */
+public interface NodeStore {
+
+    /**
+     * @see MicroKernel#commit(String, String, String, String)
+     *
+     * @param commit The {@link Commit} object to store in the backend.
+     * @return The revision id of this commit.
+     * @throws Exception If an error occurred while committing.
+     */
+    String commit(Commit commit) throws Exception;
+
+    /**
+     * @see MicroKernel#getHeadRevision()
+     *
+     * @return The revision id of the head revision.
+     * @throws Exception If an error occurred while retrieving the head revision.
+     */
+    String getHeadRevision() throws Exception;
+
+    /**
+     * @see MicroKernel#getJournal(String, String, String)
+     *
+     * @param fromRevisionId id of first revision to be returned in journal
+     * @param toRevisionId id of last revision to be returned in journal,
+     * if {@code null} the current head revision is assumed
+     * @param path optional path filter; if {@code null} or {@code ""}
+     * the default ({@code "/"}) will be assumed, i.e. no filter will be applied
+     * @return a chronological list of revisions in JSON format
+     */
+    String getJournal(String fromRevisionId, String toRevisionId, String path);
+
+    /**
+     * @see MicroKernel#getRevisionHistory(long, int, String)
+     *
+     * @param since timestamp (ms) of earliest revision to be returned
+     * @param maxEntries maximum #entries to be returned; if < 0, no limit will be applied.
+     * @param path optional path filter; if {@code null} or {@code ""} the default
+     *  ({@code "/"}) will be assumed, i.e. no filter will be applied
+     * @return a list of revisions in chronological order in JSON format.
+     */
+    String getRevisionHistory(long since, int maxEntries, String path);
+
+    /**
+     * @see MicroKernel#getNodes(String, String, int, long, int, String)
+     *
+     * @param path The path of the root of nodes to retrieve.
+     * @param revisionId The revision id of the nodes or {@code null} if the latest head revision
+     * should be retrieved.
+     * @param depth The maximum depth of the retrieved node tree or -1 to retrieve all nodes.
+     * @param offset The offset of the child list to retrieve.
+     * @param maxChildNodes The count of children to retrieve or -1 to retrieve all children.
+     * @param filter An optional filter for the retrieved nodes.
+     * @return The {@link Node} of the root node.
+     * @throws Exception If an error occurred while retrieving the nodes.
+     */
+    Node getNodes(String path, String revisionId, int depth, long offset, int maxChildNodes,
+            String filter) throws Exception;
+
+    /**
+     * @see MicroKernel#nodeExists(String, String)
+     *
+     * @param path The path of the node to test.
+     * @param revisionId The revision id of the node or {@code null} for the head revision.
+     * @return {@code true} if the node for the specific revision exists else {@code false}.
+     * @throws Exception If an error occurred while testing the node.
+     */
+    boolean nodeExists(String path, String revisionId) throws Exception;
+
+    /**
+     * @see MicroKernel#waitForCommit(String, long)
+     *
+     * @param oldHeadRevisionId id of earlier head revision
+     * @param timeout the maximum time to wait in milliseconds
+     * @return the id of the head revision
+     * @throws InterruptedException if the thread was interrupted
+     */
+    String waitForCommit(String oldHeadRevisionId, long timeout) throws InterruptedException;
+}
\ No newline at end of file

Propchange: jackrabbit/oak/trunk/oak-mongomk-api/src/main/java/org/apache/jackrabbit/mongomk/api/NodeStore.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/oak/trunk/oak-mongomk-api/src/main/java/org/apache/jackrabbit/mongomk/api/command/AbstractCommand.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mongomk-api/src/main/java/org/apache/jackrabbit/mongomk/api/command/AbstractCommand.java?rev=1386591&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-mongomk-api/src/main/java/org/apache/jackrabbit/mongomk/api/command/AbstractCommand.java (added)
+++ jackrabbit/oak/trunk/oak-mongomk-api/src/main/java/org/apache/jackrabbit/mongomk/api/command/AbstractCommand.java Mon Sep 17 12:54:01 2012
@@ -0,0 +1,42 @@
+/*
+ * 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.mongomk.api.command;
+
+/**
+ * Base implementation of {@link Command}.
+ *
+ * @param <T> The result type of the {@code Command}.
+ *
+ * @author <a href="mailto:pmarx@adobe.com>Philipp Marx</a>
+ */
+public abstract class AbstractCommand<T> implements Command<T> {
+
+    @Override
+    public int getNumOfRetries() {
+        return 0;
+    }
+
+    @Override
+    public boolean needsRetry(Exception e) {
+        return false;
+    }
+
+    @Override
+    public boolean needsRetry(T result) {
+        return false;
+    }
+}

Propchange: jackrabbit/oak/trunk/oak-mongomk-api/src/main/java/org/apache/jackrabbit/mongomk/api/command/AbstractCommand.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/oak/trunk/oak-mongomk-api/src/main/java/org/apache/jackrabbit/mongomk/api/command/Command.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mongomk-api/src/main/java/org/apache/jackrabbit/mongomk/api/command/Command.java?rev=1386591&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-mongomk-api/src/main/java/org/apache/jackrabbit/mongomk/api/command/Command.java (added)
+++ jackrabbit/oak/trunk/oak-mongomk-api/src/main/java/org/apache/jackrabbit/mongomk/api/command/Command.java Mon Sep 17 12:54:01 2012
@@ -0,0 +1,92 @@
+/*
+ * 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.mongomk.api.command;
+
+import org.apache.jackrabbit.mk.api.MicroKernel;
+
+/**
+ * The {@code Command} framework provides an way to encapsulate specific actions of the {@link MicroKernel}.
+ *
+ * <p>
+ * It adds some functionality for retries and other non business logic related actions (i.e. logging, performance
+ * tracking, etc).
+ * </p>
+ *
+ * @see <a href="http://en.wikipedia.org/wiki/Command_pattern">Command Pattern</a>
+ * @see CommandExecutor
+ *
+ * @param <T>
+ *            The result type of the {@code Command}.
+ *
+ * @author <a href="mailto:pmarx@adobe.com>Philipp Marx</a>
+ */
+public interface Command<T> {
+
+    // TODO Add postExecute and preExecute; Maybe add AOP but only if Granite moves to OSGi 4.3
+
+    /**
+     * Executes the {@code Command} and returns its result.
+     *
+     * @return The result.
+     * @throws Exception
+     *             If an error occurred while executing.
+     */
+    T execute() throws Exception;
+
+    /**
+     * Returns the number of retries this {@code Command} should be retried in case of an error or false result.
+     *
+     * <p>
+     * The number of reties is evaluated in the following way:
+     * <li>n < 0: Unlimited retries</li>
+     * <li>n = 0: No retries (just one execution)</li>
+     * <li>n > 0: Corresponding number of retries</li>
+     * </p>
+     *
+     * <p>
+     * In order to determine whether the {@code Command} should be retired on of {@link #needsRetry(Exception)} or
+     * {@link #needsRetry(Object)} will be called.
+     * </p>
+     *
+     * @see #needsRetry(Exception)
+     * @see #needsRetry(Object)
+     *
+     * @return The number of retries.
+     */
+    int getNumOfRetries();
+
+    /**
+     * Will be called in case of an {@link Exception} during the execution and a given number of retries which has not
+     * exceeded.
+     *
+     * @param e The Exception which was thrown.
+     * @return {@code true} if a retry should be performed, else {@code false}.
+     */
+    boolean needsRetry(Exception e);
+
+    /**
+     * Will be called in case of a successful execution and a given number of retries which has not exceeded.
+     *
+     * <p>
+     * This gives the implementor a chance to retry a false result.
+     * </p>
+     *
+     * @param result The result of the execution.
+     * @return {@code true} if a retry should be performed, else {@code false}.
+     */
+    boolean needsRetry(T result);
+}
\ No newline at end of file

Propchange: jackrabbit/oak/trunk/oak-mongomk-api/src/main/java/org/apache/jackrabbit/mongomk/api/command/Command.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/oak/trunk/oak-mongomk-api/src/main/java/org/apache/jackrabbit/mongomk/api/command/CommandExecutor.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mongomk-api/src/main/java/org/apache/jackrabbit/mongomk/api/command/CommandExecutor.java?rev=1386591&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-mongomk-api/src/main/java/org/apache/jackrabbit/mongomk/api/command/CommandExecutor.java (added)
+++ jackrabbit/oak/trunk/oak-mongomk-api/src/main/java/org/apache/jackrabbit/mongomk/api/command/CommandExecutor.java Mon Sep 17 12:54:01 2012
@@ -0,0 +1,45 @@
+/*
+ * 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.mongomk.api.command;
+
+/**
+ * The executor part of the <a href="http://en.wikipedia.org/wiki/Command_pattern">Command Pattern</a>.
+ *
+ * <p>
+ * The implementation of this class contains the business logic to execute a command.
+ * </p>
+ *
+ * @see <a href="http://en.wikipedia.org/wiki/Command_pattern">Command Pattern</a>
+ * @see Command
+ *
+ * @author <a href="mailto:pmarx@adobe.com>Philipp Marx</a>
+ */
+public interface CommandExecutor {
+
+    /**
+     * Executes the given {@link Command} and returns the result.
+     *
+     * <p>
+     * If an retry behavior is specified this will be taken care of by the implementation as well.
+     * </p>
+     *
+     * @param command
+     * @return The result of the execution.
+     * @throws Exception If an error occurred while executing.
+     */
+    <T> T execute(Command<T> command) throws Exception;
+}

Propchange: jackrabbit/oak/trunk/oak-mongomk-api/src/main/java/org/apache/jackrabbit/mongomk/api/command/CommandExecutor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/oak/trunk/oak-mongomk-api/src/main/java/org/apache/jackrabbit/mongomk/api/model/Commit.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mongomk-api/src/main/java/org/apache/jackrabbit/mongomk/api/model/Commit.java?rev=1386591&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-mongomk-api/src/main/java/org/apache/jackrabbit/mongomk/api/model/Commit.java (added)
+++ jackrabbit/oak/trunk/oak-mongomk-api/src/main/java/org/apache/jackrabbit/mongomk/api/model/Commit.java Mon Sep 17 12:54:01 2012
@@ -0,0 +1,84 @@
+/*
+ * 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.mongomk.api.model;
+
+import java.util.List;
+
+/**
+ * A higher level object representing a commit.
+ *
+ * @author <a href="mailto:pmarx@adobe.com>Philipp Marx</a>
+ */
+public interface Commit {
+
+    /**
+     * Returns the <a href="http://wiki.apache.org/jackrabbit/Jsop">JSOP</a> diff of this commit.
+     *
+     * @return The {@link String} representing the diff.
+     */
+    String getDiff();
+
+    /**
+     * Returns the {@link List} of {@link Instruction}s which were created from the diff.
+     *
+     * @see #getDiff()
+     *
+     * @return The {@link List} of {@link Instruction}s.
+     */
+    List<Instruction> getInstructions();
+
+    /**
+     * Returns the message of the commit.
+     *
+     * @return The message.
+     */
+    String getMessage();
+
+    /**
+     * Returns the path of the root node of this commit.
+     *
+     * @return The path of the root node.
+     */
+    String getPath();
+
+    /**
+     * Returns the revision id of this commit if known already, else this will return {@code null}. The revision
+     * id will be determined only after the commit has been successfully performed.
+     *
+     * @see #setRevisionId(String)
+     *
+     * @return The revision id of this commit or {@code null}.
+     */
+    String getRevisionId();
+
+    /**
+     * Sets the revision id of this commit.
+     *
+     * @see #getRevisionId()
+     *
+     * @param revisionId The revision id to set.
+     */
+    void setRevisionId(String revisionId);
+
+
+    /**
+     * Returns the timestamp of this commit.
+     *
+     * @return The timestamp of this commit.
+     */
+    long getTimestamp();
+}

Propchange: jackrabbit/oak/trunk/oak-mongomk-api/src/main/java/org/apache/jackrabbit/mongomk/api/model/Commit.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/oak/trunk/oak-mongomk-api/src/main/java/org/apache/jackrabbit/mongomk/api/model/Instruction.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mongomk-api/src/main/java/org/apache/jackrabbit/mongomk/api/model/Instruction.java?rev=1386591&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-mongomk-api/src/main/java/org/apache/jackrabbit/mongomk/api/model/Instruction.java (added)
+++ jackrabbit/oak/trunk/oak-mongomk-api/src/main/java/org/apache/jackrabbit/mongomk/api/model/Instruction.java Mon Sep 17 12:54:01 2012
@@ -0,0 +1,143 @@
+/*
+ * 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.mongomk.api.model;
+
+/**
+ * An {@code Instruction} is an abstraction of a single <a href="http://wiki.apache.org/jackrabbit/Jsop">JSOP</a>
+ * operation.
+ *
+ * <p>
+ * Each operation is a concrete subinterface of {@code Instruction} and extending it by the specific properties of the
+ * operation. There is no exact 1 : 1 mapping between a {@code JSOP} operation and a subinterface, i.e. in {@code JSOP}
+ * there is one add operation for adding nodes and properties whereas there are two specific subinterfaces; one for
+ * adding a node and one for adding a property.
+ * </p>
+ *
+ * @author <a href="mailto:pmarx@adobe.com>Philipp Marx</a>
+ */
+public interface Instruction {
+
+    /**
+     * Accepts an {@code InstructionVisitor}.
+     *
+     * @param visitor The visitor.
+     */
+    void accept(InstructionVisitor visitor);
+
+    /**
+     * Returns the path of this {@code Instruction}.
+     *
+     * <p>
+     * The semantics of this property differ depending on the concrete subinterface.
+     * </p>
+     *
+     * @return The path.
+     */
+    String getPath();
+
+    /**
+     * The add node operation => "+" STRING ":" (OBJECT).
+     */
+    public interface AddNodeInstruction extends Instruction {
+    }
+
+    /**
+     * The add property operation => "+" STRING ":" (ATOM | ARRAY)
+     */
+    public interface AddPropertyInstruction extends Instruction {
+
+        /**
+         * Returns the key of the property to add.
+         *
+         * @return The key.
+         */
+        String getKey();
+
+        /**
+         * Returns the value of the property to add.
+         *
+         * @return The value.
+         */
+        Object getValue();
+    }
+
+    /**
+     * The copy node operation => "*" STRING ":" STRING
+     */
+    public interface CopyNodeInstruction extends Instruction {
+
+        /**
+         * Returns the destination path.
+         *
+         * @return the destination path.
+         */
+        String getDestPath();
+
+        /**
+         * Returns the source path.
+         *
+         * @return the source path.
+         */
+        String getSourcePath();
+    }
+
+    /**
+     * The move node operation => ">" STRING ":" STRING
+     */
+    public interface MoveNodeInstruction extends Instruction {
+
+        /**
+         * Returns the destination path.
+         *
+         * @return the destination path.
+         */
+        String getDestPath();
+
+        /**
+         * Returns the source path.
+         *
+         * @return the source path.
+         */
+        String getSourcePath();
+    }
+
+    /**
+     * The remove node operation => "-" STRING
+     */
+    public interface RemoveNodeInstruction extends Instruction {
+    }
+
+    /**
+     * The set property operation => "^" STRING ":" ATOM | ARRAY
+     */
+    public interface SetPropertyInstruction extends Instruction {
+
+        /**
+         * Returns the key of the property to set.
+         *
+         * @return The key.
+         */
+        String getKey();
+
+        /**
+         * Returns the value of the property to set.
+         *
+         * @return The value.
+         */
+        Object getValue();
+    }
+}
\ No newline at end of file

Propchange: jackrabbit/oak/trunk/oak-mongomk-api/src/main/java/org/apache/jackrabbit/mongomk/api/model/Instruction.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/oak/trunk/oak-mongomk-api/src/main/java/org/apache/jackrabbit/mongomk/api/model/InstructionVisitor.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mongomk-api/src/main/java/org/apache/jackrabbit/mongomk/api/model/InstructionVisitor.java?rev=1386591&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-mongomk-api/src/main/java/org/apache/jackrabbit/mongomk/api/model/InstructionVisitor.java (added)
+++ jackrabbit/oak/trunk/oak-mongomk-api/src/main/java/org/apache/jackrabbit/mongomk/api/model/InstructionVisitor.java Mon Sep 17 12:54:01 2012
@@ -0,0 +1,74 @@
+/*
+ * 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.mongomk.api.model;
+
+import org.apache.jackrabbit.mongomk.api.model.Instruction.AddNodeInstruction;
+import org.apache.jackrabbit.mongomk.api.model.Instruction.AddPropertyInstruction;
+import org.apache.jackrabbit.mongomk.api.model.Instruction.CopyNodeInstruction;
+import org.apache.jackrabbit.mongomk.api.model.Instruction.MoveNodeInstruction;
+import org.apache.jackrabbit.mongomk.api.model.Instruction.RemoveNodeInstruction;
+import org.apache.jackrabbit.mongomk.api.model.Instruction.SetPropertyInstruction;
+
+/**
+ * A <a href="http://en.wikipedia.org/wiki/Visitor_pattern">Visitor</a> to iterate through a list of
+ * {@code Instruction}s without the need to use {@code instanceof} on each item.
+ */
+public interface InstructionVisitor {
+
+    /**
+     * Visits a {@code AddNodeInstruction}.
+     *
+     * @param instruction
+     *            The instruction.
+     */
+    void visit(AddNodeInstruction instruction);
+
+    /**
+     * Visits a {@code AddPropertyInstruction}.
+     *
+     * @param instruction The instruction.
+     */
+    void visit(AddPropertyInstruction instruction);
+
+    /**
+     * Visits a {@code CopyNodeInstruction}.
+     *
+     * @param instruction The instruction.
+     */
+    void visit(CopyNodeInstruction instruction);
+
+    /**
+     * Visits a {@code MoveNodeInstruction}.
+     *
+     * @param instruction The instruction.
+     */
+    void visit(MoveNodeInstruction instruction);
+
+    /**
+     * Visits a {@code RemoveNodeInstruction}.
+     *
+     * @param instruction The instruction.
+     */
+    void visit(RemoveNodeInstruction instruction);
+
+    /**
+     * Visits a {@code SetPropertyInstruction}.
+     *
+     * @param instruction The instruction.
+     */
+    void visit(SetPropertyInstruction instruction);
+}
\ No newline at end of file

Propchange: jackrabbit/oak/trunk/oak-mongomk-api/src/main/java/org/apache/jackrabbit/mongomk/api/model/InstructionVisitor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/oak/trunk/oak-mongomk-api/src/main/java/org/apache/jackrabbit/mongomk/api/model/Node.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mongomk-api/src/main/java/org/apache/jackrabbit/mongomk/api/model/Node.java?rev=1386591&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-mongomk-api/src/main/java/org/apache/jackrabbit/mongomk/api/model/Node.java (added)
+++ jackrabbit/oak/trunk/oak-mongomk-api/src/main/java/org/apache/jackrabbit/mongomk/api/model/Node.java Mon Sep 17 12:54:01 2012
@@ -0,0 +1,100 @@
+/*
+ * 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.mongomk.api.model;
+
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * A higher level object representing a node.
+ *
+ * @author <a href="mailto:pmarx@adobe.com>Philipp Marx</a>
+ */
+public interface Node {
+
+    /**
+     * Returns the total number of children of this node.
+     *
+     * <p>
+     * <strong>This is not necessarily equal to the number of children returned by {@link #getChildren()} since this
+     * {@code Node} might be created with only a subset of children.</strong>
+     * </p>
+     *
+     * @return The total number of children.
+     */
+    long getChildCount();
+
+    /**
+     * Returns the children this {@code Node} was created with.
+     *
+     * @return The children.
+     */
+    Set<Node> getChildren(); // TODO Replace Set with Collection
+
+    // TODO - [Mete] Document.
+    Iterator<Node> getChildEntries(int offset, int count);
+
+    /**
+     * Returns the descendants (children, children of the children, etc) this {@code Node} was created with.
+     *
+     * @param includeThis Flag indicating whether this {@code Node} should be included in the list.
+     * @return The descendants.
+     */
+    Set<Node> getDescendants(boolean includeThis);
+
+    /**
+     * Returns the name of this {@code Node}.
+     *
+     * @return The name.
+     */
+    String getName();
+
+    /**
+     * Returns the path of this {@code Node}.
+     *
+     * @return The path.
+     */
+    String getPath();
+
+    /**
+     * Returns the properties this {@code Node} was created with.
+     *
+     * @return The properties.
+     */
+    Map<String, Object> getProperties();
+
+    /**
+     * Returns the revision id of this node if known already, else this will return {@code null}. The revision id
+     * will be determined only after the commit has been successfully performed or the node has been read as part of an
+     * existing revision.
+     *
+     * @see #setRevisionId(String)
+     *
+     * @return The revision id of this commit or {@code null}.
+     */
+    String getRevisionId();
+
+    /**
+     * Sets the revision id of this node.
+     *
+     * @see #getRevisionId()
+     *
+     * @param revisionId The revision id to set.
+     */
+    void setRevisionId(String revisionId);
+}

Propchange: jackrabbit/oak/trunk/oak-mongomk-api/src/main/java/org/apache/jackrabbit/mongomk/api/model/Node.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/oak/trunk/oak-mongomk-impl/pom.xml
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mongomk-impl/pom.xml?rev=1386591&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-mongomk-impl/pom.xml (added)
+++ jackrabbit/oak/trunk/oak-mongomk-impl/pom.xml Mon Sep 17 12:54:01 2012
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+   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.
+  -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
+                             http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.jackrabbit</groupId>
+    <artifactId>oak-parent</artifactId>
+    <version>0.5-SNAPSHOT</version>
+  </parent>
+
+  <artifactId>oak-mongomk-impl</artifactId>
+
+  <dependencies>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.jackrabbit</groupId>
+      <artifactId>oak-mk</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.json</groupId>
+      <artifactId>json</artifactId>
+      <version>20090211</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.jackrabbit</groupId>
+      <artifactId>oak-mongomk-api</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+  </dependencies>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-jar-plugin</artifactId>
+        <executions>
+          <execution>
+            <goals>
+              <goal>test-jar</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+</project>

Propchange: jackrabbit/oak/trunk/oak-mongomk-impl/pom.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/oak/trunk/oak-mongomk-impl/src/main/java/org/apache/jackrabbit/mongomk/impl/MongoMicroKernel.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mongomk-impl/src/main/java/org/apache/jackrabbit/mongomk/impl/MongoMicroKernel.java?rev=1386591&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-mongomk-impl/src/main/java/org/apache/jackrabbit/mongomk/impl/MongoMicroKernel.java (added)
+++ jackrabbit/oak/trunk/oak-mongomk-impl/src/main/java/org/apache/jackrabbit/mongomk/impl/MongoMicroKernel.java Mon Sep 17 12:54:01 2012
@@ -0,0 +1,213 @@
+/*
+ * 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.mongomk.impl;
+
+import java.io.InputStream;
+
+import org.apache.jackrabbit.mk.api.MicroKernel;
+import org.apache.jackrabbit.mk.api.MicroKernelException;
+import org.apache.jackrabbit.mongomk.api.BlobStore;
+import org.apache.jackrabbit.mongomk.api.NodeStore;
+import org.apache.jackrabbit.mongomk.api.model.Commit;
+import org.apache.jackrabbit.mongomk.api.model.Node;
+import org.apache.jackrabbit.mongomk.impl.builder.CommitBuilder;
+import org.apache.jackrabbit.mongomk.impl.json.JsonUtil;
+
+/**
+ * The {@code MongoDB} implementation of the {@link MicroKernel}.
+ *
+ * <p>
+ * This class will transform and delegate to instances of {@link NodeStore} and {@link BlobStore}.
+ * </p>
+ *
+ * @author <a href="mailto:pmarx@adobe.com>Philipp Marx</a>
+ */
+public class MongoMicroKernel implements MicroKernel {
+
+    private final BlobStore blobStore;
+    private final NodeStore nodeStore;
+
+    /**
+     * Constructs a new {@code MongoMicroKernel}.
+     *
+     * @param nodeStore The {@link NodeStore}.
+     * @param blobStore The {@link BlobStore}.
+     */
+    public MongoMicroKernel(NodeStore nodeStore, BlobStore blobStore) {
+        this.nodeStore = nodeStore;
+        this.blobStore = blobStore;
+    }
+
+    @Override
+    public String branch(String trunkRevisionId) throws MicroKernelException {
+        throw new UnsupportedOperationException("Branch is currently not supported.");
+    }
+
+    @Override
+    public String commit(String path, String jsonDiff, String revisionId, String message) throws MicroKernelException {
+        String newRevisionId = null;
+
+        try {
+            Commit commit = CommitBuilder.build(path, jsonDiff, message);
+            newRevisionId = nodeStore.commit(commit);
+        } catch (Exception e) {
+            throw new MicroKernelException(e);
+        }
+
+        return newRevisionId;
+    }
+
+    @Override
+    public String diff(String fromRevisionId, String toRevisionId, String filter,
+            int depth) throws MicroKernelException {
+        throw new UnsupportedOperationException("Diff is currently not supported.");
+    }
+
+    @Override
+    public long getChildNodeCount(String path, String revisionId) throws MicroKernelException {
+        long childNodeCount = 0L;
+
+        try {
+            String revId = null;
+            if (revisionId != null) {
+                revId = new String(revisionId);
+            }
+            Node rootOfPath = nodeStore.getNodes(path, revId, 0, 0, -1, null);
+            if (rootOfPath != null) {
+                childNodeCount = rootOfPath.getChildCount();
+            }
+        } catch (Exception e) {
+            throw new MicroKernelException(e);
+        }
+
+        return childNodeCount;
+    }
+
+    @Override
+    public String getHeadRevision() throws MicroKernelException {
+        String headRevisionId = null;
+
+        try {
+            headRevisionId = nodeStore.getHeadRevision();
+        } catch (Exception e) {
+            throw new MicroKernelException(e);
+        }
+
+        return headRevisionId;
+    }
+
+    @Override
+    public String getJournal(String fromRevisionId, String toRevisionId,
+            String path) throws MicroKernelException {
+        return nodeStore.getJournal(fromRevisionId, toRevisionId, path);
+    }
+
+    @Override
+    public long getLength(String blobId) throws MicroKernelException {
+        long length = -1;
+
+        try {
+            length = blobStore.getBlobLength(blobId);
+        } catch (Exception e) {
+            throw new MicroKernelException(e);
+        }
+
+        return length;
+    }
+
+    @Override
+    public String getNodes(String path, String revisionId, int depth, long offset,
+            int maxChildNodes, String filter) throws MicroKernelException {
+
+        NodeFilter nodeFilter = filter == null || filter.isEmpty() ? null : NodeFilter.parse(filter);
+        if (offset > 0 && nodeFilter != null && nodeFilter.getChildNodeFilter() != null) {
+            // Both an offset > 0 and a filter on node names have been specified...
+            throw new IllegalArgumentException("offset > 0 with child node filter");
+        }
+
+        try {
+            // FIXME [Mete] Should filter, offset, and maxChildNodes be handled in Mongo instead?
+            Node rootNode = nodeStore.getNodes(path, revisionId, depth, offset, maxChildNodes, filter);
+            if (rootNode == null) {
+                return null;
+            }
+            return JsonUtil.convertToJson(rootNode, depth, (int)offset, maxChildNodes, true, nodeFilter);
+        } catch (Exception e) {
+            throw new MicroKernelException(e);
+        }
+    }
+
+    @Override
+    public String getRevisionHistory(long since, int maxEntries, String path) throws MicroKernelException {
+        return nodeStore.getRevisionHistory(since, maxEntries, path);
+    }
+
+    @Override
+    public String merge(String branchRevisionId, String message) throws MicroKernelException {
+        throw new UnsupportedOperationException("Merge is currently not supported.");
+    }
+
+    @Override
+    public boolean nodeExists(String path, String revisionId) throws MicroKernelException {
+        boolean exists = false;
+
+        try {
+            String revId = null;
+            if (revisionId != null) {
+                revId = new String(revisionId);
+            }
+
+            exists = nodeStore.nodeExists(path, revId);
+        } catch (Exception e) {
+            throw new MicroKernelException(e);
+        }
+
+        return exists;
+    }
+
+    @Override
+    public int read(String blobId, long pos, byte[] buff, int off, int length) throws MicroKernelException {
+        int totalBytes = -1;
+
+        try {
+            totalBytes = blobStore.readBlob(blobId, pos, buff, off, length);
+        } catch (Exception e) {
+            throw new MicroKernelException(e);
+        }
+
+        return totalBytes;
+    }
+
+    @Override
+    public String waitForCommit(String oldHeadRevisionId, long timeout) throws MicroKernelException,
+            InterruptedException {
+        return nodeStore.waitForCommit(oldHeadRevisionId, timeout);
+    }
+
+    @Override
+    public String write(InputStream in) throws MicroKernelException {
+        String blobId = null;
+
+        try {
+            blobId = blobStore.writeBlob(in);
+        } catch (Exception e) {
+            throw new MicroKernelException(e);
+        }
+
+        return blobId;
+    }
+}
\ No newline at end of file

Propchange: jackrabbit/oak/trunk/oak-mongomk-impl/src/main/java/org/apache/jackrabbit/mongomk/impl/MongoMicroKernel.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/oak/trunk/oak-mongomk-impl/src/main/java/org/apache/jackrabbit/mongomk/impl/NodeFilter.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mongomk-impl/src/main/java/org/apache/jackrabbit/mongomk/impl/NodeFilter.java?rev=1386591&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-mongomk-impl/src/main/java/org/apache/jackrabbit/mongomk/impl/NodeFilter.java (added)
+++ jackrabbit/oak/trunk/oak-mongomk-impl/src/main/java/org/apache/jackrabbit/mongomk/impl/NodeFilter.java Mon Sep 17 12:54:01 2012
@@ -0,0 +1,88 @@
+/*
+ * 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.mongomk.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.jackrabbit.mk.json.JsopTokenizer;
+import org.apache.jackrabbit.mk.util.NameFilter;
+
+/**
+ * FIXME [Mete] Stolen from OAK. Should go away at some point when MongoMK becomes
+ * part of OAK.
+ */
+public class NodeFilter {
+
+    NameFilter nodeFilter;
+    NameFilter propFilter;
+
+    private NodeFilter(NameFilter nodeFilter, NameFilter propFilter) {
+        this.nodeFilter = nodeFilter;
+        this.propFilter = propFilter;
+    }
+
+    static NodeFilter parse(String json) {
+        // parse json format filter
+        JsopTokenizer t = new JsopTokenizer(json);
+        t.read('{');
+
+        NameFilter nodeFilter = null, propFilter = null;
+
+        do {
+            String type = t.readString();
+            t.read(':');
+            String[] globs = parseArray(t);
+            if (type.equals("nodes")) {
+                nodeFilter = new NameFilter(globs);
+            } else if (type.equals("properties")) {
+                propFilter = new NameFilter(globs);
+            } else {
+                throw new IllegalArgumentException("illegal filter format");
+            }
+        } while (t.matches(','));
+        t.read('}');
+
+        return new NodeFilter(nodeFilter, propFilter);
+    }
+
+    private static String[] parseArray(JsopTokenizer t) {
+        List<String> l = new ArrayList<String>();
+        t.read('[');
+        do {
+            l.add(t.readString());
+        } while (t.matches(','));
+        t.read(']');
+        return l.toArray(new String[l.size()]);
+    }
+
+    NameFilter getChildNodeFilter() {
+        return nodeFilter;
+    }
+
+    NameFilter getPropertyFilter() {
+        return propFilter;
+    }
+
+    boolean includeNode(String name) {
+        return nodeFilter == null || nodeFilter.matches(name);
+    }
+
+    public boolean includeProperty(String name) {
+        return propFilter == null || propFilter.matches(name);
+    }
+}
\ No newline at end of file

Propchange: jackrabbit/oak/trunk/oak-mongomk-impl/src/main/java/org/apache/jackrabbit/mongomk/impl/NodeFilter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/oak/trunk/oak-mongomk-impl/src/main/java/org/apache/jackrabbit/mongomk/impl/builder/CommitBuilder.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mongomk-impl/src/main/java/org/apache/jackrabbit/mongomk/impl/builder/CommitBuilder.java?rev=1386591&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-mongomk-impl/src/main/java/org/apache/jackrabbit/mongomk/impl/builder/CommitBuilder.java (added)
+++ jackrabbit/oak/trunk/oak-mongomk-impl/src/main/java/org/apache/jackrabbit/mongomk/impl/builder/CommitBuilder.java Mon Sep 17 12:54:01 2012
@@ -0,0 +1,114 @@
+/*
+ * 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.mongomk.impl.builder;
+
+import org.apache.jackrabbit.mongomk.api.model.Commit;
+import org.apache.jackrabbit.mongomk.api.model.Instruction.AddNodeInstruction;
+import org.apache.jackrabbit.mongomk.api.model.Instruction.AddPropertyInstruction;
+import org.apache.jackrabbit.mongomk.api.model.Instruction.CopyNodeInstruction;
+import org.apache.jackrabbit.mongomk.api.model.Instruction.MoveNodeInstruction;
+import org.apache.jackrabbit.mongomk.api.model.Instruction.RemoveNodeInstruction;
+import org.apache.jackrabbit.mongomk.api.model.Instruction.SetPropertyInstruction;
+import org.apache.jackrabbit.mongomk.impl.json.DefaultJsopHandler;
+import org.apache.jackrabbit.mongomk.impl.json.JsopParser;
+import org.apache.jackrabbit.mongomk.impl.model.AddNodeInstructionImpl;
+import org.apache.jackrabbit.mongomk.impl.model.AddPropertyInstructionImpl;
+import org.apache.jackrabbit.mongomk.impl.model.CommitImpl;
+import org.apache.jackrabbit.mongomk.impl.model.CopyNodeInstructionImpl;
+import org.apache.jackrabbit.mongomk.impl.model.MoveNodeInstructionImpl;
+import org.apache.jackrabbit.mongomk.impl.model.RemoveNodeInstructionImpl;
+import org.apache.jackrabbit.mongomk.impl.model.SetPropertyInstructionImpl;
+
+/**
+ * A builder to convert a <a href="http://wiki.apache.org/jackrabbit/Jsop">JSOP</a> diff into a {@link Commit}.
+ *
+ * @author <a href="mailto:pmarx@adobe.com>Philipp Marx</a>
+ */
+public class CommitBuilder {
+
+    /**
+     * Creates and returns the {@link Commit}.
+     *
+     * @param path The root path of the {@code Commit}.
+     * @param diff The {@code JSOP} diff of the {@code Commit}.
+     * @param message The message of the {@code Commit}.
+     *
+     * @return The {@code Commit}.
+     * @throws Exception If an error occurred while creating the {@code Commit}.
+     */
+    public static Commit build(String path, String diff, String message) throws Exception {
+        CommitHandler commitHandler = new CommitHandler(new CommitImpl(path, diff, message));
+        JsopParser jsopParser = new JsopParser(path, diff, commitHandler);
+        jsopParser.parse();
+        return commitHandler.getCommit();
+    }
+
+    private CommitBuilder() {
+        // no instantiation
+    }
+
+    /**
+     * The {@link DefaultHandler} for the {@code JSOP} diff.
+     */
+    private static class CommitHandler extends DefaultJsopHandler {
+        private final CommitImpl commit;
+
+        CommitHandler(CommitImpl commit) {
+            this.commit = commit;
+        }
+
+        @Override
+        public void nodeAdded(String parentPath, String name) {
+            AddNodeInstruction instruction = new AddNodeInstructionImpl(parentPath, name);
+            commit.addInstruction(instruction);
+        }
+
+        @Override
+        public void nodeCopied(String rootPath, String oldPath, String newPath) {
+            CopyNodeInstruction instruction = new CopyNodeInstructionImpl(rootPath, oldPath, newPath);
+            commit.addInstruction(instruction);
+        }
+
+        @Override
+        public void nodeMoved(String rootPath, String oldPath, String newPath) {
+            MoveNodeInstruction instruction = new MoveNodeInstructionImpl(rootPath, oldPath, newPath);
+            commit.addInstruction(instruction);
+        }
+
+        @Override
+        public void nodeRemoved(String parentPath, String name) {
+            RemoveNodeInstruction instruction = new RemoveNodeInstructionImpl(parentPath, name);
+            commit.addInstruction(instruction);
+        }
+
+        @Override
+        public void propertyAdded(String path, String key, Object value) {
+            AddPropertyInstruction instruction = new AddPropertyInstructionImpl(path, key, value);
+            commit.addInstruction(instruction);
+        }
+
+        @Override
+        public void propertySet(String path, String key, Object value) {
+            SetPropertyInstruction instruction = new SetPropertyInstructionImpl(path, key, value);
+            commit.addInstruction(instruction);
+        }
+
+        Commit getCommit() {
+            return commit;
+        }
+    }
+}

Propchange: jackrabbit/oak/trunk/oak-mongomk-impl/src/main/java/org/apache/jackrabbit/mongomk/impl/builder/CommitBuilder.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/oak/trunk/oak-mongomk-impl/src/main/java/org/apache/jackrabbit/mongomk/impl/builder/NodeBuilder.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mongomk-impl/src/main/java/org/apache/jackrabbit/mongomk/impl/builder/NodeBuilder.java?rev=1386591&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-mongomk-impl/src/main/java/org/apache/jackrabbit/mongomk/impl/builder/NodeBuilder.java (added)
+++ jackrabbit/oak/trunk/oak-mongomk-impl/src/main/java/org/apache/jackrabbit/mongomk/impl/builder/NodeBuilder.java Mon Sep 17 12:54:01 2012
@@ -0,0 +1,125 @@
+/*
+ * 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.mongomk.impl.builder;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.apache.jackrabbit.mongomk.api.model.Node;
+import org.apache.jackrabbit.mongomk.impl.json.JsonUtil;
+import org.apache.jackrabbit.mongomk.impl.model.NodeImpl;
+import org.apache.jackrabbit.oak.commons.PathUtils;
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+/**
+ * A builder to create {@link Node}s from <a hred="http://en.wikipedia.org/wiki/JavaScript_Object_Notation">JSON</a>
+ * strings.
+ *
+ * @author <a href="mailto:pmarx@adobe.com>Philipp Marx</a>
+ */
+public class NodeBuilder {
+
+    /**
+     * Creates {@link Node} from the given {@code json} and an empty path as root path.
+     *
+     * @param json The {@code json}.
+     * @return The {@code Node}.
+     * @throws Exception If an error occurred while creating.
+     * @see #build(String, String)
+     */
+    public static Node build(String json) throws Exception {
+        return build(json, "");
+    }
+
+    /**
+     * Creates {@link Node} from the given {@code json} and an empty path as root path.
+     *
+     * @param json The {@code json}.
+     * @param path The root path of the nodes.
+     * @return The {@code Node}.
+     * @throws Exception If an error occurred while creating.
+     * @see #build(String, String)
+     */
+    public static Node build(String json, String path) throws Exception {
+        NodeBuilder nodeBuilder = new NodeBuilder();
+
+        return nodeBuilder.doBuild(json, path);
+    }
+
+    private NodeBuilder() {
+        // only private construction
+    }
+
+    private Node doBuild(String json, String path) throws Exception {
+        try {
+            JSONObject jsonObject = new JSONObject(json);
+            JSONArray names = jsonObject.names();
+            if (names.length() != 1) {
+                throw new IllegalArgumentException("JSON must contain exactly 1 root node");
+            }
+
+            String name = names.getString(0);
+            JSONObject value = jsonObject.getJSONObject(name);
+
+            return parseNode(PathUtils.concat(path, name), value);
+        } catch (JSONException e) {
+            throw new Exception(e);
+        }
+    }
+
+    private Node parseNode(String path, JSONObject jsonObject) throws Exception {
+        String realPath = path;
+        String revisionId = null;
+
+        int index = path.lastIndexOf('#');
+        if (index != -1) {
+            realPath = path.substring(0, index);
+            revisionId = path.substring(index + 1);
+        }
+
+        NodeImpl node = new NodeImpl(realPath);
+        node.setRevisionId(revisionId);
+
+        Map<String, Object> properties = null;
+        for (@SuppressWarnings("rawtypes")
+        Iterator iterator = jsonObject.keys(); iterator.hasNext();) {
+            String key = (String) iterator.next();
+            Object value = jsonObject.get(key);
+
+            if (value instanceof JSONObject) {
+                String childPath = PathUtils.concat(realPath, key);
+
+                Node childNode = parseNode(childPath, (JSONObject) value);
+                node.addChild(childNode);
+            } else {
+                if (properties == null) {
+                    properties = new HashMap<String, Object>();
+                }
+
+                Object converted = JsonUtil.convertJsonValue(value.toString());
+                properties.put(key, converted);
+            }
+        }
+
+        node.setProperties(properties);
+
+        return node;
+    }
+}

Propchange: jackrabbit/oak/trunk/oak-mongomk-impl/src/main/java/org/apache/jackrabbit/mongomk/impl/builder/NodeBuilder.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/oak/trunk/oak-mongomk-impl/src/main/java/org/apache/jackrabbit/mongomk/impl/command/CommandExecutorImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mongomk-impl/src/main/java/org/apache/jackrabbit/mongomk/impl/command/CommandExecutorImpl.java?rev=1386591&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-mongomk-impl/src/main/java/org/apache/jackrabbit/mongomk/impl/command/CommandExecutorImpl.java (added)
+++ jackrabbit/oak/trunk/oak-mongomk-impl/src/main/java/org/apache/jackrabbit/mongomk/impl/command/CommandExecutorImpl.java Mon Sep 17 12:54:01 2012
@@ -0,0 +1,55 @@
+/*
+ * 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.mongomk.impl.command;
+
+import org.apache.jackrabbit.mongomk.api.command.Command;
+import org.apache.jackrabbit.mongomk.api.command.CommandExecutor;
+
+/**
+ * Implementation of the {@link CommandExecutor} interface.
+ *
+ * @author <a href="mailto:pmarx@adobe.com>Philipp Marx</a>
+ */
+public class CommandExecutorImpl implements CommandExecutor {
+
+    @Override
+    public <T> T execute(Command<T> command) throws Exception {
+        T result = null;
+
+        int numOfRetries = command.getNumOfRetries();
+        int currentRetry = 0;
+        boolean needsRetry = true;
+
+        while ((currentRetry <= numOfRetries) && needsRetry) {
+
+            try {
+                result = command.execute();
+                needsRetry = command.needsRetry(result);
+            } catch (Exception e) {
+                needsRetry = command.needsRetry(e);
+
+                if (!needsRetry) {
+                    throw e;
+                }
+            }
+
+            ++currentRetry;
+        }
+
+        return result;
+    }
+}

Propchange: jackrabbit/oak/trunk/oak-mongomk-impl/src/main/java/org/apache/jackrabbit/mongomk/impl/command/CommandExecutorImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/oak/trunk/oak-mongomk-impl/src/main/java/org/apache/jackrabbit/mongomk/impl/json/DefaultJsopHandler.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mongomk-impl/src/main/java/org/apache/jackrabbit/mongomk/impl/json/DefaultJsopHandler.java?rev=1386591&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-mongomk-impl/src/main/java/org/apache/jackrabbit/mongomk/impl/json/DefaultJsopHandler.java (added)
+++ jackrabbit/oak/trunk/oak-mongomk-impl/src/main/java/org/apache/jackrabbit/mongomk/impl/json/DefaultJsopHandler.java Mon Sep 17 12:54:01 2012
@@ -0,0 +1,92 @@
+/*
+ * 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.mongomk.impl.json;
+
+/**
+ * The event callback of the parser.
+ *
+ * <p>
+ * Each event callback has an empty default implementation. An implementor may choose the appropriate methods to
+ * overwrite.
+ * </p>
+ */
+public class DefaultJsopHandler {
+
+    /**
+     * Event: A node has been added.
+     *
+     * @param parentPath The path where the node was added to.
+     * @param name The name of the added node.
+     */
+    public void nodeAdded(String parentPath, String name) {
+        // No-op
+    }
+
+    /**
+     * Event: A node was copied.
+     *
+     * @param rootPath The root path where the copy took place.
+     * @param oldPath The old path of the node (relative to the root path).
+     * @param newPath The new path of the node (relative to the root path).
+     */
+    public void nodeCopied(String rootPath, String oldPath, String newPath) {
+        // No-op
+    }
+
+    /**
+     * Event: A node was moved.
+     *
+     * @param rootPath The root path where the copy took place.
+     * @param oldPath The old path of the node (relative to the root path).
+     * @param newPath The new path of the node (relative to the root path).
+     */
+    public void nodeMoved(String rootPath, String oldPath, String newPath) {
+        // No-op
+    }
+
+    /**
+     * Event: A node was removed.
+     *
+     * @param parentPath The path where the node was removed from.
+     * @param name The name of the node.
+     */
+    public void nodeRemoved(String parentPath, String name) {
+        // No-op
+    }
+
+    /**
+     * Event: A property was added.
+     *
+     * @param path The path of the node where the property was added.
+     * @param key The key of the property.
+     * @param value The value of the property.
+     */
+    public void propertyAdded(String path, String key, Object value) {
+        // No-op
+    }
+
+    /**
+     * Event: A property was set.
+     *
+     * @param path The path of the node where the property was set.
+     * @param key The key of the property.
+     * @param value The value of the property.
+     */
+    public void propertySet(String path, String key, Object value) {
+        // No-op
+    }
+}

Propchange: jackrabbit/oak/trunk/oak-mongomk-impl/src/main/java/org/apache/jackrabbit/mongomk/impl/json/DefaultJsopHandler.java
------------------------------------------------------------------------------
    svn:eol-style = native