You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@usergrid.apache.org by to...@apache.org on 2013/12/04 04:45:15 UTC

[1/5] git commit: WIP. Need to finish creating pipelines etc before merging.

Updated Branches:
  refs/heads/two-dot-o 04b9497c9 -> cb9ec94e3


WIP.  Need to finish creating pipelines etc before merging.


Project: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/commit/b2833c39
Tree: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/tree/b2833c39
Diff: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/diff/b2833c39

Branch: refs/heads/two-dot-o
Commit: b2833c39ea46a2d4037671bda019d07ac69d9449
Parents: 04b9497
Author: Todd Nine <to...@apache.org>
Authored: Mon Dec 2 20:22:55 2013 -0700
Committer: Todd Nine <to...@apache.org>
Committed: Mon Dec 2 20:22:55 2013 -0700

----------------------------------------------------------------------
 stack/corepersistence/collection/pom.xml        |  2 +
 .../collection/CollectionManagerImpl.java       | 25 ++------
 .../collection/guice/CollectionModule.java      | 34 ++++++++--
 .../collection/mvcc/stage/Commit.java           | 22 -------
 .../collection/mvcc/stage/StagePipeline.java    | 35 +++++++++++
 .../collection/mvcc/stage/Start.java            | 44 -------------
 .../collection/mvcc/stage/Write.java            | 29 ---------
 .../collection/mvcc/stage/WriteContext.java     | 25 ++++++++
 .../collection/mvcc/stage/WriteListener.java    | 10 ---
 .../collection/mvcc/stage/WriteStage.java       |  7 +--
 .../stage/impl/CollectionPipelineModule.java    | 65 +++++++++++++++++++
 .../collection/mvcc/stage/impl/Commit.java      | 24 +++++++
 .../mvcc/stage/impl/CreatePipeline.java         | 20 ++++++
 .../mvcc/stage/impl/DeletePipeline.java         | 20 ++++++
 .../mvcc/stage/impl/StagePipelineImpl.java      | 59 +++++++++++++++++
 .../collection/mvcc/stage/impl/Start.java       | 66 ++++++++++++++++++++
 .../mvcc/stage/impl/UpdatePipeline.java         | 20 ++++++
 .../collection/mvcc/stage/impl/Write.java       | 27 ++++++++
 .../collection/mvcc/stage/StartTest.java        |  2 +-
 .../persistence/index/stage/Complete.java       |  9 +--
 .../usergrid/persistence/index/stage/Start.java | 10 +--
 .../usergrid/persistence/index/stage/Write.java | 10 +--
 22 files changed, 416 insertions(+), 149 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/b2833c39/stack/corepersistence/collection/pom.xml
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/pom.xml b/stack/corepersistence/collection/pom.xml
index 7e48ea4..1a0f358 100644
--- a/stack/corepersistence/collection/pom.xml
+++ b/stack/corepersistence/collection/pom.xml
@@ -91,6 +91,8 @@
       <version>${guice.version}</version>
     </dependency>
 
+
+
     <!-- Google Guice Integration Test Injectors -->
 
     <dependency>

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/b2833c39/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/CollectionManagerImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/CollectionManagerImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/CollectionManagerImpl.java
index 679a8cb..b5f0afb 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/CollectionManagerImpl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/CollectionManagerImpl.java
@@ -1,7 +1,6 @@
 package org.apache.usergrid.persistence.collection;
 
 
-import java.lang.reflect.InvocationTargetException;
 import java.util.UUID;
 
 import org.slf4j.Logger;
@@ -10,15 +9,9 @@ import org.slf4j.LoggerFactory;
 import org.apache.commons.beanutils.BeanUtils;
 
 import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntityImpl;
-import org.apache.usergrid.persistence.collection.mvcc.stage.Commit;
-import org.apache.usergrid.persistence.collection.mvcc.stage.Start;
-import org.apache.usergrid.persistence.collection.mvcc.stage.Write;
 import org.apache.usergrid.persistence.model.entity.Entity;
 import org.apache.usergrid.persistence.model.util.UUIDGenerator;
 
-import com.google.inject.Inject;
-import com.netflix.astyanax.MutationBatch;
-
 
 /**
  * Simple implementation.  Should perform
@@ -30,19 +23,12 @@ public class CollectionManagerImpl implements CollectionManager {
 
     private final CollectionContext context;
     private final TimeService timeService;
-    private final Start startStage;
-    private final Write writeStage;
-    private final Commit commitStage;
 
 
-    @Inject
-    public CollectionManagerImpl( final CollectionContext context, final TimeService timeService, final Start startStage, final Write writeStage,
-                                  final Commit commitStage ) {
+
+    public CollectionManagerImpl( final CollectionContext context, final TimeService timeService ) {
         this.context = context;
         this.timeService = timeService;
-        this.startStage = startStage;
-        this.writeStage = writeStage;
-        this.commitStage = commitStage;
     }
 
 
@@ -69,9 +55,7 @@ public class CollectionManagerImpl implements CollectionManager {
         MvccEntityImpl mvccEntity = new MvccEntityImpl(context, entityId, version, entity   );
 
 
-        MutationBatch mutation = startStage.performStage(  mvccEntity );
-        writeStage.performStage( mvccEntity );
-        commitStage.performStage( mvccEntity );
+
     }
 
 
@@ -91,4 +75,7 @@ public class CollectionManagerImpl implements CollectionManager {
     public Entity load( final UUID entityId ) {
         return null;  //To change body of implemented methods use File | Settings | File Templates.
     }
+
+
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/b2833c39/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/guice/CollectionModule.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/guice/CollectionModule.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/guice/CollectionModule.java
index c83fe4f..e675e88 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/guice/CollectionModule.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/guice/CollectionModule.java
@@ -5,12 +5,17 @@ import org.apache.usergrid.persistence.collection.astynax.AstynaxKeyspaceProvide
 import org.apache.usergrid.persistence.collection.migration.Migration;
 import org.apache.usergrid.persistence.collection.migration.MigrationManager;
 import org.apache.usergrid.persistence.collection.migration.MigrationManagerImpl;
+import org.apache.usergrid.persistence.collection.mvcc.stage.StagePipeline;
+import org.apache.usergrid.persistence.collection.mvcc.stage.impl.UpdatePipeline;
+import org.apache.usergrid.persistence.collection.mvcc.stage.impl.CreatePipeline;
+import org.apache.usergrid.persistence.collection.mvcc.stage.impl.DeletePipeline;
 import org.apache.usergrid.persistence.collection.serialization.MvccEntitySerializationStrategy;
 import org.apache.usergrid.persistence.collection.serialization.MvccEntitySerializationStrategyImpl;
 import org.apache.usergrid.persistence.collection.serialization.MvccLogEntrySerializationStrategy;
 import org.apache.usergrid.persistence.collection.serialization.MvccLogEntrySerializationStrategyImpl;
 
 import com.google.inject.AbstractModule;
+import com.google.inject.Provides;
 import com.google.inject.multibindings.Multibinder;
 import com.google.inject.name.Names;
 import com.netflix.astyanax.Keyspace;
@@ -23,9 +28,7 @@ import com.netflix.astyanax.Keyspace;
  */
 public class CollectionModule extends AbstractModule {
 
-    /**
-     * The location of the properties file
-     */
+    /** The location of the properties file */
     private static final String CASS_PROPS = "cassandra.properties";
 
 
@@ -44,7 +47,7 @@ public class CollectionModule extends AbstractModule {
         bind( Keyspace.class ).toProvider( AstynaxKeyspaceProvider.class );
 
         //bind our migration manager
-        bind(MigrationManager.class).to( MigrationManagerImpl.class );
+        bind( MigrationManager.class ).to( MigrationManagerImpl.class );
 
 
         //bind the serialization strategies
@@ -61,4 +64,27 @@ public class CollectionModule extends AbstractModule {
         uriBinder.addBinding().to( MvccEntitySerializationStrategyImpl.class );
         uriBinder.addBinding().to( MvccLogEntrySerializationStrategyImpl.class );
     }
+
+
+    /** Wire the pipeline of operations for create.  This should create a new
+     * instance every time, since StagePipeline objects are mutable */
+    @Provides
+    @CreatePipeline
+    public StagePipeline createWritePipeline() {
+        return null;  //To change body of created methods use File | Settings | File Templates.
+    }
+
+
+    @Provides
+    @DeletePipeline
+    public StagePipeline deletePipeline() {
+        return null;  //To change body of created methods use File | Settings | File Templates.
+    }
+
+
+    @Provides
+    @UpdatePipeline
+    public StagePipeline updatePipeline() {
+        return null;  //To change body of created methods use File | Settings | File Templates.
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/b2833c39/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/Commit.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/Commit.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/Commit.java
deleted file mode 100644
index 019c497..0000000
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/Commit.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package org.apache.usergrid.persistence.collection.mvcc.stage;
-
-
-import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntity;
-
-import com.google.common.util.concurrent.ListenableFuture;
-import com.netflix.astyanax.MutationBatch;
-import com.netflix.astyanax.connectionpool.OperationResult;
-
-
-/**
- * This phase should invoke any finalization, and mark the entity as committed in the data store before returning
- */
-public class Commit implements WriteStage {
-
-
-
-    @Override
-    public MutationBatch performStage( final MvccEntity entity ) {
-        return null;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/b2833c39/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/StagePipeline.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/StagePipeline.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/StagePipeline.java
new file mode 100644
index 0000000..30b274c
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/StagePipeline.java
@@ -0,0 +1,35 @@
+package org.apache.usergrid.persistence.collection.mvcc.stage;
+
+
+/**
+ * Pipeline that represents a collection of stages to execute
+ * An implementation is mutable, so this instance should not be
+ * reused across threads
+ *
+ * @author tnine */
+public interface StagePipeline {
+
+
+    /**
+     * Get the next stage in this pipeline.  Will return null if there are no more stages to execute
+     */
+    public WriteStage next();
+
+    /**
+     * Insert a new stage directly after the current stage.  This can be used
+     * to add additional validation during write phases depending on the mvcc entity
+     *
+     * @param stage
+     */
+    public void insert(WriteStage stage);
+
+
+    /**
+     * Add a new stage to the end of the pipline
+     * @param stage
+     */
+    public void addLast(WriteStage stage);
+
+
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/b2833c39/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/Start.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/Start.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/Start.java
deleted file mode 100644
index e66eb52..0000000
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/Start.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package org.apache.usergrid.persistence.collection.mvcc.stage;
-
-
-import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntity;
-import org.apache.usergrid.persistence.collection.mvcc.entity.MvccLogEntry;
-import org.apache.usergrid.persistence.collection.mvcc.entity.MvccLogEntryImpl;
-import org.apache.usergrid.persistence.collection.mvcc.entity.Stage;
-import org.apache.usergrid.persistence.collection.serialization.MvccLogEntrySerializationStrategy;
-
-import com.google.common.util.concurrent.ListenableFuture;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import com.netflix.astyanax.MutationBatch;
-import com.netflix.astyanax.connectionpool.OperationResult;
-import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
-
-
-/**
- * This is the first stage and should be invoked immediately when a write is started.  It should persist the start of a
- * new write in the data store for a checkpoint and recovery
- */
-@Singleton
-public class Start implements WriteStage {
-
-    private final MvccLogEntrySerializationStrategy logStrategy;
-    /**
-     * Create a new stage with the current context
-     * @param logStrategy
-     */
-    @Inject
-    protected Start( final MvccLogEntrySerializationStrategy logStrategy ){
-        this.logStrategy = logStrategy;
-    }
-
-
-    @Override
-    public MutationBatch performStage( final MvccEntity entity )  {
-        final MvccLogEntry startEntry = new MvccLogEntryImpl(entity.getContext(), entity.getUuid(), entity.getVersion(),Stage.ACTIVE);
-
-        MutationBatch write = logStrategy.write( startEntry );
-
-        return write;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/b2833c39/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/Write.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/Write.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/Write.java
deleted file mode 100644
index 690416f..0000000
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/Write.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package org.apache.usergrid.persistence.collection.mvcc.stage;
-
-
-import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntity;
-
-import com.google.common.util.concurrent.ListenableFuture;
-import com.netflix.astyanax.MutationBatch;
-import com.netflix.astyanax.connectionpool.OperationResult;
-
-
-/**
- * This phase should execute the serialization to the data store.
- */
-public class Write implements WriteStage {
-
-    /**
-     * Create a new stage with the current context
-     */
-    protected Write( ){
-    }
-
-
-    @Override
-    public MutationBatch performStage( final MvccEntity entity ) {
-
-
-        return null;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/b2833c39/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/WriteContext.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/WriteContext.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/WriteContext.java
new file mode 100644
index 0000000..38aa9d4
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/WriteContext.java
@@ -0,0 +1,25 @@
+package org.apache.usergrid.persistence.collection.mvcc.stage;
+
+
+import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntity;
+
+
+/** @author tnine */
+public interface WriteContext {
+
+
+    /**
+     * Get the stage pipeline for this write context
+     * @return
+     */
+    StagePipeline getStagePipeline();
+
+    /**
+     * Perform the write in the context with the specified entity
+     * @param entity
+     */
+    void performWrite(MvccEntity entity);
+
+
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/b2833c39/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/WriteListener.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/WriteListener.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/WriteListener.java
deleted file mode 100644
index 4a78226..0000000
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/WriteListener.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package org.apache.usergrid.persistence.collection.mvcc.stage;
-
-
-import com.google.common.util.concurrent.FutureCallback;
-import com.google.common.util.concurrent.ListenableFuture;
-import com.netflix.astyanax.connectionpool.OperationResult;
-
-
-/** @author tnine */
-public interface WriteListener extends ListenableFuture<OperationResult<Void>> {}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/b2833c39/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/WriteStage.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/WriteStage.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/WriteStage.java
index 1960fdb..a45df6b 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/WriteStage.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/WriteStage.java
@@ -3,9 +3,6 @@ package org.apache.usergrid.persistence.collection.mvcc.stage;
 
 import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntity;
 
-import com.google.common.util.concurrent.ListenableFuture;
-import com.netflix.astyanax.MutationBatch;
-import com.netflix.astyanax.connectionpool.OperationResult;
 import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
 
 
@@ -17,10 +14,12 @@ public interface WriteStage {
     /**
      * Run this stage.  This will return the MvccEntity that should be returned or passed to the next stage
      *
+     *
+     * @param context The context of the current write operation
      * @param entity The entity to use in this stage
      *
      * @return The asynchronous listener to signal success
      *
      */
-    public MutationBatch performStage( MvccEntity entity ) throws ConnectionException;
+    public void performStage( WriteContext context, MvccEntity entity ) throws ConnectionException;
 }

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/b2833c39/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/CollectionPipelineModule.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/CollectionPipelineModule.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/CollectionPipelineModule.java
new file mode 100644
index 0000000..67ca516
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/CollectionPipelineModule.java
@@ -0,0 +1,65 @@
+package org.apache.usergrid.persistence.collection.mvcc.stage.impl;
+
+
+import org.apache.usergrid.persistence.collection.astynax.AstynaxKeyspaceProvider;
+import org.apache.usergrid.persistence.collection.guice.PropertyUtils;
+import org.apache.usergrid.persistence.collection.migration.Migration;
+import org.apache.usergrid.persistence.collection.migration.MigrationManager;
+import org.apache.usergrid.persistence.collection.migration.MigrationManagerImpl;
+import org.apache.usergrid.persistence.collection.mvcc.stage.StagePipeline;
+import org.apache.usergrid.persistence.collection.mvcc.stage.WriteStage;
+import org.apache.usergrid.persistence.collection.serialization.MvccEntitySerializationStrategy;
+import org.apache.usergrid.persistence.collection.serialization.MvccEntitySerializationStrategyImpl;
+import org.apache.usergrid.persistence.collection.serialization.MvccLogEntrySerializationStrategy;
+import org.apache.usergrid.persistence.collection.serialization.MvccLogEntrySerializationStrategyImpl;
+
+import com.google.inject.AbstractModule;
+import com.google.inject.Inject;
+import com.google.inject.Provides;
+import com.google.inject.multibindings.Multibinder;
+import com.google.inject.name.Names;
+import com.netflix.astyanax.Keyspace;
+
+
+/**
+ * Simple module for wiring our pipelines
+ *
+ * @author tnine
+ */
+public class CollectionPipelineModule extends AbstractModule {
+
+    @Inject
+    private MvccLogEntrySerializationStrategy mvccLogEntrySerializationStrategy;
+
+    @Inject
+    private MvccEntitySerializationStrategy mvccEntitySerializationStrategy;
+
+
+    /** Wire the pipeline of operations for create.  This should create a new
+     * instance every time, since StagePipeline objects are mutable */
+    @Provides
+    @CreatePipeline
+    public StagePipeline createWritePipeline() {
+        return StagePipelineImpl.fromStages( new Start( mvccLogEntrySerializationStrategy ), new Write(), new Commit() );
+    }
+
+
+    @Provides
+    @DeletePipeline
+    public StagePipeline deletePipeline() {
+        return null;  //To change body of created methods use File | Settings | File Templates.
+    }
+
+
+    @Provides
+    @UpdatePipeline
+    public StagePipeline updatePipeline() {
+        return createWritePipeline();
+    }
+
+
+    @Override
+    protected void configure() {
+        //no op, we get our values from the provides above
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/b2833c39/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Commit.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Commit.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Commit.java
new file mode 100644
index 0000000..378e649
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Commit.java
@@ -0,0 +1,24 @@
+package org.apache.usergrid.persistence.collection.mvcc.stage.impl;
+
+
+import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntity;
+import org.apache.usergrid.persistence.collection.mvcc.stage.WriteContext;
+import org.apache.usergrid.persistence.collection.mvcc.stage.WriteStage;
+
+import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
+
+
+/**
+ * This phase should invoke any finalization, and mark the entity as committed in the data store before returning
+ */
+public class Commit implements WriteStage {
+
+    public Commit(){
+
+    }
+
+    @Override
+    public void performStage( final WriteContext context, final MvccEntity entity ) throws ConnectionException {
+        //To change body of implemented methods use File | Settings | File Templates.
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/b2833c39/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/CreatePipeline.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/CreatePipeline.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/CreatePipeline.java
new file mode 100644
index 0000000..fb7e7c1
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/CreatePipeline.java
@@ -0,0 +1,20 @@
+package org.apache.usergrid.persistence.collection.mvcc.stage.impl;
+
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import com.google.inject.BindingAnnotation;
+
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+
+
+/**
+ * Marks the create pipeline
+ * @author tnine */
+@BindingAnnotation
+@Target({ FIELD, PARAMETER, METHOD }) @Retention(RUNTIME)
+public @interface CreatePipeline {}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/b2833c39/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/DeletePipeline.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/DeletePipeline.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/DeletePipeline.java
new file mode 100644
index 0000000..e531a7f
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/DeletePipeline.java
@@ -0,0 +1,20 @@
+package org.apache.usergrid.persistence.collection.mvcc.stage.impl;
+
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import com.google.inject.BindingAnnotation;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+
+/**
+ * Marks the delete pipeline
+ * @author tnine */
+@BindingAnnotation
+@Target({ FIELD, PARAMETER, METHOD }) @Retention(RUNTIME)
+public @interface DeletePipeline {}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/b2833c39/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/StagePipelineImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/StagePipelineImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/StagePipelineImpl.java
new file mode 100644
index 0000000..5de58c5
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/StagePipelineImpl.java
@@ -0,0 +1,59 @@
+package org.apache.usergrid.persistence.collection.mvcc.stage.impl;
+
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.NoSuchElementException;
+
+import org.apache.usergrid.persistence.collection.mvcc.entity.Stage;
+import org.apache.usergrid.persistence.collection.mvcc.stage.StagePipeline;
+import org.apache.usergrid.persistence.collection.mvcc.stage.WriteStage;
+
+
+/** @author tnine */
+public class StagePipelineImpl implements StagePipeline {
+
+    private int currentIndex = 0;
+    private final List<WriteStage> stages;
+
+    protected StagePipelineImpl(WriteStage[] stages){
+        this.stages = Arrays.asList(stages);
+    }
+
+    @Override
+    public WriteStage next() {
+
+        if(currentIndex < stages.size()){
+
+            //get our current stage and increment
+            return stages.get( currentIndex ++);
+        }
+
+       return null;
+    }
+
+
+    @Override
+    public void insert( final WriteStage stage ) {
+        throw new UnsupportedOperationException("This needs written");
+
+    }
+
+
+    @Override
+    public void addLast( final WriteStage stage ) {
+       stages.add( stage );
+    }
+
+
+    /**
+     * Factory to create a new instance.
+     * @param stages
+     * @return
+     */
+    public static StagePipelineImpl fromStages(WriteStage... stages){
+        return new StagePipelineImpl( stages );
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/b2833c39/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Start.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Start.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Start.java
new file mode 100644
index 0000000..6d4b63c
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Start.java
@@ -0,0 +1,66 @@
+package org.apache.usergrid.persistence.collection.mvcc.stage.impl;
+
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntity;
+import org.apache.usergrid.persistence.collection.mvcc.entity.MvccLogEntry;
+import org.apache.usergrid.persistence.collection.mvcc.entity.MvccLogEntryImpl;
+import org.apache.usergrid.persistence.collection.mvcc.entity.Stage;
+import org.apache.usergrid.persistence.collection.mvcc.stage.WriteContext;
+import org.apache.usergrid.persistence.collection.mvcc.stage.WriteStage;
+import org.apache.usergrid.persistence.collection.serialization.MvccLogEntrySerializationStrategy;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import com.netflix.astyanax.MutationBatch;
+import com.netflix.astyanax.connectionpool.OperationResult;
+import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
+
+
+
+/**
+ * This is the first stage and should be invoked immediately when a write is started.  It should persist the start of a
+ * new write in the data store for a checkpoint and recovery
+ */
+@Singleton
+public class Start implements WriteStage {
+
+    private static final Logger LOG = LoggerFactory.getLogger( Start.class );
+
+    private final MvccLogEntrySerializationStrategy logStrategy;
+    /**
+     * Create a new stage with the current context
+     * @param logStrategy
+     */
+    @Inject
+    public Start( final MvccLogEntrySerializationStrategy logStrategy ){
+        this.logStrategy = logStrategy;
+    }
+
+
+    @Override
+    public void performStage(final WriteContext context, final MvccEntity entity )  {
+        final MvccLogEntry startEntry = new MvccLogEntryImpl(entity.getContext(), entity.getUuid(), entity.getVersion(),Stage.ACTIVE);
+
+        MutationBatch write = logStrategy.write( startEntry );
+
+        ListenableFuture<OperationResult<Void>> future;
+
+        try {
+            future = write.executeAsync();
+        }
+        catch ( ConnectionException e ) {
+          LOG.error( "Failed to execute write asynchronously ", e );
+          throw new RuntimeException( "Failed to execute write asynchronously ", e );
+        }
+
+        //todo next stage invocation
+        //Futures.addCallback();
+
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/b2833c39/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/UpdatePipeline.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/UpdatePipeline.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/UpdatePipeline.java
new file mode 100644
index 0000000..556e92c
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/UpdatePipeline.java
@@ -0,0 +1,20 @@
+package org.apache.usergrid.persistence.collection.mvcc.stage.impl;
+
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import com.google.inject.BindingAnnotation;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+
+/**
+ * Marks the update pipeline
+ * @author tnine */
+@BindingAnnotation
+@Target({ FIELD, PARAMETER, METHOD }) @Retention(RUNTIME)
+public @interface UpdatePipeline {}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/b2833c39/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Write.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Write.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Write.java
new file mode 100644
index 0000000..b45ccd5
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Write.java
@@ -0,0 +1,27 @@
+package org.apache.usergrid.persistence.collection.mvcc.stage.impl;
+
+
+import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntity;
+import org.apache.usergrid.persistence.collection.mvcc.stage.WriteContext;
+import org.apache.usergrid.persistence.collection.mvcc.stage.WriteStage;
+
+
+/**
+ * This phase should execute the serialization to the data store.
+ */
+public class Write implements WriteStage {
+
+    /**
+     * Create a new stage with the current context
+     */
+    public Write( ){
+    }
+
+
+    @Override
+    public void performStage(WriteContext context, final MvccEntity entity ) {
+
+
+
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/b2833c39/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/StartTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/StartTest.java b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/StartTest.java
index 76d6326..aa79a70 100644
--- a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/StartTest.java
+++ b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/StartTest.java
@@ -5,9 +5,9 @@ import java.util.UUID;
 
 import org.junit.Test;
 
-import org.apache.usergrid.persistence.collection.CollectionContext;
 import org.apache.usergrid.persistence.collection.CollectionContextImpl;
 import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntityImpl;
+import org.apache.usergrid.persistence.collection.mvcc.stage.impl.Start;
 import org.apache.usergrid.persistence.collection.serialization.MvccLogEntrySerializationStrategy;
 import org.apache.usergrid.persistence.model.entity.Entity;
 import org.apache.usergrid.persistence.model.util.UUIDGenerator;

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/b2833c39/stack/corepersistence/index/src/main/java/org/apache/usergrid/persistence/index/stage/Complete.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/index/src/main/java/org/apache/usergrid/persistence/index/stage/Complete.java b/stack/corepersistence/index/src/main/java/org/apache/usergrid/persistence/index/stage/Complete.java
index 17903fe..cc0bc35 100644
--- a/stack/corepersistence/index/src/main/java/org/apache/usergrid/persistence/index/stage/Complete.java
+++ b/stack/corepersistence/index/src/main/java/org/apache/usergrid/persistence/index/stage/Complete.java
@@ -2,12 +2,9 @@ package org.apache.usergrid.persistence.index.stage;
 
 
 import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntity;
+import org.apache.usergrid.persistence.collection.mvcc.stage.WriteContext;
 import org.apache.usergrid.persistence.collection.mvcc.stage.WriteStage;
 
-import com.google.common.util.concurrent.ListenableFuture;
-import com.netflix.astyanax.MutationBatch;
-import com.netflix.astyanax.connectionpool.OperationResult;
-
 
 /**
  *
@@ -18,8 +15,8 @@ public class Complete implements WriteStage
 {
 
     @Override
-    public MutationBatch performStage( final MvccEntity entity ) {
-        return null;  //To change body of implemented methods use File | Settings | File Templates.
+    public void performStage( WriteContext context, final MvccEntity entity ) {
+
     }
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/b2833c39/stack/corepersistence/index/src/main/java/org/apache/usergrid/persistence/index/stage/Start.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/index/src/main/java/org/apache/usergrid/persistence/index/stage/Start.java b/stack/corepersistence/index/src/main/java/org/apache/usergrid/persistence/index/stage/Start.java
index 4270629..d97b81c 100644
--- a/stack/corepersistence/index/src/main/java/org/apache/usergrid/persistence/index/stage/Start.java
+++ b/stack/corepersistence/index/src/main/java/org/apache/usergrid/persistence/index/stage/Start.java
@@ -2,19 +2,19 @@ package org.apache.usergrid.persistence.index.stage;
 
 
 import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntity;
+import org.apache.usergrid.persistence.collection.mvcc.stage.WriteContext;
 import org.apache.usergrid.persistence.collection.mvcc.stage.WriteStage;
 
-import com.google.common.util.concurrent.ListenableFuture;
-import com.netflix.astyanax.MutationBatch;
-import com.netflix.astyanax.connectionpool.OperationResult;
+import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
 
 
 /** This state should signal an index update has started */
 public class Start implements WriteStage
 {
 
+
     @Override
-    public MutationBatch performStage( final MvccEntity entity ) {
-        return null;  //To change body of implemented methods use File | Settings | File Templates.
+    public void performStage( final WriteContext context, final MvccEntity entity ) throws ConnectionException {
+        //To change body of implemented methods use File | Settings | File Templates.
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/b2833c39/stack/corepersistence/index/src/main/java/org/apache/usergrid/persistence/index/stage/Write.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/index/src/main/java/org/apache/usergrid/persistence/index/stage/Write.java b/stack/corepersistence/index/src/main/java/org/apache/usergrid/persistence/index/stage/Write.java
index c5d857b..e143a6b 100644
--- a/stack/corepersistence/index/src/main/java/org/apache/usergrid/persistence/index/stage/Write.java
+++ b/stack/corepersistence/index/src/main/java/org/apache/usergrid/persistence/index/stage/Write.java
@@ -2,20 +2,20 @@ package org.apache.usergrid.persistence.index.stage;
 
 
 import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntity;
+import org.apache.usergrid.persistence.collection.mvcc.stage.WriteContext;
 import org.apache.usergrid.persistence.collection.mvcc.stage.WriteStage;
 
-import com.google.common.util.concurrent.ListenableFuture;
-import com.netflix.astyanax.MutationBatch;
-import com.netflix.astyanax.connectionpool.OperationResult;
+import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
 
 
 /** This state should perform an update of the index. */
 public class Write implements WriteStage
 {
 
+
     @Override
-    public MutationBatch performStage( final MvccEntity entity ) {
-        return null;  //To change body of implemented methods use File | Settings | File Templates.
+    public void performStage( final WriteContext context, final MvccEntity entity ) throws ConnectionException {
+        //To change body of implemented methods use File | Settings | File Templates.
     }
 }
 


[5/5] git commit: Major refactor complete. Need to work on scheduling of futures.

Posted by to...@apache.org.
Major refactor complete.  Need to work on scheduling of futures.


Project: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/commit/cb9ec94e
Tree: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/tree/cb9ec94e
Diff: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/diff/cb9ec94e

Branch: refs/heads/two-dot-o
Commit: cb9ec94e31df24e191f2fa4010c020e2ce16c36e
Parents: 271b26c
Author: Todd Nine <to...@apache.org>
Authored: Tue Dec 3 11:12:57 2013 -0700
Committer: Todd Nine <to...@apache.org>
Committed: Tue Dec 3 20:44:14 2013 -0700

----------------------------------------------------------------------
 stack/corepersistence/collection/pom.xml        |  42 +-
 .../collection/CollectionContextImpl.java       |  93 ----
 .../collection/CollectionManager.java           |   4 +-
 .../CollectionManagerFactoryImpl.java           |  16 -
 .../collection/CollectionManagerImpl.java       |  81 ----
 .../persistence/collection/TimeService.java     |  12 -
 .../exception/CollectionRuntimeException.java   |  29 ++
 .../collection/guice/CollectionModule.java      |  74 +---
 .../collection/impl/CollectionContextImpl.java  |  95 ++++
 .../impl/CollectionManagerFactoryImpl.java      |  21 +
 .../collection/impl/CollectionManagerImpl.java  |  77 ++++
 .../collection/mvcc/entity/MvccEntity.java      |   4 -
 .../collection/mvcc/entity/MvccEntityImpl.java  | 110 -----
 .../collection/mvcc/entity/MvccLogEntry.java    |   5 -
 .../mvcc/entity/MvccLogEntryImpl.java           | 113 -----
 .../mvcc/entity/impl/MvccEntityImpl.java        |  98 +++++
 .../mvcc/entity/impl/MvccLogEntryImpl.java      | 100 +++++
 .../mvcc/event/PostProcessListener.java         |   6 +-
 .../collection/mvcc/stage/MvccStrategy.java     |  42 --
 .../collection/mvcc/stage/StagePipeline.java    |  27 +-
 .../collection/mvcc/stage/WriteContext.java     |  46 +-
 .../mvcc/stage/WriteContextFactory.java         |  30 ++
 .../collection/mvcc/stage/WriteStage.java       |   7 +-
 .../stage/impl/CollectionPipelineModule.java    |  38 +-
 .../collection/mvcc/stage/impl/Commit.java      |  24 -
 .../mvcc/stage/impl/MvccEntityCommit.java       |  28 ++
 .../mvcc/stage/impl/MvccEntityNew.java          | 116 +++++
 .../mvcc/stage/impl/MvccEntityWrite.java        |  25 ++
 .../mvcc/stage/impl/StagePipelineImpl.java      |  45 +-
 .../collection/mvcc/stage/impl/Start.java       |  67 ---
 .../mvcc/stage/impl/UpdatePipeline.java         |  20 -
 .../collection/mvcc/stage/impl/Write.java       |  27 --
 .../mvcc/stage/impl/WriteContextCallback.java   |  42 +-
 .../stage/impl/WriteContextFactoryImpl.java     |  47 ++
 .../mvcc/stage/impl/WriteContextImpl.java       | 111 +++++
 .../MvccEntitySerializationStrategy.java        |   7 +-
 .../MvccEntitySerializationStrategyImpl.java    | 227 ----------
 .../MvccLogEntrySerializationStrategy.java      |   2 +-
 .../MvccLogEntrySerializationStrategyImpl.java  | 238 ----------
 .../MvccEntitySerializationStrategyImpl.java    | 238 ++++++++++
 .../MvccLogEntrySerializationStrategyImpl.java  | 239 ++++++++++
 .../serialization/impl/SerializationModule.java |  45 ++
 .../collection/service/TimeService.java         |  12 +
 .../collection/service/UUIDService.java         |  15 +
 .../collection/service/impl/ServiceModule.java  |  34 ++
 .../service/impl/TimeServiceImpl.java           |  14 +
 .../service/impl/UUIDServiceImpl.java           |  17 +
 .../collection/CollectionContextImplTest.java   |   1 +
 .../collection/guice/TestCollectionModule.java  |   3 +-
 .../mvcc/entity/MvccEntityImplTest.java         | 132 ------
 .../mvcc/entity/MvccLogEntryImplTest.java       | 104 -----
 .../collection/mvcc/entity/StageTest.java       |  91 ----
 .../mvcc/entity/impl/MvccEntityImplTest.java    | 107 +++++
 .../mvcc/entity/impl/MvccLogEntryImplTest.java  |  95 ++++
 .../collection/mvcc/entity/impl/StageTest.java  |  93 ++++
 .../collection/mvcc/stage/StartTest.java        |  51 ---
 .../mvcc/stage/impl/MvccEntityNewTest.java      | 136 ++++++
 ...MvccEntitySerializationStrategyImplTest.java | 430 ------------------
 ...ccLogEntrySerializationStrategyImplTest.java | 311 -------------
 .../serialization/SerializationComparison.java  | 182 --------
 ...MvccEntitySerializationStrategyImplTest.java | 438 +++++++++++++++++++
 ...ccLogEntrySerializationStrategyImplTest.java | 319 ++++++++++++++
 .../impl/SerializationComparison.java           | 182 ++++++++
 .../persistence/index/stage/Complete.java       |   7 +-
 .../usergrid/persistence/index/stage/Start.java |   6 +-
 .../usergrid/persistence/index/stage/Write.java |  11 +-
 66 files changed, 2989 insertions(+), 2520 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/pom.xml
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/pom.xml b/stack/corepersistence/collection/pom.xml
index 1a0f358..0f4eb6d 100644
--- a/stack/corepersistence/collection/pom.xml
+++ b/stack/corepersistence/collection/pom.xml
@@ -43,32 +43,31 @@
       <version>${astynax.version}</version>
     </dependency>
 
-    <!-- bean utils for setting uuids etc -->
+    <!-- lang utils for setting uuids etc -->
     <dependency>
-        <groupId>commons-beanutils</groupId>
-        <artifactId>commons-beanutils-core</artifactId>
-        <version>1.8.3</version>
+      <groupId>org.apache.commons</groupId>
+      <artifactId>commons-lang3</artifactId>
+      <version>3.1</version>
     </dependency>
-
     <!-- Serialization libraries -->
 
     <dependency>
-        <groupId>org.codehaus.jackson</groupId>
-        <artifactId>jackson-smile</artifactId>
-        <version>1.9.13</version>
+      <groupId>org.codehaus.jackson</groupId>
+      <artifactId>jackson-smile</artifactId>
+      <version>1.9.13</version>
     </dependency>
 
     <dependency>
-        <groupId>com.esotericsoftware.kryo</groupId>
-        <artifactId>kryo</artifactId>
-        <version>2.22</version>
+      <groupId>com.esotericsoftware.kryo</groupId>
+      <artifactId>kryo</artifactId>
+      <version>2.22</version>
     </dependency>
 
     <!-- helper serializers for kryo -->
     <dependency>
-        <groupId>de.javakaffee</groupId>
-        <artifactId>kryo-serializers</artifactId>
-        <version>0.26</version>
+      <groupId>de.javakaffee</groupId>
+      <artifactId>kryo-serializers</artifactId>
+      <version>0.26</version>
     </dependency>
 
     <!-- Google Guice -->
@@ -91,7 +90,11 @@
       <version>${guice.version}</version>
     </dependency>
 
-
+    <dependency>
+      <groupId>com.google.inject.extensions</groupId>
+      <artifactId>guice-assistedinject</artifactId>
+      <version>${guice.version}</version>
+    </dependency>
 
     <!-- Google Guice Integration Test Injectors -->
 
@@ -102,7 +105,6 @@
       <scope>test</scope>
     </dependency>
 
-
     <dependency>
       <groupId>${project.parent.groupId}</groupId>
       <artifactId>testutils</artifactId>
@@ -111,10 +113,10 @@
     </dependency>
 
     <dependency>
-    <groupId>org.mockito</groupId>
-     <artifactId>mockito-all</artifactId>
-     <version>1.9.5</version>
-     <scope>test</scope>
+      <groupId>org.mockito</groupId>
+      <artifactId>mockito-all</artifactId>
+      <version>1.9.5</version>
+      <scope>test</scope>
     </dependency>
 
   </dependencies>

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/CollectionContextImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/CollectionContextImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/CollectionContextImpl.java
deleted file mode 100644
index 1aef1d3..0000000
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/CollectionContextImpl.java
+++ /dev/null
@@ -1,93 +0,0 @@
-package org.apache.usergrid.persistence.collection;
-
-
-import java.util.UUID;
-
-import com.google.common.base.Preconditions;
-
-
-/**
- * Simple impl of hte collection context
- * @author tnine
- */
-public class CollectionContextImpl implements CollectionContext {
-
-    private final UUID applicationId;
-    private final UUID ownerId;
-    private final String name;
-
-
-    public CollectionContextImpl( final UUID applicationId, final UUID ownerId, final String name ) {
-        Preconditions.checkNotNull( applicationId , "applicationId is required");
-        Preconditions.checkNotNull( ownerId , "ownerId is required");
-        Preconditions.checkNotNull( name , "name is required");
-        Preconditions.checkArgument( name.length() > 0, "name must have a length" );
-
-
-        this.applicationId = applicationId;
-        this.ownerId = ownerId;
-        this.name = name;
-    }
-
-
-    @Override
-    public UUID getApplication() {
-        return applicationId;
-    }
-
-
-    @Override
-    public UUID getOwner() {
-        return ownerId;
-    }
-
-
-    @Override
-    public String getName() {
-        return name;
-    }
-
-
-    @Override
-    public boolean equals( final Object o ) {
-        if ( this == o ) {
-            return true;
-        }
-        if ( o == null || getClass() != o.getClass() ) {
-            return false;
-        }
-
-        final CollectionContextImpl that = ( CollectionContextImpl ) o;
-
-        if ( !applicationId.equals( that.applicationId ) ) {
-            return false;
-        }
-        if ( !name.equals( that.name ) ) {
-            return false;
-        }
-        if ( !ownerId.equals( that.ownerId ) ) {
-            return false;
-        }
-
-        return true;
-    }
-
-
-    @Override
-    public int hashCode() {
-        int result = applicationId.hashCode();
-        result = 31 * result + ownerId.hashCode();
-        result = 31 * result + name.hashCode();
-        return result;
-    }
-
-
-    @Override
-    public String toString() {
-        return "CollectionContextImpl{" +
-                "applicationId=" + applicationId +
-                ", ownerId=" + ownerId +
-                ", name='" + name + '\'' +
-                '}';
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/CollectionManager.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/CollectionManager.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/CollectionManager.java
index 570a1e4..53c14d6 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/CollectionManager.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/CollectionManager.java
@@ -20,14 +20,14 @@ public interface CollectionManager
      *
      * @param entity The entity to update
      */
-    public void create( Entity entity );
+    public Entity create( Entity entity );
 
     /**
      * Update the entity with the given fields.
      *
      * @param entity The entity properties to update
      */
-    public void update( Entity entity );
+    public Entity update( Entity entity );
 
     /** Delete the entity and remove it's indexes with the given entity id */
     public void delete( UUID entityId );

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/CollectionManagerFactoryImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/CollectionManagerFactoryImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/CollectionManagerFactoryImpl.java
deleted file mode 100644
index 3ce0e7b..0000000
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/CollectionManagerFactoryImpl.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package org.apache.usergrid.persistence.collection;
-
-
-/**
- * Basic Imple
- * @author tnine
- */
-public class CollectionManagerFactoryImpl implements CollectionManagerFactory {
-
-
-    @Override
-    public CollectionManager createCollectionManager( final CollectionContext context ) {
-//        return new CollectionManagerImpl( context );
-        return null;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/CollectionManagerImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/CollectionManagerImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/CollectionManagerImpl.java
deleted file mode 100644
index b5f0afb..0000000
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/CollectionManagerImpl.java
+++ /dev/null
@@ -1,81 +0,0 @@
-package org.apache.usergrid.persistence.collection;
-
-
-import java.util.UUID;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import org.apache.commons.beanutils.BeanUtils;
-
-import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntityImpl;
-import org.apache.usergrid.persistence.model.entity.Entity;
-import org.apache.usergrid.persistence.model.util.UUIDGenerator;
-
-
-/**
- * Simple implementation.  Should perform
- * @author tnine
- */
-public class CollectionManagerImpl implements CollectionManager {
-
-    private static final Logger logger = LoggerFactory.getLogger(CollectionManagerImpl.class);
-
-    private final CollectionContext context;
-    private final TimeService timeService;
-
-
-
-    public CollectionManagerImpl( final CollectionContext context, final TimeService timeService ) {
-        this.context = context;
-        this.timeService = timeService;
-    }
-
-
-    @Override
-    public void create( final Entity entity ) {
-
-        final UUID entityId = UUIDGenerator.newTimeUUID();
-        final UUID version = entityId;
-        final long created = timeService.getTime();
-
-
-        try {
-            BeanUtils.setProperty(entity, "uuid", entityId);
-        }
-        catch ( Throwable t ) {
-            logger.error( "Unable to set uuid.  See nested exception", t );
-            throw new RuntimeException( "Unable to set uuid.  See nested exception", t );
-        }
-
-        entity.setVersion( version );
-        entity.setCreated( created );
-        entity.setUpdated( created );
-
-        MvccEntityImpl mvccEntity = new MvccEntityImpl(context, entityId, version, entity   );
-
-
-
-    }
-
-
-    @Override
-    public void update( final Entity entity ) {
-        //To change body of implemented methods use File | Settings | File Templates.
-    }
-
-
-    @Override
-    public void delete( final UUID entityId ) {
-        //To change body of implemented methods use File | Settings | File Templates.
-    }
-
-
-    @Override
-    public Entity load( final UUID entityId ) {
-        return null;  //To change body of implemented methods use File | Settings | File Templates.
-    }
-
-
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/TimeService.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/TimeService.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/TimeService.java
deleted file mode 100644
index eea1e36..0000000
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/TimeService.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package org.apache.usergrid.persistence.collection;
-
-
-/** @author tnine */
-public interface TimeService {
-
-    /**
-     * Get the current time in milliseconds since epoch
-     * @return
-     */
-    long getTime();
-}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/exception/CollectionRuntimeException.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/exception/CollectionRuntimeException.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/exception/CollectionRuntimeException.java
new file mode 100644
index 0000000..9696bc1
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/exception/CollectionRuntimeException.java
@@ -0,0 +1,29 @@
+package org.apache.usergrid.persistence.collection.exception;
+
+
+/** @author tnine */
+public class CollectionRuntimeException extends RuntimeException {
+    public CollectionRuntimeException() {
+    }
+
+
+    public CollectionRuntimeException( final String message ) {
+        super( message );
+    }
+
+
+    public CollectionRuntimeException( final String message, final Throwable cause ) {
+        super( message, cause );
+    }
+
+
+    public CollectionRuntimeException( final Throwable cause ) {
+        super( cause );
+    }
+
+
+    public CollectionRuntimeException( final String message, final Throwable cause, final boolean enableSuppression,
+                                       final boolean writableStackTrace ) {
+        super( message, cause, enableSuppression, writableStackTrace );
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/guice/CollectionModule.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/guice/CollectionModule.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/guice/CollectionModule.java
index 5f5d544..80f48d7 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/guice/CollectionModule.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/guice/CollectionModule.java
@@ -1,24 +1,15 @@
 package org.apache.usergrid.persistence.collection.guice;
 
 
+import java.util.Properties;
+
 import org.apache.usergrid.persistence.collection.astynax.AstynaxKeyspaceProvider;
-import org.apache.usergrid.persistence.collection.migration.Migration;
-import org.apache.usergrid.persistence.collection.migration.MigrationManager;
-import org.apache.usergrid.persistence.collection.migration.MigrationManagerImpl;
-import org.apache.usergrid.persistence.collection.mvcc.stage.StagePipeline;
-import org.apache.usergrid.persistence.collection.mvcc.stage.impl.CreatePipeline;
-import org.apache.usergrid.persistence.collection.mvcc.stage.impl.DeletePipeline;
-import org.apache.usergrid.persistence.collection.mvcc.stage.impl.UpdatePipeline;
-import org.apache.usergrid.persistence.collection.serialization.MvccEntitySerializationStrategy;
-import org.apache.usergrid.persistence.collection.serialization.MvccEntitySerializationStrategyImpl;
-import org.apache.usergrid.persistence.collection.serialization.MvccLogEntrySerializationStrategy;
-import org.apache.usergrid.persistence.collection.serialization.MvccLogEntrySerializationStrategyImpl;
+import org.apache.usergrid.persistence.collection.mvcc.stage.impl.CollectionPipelineModule;
+import org.apache.usergrid.persistence.collection.serialization.impl.SerializationModule;
+import org.apache.usergrid.persistence.collection.service.impl.ServiceModule;
 
 import com.google.inject.AbstractModule;
-import com.google.inject.Provides;
-import com.google.inject.multibindings.Multibinder;
 import com.google.inject.name.Names;
-import com.netflix.astyanax.Keyspace;
 
 
 /**
@@ -35,56 +26,33 @@ public class CollectionModule extends AbstractModule {
     @Override
     protected void configure() {
 
+        /**
+         * Load our properties for the entire colleciton module
+         *
+         */
 
         //bind our cassandra properties
-        Names.bindProperties( binder(), PropertyUtils.loadFromClassPath( CASS_PROPS ) );
+
+        Properties props = PropertyUtils.loadFromClassPath( CASS_PROPS );
+
+        Names.bindProperties( binder(), props );
 
         //Load the cassandra url if set on the system properties
         Names.bindProperties( binder(),
                 PropertyUtils.loadSystemProperties( AstynaxKeyspaceProvider.getRuntimeOptions() ) );
 
-        //bind our keyspace to the AstynaxKeyspaceProvider
-        bind( Keyspace.class ).toProvider( AstynaxKeyspaceProvider.class );
-
-        //bind our migration manager
-        bind( MigrationManager.class ).to( MigrationManagerImpl.class );
-
-
-        //bind the serialization strategies
-
-        bind( MvccEntitySerializationStrategy.class ).to( MvccEntitySerializationStrategyImpl.class );
-
 
-        bind( MvccLogEntrySerializationStrategy.class ).to( MvccLogEntrySerializationStrategyImpl.class );
+        //TODO allow override of all properties in the file by the system
 
 
-        //do multibindings for migrations
-        Multibinder<Migration> uriBinder = Multibinder.newSetBinder( binder(), Migration.class );
-
-        uriBinder.addBinding().to( MvccEntitySerializationStrategyImpl.class );
-        uriBinder.addBinding().to( MvccLogEntrySerializationStrategyImpl.class );
-    }
-
-
-    /** Wire the pipeline of operations for create.  This should create a new
-     * instance every time, since StagePipeline objects are mutable */
-    @Provides
-    @CreatePipeline
-    public StagePipeline createWritePipeline() {
-        return null;  //To change body of created methods use File | Settings | File Templates.
-    }
-
-
-    @Provides
-    @DeletePipeline
-    public StagePipeline deletePipeline() {
-        return null;  //To change body of created methods use File | Settings | File Templates.
-    }
+        /**
+         * Install the write pipeline configuration
+         */
+        install( new CollectionPipelineModule() );
 
+        //Install serialization modules
+        install( new SerializationModule());
 
-    @Provides
-    @UpdatePipeline
-    public StagePipeline updatePipeline() {
-        return null;  //To change body of created methods use File | Settings | File Templates.
+        install (new ServiceModule());
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/impl/CollectionContextImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/impl/CollectionContextImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/impl/CollectionContextImpl.java
new file mode 100644
index 0000000..5f2d334
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/impl/CollectionContextImpl.java
@@ -0,0 +1,95 @@
+package org.apache.usergrid.persistence.collection.impl;
+
+
+import java.util.UUID;
+
+import org.apache.usergrid.persistence.collection.CollectionContext;
+
+import com.google.common.base.Preconditions;
+
+
+/**
+ * Simple impl of hte collection context
+ * @author tnine
+ */
+public class CollectionContextImpl implements CollectionContext {
+
+    private final UUID applicationId;
+    private final UUID ownerId;
+    private final String name;
+
+
+    public CollectionContextImpl( final UUID applicationId, final UUID ownerId, final String name ) {
+        Preconditions.checkNotNull( applicationId , "applicationId is required");
+        Preconditions.checkNotNull( ownerId , "ownerId is required");
+        Preconditions.checkNotNull( name , "name is required");
+        Preconditions.checkArgument( name.length() > 0, "name must have a length" );
+
+
+        this.applicationId = applicationId;
+        this.ownerId = ownerId;
+        this.name = name;
+    }
+
+
+    @Override
+    public UUID getApplication() {
+        return applicationId;
+    }
+
+
+    @Override
+    public UUID getOwner() {
+        return ownerId;
+    }
+
+
+    @Override
+    public String getName() {
+        return name;
+    }
+
+
+    @Override
+    public boolean equals( final Object o ) {
+        if ( this == o ) {
+            return true;
+        }
+        if ( o == null || getClass() != o.getClass() ) {
+            return false;
+        }
+
+        final CollectionContextImpl that = ( CollectionContextImpl ) o;
+
+        if ( !applicationId.equals( that.applicationId ) ) {
+            return false;
+        }
+        if ( !name.equals( that.name ) ) {
+            return false;
+        }
+        if ( !ownerId.equals( that.ownerId ) ) {
+            return false;
+        }
+
+        return true;
+    }
+
+
+    @Override
+    public int hashCode() {
+        int result = applicationId.hashCode();
+        result = 31 * result + ownerId.hashCode();
+        result = 31 * result + name.hashCode();
+        return result;
+    }
+
+
+    @Override
+    public String toString() {
+        return "CollectionContextImpl{" +
+                "applicationId=" + applicationId +
+                ", ownerId=" + ownerId +
+                ", name='" + name + '\'' +
+                '}';
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/impl/CollectionManagerFactoryImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/impl/CollectionManagerFactoryImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/impl/CollectionManagerFactoryImpl.java
new file mode 100644
index 0000000..2ab0761
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/impl/CollectionManagerFactoryImpl.java
@@ -0,0 +1,21 @@
+package org.apache.usergrid.persistence.collection.impl;
+
+
+import org.apache.usergrid.persistence.collection.CollectionContext;
+import org.apache.usergrid.persistence.collection.CollectionManager;
+import org.apache.usergrid.persistence.collection.CollectionManagerFactory;
+
+
+/**
+ * Basic Imple
+ * @author tnine
+ */
+public class CollectionManagerFactoryImpl implements CollectionManagerFactory {
+
+
+    @Override
+    public CollectionManager createCollectionManager( final CollectionContext context ) {
+//        return new CollectionManagerImpl( context );
+        return null;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/impl/CollectionManagerImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/impl/CollectionManagerImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/impl/CollectionManagerImpl.java
new file mode 100644
index 0000000..72ed6ce
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/impl/CollectionManagerImpl.java
@@ -0,0 +1,77 @@
+package org.apache.usergrid.persistence.collection.impl;
+
+
+import java.util.UUID;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.usergrid.persistence.collection.CollectionContext;
+import org.apache.usergrid.persistence.collection.CollectionManager;
+import org.apache.usergrid.persistence.collection.service.TimeService;
+import org.apache.usergrid.persistence.collection.mvcc.stage.WriteContext;
+import org.apache.usergrid.persistence.collection.mvcc.stage.WriteContextFactory;
+import org.apache.usergrid.persistence.model.entity.Entity;
+
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+
+
+/**
+ * Simple implementation.  Should perform
+ *
+ * @author tnine
+ */
+public class CollectionManagerImpl implements CollectionManager {
+
+    private static final Logger logger = LoggerFactory.getLogger( CollectionManagerImpl.class );
+
+    private final CollectionContext context;
+    private final TimeService timeService;
+    private final WriteContextFactory factory;
+
+
+    @Inject
+    public CollectionManagerImpl( final TimeService timeService, final WriteContextFactory factory,
+                                  @Assisted final CollectionContext context ) {
+        this.context = context;
+        this.timeService = timeService;
+        this.factory = factory;
+    }
+
+
+    @Override
+    public Entity create( final Entity entity ) {
+        // Create a new context for the write
+        WriteContext writeContext = factory.newCreateContext( context );
+
+        //perform the write
+        writeContext.performWrite( entity );
+
+        //TODO this shouldn't block, give a callback
+        return writeContext.getMessage( Entity.class );
+
+    }
+
+
+    @Override
+    public Entity update( final Entity entity ) {
+       return null;
+    }
+
+
+    @Override
+    public void delete( final UUID entityId ) {
+        WriteContext deleteContext = factory.newDeleteContext(context);
+
+        deleteContext.performWrite( entityId );
+
+        deleteContext.getMessage(Void.class);
+    }
+
+
+    @Override
+    public Entity load( final UUID entityId ) {
+        return null;  //To change body of implemented methods use File | Settings | File Templates.
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/entity/MvccEntity.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/entity/MvccEntity.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/entity/MvccEntity.java
index 3e544ad..cc212c8 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/entity/MvccEntity.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/entity/MvccEntity.java
@@ -31,8 +31,4 @@ public interface MvccEntity {
      */
     UUID getUuid();
 
-    /**
-     * Get the collection context this entity belongs i
-     */
-    CollectionContext getContext();
 }

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/entity/MvccEntityImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/entity/MvccEntityImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/entity/MvccEntityImpl.java
deleted file mode 100644
index b85b314..0000000
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/entity/MvccEntityImpl.java
+++ /dev/null
@@ -1,110 +0,0 @@
-package org.apache.usergrid.persistence.collection.mvcc.entity;
-
-
-import java.util.UUID;
-
-import org.apache.usergrid.persistence.collection.CollectionContext;
-import org.apache.usergrid.persistence.model.entity.Entity;
-
-import com.google.common.base.Optional;
-import com.google.common.base.Preconditions;
-
-
-/** @author tnine */
-public class MvccEntityImpl implements MvccEntity {
-
-    private final CollectionContext context;
-    private final UUID entityId;
-    private final UUID version;
-    private final Optional<Entity> entity;
-
-
-    public MvccEntityImpl( final CollectionContext context, final UUID entityId, final UUID version,
-                           final Entity entity ) {
-        this( context, entityId, version, Optional.of( entity ) );
-    }
-
-
-    public MvccEntityImpl( final CollectionContext context, final UUID entityId, final UUID version,
-                           final Optional<Entity> entity ) {
-        Preconditions.checkNotNull( context, "context is required" );
-        Preconditions.checkNotNull( entityId, "entity id is required" );
-        Preconditions.checkNotNull( version, "version id is required" );
-        Preconditions.checkNotNull( entity, "entity  is required" );
-
-        this.context = context;
-        this.entityId = entityId;
-        this.version = version;
-        this.entity = entity;
-    }
-
-
-    @Override
-    public Optional<Entity> getEntity() {
-        return entity;
-    }
-
-
-    @Override
-    public UUID getVersion() {
-        return version;
-    }
-
-
-    @Override
-    public UUID getUuid() {
-        return entityId;
-    }
-
-
-    @Override
-    public CollectionContext getContext() {
-        return context;
-    }
-
-
-    @Override
-    public boolean equals( final Object o ) {
-        if ( this == o ) {
-            return true;
-        }
-        if ( o == null || getClass() != o.getClass() ) {
-            return false;
-        }
-
-        final MvccEntityImpl that = ( MvccEntityImpl ) o;
-
-        if ( !context.equals( that.context ) ) {
-            return false;
-        }
-        if ( !getUuid().equals( that.getUuid() ) ) {
-            return false;
-        }
-
-        if ( !getVersion().equals( that.getVersion() ) ) {
-            return false;
-        }
-
-        return true;
-    }
-
-
-    @Override
-    public int hashCode() {
-        int result = context.hashCode();
-        result = 31 * result + getUuid().hashCode();
-        result = 31 * result + getVersion().hashCode();
-        return result;
-    }
-
-
-    @Override
-    public String toString() {
-        return "MvccEntityImpl{" +
-                "context=" + context +
-                ", entityId=" + entityId +
-                ", version=" + version +
-                ", entity=" + entity +
-                '}';
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/entity/MvccLogEntry.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/entity/MvccLogEntry.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/entity/MvccLogEntry.java
index 40ff498..c6886d1 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/entity/MvccLogEntry.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/entity/MvccLogEntry.java
@@ -29,10 +29,5 @@ public interface MvccLogEntry {
      */
     UUID getVersion();
 
-    /**
-     * Get the context of the entity
-     * @return
-     */
-    CollectionContext getContext();
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/entity/MvccLogEntryImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/entity/MvccLogEntryImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/entity/MvccLogEntryImpl.java
deleted file mode 100644
index 91e68ef..0000000
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/entity/MvccLogEntryImpl.java
+++ /dev/null
@@ -1,113 +0,0 @@
-package org.apache.usergrid.persistence.collection.mvcc.entity;
-
-
-import java.util.UUID;
-
-import org.apache.usergrid.persistence.collection.CollectionContext;
-
-import com.google.common.base.Preconditions;
-
-
-/**
- * The simple implementation of a log entry
- *
- * @author tnine
- */
-public class MvccLogEntryImpl implements MvccLogEntry {
-
-    private final CollectionContext context;
-    private final UUID entityId;
-    private final UUID version;
-    private final Stage stage;
-
-
-    public MvccLogEntryImpl( final CollectionContext context, final UUID entityId, final UUID version,
-                             final Stage stage ) {
-
-        Preconditions.checkNotNull( context, "context is required" );
-        Preconditions.checkNotNull( entityId, "entity id is required" );
-        Preconditions.checkNotNull( version, "version id is required" );
-        Preconditions.checkNotNull( stage, "entity  is required" );
-
-
-        this.context = context;
-        this.entityId = entityId;
-        this.version = version;
-        this.stage = stage;
-    }
-
-
-    @Override
-    public Stage getStage() {
-        return stage;
-    }
-
-
-    @Override
-    public UUID getEntityId() {
-        return entityId;
-    }
-
-
-    @Override
-    public UUID getVersion() {
-        return version;
-    }
-
-
-    @Override
-    public CollectionContext getContext() {
-        return context;
-    }
-
-
-    @Override
-    public boolean equals( final Object o ) {
-        if ( this == o ) {
-            return true;
-        }
-        if ( o == null || getClass() != o.getClass() ) {
-            return false;
-        }
-
-        final MvccLogEntryImpl that = ( MvccLogEntryImpl ) o;
-
-        if ( !context.equals( that.context ) ) {
-            return false;
-        }
-        if ( !entityId.equals( that.entityId ) ) {
-            return false;
-        }
-        if ( !version.equals( that.version ) ) {
-            return false;
-        }
-
-        if ( stage != that.stage ) {
-            return false;
-        }
-
-
-        return true;
-    }
-
-
-    @Override
-    public int hashCode() {
-        int result = context.hashCode();
-        result = 31 * result + entityId.hashCode();
-        result = 31 * result + version.hashCode();
-        result = 31 * result + stage.hashCode();
-        return result;
-    }
-
-
-    @Override
-    public String toString() {
-        return "MvccLogEntryImpl{" +
-                "context=" + context +
-                ", entityId=" + entityId +
-                ", version=" + version +
-                ", stage=" + stage +
-                '}';
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/entity/impl/MvccEntityImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/entity/impl/MvccEntityImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/entity/impl/MvccEntityImpl.java
new file mode 100644
index 0000000..1179dad
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/entity/impl/MvccEntityImpl.java
@@ -0,0 +1,98 @@
+package org.apache.usergrid.persistence.collection.mvcc.entity.impl;
+
+
+import java.util.UUID;
+
+import org.apache.usergrid.persistence.collection.CollectionContext;
+import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntity;
+import org.apache.usergrid.persistence.model.entity.Entity;
+
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
+
+
+/** @author tnine */
+public class MvccEntityImpl implements MvccEntity {
+
+    private final UUID entityId;
+    private final UUID version;
+    private final Optional<Entity> entity;
+
+
+    public MvccEntityImpl( final UUID entityId, final UUID version,
+                           final Entity entity ) {
+        this(  entityId, version, Optional.of( entity ) );
+    }
+
+
+    public MvccEntityImpl( final UUID entityId, final UUID version,
+                           final Optional<Entity> entity ) {
+        Preconditions.checkNotNull( entityId, "entity id is required" );
+        Preconditions.checkNotNull( version, "version id is required" );
+        Preconditions.checkNotNull( entity, "entity  is required" );
+
+        this.entityId = entityId;
+        this.version = version;
+        this.entity = entity;
+    }
+
+
+    @Override
+    public Optional<Entity> getEntity() {
+        return entity;
+    }
+
+
+    @Override
+    public UUID getVersion() {
+        return version;
+    }
+
+
+    @Override
+    public UUID getUuid() {
+        return entityId;
+    }
+
+
+
+    @Override
+    public boolean equals( final Object o ) {
+        if ( this == o ) {
+            return true;
+        }
+        if ( o == null || getClass() != o.getClass() ) {
+            return false;
+        }
+
+        final MvccEntityImpl that = ( MvccEntityImpl ) o;
+
+        if ( !getUuid().equals( that.getUuid() ) ) {
+            return false;
+        }
+
+        if ( !getVersion().equals( that.getVersion() ) ) {
+            return false;
+        }
+
+        return true;
+    }
+
+
+    @Override
+    public int hashCode() {
+        int result = 31 *  getUuid().hashCode();
+        result = 31 * result + getVersion().hashCode();
+        return result;
+    }
+
+
+    @Override
+    public String toString() {
+        return "MvccEntityImpl{" +
+                ", entityId=" + entityId +
+                ", version=" + version +
+                ", entity=" + entity +
+                '}';
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/entity/impl/MvccLogEntryImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/entity/impl/MvccLogEntryImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/entity/impl/MvccLogEntryImpl.java
new file mode 100644
index 0000000..2f0b4d7
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/entity/impl/MvccLogEntryImpl.java
@@ -0,0 +1,100 @@
+package org.apache.usergrid.persistence.collection.mvcc.entity.impl;
+
+
+import java.util.UUID;
+
+import org.apache.usergrid.persistence.collection.CollectionContext;
+import org.apache.usergrid.persistence.collection.mvcc.entity.MvccLogEntry;
+import org.apache.usergrid.persistence.collection.mvcc.entity.Stage;
+
+import com.google.common.base.Preconditions;
+
+
+/**
+ * The simple implementation of a log entry
+ *
+ * @author tnine
+ */
+public class MvccLogEntryImpl implements MvccLogEntry {
+
+    private final UUID entityId;
+    private final UUID version;
+    private final Stage stage;
+
+
+    public MvccLogEntryImpl( final UUID entityId, final UUID version,
+                             final Stage stage ) {
+        Preconditions.checkNotNull( entityId, "entity id is required" );
+        Preconditions.checkNotNull( version, "version id is required" );
+        Preconditions.checkNotNull( stage, "entity  is required" );
+
+
+        this.entityId = entityId;
+        this.version = version;
+        this.stage = stage;
+    }
+
+
+    @Override
+    public Stage getStage() {
+        return stage;
+    }
+
+
+    @Override
+    public UUID getEntityId() {
+        return entityId;
+    }
+
+
+    @Override
+    public UUID getVersion() {
+        return version;
+    }
+
+
+    @Override
+    public boolean equals( final Object o ) {
+        if ( this == o ) {
+            return true;
+        }
+        if ( o == null || getClass() != o.getClass() ) {
+            return false;
+        }
+
+        final MvccLogEntryImpl that = ( MvccLogEntryImpl ) o;
+
+        if ( !entityId.equals( that.entityId ) ) {
+            return false;
+        }
+        if ( !version.equals( that.version ) ) {
+            return false;
+        }
+
+        if ( stage != that.stage ) {
+            return false;
+        }
+
+
+        return true;
+    }
+
+
+    @Override
+    public int hashCode() {
+        int result = 31 * entityId.hashCode();
+        result = 31 * result + version.hashCode();
+        result = 31 * result + stage.hashCode();
+        return result;
+    }
+
+
+    @Override
+    public String toString() {
+        return "MvccLogEntryImpl{" +
+                ", entityId=" + entityId +
+                ", version=" + version +
+                ", stage=" + stage +
+                '}';
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/event/PostProcessListener.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/event/PostProcessListener.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/event/PostProcessListener.java
index 47ad997..29e6515 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/event/PostProcessListener.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/event/PostProcessListener.java
@@ -9,16 +9,16 @@ import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntity;
  * @author: tnine
  *
  */
-public interface PostProcessListener<T extends MvccEntity>
+public interface PostProcessListener<T>
 {
 
 
     /**
      * The entity was rejected by the MVCC system and will be removed
      *
-     * @param mvccEntity The mvcc entity to perform post processing on
+     * @param data The data used in the write pipeline
      * @return the MvccEntity to use during this stage
      */
-    public MvccEntity doPostProcessing(MvccEntity mvccEntity );
+    public T doPostProcessing(T data );
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/MvccStrategy.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/MvccStrategy.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/MvccStrategy.java
deleted file mode 100644
index c11f420..0000000
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/MvccStrategy.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package org.apache.usergrid.persistence.collection.mvcc.stage;
-
-
-import java.util.UUID;
-
-import org.apache.usergrid.persistence.collection.CollectionContext;
-import org.apache.usergrid.persistence.model.entity.Entity;
-
-
-/**
- * Interface to define mvcc operations
- *
- * TODO: Not sure we need this any more
- */
-public interface MvccStrategy {
-
-    /**
-     * Start progress through states for this entity
-     *
-     * @param context The context this entity belongs in
-     * @param entityId The entity id to assign to this entity
-     * @param entity The entity values to write
-     */
-    public WriteStage beingWrite( CollectionContext context, UUID entityId, Entity entity );
-
-
-    /**
-     * Get the current stage of the entity in the context at the current version.  Should be used for write verification
-     * on resume
-     *
-     * @param context The context this entity belongs in
-     * @param entityId The entity Id to search for in the context
-     * @param version The version of the entityId to review
-     */
-    public WriteStage getCurrentState( CollectionContext context, UUID entityId, UUID version );
-
-
-    /**
-     * Get the write stage of the entity in the context with a version <= the current version and a stage of Comitted
-     */
-    public WriteStage getCurrentStateOfEntity( CollectionContext context, UUID entityId, UUID maxVersion );
-}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/StagePipeline.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/StagePipeline.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/StagePipeline.java
index 562d852..7e88915 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/StagePipeline.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/StagePipeline.java
@@ -11,9 +11,9 @@ public interface StagePipeline {
 
 
     /**
-     * Get the next stage in this pipeline.  Will return null if there are no more stages to execute
+     * Get the first stage in this pipeline.  Will return null if there are no more stages to execute
      */
-    public WriteStage next();
+    WriteStage first();
 
 
     /**
@@ -22,15 +22,34 @@ public interface StagePipeline {
      *
      * @param stage
      */
-    public void insert(WriteStage stage);
+    void insert(WriteStage stage);
 
 
     /**
      * Add a new stage to the end of the pipline
      * @param stage
      */
-    public void addLast(WriteStage stage);
+    void addLast(WriteStage stage);
 
 
+    /**
+     * get the next stage after this one
+     * @param stage
+     */
+    WriteStage nextStage(WriteStage stage);
+
+
+    /**
+     * Get the last stage in this pipeline
+     * @return
+     */
+    WriteStage last();
+
+    /**
+     * Get the current stage in the pipeline
+     * @return
+     */
+    WriteStage current();
+
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/WriteContext.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/WriteContext.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/WriteContext.java
index 42cb6ab..4f5d82a 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/WriteContext.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/WriteContext.java
@@ -1,7 +1,12 @@
 package org.apache.usergrid.persistence.collection.mvcc.stage;
 
 
+import java.util.Collection;
+import java.util.List;
+
+import org.apache.usergrid.persistence.collection.CollectionContext;
 import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntity;
+import org.apache.usergrid.persistence.collection.mvcc.event.PostProcessListener;
 
 
 /** @author tnine */
@@ -16,9 +21,46 @@ public interface WriteContext {
 
     /**
      * Perform the write in the context with the specified entity
-     * @param entity
+     * @param inputData The data to use to being the write
+     */
+    void performWrite(Object inputData);
+
+
+    /**
+     * Get the current message.  If the message is not the right type at runtime, an assertion exception will be thrown
+     * @return
+     */
+    <T> T getMessage(Class<T> clazz);
+
+    /**
+     * Set the message into the write context
+     * @return
+     */
+    Object setMessage(Object object);
+
+
+    /**
+     * Signal that the next stage in the write should proceed
+     */
+    void proceed();
+
+    /**
+     * Signal we should stop processing
+     */
+    void stop();
+
+
+    /**
+     * Add a post process listener to this write context
+     * @return  A list of all post proces
+     */
+    Collection<PostProcessListener> getPostProcessors();
+
+    /**
+     * Return the current collection context
+     * @return
      */
-    void nextStage(MvccEntity entity);
+    CollectionContext getCollectionContext();
 
 
 

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/WriteContextFactory.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/WriteContextFactory.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/WriteContextFactory.java
new file mode 100644
index 0000000..99da0fb
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/WriteContextFactory.java
@@ -0,0 +1,30 @@
+package org.apache.usergrid.persistence.collection.mvcc.stage;
+
+
+import java.util.UUID;
+
+import org.apache.usergrid.persistence.collection.CollectionContext;
+import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntity;
+import org.apache.usergrid.persistence.model.entity.Entity;
+
+
+/** @author tnine */
+public interface WriteContextFactory {
+
+    /**
+     * Return a new write context for the given stage pipeline
+     * @param
+     * @return A write context that can be used for creating entities.  Returns the new entity to use after
+     * the write has completed
+     */
+    WriteContext newCreateContext(CollectionContext context);
+
+    /**
+     * Create a write context that cna be used for deleting entitie
+     * @return
+     */
+    WriteContext newDeleteContext(CollectionContext context);
+
+
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/WriteStage.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/WriteStage.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/WriteStage.java
index a45df6b..3f80348 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/WriteStage.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/WriteStage.java
@@ -9,17 +9,18 @@ import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
 /**
  * The possible stages in our write flow.
  */
-public interface WriteStage {
+public interface WriteStage{
 
     /**
      * Run this stage.  This will return the MvccEntity that should be returned or passed to the next stage
      *
      *
      * @param context The context of the current write operation
-     * @param entity The entity to use in this stage
      *
      * @return The asynchronous listener to signal success
      *
      */
-    public void performStage( WriteContext context, MvccEntity entity ) throws ConnectionException;
+    public void performStage( WriteContext context);
+
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/CollectionPipelineModule.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/CollectionPipelineModule.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/CollectionPipelineModule.java
index 809d92f..16735ca 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/CollectionPipelineModule.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/CollectionPipelineModule.java
@@ -1,13 +1,20 @@
 package org.apache.usergrid.persistence.collection.mvcc.stage.impl;
 
 
+import org.apache.usergrid.persistence.collection.migration.Migration;
+import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntity;
 import org.apache.usergrid.persistence.collection.mvcc.stage.StagePipeline;
+import org.apache.usergrid.persistence.collection.mvcc.stage.WriteStage;
 import org.apache.usergrid.persistence.collection.serialization.MvccEntitySerializationStrategy;
 import org.apache.usergrid.persistence.collection.serialization.MvccLogEntrySerializationStrategy;
+import org.apache.usergrid.persistence.collection.serialization.impl.MvccEntitySerializationStrategyImpl;
+import org.apache.usergrid.persistence.collection.serialization.impl.MvccLogEntrySerializationStrategyImpl;
 
 import com.google.inject.AbstractModule;
 import com.google.inject.Inject;
 import com.google.inject.Provides;
+import com.google.inject.assistedinject.FactoryModuleBuilder;
+import com.google.inject.multibindings.Multibinder;
 
 
 /**
@@ -17,38 +24,37 @@ import com.google.inject.Provides;
  */
 public class CollectionPipelineModule extends AbstractModule {
 
-    @Inject
-    private MvccLogEntrySerializationStrategy mvccLogEntrySerializationStrategy;
-
-    @Inject
-    private MvccEntitySerializationStrategy mvccEntitySerializationStrategy;
-
 
     /** Wire the pipeline of operations for create.  This should create a new
      * instance every time, since StagePipeline objects are mutable */
     @Provides
     @CreatePipeline
-    public StagePipeline createWritePipeline() {
-        return StagePipelineImpl.fromStages( new Start( mvccLogEntrySerializationStrategy ), new Write(), new Commit() );
+    @Inject
+    public StagePipeline createWritePipeline(MvccEntityNew start, MvccEntityWrite write, MvccEntityCommit commit) {
+        return StagePipelineImpl.fromStages(start, write, commit  );
     }
 
 
     @Provides
     @DeletePipeline
     public StagePipeline deletePipeline() {
-        return null;  //To change body of created methods use File | Settings | File Templates.
+        return StagePipelineImpl.fromStages(  );
     }
 
 
-    @Provides
-    @UpdatePipeline
-    public StagePipeline updatePipeline() {
-        return createWritePipeline();
-    }
-
 
     @Override
     protected void configure() {
-        //no op, we get our values from the provides above
+
+        /**
+         * Configure all stages here
+         */
+        Multibinder<WriteStage> stageBinder = Multibinder.newSetBinder( binder(), WriteStage.class );
+
+        stageBinder.addBinding().to( MvccEntityNew.class );
+        stageBinder.addBinding().to( MvccEntityWrite.class );
+        stageBinder.addBinding().to( MvccEntityCommit.class );
+
+
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Commit.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Commit.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Commit.java
deleted file mode 100644
index 378e649..0000000
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Commit.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package org.apache.usergrid.persistence.collection.mvcc.stage.impl;
-
-
-import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntity;
-import org.apache.usergrid.persistence.collection.mvcc.stage.WriteContext;
-import org.apache.usergrid.persistence.collection.mvcc.stage.WriteStage;
-
-import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
-
-
-/**
- * This phase should invoke any finalization, and mark the entity as committed in the data store before returning
- */
-public class Commit implements WriteStage {
-
-    public Commit(){
-
-    }
-
-    @Override
-    public void performStage( final WriteContext context, final MvccEntity entity ) throws ConnectionException {
-        //To change body of implemented methods use File | Settings | File Templates.
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/MvccEntityCommit.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/MvccEntityCommit.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/MvccEntityCommit.java
new file mode 100644
index 0000000..88bfca6
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/MvccEntityCommit.java
@@ -0,0 +1,28 @@
+package org.apache.usergrid.persistence.collection.mvcc.stage.impl;
+
+
+import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntity;
+import org.apache.usergrid.persistence.collection.mvcc.stage.WriteContext;
+import org.apache.usergrid.persistence.collection.mvcc.stage.WriteStage;
+
+import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
+
+
+/**
+ * This phase should invoke any finalization, and mark the entity as committed in the data store before returning
+ */
+public class MvccEntityCommit implements WriteStage {
+
+    public MvccEntityCommit(){
+
+    }
+
+
+    @Override
+    public void performStage( final WriteContext context ) {
+       //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/MvccEntityNew.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/MvccEntityNew.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/MvccEntityNew.java
new file mode 100644
index 0000000..576394a
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/MvccEntityNew.java
@@ -0,0 +1,116 @@
+package org.apache.usergrid.persistence.collection.mvcc.stage.impl;
+
+
+import java.util.UUID;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.commons.lang3.reflect.FieldUtils;
+
+import org.apache.usergrid.persistence.collection.CollectionContext;
+import org.apache.usergrid.persistence.collection.service.TimeService;
+import org.apache.usergrid.persistence.collection.exception.CollectionRuntimeException;
+import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntity;
+import org.apache.usergrid.persistence.collection.mvcc.entity.MvccLogEntry;
+import org.apache.usergrid.persistence.collection.mvcc.entity.Stage;
+import org.apache.usergrid.persistence.collection.mvcc.entity.impl.MvccEntityImpl;
+import org.apache.usergrid.persistence.collection.mvcc.entity.impl.MvccLogEntryImpl;
+import org.apache.usergrid.persistence.collection.mvcc.stage.WriteContext;
+import org.apache.usergrid.persistence.collection.mvcc.stage.WriteStage;
+import org.apache.usergrid.persistence.collection.serialization.MvccLogEntrySerializationStrategy;
+import org.apache.usergrid.persistence.collection.service.UUIDService;
+import org.apache.usergrid.persistence.model.entity.Entity;
+import org.apache.usergrid.persistence.model.util.UUIDGenerator;
+
+import com.google.common.base.Preconditions;
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.inject.Inject;
+import com.netflix.astyanax.MutationBatch;
+import com.netflix.astyanax.connectionpool.OperationResult;
+import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
+
+
+/**
+ * This is the first stage and should be invoked immediately when a write is started.  It should persist the start of a
+ * new write in the data store for a checkpoint and recovery
+ */
+public class MvccEntityNew implements WriteStage {
+
+    private static final Logger LOG = LoggerFactory.getLogger( MvccEntityNew.class );
+
+    private final MvccLogEntrySerializationStrategy logStrategy;
+    private final TimeService timeService;
+    private final UUIDService uuidService;
+
+
+
+    /** Create a new stage with the current context */
+    @Inject
+    public MvccEntityNew( final MvccLogEntrySerializationStrategy logStrategy, final TimeService timeService,
+                          final UUIDService uuidService ) {
+        this.logStrategy = logStrategy;
+        this.timeService = timeService;
+        this.uuidService = uuidService;
+    }
+
+
+    /**
+     * Create the entity Id  and inject it, as well as set the timestamp versions
+     * @param writeContext The context of the current write operation
+     */
+    @Override
+    public void performStage( final WriteContext writeContext) {
+
+        final Entity entity = writeContext.getMessage(Entity.class);
+
+        Preconditions.checkNotNull( entity, "Entity is required in the new stage of the mvcc write" );
+
+
+        final UUID entityId = uuidService.newTimeUUID();
+        final UUID version = entityId;
+        final long created = timeService.getTime();
+
+
+        try {
+            FieldUtils.writeDeclaredField( entity, "uuid", entityId );
+        }
+        catch ( Throwable t ) {
+            LOG.error( "Unable to set uuid.  See nested exception", t );
+            throw new CollectionRuntimeException( "Unable to set uuid.  See nested exception", t );
+        }
+
+        entity.setVersion( version );
+        entity.setCreated( created );
+        entity.setUpdated( created );
+
+        final CollectionContext collectionContext = writeContext.getCollectionContext();
+
+
+        final MvccLogEntry startEntry = new MvccLogEntryImpl( entityId, version, Stage.ACTIVE );
+
+        MutationBatch write = logStrategy.write(collectionContext,  startEntry );
+
+        ListenableFuture<OperationResult<Void>> future;
+
+        try {
+            future = write.executeAsync();
+        }
+        catch ( ConnectionException e ) {
+            LOG.error( "Failed to execute write asynchronously ", e );
+            throw new CollectionRuntimeException( "Failed to execute write asynchronously ", e );
+        }
+
+        //create the mvcc entity for the next stage
+        MvccEntityImpl nextStage = new MvccEntityImpl( entityId, version, entity );
+
+        writeContext.setMessage( nextStage );
+
+
+        //set the next stage to invoke on return
+        WriteContextCallback.createCallback( future, writeContext );
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/MvccEntityWrite.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/MvccEntityWrite.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/MvccEntityWrite.java
new file mode 100644
index 0000000..0e795db
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/MvccEntityWrite.java
@@ -0,0 +1,25 @@
+package org.apache.usergrid.persistence.collection.mvcc.stage.impl;
+
+
+import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntity;
+import org.apache.usergrid.persistence.collection.mvcc.stage.WriteContext;
+import org.apache.usergrid.persistence.collection.mvcc.stage.WriteStage;
+
+
+/**
+ * This phase should execute the serialization to the data store.
+ */
+public class MvccEntityWrite implements WriteStage {
+
+    /**
+     * Create a new stage with the current context
+     */
+    public MvccEntityWrite( ){
+    }
+
+
+    @Override
+    public void performStage( final WriteContext context ) {
+        //To change body of implemented methods use File | Settings | File Templates.
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/StagePipelineImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/StagePipelineImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/StagePipelineImpl.java
index b63769b..811b6eb 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/StagePipelineImpl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/StagePipelineImpl.java
@@ -5,35 +5,50 @@ import java.util.Arrays;
 import java.util.List;
 
 import org.apache.usergrid.persistence.collection.mvcc.stage.StagePipeline;
+import org.apache.usergrid.persistence.collection.mvcc.stage.WriteContext;
 import org.apache.usergrid.persistence.collection.mvcc.stage.WriteStage;
 
 
 /** @author tnine */
 public class StagePipelineImpl implements StagePipeline {
 
-    private int currentIndex = 0;
     private final List<WriteStage> stages;
+    private WriteStage current;
 
     protected StagePipelineImpl(WriteStage[] stages){
         this.stages = Arrays.asList(stages);
     }
 
     @Override
-    public WriteStage next() {
+    public WriteStage first() {
 
-        if(currentIndex < stages.size()){
+        if(stages.size() == 0){
+            return null;
+        }
+
+        return stages.get( 0 );
+    }
 
-            //get our current stage and increment
-            return stages.get( currentIndex ++);
+
+    @Override
+    public WriteStage last() {
+        if(stages.size() == 0){
+            return null;
         }
 
-       return null;
+        return stages.get( stages.size()-1 );
+    }
+
+
+    @Override
+    public WriteStage current() {
+        return current;
     }
 
 
     @Override
     public void insert( final WriteStage stage ) {
-        throw new UnsupportedOperationException("This needs written");
+        throw new UnsupportedOperationException("This needs implemented");
 
     }
 
@@ -44,6 +59,22 @@ public class StagePipelineImpl implements StagePipeline {
     }
 
 
+    @Override
+    public WriteStage nextStage( final WriteStage stage ) {
+        int index = stages.indexOf( stage );
+
+        //we're done, do nothing
+        if(index == stages.size()){
+            return null;
+        }
+
+        current = stages.get( index+1 );
+
+        return current;
+    }
+
+
+
     /**
      * Factory to create a new instance.
      * @param stages

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Start.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Start.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Start.java
deleted file mode 100644
index d86276d..0000000
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Start.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package org.apache.usergrid.persistence.collection.mvcc.stage.impl;
-
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntity;
-import org.apache.usergrid.persistence.collection.mvcc.entity.MvccLogEntry;
-import org.apache.usergrid.persistence.collection.mvcc.entity.MvccLogEntryImpl;
-import org.apache.usergrid.persistence.collection.mvcc.entity.Stage;
-import org.apache.usergrid.persistence.collection.mvcc.stage.WriteContext;
-import org.apache.usergrid.persistence.collection.mvcc.stage.WriteStage;
-import org.apache.usergrid.persistence.collection.serialization.MvccLogEntrySerializationStrategy;
-
-import com.google.common.util.concurrent.Futures;
-import com.google.common.util.concurrent.ListenableFuture;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import com.netflix.astyanax.MutationBatch;
-import com.netflix.astyanax.connectionpool.OperationResult;
-import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
-
-
-
-/**
- * This is the first stage and should be invoked immediately when a write is started.  It should persist the start of a
- * new write in the data store for a checkpoint and recovery
- */
-@Singleton
-public class Start implements WriteStage {
-
-    private static final Logger LOG = LoggerFactory.getLogger( Start.class );
-
-    private final MvccLogEntrySerializationStrategy logStrategy;
-    /**
-     * Create a new stage with the current context
-     * @param logStrategy
-     */
-    @Inject
-    public Start( final MvccLogEntrySerializationStrategy logStrategy ){
-        this.logStrategy = logStrategy;
-    }
-
-
-    @Override
-    public void performStage(final WriteContext context, final MvccEntity entity )  {
-        final MvccLogEntry startEntry = new MvccLogEntryImpl(entity.getContext(), entity.getUuid(), entity.getVersion(),Stage.ACTIVE);
-
-        MutationBatch write = logStrategy.write( startEntry );
-
-        ListenableFuture<OperationResult<Void>> future;
-
-        try {
-            future = write.executeAsync();
-        }
-        catch ( ConnectionException e ) {
-          LOG.error( "Failed to execute write asynchronously ", e );
-          throw new RuntimeException( "Failed to execute write asynchronously ", e );
-        }
-
-        //set the next stage to invoke on return
-        Futures.addCallback(future, new WriteContextCallback(context, entity));
-
-    }
-
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/UpdatePipeline.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/UpdatePipeline.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/UpdatePipeline.java
deleted file mode 100644
index 556e92c..0000000
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/UpdatePipeline.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package org.apache.usergrid.persistence.collection.mvcc.stage.impl;
-
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-import com.google.inject.BindingAnnotation;
-
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.PARAMETER;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-
-
-/**
- * Marks the update pipeline
- * @author tnine */
-@BindingAnnotation
-@Target({ FIELD, PARAMETER, METHOD }) @Retention(RUNTIME)
-public @interface UpdatePipeline {}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Write.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Write.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Write.java
deleted file mode 100644
index b45ccd5..0000000
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Write.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package org.apache.usergrid.persistence.collection.mvcc.stage.impl;
-
-
-import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntity;
-import org.apache.usergrid.persistence.collection.mvcc.stage.WriteContext;
-import org.apache.usergrid.persistence.collection.mvcc.stage.WriteStage;
-
-
-/**
- * This phase should execute the serialization to the data store.
- */
-public class Write implements WriteStage {
-
-    /**
-     * Create a new stage with the current context
-     */
-    public Write( ){
-    }
-
-
-    @Override
-    public void performStage(WriteContext context, final MvccEntity entity ) {
-
-
-
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/WriteContextCallback.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/WriteContextCallback.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/WriteContextCallback.java
index 0fa408a..e5ca9bd 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/WriteContextCallback.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/WriteContextCallback.java
@@ -1,34 +1,62 @@
 package org.apache.usergrid.persistence.collection.mvcc.stage.impl;
 
 
+import org.apache.usergrid.persistence.collection.exception.CollectionRuntimeException;
 import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntity;
 import org.apache.usergrid.persistence.collection.mvcc.stage.WriteContext;
+import org.apache.usergrid.persistence.collection.mvcc.stage.WriteStage;
 
 import com.google.common.util.concurrent.FutureCallback;
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
 import com.netflix.astyanax.connectionpool.OperationResult;
 
 
-/** @author tnine */
+/**
+ * Helper class to cause the async execution to continue
+ * @author tnine */
 public class WriteContextCallback implements FutureCallback<OperationResult<Void>> {
 
     private final WriteContext context;
-    private final MvccEntity entity;
 
 
-    public WriteContextCallback( final WriteContext context, final MvccEntity entity ) {
+    /**
+     * Create a new callback.  The data will be passed to the next stage
+     * @param context
+     */
+    private WriteContextCallback( final WriteContext context ) {
         this.context = context;
-        this.entity = entity;
     }
 
 
     public void onSuccess( final OperationResult<Void> result ) {
-        //proceed to the next stage
-        context.nextStage( entity );
+
+        /**
+         * Proceed to the next stage
+         */
+        context.proceed();
     }
 
 
     @Override
     public void onFailure( final Throwable t ) {
-        throw new RuntimeException( "Failed to execute write", t );
+        context.stop();
+        throw new CollectionRuntimeException( "Failed to execute write", t );
+    }
+
+
+    /**
+     * This encapsulated type of Void in the listenable future is intentional.  If you're not returning
+     * void in your future, you shouldn't be using this callback, you should be using a callback
+     * that will set the Response value into the next stage and invoke it
+     *
+     * @param future The listenable future returned by the Astyanax async op
+     * @param context The context to signal to continue in the callback
+     */
+    public static void createCallback( final ListenableFuture<OperationResult<Void>> future,
+                                       final WriteContext context ) {
+
+        Futures.addCallback(future, new WriteContextCallback( context ));
+
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/WriteContextFactoryImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/WriteContextFactoryImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/WriteContextFactoryImpl.java
new file mode 100644
index 0000000..f9b627f
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/WriteContextFactoryImpl.java
@@ -0,0 +1,47 @@
+package org.apache.usergrid.persistence.collection.mvcc.stage.impl;
+
+
+import java.util.Collection;
+import java.util.UUID;
+
+import org.apache.usergrid.persistence.collection.CollectionContext;
+import org.apache.usergrid.persistence.collection.mvcc.event.PostProcessListener;
+import org.apache.usergrid.persistence.collection.mvcc.stage.StagePipeline;
+import org.apache.usergrid.persistence.collection.mvcc.stage.WriteContext;
+import org.apache.usergrid.persistence.collection.mvcc.stage.WriteContextFactory;
+import org.apache.usergrid.persistence.model.entity.Entity;
+
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+
+/** @author tnine */
+@Singleton
+public class WriteContextFactoryImpl implements WriteContextFactory {
+
+    private final StagePipeline writeStage;
+    private final StagePipeline deleteStage;
+    private final Collection<PostProcessListener> postProcessListener;
+
+
+    @Inject
+    public WriteContextFactoryImpl( @CreatePipeline final StagePipeline writeStage,
+                                    @DeletePipeline final StagePipeline deleteStage,
+                                    final Collection<PostProcessListener> postProcessListener ) {
+        this.writeStage = writeStage;
+        this.deleteStage = deleteStage;
+        this.postProcessListener = postProcessListener;
+    }
+
+
+    @Override
+    public WriteContext newCreateContext(CollectionContext context) {
+        return new WriteContextImpl( postProcessListener, writeStage, context );
+    }
+
+
+    @Override
+    public WriteContext newDeleteContext(CollectionContext context) {
+        return new WriteContextImpl( postProcessListener, deleteStage, context );
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/WriteContextImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/WriteContextImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/WriteContextImpl.java
new file mode 100644
index 0000000..cbddcd1
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/WriteContextImpl.java
@@ -0,0 +1,111 @@
+package org.apache.usergrid.persistence.collection.mvcc.stage.impl;
+
+
+import java.util.Collection;
+
+import org.apache.usergrid.persistence.collection.CollectionContext;
+import org.apache.usergrid.persistence.collection.mvcc.event.PostProcessListener;
+import org.apache.usergrid.persistence.collection.mvcc.stage.StagePipeline;
+import org.apache.usergrid.persistence.collection.mvcc.stage.WriteContext;
+import org.apache.usergrid.persistence.collection.mvcc.stage.WriteStage;
+
+import com.google.common.base.Preconditions;
+import com.google.inject.Inject;
+
+
+/** @author tnine */
+public class WriteContextImpl implements WriteContext {
+
+    private final Collection<PostProcessListener> listeners;
+    private final StagePipeline pipeline;
+    private final CollectionContext context;
+
+    private Object message;
+    private WriteStage current;
+
+
+    @Inject
+    public WriteContextImpl( final Collection<PostProcessListener> listeners, final StagePipeline pipeline,
+                             final CollectionContext context ) {
+        this.listeners = listeners;
+        this.pipeline = pipeline;
+        this.context = context;
+    }
+
+
+    @Override
+    public StagePipeline getStagePipeline() {
+        return this.pipeline;
+    }
+
+
+    @Override
+    public void performWrite( Object input ) {
+
+        current = this.pipeline.first();
+
+        current.performStage( this );
+    }
+
+
+    @Override
+    public <T> T getMessage( final Class<T> clazz ) {
+        Preconditions.checkNotNull( clazz, "Class must be specified" );
+
+        if ( message == null ) {
+            return null;
+        }
+
+        if ( !clazz.isInstance( message ) ) {
+            throw new ClassCastException(
+                    "Message must be an instance of class " + clazz + ".  However it was of type '" + message.getClass()
+                            + "'" );
+        }
+
+
+        return ( T ) message;
+    }
+
+
+    @Override
+    public Object setMessage( final Object object ) {
+        Object original = message;
+
+        this.message = object;
+
+        return original;
+    }
+
+
+    @Override
+    public void proceed() {
+        WriteStage next = this.pipeline.nextStage( current );
+
+        //Nothing to do
+        if ( next == null ) {
+            return;
+        }
+
+        current = next;
+        current.performStage( this );
+    }
+
+
+    @Override
+    public void stop() {
+        //No op ATM
+        current = null;
+    }
+
+
+    @Override
+    public Collection<PostProcessListener> getPostProcessors() {
+        return listeners;
+    }
+
+
+    @Override
+    public CollectionContext getCollectionContext() {
+        return this.context;
+    }
+}


[4/5] Major refactor complete. Need to work on scheduling of futures.

Posted by to...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/MvccEntitySerializationStrategy.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/MvccEntitySerializationStrategy.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/MvccEntitySerializationStrategy.java
index 3d16fe1..f3350ad 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/MvccEntitySerializationStrategy.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/MvccEntitySerializationStrategy.java
@@ -21,7 +21,7 @@ public interface MvccEntitySerializationStrategy
      * @param entity The entity to persist
      * @return The MutationBatch operations for this update
      */
-    public MutationBatch write( MvccEntity entity );
+    public MutationBatch write(CollectionContext context, MvccEntity entity );
 
 
     /**
@@ -35,7 +35,7 @@ public interface MvccEntitySerializationStrategy
      * If the entity version has been cleared, the MvccEntity will be returned, but the optional entity
      * will not be set
      */
-    public MvccEntity load( CollectionContext context, UUID entityId, UUID version ) throws ConnectionException;
+    public MvccEntity load( CollectionContext context, UUID entityId, UUID version );
 
     /**
      * Load a list, from highest to lowest of the entity with versions <= version up to maxSize elements
@@ -48,8 +48,7 @@ public interface MvccEntitySerializationStrategy
      * @return A list of entities up to max size ordered from max(UUID)=> min(UUID).  The return value should be null safe
      * and return an empty list when there are no matches
      */
-    public List<MvccEntity> load( CollectionContext context, UUID entityId, UUID version, int maxSize )
-            throws ConnectionException;
+    public List<MvccEntity> load( CollectionContext context, UUID entityId, UUID version, int maxSize );
 
 
     /**

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/MvccEntitySerializationStrategyImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/MvccEntitySerializationStrategyImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/MvccEntitySerializationStrategyImpl.java
deleted file mode 100644
index afec2f8..0000000
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/MvccEntitySerializationStrategyImpl.java
+++ /dev/null
@@ -1,227 +0,0 @@
-package org.apache.usergrid.persistence.collection.serialization;
-
-
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.UUID;
-
-import org.apache.cassandra.db.marshal.ReversedType;
-import org.apache.cassandra.db.marshal.UUIDType;
-
-import org.apache.usergrid.persistence.collection.CollectionContext;
-import org.apache.usergrid.persistence.collection.migration.CollectionColumnFamily;
-import org.apache.usergrid.persistence.collection.migration.Migration;
-import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntity;
-import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntityImpl;
-import org.apache.usergrid.persistence.model.entity.Entity;
-
-import com.google.common.base.Optional;
-import com.google.common.base.Preconditions;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import com.netflix.astyanax.ColumnListMutation;
-import com.netflix.astyanax.Keyspace;
-import com.netflix.astyanax.MutationBatch;
-import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
-import com.netflix.astyanax.connectionpool.exceptions.NotFoundException;
-import com.netflix.astyanax.model.Column;
-import com.netflix.astyanax.model.ColumnFamily;
-import com.netflix.astyanax.model.ColumnList;
-import com.netflix.astyanax.serializers.AbstractSerializer;
-import com.netflix.astyanax.serializers.ObjectSerializer;
-import com.netflix.astyanax.serializers.UUIDSerializer;
-
-
-/** @author tnine */
-@Singleton
-public class MvccEntitySerializationStrategyImpl implements MvccEntitySerializationStrategy, Migration {
-
-
-    private static final EntitySerializer SER = new EntitySerializer();
-
-
-    private static final ColumnFamily<UUID, UUID> CF_ENTITY_DATA =
-            new ColumnFamily<UUID, UUID>( "Entity_Version_Data", UUIDSerializer.get(), UUIDSerializer.get() );
-
-
-    protected final Keyspace keyspace;
-
-
-    @Inject
-    public MvccEntitySerializationStrategyImpl( final Keyspace keyspace ) {
-        this.keyspace = keyspace;
-    }
-
-
-    @Override
-    public MutationBatch write( final MvccEntity entity ) {
-        Preconditions.checkNotNull( entity, "entity is required" );
-
-        final UUID colName = entity.getVersion();
-        final UUID entityId = entity.getUuid();
-
-        final Optional<Entity> colValue = entity.getEntity();
-
-        return doWrite( entityId, new RowOp() {
-            @Override
-            public void doOp( final ColumnListMutation<UUID> colMutation ) {
-                colMutation.putColumn( colName, SER.toByteBuffer( colValue ) );
-            }
-        } );
-    }
-
-
-    @Override
-    public MvccEntity load( final CollectionContext context, final UUID entityId, final UUID version )
-            throws ConnectionException {
-        Preconditions.checkNotNull( context, "context is required" );
-        Preconditions.checkNotNull( entityId, "entity id is required" );
-        Preconditions.checkNotNull( version, "version is required" );
-
-
-        Column<UUID> column;
-
-        try {
-            column = keyspace.prepareQuery( CF_ENTITY_DATA ).getKey( entityId ).getColumn( version ).execute()
-                             .getResult();
-        }
-
-        catch ( NotFoundException e ) {
-            //swallow, there's just no column
-            return null;
-        }
-
-
-        return new MvccEntityImpl( context, entityId, version, column.getValue( SER ) );
-    }
-
-
-    @Override
-    public List<MvccEntity> load( final CollectionContext context, final UUID entityId, final UUID version,
-                                  final int maxSize ) throws ConnectionException {
-
-        Preconditions.checkNotNull( context, "context is required" );
-        Preconditions.checkNotNull( entityId, "entity id is required" );
-        Preconditions.checkNotNull( version, "version is required" );
-        Preconditions.checkArgument( maxSize > 0, "max Size must be greater than 0" );
-
-
-        ColumnList<UUID> columns = keyspace.prepareQuery( CF_ENTITY_DATA ).getKey( entityId )
-                                           .withColumnRange( version, null, false, maxSize ).execute().getResult();
-
-
-        List<MvccEntity> results = new ArrayList<MvccEntity>( columns.size() );
-
-        for ( Column<UUID> col : columns ) {
-            results.add( new MvccEntityImpl( context, entityId, col.getName(), col.getValue( SER ) ) );
-        }
-
-        return results;
-    }
-
-
-    @Override
-    public MutationBatch clear( final CollectionContext context, final UUID entityId, final UUID version ) {
-        Preconditions.checkNotNull( context, "context is required" );
-        Preconditions.checkNotNull( entityId, "entity id is required" );
-        Preconditions.checkNotNull( version, "version is required" );
-
-        final Optional<Entity> value = Optional.absent();
-
-        return doWrite( entityId, new RowOp() {
-            @Override
-            public void doOp( final ColumnListMutation<UUID> colMutation ) {
-                colMutation.putColumn( version, SER.toByteBuffer( value ) );
-            }
-        } );
-    }
-
-
-    @Override
-    public MutationBatch delete( final CollectionContext context, final UUID entityId, final UUID version ) {
-        Preconditions.checkNotNull( context, "context is required" );
-        Preconditions.checkNotNull( entityId, "entity id is required" );
-        Preconditions.checkNotNull( version, "version is required" );
-
-
-        return doWrite( entityId, new RowOp() {
-            @Override
-            public void doOp( final ColumnListMutation<UUID> colMutation ) {
-                colMutation.deleteColumn( version );
-            }
-        } );
-    }
-
-
-    @Override
-    public Collection<CollectionColumnFamily> getColumnFamilies() {
-
-        //create the CF entity data.  We want it reversed b/c we want the most recent version at the top of the
-        //row for fast seeks
-        CollectionColumnFamily cf = new CollectionColumnFamily( CF_ENTITY_DATA,
-                ReversedType.class.getName() + "(" + UUIDType.class.getName() + ")", true );
-
-
-        return Collections.singleton( cf );
-    }
-
-
-    /** Do the write on the correct row for the entity id with the operation */
-    private MutationBatch doWrite( UUID entityId, RowOp op ) {
-        final MutationBatch batch = keyspace.prepareMutationBatch();
-
-            op.doOp( batch.withRow( CF_ENTITY_DATA, entityId ) );
-
-        return batch;
-    }
-
-
-    /** Simple callback to perform puts and deletes with a common row setup code */
-    private static interface RowOp {
-
-        /** The operation to perform on the row */
-        void doOp( ColumnListMutation<UUID> colMutation );
-    }
-
-
-    /**
-     * TODO: Serializer for the entity. This just uses object serialization, change this to use SMILE before production!
-     * We want to retain the Optional wrapper.  It helps us easily mark something as cleaned without removing the column
-     * and makes it obvious that the entity could be missing in the api
-     */
-    private static class EntitySerializer extends AbstractSerializer<Optional<Entity>> {
-
-        private static final ObjectSerializer SER = ObjectSerializer.get();
-
-        //the marker for when we're passed a "null" value
-        private static final byte[] EMPTY = new byte[] { 0x0 };
-
-
-        @Override
-        public ByteBuffer toByteBuffer( final Optional<Entity> obj ) {
-
-            //mark this version as empty
-            if ( !obj.isPresent() ) {
-                return ByteBuffer.wrap( EMPTY );
-            }
-
-            return SER.toByteBuffer( obj.get() );
-        }
-
-
-        @Override
-        public Optional<Entity> fromByteBuffer( final ByteBuffer byteBuffer ) {
-
-            final ByteBuffer check = byteBuffer.duplicate();
-
-            if ( check.remaining() == 1 && check.get() == EMPTY[0] ) {
-                return Optional.absent();
-            }
-
-            return Optional.of( ( Entity ) SER.fromByteBuffer( byteBuffer ) );
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/MvccLogEntrySerializationStrategy.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/MvccLogEntrySerializationStrategy.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/MvccLogEntrySerializationStrategy.java
index 3206e60..e79e95f 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/MvccLogEntrySerializationStrategy.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/MvccLogEntrySerializationStrategy.java
@@ -21,7 +21,7 @@ public interface MvccLogEntrySerializationStrategy
      * @param entry the entry to write
      * @return The mutation batch with the mutation operations for this write.
      */
-    public MutationBatch write( MvccLogEntry entry );
+    public MutationBatch write( final CollectionContext context, MvccLogEntry entry );
 
     /**
      * Load and return the stage with the given id and a version that is <= the version provided

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/MvccLogEntrySerializationStrategyImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/MvccLogEntrySerializationStrategyImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/MvccLogEntrySerializationStrategyImpl.java
deleted file mode 100644
index a418ecc..0000000
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/MvccLogEntrySerializationStrategyImpl.java
+++ /dev/null
@@ -1,238 +0,0 @@
-package org.apache.usergrid.persistence.collection.serialization;
-
-
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
-
-import org.apache.cassandra.db.marshal.ReversedType;
-import org.apache.cassandra.db.marshal.UUIDType;
-
-import org.apache.usergrid.persistence.collection.CollectionContext;
-import org.apache.usergrid.persistence.collection.migration.CollectionColumnFamily;
-import org.apache.usergrid.persistence.collection.migration.Migration;
-import org.apache.usergrid.persistence.collection.mvcc.entity.MvccLogEntry;
-import org.apache.usergrid.persistence.collection.mvcc.entity.MvccLogEntryImpl;
-import org.apache.usergrid.persistence.collection.mvcc.entity.Stage;
-
-import com.google.common.base.Preconditions;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import com.google.inject.name.Named;
-import com.netflix.astyanax.ColumnListMutation;
-import com.netflix.astyanax.Keyspace;
-import com.netflix.astyanax.MutationBatch;
-import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
-import com.netflix.astyanax.connectionpool.exceptions.NotFoundException;
-import com.netflix.astyanax.model.Column;
-import com.netflix.astyanax.model.ColumnFamily;
-import com.netflix.astyanax.model.ColumnList;
-import com.netflix.astyanax.serializers.AbstractSerializer;
-import com.netflix.astyanax.serializers.UUIDSerializer;
-
-
-/**
- * Simple implementation for reading and writing log entries
- *
- * @author tnine
- */
-@Singleton
-public class MvccLogEntrySerializationStrategyImpl implements MvccLogEntrySerializationStrategy, Migration {
-
-    public static final String TIMEOUT_PROP = "collection.stage.transient.timeout";
-
-    private static final StageSerializer SER = new StageSerializer();
-
-    private static final ColumnFamily<UUID, UUID> CF_ENTITY_LOG =
-            new ColumnFamily<UUID, UUID>( "Entity_Log", UUIDSerializer.get(), UUIDSerializer.get() );
-
-
-    protected final Keyspace keyspace;
-    protected final int timeout;
-
-
-    @Inject
-    public MvccLogEntrySerializationStrategyImpl( final Keyspace keyspace, @Named( TIMEOUT_PROP ) final int timeout ) {
-        this.keyspace = keyspace;
-        this.timeout = timeout;
-    }
-
-
-    @Override
-    public MutationBatch write( final MvccLogEntry entry ) {
-
-        Preconditions.checkNotNull( entry, "entry is required" );
-
-
-        final Stage stage = entry.getStage();
-        final UUID colName = entry.getVersion();
-
-        return doWrite( entry.getContext(), entry.getEntityId(), new RowOp() {
-            @Override
-            public void doOp( final ColumnListMutation<UUID> colMutation ) {
-
-                //Write the stage with a timeout, it's set as transient
-                if ( stage.isTransient() ) {
-                    colMutation.putColumn( colName, stage, SER, timeout );
-                    return;
-                }
-
-                //otherwise it's persistent, write it with no expiration
-                colMutation.putColumn( colName, stage, SER, null );
-            }
-        } );
-    }
-
-
-    @Override
-    public MvccLogEntry load( final CollectionContext context, final UUID entityId, final UUID version )
-            throws ConnectionException {
-        Preconditions.checkNotNull( context, "context is required" );
-        Preconditions.checkNotNull( entityId, "entity id is required" );
-        Preconditions.checkNotNull( version, "version is required" );
-
-
-        Column<UUID> result;
-
-        try {
-            result = keyspace.prepareQuery( CF_ENTITY_LOG ).getKey( entityId ).getColumn( version ).execute()
-                             .getResult();
-        }
-        catch ( NotFoundException nfe ) {
-            return null;
-        }
-
-
-        final Stage stage = result.getValue( SER );
-
-        return new MvccLogEntryImpl( context, entityId, version, stage );
-    }
-
-
-    @Override
-    public List<MvccLogEntry> load( final CollectionContext context, final UUID entityId, final UUID version,
-                                    final int maxSize ) throws ConnectionException {
-        Preconditions.checkNotNull( context, "context is required" );
-        Preconditions.checkNotNull( entityId, "entity id is required" );
-        Preconditions.checkNotNull( version, "version is required" );
-        Preconditions.checkArgument( maxSize > 0, "max Size must be greater than 0" );
-
-
-        ColumnList<UUID> columns = keyspace.prepareQuery( CF_ENTITY_LOG ).getKey( entityId )
-                                           .withColumnRange( version, null, false, maxSize ).execute().getResult();
-
-
-        List<MvccLogEntry> results = new ArrayList<MvccLogEntry>( columns.size() );
-
-        for ( Column<UUID> col : columns ) {
-            final UUID storedVersion = col.getName();
-            final Stage stage = col.getValue( SER );
-
-            results.add( new MvccLogEntryImpl( context, entityId, storedVersion, stage ) );
-        }
-
-        return results;
-    }
-
-
-    @Override
-    public MutationBatch delete( final CollectionContext context, final UUID entityId, final UUID version ) {
-
-        Preconditions.checkNotNull( context, "context is required" );
-        Preconditions.checkNotNull( entityId, "entityId is required" );
-        Preconditions.checkNotNull( version, "version context is required" );
-
-        return doWrite( context, entityId, new RowOp() {
-            @Override
-            public void doOp( final ColumnListMutation<UUID> colMutation ) {
-                colMutation.deleteColumn( version );
-            }
-        } );
-    }
-
-
-    @Override
-    public Collection<CollectionColumnFamily> getColumnFamilies() {
-        //create the CF entity data.  We want it reversed b/c we want the most recent version at the top of the
-        //row for fast seeks
-        CollectionColumnFamily cf = new CollectionColumnFamily( CF_ENTITY_LOG,
-                ReversedType.class.getName() + "(" + UUIDType.class.getName() + ")", true );
-
-
-        return Collections.singleton( cf );
-    }
-
-
-    /** Simple callback to perform puts and deletes with a common row setup code */
-    private static interface RowOp {
-
-        /** The operation to perform on the row */
-        void doOp( ColumnListMutation<UUID> colMutation );
-    }
-
-
-    /**
-     * Do the column update or delete for the given column and row key
-     *
-     * @param context We need to use this when getting the keyspace
-     */
-    private MutationBatch doWrite( CollectionContext context, UUID entityId, RowOp op ) {
-
-        final MutationBatch batch = keyspace.prepareMutationBatch();
-
-        op.doOp( batch.withRow( CF_ENTITY_LOG, entityId ) );
-
-        return batch;
-    }
-
-
-    /** Internal stage cache */
-    private static class StageCache {
-        private Map<Byte, Stage> values = new HashMap<Byte, Stage>( Stage.values().length );
-
-
-        private StageCache() {
-            for ( Stage stage : Stage.values() ) {
-
-                final byte stageValue = stage.getId();
-
-                values.put( stageValue, stage );
-            }
-        }
-
-
-        /** Get the stage with the byte value */
-        private Stage getStage( final byte value ) {
-            return values.get( value );
-        }
-    }
-
-
-    public static class StageSerializer extends AbstractSerializer<Stage> {
-
-        /** Used for caching the byte => stage mapping */
-        private static final StageCache CACHE = new StageCache();
-
-
-        @Override
-        public ByteBuffer toByteBuffer( final Stage obj ) {
-            ByteBuffer buff = ByteBuffer.allocate( 1 );
-            buff.put( obj.getId() );
-            buff.rewind();
-            return buff;
-        }
-
-
-        @Override
-        public Stage fromByteBuffer( final ByteBuffer byteBuffer ) {
-            final byte value  = byteBuffer.get();
-
-            return CACHE.getStage(value);
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyImpl.java
new file mode 100644
index 0000000..7a5c5c5
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyImpl.java
@@ -0,0 +1,238 @@
+package org.apache.usergrid.persistence.collection.serialization.impl;
+
+
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.UUID;
+
+import org.apache.cassandra.db.marshal.ReversedType;
+import org.apache.cassandra.db.marshal.UUIDType;
+
+import org.apache.usergrid.persistence.collection.CollectionContext;
+import org.apache.usergrid.persistence.collection.exception.CollectionRuntimeException;
+import org.apache.usergrid.persistence.collection.migration.CollectionColumnFamily;
+import org.apache.usergrid.persistence.collection.migration.Migration;
+import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntity;
+import org.apache.usergrid.persistence.collection.mvcc.entity.impl.MvccEntityImpl;
+import org.apache.usergrid.persistence.collection.serialization.MvccEntitySerializationStrategy;
+import org.apache.usergrid.persistence.model.entity.Entity;
+
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import com.netflix.astyanax.ColumnListMutation;
+import com.netflix.astyanax.Keyspace;
+import com.netflix.astyanax.MutationBatch;
+import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
+import com.netflix.astyanax.connectionpool.exceptions.NotFoundException;
+import com.netflix.astyanax.model.Column;
+import com.netflix.astyanax.model.ColumnFamily;
+import com.netflix.astyanax.model.ColumnList;
+import com.netflix.astyanax.serializers.AbstractSerializer;
+import com.netflix.astyanax.serializers.ObjectSerializer;
+import com.netflix.astyanax.serializers.UUIDSerializer;
+
+
+/** @author tnine */
+@Singleton
+public class MvccEntitySerializationStrategyImpl implements MvccEntitySerializationStrategy, Migration {
+
+
+
+    private static final EntitySerializer SER = new EntitySerializer();
+
+
+    private static final ColumnFamily<UUID, UUID> CF_ENTITY_DATA =
+            new ColumnFamily<UUID, UUID>( "Entity_Version_Data", UUIDSerializer.get(), UUIDSerializer.get() );
+
+
+    protected final Keyspace keyspace;
+
+
+    @Inject
+    public MvccEntitySerializationStrategyImpl( final Keyspace keyspace ) {
+        this.keyspace = keyspace;
+    }
+
+
+    @Override
+    public MutationBatch write(final CollectionContext context, final MvccEntity entity ) {
+        Preconditions.checkNotNull( entity, "entity is required" );
+
+        final UUID colName = entity.getVersion();
+        final UUID entityId = entity.getUuid();
+
+        final Optional<Entity> colValue = entity.getEntity();
+
+        return doWrite( entityId, new RowOp() {
+            @Override
+            public void doOp( final ColumnListMutation<UUID> colMutation ) {
+                colMutation.putColumn( colName, SER.toByteBuffer( colValue ) );
+            }
+        } );
+    }
+
+
+    @Override
+    public MvccEntity load( final CollectionContext context, final UUID entityId, final UUID version ) {
+        Preconditions.checkNotNull( context, "context is required" );
+        Preconditions.checkNotNull( entityId, "entity id is required" );
+        Preconditions.checkNotNull( version, "version is required" );
+
+
+        Column<UUID> column;
+
+        try {
+            column = keyspace.prepareQuery( CF_ENTITY_DATA ).getKey( entityId ).getColumn( version ).execute()
+                             .getResult();
+        }
+
+        catch ( NotFoundException e ) {
+            //swallow, there's just no column
+            return null;
+        }
+        catch ( ConnectionException e ) {
+            throw new CollectionRuntimeException( "An error occurred connecting to cassandra", e );
+        }
+
+
+        return new MvccEntityImpl( entityId, version, column.getValue( SER ) );
+    }
+
+
+    @Override
+    public List<MvccEntity> load( final CollectionContext context, final UUID entityId, final UUID version,
+                                  final int maxSize ) {
+
+        Preconditions.checkNotNull( context, "context is required" );
+        Preconditions.checkNotNull( entityId, "entity id is required" );
+        Preconditions.checkNotNull( version, "version is required" );
+        Preconditions.checkArgument( maxSize > 0, "max Size must be greater than 0" );
+
+
+        ColumnList<UUID> columns = null;
+        try {
+            columns = keyspace.prepareQuery( CF_ENTITY_DATA ).getKey( entityId )
+                                               .withColumnRange( version, null, false, maxSize ).execute().getResult();
+        }
+        catch ( ConnectionException e ) {
+            throw new CollectionRuntimeException( "An error occurred connecting to cassandra", e );
+        }
+
+
+        List<MvccEntity> results = new ArrayList<MvccEntity>( columns.size() );
+
+        for ( Column<UUID> col : columns ) {
+            results.add( new MvccEntityImpl( entityId, col.getName(), col.getValue( SER ) ) );
+        }
+
+        return results;
+    }
+
+
+    @Override
+    public MutationBatch clear( final CollectionContext context, final UUID entityId, final UUID version ) {
+        Preconditions.checkNotNull( context, "context is required" );
+        Preconditions.checkNotNull( entityId, "entity id is required" );
+        Preconditions.checkNotNull( version, "version is required" );
+
+        final Optional<Entity> value = Optional.absent();
+
+        return doWrite( entityId, new RowOp() {
+            @Override
+            public void doOp( final ColumnListMutation<UUID> colMutation ) {
+                colMutation.putColumn( version, SER.toByteBuffer( value ) );
+            }
+        } );
+    }
+
+
+    @Override
+    public MutationBatch delete( final CollectionContext context, final UUID entityId, final UUID version ) {
+        Preconditions.checkNotNull( context, "context is required" );
+        Preconditions.checkNotNull( entityId, "entity id is required" );
+        Preconditions.checkNotNull( version, "version is required" );
+
+
+        return doWrite( entityId, new RowOp() {
+            @Override
+            public void doOp( final ColumnListMutation<UUID> colMutation ) {
+                colMutation.deleteColumn( version );
+            }
+        } );
+    }
+
+
+    @Override
+    public Collection<CollectionColumnFamily> getColumnFamilies() {
+
+        //create the CF entity data.  We want it reversed b/c we want the most recent version at the top of the
+        //row for fast seeks
+        CollectionColumnFamily cf = new CollectionColumnFamily( CF_ENTITY_DATA,
+                ReversedType.class.getName() + "(" + UUIDType.class.getName() + ")", true );
+
+
+        return Collections.singleton( cf );
+    }
+
+
+    /** Do the write on the correct row for the entity id with the operation */
+    private MutationBatch doWrite( UUID entityId, RowOp op ) {
+        final MutationBatch batch = keyspace.prepareMutationBatch();
+
+            op.doOp( batch.withRow( CF_ENTITY_DATA, entityId ) );
+
+        return batch;
+    }
+
+
+    /** Simple callback to perform puts and deletes with a common row setup code */
+    private static interface RowOp {
+
+        /** The operation to perform on the row */
+        void doOp( ColumnListMutation<UUID> colMutation );
+    }
+
+
+    /**
+     * TODO: Serializer for the entity. This just uses object serialization, change this to use SMILE before production!
+     * We want to retain the Optional wrapper.  It helps us easily mark something as cleaned without removing the column
+     * and makes it obvious that the entity could be missing in the api
+     */
+    private static class EntitySerializer extends AbstractSerializer<Optional<Entity>> {
+
+        private static final ObjectSerializer SER = ObjectSerializer.get();
+
+        //the marker for when we're passed a "null" value
+        private static final byte[] EMPTY = new byte[] { 0x0 };
+
+
+        @Override
+        public ByteBuffer toByteBuffer( final Optional<Entity> obj ) {
+
+            //mark this version as empty
+            if ( !obj.isPresent() ) {
+                return ByteBuffer.wrap( EMPTY );
+            }
+
+            return SER.toByteBuffer( obj.get() );
+        }
+
+
+        @Override
+        public Optional<Entity> fromByteBuffer( final ByteBuffer byteBuffer ) {
+
+            final ByteBuffer check = byteBuffer.duplicate();
+
+            if ( check.remaining() == 1 && check.get() == EMPTY[0] ) {
+                return Optional.absent();
+            }
+
+            return Optional.of( ( Entity ) SER.fromByteBuffer( byteBuffer ) );
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccLogEntrySerializationStrategyImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccLogEntrySerializationStrategyImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccLogEntrySerializationStrategyImpl.java
new file mode 100644
index 0000000..1ce64aa
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccLogEntrySerializationStrategyImpl.java
@@ -0,0 +1,239 @@
+package org.apache.usergrid.persistence.collection.serialization.impl;
+
+
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+import org.apache.cassandra.db.marshal.ReversedType;
+import org.apache.cassandra.db.marshal.UUIDType;
+
+import org.apache.usergrid.persistence.collection.CollectionContext;
+import org.apache.usergrid.persistence.collection.migration.CollectionColumnFamily;
+import org.apache.usergrid.persistence.collection.migration.Migration;
+import org.apache.usergrid.persistence.collection.mvcc.entity.MvccLogEntry;
+import org.apache.usergrid.persistence.collection.mvcc.entity.impl.MvccLogEntryImpl;
+import org.apache.usergrid.persistence.collection.mvcc.entity.Stage;
+import org.apache.usergrid.persistence.collection.serialization.MvccLogEntrySerializationStrategy;
+
+import com.google.common.base.Preconditions;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import com.google.inject.name.Named;
+import com.netflix.astyanax.ColumnListMutation;
+import com.netflix.astyanax.Keyspace;
+import com.netflix.astyanax.MutationBatch;
+import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
+import com.netflix.astyanax.connectionpool.exceptions.NotFoundException;
+import com.netflix.astyanax.model.Column;
+import com.netflix.astyanax.model.ColumnFamily;
+import com.netflix.astyanax.model.ColumnList;
+import com.netflix.astyanax.serializers.AbstractSerializer;
+import com.netflix.astyanax.serializers.UUIDSerializer;
+
+
+/**
+ * Simple implementation for reading and writing log entries
+ *
+ * @author tnine
+ */
+@Singleton
+public class MvccLogEntrySerializationStrategyImpl implements MvccLogEntrySerializationStrategy, Migration {
+
+    public static final String TIMEOUT_PROP = "collection.stage.transient.timeout";
+
+    private static final StageSerializer SER = new StageSerializer();
+
+    private static final ColumnFamily<UUID, UUID> CF_ENTITY_LOG =
+            new ColumnFamily<UUID, UUID>( "Entity_Log", UUIDSerializer.get(), UUIDSerializer.get() );
+
+
+    protected final Keyspace keyspace;
+    protected final int timeout;
+
+
+    @Inject
+    public MvccLogEntrySerializationStrategyImpl( final Keyspace keyspace, @Named( TIMEOUT_PROP ) final int timeout ) {
+        this.keyspace = keyspace;
+        this.timeout = timeout;
+    }
+
+
+    @Override
+    public MutationBatch write( final CollectionContext context, final MvccLogEntry entry ) {
+
+        Preconditions.checkNotNull( entry, "entry is required" );
+
+
+        final Stage stage = entry.getStage();
+        final UUID colName = entry.getVersion();
+
+        return doWrite( context, entry.getEntityId(), new RowOp() {
+            @Override
+            public void doOp( final ColumnListMutation<UUID> colMutation ) {
+
+                //Write the stage with a timeout, it's set as transient
+                if ( stage.isTransient() ) {
+                    colMutation.putColumn( colName, stage, SER, timeout );
+                    return;
+                }
+
+                //otherwise it's persistent, write it with no expiration
+                colMutation.putColumn( colName, stage, SER, null );
+            }
+        } );
+    }
+
+
+    @Override
+    public MvccLogEntry load( final CollectionContext context, final UUID entityId, final UUID version )
+            throws ConnectionException {
+        Preconditions.checkNotNull( context, "context is required" );
+        Preconditions.checkNotNull( entityId, "entity id is required" );
+        Preconditions.checkNotNull( version, "version is required" );
+
+
+        Column<UUID> result;
+
+        try {
+            result = keyspace.prepareQuery( CF_ENTITY_LOG ).getKey( entityId ).getColumn( version ).execute()
+                             .getResult();
+        }
+        catch ( NotFoundException nfe ) {
+            return null;
+        }
+
+
+        final Stage stage = result.getValue( SER );
+
+        return new MvccLogEntryImpl( entityId, version, stage );
+    }
+
+
+    @Override
+    public List<MvccLogEntry> load( final CollectionContext context, final UUID entityId, final UUID version,
+                                    final int maxSize ) throws ConnectionException {
+        Preconditions.checkNotNull( context, "context is required" );
+        Preconditions.checkNotNull( entityId, "entity id is required" );
+        Preconditions.checkNotNull( version, "version is required" );
+        Preconditions.checkArgument( maxSize > 0, "max Size must be greater than 0" );
+
+
+        ColumnList<UUID> columns = keyspace.prepareQuery( CF_ENTITY_LOG ).getKey( entityId )
+                                           .withColumnRange( version, null, false, maxSize ).execute().getResult();
+
+
+        List<MvccLogEntry> results = new ArrayList<MvccLogEntry>( columns.size() );
+
+        for ( Column<UUID> col : columns ) {
+            final UUID storedVersion = col.getName();
+            final Stage stage = col.getValue( SER );
+
+            results.add( new MvccLogEntryImpl( entityId, storedVersion, stage ) );
+        }
+
+        return results;
+    }
+
+
+    @Override
+    public MutationBatch delete( final CollectionContext context, final UUID entityId, final UUID version ) {
+
+        Preconditions.checkNotNull( context, "context is required" );
+        Preconditions.checkNotNull( entityId, "entityId is required" );
+        Preconditions.checkNotNull( version, "version context is required" );
+
+        return doWrite( context, entityId, new RowOp() {
+            @Override
+            public void doOp( final ColumnListMutation<UUID> colMutation ) {
+                colMutation.deleteColumn( version );
+            }
+        } );
+    }
+
+
+    @Override
+    public Collection<CollectionColumnFamily> getColumnFamilies() {
+        //create the CF entity data.  We want it reversed b/c we want the most recent version at the top of the
+        //row for fast seeks
+        CollectionColumnFamily cf = new CollectionColumnFamily( CF_ENTITY_LOG,
+                ReversedType.class.getName() + "(" + UUIDType.class.getName() + ")", true );
+
+
+        return Collections.singleton( cf );
+    }
+
+
+    /** Simple callback to perform puts and deletes with a common row setup code */
+    private static interface RowOp {
+
+        /** The operation to perform on the row */
+        void doOp( ColumnListMutation<UUID> colMutation );
+    }
+
+
+    /**
+     * Do the column update or delete for the given column and row key
+     *
+     * @param context We need to use this when getting the keyspace
+     */
+    private MutationBatch doWrite( CollectionContext context, UUID entityId, RowOp op ) {
+
+        final MutationBatch batch = keyspace.prepareMutationBatch();
+
+        op.doOp( batch.withRow( CF_ENTITY_LOG, entityId ) );
+
+        return batch;
+    }
+
+
+    /** Internal stage cache */
+    private static class StageCache {
+        private Map<Byte, Stage> values = new HashMap<Byte, Stage>( Stage.values().length );
+
+
+        private StageCache() {
+            for ( Stage stage : Stage.values() ) {
+
+                final byte stageValue = stage.getId();
+
+                values.put( stageValue, stage );
+            }
+        }
+
+
+        /** Get the stage with the byte value */
+        private Stage getStage( final byte value ) {
+            return values.get( value );
+        }
+    }
+
+
+    public static class StageSerializer extends AbstractSerializer<Stage> {
+
+        /** Used for caching the byte => stage mapping */
+        private static final StageCache CACHE = new StageCache();
+
+
+        @Override
+        public ByteBuffer toByteBuffer( final Stage obj ) {
+            ByteBuffer buff = ByteBuffer.allocate( 1 );
+            buff.put( obj.getId() );
+            buff.rewind();
+            return buff;
+        }
+
+
+        @Override
+        public Stage fromByteBuffer( final ByteBuffer byteBuffer ) {
+            final byte value  = byteBuffer.get();
+
+            return CACHE.getStage(value);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/SerializationModule.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/SerializationModule.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/SerializationModule.java
new file mode 100644
index 0000000..f27b6ad
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/SerializationModule.java
@@ -0,0 +1,45 @@
+package org.apache.usergrid.persistence.collection.serialization.impl;
+
+
+import org.apache.usergrid.persistence.collection.astynax.AstynaxKeyspaceProvider;
+import org.apache.usergrid.persistence.collection.guice.PropertyUtils;
+import org.apache.usergrid.persistence.collection.migration.Migration;
+import org.apache.usergrid.persistence.collection.migration.MigrationManager;
+import org.apache.usergrid.persistence.collection.migration.MigrationManagerImpl;
+import org.apache.usergrid.persistence.collection.serialization.MvccEntitySerializationStrategy;
+import org.apache.usergrid.persistence.collection.serialization.MvccLogEntrySerializationStrategy;
+
+import com.google.inject.AbstractModule;
+import com.google.inject.multibindings.Multibinder;
+import com.google.inject.name.Names;
+import com.netflix.astyanax.Keyspace;
+
+
+/** @author tnine */
+public class SerializationModule extends AbstractModule{
+
+    @Override
+    protected void configure() {
+
+        //bind our keyspace to the AstynaxKeyspaceProvider
+        bind( Keyspace.class ).toProvider( AstynaxKeyspaceProvider.class );
+
+        //bind our migration manager
+        bind( MigrationManager.class ).to( MigrationManagerImpl.class );
+
+
+        //bind the serialization strategies
+
+        bind( MvccEntitySerializationStrategy.class ).to( MvccEntitySerializationStrategyImpl.class );
+
+
+        bind( MvccLogEntrySerializationStrategy.class ).to( MvccLogEntrySerializationStrategyImpl.class );
+
+
+        //do multibindings for migrations
+        Multibinder<Migration> uriBinder = Multibinder.newSetBinder( binder(), Migration.class );
+
+        uriBinder.addBinding().to( MvccEntitySerializationStrategyImpl.class );
+        uriBinder.addBinding().to( MvccLogEntrySerializationStrategyImpl.class );
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/service/TimeService.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/service/TimeService.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/service/TimeService.java
new file mode 100644
index 0000000..410d2f5
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/service/TimeService.java
@@ -0,0 +1,12 @@
+package org.apache.usergrid.persistence.collection.service;
+
+
+/** @author tnine */
+public interface TimeService {
+
+    /**
+     * Get the current time in milliseconds since epoch
+     * @return
+     */
+    long getTime();
+}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/service/UUIDService.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/service/UUIDService.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/service/UUIDService.java
new file mode 100644
index 0000000..31a3072
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/service/UUIDService.java
@@ -0,0 +1,15 @@
+package org.apache.usergrid.persistence.collection.service;
+
+
+import java.util.UUID;
+
+
+/** @author tnine */
+public interface UUIDService {
+
+    /**
+     * Generate a new time uuid
+     * @return
+     */
+    UUID newTimeUUID();
+}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/service/impl/ServiceModule.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/service/impl/ServiceModule.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/service/impl/ServiceModule.java
new file mode 100644
index 0000000..858aed7
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/service/impl/ServiceModule.java
@@ -0,0 +1,34 @@
+package org.apache.usergrid.persistence.collection.service.impl;
+
+
+import org.apache.usergrid.persistence.collection.astynax.AstynaxKeyspaceProvider;
+import org.apache.usergrid.persistence.collection.migration.Migration;
+import org.apache.usergrid.persistence.collection.migration.MigrationManager;
+import org.apache.usergrid.persistence.collection.migration.MigrationManagerImpl;
+import org.apache.usergrid.persistence.collection.serialization.MvccEntitySerializationStrategy;
+import org.apache.usergrid.persistence.collection.serialization.MvccLogEntrySerializationStrategy;
+import org.apache.usergrid.persistence.collection.serialization.impl.MvccEntitySerializationStrategyImpl;
+import org.apache.usergrid.persistence.collection.serialization.impl.MvccLogEntrySerializationStrategyImpl;
+import org.apache.usergrid.persistence.collection.service.TimeService;
+import org.apache.usergrid.persistence.collection.service.UUIDService;
+
+import com.google.inject.AbstractModule;
+import com.google.inject.multibindings.Multibinder;
+import com.netflix.astyanax.Keyspace;
+
+
+/** @author tnine */
+public class ServiceModule extends AbstractModule{
+
+    @Override
+    protected void configure() {
+
+        //bind our keyspace to the AstynaxKeyspaceProvider
+        bind( TimeService.class ).to( TimeServiceImpl.class );
+
+        //bind our migration manager
+        bind( UUIDService.class ).to( UUIDServiceImpl.class );
+
+
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/service/impl/TimeServiceImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/service/impl/TimeServiceImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/service/impl/TimeServiceImpl.java
new file mode 100644
index 0000000..ba49edd
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/service/impl/TimeServiceImpl.java
@@ -0,0 +1,14 @@
+package org.apache.usergrid.persistence.collection.service.impl;
+
+
+import org.apache.usergrid.persistence.collection.service.TimeService;
+
+
+/** @author tnine */
+public class TimeServiceImpl implements TimeService {
+
+    @Override
+    public long getTime() {
+        return System.currentTimeMillis();
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/service/impl/UUIDServiceImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/service/impl/UUIDServiceImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/service/impl/UUIDServiceImpl.java
new file mode 100644
index 0000000..223d13c
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/service/impl/UUIDServiceImpl.java
@@ -0,0 +1,17 @@
+package org.apache.usergrid.persistence.collection.service.impl;
+
+
+import java.util.UUID;
+
+import org.apache.usergrid.persistence.collection.service.UUIDService;
+import org.apache.usergrid.persistence.model.util.UUIDGenerator;
+
+
+/** @author tnine */
+public class UUIDServiceImpl implements UUIDService {
+
+    @Override
+    public UUID newTimeUUID() {
+        return UUIDGenerator.newTimeUUID();
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/CollectionContextImplTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/CollectionContextImplTest.java b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/CollectionContextImplTest.java
index ed0a17b..dd7770a 100644
--- a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/CollectionContextImplTest.java
+++ b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/CollectionContextImplTest.java
@@ -5,6 +5,7 @@ import java.util.UUID;
 
 import org.junit.Test;
 
+import org.apache.usergrid.persistence.collection.impl.CollectionContextImpl;
 import org.apache.usergrid.persistence.model.util.UUIDGenerator;
 
 import static junit.framework.TestCase.assertEquals;

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/guice/TestCollectionModule.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/guice/TestCollectionModule.java b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/guice/TestCollectionModule.java
index 1d56a5d..e8a16bd 100644
--- a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/guice/TestCollectionModule.java
+++ b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/guice/TestCollectionModule.java
@@ -3,7 +3,6 @@ package org.apache.usergrid.persistence.collection.guice;
 
 import java.util.HashMap;
 import java.util.Map;
-import java.util.Properties;
 
 import org.apache.cassandra.locator.SimpleStrategy;
 
@@ -11,7 +10,7 @@ import org.apache.usergrid.persistence.collection.astynax.AstynaxKeyspaceProvide
 import org.apache.usergrid.persistence.collection.migration.MigrationException;
 import org.apache.usergrid.persistence.collection.migration.MigrationManager;
 import org.apache.usergrid.persistence.collection.migration.MigrationManagerImpl;
-import org.apache.usergrid.persistence.collection.serialization.MvccLogEntrySerializationStrategyImpl;
+import org.apache.usergrid.persistence.collection.serialization.impl.MvccLogEntrySerializationStrategyImpl;
 import org.apache.usergrid.persistence.test.CassandraRule;
 
 import com.google.guiceberry.GuiceBerryEnvMain;

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/entity/MvccEntityImplTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/entity/MvccEntityImplTest.java b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/entity/MvccEntityImplTest.java
deleted file mode 100644
index 324c931..0000000
--- a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/entity/MvccEntityImplTest.java
+++ /dev/null
@@ -1,132 +0,0 @@
-package org.apache.usergrid.persistence.collection.mvcc.entity;
-
-
-import java.util.UUID;
-
-import org.junit.Test;
-
-import org.apache.usergrid.persistence.collection.CollectionContext;
-import org.apache.usergrid.persistence.collection.CollectionContextImpl;
-import org.apache.usergrid.persistence.model.entity.Entity;
-import org.apache.usergrid.persistence.model.util.UUIDGenerator;
-
-import com.google.common.base.Optional;
-
-import static org.junit.Assert.assertEquals;
-
-
-/** @author tnine */
-public class MvccEntityImplTest {
-
-    @Test( expected = NullPointerException.class )
-    public void contextRequired() {
-        new MvccEntityImpl( null, UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(),
-                Optional.of( new Entity() ) );
-    }
-
-
-    @Test( expected = NullPointerException.class )
-    public void entityIdRequired() {
-        final CollectionContext context =
-                new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" );
-
-        new MvccEntityImpl( context, null, UUIDGenerator.newTimeUUID(), Optional.of( new Entity() ) );
-    }
-
-
-    @Test( expected = NullPointerException.class )
-    public void versionRequired() {
-        final CollectionContext context =
-                new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" );
-
-        new MvccEntityImpl( context, UUIDGenerator.newTimeUUID(), null, Optional.of( new Entity() ) );
-    }
-
-
-    @Test( expected = NullPointerException.class )
-    public void entityRequired() {
-        final CollectionContext context =
-                new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" );
-
-        new MvccEntityImpl( context, UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), ( Entity ) null );
-    }
-
-
-    @Test( expected = NullPointerException.class )
-    public void optionalRequired() {
-        final CollectionContext context =
-                new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" );
-
-        new MvccEntityImpl( context, UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), ( Optional ) null );
-    }
-
-
-    @Test
-    public void correctValueEntity() {
-        final CollectionContext context =
-                new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" );
-
-        final UUID entityId = UUIDGenerator.newTimeUUID();
-        final UUID version = UUIDGenerator.newTimeUUID();
-        final Entity entity = new Entity( entityId, "test" );
-
-        MvccEntityImpl logEntry = new MvccEntityImpl( context, entityId, version, entity );
-
-        assertEquals( context, logEntry.getContext() );
-        assertEquals( entityId, logEntry.getUuid() );
-        assertEquals( version, logEntry.getVersion() );
-        assertEquals( entity, logEntry.getEntity().get() );
-    }
-
-
-    @Test
-    public void correctValueOptional() {
-        final CollectionContext context =
-                new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" );
-
-        final UUID entityId = UUIDGenerator.newTimeUUID();
-        final UUID version = UUIDGenerator.newTimeUUID();
-        final Entity entity = new Entity( entityId, "test" );
-
-        MvccEntityImpl logEntry = new MvccEntityImpl( context, entityId, version, Optional.of( entity ) );
-
-        assertEquals( context, logEntry.getContext() );
-        assertEquals( entityId, logEntry.getUuid() );
-        assertEquals( version, logEntry.getVersion() );
-        assertEquals( entity, logEntry.getEntity().get() );
-    }
-
-
-    @Test
-    public void equals() {
-        final CollectionContext context =
-                new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" );
-
-        final UUID entityId = UUIDGenerator.newTimeUUID();
-        final UUID version = UUIDGenerator.newTimeUUID();
-        final Entity entity = new Entity( entityId, "test" );
-
-        MvccEntityImpl first = new MvccEntityImpl( context, entityId, version, Optional.of( entity ) );
-
-        MvccEntityImpl second = new MvccEntityImpl( context, entityId, version, Optional.of( entity ) );
-
-        assertEquals( first, second );
-    }
-
-
-    @Test
-    public void testHashCode() {
-        final CollectionContext context =
-                new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" );
-
-        final UUID entityId = UUIDGenerator.newTimeUUID();
-        final UUID version = UUIDGenerator.newTimeUUID();
-        final Entity entity = new Entity( entityId, "test" );
-
-        MvccEntityImpl first = new MvccEntityImpl( context, entityId, version, Optional.of( entity ) );
-
-        MvccEntityImpl second = new MvccEntityImpl( context, entityId, version, Optional.of( entity ) );
-
-        assertEquals( first.hashCode(), second.hashCode() );
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/entity/MvccLogEntryImplTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/entity/MvccLogEntryImplTest.java b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/entity/MvccLogEntryImplTest.java
deleted file mode 100644
index 918498f..0000000
--- a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/entity/MvccLogEntryImplTest.java
+++ /dev/null
@@ -1,104 +0,0 @@
-package org.apache.usergrid.persistence.collection.mvcc.entity;
-
-
-import java.util.UUID;
-
-import org.junit.Test;
-
-import org.apache.usergrid.persistence.collection.CollectionContext;
-import org.apache.usergrid.persistence.collection.CollectionContextImpl;
-import org.apache.usergrid.persistence.model.util.UUIDGenerator;
-
-import static org.junit.Assert.assertEquals;
-
-
-/** @author tnine */
-public class MvccLogEntryImplTest {
-
-    @Test( expected = NullPointerException.class )
-    public void contextRequired() {
-        new MvccLogEntryImpl( null, UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), Stage.ACTIVE );
-    }
-
-
-    @Test( expected = NullPointerException.class )
-    public void entityIdRequired() {
-        final CollectionContext context =
-                new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" );
-
-        new MvccLogEntryImpl( context, null, UUIDGenerator.newTimeUUID(), Stage.ACTIVE );
-    }
-
-
-    @Test( expected = NullPointerException.class )
-    public void versionRequired() {
-        final CollectionContext context =
-                new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" );
-
-        new MvccLogEntryImpl( context, UUIDGenerator.newTimeUUID(), null, Stage.ACTIVE );
-    }
-
-
-    @Test( expected = NullPointerException.class )
-    public void stageRequired() {
-        final CollectionContext context =
-                new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" );
-
-        new MvccLogEntryImpl( context, UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), null );
-    }
-
-
-    @Test
-    public void correctValue() {
-        final CollectionContext context =
-                new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" );
-
-        final UUID entityId = UUIDGenerator.newTimeUUID();
-        final UUID version = UUIDGenerator.newTimeUUID();
-        final Stage stage = Stage.COMPLETE;
-
-
-        MvccLogEntry logEntry = new MvccLogEntryImpl( context, entityId, version, stage );
-
-        assertEquals( context, logEntry.getContext() );
-        assertEquals( entityId, logEntry.getEntityId() );
-        assertEquals( version, logEntry.getVersion() );
-        assertEquals( stage, logEntry.getStage() );
-    }
-
-
-    @Test
-    public void equals() {
-        final CollectionContext context =
-                new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" );
-
-        final UUID entityId = UUIDGenerator.newTimeUUID();
-        final UUID version = UUIDGenerator.newTimeUUID();
-        final Stage stage = Stage.COMPLETE;
-
-
-        MvccLogEntry first = new MvccLogEntryImpl( context, entityId, version, stage );
-
-        MvccLogEntry second = new MvccLogEntryImpl( context, entityId, version, stage );
-
-        assertEquals( first, second );
-    }
-
-
-    @Test
-    public void testHashCode() {
-        final CollectionContext context =
-                new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" );
-
-        final UUID entityId = UUIDGenerator.newTimeUUID();
-        final UUID version = UUIDGenerator.newTimeUUID();
-        final Stage stage = Stage.COMPLETE;
-
-
-        MvccLogEntry first = new MvccLogEntryImpl( context, entityId, version, stage );
-
-        MvccLogEntry second = new MvccLogEntryImpl( context, entityId, version, stage );
-
-        assertEquals( first.hashCode(), second.hashCode() );
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/entity/StageTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/entity/StageTest.java b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/entity/StageTest.java
deleted file mode 100644
index 0090e64..0000000
--- a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/entity/StageTest.java
+++ /dev/null
@@ -1,91 +0,0 @@
-package org.apache.usergrid.persistence.collection.mvcc.entity;
-
-
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-
-/**
- * @author tnine
- */
-public class StageTest {
-
-    @Test
-    public void active() {
-
-        assertTrue( Stage.ACTIVE.isTransient() );
-
-        assertEquals( ( byte ) 0, Stage.ACTIVE.getId() );
-
-        testUnique( Stage.ACTIVE );
-    }
-
-
-    @Test
-    public void rollback() {
-
-        assertTrue( Stage.ROLLBACK.isTransient() );
-
-        assertEquals( ( byte ) 1, Stage.ROLLBACK.getId() );
-
-        testUnique( Stage.ROLLBACK );
-    }
-
-
-    @Test
-    public void comitted() {
-
-        assertFalse( Stage.COMMITTED.isTransient() );
-
-        assertEquals( ( byte ) 2, Stage.COMMITTED.getId() );
-
-        testUnique( Stage.COMMITTED );
-    }
-
-
-
-
-    @Test
-    public void postProcess() {
-
-        assertFalse( Stage.POSTPROCESS.isTransient() );
-
-        assertEquals( ( byte ) 6, Stage.POSTPROCESS.getId() );
-
-        testUnique( Stage.POSTPROCESS );
-    }
-
-
-    @Test
-    public void complete() {
-
-        assertFalse( Stage.COMPLETE.isTransient() );
-
-        assertEquals( ( byte ) 14, Stage.COMPLETE.getId() );
-
-        testUnique( Stage.COMPLETE );
-    }
-
-
-    /**
-     * Test we don't have dups in the byte value
-     * @param test
-     */
-    private void testUnique( Stage test ) {
-
-        for ( Stage stage : Stage.values() ) {
-
-            //skip self
-            if ( stage == test ) {
-                continue;
-            }
-
-            assertFalse( stage.getId() == test.getId() );
-        }
-    }
-
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/entity/impl/MvccEntityImplTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/entity/impl/MvccEntityImplTest.java b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/entity/impl/MvccEntityImplTest.java
new file mode 100644
index 0000000..1b80318
--- /dev/null
+++ b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/entity/impl/MvccEntityImplTest.java
@@ -0,0 +1,107 @@
+package org.apache.usergrid.persistence.collection.mvcc.entity.impl;
+
+
+import java.util.UUID;
+
+import org.junit.Test;
+
+import org.apache.usergrid.persistence.collection.mvcc.entity.impl.MvccEntityImpl;
+import org.apache.usergrid.persistence.model.entity.Entity;
+import org.apache.usergrid.persistence.model.util.UUIDGenerator;
+
+import com.google.common.base.Optional;
+
+import static org.junit.Assert.assertEquals;
+
+
+/** @author tnine */
+public class MvccEntityImplTest {
+
+
+    @Test( expected = NullPointerException.class )
+    public void entityIdRequired() {
+
+        new MvccEntityImpl( null, UUIDGenerator.newTimeUUID(), Optional.of( new Entity() ) );
+    }
+
+
+    @Test( expected = NullPointerException.class )
+    public void versionRequired() {
+
+        new MvccEntityImpl( UUIDGenerator.newTimeUUID(), null, Optional.of( new Entity() ) );
+    }
+
+
+    @Test( expected = NullPointerException.class )
+    public void entityRequired() {
+
+        new MvccEntityImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), ( Entity ) null );
+    }
+
+
+    @Test( expected = NullPointerException.class )
+    public void optionalRequired() {
+
+        new MvccEntityImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), ( Optional ) null );
+    }
+
+
+    @Test
+    public void correctValueEntity() {
+
+        final UUID entityId = UUIDGenerator.newTimeUUID();
+        final UUID version = UUIDGenerator.newTimeUUID();
+        final Entity entity = new Entity( entityId, "test" );
+
+        MvccEntityImpl logEntry = new MvccEntityImpl( entityId, version, entity );
+
+        assertEquals( entityId, logEntry.getUuid() );
+        assertEquals( version, logEntry.getVersion() );
+        assertEquals( entity, logEntry.getEntity().get() );
+    }
+
+
+    @Test
+    public void correctValueOptional() {
+
+        final UUID entityId = UUIDGenerator.newTimeUUID();
+        final UUID version = UUIDGenerator.newTimeUUID();
+        final Entity entity = new Entity( entityId, "test" );
+
+        MvccEntityImpl logEntry = new MvccEntityImpl( entityId, version, Optional.of( entity ) );
+
+        assertEquals( entityId, logEntry.getUuid() );
+        assertEquals( version, logEntry.getVersion() );
+        assertEquals( entity, logEntry.getEntity().get() );
+    }
+
+
+    @Test
+    public void equals() {
+
+        final UUID entityId = UUIDGenerator.newTimeUUID();
+        final UUID version = UUIDGenerator.newTimeUUID();
+        final Entity entity = new Entity( entityId, "test" );
+
+        MvccEntityImpl first = new MvccEntityImpl( entityId, version, Optional.of( entity ) );
+
+        MvccEntityImpl second = new MvccEntityImpl( entityId, version, Optional.of( entity ) );
+
+        assertEquals( first, second );
+    }
+
+
+    @Test
+    public void testHashCode() {
+
+        final UUID entityId = UUIDGenerator.newTimeUUID();
+        final UUID version = UUIDGenerator.newTimeUUID();
+        final Entity entity = new Entity( entityId, "test" );
+
+        MvccEntityImpl first = new MvccEntityImpl( entityId, version, Optional.of( entity ) );
+
+        MvccEntityImpl second = new MvccEntityImpl( entityId, version, Optional.of( entity ) );
+
+        assertEquals( first.hashCode(), second.hashCode() );
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/entity/impl/MvccLogEntryImplTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/entity/impl/MvccLogEntryImplTest.java b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/entity/impl/MvccLogEntryImplTest.java
new file mode 100644
index 0000000..947541f
--- /dev/null
+++ b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/entity/impl/MvccLogEntryImplTest.java
@@ -0,0 +1,95 @@
+package org.apache.usergrid.persistence.collection.mvcc.entity.impl;
+
+
+import java.util.UUID;
+
+import org.junit.Test;
+
+import org.apache.usergrid.persistence.collection.CollectionContext;
+import org.apache.usergrid.persistence.collection.impl.CollectionContextImpl;
+import org.apache.usergrid.persistence.collection.mvcc.entity.MvccLogEntry;
+import org.apache.usergrid.persistence.collection.mvcc.entity.Stage;
+import org.apache.usergrid.persistence.collection.mvcc.entity.impl.MvccLogEntryImpl;
+import org.apache.usergrid.persistence.model.util.UUIDGenerator;
+
+import static org.junit.Assert.assertEquals;
+
+
+/** @author tnine */
+public class MvccLogEntryImplTest {
+
+
+    @Test( expected = NullPointerException.class )
+    public void entityIdRequired() {
+        final CollectionContext context =
+                new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" );
+
+        new MvccLogEntryImpl( null, UUIDGenerator.newTimeUUID(), Stage.ACTIVE );
+    }
+
+
+    @Test( expected = NullPointerException.class )
+    public void versionRequired() {
+        final CollectionContext context =
+                new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" );
+
+        new MvccLogEntryImpl( UUIDGenerator.newTimeUUID(), null, Stage.ACTIVE );
+    }
+
+
+    @Test( expected = NullPointerException.class )
+    public void stageRequired() {
+        final CollectionContext context =
+                new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" );
+
+        new MvccLogEntryImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), null );
+    }
+
+
+    @Test
+    public void correctValue() {
+
+        final UUID entityId = UUIDGenerator.newTimeUUID();
+        final UUID version = UUIDGenerator.newTimeUUID();
+        final Stage stage = Stage.COMPLETE;
+
+
+        MvccLogEntry logEntry = new MvccLogEntryImpl( entityId, version, stage );
+
+        assertEquals( entityId, logEntry.getEntityId() );
+        assertEquals( version, logEntry.getVersion() );
+        assertEquals( stage, logEntry.getStage() );
+    }
+
+
+    @Test
+    public void equals() {
+
+        final UUID entityId = UUIDGenerator.newTimeUUID();
+        final UUID version = UUIDGenerator.newTimeUUID();
+        final Stage stage = Stage.COMPLETE;
+
+
+        MvccLogEntry first = new MvccLogEntryImpl( entityId, version, stage );
+
+        MvccLogEntry second = new MvccLogEntryImpl( entityId, version, stage );
+
+        assertEquals( first, second );
+    }
+
+
+    @Test
+    public void testHashCode() {
+
+        final UUID entityId = UUIDGenerator.newTimeUUID();
+        final UUID version = UUIDGenerator.newTimeUUID();
+        final Stage stage = Stage.COMPLETE;
+
+
+        MvccLogEntry first = new MvccLogEntryImpl( entityId, version, stage );
+
+        MvccLogEntry second = new MvccLogEntryImpl( entityId, version, stage );
+
+        assertEquals( first.hashCode(), second.hashCode() );
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/entity/impl/StageTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/entity/impl/StageTest.java b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/entity/impl/StageTest.java
new file mode 100644
index 0000000..51fe34b
--- /dev/null
+++ b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/entity/impl/StageTest.java
@@ -0,0 +1,93 @@
+package org.apache.usergrid.persistence.collection.mvcc.entity.impl;
+
+
+import org.junit.Test;
+
+import org.apache.usergrid.persistence.collection.mvcc.entity.Stage;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+
+/**
+ * @author tnine
+ */
+public class StageTest {
+
+    @Test
+    public void active() {
+
+        assertTrue( Stage.ACTIVE.isTransient() );
+
+        assertEquals( ( byte ) 0, Stage.ACTIVE.getId() );
+
+        testUnique( Stage.ACTIVE );
+    }
+
+
+    @Test
+    public void rollback() {
+
+        assertTrue( Stage.ROLLBACK.isTransient() );
+
+        assertEquals( ( byte ) 1, Stage.ROLLBACK.getId() );
+
+        testUnique( Stage.ROLLBACK );
+    }
+
+
+    @Test
+    public void comitted() {
+
+        assertFalse( Stage.COMMITTED.isTransient() );
+
+        assertEquals( ( byte ) 2, Stage.COMMITTED.getId() );
+
+        testUnique( Stage.COMMITTED );
+    }
+
+
+
+
+    @Test
+    public void postProcess() {
+
+        assertFalse( Stage.POSTPROCESS.isTransient() );
+
+        assertEquals( ( byte ) 6, Stage.POSTPROCESS.getId() );
+
+        testUnique( Stage.POSTPROCESS );
+    }
+
+
+    @Test
+    public void complete() {
+
+        assertFalse( Stage.COMPLETE.isTransient() );
+
+        assertEquals( ( byte ) 14, Stage.COMPLETE.getId() );
+
+        testUnique( Stage.COMPLETE );
+    }
+
+
+    /**
+     * Test we don't have dups in the byte value
+     * @param test
+     */
+    private void testUnique( Stage test ) {
+
+        for ( Stage stage : Stage.values() ) {
+
+            //skip self
+            if ( stage == test ) {
+                continue;
+            }
+
+            assertFalse( stage.getId() == test.getId() );
+        }
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/StartTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/StartTest.java b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/StartTest.java
deleted file mode 100644
index aa79a70..0000000
--- a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/StartTest.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package org.apache.usergrid.persistence.collection.mvcc.stage;
-
-
-import java.util.UUID;
-
-import org.junit.Test;
-
-import org.apache.usergrid.persistence.collection.CollectionContextImpl;
-import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntityImpl;
-import org.apache.usergrid.persistence.collection.mvcc.stage.impl.Start;
-import org.apache.usergrid.persistence.collection.serialization.MvccLogEntrySerializationStrategy;
-import org.apache.usergrid.persistence.model.entity.Entity;
-import org.apache.usergrid.persistence.model.util.UUIDGenerator;
-
-import static org.mockito.Mockito.mock;
-
-
-/** @author tnine */
-public class StartTest {
-
-    @Test
-    public void testStartStage(){
-
-        final MvccLogEntrySerializationStrategy logStrategy = mock(MvccLogEntrySerializationStrategy.class);
-
-        Start start = new Start( logStrategy );
-
-        //set up the data
-
-        final UUID applicationId = UUIDGenerator.newTimeUUID();
-
-        final UUID ownerId = UUIDGenerator.newTimeUUID();
-
-        final UUID entityId = UUIDGenerator.newTimeUUID();
-
-        final UUID version = UUIDGenerator.newTimeUUID();
-
-        final String name = "tests";
-
-
-        CollectionContextImpl collection = new CollectionContextImpl( applicationId, ownerId, name );
-
-
-        Entity entity = new Entity();
-
-        MvccEntityImpl mvccEntity = new MvccEntityImpl(collection, entityId, version, entity  );
-
-
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/MvccEntityNewTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/MvccEntityNewTest.java b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/MvccEntityNewTest.java
new file mode 100644
index 0000000..05e9460
--- /dev/null
+++ b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/MvccEntityNewTest.java
@@ -0,0 +1,136 @@
+package org.apache.usergrid.persistence.collection.mvcc.stage.impl;
+
+
+import java.util.UUID;
+import java.util.concurrent.ExecutionException;
+
+import org.junit.Test;
+import org.mockito.ArgumentCaptor;
+
+import org.apache.usergrid.persistence.collection.CollectionContext;
+import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntity;
+import org.apache.usergrid.persistence.collection.mvcc.entity.MvccLogEntry;
+import org.apache.usergrid.persistence.collection.mvcc.entity.Stage;
+import org.apache.usergrid.persistence.collection.mvcc.stage.WriteContext;
+import org.apache.usergrid.persistence.collection.mvcc.stage.impl.MvccEntityNew;
+import org.apache.usergrid.persistence.collection.serialization.MvccLogEntrySerializationStrategy;
+import org.apache.usergrid.persistence.collection.service.TimeService;
+import org.apache.usergrid.persistence.collection.service.UUIDService;
+import org.apache.usergrid.persistence.model.entity.Entity;
+import org.apache.usergrid.persistence.model.util.UUIDGenerator;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import com.netflix.astyanax.MutationBatch;
+import com.netflix.astyanax.connectionpool.OperationResult;
+import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.same;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+
+/** @author tnine */
+public class MvccEntityNewTest {
+
+    /**
+     * Test the start stage for happy path
+     * TODO throw junk at it
+     * TODO refactor a lot of this mock setup.  It's common across a lot of tests
+     */
+    @Test
+    public void testStartStage() throws ConnectionException, ExecutionException, InterruptedException {
+
+        final MvccLogEntrySerializationStrategy logStrategy = mock( MvccLogEntrySerializationStrategy.class );
+
+        final ArgumentCaptor<MvccLogEntry> logEntry = ArgumentCaptor.forClass( MvccLogEntry.class );
+
+
+        final WriteContext writeContext = mock( WriteContext.class );
+        final CollectionContext context = mock( CollectionContext.class );
+
+
+        //mock returning the context
+        when( writeContext.getCollectionContext() ).thenReturn( context );
+
+
+        final MutationBatch mutation = mock( MutationBatch.class );
+
+
+        //mock returning a mock mutation when we do a log entry write
+        when( logStrategy.write( same( context ), logEntry.capture() ) ).thenReturn( mutation );
+
+
+        //mock the listenable future
+        final ListenableFuture<OperationResult<Void>> future = mock( ListenableFuture.class);
+        final OperationResult<Void> result = mock(OperationResult.class);
+
+        when(mutation.executeAsync()).thenReturn( future );
+
+        //mock the "get" on the future
+        when(future.get()).thenReturn( result  );
+
+
+        //set up the mock to return the entity from the start phase
+        final Entity entity = new Entity();
+
+        when( writeContext.getMessage( Entity.class ) ).thenReturn( entity );
+
+
+        //mock returning the time
+        final TimeService timeService = mock( TimeService.class );
+
+        final long time = System.currentTimeMillis();
+
+        when( timeService.getTime() ).thenReturn( time );
+
+
+        //mock the uuid service
+        final UUIDService uuidService = mock( UUIDService.class );
+
+        final UUID newEntityId = UUIDGenerator.newTimeUUID();
+        final UUID newVersion = newEntityId;
+
+
+        //mock the uuid service
+        when( uuidService.newTimeUUID() ).thenReturn( newEntityId );
+
+
+        //run the stage
+        MvccEntityNew newStage = new MvccEntityNew( logStrategy, timeService, uuidService );
+
+        newStage.performStage( writeContext );
+
+
+        //now verify our output was correct
+        ArgumentCaptor<MvccEntity> mvccEntity = ArgumentCaptor.forClass( MvccEntity.class );
+
+
+        verify( writeContext).setMessage( mvccEntity.capture() );
+
+        MvccEntity created = mvccEntity.getValue();
+
+        //verify uuid and version in both the MvccEntity and the entity itself
+        assertEquals( "entity id did not match generator", newEntityId, created.getUuid() );
+        assertEquals( "entity id did not match generator", newEntityId, created.getEntity().get().getUuid() );
+        assertEquals( "version did not not match entityId", newVersion, created.getVersion() );
+        assertEquals( "version did not not match entityId", newVersion, created.getEntity().get().getVersion() );
+
+        //check the time
+        assertEquals( "created time matches generator", time, created.getEntity().get().getCreated() );
+        assertEquals( "updated time matches generator", time, created.getEntity().get().getUpdated() );
+
+        //now  verify we invoked the mvcc log operation correctly
+
+        MvccLogEntry entry = logEntry.getValue();
+
+        assertEquals("Log entry has correct uuid", newEntityId,  entry.getEntityId());
+        assertEquals("Log entry has correct version", newVersion,  entry.getEntityId());
+        assertEquals( "Stage was correct", Stage.ACTIVE, entry.getStage() );
+
+        //now verify the proceed was called
+        verify(writeContext).proceed();
+
+    }
+}


[3/5] Major refactor complete. Need to work on scheduling of futures.

Posted by to...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/MvccEntitySerializationStrategyImplTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/MvccEntitySerializationStrategyImplTest.java b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/MvccEntitySerializationStrategyImplTest.java
deleted file mode 100644
index ffa868e..0000000
--- a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/MvccEntitySerializationStrategyImplTest.java
+++ /dev/null
@@ -1,430 +0,0 @@
-package org.apache.usergrid.persistence.collection.serialization;
-
-
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.UUID;
-
-import org.junit.Rule;
-import org.junit.Test;
-
-import org.apache.cassandra.db.marshal.UUIDType;
-
-import org.apache.usergrid.persistence.collection.CollectionContext;
-import org.apache.usergrid.persistence.collection.CollectionContextImpl;
-import org.apache.usergrid.persistence.collection.guice.TestCollectionModule;
-import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntity;
-import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntityImpl;
-import org.apache.usergrid.persistence.model.entity.Entity;
-import org.apache.usergrid.persistence.model.field.BooleanField;
-import org.apache.usergrid.persistence.model.field.DoubleField;
-import org.apache.usergrid.persistence.model.field.Field;
-import org.apache.usergrid.persistence.model.field.IntegerField;
-import org.apache.usergrid.persistence.model.field.LongField;
-import org.apache.usergrid.persistence.model.field.StringField;
-import org.apache.usergrid.persistence.model.field.UUIDField;
-import org.apache.usergrid.persistence.model.util.UUIDGenerator;
-import org.apache.usergrid.persistence.test.CassandraRule;
-
-import com.google.common.base.Optional;
-import com.google.guiceberry.junit4.GuiceBerryRule;
-import com.google.inject.Inject;
-import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
-import com.netflix.astyanax.serializers.UUIDSerializer;
-import com.netflix.astyanax.util.TimeUUIDUtils;
-
-import static junit.framework.Assert.assertEquals;
-import static junit.framework.Assert.assertSame;
-import static junit.framework.TestCase.assertFalse;
-import static junit.framework.TestCase.assertNull;
-import static org.junit.Assert.assertTrue;
-
-
-/**
- * @author tnine
- */
-public class MvccEntitySerializationStrategyImplTest {
-
-    @Rule
-    public final GuiceBerryRule guiceBerry = new GuiceBerryRule( TestCollectionModule.class );
-
-    @Rule
-    public final CassandraRule rule = new CassandraRule();
-
-    @Inject
-    private MvccEntitySerializationStrategy serializationStrategy;
-
-
-    @Test
-    public void writeLoadDelete() throws ConnectionException {
-
-        final UUID applicationId = UUIDGenerator.newTimeUUID();
-        final String name = "test";
-
-        CollectionContext context = new CollectionContextImpl( applicationId, applicationId, name );
-
-
-        final UUID entityId = UUIDGenerator.newTimeUUID();
-        final UUID version = UUIDGenerator.newTimeUUID();
-        final String type = "test";
-        final long created = 1l;
-        final long updated = 2l;
-
-        Entity entity = new Entity( entityId, type );
-
-        entity.setVersion( version );
-        entity.setCreated( created );
-        entity.setUpdated( updated );
-
-
-        BooleanField boolField = new BooleanField( "boolean", false );
-        DoubleField doubleField = new DoubleField( "double", 1d );
-        IntegerField intField = new IntegerField( "long", 1 );
-        LongField longField = new LongField( "int", 1l );
-        StringField stringField = new StringField( "name", "test" );
-        UUIDField uuidField = new UUIDField( "uuid", UUIDGenerator.newTimeUUID() );
-
-        entity.setField( boolField );
-        entity.setField( doubleField );
-        entity.setField( intField );
-        entity.setField( longField );
-        entity.setField( stringField );
-        entity.setField( uuidField );
-
-
-        MvccEntity saved = new MvccEntityImpl( context, entityId, version, Optional.of( entity ) );
-
-
-        //persist the entity
-        serializationStrategy.write( saved ).execute();
-
-        //now read it back
-
-        MvccEntity returned = serializationStrategy.load( context, entityId, version );
-
-        assertEquals( "Mvcc entities are the same", saved, returned );
-
-
-        assertEquals( entityId, entity.getUuid() );
-        assertEquals( type, entity.getType() );
-        assertEquals( created, entity.getCreated() );
-        assertEquals( updated, entity.getUpdated() );
-
-
-        Field<Boolean> boolFieldReturned = entity.getField( boolField.getName() );
-
-        assertSame( boolField, boolFieldReturned );
-
-        Field<Double> doubleFieldReturned = entity.getField( doubleField.getName() );
-
-        assertSame( doubleField, doubleFieldReturned );
-
-        Field<Integer> intFieldReturned = entity.getField( intField.getName() );
-
-        assertSame( intField, intFieldReturned );
-
-        Field<Long> longFieldReturned = entity.getField( longField.getName() );
-
-        assertSame( longField, longFieldReturned );
-
-        Field<String> stringFieldReturned = entity.getField( stringField.getName() );
-
-        assertSame( stringField, stringFieldReturned );
-
-        Field<UUID> uuidFieldReturned = entity.getField( uuidField.getName() );
-
-        assertSame( uuidField, uuidFieldReturned );
-
-
-        Set<Field> results = new HashSet<Field>();
-        results.addAll( entity.getFields() );
-
-
-        assertTrue( results.contains( boolField ) );
-        assertTrue( results.contains( doubleField ) );
-        assertTrue( results.contains( intField ) );
-        assertTrue( results.contains( longField ) );
-        assertTrue( results.contains( stringField ) );
-        assertTrue( results.contains( uuidField ) );
-
-        assertEquals( 6, results.size() );
-
-
-        assertEquals( entityId, entity.getUuid() );
-        assertEquals( version, entity.getVersion() );
-
-
-        //now delete it
-        serializationStrategy.delete( context, entityId, version ).execute();
-
-        //now get it, should be gone
-
-        returned = serializationStrategy.load( context, entityId, version );
-
-        assertNull( returned );
-    }
-
-
-    @Test
-    public void writeLoadClearDelete() throws ConnectionException {
-
-        final UUID applicationId = UUIDGenerator.newTimeUUID();
-        final String name = "test";
-
-        CollectionContext context = new CollectionContextImpl( applicationId, applicationId, name );
-
-
-        final UUID entityId = UUIDGenerator.newTimeUUID();
-        final UUID version = UUIDGenerator.newTimeUUID();
-        final String type = "test";
-        final long created = 1l;
-        final long updated = 2l;
-
-        Entity entity = new Entity( entityId, type );
-
-        entity.setVersion( version );
-        entity.setCreated( created );
-        entity.setUpdated( updated );
-
-
-        MvccEntity saved = new MvccEntityImpl( context, entityId, version, Optional.of( entity ) );
-
-
-        //persist the entity
-        serializationStrategy.write( saved ).execute();
-
-        //now read it back
-
-        MvccEntity returned = serializationStrategy.load( context, entityId, version );
-
-        assertEquals( "Mvcc entities are the same", saved, returned );
-
-
-        assertEquals( entityId, entity.getUuid() );
-        assertEquals( type, entity.getType() );
-        assertEquals( created, entity.getCreated() );
-        assertEquals( updated, entity.getUpdated() );
-
-
-        //now clear it
-
-        serializationStrategy.clear( context, entityId, version ).execute();
-
-        returned = serializationStrategy.load( context, entityId, version );
-
-        assertEquals( context, returned.getContext() );
-        assertEquals( entityId, returned.getUuid() );
-        assertEquals( version, returned.getVersion() );
-        assertFalse( returned.getEntity().isPresent() );
-
-        //now delete it
-        serializationStrategy.delete( context, entityId, version ).execute();
-
-        //now get it, should be gone
-
-        returned = serializationStrategy.load( context, entityId, version );
-
-        assertNull( returned );
-    }
-
-
-    @Test
-    public void writeX2ClearDelete() throws ConnectionException {
-
-        final UUID applicationId = UUIDGenerator.newTimeUUID();
-        final String name = "test";
-
-        CollectionContext context = new CollectionContextImpl( applicationId, applicationId, name );
-
-
-        final UUID entityId = UUIDGenerator.newTimeUUID();
-        final UUID version1 = UUIDGenerator.newTimeUUID();
-        final String type = "test";
-
-        Entity entityv1 = new Entity( entityId, type );
-
-        entityv1.setVersion( version1 );
-
-
-        MvccEntity saved = new MvccEntityImpl( context, entityId, version1, Optional.of( entityv1 ) );
-
-
-        //persist the entity
-        serializationStrategy.write( saved ).execute();
-
-        //now read it back
-
-        MvccEntity returnedV1 = serializationStrategy.load( context, entityId, version1 );
-
-        assertEquals( "Mvcc entities are the same", saved, returnedV1 );
-
-
-        assertEquals( entityId, entityv1.getUuid() );
-        assertEquals( type, entityv1.getType() );
-
-
-        //now write a new version of it
-
-
-        Entity entityv2 = new Entity( entityId, type );
-
-        UUID version2 = UUIDGenerator.newTimeUUID();
-        entityv2.setVersion( version2 );
-
-
-        UUIDType comparator = UUIDType.instance;
-
-        int value = comparator.compare( UUIDSerializer.get().toByteBuffer( version1 ), UUIDSerializer.get().toByteBuffer( version2 ) );
-
-        assertTrue(value < 0);
-
-        value = comparator.compare( UUIDSerializer.get().toByteBuffer( version2 ), UUIDSerializer.get().toByteBuffer( version2 ) );
-
-        assertEquals(0, value);
-
-        MvccEntity savedV2 = new MvccEntityImpl( context, entityId, version2, Optional.of( entityv2 ) );
-
-        serializationStrategy.write( savedV2 ).execute();
-
-        MvccEntity returnedV2 = serializationStrategy.load( context, entityId, version2 );
-
-        assertEquals( "Mvcc entities are the same", savedV2, returnedV2 );
-
-
-        //now clear it at v3
-
-        UUID version3 = UUIDGenerator.newTimeUUID();
-
-        serializationStrategy.clear( context, entityId, version3 ).execute();
-
-
-        final Optional<Entity> empty = Optional.absent();
-
-        MvccEntity clearedV3 = new MvccEntityImpl( context, entityId, version3, empty );
-
-        MvccEntity returnedV3 = serializationStrategy.load( context, entityId, version3 );
-
-        assertEquals("entities are the same", clearedV3, returnedV3);
-
-        //now ask for up to 10 versions from the current version, we should get cleared, v2, v1
-        UUID current = UUIDGenerator.newTimeUUID();
-
-        List<MvccEntity> entities = serializationStrategy.load( context, entityId, current, 3 );
-
-        assertEquals( 3, entities.size() );
-
-        assertEquals( clearedV3, entities.get( 0 ) );
-
-        assertEquals( returnedV2, entities.get( 1 ) );
-
-        assertEquals( returnedV1, entities.get( 2 ) );
-
-
-        //now delete v2 and v1, we should still get v3
-        serializationStrategy.delete( context, entityId, version1 ).execute();
-        serializationStrategy.delete( context, entityId, version2 ).execute();
-
-        entities = serializationStrategy.load( context, entityId, current, 3 );
-
-        assertEquals( 1, entities.size() );
-
-        assertEquals( clearedV3, entities.get( 0 ) );
-
-
-        //now get it, should be gone
-        serializationStrategy.delete( context, entityId, version3 ).execute();
-
-
-        entities = serializationStrategy.load( context, entityId, current, 3 );
-
-        assertEquals( 0, entities.size() );
-    }
-
-
-    @Test(expected = NullPointerException.class)
-    public void writeParams() throws ConnectionException {
-       serializationStrategy.write( null );
-    }
-
-
-    @Test(expected = NullPointerException.class)
-    public void deleteParamContext() throws ConnectionException {
-       serializationStrategy.delete( null, UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID() );
-    }
-
-
-    @Test(expected = NullPointerException.class)
-    public void deleteParamEntityId() throws ConnectionException {
-
-        serializationStrategy
-                .delete( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
-                        null, UUIDGenerator.newTimeUUID() );
-    }
-
-
-    @Test(expected = NullPointerException.class)
-    public void deleteParamVersion() throws ConnectionException {
-
-        serializationStrategy
-                .delete( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
-                        UUIDGenerator.newTimeUUID(), null );
-    }
-
-
-    @Test(expected = NullPointerException.class)
-    public void loadParamContext() throws ConnectionException {
-       serializationStrategy.load( null, UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID() );
-    }
-
-
-    @Test(expected = NullPointerException.class)
-    public void loadParamEntityId() throws ConnectionException {
-
-        serializationStrategy
-                .load( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
-                        null, UUIDGenerator.newTimeUUID() );
-    }
-
-
-    @Test(expected = NullPointerException.class)
-    public void loadParamVersion() throws ConnectionException {
-
-        serializationStrategy
-                .load( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
-                        UUIDGenerator.newTimeUUID(), null );
-    }
-
-
-    @Test(expected = NullPointerException.class)
-    public void loadListParamContext() throws ConnectionException {
-       serializationStrategy.load( null, UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), 1 );
-    }
-
-
-    @Test(expected = NullPointerException.class)
-    public void loadListParamEntityId() throws ConnectionException {
-
-        serializationStrategy
-                .load( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
-                        null, UUIDGenerator.newTimeUUID(), 1 );
-    }
-
-
-    @Test(expected = NullPointerException.class)
-    public void loadListParamVersion() throws ConnectionException {
-
-        serializationStrategy
-                .load( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
-                        UUIDGenerator.newTimeUUID(), null, 1 );
-    }
-
-
-    @Test(expected = IllegalArgumentException.class)
-    public void loadListParamSize() throws ConnectionException {
-
-        serializationStrategy
-                .load( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
-                        UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), 0 );
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/MvccLogEntrySerializationStrategyImplTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/MvccLogEntrySerializationStrategyImplTest.java b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/MvccLogEntrySerializationStrategyImplTest.java
deleted file mode 100644
index 195443e..0000000
--- a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/MvccLogEntrySerializationStrategyImplTest.java
+++ /dev/null
@@ -1,311 +0,0 @@
-package org.apache.usergrid.persistence.collection.serialization;
-
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
-
-import org.junit.Rule;
-import org.junit.Test;
-
-import org.apache.usergrid.persistence.collection.CollectionContext;
-import org.apache.usergrid.persistence.collection.CollectionContextImpl;
-import org.apache.usergrid.persistence.collection.guice.TestCollectionModule;
-import org.apache.usergrid.persistence.collection.mvcc.entity.MvccLogEntry;
-import org.apache.usergrid.persistence.collection.mvcc.entity.MvccLogEntryImpl;
-import org.apache.usergrid.persistence.collection.mvcc.entity.Stage;
-import org.apache.usergrid.persistence.model.util.UUIDGenerator;
-import org.apache.usergrid.persistence.test.CassandraRule;
-
-import com.google.guiceberry.GuiceBerryEnvSelector;
-import com.google.guiceberry.TestDescription;
-import com.google.guiceberry.junit4.GuiceBerryRule;
-import com.google.inject.Inject;
-import com.google.inject.Module;
-import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
-
-import static junit.framework.Assert.assertNotNull;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-
-
-/** @author tnine */
-public class MvccLogEntrySerializationStrategyImplTest {
-
-
-    /** Set our timeout to 1 seconds.  If it works for 1 seconds, we'll be good a any value */
-    private static final int TIMEOUT = 1;
-
-
-    @Rule
-    public final GuiceBerryRule guiceBerry = new GuiceBerryRule( new TimeoutModMapper() );
-
-    @Rule
-    public final CassandraRule rule = new CassandraRule();
-
-    @Inject
-    private MvccLogEntrySerializationStrategy logEntryStrategy;
-
-
-    @Test
-    public void createAndDelete() throws ConnectionException {
-
-        final UUID applicationId = UUIDGenerator.newTimeUUID();
-        final String name = "test";
-
-
-        CollectionContext context = new CollectionContextImpl( applicationId, applicationId, name );
-
-
-        final UUID uuid = UUIDGenerator.newTimeUUID();
-        final UUID version = UUIDGenerator.newTimeUUID();
-
-        for ( Stage stage : Stage.values() ) {
-            MvccLogEntry saved = new MvccLogEntryImpl( context, uuid, version, stage );
-            logEntryStrategy.write( saved ).execute();
-
-            //Read it back
-
-            MvccLogEntry returned = logEntryStrategy.load( context, uuid, version );
-
-            assertNotNull( "Returned value should not be null", returned );
-
-            assertEquals( "Returned should equal the saved", saved, returned );
-        }
-    }
-
-
-    @Test
-    public void loadNoData() throws ConnectionException {
-
-        final UUID applicationId = UUIDGenerator.newTimeUUID();
-        final String name = "test";
-
-
-        CollectionContext context = new CollectionContextImpl( applicationId, applicationId, name );
-
-
-        final UUID uuid = UUIDGenerator.newTimeUUID();
-        final UUID version = UUIDGenerator.newTimeUUID();
-
-
-        MvccLogEntry returned = logEntryStrategy.load( context, uuid, version );
-
-        assertNull( "Returned value should not exist", returned );
-    }
-
-
-    @Test
-    public void getMultipleEntries() throws ConnectionException {
-
-        final UUID applicationId = UUIDGenerator.newTimeUUID();
-        final String name = "test";
-
-
-        CollectionContext context = new CollectionContextImpl( applicationId, applicationId, name );
-
-
-        final UUID uuid = UUIDGenerator.newTimeUUID();
-
-        int count = 10;
-
-        final UUID[] versions = new UUID[count];
-        final Stage COMPLETE = Stage.COMPLETE;
-        final MvccLogEntry[] entries = new MvccLogEntry[count];
-
-
-        for ( int i = 0; i < count; i++ ) {
-            versions[i] = UUIDGenerator.newTimeUUID();
-
-            entries[i] = new MvccLogEntryImpl( context, uuid, versions[i], COMPLETE );
-            logEntryStrategy.write( entries[i] ).execute();
-
-            //Read it back
-
-            MvccLogEntry returned = logEntryStrategy.load( context, uuid, versions[i] );
-
-            assertNotNull( "Returned value should not be null", returned );
-
-            assertEquals( "Returned should equal the saved", entries[i], returned );
-        }
-
-        //now do a range scan from the end
-
-        List<MvccLogEntry> results = logEntryStrategy.load( context, uuid, versions[count - 1], count );
-
-        assertEquals( count, results.size() );
-
-        for ( int i = 0; i < count; i++ ) {
-            final MvccLogEntry saved = entries[count - i - 1];
-            final MvccLogEntry returned = results.get( i );
-
-            assertEquals( "Entry was not equal to the saved value", saved, returned );
-        }
-
-        //now delete them all and ensure we get no results back
-        for ( int i = 0; i < count; i++ ) {
-            logEntryStrategy.delete( context, uuid, versions[i] ).execute();
-        }
-
-        results = logEntryStrategy.load( context, uuid, versions[versions.length - 1], versions.length );
-
-        assertEquals( "All log entries were deleted", 0, results.size() );
-    }
-
-
-    @Test
-    public void transientTimeout() throws ConnectionException, InterruptedException {
-
-        final UUID applicationId = UUIDGenerator.newTimeUUID();
-        final String name = "test";
-
-
-        CollectionContext context = new CollectionContextImpl( applicationId, applicationId, name );
-
-
-        final UUID uuid = UUIDGenerator.newTimeUUID();
-        final UUID version = UUIDGenerator.newTimeUUID();
-
-        for ( Stage stage : Stage.values() ) {
-
-            MvccLogEntry saved = new MvccLogEntryImpl( context, uuid, version, stage );
-            logEntryStrategy.write( saved ).execute();
-
-            //Read it back after the timeout
-
-            Thread.sleep( TIMEOUT * 1000 );
-
-            MvccLogEntry returned = logEntryStrategy.load( context, uuid, version );
-
-
-            if ( stage.isTransient() ) {
-
-                assertNull( "Active is transient and should time out", returned );
-            }
-            else {
-                assertNotNull( "Committed is not transient and should be returned", returned );
-
-                assertEquals( "Returned should equal the saved", saved, returned );
-            }
-        }
-    }
-
-
-    @Test(expected = NullPointerException.class)
-    public void writeParams() throws ConnectionException {
-        logEntryStrategy.write( null );
-    }
-
-
-    @Test(expected = NullPointerException.class)
-    public void deleteParamContext() throws ConnectionException {
-        logEntryStrategy.delete( null, UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID() );
-    }
-
-
-    @Test(expected = NullPointerException.class)
-    public void deleteParamEntityId() throws ConnectionException {
-
-        logEntryStrategy
-                .delete( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
-                        null, UUIDGenerator.newTimeUUID() );
-    }
-
-
-    @Test(expected = NullPointerException.class)
-    public void deleteParamVersion() throws ConnectionException {
-
-        logEntryStrategy
-                .delete( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
-                        UUIDGenerator.newTimeUUID(), null );
-    }
-
-
-    @Test(expected = NullPointerException.class)
-    public void loadParamContext() throws ConnectionException {
-        logEntryStrategy.load( null, UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID() );
-    }
-
-
-    @Test(expected = NullPointerException.class)
-    public void loadParamEntityId() throws ConnectionException {
-
-        logEntryStrategy
-                .load( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
-                        null, UUIDGenerator.newTimeUUID() );
-    }
-
-
-    @Test(expected = NullPointerException.class)
-    public void loadParamVersion() throws ConnectionException {
-
-        logEntryStrategy
-                .load( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
-                        UUIDGenerator.newTimeUUID(), null );
-    }
-
-
-    @Test(expected = NullPointerException.class)
-    public void loadListParamContext() throws ConnectionException {
-        logEntryStrategy.load( null, UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), 1 );
-    }
-
-
-    @Test(expected = NullPointerException.class)
-    public void loadListParamEntityId() throws ConnectionException {
-
-        logEntryStrategy
-                .load( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
-                        null, UUIDGenerator.newTimeUUID(), 1 );
-    }
-
-
-    @Test(expected = NullPointerException.class)
-    public void loadListParamVersion() throws ConnectionException {
-
-        logEntryStrategy
-                .load( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
-                        UUIDGenerator.newTimeUUID(), null, 1 );
-    }
-
-
-    @Test(expected = IllegalArgumentException.class)
-    public void loadListParamSize() throws ConnectionException {
-
-        logEntryStrategy
-                .load( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
-                        UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), 0 );
-    }
-
-
-    /** Mapper that will change which module we implement based on the test case */
-    public static class TimeoutModMapper implements GuiceBerryEnvSelector {
-
-        @Override
-        public Class<? extends Module> guiceBerryEnvToUse( final TestDescription testDescription ) {
-
-            //in this edge case, we want to truncate the timeout to 1 second for this test, override the env to use
-            //this module setup
-            if ( ( MvccLogEntrySerializationStrategyImplTest.class.getName() + ".transientTimeout" )
-                    .equals( testDescription.getName() ) ) {
-                return TimeoutEnv.class;
-            }
-
-            //by default, we wnat to run the TestCollectionModule
-            return TestCollectionModule.class;
-        }
-    }
-
-
-    public static class TimeoutEnv extends TestCollectionModule {
-
-        @Override
-        public Map<String, String> getOverrides() {
-            Map<String, String> timeout = new HashMap<String, String>();
-            timeout.put( MvccLogEntrySerializationStrategyImpl.TIMEOUT_PROP, TIMEOUT + "" );
-            return timeout;
-        }
-    }
-}
-

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/SerializationComparison.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/SerializationComparison.java b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/SerializationComparison.java
deleted file mode 100644
index a78293b..0000000
--- a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/SerializationComparison.java
+++ /dev/null
@@ -1,182 +0,0 @@
-package org.apache.usergrid.persistence.collection.serialization;
-
-
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.util.UUID;
-
-import org.codehaus.jackson.map.ObjectMapper;
-import org.codehaus.jackson.smile.SmileFactory;
-import org.junit.Ignore;
-import org.junit.Test;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import org.apache.usergrid.persistence.model.entity.Entity;
-import org.apache.usergrid.persistence.model.field.ArrayField;
-import org.apache.usergrid.persistence.model.field.BooleanField;
-import org.apache.usergrid.persistence.model.field.ByteBufferField;
-import org.apache.usergrid.persistence.model.field.DoubleField;
-import org.apache.usergrid.persistence.model.field.EntityObjectField;
-import org.apache.usergrid.persistence.model.field.IntegerField;
-import org.apache.usergrid.persistence.model.field.ListField;
-import org.apache.usergrid.persistence.model.field.LocationField;
-import org.apache.usergrid.persistence.model.field.LongField;
-import org.apache.usergrid.persistence.model.field.SetField;
-import org.apache.usergrid.persistence.model.field.StringField;
-import org.apache.usergrid.persistence.model.field.UUIDField;
-import org.apache.usergrid.persistence.model.util.UUIDGenerator;
-import org.apache.usergrid.persistence.model.value.EntityObject;
-import org.apache.usergrid.persistence.model.value.Location;
-
-import com.esotericsoftware.kryo.Kryo;
-import com.esotericsoftware.kryo.io.ByteBufferInputStream;
-import com.esotericsoftware.kryo.io.ByteBufferOutputStream;
-import com.esotericsoftware.kryo.io.Input;
-import com.esotericsoftware.kryo.io.Output;
-
-
-/**
- * TODO We need to get both of these serialization methods working, and benchmark them for comparison
- * Neither works out of the box for us without custom work.
- * @author tnine
- */
-public class SerializationComparison {
-
-    private static final Logger logger = LoggerFactory.getLogger( SerializationComparison.class );
-
-    private static final int count = 10000;
-
-
-    @Test
-    @Ignore
-    public void smileSerialization() throws IOException {
-        SmileFactory smile = new SmileFactory();
-
-        ObjectMapper smileMapper = new ObjectMapper( smile );
-
-
-        Entity entity = createEntity();
-
-        long writeTime = 0;
-        long readTime = 0;
-
-        for ( int i = 0; i < count; i++ ) {
-
-            //capture time in nannos for write
-            long writeStart = System.nanoTime();
-
-            byte[] smileData = smileMapper.writeValueAsBytes( entity );
-
-            writeTime += System.nanoTime() - writeStart;
-
-            long readStart = System.nanoTime();
-
-            Entity otherValue = smileMapper.readValue( smileData, Entity.class );
-
-            readTime += System.nanoTime() - readStart;
-        }
-
-        logger.info( "Smile took {} nanos for writing {} entities", writeTime, count );
-        logger.info( "Smile took {} nanos for reading {} entities", readTime, count );
-    }
-
-
-    @Test
-    @Ignore
-    public void kyroSerialization() {
-        Kryo kryo = new Kryo();
-
-        //container classes
-        kryo.register( Entity.class );
-
-        kryo.register( EntityObject.class );
-        kryo.register( Location.class );
-
-
-        //field classes
-        kryo.register( ArrayField.class );
-        kryo.register( BooleanField.class );
-        kryo.register( ByteBufferField.class );
-        kryo.register( DoubleField.class );
-        kryo.register( EntityObjectField.class );
-        kryo.register( IntegerField.class );
-        kryo.register( ListField.class );
-        kryo.register( LocationField.class );
-        kryo.register( LongField.class );
-        kryo.register( SetField.class );
-        kryo.register( StringField.class );
-        kryo.register( UUIDField.class, new de.javakaffee.kryoserializers.UUIDSerializer() );
-
-
-        long writeTime = 0;
-        long readTime = 0;
-
-        for ( int i = 0; i < count; i++ ) {
-
-            //capture time in nanos for write
-            long writeStart = System.nanoTime();
-
-            ByteBuffer data = ByteBuffer.allocate( 1024 );
-            ByteBufferOutputStream byteBuffOutputStream = new ByteBufferOutputStream(data);
-            Output output = new Output( byteBuffOutputStream );
-
-            Entity entity = createEntity();
-
-            kryo.writeObject( output, entity );
-            output.close();
-
-            writeTime += System.nanoTime() - writeStart;
-
-            data.rewind();
-
-            long readStart = System.nanoTime();
-
-
-            Input input = new Input( new ByteBufferInputStream( data ) );
-            Entity loaded = kryo.readObject( input, Entity.class );
-            input.close();
-
-            readTime += System.nanoTime() - readStart;
-        }
-
-        logger.info( "Smile took {} nanos for writing {} entities", writeTime, count );
-        logger.info( "Smile took {} nanos for reading {} entities", readTime, count );
-    }
-
-
-    private Entity createEntity() {
-
-        final UUID entityId = UUIDGenerator.newTimeUUID();
-
-        final UUID version = UUIDGenerator.newTimeUUID();
-
-        Entity entity = new Entity( entityId, "test" );
-        entity.setCreated( 1l );
-        entity.setUpdated( 2l );
-        entity.setVersion( version );
-
-
-        BooleanField boolField = new BooleanField( "boolean", false );
-        DoubleField doubleField = new DoubleField( "double", 1d );
-        IntegerField intField = new IntegerField( "long", 1 );
-        LongField longField = new LongField( "int", 1l );
-        StringField stringField = new StringField( "name", "test" );
-        UUIDField uuidField = new UUIDField( "uuid", UUIDGenerator.newTimeUUID() );
-
-        entity.setField( boolField );
-        entity.setField( doubleField );
-        entity.setField( intField );
-        entity.setField( longField );
-        entity.setField( stringField );
-        entity.setField( uuidField );
-
-        return entity;
-    }
-
-
-}
-
-
-
-

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyImplTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyImplTest.java b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyImplTest.java
new file mode 100644
index 0000000..daa9edd
--- /dev/null
+++ b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyImplTest.java
@@ -0,0 +1,438 @@
+package org.apache.usergrid.persistence.collection.serialization.impl;
+
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.UUID;
+
+import org.junit.Rule;
+import org.junit.Test;
+
+import org.apache.cassandra.db.marshal.UUIDType;
+
+import org.apache.usergrid.persistence.collection.CollectionContext;
+import org.apache.usergrid.persistence.collection.guice.TestCollectionModule;
+import org.apache.usergrid.persistence.collection.impl.CollectionContextImpl;
+import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntity;
+import org.apache.usergrid.persistence.collection.mvcc.entity.impl.MvccEntityImpl;
+import org.apache.usergrid.persistence.collection.serialization.MvccEntitySerializationStrategy;
+import org.apache.usergrid.persistence.model.entity.Entity;
+import org.apache.usergrid.persistence.model.field.BooleanField;
+import org.apache.usergrid.persistence.model.field.DoubleField;
+import org.apache.usergrid.persistence.model.field.Field;
+import org.apache.usergrid.persistence.model.field.IntegerField;
+import org.apache.usergrid.persistence.model.field.LongField;
+import org.apache.usergrid.persistence.model.field.StringField;
+import org.apache.usergrid.persistence.model.field.UUIDField;
+import org.apache.usergrid.persistence.model.util.UUIDGenerator;
+import org.apache.usergrid.persistence.test.CassandraRule;
+
+import com.google.common.base.Optional;
+import com.google.guiceberry.junit4.GuiceBerryRule;
+import com.google.inject.Inject;
+import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
+import com.netflix.astyanax.serializers.UUIDSerializer;
+
+import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertSame;
+import static junit.framework.TestCase.assertFalse;
+import static junit.framework.TestCase.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+
+
+/** @author tnine */
+public class MvccEntitySerializationStrategyImplTest {
+
+    @Rule
+    public final GuiceBerryRule guiceBerry = new GuiceBerryRule( TestCollectionModule.class );
+
+    @Rule
+    public final CassandraRule rule = new CassandraRule();
+
+    @Inject
+    private MvccEntitySerializationStrategy serializationStrategy;
+
+
+    @Test
+    public void writeLoadDelete() throws ConnectionException {
+
+        final UUID applicationId = UUIDGenerator.newTimeUUID();
+        final String name = "test";
+
+        CollectionContext context = new CollectionContextImpl( applicationId, applicationId, name );
+
+
+        final UUID entityId = UUIDGenerator.newTimeUUID();
+        final UUID version = UUIDGenerator.newTimeUUID();
+        final String type = "test";
+        final long created = 1l;
+        final long updated = 2l;
+
+        Entity entity = new Entity( entityId, type );
+
+        entity.setVersion( version );
+        entity.setCreated( created );
+        entity.setUpdated( updated );
+
+
+        BooleanField boolField = new BooleanField( "boolean", false );
+        DoubleField doubleField = new DoubleField( "double", 1d );
+        IntegerField intField = new IntegerField( "long", 1 );
+        LongField longField = new LongField( "int", 1l );
+        StringField stringField = new StringField( "name", "test" );
+        UUIDField uuidField = new UUIDField( "uuid", UUIDGenerator.newTimeUUID() );
+
+        entity.setField( boolField );
+        entity.setField( doubleField );
+        entity.setField( intField );
+        entity.setField( longField );
+        entity.setField( stringField );
+        entity.setField( uuidField );
+
+
+        MvccEntity saved = new MvccEntityImpl( entityId, version, Optional.of( entity ) );
+
+
+        //persist the entity
+        serializationStrategy.write( context, saved ).execute();
+
+        //now read it back
+
+        MvccEntity returned = serializationStrategy.load( context, entityId, version );
+
+        assertEquals( "Mvcc entities are the same", saved, returned );
+
+
+        assertEquals( entityId, entity.getUuid() );
+        assertEquals( type, entity.getType() );
+        assertEquals( created, entity.getCreated() );
+        assertEquals( updated, entity.getUpdated() );
+
+
+        Field<Boolean> boolFieldReturned = entity.getField( boolField.getName() );
+
+        assertSame( boolField, boolFieldReturned );
+
+        Field<Double> doubleFieldReturned = entity.getField( doubleField.getName() );
+
+        assertSame( doubleField, doubleFieldReturned );
+
+        Field<Integer> intFieldReturned = entity.getField( intField.getName() );
+
+        assertSame( intField, intFieldReturned );
+
+        Field<Long> longFieldReturned = entity.getField( longField.getName() );
+
+        assertSame( longField, longFieldReturned );
+
+        Field<String> stringFieldReturned = entity.getField( stringField.getName() );
+
+        assertSame( stringField, stringFieldReturned );
+
+        Field<UUID> uuidFieldReturned = entity.getField( uuidField.getName() );
+
+        assertSame( uuidField, uuidFieldReturned );
+
+
+        Set<Field> results = new HashSet<Field>();
+        results.addAll( entity.getFields() );
+
+
+        assertTrue( results.contains( boolField ) );
+        assertTrue( results.contains( doubleField ) );
+        assertTrue( results.contains( intField ) );
+        assertTrue( results.contains( longField ) );
+        assertTrue( results.contains( stringField ) );
+        assertTrue( results.contains( uuidField ) );
+
+        assertEquals( 6, results.size() );
+
+
+        assertEquals( entityId, entity.getUuid() );
+        assertEquals( version, entity.getVersion() );
+
+
+        //now delete it
+        serializationStrategy.delete( context, entityId, version ).execute();
+
+        //now get it, should be gone
+
+        returned = serializationStrategy.load( context, entityId, version );
+
+        assertNull( returned );
+    }
+
+
+    @Test
+    public void writeLoadClearDelete() throws ConnectionException {
+
+        final UUID applicationId = UUIDGenerator.newTimeUUID();
+        final String name = "test";
+
+        CollectionContext context = new CollectionContextImpl( applicationId, applicationId, name );
+
+
+        final UUID entityId = UUIDGenerator.newTimeUUID();
+        final UUID version = UUIDGenerator.newTimeUUID();
+        final String type = "test";
+        final long created = 1l;
+        final long updated = 2l;
+
+        Entity entity = new Entity( entityId, type );
+
+        entity.setVersion( version );
+        entity.setCreated( created );
+        entity.setUpdated( updated );
+
+
+        MvccEntity saved = new MvccEntityImpl( entityId, version, Optional.of( entity ) );
+
+
+        //persist the entity
+        serializationStrategy.write( context, saved ).execute();
+
+        //now read it back
+
+        MvccEntity returned = serializationStrategy.load( context, entityId, version );
+
+        assertEquals( "Mvcc entities are the same", saved, returned );
+
+
+        assertEquals( entityId, entity.getUuid() );
+        assertEquals( type, entity.getType() );
+        assertEquals( created, entity.getCreated() );
+        assertEquals( updated, entity.getUpdated() );
+
+
+        //now clear it
+
+        serializationStrategy.clear( context, entityId, version ).execute();
+
+        returned = serializationStrategy.load( context, entityId, version );
+
+        assertEquals( entityId, returned.getUuid() );
+        assertEquals( version, returned.getVersion() );
+        assertFalse( returned.getEntity().isPresent() );
+
+        //now delete it
+        serializationStrategy.delete( context, entityId, version ).execute();
+
+        //now get it, should be gone
+
+        returned = serializationStrategy.load( context, entityId, version );
+
+        assertNull( returned );
+    }
+
+
+    @Test
+    public void writeX2ClearDelete() throws ConnectionException {
+
+        final UUID applicationId = UUIDGenerator.newTimeUUID();
+        final String name = "test";
+
+        CollectionContext context = new CollectionContextImpl( applicationId, applicationId, name );
+
+
+        final UUID entityId = UUIDGenerator.newTimeUUID();
+        final UUID version1 = UUIDGenerator.newTimeUUID();
+        final String type = "test";
+
+        Entity entityv1 = new Entity( entityId, type );
+
+        entityv1.setVersion( version1 );
+
+
+        MvccEntity saved = new MvccEntityImpl( entityId, version1, Optional.of( entityv1 ) );
+
+
+        //persist the entity
+        serializationStrategy.write( context, saved ).execute();
+
+        //now read it back
+
+        MvccEntity returnedV1 = serializationStrategy.load( context, entityId, version1 );
+
+        assertEquals( "Mvcc entities are the same", saved, returnedV1 );
+
+
+        assertEquals( entityId, entityv1.getUuid() );
+        assertEquals( type, entityv1.getType() );
+
+
+        //now write a new version of it
+
+
+        Entity entityv2 = new Entity( entityId, type );
+
+        UUID version2 = UUIDGenerator.newTimeUUID();
+        entityv2.setVersion( version2 );
+
+
+        UUIDType comparator = UUIDType.instance;
+
+        int value = comparator.compare( UUIDSerializer.get().toByteBuffer( version1 ),
+                UUIDSerializer.get().toByteBuffer( version2 ) );
+
+        assertTrue( value < 0 );
+
+        value = comparator.compare( UUIDSerializer.get().toByteBuffer( version2 ),
+                UUIDSerializer.get().toByteBuffer( version2 ) );
+
+        assertEquals( 0, value );
+
+        MvccEntity savedV2 = new MvccEntityImpl( entityId, version2, Optional.of( entityv2 ) );
+
+        serializationStrategy.write( context, savedV2 ).execute();
+
+        MvccEntity returnedV2 = serializationStrategy.load( context, entityId, version2 );
+
+        assertEquals( "Mvcc entities are the same", savedV2, returnedV2 );
+
+
+        //now clear it at v3
+
+        UUID version3 = UUIDGenerator.newTimeUUID();
+
+        serializationStrategy.clear( context, entityId, version3 ).execute();
+
+
+        final Optional<Entity> empty = Optional.absent();
+
+        MvccEntity clearedV3 = new MvccEntityImpl( entityId, version3, empty );
+
+        MvccEntity returnedV3 = serializationStrategy.load( context, entityId, version3 );
+
+        assertEquals( "entities are the same", clearedV3, returnedV3 );
+
+        //now ask for up to 10 versions from the current version, we should get cleared, v2, v1
+        UUID current = UUIDGenerator.newTimeUUID();
+
+        List<MvccEntity> entities = serializationStrategy.load( context, entityId, current, 3 );
+
+        assertEquals( 3, entities.size() );
+
+        assertEquals( clearedV3, entities.get( 0 ) );
+
+        assertEquals( returnedV2, entities.get( 1 ) );
+
+        assertEquals( returnedV1, entities.get( 2 ) );
+
+
+        //now delete v2 and v1, we should still get v3
+        serializationStrategy.delete( context, entityId, version1 ).execute();
+        serializationStrategy.delete( context, entityId, version2 ).execute();
+
+        entities = serializationStrategy.load( context, entityId, current, 3 );
+
+        assertEquals( 1, entities.size() );
+
+        assertEquals( clearedV3, entities.get( 0 ) );
+
+
+        //now get it, should be gone
+        serializationStrategy.delete( context, entityId, version3 ).execute();
+
+
+        entities = serializationStrategy.load( context, entityId, current, 3 );
+
+        assertEquals( 0, entities.size() );
+    }
+
+
+    @Test( expected = NullPointerException.class )
+    public void writeParamsContext() throws ConnectionException {
+        serializationStrategy.write( null, mock( MvccEntity.class ) );
+    }
+
+
+    @Test( expected = NullPointerException.class )
+    public void writeParamsEntity() throws ConnectionException {
+        serializationStrategy
+                .write( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
+                        null );
+    }
+
+
+    @Test( expected = NullPointerException.class )
+    public void deleteParamContext() throws ConnectionException {
+        serializationStrategy.delete( null, UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID() );
+    }
+
+
+    @Test( expected = NullPointerException.class )
+    public void deleteParamEntityId() throws ConnectionException {
+
+        serializationStrategy
+                .delete( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
+                        null, UUIDGenerator.newTimeUUID() );
+    }
+
+
+    @Test( expected = NullPointerException.class )
+    public void deleteParamVersion() throws ConnectionException {
+
+        serializationStrategy
+                .delete( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
+                        UUIDGenerator.newTimeUUID(), null );
+    }
+
+
+    @Test( expected = NullPointerException.class )
+    public void loadParamContext() throws ConnectionException {
+        serializationStrategy.load( null, UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID() );
+    }
+
+
+    @Test( expected = NullPointerException.class )
+    public void loadParamEntityId() throws ConnectionException {
+
+        serializationStrategy
+                .load( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
+                        null, UUIDGenerator.newTimeUUID() );
+    }
+
+
+    @Test( expected = NullPointerException.class )
+    public void loadParamVersion() throws ConnectionException {
+
+        serializationStrategy
+                .load( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
+                        UUIDGenerator.newTimeUUID(), null );
+    }
+
+
+    @Test( expected = NullPointerException.class )
+    public void loadListParamContext() throws ConnectionException {
+        serializationStrategy.load( null, UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), 1 );
+    }
+
+
+    @Test( expected = NullPointerException.class )
+    public void loadListParamEntityId() throws ConnectionException {
+
+        serializationStrategy
+                .load( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
+                        null, UUIDGenerator.newTimeUUID(), 1 );
+    }
+
+
+    @Test( expected = NullPointerException.class )
+    public void loadListParamVersion() throws ConnectionException {
+
+        serializationStrategy
+                .load( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
+                        UUIDGenerator.newTimeUUID(), null, 1 );
+    }
+
+
+    @Test( expected = IllegalArgumentException.class )
+    public void loadListParamSize() throws ConnectionException {
+
+        serializationStrategy
+                .load( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
+                        UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), 0 );
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccLogEntrySerializationStrategyImplTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccLogEntrySerializationStrategyImplTest.java b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccLogEntrySerializationStrategyImplTest.java
new file mode 100644
index 0000000..9c47e08
--- /dev/null
+++ b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccLogEntrySerializationStrategyImplTest.java
@@ -0,0 +1,319 @@
+package org.apache.usergrid.persistence.collection.serialization.impl;
+
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+import org.junit.Rule;
+import org.junit.Test;
+
+import org.apache.usergrid.persistence.collection.CollectionContext;
+import org.apache.usergrid.persistence.collection.impl.CollectionContextImpl;
+import org.apache.usergrid.persistence.collection.guice.TestCollectionModule;
+import org.apache.usergrid.persistence.collection.mvcc.entity.MvccLogEntry;
+import org.apache.usergrid.persistence.collection.mvcc.entity.impl.MvccLogEntryImpl;
+import org.apache.usergrid.persistence.collection.mvcc.entity.Stage;
+import org.apache.usergrid.persistence.collection.serialization.MvccLogEntrySerializationStrategy;
+import org.apache.usergrid.persistence.model.util.UUIDGenerator;
+import org.apache.usergrid.persistence.test.CassandraRule;
+
+import com.google.guiceberry.GuiceBerryEnvSelector;
+import com.google.guiceberry.TestDescription;
+import com.google.guiceberry.junit4.GuiceBerryRule;
+import com.google.inject.Inject;
+import com.google.inject.Module;
+import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
+
+import static junit.framework.Assert.assertNotNull;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.mockito.Mockito.mock;
+
+
+/** @author tnine */
+public class MvccLogEntrySerializationStrategyImplTest {
+
+
+    /** Set our timeout to 1 seconds.  If it works for 1 seconds, we'll be good a any value */
+    private static final int TIMEOUT = 1;
+
+
+    @Rule
+    public final GuiceBerryRule guiceBerry = new GuiceBerryRule( new TimeoutModMapper() );
+
+    @Rule
+    public final CassandraRule rule = new CassandraRule();
+
+    @Inject
+    private MvccLogEntrySerializationStrategy logEntryStrategy;
+
+
+    @Test
+    public void createAndDelete() throws ConnectionException {
+
+        final UUID applicationId = UUIDGenerator.newTimeUUID();
+        final String name = "test";
+
+
+        CollectionContext context = new CollectionContextImpl( applicationId, applicationId, name );
+
+
+        final UUID uuid = UUIDGenerator.newTimeUUID();
+        final UUID version = UUIDGenerator.newTimeUUID();
+
+        for ( Stage stage : Stage.values() ) {
+            MvccLogEntry saved = new MvccLogEntryImpl(  uuid, version, stage );
+            logEntryStrategy.write( context, saved ).execute();
+
+            //Read it back
+
+            MvccLogEntry returned = logEntryStrategy.load( context, uuid, version );
+
+            assertNotNull( "Returned value should not be null", returned );
+
+            assertEquals( "Returned should equal the saved", saved, returned );
+        }
+    }
+
+
+    @Test
+    public void loadNoData() throws ConnectionException {
+
+        final UUID applicationId = UUIDGenerator.newTimeUUID();
+        final String name = "test";
+
+
+        CollectionContext context = new CollectionContextImpl( applicationId, applicationId, name );
+
+
+        final UUID uuid = UUIDGenerator.newTimeUUID();
+        final UUID version = UUIDGenerator.newTimeUUID();
+
+
+        MvccLogEntry returned = logEntryStrategy.load( context, uuid, version );
+
+        assertNull( "Returned value should not exist", returned );
+    }
+
+
+    @Test
+    public void getMultipleEntries() throws ConnectionException {
+
+        final UUID applicationId = UUIDGenerator.newTimeUUID();
+        final String name = "test";
+
+
+        CollectionContext context = new CollectionContextImpl( applicationId, applicationId, name );
+
+
+        final UUID uuid = UUIDGenerator.newTimeUUID();
+
+        int count = 10;
+
+        final UUID[] versions = new UUID[count];
+        final Stage COMPLETE = Stage.COMPLETE;
+        final MvccLogEntry[] entries = new MvccLogEntry[count];
+
+
+        for ( int i = 0; i < count; i++ ) {
+            versions[i] = UUIDGenerator.newTimeUUID();
+
+            entries[i] = new MvccLogEntryImpl( uuid, versions[i], COMPLETE );
+            logEntryStrategy.write( context,  entries[i] ).execute();
+
+            //Read it back
+
+            MvccLogEntry returned = logEntryStrategy.load( context, uuid, versions[i] );
+
+            assertNotNull( "Returned value should not be null", returned );
+
+            assertEquals( "Returned should equal the saved", entries[i], returned );
+        }
+
+        //now do a range scan from the end
+
+        List<MvccLogEntry> results = logEntryStrategy.load( context, uuid, versions[count - 1], count );
+
+        assertEquals( count, results.size() );
+
+        for ( int i = 0; i < count; i++ ) {
+            final MvccLogEntry saved = entries[count - i - 1];
+            final MvccLogEntry returned = results.get( i );
+
+            assertEquals( "Entry was not equal to the saved value", saved, returned );
+        }
+
+        //now delete them all and ensure we get no results back
+        for ( int i = 0; i < count; i++ ) {
+            logEntryStrategy.delete( context, uuid, versions[i] ).execute();
+        }
+
+        results = logEntryStrategy.load( context, uuid, versions[versions.length - 1], versions.length );
+
+        assertEquals( "All log entries were deleted", 0, results.size() );
+    }
+
+
+    @Test
+    public void transientTimeout() throws ConnectionException, InterruptedException {
+
+        final UUID applicationId = UUIDGenerator.newTimeUUID();
+        final String name = "test";
+
+
+        CollectionContext context = new CollectionContextImpl( applicationId, applicationId, name );
+
+
+        final UUID uuid = UUIDGenerator.newTimeUUID();
+        final UUID version = UUIDGenerator.newTimeUUID();
+
+        for ( Stage stage : Stage.values() ) {
+
+            MvccLogEntry saved = new MvccLogEntryImpl( uuid, version, stage );
+            logEntryStrategy.write(context,  saved ).execute();
+
+            //Read it back after the timeout
+
+            Thread.sleep( TIMEOUT * 1000 );
+
+            MvccLogEntry returned = logEntryStrategy.load( context, uuid, version );
+
+
+            if ( stage.isTransient() ) {
+
+                assertNull( "Active is transient and should time out", returned );
+            }
+            else {
+                assertNotNull( "Committed is not transient and should be returned", returned );
+
+                assertEquals( "Returned should equal the saved", saved, returned );
+            }
+        }
+    }
+
+
+    @Test(expected = NullPointerException.class)
+    public void writeParamsNoContext() throws ConnectionException {
+        logEntryStrategy.write( null, mock(MvccLogEntry.class) );
+    }
+
+
+    @Test(expected = NullPointerException.class)
+    public void writeParams() throws ConnectionException {
+        logEntryStrategy.write( mock(CollectionContext.class), null );
+    }
+
+
+    @Test(expected = NullPointerException.class)
+    public void deleteParamContext() throws ConnectionException {
+        logEntryStrategy.delete( null, UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID() );
+    }
+
+
+    @Test(expected = NullPointerException.class)
+    public void deleteParamEntityId() throws ConnectionException {
+
+        logEntryStrategy
+                .delete( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
+                        null, UUIDGenerator.newTimeUUID() );
+    }
+
+
+    @Test(expected = NullPointerException.class)
+    public void deleteParamVersion() throws ConnectionException {
+
+        logEntryStrategy
+                .delete( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
+                        UUIDGenerator.newTimeUUID(), null );
+    }
+
+
+    @Test(expected = NullPointerException.class)
+    public void loadParamContext() throws ConnectionException {
+        logEntryStrategy.load( null, UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID() );
+    }
+
+
+    @Test(expected = NullPointerException.class)
+    public void loadParamEntityId() throws ConnectionException {
+
+        logEntryStrategy
+                .load( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
+                        null, UUIDGenerator.newTimeUUID() );
+    }
+
+
+    @Test(expected = NullPointerException.class)
+    public void loadParamVersion() throws ConnectionException {
+
+        logEntryStrategy
+                .load( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
+                        UUIDGenerator.newTimeUUID(), null );
+    }
+
+
+    @Test(expected = NullPointerException.class)
+    public void loadListParamContext() throws ConnectionException {
+        logEntryStrategy.load( null, UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), 1 );
+    }
+
+
+    @Test(expected = NullPointerException.class)
+    public void loadListParamEntityId() throws ConnectionException {
+
+        logEntryStrategy
+                .load( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
+                        null, UUIDGenerator.newTimeUUID(), 1 );
+    }
+
+
+    @Test(expected = NullPointerException.class)
+    public void loadListParamVersion() throws ConnectionException {
+
+        logEntryStrategy
+                .load( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
+                        UUIDGenerator.newTimeUUID(), null, 1 );
+    }
+
+
+    @Test(expected = IllegalArgumentException.class)
+    public void loadListParamSize() throws ConnectionException {
+
+        logEntryStrategy
+                .load( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
+                        UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), 0 );
+    }
+
+
+    /** Mapper that will change which module we implement based on the test case */
+    public static class TimeoutModMapper implements GuiceBerryEnvSelector {
+
+        @Override
+        public Class<? extends Module> guiceBerryEnvToUse( final TestDescription testDescription ) {
+
+            //in this edge case, we want to truncate the timeout to 1 second for this test, override the env to use
+            //this module setup
+            if ( ( MvccLogEntrySerializationStrategyImplTest.class.getName() + ".transientTimeout" )
+                    .equals( testDescription.getName() ) ) {
+                return TimeoutEnv.class;
+            }
+
+            //by default, we wnat to run the TestCollectionModule
+            return TestCollectionModule.class;
+        }
+    }
+
+
+    public static class TimeoutEnv extends TestCollectionModule {
+
+        @Override
+        public Map<String, String> getOverrides() {
+            Map<String, String> timeout = new HashMap<String, String>();
+            timeout.put( MvccLogEntrySerializationStrategyImpl.TIMEOUT_PROP, TIMEOUT + "" );
+            return timeout;
+        }
+    }
+}
+

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/impl/SerializationComparison.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/impl/SerializationComparison.java b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/impl/SerializationComparison.java
new file mode 100644
index 0000000..e3dc3b1
--- /dev/null
+++ b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/impl/SerializationComparison.java
@@ -0,0 +1,182 @@
+package org.apache.usergrid.persistence.collection.serialization.impl;
+
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.util.UUID;
+
+import org.codehaus.jackson.map.ObjectMapper;
+import org.codehaus.jackson.smile.SmileFactory;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.usergrid.persistence.model.entity.Entity;
+import org.apache.usergrid.persistence.model.field.ArrayField;
+import org.apache.usergrid.persistence.model.field.BooleanField;
+import org.apache.usergrid.persistence.model.field.ByteBufferField;
+import org.apache.usergrid.persistence.model.field.DoubleField;
+import org.apache.usergrid.persistence.model.field.EntityObjectField;
+import org.apache.usergrid.persistence.model.field.IntegerField;
+import org.apache.usergrid.persistence.model.field.ListField;
+import org.apache.usergrid.persistence.model.field.LocationField;
+import org.apache.usergrid.persistence.model.field.LongField;
+import org.apache.usergrid.persistence.model.field.SetField;
+import org.apache.usergrid.persistence.model.field.StringField;
+import org.apache.usergrid.persistence.model.field.UUIDField;
+import org.apache.usergrid.persistence.model.util.UUIDGenerator;
+import org.apache.usergrid.persistence.model.value.EntityObject;
+import org.apache.usergrid.persistence.model.value.Location;
+
+import com.esotericsoftware.kryo.Kryo;
+import com.esotericsoftware.kryo.io.ByteBufferInputStream;
+import com.esotericsoftware.kryo.io.ByteBufferOutputStream;
+import com.esotericsoftware.kryo.io.Input;
+import com.esotericsoftware.kryo.io.Output;
+
+
+/**
+ * TODO We need to get both of these serialization methods working, and benchmark them for comparison
+ * Neither works out of the box for us without custom work.
+ * @author tnine
+ */
+public class SerializationComparison {
+
+    private static final Logger logger = LoggerFactory.getLogger( SerializationComparison.class );
+
+    private static final int count = 10000;
+
+
+    @Test
+    @Ignore
+    public void smileSerialization() throws IOException {
+        SmileFactory smile = new SmileFactory();
+
+        ObjectMapper smileMapper = new ObjectMapper( smile );
+
+
+        Entity entity = createEntity();
+
+        long writeTime = 0;
+        long readTime = 0;
+
+        for ( int i = 0; i < count; i++ ) {
+
+            //capture time in nannos for write
+            long writeStart = System.nanoTime();
+
+            byte[] smileData = smileMapper.writeValueAsBytes( entity );
+
+            writeTime += System.nanoTime() - writeStart;
+
+            long readStart = System.nanoTime();
+
+            Entity otherValue = smileMapper.readValue( smileData, Entity.class );
+
+            readTime += System.nanoTime() - readStart;
+        }
+
+        logger.info( "Smile took {} nanos for writing {} entities", writeTime, count );
+        logger.info( "Smile took {} nanos for reading {} entities", readTime, count );
+    }
+
+
+    @Test
+    @Ignore
+    public void kyroSerialization() {
+        Kryo kryo = new Kryo();
+
+        //container classes
+        kryo.register( Entity.class );
+
+        kryo.register( EntityObject.class );
+        kryo.register( Location.class );
+
+
+        //field classes
+        kryo.register( ArrayField.class );
+        kryo.register( BooleanField.class );
+        kryo.register( ByteBufferField.class );
+        kryo.register( DoubleField.class );
+        kryo.register( EntityObjectField.class );
+        kryo.register( IntegerField.class );
+        kryo.register( ListField.class );
+        kryo.register( LocationField.class );
+        kryo.register( LongField.class );
+        kryo.register( SetField.class );
+        kryo.register( StringField.class );
+        kryo.register( UUIDField.class, new de.javakaffee.kryoserializers.UUIDSerializer() );
+
+
+        long writeTime = 0;
+        long readTime = 0;
+
+        for ( int i = 0; i < count; i++ ) {
+
+            //capture time in nanos for write
+            long writeStart = System.nanoTime();
+
+            ByteBuffer data = ByteBuffer.allocate( 1024 );
+            ByteBufferOutputStream byteBuffOutputStream = new ByteBufferOutputStream(data);
+            Output output = new Output( byteBuffOutputStream );
+
+            Entity entity = createEntity();
+
+            kryo.writeObject( output, entity );
+            output.close();
+
+            writeTime += System.nanoTime() - writeStart;
+
+            data.rewind();
+
+            long readStart = System.nanoTime();
+
+
+            Input input = new Input( new ByteBufferInputStream( data ) );
+            Entity loaded = kryo.readObject( input, Entity.class );
+            input.close();
+
+            readTime += System.nanoTime() - readStart;
+        }
+
+        logger.info( "Smile took {} nanos for writing {} entities", writeTime, count );
+        logger.info( "Smile took {} nanos for reading {} entities", readTime, count );
+    }
+
+
+    private Entity createEntity() {
+
+        final UUID entityId = UUIDGenerator.newTimeUUID();
+
+        final UUID version = UUIDGenerator.newTimeUUID();
+
+        Entity entity = new Entity( entityId, "test" );
+        entity.setCreated( 1l );
+        entity.setUpdated( 2l );
+        entity.setVersion( version );
+
+
+        BooleanField boolField = new BooleanField( "boolean", false );
+        DoubleField doubleField = new DoubleField( "double", 1d );
+        IntegerField intField = new IntegerField( "long", 1 );
+        LongField longField = new LongField( "int", 1l );
+        StringField stringField = new StringField( "name", "test" );
+        UUIDField uuidField = new UUIDField( "uuid", UUIDGenerator.newTimeUUID() );
+
+        entity.setField( boolField );
+        entity.setField( doubleField );
+        entity.setField( intField );
+        entity.setField( longField );
+        entity.setField( stringField );
+        entity.setField( uuidField );
+
+        return entity;
+    }
+
+
+}
+
+
+
+

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/index/src/main/java/org/apache/usergrid/persistence/index/stage/Complete.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/index/src/main/java/org/apache/usergrid/persistence/index/stage/Complete.java b/stack/corepersistence/index/src/main/java/org/apache/usergrid/persistence/index/stage/Complete.java
index cc0bc35..dad2b21 100644
--- a/stack/corepersistence/index/src/main/java/org/apache/usergrid/persistence/index/stage/Complete.java
+++ b/stack/corepersistence/index/src/main/java/org/apache/usergrid/persistence/index/stage/Complete.java
@@ -1,7 +1,6 @@
 package org.apache.usergrid.persistence.index.stage;
 
 
-import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntity;
 import org.apache.usergrid.persistence.collection.mvcc.stage.WriteContext;
 import org.apache.usergrid.persistence.collection.mvcc.stage.WriteStage;
 
@@ -15,8 +14,8 @@ public class Complete implements WriteStage
 {
 
     @Override
-    public void performStage( WriteContext context, final MvccEntity entity ) {
-
-    }
+        public void performStage( final WriteContext context ) {
+            //To change body of implemented methods use File | Settings | File Templates.
+        }
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/index/src/main/java/org/apache/usergrid/persistence/index/stage/Start.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/index/src/main/java/org/apache/usergrid/persistence/index/stage/Start.java b/stack/corepersistence/index/src/main/java/org/apache/usergrid/persistence/index/stage/Start.java
index d97b81c..05ecb1d 100644
--- a/stack/corepersistence/index/src/main/java/org/apache/usergrid/persistence/index/stage/Start.java
+++ b/stack/corepersistence/index/src/main/java/org/apache/usergrid/persistence/index/stage/Start.java
@@ -1,20 +1,16 @@
 package org.apache.usergrid.persistence.index.stage;
 
 
-import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntity;
 import org.apache.usergrid.persistence.collection.mvcc.stage.WriteContext;
 import org.apache.usergrid.persistence.collection.mvcc.stage.WriteStage;
 
-import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
-
 
 /** This state should signal an index update has started */
 public class Start implements WriteStage
 {
 
-
     @Override
-    public void performStage( final WriteContext context, final MvccEntity entity ) throws ConnectionException {
+    public void performStage( final WriteContext context ) {
         //To change body of implemented methods use File | Settings | File Templates.
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/index/src/main/java/org/apache/usergrid/persistence/index/stage/Write.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/index/src/main/java/org/apache/usergrid/persistence/index/stage/Write.java b/stack/corepersistence/index/src/main/java/org/apache/usergrid/persistence/index/stage/Write.java
index e143a6b..cff6d97 100644
--- a/stack/corepersistence/index/src/main/java/org/apache/usergrid/persistence/index/stage/Write.java
+++ b/stack/corepersistence/index/src/main/java/org/apache/usergrid/persistence/index/stage/Write.java
@@ -1,21 +1,18 @@
 package org.apache.usergrid.persistence.index.stage;
 
 
-import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntity;
 import org.apache.usergrid.persistence.collection.mvcc.stage.WriteContext;
 import org.apache.usergrid.persistence.collection.mvcc.stage.WriteStage;
 
-import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
-
 
 /** This state should perform an update of the index. */
 public class Write implements WriteStage
 {
 
 
-    @Override
-    public void performStage( final WriteContext context, final MvccEntity entity ) throws ConnectionException {
-        //To change body of implemented methods use File | Settings | File Templates.
-    }
+@Override
+       public void performStage( final WriteContext context ) {
+           //To change body of implemented methods use File | Settings | File Templates.
+       }
 }
 


[2/5] git commit: WIP. Need to finish creating pipelines etc before merging.

Posted by to...@apache.org.
WIP.  Need to finish creating pipelines etc before merging.


Project: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/commit/271b26c8
Tree: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/tree/271b26c8
Diff: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/diff/271b26c8

Branch: refs/heads/two-dot-o
Commit: 271b26c8b25fa7e0f2250a35bc8e8caf78984581
Parents: b2833c3
Author: Todd Nine <to...@apache.org>
Authored: Mon Dec 2 20:29:39 2013 -0700
Committer: Todd Nine <to...@apache.org>
Committed: Mon Dec 2 20:29:39 2013 -0700

----------------------------------------------------------------------
 .../collection/guice/CollectionModule.java      |  2 +-
 .../collection/mvcc/stage/StagePipeline.java    |  1 +
 .../collection/mvcc/stage/WriteContext.java     |  2 +-
 .../stage/impl/CollectionPipelineModule.java    | 11 -------
 .../mvcc/stage/impl/CreatePipeline.java         |  4 +--
 .../mvcc/stage/impl/StagePipelineImpl.java      |  4 ---
 .../collection/mvcc/stage/impl/Start.java       |  5 +--
 .../mvcc/stage/impl/WriteContextCallback.java   | 34 ++++++++++++++++++++
 8 files changed, 42 insertions(+), 21 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/271b26c8/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/guice/CollectionModule.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/guice/CollectionModule.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/guice/CollectionModule.java
index e675e88..5f5d544 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/guice/CollectionModule.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/guice/CollectionModule.java
@@ -6,9 +6,9 @@ import org.apache.usergrid.persistence.collection.migration.Migration;
 import org.apache.usergrid.persistence.collection.migration.MigrationManager;
 import org.apache.usergrid.persistence.collection.migration.MigrationManagerImpl;
 import org.apache.usergrid.persistence.collection.mvcc.stage.StagePipeline;
-import org.apache.usergrid.persistence.collection.mvcc.stage.impl.UpdatePipeline;
 import org.apache.usergrid.persistence.collection.mvcc.stage.impl.CreatePipeline;
 import org.apache.usergrid.persistence.collection.mvcc.stage.impl.DeletePipeline;
+import org.apache.usergrid.persistence.collection.mvcc.stage.impl.UpdatePipeline;
 import org.apache.usergrid.persistence.collection.serialization.MvccEntitySerializationStrategy;
 import org.apache.usergrid.persistence.collection.serialization.MvccEntitySerializationStrategyImpl;
 import org.apache.usergrid.persistence.collection.serialization.MvccLogEntrySerializationStrategy;

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/271b26c8/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/StagePipeline.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/StagePipeline.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/StagePipeline.java
index 30b274c..562d852 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/StagePipeline.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/StagePipeline.java
@@ -15,6 +15,7 @@ public interface StagePipeline {
      */
     public WriteStage next();
 
+
     /**
      * Insert a new stage directly after the current stage.  This can be used
      * to add additional validation during write phases depending on the mvcc entity

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/271b26c8/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/WriteContext.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/WriteContext.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/WriteContext.java
index 38aa9d4..42cb6ab 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/WriteContext.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/WriteContext.java
@@ -18,7 +18,7 @@ public interface WriteContext {
      * Perform the write in the context with the specified entity
      * @param entity
      */
-    void performWrite(MvccEntity entity);
+    void nextStage(MvccEntity entity);
 
 
 

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/271b26c8/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/CollectionPipelineModule.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/CollectionPipelineModule.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/CollectionPipelineModule.java
index 67ca516..809d92f 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/CollectionPipelineModule.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/CollectionPipelineModule.java
@@ -1,24 +1,13 @@
 package org.apache.usergrid.persistence.collection.mvcc.stage.impl;
 
 
-import org.apache.usergrid.persistence.collection.astynax.AstynaxKeyspaceProvider;
-import org.apache.usergrid.persistence.collection.guice.PropertyUtils;
-import org.apache.usergrid.persistence.collection.migration.Migration;
-import org.apache.usergrid.persistence.collection.migration.MigrationManager;
-import org.apache.usergrid.persistence.collection.migration.MigrationManagerImpl;
 import org.apache.usergrid.persistence.collection.mvcc.stage.StagePipeline;
-import org.apache.usergrid.persistence.collection.mvcc.stage.WriteStage;
 import org.apache.usergrid.persistence.collection.serialization.MvccEntitySerializationStrategy;
-import org.apache.usergrid.persistence.collection.serialization.MvccEntitySerializationStrategyImpl;
 import org.apache.usergrid.persistence.collection.serialization.MvccLogEntrySerializationStrategy;
-import org.apache.usergrid.persistence.collection.serialization.MvccLogEntrySerializationStrategyImpl;
 
 import com.google.inject.AbstractModule;
 import com.google.inject.Inject;
 import com.google.inject.Provides;
-import com.google.inject.multibindings.Multibinder;
-import com.google.inject.name.Names;
-import com.netflix.astyanax.Keyspace;
 
 
 /**

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/271b26c8/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/CreatePipeline.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/CreatePipeline.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/CreatePipeline.java
index fb7e7c1..e700940 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/CreatePipeline.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/CreatePipeline.java
@@ -6,10 +6,10 @@ import java.lang.annotation.Target;
 
 import com.google.inject.BindingAnnotation;
 
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import static java.lang.annotation.ElementType.PARAMETER;
 import static java.lang.annotation.ElementType.FIELD;
 import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
 
 
 /**

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/271b26c8/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/StagePipelineImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/StagePipelineImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/StagePipelineImpl.java
index 5de58c5..b63769b 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/StagePipelineImpl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/StagePipelineImpl.java
@@ -1,13 +1,9 @@
 package org.apache.usergrid.persistence.collection.mvcc.stage.impl;
 
 
-import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.List;
-import java.util.NoSuchElementException;
 
-import org.apache.usergrid.persistence.collection.mvcc.entity.Stage;
 import org.apache.usergrid.persistence.collection.mvcc.stage.StagePipeline;
 import org.apache.usergrid.persistence.collection.mvcc.stage.WriteStage;
 

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/271b26c8/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Start.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Start.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Start.java
index 6d4b63c..d86276d 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Start.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Start.java
@@ -12,6 +12,7 @@ import org.apache.usergrid.persistence.collection.mvcc.stage.WriteContext;
 import org.apache.usergrid.persistence.collection.mvcc.stage.WriteStage;
 import org.apache.usergrid.persistence.collection.serialization.MvccLogEntrySerializationStrategy;
 
+import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
@@ -57,8 +58,8 @@ public class Start implements WriteStage {
           throw new RuntimeException( "Failed to execute write asynchronously ", e );
         }
 
-        //todo next stage invocation
-        //Futures.addCallback();
+        //set the next stage to invoke on return
+        Futures.addCallback(future, new WriteContextCallback(context, entity));
 
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/271b26c8/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/WriteContextCallback.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/WriteContextCallback.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/WriteContextCallback.java
new file mode 100644
index 0000000..0fa408a
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/WriteContextCallback.java
@@ -0,0 +1,34 @@
+package org.apache.usergrid.persistence.collection.mvcc.stage.impl;
+
+
+import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntity;
+import org.apache.usergrid.persistence.collection.mvcc.stage.WriteContext;
+
+import com.google.common.util.concurrent.FutureCallback;
+import com.netflix.astyanax.connectionpool.OperationResult;
+
+
+/** @author tnine */
+public class WriteContextCallback implements FutureCallback<OperationResult<Void>> {
+
+    private final WriteContext context;
+    private final MvccEntity entity;
+
+
+    public WriteContextCallback( final WriteContext context, final MvccEntity entity ) {
+        this.context = context;
+        this.entity = entity;
+    }
+
+
+    public void onSuccess( final OperationResult<Void> result ) {
+        //proceed to the next stage
+        context.nextStage( entity );
+    }
+
+
+    @Override
+    public void onFailure( final Throwable t ) {
+        throw new RuntimeException( "Failed to execute write", t );
+    }
+}