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/05 01:55:27 UTC

[1/6] Pipeline tests and wiring complete

Updated Branches:
  refs/heads/two-dot-o cb9ec94e3 -> 44072d594


http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/0e0c8ff7/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/CreateTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/CreateTest.java b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/CreateTest.java
new file mode 100644
index 0000000..0ce01c3
--- /dev/null
+++ b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/CreateTest.java
@@ -0,0 +1,152 @@
+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.mvcc.stage.WriteContext;
+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.netflix.astyanax.connectionpool.exceptions.ConnectionException;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+
+/** @author tnine */
+public class CreateTest {
+
+    /** Test the start stage for happy path */
+    @Test
+    public void testValidInput() throws ConnectionException, ExecutionException, InterruptedException {
+
+        final WriteContext writeContext = mock( WriteContext.class );
+
+
+        //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 );
+
+
+        //perform the stage
+        final Create create = new Create( timeService, uuidService );
+
+        create.performStage( writeContext );
+
+
+        //now verify our output was correct
+        ArgumentCaptor<Entity> mvccEntity = ArgumentCaptor.forClass( Entity.class );
+
+
+        verify( writeContext ).setMessage( mvccEntity.capture() );
+
+        Entity created = mvccEntity.getValue();
+
+        //verify uuid and version in both the MvccEntity and the entity itself
+        assertEquals( "Entity re-set into context", entity, created );
+        assertEquals( "entity id did not match generator", newEntityId, created.getUuid() );
+        assertEquals( "version did not not match entityId", newVersion, created.getVersion() );
+
+        //check the time
+        assertEquals( "created time matches generator", time, created.getCreated() );
+        assertEquals( "updated time matches generator", time, created.getUpdated() );
+
+
+        //now verify the proceed was called
+        verify( writeContext ).proceed();
+    }
+
+
+    /** Test the start stage for happy path */
+    @Test(expected = NullPointerException.class)
+    public void testInvalidInput() throws ConnectionException, ExecutionException, InterruptedException {
+
+        final WriteContext writeContext = mock( WriteContext.class );
+
+
+        when( writeContext.getMessage( Entity.class ) ).thenReturn( null );
+
+
+        //mock returning the time
+        final TimeService timeService = mock( TimeService.class );
+
+
+        //mock the uuid service
+        final UUIDService uuidService = mock( UUIDService.class );
+
+
+        //perform the stage
+        final Create create = new Create( timeService, uuidService );
+
+        //should throw an NPE
+        create.performStage( writeContext );
+
+
+    }
+
+
+    /** Test no time service */
+    @Test(expected = NullPointerException.class)
+    public void testNoTimeService() throws ConnectionException, ExecutionException, InterruptedException {
+
+        final WriteContext writeContext = mock( WriteContext.class );
+
+
+        when( writeContext.getMessage( Entity.class ) ).thenReturn( null );
+
+
+        //mock the uuid service
+        final UUIDService uuidService = mock( UUIDService.class );
+
+
+        //perform the stage
+        new Create( null, uuidService );
+    }
+
+
+    /** Test no time service */
+    @Test(expected = NullPointerException.class)
+    public void testNoUUIDService() throws ConnectionException, ExecutionException, InterruptedException {
+
+        final WriteContext writeContext = mock( WriteContext.class );
+
+
+        when( writeContext.getMessage( Entity.class ) ).thenReturn( null );
+
+
+        //mock returning the time
+        final TimeService timeService = mock( TimeService.class );
+
+
+        //throw NPE
+        new Create( timeService, null );
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/0e0c8ff7/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
deleted file mode 100644
index 05e9460..0000000
--- a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/MvccEntityNewTest.java
+++ /dev/null
@@ -1,136 +0,0 @@
-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();
-
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/0e0c8ff7/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/StartTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/StartTest.java b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/StartTest.java
new file mode 100644
index 0000000..a6786b1
--- /dev/null
+++ b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/StartTest.java
@@ -0,0 +1,187 @@
+package org.apache.usergrid.persistence.collection.mvcc.stage.impl;
+
+
+import java.util.UUID;
+
+import org.junit.Test;
+import org.mockito.ArgumentCaptor;
+
+import org.apache.commons.lang3.reflect.FieldUtils;
+
+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.serialization.MvccLogEntrySerializationStrategy;
+import org.apache.usergrid.persistence.model.entity.Entity;
+import org.apache.usergrid.persistence.model.util.UUIDGenerator;
+
+import com.netflix.astyanax.MutationBatch;
+
+import static junit.framework.TestCase.assertSame;
+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 StartTest {
+
+    /** Standard flow */
+    @Test
+    public void testStartStage() throws Exception {
+
+
+        final WriteContext writeContext = mock( WriteContext.class );
+        final CollectionContext context = mock( CollectionContext.class );
+
+
+        //mock returning the context
+        when( writeContext.getCollectionContext() ).thenReturn( context );
+
+
+        //set up the mock to return the entity from the start phase
+        final Entity entity = generateEntity();
+
+        //mock returning the entity from the write context
+        when( writeContext.getMessage( Entity.class ) ).thenReturn( entity );
+
+
+        //mock returning a mock mutation when we do a log entry write
+        final MvccLogEntrySerializationStrategy logStrategy = mock( MvccLogEntrySerializationStrategy.class );
+
+        final ArgumentCaptor<MvccLogEntry> logEntry = ArgumentCaptor.forClass( MvccLogEntry.class );
+
+        final MutationBatch mutation = mock( MutationBatch.class );
+
+        when( logStrategy.write( same( context ), logEntry.capture() ) ).thenReturn( mutation );
+
+
+        //run the stage
+        Start newStage = new Start( logStrategy );
+
+        newStage.performStage( writeContext );
+
+
+        //now verify our output was correct
+        ArgumentCaptor<MvccEntity> mvccEntity = ArgumentCaptor.forClass( MvccEntity.class );
+
+
+        //verify the log entry is correct
+        MvccLogEntry entry = logEntry.getValue();
+
+        assertEquals( "entity id did not match ", entity.getUuid(), entry.getEntityId() );
+        assertEquals( "version did not not match entityId", entity.getVersion(), entry.getVersion() );
+        assertEquals( "Stage is correct", Stage.ACTIVE, entry.getStage() );
+
+
+        //now verify we set the message into the write context
+        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", entity.getUuid(), created.getUuid() );
+        assertEquals( "version did not not match entityId", entity.getVersion(), created.getVersion() );
+        assertSame( "Entity correct", entity, created.getEntity().get() );
+
+
+        //now verify the proceed was called
+        verify( writeContext ).proceed();
+    }
+
+
+    /** Test no entity in the pipeline */
+    @Test( expected = NullPointerException.class )
+    public void testNoEntity() throws Exception {
+
+
+        final WriteContext writeContext = mock( WriteContext.class );
+
+
+        //mock returning the entity from the write context
+        when( writeContext.getMessage( Entity.class ) ).thenReturn( null );
+
+
+        //mock returning a mock mutation when we do a log entry write
+        final MvccLogEntrySerializationStrategy logStrategy = mock( MvccLogEntrySerializationStrategy.class );
+
+        //run the stage
+        Start newStage = new Start( logStrategy );
+
+        newStage.performStage( writeContext );
+    }
+
+
+    /** Test no entity id on the entity */
+    @Test( expected = NullPointerException.class )
+    public void testNoEntityId() throws Exception {
+
+
+        final WriteContext writeContext = mock( WriteContext.class );
+
+
+        final Entity entity = new Entity();
+        final UUID version = UUIDGenerator.newTimeUUID();
+
+        entity.setVersion( version );
+
+        //mock returning the entity from the write context
+        when( writeContext.getMessage( Entity.class ) ).thenReturn( entity );
+
+
+        //mock returning a mock mutation when we do a log entry write
+        final MvccLogEntrySerializationStrategy logStrategy = mock( MvccLogEntrySerializationStrategy.class );
+
+        //run the stage
+        Start newStage = new Start( logStrategy );
+
+        newStage.performStage( writeContext );
+    }
+
+
+    /** Test no entity id on the entity */
+    @Test( expected = NullPointerException.class )
+    public void testNoEntityVersion() throws Exception {
+
+
+        final WriteContext writeContext = mock( WriteContext.class );
+
+
+        final Entity entity = new Entity();
+        final UUID entityId = UUIDGenerator.newTimeUUID();
+
+
+        FieldUtils.writeDeclaredField( entity, "uuid", entityId, true );
+
+
+        //mock returning the entity from the write context
+        when( writeContext.getMessage( Entity.class ) ).thenReturn( entity );
+
+
+        //mock returning a mock mutation when we do a log entry write
+        final MvccLogEntrySerializationStrategy logStrategy = mock( MvccLogEntrySerializationStrategy.class );
+
+        //run the stage
+        Start newStage = new Start( logStrategy );
+
+        newStage.performStage( writeContext );
+    }
+
+
+    private Entity generateEntity() throws IllegalAccessException {
+        final Entity entity = new Entity();
+        final UUID entityId = UUIDGenerator.newTimeUUID();
+        final UUID version = UUIDGenerator.newTimeUUID();
+
+        FieldUtils.writeDeclaredField( entity, "uuid", entityId, true );
+        entity.setVersion( version );
+
+        return entity;
+    }
+}
+
+

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/0e0c8ff7/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
index daa9edd..1c38963 100644
--- 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
@@ -12,7 +12,7 @@ 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.guice.CassandraTestCollectionModule;
 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;
@@ -46,7 +46,7 @@ import static org.mockito.Mockito.mock;
 public class MvccEntitySerializationStrategyImplTest {
 
     @Rule
-    public final GuiceBerryRule guiceBerry = new GuiceBerryRule( TestCollectionModule.class );
+    public final GuiceBerryRule guiceBerry = new GuiceBerryRule( CassandraTestCollectionModule.class );
 
     @Rule
     public final CassandraRule rule = new CassandraRule();

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/0e0c8ff7/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
index 9c47e08..3261c40 100644
--- 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
@@ -10,11 +10,11 @@ import org.junit.Rule;
 import org.junit.Test;
 
 import org.apache.usergrid.persistence.collection.CollectionContext;
+import org.apache.usergrid.persistence.collection.guice.CassandraTestCollectionModule;
 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.mvcc.entity.impl.MvccLogEntryImpl;
 import org.apache.usergrid.persistence.collection.serialization.MvccLogEntrySerializationStrategy;
 import org.apache.usergrid.persistence.model.util.UUIDGenerator;
 import org.apache.usergrid.persistence.test.CassandraRule;
@@ -22,6 +22,7 @@ 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.AbstractModule;
 import com.google.inject.Inject;
 import com.google.inject.Module;
 import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
@@ -64,7 +65,7 @@ public class MvccLogEntrySerializationStrategyImplTest {
         final UUID version = UUIDGenerator.newTimeUUID();
 
         for ( Stage stage : Stage.values() ) {
-            MvccLogEntry saved = new MvccLogEntryImpl(  uuid, version, stage );
+            MvccLogEntry saved = new MvccLogEntryImpl( uuid, version, stage );
             logEntryStrategy.write( context, saved ).execute();
 
             //Read it back
@@ -121,7 +122,7 @@ public class MvccLogEntrySerializationStrategyImplTest {
             versions[i] = UUIDGenerator.newTimeUUID();
 
             entries[i] = new MvccLogEntryImpl( uuid, versions[i], COMPLETE );
-            logEntryStrategy.write( context,  entries[i] ).execute();
+            logEntryStrategy.write( context, entries[i] ).execute();
 
             //Read it back
 
@@ -172,7 +173,7 @@ public class MvccLogEntrySerializationStrategyImplTest {
         for ( Stage stage : Stage.values() ) {
 
             MvccLogEntry saved = new MvccLogEntryImpl( uuid, version, stage );
-            logEntryStrategy.write(context,  saved ).execute();
+            logEntryStrategy.write( context, saved ).execute();
 
             //Read it back after the timeout
 
@@ -196,13 +197,13 @@ public class MvccLogEntrySerializationStrategyImplTest {
 
     @Test(expected = NullPointerException.class)
     public void writeParamsNoContext() throws ConnectionException {
-        logEntryStrategy.write( null, mock(MvccLogEntry.class) );
+        logEntryStrategy.write( null, mock( MvccLogEntry.class ) );
     }
 
 
-    @Test(expected = NullPointerException.class)
+    @Test( expected = NullPointerException.class )
     public void writeParams() throws ConnectionException {
-        logEntryStrategy.write( mock(CollectionContext.class), null );
+        logEntryStrategy.write( mock( CollectionContext.class ), null );
     }
 
 
@@ -301,18 +302,22 @@ public class MvccLogEntrySerializationStrategyImplTest {
             }
 
             //by default, we wnat to run the TestCollectionModule
-            return TestCollectionModule.class;
+            return CassandraTestCollectionModule.class;
         }
     }
 
 
-    public static class TimeoutEnv extends TestCollectionModule {
+    public static class TimeoutEnv extends AbstractModule {
 
         @Override
-        public Map<String, String> getOverrides() {
+        protected void configure() {
+
+            //override the timeout property
             Map<String, String> timeout = new HashMap<String, String>();
             timeout.put( MvccLogEntrySerializationStrategyImpl.TIMEOUT_PROP, TIMEOUT + "" );
-            return timeout;
+
+            //use the default module with cass
+            install( new CassandraTestCollectionModule( timeout ) );
         }
     }
 }


[2/6] git commit: Pipeline tests and wiring complete

Posted by to...@apache.org.
Pipeline tests and wiring complete


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

Branch: refs/heads/two-dot-o
Commit: 0e0c8ff76c3d4dbebd06cb0e33441d3c3831d923
Parents: cb9ec94
Author: Todd Nine <to...@apache.org>
Authored: Wed Dec 4 14:59:51 2013 -0700
Committer: Todd Nine <to...@apache.org>
Committed: Wed Dec 4 16:25:57 2013 -0700

----------------------------------------------------------------------
 .../collection/guice/CollectionModule.java      |  12 +
 .../impl/CollectionManagerFactoryImpl.java      |  21 --
 .../collection/impl/CollectionManagerImpl.java  |  38 ++--
 .../collection/mvcc/stage/StagePipeline.java    |  22 --
 .../collection/mvcc/stage/WriteContext.java     |  17 --
 .../mvcc/stage/WriteContextFactory.java         |  30 ---
 .../collection/mvcc/stage/impl/Clear.java       |  91 ++++++++
 .../stage/impl/CollectionPipelineModule.java    |  47 ++--
 .../collection/mvcc/stage/impl/Commit.java      |  90 ++++++++
 .../collection/mvcc/stage/impl/Create.java      |  85 ++++++++
 .../mvcc/stage/impl/CreatePipeline.java         |   7 +-
 .../mvcc/stage/impl/DeletePipeline.java         |   7 +-
 .../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       |  92 ++++++++
 .../collection/mvcc/stage/impl/Update.java      |  66 ++++++
 .../mvcc/stage/impl/UpdatePipeline.java         |  23 ++
 .../collection/mvcc/stage/impl/Verify.java      |  25 +++
 .../mvcc/stage/impl/WriteContextCallback.java   |  23 +-
 .../stage/impl/WriteContextFactoryImpl.java     |  47 ----
 .../mvcc/stage/impl/WriteContextImpl.java       |  30 +--
 .../persistence/collection/util/Verify.java     |  21 ++
 .../CollectionManagerFactoryTest.java           |  46 +++-
 .../collection/CollectionManagerIT.java         |  54 +++++
 .../collection/CollectionManagerTest.java       |  59 +++++
 .../guice/CassandraTestCollectionModule.java    |  76 +++++++
 .../collection/guice/TestCollectionModule.java  |  52 ++---
 .../collection/mvcc/stage/WriteContextTest.java | 217 +++++++++++++++++++
 .../collection/mvcc/stage/impl/CreateTest.java  | 152 +++++++++++++
 .../mvcc/stage/impl/MvccEntityNewTest.java      | 136 ------------
 .../collection/mvcc/stage/impl/StartTest.java   | 187 ++++++++++++++++
 ...MvccEntitySerializationStrategyImplTest.java |   4 +-
 ...ccLogEntrySerializationStrategyImplTest.java |  29 ++-
 35 files changed, 1417 insertions(+), 603 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/0e0c8ff7/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 80f48d7..293e79a 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
@@ -3,12 +3,16 @@ package org.apache.usergrid.persistence.collection.guice;
 
 import java.util.Properties;
 
+import org.apache.usergrid.persistence.collection.CollectionManager;
+import org.apache.usergrid.persistence.collection.CollectionManagerFactory;
 import org.apache.usergrid.persistence.collection.astynax.AstynaxKeyspaceProvider;
+import org.apache.usergrid.persistence.collection.impl.CollectionManagerImpl;
 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.assistedinject.FactoryModuleBuilder;
 import com.google.inject.name.Names;
 
 
@@ -54,5 +58,13 @@ public class CollectionModule extends AbstractModule {
         install( new SerializationModule());
 
         install (new ServiceModule());
+
+        //install the core services
+
+        //create a guice factor for getting our collection manager
+        install(new FactoryModuleBuilder()
+             .implement( CollectionManager.class, CollectionManagerImpl.class )
+             .build( CollectionManagerFactory.class ));
+
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/0e0c8ff7/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
deleted file mode 100644
index 2ab0761..0000000
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/impl/CollectionManagerFactoryImpl.java
+++ /dev/null
@@ -1,21 +0,0 @@
-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/0e0c8ff7/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
index 72ed6ce..ae16b3a 100644
--- 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
@@ -8,9 +8,12 @@ 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.StagePipeline;
 import org.apache.usergrid.persistence.collection.mvcc.stage.WriteContext;
-import org.apache.usergrid.persistence.collection.mvcc.stage.WriteContextFactory;
+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.mvcc.stage.impl.WriteContextImpl;
 import org.apache.usergrid.persistence.model.entity.Entity;
 
 import com.google.inject.Inject;
@@ -27,46 +30,53 @@ 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;
+    private final StagePipeline createPipeline;
+    private final StagePipeline updatePipeline;
+    private final StagePipeline deletePipeline;
 
 
     @Inject
-    public CollectionManagerImpl( final TimeService timeService, final WriteContextFactory factory,
-                                  @Assisted final CollectionContext context ) {
+    public CollectionManagerImpl( @CreatePipeline final StagePipeline createPipeline,
+                                  @UpdatePipeline final StagePipeline updatePipeline,
+                                  @DeletePipeline final StagePipeline deletePipeline,
+                                  @Assisted final CollectionContext context) {
         this.context = context;
-        this.timeService = timeService;
-        this.factory = factory;
+        this.createPipeline = createPipeline;
+        this.updatePipeline = updatePipeline;
+        this.deletePipeline = deletePipeline;
     }
 
 
     @Override
     public Entity create( final Entity entity ) {
         // Create a new context for the write
-        WriteContext writeContext = factory.newCreateContext( context );
+        WriteContext writeContext = new WriteContextImpl( createPipeline, 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;
+        // Create a new context for the write
+        WriteContext writeContext = new WriteContextImpl( updatePipeline, context );
+
+        //perform the write
+        writeContext.performWrite( entity );
+
+        return writeContext.getMessage( Entity.class );
     }
 
 
     @Override
     public void delete( final UUID entityId ) {
-        WriteContext deleteContext = factory.newDeleteContext(context);
+        WriteContext deleteContext =  new WriteContextImpl( deletePipeline, context );
 
         deleteContext.performWrite( entityId );
 
-        deleteContext.getMessage(Void.class);
     }
 
 

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/0e0c8ff7/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 7e88915..7bf31ea 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
@@ -17,22 +17,6 @@ public interface StagePipeline {
 
 
     /**
-     * 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
-     */
-    void insert(WriteStage stage);
-
-
-    /**
-     * Add a new stage to the end of the pipline
-     * @param stage
-     */
-    void addLast(WriteStage stage);
-
-
-    /**
      * get the next stage after this one
      * @param stage
      */
@@ -40,12 +24,6 @@ public interface StagePipeline {
 
 
     /**
-     * Get the last stage in this pipeline
-     * @return
-     */
-    WriteStage last();
-
-    /**
      * Get the current stage in the pipeline
      * @return
      */

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/0e0c8ff7/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 4f5d82a..98e0742 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
@@ -12,13 +12,6 @@ import org.apache.usergrid.persistence.collection.mvcc.event.PostProcessListener
 /** @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 inputData The data to use to being the write
@@ -44,17 +37,7 @@ public interface WriteContext {
      */
     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

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/0e0c8ff7/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
deleted file mode 100644
index 99da0fb..0000000
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/WriteContextFactory.java
+++ /dev/null
@@ -1,30 +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.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/0e0c8ff7/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Clear.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Clear.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Clear.java
new file mode 100644
index 0000000..57a5e41
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Clear.java
@@ -0,0 +1,91 @@
+package org.apache.usergrid.persistence.collection.mvcc.stage.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.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.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.MvccEntitySerializationStrategy;
+import org.apache.usergrid.persistence.collection.serialization.MvccLogEntrySerializationStrategy;
+
+import com.google.common.base.Preconditions;
+import com.google.inject.Inject;
+import com.netflix.astyanax.MutationBatch;
+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 Clear implements WriteStage {
+
+
+    private static final Logger LOG = LoggerFactory.getLogger( Clear.class );
+
+    private final MvccLogEntrySerializationStrategy logEntrySerializationStrategy;
+    private final MvccEntitySerializationStrategy entitySerializationStrategy;
+
+
+    @Inject
+    public Clear( final MvccLogEntrySerializationStrategy logEntrySerializationStrategy,
+                  final MvccEntitySerializationStrategy entitySerializationStrategy ) {
+
+        Preconditions.checkNotNull( logEntrySerializationStrategy, "logEntrySerializationStrategy is required" );
+              Preconditions.checkNotNull( entitySerializationStrategy, "entitySerializationStrategy is required" );
+
+
+        this.logEntrySerializationStrategy = logEntrySerializationStrategy;
+        this.entitySerializationStrategy = entitySerializationStrategy;
+    }
+
+
+    @Override
+    public void performStage( final WriteContext writeContext ) {
+        final MvccEntity entity = writeContext.getMessage( MvccEntity.class );
+
+        Preconditions.checkNotNull( entity, "Entity is required in the new stage of the mvcc write" );
+
+        final UUID entityId = entity.getUuid();
+        final UUID version = entity.getVersion();
+
+        Preconditions.checkNotNull( entityId, "Entity id is required in this stage" );
+        Preconditions.checkNotNull( version, "Entity version is required in this stage" );
+
+
+        final CollectionContext collectionContext = writeContext.getCollectionContext();
+
+
+        final MvccLogEntry startEntry = new MvccLogEntryImpl( entityId, version, Stage.COMMITTED );
+
+        MutationBatch logMutation = logEntrySerializationStrategy.write( collectionContext, startEntry );
+
+        //insert a "cleared" value into the versions.  Post processing should actually delete
+        MutationBatch entityMutation = entitySerializationStrategy.clear( collectionContext, entityId, version );
+
+        //merge the 2 into 1 mutation
+        logMutation.mergeShallow( entityMutation );
+
+
+        try {
+            logMutation.execute();
+        }
+        catch ( ConnectionException e ) {
+            LOG.error( "Failed to execute write asynchronously ", e );
+            throw new CollectionRuntimeException( "Failed to execute write asynchronously ", e );
+        }
+
+        /**
+         * We're done executing.
+         */
+        writeContext.proceed();
+
+        //TODO connect to post processors via listener
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/0e0c8ff7/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 16735ca..2bd4596 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,19 +1,13 @@
 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.Singleton;
 import com.google.inject.multibindings.Multibinder;
 
 
@@ -25,23 +19,38 @@ import com.google.inject.multibindings.Multibinder;
 public class CollectionPipelineModule extends AbstractModule {
 
 
-    /** Wire the pipeline of operations for create.  This should create a new
-     * instance every time, since StagePipeline objects are mutable */
+    /**
+     * Wire the pipeline of operations for create.  This should create a new instance every time, since StagePipeline
+     * objects are mutable
+     */
     @Provides
     @CreatePipeline
     @Inject
-    public StagePipeline createWritePipeline(MvccEntityNew start, MvccEntityWrite write, MvccEntityCommit commit) {
-        return StagePipelineImpl.fromStages(start, write, commit  );
+    @Singleton
+    public StagePipeline createPipeline( final Create create, final Start start, final Verify write,
+                                         final Commit commit ) {
+        return StagePipelineImpl.fromStages( create, start, write, commit );
     }
 
 
     @Provides
-    @DeletePipeline
-    public StagePipeline deletePipeline() {
-        return StagePipelineImpl.fromStages(  );
+    @UpdatePipeline
+    @Inject
+    @Singleton
+    public StagePipeline updatePipeline( final Update update, final Start start, final Verify write,
+                                         final Commit commit ) {
+        return StagePipelineImpl.fromStages( update, start, write, commit );
     }
 
 
+    @Provides
+    @DeletePipeline
+    @Inject
+    @Singleton
+    public StagePipeline deletePipeline( final Update update, final Start start, final Clear delete ) {
+        return StagePipelineImpl.fromStages( update, start, delete );
+    }
+
 
     @Override
     protected void configure() {
@@ -51,9 +60,13 @@ public class CollectionPipelineModule extends AbstractModule {
          */
         Multibinder<WriteStage> stageBinder = Multibinder.newSetBinder( binder(), WriteStage.class );
 
-        stageBinder.addBinding().to( MvccEntityNew.class );
-        stageBinder.addBinding().to( MvccEntityWrite.class );
-        stageBinder.addBinding().to( MvccEntityCommit.class );
+
+        stageBinder.addBinding().to( Create.class );
+        stageBinder.addBinding().to( Update.class );
+        stageBinder.addBinding().to( Start.class );
+        stageBinder.addBinding().to( Verify.class );
+        stageBinder.addBinding().to( Commit.class );
+        stageBinder.addBinding().to( Clear.class );
 
 
     }

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/0e0c8ff7/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..a2d7606
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Commit.java
@@ -0,0 +1,90 @@
+package org.apache.usergrid.persistence.collection.mvcc.stage.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.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.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.MvccEntitySerializationStrategy;
+import org.apache.usergrid.persistence.collection.serialization.MvccLogEntrySerializationStrategy;
+
+import com.google.common.base.Preconditions;
+import com.google.inject.Inject;
+import com.netflix.astyanax.MutationBatch;
+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 {
+
+
+    private static final Logger LOG = LoggerFactory.getLogger( Commit.class );
+
+    private final MvccLogEntrySerializationStrategy logEntrySerializationStrategy;
+    private final MvccEntitySerializationStrategy entitySerializationStrategy;
+
+
+    @Inject
+    public Commit( final MvccLogEntrySerializationStrategy logEntrySerializationStrategy,
+                   final MvccEntitySerializationStrategy entitySerializationStrategy ) {
+        Preconditions.checkNotNull( logEntrySerializationStrategy, "logEntrySerializationStrategy is required" );
+                      Preconditions.checkNotNull( entitySerializationStrategy, "entitySerializationStrategy is required" );
+
+
+        this.logEntrySerializationStrategy = logEntrySerializationStrategy;
+        this.entitySerializationStrategy = entitySerializationStrategy;
+    }
+
+
+    @Override
+    public void performStage( final WriteContext writeContext ) {
+        final MvccEntity entity = writeContext.getMessage( MvccEntity.class );
+
+        Preconditions.checkNotNull( entity, "Entity is required in the new stage of the mvcc write" );
+
+        final UUID entityId = entity.getUuid();
+        final UUID version = entity.getVersion();
+
+        Preconditions.checkNotNull( entityId, "Entity id is required in this stage" );
+        Preconditions.checkNotNull( version, "Entity version is required in this stage" );
+
+
+        final CollectionContext collectionContext = writeContext.getCollectionContext();
+
+
+        final MvccLogEntry startEntry = new MvccLogEntryImpl( entityId, version, Stage.COMMITTED );
+
+        MutationBatch logMutation = logEntrySerializationStrategy.write( collectionContext, startEntry );
+
+        //now get our actual insert into the entity data
+        MutationBatch entityMutation = entitySerializationStrategy.write( collectionContext, entity );
+
+        //merge the 2 into 1 mutation
+        logMutation.mergeShallow( entityMutation );
+
+
+        try {
+            logMutation.execute();
+        }
+        catch ( ConnectionException e ) {
+            LOG.error( "Failed to execute write asynchronously ", e );
+            throw new CollectionRuntimeException( "Failed to execute write asynchronously ", e );
+        }
+
+        /**
+         * We're done executing.
+         */
+        writeContext.proceed();
+
+        //TODO connect to post processors via listener
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/0e0c8ff7/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Create.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Create.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Create.java
new file mode 100644
index 0000000..c096748
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Create.java
@@ -0,0 +1,85 @@
+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.exception.CollectionRuntimeException;
+import org.apache.usergrid.persistence.collection.mvcc.stage.WriteContext;
+import org.apache.usergrid.persistence.collection.mvcc.stage.WriteStage;
+import org.apache.usergrid.persistence.collection.service.TimeService;
+import org.apache.usergrid.persistence.collection.service.UUIDService;
+import org.apache.usergrid.persistence.collection.util.Verify;
+import org.apache.usergrid.persistence.model.entity.Entity;
+
+import com.google.common.base.Preconditions;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+
+/**
+ * This is the first stage and should be invoked immediately when a new entity create is started. No UUIDs should be
+ * present, and this should set the entityId, version, created, and updated dates
+ */
+@Singleton
+public class Create implements WriteStage {
+
+    private static final Logger LOG = LoggerFactory.getLogger( Create.class );
+
+
+    private final TimeService timeService;
+    private final UUIDService uuidService;
+
+
+    @Inject
+    public Create( final TimeService timeService, final UUIDService uuidService ) {
+        Preconditions.checkNotNull( timeService, "timeService is required" );
+        Preconditions.checkNotNull( uuidService, "uuidService is required" );
+
+
+        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" );
+
+        Verify.isNull( entity.getUuid(), "A new entity should not have an id set.  This is an update operation" );
+
+
+        final UUID entityId = uuidService.newTimeUUID();
+        final UUID version = entityId;
+        final long created = timeService.getTime();
+
+
+        try {
+            FieldUtils.writeDeclaredField( entity, "uuid", entityId, true );
+        }
+        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 );
+
+        //set the updated entity for the next stage
+        writeContext.setMessage( entity );
+        writeContext.proceed();
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/0e0c8ff7/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 e700940..efe50c8 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
@@ -14,7 +14,10 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME;
 
 /**
  * Marks the create pipeline
- * @author tnine */
+ *
+ * @author tnine
+ */
 @BindingAnnotation
-@Target({ FIELD, PARAMETER, METHOD }) @Retention(RUNTIME)
+@Target({ FIELD, PARAMETER, METHOD })
+@Retention(RUNTIME)
 public @interface CreatePipeline {}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/0e0c8ff7/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
index e531a7f..3d95ddb 100644
--- 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
@@ -14,7 +14,10 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME;
 
 /**
  * Marks the delete pipeline
- * @author tnine */
+ *
+ * @author tnine
+ */
 @BindingAnnotation
-@Target({ FIELD, PARAMETER, METHOD }) @Retention(RUNTIME)
+@Target({ FIELD, PARAMETER, METHOD })
+@Retention(RUNTIME)
 public @interface DeletePipeline {}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/0e0c8ff7/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
deleted file mode 100644
index 88bfca6..0000000
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/MvccEntityCommit.java
+++ /dev/null
@@ -1,28 +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 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/0e0c8ff7/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
deleted file mode 100644
index 576394a..0000000
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/MvccEntityNew.java
+++ /dev/null
@@ -1,116 +0,0 @@
-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/0e0c8ff7/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
deleted file mode 100644
index 0e795db..0000000
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/MvccEntityWrite.java
+++ /dev/null
@@ -1,25 +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 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/0e0c8ff7/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 811b6eb..271e5e5 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,7 +5,6 @@ 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;
 
 
@@ -15,14 +14,16 @@ public class StagePipelineImpl implements StagePipeline {
     private final List<WriteStage> stages;
     private WriteStage current;
 
-    protected StagePipelineImpl(WriteStage[] stages){
-        this.stages = Arrays.asList(stages);
+
+    protected StagePipelineImpl( WriteStage[] stages ) {
+        this.stages = Arrays.asList( stages );
     }
 
+
     @Override
     public WriteStage first() {
 
-        if(stages.size() == 0){
+        if ( stages.size() == 0 ) {
             return null;
         }
 
@@ -31,56 +32,28 @@ public class StagePipelineImpl implements StagePipeline {
 
 
     @Override
-    public WriteStage last() {
-        if(stages.size() == 0){
-            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 implemented");
-
-    }
-
-
-    @Override
-    public void addLast( final WriteStage stage ) {
-       stages.add( stage );
-    }
-
-
-    @Override
     public WriteStage nextStage( final WriteStage stage ) {
         int index = stages.indexOf( stage );
 
         //we're done, do nothing
-        if(index == stages.size()){
+        if ( index == stages.size() ) {
             return null;
         }
 
-        current = stages.get( index+1 );
+        current = stages.get( index + 1 );
 
         return current;
     }
 
 
-
-    /**
-     * Factory to create a new instance.
-     * @param stages
-     * @return
-     */
-    public static StagePipelineImpl fromStages(WriteStage... stages){
+    /** Factory to create a new instance. */
+    public static StagePipelineImpl fromStages( WriteStage... stages ) {
         return new StagePipelineImpl( stages );
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/0e0c8ff7/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..bf58e06
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Start.java
@@ -0,0 +1,92 @@
+package org.apache.usergrid.persistence.collection.mvcc.stage.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.exception.CollectionRuntimeException;
+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.model.entity.Entity;
+
+import com.google.common.base.Preconditions;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import com.netflix.astyanax.MutationBatch;
+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 */
+    @Inject
+    public Start( final MvccLogEntrySerializationStrategy logStrategy ) {
+        Preconditions.checkNotNull( logStrategy, "logStrategy is required" );
+
+
+        this.logStrategy = logStrategy;
+    }
+
+
+    /**
+     * 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 = entity.getUuid();
+        final UUID version = entity.getVersion();
+
+        Preconditions.checkNotNull( entityId, "Entity id is required in this stage" );
+        Preconditions.checkNotNull( version, "Entity version is required in this stage" );
+
+
+
+        final CollectionContext collectionContext = writeContext.getCollectionContext();
+
+
+        final MvccLogEntry startEntry = new MvccLogEntryImpl( entityId, version, Stage.ACTIVE );
+
+        MutationBatch write = logStrategy.write( collectionContext, startEntry );
+
+
+        try {
+            write.execute();
+        }
+        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
+        final MvccEntityImpl nextStage = new MvccEntityImpl( entityId, version, entity );
+
+        writeContext.setMessage( nextStage );
+        writeContext.proceed();
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/0e0c8ff7/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Update.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Update.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Update.java
new file mode 100644
index 0000000..00764de
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Update.java
@@ -0,0 +1,66 @@
+package org.apache.usergrid.persistence.collection.mvcc.stage.impl;
+
+
+import java.util.UUID;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.usergrid.persistence.collection.mvcc.stage.WriteContext;
+import org.apache.usergrid.persistence.collection.mvcc.stage.WriteStage;
+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 com.google.common.base.Preconditions;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+
+/**
+ * This stage performs the initial commit log and write of an entity.  It assumes the entity id and created has already
+ * been set correctly
+ */
+@Singleton
+public class Update implements WriteStage {
+
+    private static final Logger LOG = LoggerFactory.getLogger( Update.class );
+
+    private final TimeService timeService;
+    private final UUIDService uuidService;
+
+
+    @Inject
+    public Update( final TimeService timeService, final UUIDService uuidService ) {
+        Preconditions.checkNotNull( timeService, "timeService is required" );
+        Preconditions.checkNotNull( uuidService, "uuidService is required" );
+
+        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 version = uuidService.newTimeUUID();
+        final long updated = timeService.getTime();
+
+
+        entity.setVersion( version );
+        entity.setUpdated( updated );
+
+        writeContext.setMessage( entity );
+        writeContext.proceed();
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/0e0c8ff7/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..abc6e15
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/UpdatePipeline.java
@@ -0,0 +1,23 @@
+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 create pipeline
+ *
+ * @author tnine
+ */
+@BindingAnnotation
+@Target( { FIELD, PARAMETER, METHOD } )
+@Retention( RUNTIME )
+public @interface UpdatePipeline {}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/0e0c8ff7/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Verify.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Verify.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Verify.java
new file mode 100644
index 0000000..7933266
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Verify.java
@@ -0,0 +1,25 @@
+package org.apache.usergrid.persistence.collection.mvcc.stage.impl;
+
+
+import org.apache.usergrid.persistence.collection.mvcc.stage.WriteContext;
+import org.apache.usergrid.persistence.collection.mvcc.stage.WriteStage;
+
+import com.google.inject.Singleton;
+
+
+/** This phase should execute any verification on the MvccEntity */
+@Singleton
+public class Verify implements WriteStage {
+
+
+    public Verify() {
+    }
+
+
+    @Override
+    public void performStage( final WriteContext writeContext ) {
+        //TODO no op for now, just continue to the next stage.  Verification logic goes in here
+
+        writeContext.proceed();
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/0e0c8ff7/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 e5ca9bd..65e5ba3 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
@@ -2,9 +2,7 @@ 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;
@@ -14,16 +12,16 @@ import com.netflix.astyanax.connectionpool.OperationResult;
 
 /**
  * Helper class to cause the async execution to continue
- * @author tnine */
+ * Not used ATM, just here for demonstration purposes with async astynax invocation on phase proceed
+ *
+ * @author tnine
+ */
 public class WriteContextCallback implements FutureCallback<OperationResult<Void>> {
 
     private final WriteContext context;
 
 
-    /**
-     * Create a new callback.  The data will be passed to the next stage
-     * @param context
-     */
+    /** Create a new callback.  The data will be passed to the next stage */
     private WriteContextCallback( final WriteContext context ) {
         this.context = context;
     }
@@ -40,15 +38,15 @@ public class WriteContextCallback implements FutureCallback<OperationResult<Void
 
     @Override
     public void onFailure( final Throwable t ) {
-        context.stop();
+//        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
+     * 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
@@ -56,7 +54,6 @@ public class WriteContextCallback implements FutureCallback<OperationResult<Void
     public static void createCallback( final ListenableFuture<OperationResult<Void>> future,
                                        final WriteContext context ) {
 
-        Futures.addCallback(future, new WriteContextCallback( context ));
-
+        Futures.addCallback( future, new WriteContextCallback( context ) );
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/0e0c8ff7/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
deleted file mode 100644
index f9b627f..0000000
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/WriteContextFactoryImpl.java
+++ /dev/null
@@ -1,47 +0,0 @@
-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/0e0c8ff7/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
index cbddcd1..0925f0b 100644
--- 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
@@ -1,10 +1,7 @@
 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;
@@ -16,7 +13,6 @@ 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;
 
@@ -25,25 +21,23 @@ public class WriteContextImpl implements WriteContext {
 
 
     @Inject
-    public WriteContextImpl( final Collection<PostProcessListener> listeners, final StagePipeline pipeline,
+    public WriteContextImpl( final StagePipeline pipeline,
                              final CollectionContext context ) {
-        this.listeners = listeners;
+        Preconditions.checkNotNull( pipeline, "pipeline cannot be null" );
+        Preconditions.checkNotNull( context, "context cannot be null" );
+
         this.pipeline = pipeline;
         this.context = context;
     }
 
 
     @Override
-    public StagePipeline getStagePipeline() {
-        return this.pipeline;
-    }
-
-
-    @Override
     public void performWrite( Object input ) {
 
         current = this.pipeline.first();
 
+        setMessage( input );
+
         current.performStage( this );
     }
 
@@ -91,18 +85,6 @@ public class WriteContextImpl implements WriteContext {
     }
 
 
-    @Override
-    public void stop() {
-        //No op ATM
-        current = null;
-    }
-
-
-    @Override
-    public Collection<PostProcessListener> getPostProcessors() {
-        return listeners;
-    }
-
 
     @Override
     public CollectionContext getCollectionContext() {

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/0e0c8ff7/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/util/Verify.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/util/Verify.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/util/Verify.java
new file mode 100644
index 0000000..98af421
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/util/Verify.java
@@ -0,0 +1,21 @@
+package org.apache.usergrid.persistence.collection.util;
+
+
+/**
+ * Class to help with input verification
+ */
+public class Verify {
+
+    /**
+     * Class to help with verification
+     * @param value
+     * @param message
+     */
+    public static void isNull(Object value, String message){
+        if(value != null){
+            throw new IllegalArgumentException(message  );
+        }
+
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/0e0c8ff7/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/CollectionManagerFactoryTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/CollectionManagerFactoryTest.java b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/CollectionManagerFactoryTest.java
index 4450efe..355cd09 100644
--- a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/CollectionManagerFactoryTest.java
+++ b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/CollectionManagerFactoryTest.java
@@ -1,8 +1,52 @@
 package org.apache.usergrid.persistence.collection;
 
 
+import org.junit.Rule;
+import org.junit.Test;
+
+import org.apache.usergrid.persistence.collection.guice.TestCollectionModule;
+import org.apache.usergrid.persistence.collection.impl.CollectionContextImpl;
+import org.apache.usergrid.persistence.model.util.UUIDGenerator;
+
+import com.google.guiceberry.junit4.GuiceBerryRule;
+import com.google.inject.Inject;
+import com.google.inject.ProvisionException;
+
+import static org.junit.Assert.assertNotNull;
+
+
 /**
  * Basic tests
+ *
  * @author tnine
  */
-public class CollectionManagerFactoryTest {}
+public class CollectionManagerFactoryTest {
+
+
+    @Rule
+    public final GuiceBerryRule guiceBerry = new GuiceBerryRule( TestCollectionModule.class );
+
+
+    @Inject
+    private CollectionManagerFactory collectionManagerFactory;
+
+
+
+
+    @Test
+    public void validInput() {
+
+        CollectionContextImpl context =
+                new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" );
+
+        CollectionManager collectionManager = collectionManagerFactory.createCollectionManager( context );
+
+        assertNotNull( "A collection manager must be returned", collectionManager );
+    }
+
+
+    @Test( expected = ProvisionException.class )
+    public void nullInput() {
+           CollectionManager collectionManager = collectionManagerFactory.createCollectionManager( null );
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/0e0c8ff7/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/CollectionManagerIT.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/CollectionManagerIT.java b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/CollectionManagerIT.java
new file mode 100644
index 0000000..b7c7027
--- /dev/null
+++ b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/CollectionManagerIT.java
@@ -0,0 +1,54 @@
+package org.apache.usergrid.persistence.collection;
+
+
+import org.junit.Rule;
+import org.junit.Test;
+
+import org.apache.usergrid.persistence.collection.guice.CassandraTestCollectionModule;
+import org.apache.usergrid.persistence.collection.guice.TestCollectionModule;
+import org.apache.usergrid.persistence.collection.impl.CollectionContextImpl;
+import org.apache.usergrid.persistence.model.entity.Entity;
+import org.apache.usergrid.persistence.model.util.UUIDGenerator;
+import org.apache.usergrid.persistence.test.CassandraRule;
+
+import com.google.guiceberry.junit4.GuiceBerryRule;
+import com.google.inject.Inject;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.*;
+
+
+/** @author tnine */
+public class CollectionManagerIT {
+    @Rule
+    public final GuiceBerryRule guiceBerry = new GuiceBerryRule( CassandraTestCollectionModule.class );
+
+
+    @Rule
+    public final CassandraRule rule = new CassandraRule();
+
+
+
+    @Inject
+    private CollectionManagerFactory factory;
+
+
+    @Test
+    public void create() {
+
+        CollectionContext context = new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test");
+        Entity newEntity = new Entity("test");
+
+        CollectionManager manager = factory.createCollectionManager(context);
+
+        Entity returned = manager.create( newEntity );
+
+        assertNotNull("Returned has a uuid", returned.getUuid());
+        assertEquals("Version matches uuid for create", returned.getUuid(), returned.getVersion());
+
+        assertTrue("Created time was set", returned.getCreated() > 0);
+        assertEquals("Created and updated time match on create", returned.getCreated(), returned.getUpdated());
+
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/0e0c8ff7/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/CollectionManagerTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/CollectionManagerTest.java b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/CollectionManagerTest.java
new file mode 100644
index 0000000..fca9044
--- /dev/null
+++ b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/CollectionManagerTest.java
@@ -0,0 +1,59 @@
+package org.apache.usergrid.persistence.collection;
+
+
+import org.junit.Test;
+import org.mockito.ArgumentCaptor;
+
+import org.apache.usergrid.persistence.collection.impl.CollectionContextImpl;
+import org.apache.usergrid.persistence.collection.impl.CollectionManagerImpl;
+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 org.apache.usergrid.persistence.model.entity.Entity;
+import org.apache.usergrid.persistence.model.util.UUIDGenerator;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+
+/** @author tnine */
+public class CollectionManagerTest {
+
+    @Test
+    public void create(){
+
+        WriteStage mockStage = mock(WriteStage.class);
+
+        StagePipeline createPipeline = mock(StagePipeline.class);
+        StagePipeline updatePipeline = mock(StagePipeline.class);
+        StagePipeline deletePipeline = mock(StagePipeline.class);
+
+        //mock up returning the first stage
+        when(createPipeline.first()).thenReturn(mockStage);
+
+
+        CollectionContext context = new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" );
+
+        CollectionManager collectionManager = new CollectionManagerImpl(createPipeline, updatePipeline, deletePipeline,  context);
+
+        Entity create = new Entity();
+
+        Entity returned = collectionManager.create( create );
+
+        //verify the first stage was asked for
+        verify(createPipeline).first();
+
+        ArgumentCaptor<WriteContext> contextArg = ArgumentCaptor.forClass(WriteContext.class);
+
+        //verify the first perform stage was invoked
+        verify(mockStage).performStage( contextArg.capture() );
+
+        //verify we set the passed entity into the WriteContext
+        assertEquals("Entity should be present in the write context", create, contextArg.getValue().getMessage( Entity.class ));
+
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/0e0c8ff7/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/guice/CassandraTestCollectionModule.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/guice/CassandraTestCollectionModule.java b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/guice/CassandraTestCollectionModule.java
new file mode 100644
index 0000000..b6ed30f
--- /dev/null
+++ b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/guice/CassandraTestCollectionModule.java
@@ -0,0 +1,76 @@
+package org.apache.usergrid.persistence.collection.guice;
+
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.cassandra.locator.SimpleStrategy;
+
+import org.apache.usergrid.persistence.collection.astynax.AstynaxKeyspaceProvider;
+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.impl.MvccLogEntrySerializationStrategyImpl;
+import org.apache.usergrid.persistence.test.CassandraRule;
+
+import com.google.guiceberry.GuiceBerryEnvMain;
+import com.google.guiceberry.GuiceBerryModule;
+import com.google.inject.AbstractModule;
+import com.google.inject.Inject;
+import com.google.inject.name.Names;
+
+
+/**
+ * Simple module for wiring our collection api
+ *
+ * @author tnine
+ */
+public class CassandraTestCollectionModule extends AbstractModule {
+
+    private final Map<String, String> overrides;
+
+    public CassandraTestCollectionModule( final Map<String, String> overrides ) {
+        this.overrides = overrides;
+    }
+
+
+
+
+    public CassandraTestCollectionModule() {
+        this.overrides = null;
+    }
+
+
+
+
+    @Override
+    protected void configure() {
+
+
+        //import the guice berry module
+        install( new TestCollectionModule(overrides) );
+
+
+        //now configure our db
+        bind( GuiceBerryEnvMain.class ).to( CassAppMain.class );
+    }
+
+
+
+    static class CassAppMain implements GuiceBerryEnvMain {
+
+        @Inject
+        protected MigrationManager migrationManager;
+
+
+        public void run() {
+            try {
+                //run the injected migration manager to set up cassandra
+                migrationManager.migrate();
+            }
+            catch ( MigrationException e ) {
+                throw new RuntimeException( e );
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/0e0c8ff7/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 e8a16bd..44e6a26 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
@@ -7,28 +7,34 @@ import java.util.Map;
 import org.apache.cassandra.locator.SimpleStrategy;
 
 import org.apache.usergrid.persistence.collection.astynax.AstynaxKeyspaceProvider;
-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.impl.MvccLogEntrySerializationStrategyImpl;
 import org.apache.usergrid.persistence.test.CassandraRule;
 
-import com.google.guiceberry.GuiceBerryEnvMain;
 import com.google.guiceberry.GuiceBerryModule;
 import com.google.inject.AbstractModule;
-import com.google.inject.Inject;
 import com.google.inject.name.Names;
 
 
 /**
- * Simple module for wiring our collection api
+ * Module for testing our guice wiring environment is correct. Does not actually set the main execution env. Callers are
+ * responsible for that via decoration
  *
  * @author tnine
  */
 public class TestCollectionModule extends AbstractModule {
 
 
+    private final Map<String, String> override;
+
+
+    public TestCollectionModule( Map<String, String> override ) {
+        this.override = override;
+    }
+
+
     public TestCollectionModule() {
+        override = null;
     }
 
 
@@ -39,9 +45,6 @@ public class TestCollectionModule extends AbstractModule {
         //import the guice berry module
         install( new GuiceBerryModule() );
 
-        //now configure our db
-        bind( GuiceBerryEnvMain.class ).to( CassAppMain.class );
-
         //import the runtime module
         install( new CollectionModule() );
 
@@ -65,41 +68,14 @@ public class TestCollectionModule extends AbstractModule {
         /**
          * Set the timeout to 60 seconds, no test should take that long for load+delete without a failure
          */
-        configProperties.put( MvccLogEntrySerializationStrategyImpl.TIMEOUT_PROP, 60+"" );
+        configProperties.put( MvccLogEntrySerializationStrategyImpl.TIMEOUT_PROP, 60 + "" );
 
-        Map<String, String> props = getOverrides();
 
-        if(props != null){
-            configProperties.putAll( props );
+        if(override != null){
+            configProperties.putAll( override );
         }
 
         //bind to the props
         Names.bindProperties( binder(), configProperties );
     }
-
-
-    /**
-     * Get any overrides we need for system properties
-     */
-    public Map<String, String> getOverrides() {
-        return null;
-    }
-
-
-    static class CassAppMain implements GuiceBerryEnvMain {
-
-        @Inject
-        protected MigrationManager migrationManager;
-
-
-        public void run() {
-            try {
-                //run the injected migration manager to set up cassandra
-                migrationManager.migrate();
-            }
-            catch ( MigrationException e ) {
-                throw new RuntimeException( e );
-            }
-        }
-    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/0e0c8ff7/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/WriteContextTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/WriteContextTest.java b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/WriteContextTest.java
new file mode 100644
index 0000000..490b249
--- /dev/null
+++ b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/WriteContextTest.java
@@ -0,0 +1,217 @@
+package org.apache.usergrid.persistence.collection.mvcc.stage;
+
+
+import org.junit.Test;
+
+import org.apache.usergrid.persistence.collection.CollectionContext;
+import org.apache.usergrid.persistence.collection.mvcc.stage.impl.WriteContextImpl;
+
+import static junit.framework.TestCase.assertSame;
+import static org.junit.Assert.assertNull;
+import static org.mockito.Matchers.same;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+
+/** @author tnine */
+public class WriteContextTest {
+
+    @Test
+    public void performWrite() {
+
+        CollectionContext collectionContext = mock( CollectionContext.class );
+
+        StagePipeline pipeline = mock( StagePipeline.class );
+
+        WriteStage stage = mock( WriteStage.class );
+
+        when( pipeline.first() ).thenReturn( stage );
+
+        WriteContext writeContext = new WriteContextImpl( pipeline, collectionContext );
+
+        Object test = new Object();
+
+        writeContext.performWrite( test );
+
+        //verify we called first in the pipeline to get the first value
+        verify( pipeline ).first();
+
+        //verify the first stage was invoked
+        verify( stage ).performStage( same( writeContext ) );
+
+        //verify the bean value was set
+        assertSame( test, writeContext.getMessage( Object.class ) );
+    }
+
+
+    @Test
+    public void setAndGet() {
+        Object test = new Object();
+
+        CollectionContext collectionContext = mock( CollectionContext.class );
+
+        StagePipeline pipeline = mock( StagePipeline.class );
+
+
+        WriteContext writeContext = new WriteContextImpl( pipeline, collectionContext );
+
+        writeContext.setMessage( test );
+
+        assertSame( "Same value returned", test, writeContext.getMessage( Object.class ) );
+    }
+
+
+    @Test
+    public void setAndGetTypeSafe() {
+        TestBean test = new TestBean();
+
+        CollectionContext collectionContext = mock( CollectionContext.class );
+
+        StagePipeline pipeline = mock( StagePipeline.class );
+
+
+        WriteContext writeContext = new WriteContextImpl( pipeline, collectionContext );
+
+        writeContext.setMessage( test );
+
+        //works because Test is an instance of object
+        assertSame( "Test instance of object", test, writeContext.getMessage( Object.class ) );
+
+        assertSame( "Test instance of object", test, writeContext.getMessage( TestBean.class ) );
+    }
+
+
+    @Test( expected = ClassCastException.class )
+    public void setAndGetBadType() {
+        Object test = new Object();
+
+        CollectionContext collectionContext = mock( CollectionContext.class );
+
+        StagePipeline pipeline = mock( StagePipeline.class );
+
+
+        WriteContext writeContext = new WriteContextImpl( pipeline, collectionContext );
+
+        writeContext.setMessage( test );
+
+        //works because Test is an instance of object
+        assertSame( "Test instance of object", test, writeContext.getMessage( Object.class ) );
+
+        //should blow up, not type save.  The object test is not an instance of TestBean
+        writeContext.getMessage( TestBean.class );
+    }
+
+
+    @Test
+    public void nullMessage() {
+
+        CollectionContext collectionContext = mock( CollectionContext.class );
+
+        StagePipeline pipeline = mock( StagePipeline.class );
+
+
+        WriteContext writeContext = new WriteContextImpl( pipeline, collectionContext );
+
+        writeContext.setMessage( null );
+
+        //works because Test is an instance of object
+        assertNull( "Null message returned", writeContext.getMessage( Object.class ) );
+    }
+
+
+    @Test
+    public void proceedHasNextStep() {
+
+        CollectionContext collectionContext = mock( CollectionContext.class );
+
+        StagePipeline pipeline = mock( StagePipeline.class );
+
+        WriteStage firstStage = mock( WriteStage.class );
+
+        WriteStage secondStage = mock( WriteStage.class );
+
+
+        when( pipeline.first() ).thenReturn( firstStage );
+
+        when( pipeline.nextStage( same( firstStage ) ) ).thenReturn( secondStage );
+
+
+        WriteContext writeContext = new WriteContextImpl( pipeline, collectionContext );
+
+        Object test = new Object();
+
+        writeContext.performWrite( test );
+
+        //now proceed and validate we were called
+        writeContext.proceed();
+
+        verify( secondStage ).performStage( same( writeContext ) );
+    }
+
+
+    @Test
+    public void proceedNoNextStep() {
+
+        CollectionContext collectionContext = mock( CollectionContext.class );
+
+        StagePipeline pipeline = mock( StagePipeline.class );
+
+        WriteStage firstStage = mock( WriteStage.class );
+
+        when( pipeline.first() ).thenReturn( firstStage );
+
+        when( pipeline.nextStage( same( firstStage ) ) ).thenReturn( null );
+
+
+        WriteContext writeContext = new WriteContextImpl( pipeline, collectionContext );
+
+        Object test = new Object();
+
+        writeContext.performWrite( test );
+
+        //now proceed and validate we were called
+        writeContext.proceed();
+    }
+
+
+    @Test
+    public void getContextCorrect() {
+
+        CollectionContext collectionContext = mock( CollectionContext.class );
+
+        StagePipeline pipeline = mock( StagePipeline.class );
+
+
+        WriteContext writeContext = new WriteContextImpl( pipeline, collectionContext );
+
+        assertSame( "Collection context pointer correct", collectionContext, writeContext.getCollectionContext() );
+    }
+
+
+
+
+    @Test( expected = NullPointerException.class )
+    public void nullContextFails() {
+
+        CollectionContext collectionContext = mock( CollectionContext.class );
+
+
+        new WriteContextImpl( null, collectionContext );
+    }
+
+
+    @Test( expected = NullPointerException.class )
+    public void nullPipelineFails() {
+
+        CollectionContext collectionContext = mock( CollectionContext.class );
+
+
+        new WriteContextImpl( null, collectionContext );
+    }
+
+
+    private static class TestBean {
+
+    }
+}


[5/6] Commit after refactor. Need to evaluate an event bus in guava instead of using coupled stages

Posted by to...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/44072d59/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/write/Update.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/write/Update.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/write/Update.java
new file mode 100644
index 0000000..0175b42
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/write/Update.java
@@ -0,0 +1,70 @@
+package org.apache.usergrid.persistence.collection.mvcc.stage.impl.write;
+
+
+import java.util.UUID;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.usergrid.persistence.collection.mvcc.stage.ExecutionContext;
+import org.apache.usergrid.persistence.collection.mvcc.stage.ExecutionStage;
+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 com.google.common.base.Preconditions;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+
+/**
+ * This stage performs the initial commit log and write of an entity.  It assumes the entity id and created has already
+ * been set correctly
+ */
+@Singleton
+public class Update implements ExecutionStage {
+
+    private static final Logger LOG = LoggerFactory.getLogger( Update.class );
+
+    private final TimeService timeService;
+    private final UUIDService uuidService;
+
+
+    @Inject
+    public Update( final TimeService timeService, final UUIDService uuidService ) {
+        Preconditions.checkNotNull( timeService, "timeService is required" );
+        Preconditions.checkNotNull( uuidService, "uuidService is required" );
+
+        this.timeService = timeService;
+        this.uuidService = uuidService;
+    }
+
+
+    /**
+     * Create the entity Id  and inject it, as well as set the timestamp versions
+     *
+     * @param executionContext The context of the current write operation
+     */
+    @Override
+    public void performStage( final ExecutionContext executionContext ) {
+
+        final Entity entity = executionContext.getMessage( Entity.class );
+
+        Preconditions.checkNotNull( entity, "Entity is required in the new stage of the mvcc write" );
+
+        final UUID entityId = entity.getUuid();
+
+        Preconditions.checkNotNull( entityId, "The entity id is required to be set for an update operation" );
+
+
+        final UUID version = uuidService.newTimeUUID();
+        final long updated = timeService.getTime();
+
+
+        entity.setVersion( version );
+        entity.setUpdated( updated );
+
+        executionContext.setMessage( entity );
+        executionContext.proceed();
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/44072d59/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/write/Verify.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/write/Verify.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/write/Verify.java
new file mode 100644
index 0000000..884c59b
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/write/Verify.java
@@ -0,0 +1,25 @@
+package org.apache.usergrid.persistence.collection.mvcc.stage.impl.write;
+
+
+import org.apache.usergrid.persistence.collection.mvcc.stage.ExecutionStage;
+import org.apache.usergrid.persistence.collection.mvcc.stage.ExecutionContext;
+
+import com.google.inject.Singleton;
+
+
+/** This phase should execute any verification on the MvccEntity */
+@Singleton
+public class Verify implements ExecutionStage {
+
+
+    public Verify() {
+    }
+
+
+    @Override
+    public void performStage( final ExecutionContext executionContext ) {
+        //TODO no op for now, just continue to the next stage.  Verification logic goes in here
+
+        executionContext.proceed();
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/44072d59/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/write/WriteContextCallback.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/write/WriteContextCallback.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/write/WriteContextCallback.java
new file mode 100644
index 0000000..87f7702
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/write/WriteContextCallback.java
@@ -0,0 +1,59 @@
+package org.apache.usergrid.persistence.collection.mvcc.stage.impl.write;
+
+
+import org.apache.usergrid.persistence.collection.exception.CollectionRuntimeException;
+import org.apache.usergrid.persistence.collection.mvcc.stage.ExecutionContext;
+
+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;
+
+
+/**
+ * Helper class to cause the async execution to continue
+ * Not used ATM, just here for demonstration purposes with async astynax invocation on phase proceed
+ *
+ * @author tnine
+ */
+public class WriteContextCallback implements FutureCallback<OperationResult<Void>> {
+
+    private final ExecutionContext context;
+
+
+    /** Create a new callback.  The data will be passed to the next stage */
+    private WriteContextCallback( final ExecutionContext context ) {
+        this.context = context;
+    }
+
+
+    public void onSuccess( final OperationResult<Void> result ) {
+
+        /**
+         * Proceed to the next stage
+         */
+        context.proceed();
+    }
+
+
+    @Override
+    public void onFailure( final Throwable 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 ExecutionContext context ) {
+
+        Futures.addCallback( future, new WriteContextCallback( context ) );
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/44072d59/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 f3350ad..4aefbae 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
@@ -52,7 +52,7 @@ public interface MvccEntitySerializationStrategy
 
 
     /**
-     * Clear this version from the persistence store, but keep the version to mark that is has been cleared
+     * Delete this version from the persistence store, but keep the version to mark that is has been cleared
      * This can be used in a mark+sweep system.  The entity with the given version will exist in the context,
      * but no data will be stored
      *

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/44072d59/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/CollectionManagerTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/CollectionManagerTest.java b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/CollectionManagerTest.java
index 9028cbf..fed0663 100644
--- a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/CollectionManagerTest.java
+++ b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/CollectionManagerTest.java
@@ -6,8 +6,10 @@ import org.mockito.ArgumentCaptor;
 
 import org.apache.usergrid.persistence.collection.impl.CollectionContextImpl;
 import org.apache.usergrid.persistence.collection.impl.CollectionManagerImpl;
+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.mvcc.stage.ExecutionContext;
-import org.apache.usergrid.persistence.collection.mvcc.stage.Stage;
+import org.apache.usergrid.persistence.collection.mvcc.stage.ExecutionStage;
 import org.apache.usergrid.persistence.collection.mvcc.stage.StagePipeline;
 import org.apache.usergrid.persistence.model.entity.Entity;
 import org.apache.usergrid.persistence.model.util.UUIDGenerator;
@@ -26,7 +28,7 @@ public class CollectionManagerTest {
     @Test
     public void create(){
 
-        Stage mockStage = mock(Stage.class);
+        ExecutionStage mockExecutionStage = mock(ExecutionStage.class);
 
         StagePipeline createPipeline = mock(StagePipeline.class);
         StagePipeline updatePipeline = mock(StagePipeline.class);
@@ -36,7 +38,7 @@ public class CollectionManagerTest {
 
 
         //mock up returning the first stage
-        when(createPipeline.first()).thenReturn(mockStage);
+        when(createPipeline.first()).thenReturn( mockExecutionStage );
 
 
         CollectionContext context = new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" );
@@ -45,6 +47,9 @@ public class CollectionManagerTest {
 
         Entity create = new Entity();
 
+        MvccEntity mvccEntity = mock(MvccEntity.class);
+
+
         Entity returned = collectionManager.create( create );
 
         //verify the first stage was asked for
@@ -53,7 +58,7 @@ public class CollectionManagerTest {
         ArgumentCaptor<ExecutionContext> contextArg = ArgumentCaptor.forClass(ExecutionContext.class);
 
         //verify the first perform stage was invoked
-        verify(mockStage).performStage( contextArg.capture() );
+        verify( mockExecutionStage ).performStage( contextArg.capture() );
 
         //verify we set the passed entity into the ExecutionContext
         assertEquals("Entity should be present in the write context", create, contextArg.getValue().getMessage( Entity.class ));

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/44072d59/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/ExecutionContextTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/ExecutionContextTest.java b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/ExecutionContextTest.java
index 4b917e4..1730107 100644
--- a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/ExecutionContextTest.java
+++ b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/ExecutionContextTest.java
@@ -24,9 +24,9 @@ public class ExecutionContextTest {
 
         StagePipeline pipeline = mock( StagePipeline.class );
 
-        Stage stage = mock( Stage.class );
+        ExecutionStage executionStage = mock( ExecutionStage.class );
 
-        when( pipeline.first() ).thenReturn( stage );
+        when( pipeline.first() ).thenReturn( executionStage );
 
         ExecutionContext executionContext = new ExecutionContextImpl( pipeline, collectionContext );
 
@@ -37,8 +37,8 @@ public class ExecutionContextTest {
         //verify we called first in the pipeline to get the first value
         verify( pipeline ).first();
 
-        //verify the first stage was invoked
-        verify( stage ).performStage( same( executionContext ) );
+        //verify the first executionStage was invoked
+        verify( executionStage ).performStage( same( executionContext ) );
 
         //verify the bean value was set
         assertSame( test, executionContext.getMessage( Object.class ) );
@@ -127,14 +127,14 @@ public class ExecutionContextTest {
 
         StagePipeline pipeline = mock( StagePipeline.class );
 
-        Stage firstStage = mock( Stage.class );
+        ExecutionStage firstExecutionStage = mock( ExecutionStage.class );
 
-        Stage secondStage = mock( Stage.class );
+        ExecutionStage secondExecutionStage = mock( ExecutionStage.class );
 
 
-        when( pipeline.first() ).thenReturn( firstStage );
+        when( pipeline.first() ).thenReturn( firstExecutionStage );
 
-        when( pipeline.nextStage( same( firstStage ) ) ).thenReturn( secondStage );
+        when( pipeline.nextStage( same( firstExecutionStage ) ) ).thenReturn( secondExecutionStage );
 
 
         ExecutionContext executionContext = new ExecutionContextImpl( pipeline, collectionContext );
@@ -146,7 +146,7 @@ public class ExecutionContextTest {
         //now proceed and validate we were called
         executionContext.proceed();
 
-        verify( secondStage ).performStage( same( executionContext ) );
+        verify( secondExecutionStage ).performStage( same( executionContext ) );
     }
 
 
@@ -157,11 +157,11 @@ public class ExecutionContextTest {
 
         StagePipeline pipeline = mock( StagePipeline.class );
 
-        Stage firstStage = mock( Stage.class );
+        ExecutionStage firstExecutionStage = mock( ExecutionStage.class );
 
-        when( pipeline.first() ).thenReturn( firstStage );
+        when( pipeline.first() ).thenReturn( firstExecutionStage );
 
-        when( pipeline.nextStage( same( firstStage ) ) ).thenReturn( null );
+        when( pipeline.nextStage( same( firstExecutionStage ) ) ).thenReturn( null );
 
 
         ExecutionContext executionContext = new ExecutionContextImpl( pipeline, collectionContext );

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/44072d59/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/StagePipelineTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/StagePipelineTest.java b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/StagePipelineTest.java
index 6f0fa35..86a2a3a 100644
--- a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/StagePipelineTest.java
+++ b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/StagePipelineTest.java
@@ -15,13 +15,13 @@ public class StagePipelineTest {
 
     @Test
     public void oneStage() {
-        Stage first = mock( Stage.class );
+        ExecutionStage first = mock( ExecutionStage.class );
 
         StagePipeline pipeline = StagePipelineImpl.fromStages( first );
 
         assertSame( "Correct stage returned", first, pipeline.first() );
 
-        Stage next = pipeline.nextStage( first );
+        ExecutionStage next = pipeline.nextStage( first );
 
         assertNull( "No next stage", next );
     }
@@ -29,15 +29,15 @@ public class StagePipelineTest {
 
     @Test
     public void threeStages() {
-        Stage first = mock( Stage.class );
-        Stage second = mock( Stage.class );
-        Stage third = mock( Stage.class );
+        ExecutionStage first = mock( ExecutionStage.class );
+        ExecutionStage second = mock( ExecutionStage.class );
+        ExecutionStage third = mock( ExecutionStage.class );
 
         StagePipeline pipeline = StagePipelineImpl.fromStages( first, second, third );
 
         assertSame( "Correct stage returned", first, pipeline.first() );
 
-        Stage next = pipeline.nextStage( first );
+        ExecutionStage next = pipeline.nextStage( first );
 
         assertSame( "Correct stage returned", second, next );
 
@@ -56,14 +56,14 @@ public class StagePipelineTest {
      */
     @Test
     public void stageSeek() {
-        Stage first = mock( Stage.class );
-        Stage second = mock( Stage.class );
-        Stage third = mock( Stage.class );
+        ExecutionStage first = mock( ExecutionStage.class );
+        ExecutionStage second = mock( ExecutionStage.class );
+        ExecutionStage third = mock( ExecutionStage.class );
 
         StagePipeline pipeline = StagePipelineImpl.fromStages( first, second, third );
 
 
-        Stage next = pipeline.nextStage( second );
+        ExecutionStage next = pipeline.nextStage( second );
 
         assertSame( "Correct stage returned", third, next );
 
@@ -75,7 +75,7 @@ public class StagePipelineTest {
 
     @Test( expected = NullPointerException.class )
     public void invalidStageInput() {
-        Stage first = mock( Stage.class );
+        ExecutionStage first = mock( ExecutionStage.class );
 
         StagePipeline pipeline = StagePipelineImpl.fromStages( first );
         pipeline.nextStage( null );

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/44072d59/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/CreateTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/CreateTest.java b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/CreateTest.java
deleted file mode 100644
index 4547c80..0000000
--- a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/CreateTest.java
+++ /dev/null
@@ -1,152 +0,0 @@
-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.mvcc.stage.ExecutionContext;
-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.netflix.astyanax.connectionpool.exceptions.ConnectionException;
-
-import static org.junit.Assert.assertEquals;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-
-/** @author tnine */
-public class CreateTest {
-
-    /** Test the start stage for happy path */
-    @Test
-    public void testValidInput() throws ConnectionException, ExecutionException, InterruptedException {
-
-        final ExecutionContext executionContext = mock( ExecutionContext.class );
-
-
-        //set up the mock to return the entity from the start phase
-        final Entity entity = new Entity();
-
-        when( executionContext.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 );
-
-
-        //perform the stage
-        final Create create = new Create( timeService, uuidService );
-
-        create.performStage( executionContext );
-
-
-        //now verify our output was correct
-        ArgumentCaptor<Entity> mvccEntity = ArgumentCaptor.forClass( Entity.class );
-
-
-        verify( executionContext ).setMessage( mvccEntity.capture() );
-
-        Entity created = mvccEntity.getValue();
-
-        //verify uuid and version in both the MvccEntity and the entity itself
-        assertEquals( "Entity re-set into context", entity, created );
-        assertEquals( "entity id did not match generator", newEntityId, created.getUuid() );
-        assertEquals( "version did not not match entityId", newVersion, created.getVersion() );
-
-        //check the time
-        assertEquals( "created time matches generator", time, created.getCreated() );
-        assertEquals( "updated time matches generator", time, created.getUpdated() );
-
-
-        //now verify the proceed was called
-        verify( executionContext ).proceed();
-    }
-
-
-    /** Test the start stage for happy path */
-    @Test(expected = NullPointerException.class)
-    public void testInvalidInput() throws ConnectionException, ExecutionException, InterruptedException {
-
-        final ExecutionContext executionContext = mock( ExecutionContext.class );
-
-
-        when( executionContext.getMessage( Entity.class ) ).thenReturn( null );
-
-
-        //mock returning the time
-        final TimeService timeService = mock( TimeService.class );
-
-
-        //mock the uuid service
-        final UUIDService uuidService = mock( UUIDService.class );
-
-
-        //perform the stage
-        final Create create = new Create( timeService, uuidService );
-
-        //should throw an NPE
-        create.performStage( executionContext );
-
-
-    }
-
-
-    /** Test no time service */
-    @Test(expected = NullPointerException.class)
-    public void testNoTimeService() throws ConnectionException, ExecutionException, InterruptedException {
-
-        final ExecutionContext executionContext = mock( ExecutionContext.class );
-
-
-        when( executionContext.getMessage( Entity.class ) ).thenReturn( null );
-
-
-        //mock the uuid service
-        final UUIDService uuidService = mock( UUIDService.class );
-
-
-        //perform the stage
-        new Create( null, uuidService );
-    }
-
-
-    /** Test no time service */
-    @Test(expected = NullPointerException.class)
-    public void testNoUUIDService() throws ConnectionException, ExecutionException, InterruptedException {
-
-        final ExecutionContext executionContext = mock( ExecutionContext.class );
-
-
-        when( executionContext.getMessage( Entity.class ) ).thenReturn( null );
-
-
-        //mock returning the time
-        final TimeService timeService = mock( TimeService.class );
-
-
-        //throw NPE
-        new Create( timeService, null );
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/44072d59/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/StartWriteTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/StartWriteTest.java b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/StartWriteTest.java
deleted file mode 100644
index d7a6b46..0000000
--- a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/StartWriteTest.java
+++ /dev/null
@@ -1,187 +0,0 @@
-package org.apache.usergrid.persistence.collection.mvcc.stage.impl;
-
-
-import java.util.UUID;
-
-import org.junit.Test;
-import org.mockito.ArgumentCaptor;
-
-import org.apache.commons.lang3.reflect.FieldUtils;
-
-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.ExecutionContext;
-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 com.netflix.astyanax.MutationBatch;
-
-import static junit.framework.TestCase.assertSame;
-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 StartWriteTest {
-
-    /** Standard flow */
-    @Test
-    public void testStartStage() throws Exception {
-
-
-        final ExecutionContext executionContext = mock( ExecutionContext.class );
-        final CollectionContext context = mock( CollectionContext.class );
-
-
-        //mock returning the context
-        when( executionContext.getCollectionContext() ).thenReturn( context );
-
-
-        //set up the mock to return the entity from the start phase
-        final Entity entity = generateEntity();
-
-        //mock returning the entity from the write context
-        when( executionContext.getMessage( Entity.class ) ).thenReturn( entity );
-
-
-        //mock returning a mock mutation when we do a log entry write
-        final MvccLogEntrySerializationStrategy logStrategy = mock( MvccLogEntrySerializationStrategy.class );
-
-        final ArgumentCaptor<MvccLogEntry> logEntry = ArgumentCaptor.forClass( MvccLogEntry.class );
-
-        final MutationBatch mutation = mock( MutationBatch.class );
-
-        when( logStrategy.write( same( context ), logEntry.capture() ) ).thenReturn( mutation );
-
-
-        //run the stage
-        StartWrite newStage = new StartWrite( logStrategy );
-
-        newStage.performStage( executionContext );
-
-
-        //now verify our output was correct
-        ArgumentCaptor<MvccEntity> mvccEntity = ArgumentCaptor.forClass( MvccEntity.class );
-
-
-        //verify the log entry is correct
-        MvccLogEntry entry = logEntry.getValue();
-
-        assertEquals( "entity id did not match ", entity.getUuid(), entry.getEntityId() );
-        assertEquals( "version did not not match entityId", entity.getVersion(), entry.getVersion() );
-        assertEquals( "Stage is correct", Stage.ACTIVE, entry.getStage() );
-
-
-        //now verify we set the message into the write context
-        verify( executionContext ).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", entity.getUuid(), created.getUuid() );
-        assertEquals( "version did not not match entityId", entity.getVersion(), created.getVersion() );
-        assertSame( "Entity correct", entity, created.getEntity().get() );
-
-
-        //now verify the proceed was called
-        verify( executionContext ).proceed();
-    }
-
-
-    /** Test no entity in the pipeline */
-    @Test( expected = NullPointerException.class )
-    public void testNoEntity() throws Exception {
-
-
-        final ExecutionContext executionContext = mock( ExecutionContext.class );
-
-
-        //mock returning the entity from the write context
-        when( executionContext.getMessage( Entity.class ) ).thenReturn( null );
-
-
-        //mock returning a mock mutation when we do a log entry write
-        final MvccLogEntrySerializationStrategy logStrategy = mock( MvccLogEntrySerializationStrategy.class );
-
-        //run the stage
-        StartWrite newStage = new StartWrite( logStrategy );
-
-        newStage.performStage( executionContext );
-    }
-
-
-    /** Test no entity id on the entity */
-    @Test( expected = NullPointerException.class )
-    public void testNoEntityId() throws Exception {
-
-
-        final ExecutionContext executionContext = mock( ExecutionContext.class );
-
-
-        final Entity entity = new Entity();
-        final UUID version = UUIDGenerator.newTimeUUID();
-
-        entity.setVersion( version );
-
-        //mock returning the entity from the write context
-        when( executionContext.getMessage( Entity.class ) ).thenReturn( entity );
-
-
-        //mock returning a mock mutation when we do a log entry write
-        final MvccLogEntrySerializationStrategy logStrategy = mock( MvccLogEntrySerializationStrategy.class );
-
-        //run the stage
-        StartWrite newStage = new StartWrite( logStrategy );
-
-        newStage.performStage( executionContext );
-    }
-
-
-    /** Test no entity id on the entity */
-    @Test( expected = NullPointerException.class )
-    public void testNoEntityVersion() throws Exception {
-
-
-        final ExecutionContext executionContext = mock( ExecutionContext.class );
-
-
-        final Entity entity = new Entity();
-        final UUID entityId = UUIDGenerator.newTimeUUID();
-
-
-        FieldUtils.writeDeclaredField( entity, "uuid", entityId, true );
-
-
-        //mock returning the entity from the write context
-        when( executionContext.getMessage( Entity.class ) ).thenReturn( entity );
-
-
-        //mock returning a mock mutation when we do a log entry write
-        final MvccLogEntrySerializationStrategy logStrategy = mock( MvccLogEntrySerializationStrategy.class );
-
-        //run the stage
-        StartWrite newStage = new StartWrite( logStrategy );
-
-        newStage.performStage( executionContext );
-    }
-
-
-    private Entity generateEntity() throws IllegalAccessException {
-        final Entity entity = new Entity();
-        final UUID entityId = UUIDGenerator.newTimeUUID();
-        final UUID version = UUIDGenerator.newTimeUUID();
-
-        FieldUtils.writeDeclaredField( entity, "uuid", entityId, true );
-        entity.setVersion( version );
-
-        return entity;
-    }
-}
-
-

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/44072d59/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/write/CreateTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/write/CreateTest.java b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/write/CreateTest.java
new file mode 100644
index 0000000..41152c1
--- /dev/null
+++ b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/write/CreateTest.java
@@ -0,0 +1,153 @@
+package org.apache.usergrid.persistence.collection.mvcc.stage.impl.write;
+
+
+import java.util.UUID;
+import java.util.concurrent.ExecutionException;
+
+import org.junit.Test;
+import org.mockito.ArgumentCaptor;
+
+import org.apache.usergrid.persistence.collection.mvcc.stage.ExecutionContext;
+import org.apache.usergrid.persistence.collection.mvcc.stage.impl.write.Create;
+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.netflix.astyanax.connectionpool.exceptions.ConnectionException;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+
+/** @author tnine */
+public class CreateTest {
+
+    /** Test the start stage for happy path */
+    @Test
+    public void testValidInput() throws ConnectionException, ExecutionException, InterruptedException {
+
+        final ExecutionContext executionContext = mock( ExecutionContext.class );
+
+
+        //set up the mock to return the entity from the start phase
+        final Entity entity = new Entity();
+
+        when( executionContext.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 );
+
+
+        //perform the stage
+        final Create create = new Create( timeService, uuidService );
+
+        create.performStage( executionContext );
+
+
+        //now verify our output was correct
+        ArgumentCaptor<Entity> mvccEntity = ArgumentCaptor.forClass( Entity.class );
+
+
+        verify( executionContext ).setMessage( mvccEntity.capture() );
+
+        Entity created = mvccEntity.getValue();
+
+        //verify uuid and version in both the MvccEntity and the entity itself
+        assertEquals( "Entity re-set into context", entity, created );
+        assertEquals( "entity id did not match generator", newEntityId, created.getUuid() );
+        assertEquals( "version did not not match entityId", newVersion, created.getVersion() );
+
+        //check the time
+        assertEquals( "created time matches generator", time, created.getCreated() );
+        assertEquals( "updated time matches generator", time, created.getUpdated() );
+
+
+        //now verify the proceed was called
+        verify( executionContext ).proceed();
+    }
+
+
+    /** Test the start stage for happy path */
+    @Test(expected = NullPointerException.class)
+    public void testInvalidInput() throws ConnectionException, ExecutionException, InterruptedException {
+
+        final ExecutionContext executionContext = mock( ExecutionContext.class );
+
+
+        when( executionContext.getMessage( Entity.class ) ).thenReturn( null );
+
+
+        //mock returning the time
+        final TimeService timeService = mock( TimeService.class );
+
+
+        //mock the uuid service
+        final UUIDService uuidService = mock( UUIDService.class );
+
+
+        //perform the stage
+        final Create create = new Create( timeService, uuidService );
+
+        //should throw an NPE
+        create.performStage( executionContext );
+
+
+    }
+
+
+    /** Test no time service */
+    @Test(expected = NullPointerException.class)
+    public void testNoTimeService() throws ConnectionException, ExecutionException, InterruptedException {
+
+        final ExecutionContext executionContext = mock( ExecutionContext.class );
+
+
+        when( executionContext.getMessage( Entity.class ) ).thenReturn( null );
+
+
+        //mock the uuid service
+        final UUIDService uuidService = mock( UUIDService.class );
+
+
+        //perform the stage
+        new Create( null, uuidService );
+    }
+
+
+    /** Test no time service */
+    @Test(expected = NullPointerException.class)
+    public void testNoUUIDService() throws ConnectionException, ExecutionException, InterruptedException {
+
+        final ExecutionContext executionContext = mock( ExecutionContext.class );
+
+
+        when( executionContext.getMessage( Entity.class ) ).thenReturn( null );
+
+
+        //mock returning the time
+        final TimeService timeService = mock( TimeService.class );
+
+
+        //throw NPE
+        new Create( timeService, null );
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/44072d59/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/write/StartWriteTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/write/StartWriteTest.java b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/write/StartWriteTest.java
new file mode 100644
index 0000000..006dda9
--- /dev/null
+++ b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/write/StartWriteTest.java
@@ -0,0 +1,188 @@
+package org.apache.usergrid.persistence.collection.mvcc.stage.impl.write;
+
+
+import java.util.UUID;
+
+import org.junit.Test;
+import org.mockito.ArgumentCaptor;
+
+import org.apache.commons.lang3.reflect.FieldUtils;
+
+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.ExecutionContext;
+import org.apache.usergrid.persistence.collection.mvcc.stage.impl.write.StartWrite;
+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 com.netflix.astyanax.MutationBatch;
+
+import static junit.framework.TestCase.assertSame;
+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 StartWriteTest {
+
+    /** Standard flow */
+    @Test
+    public void testStartStage() throws Exception {
+
+
+        final ExecutionContext executionContext = mock( ExecutionContext.class );
+        final CollectionContext context = mock( CollectionContext.class );
+
+
+        //mock returning the context
+        when( executionContext.getCollectionContext() ).thenReturn( context );
+
+
+        //set up the mock to return the entity from the start phase
+        final Entity entity = generateEntity();
+
+        //mock returning the entity from the write context
+        when( executionContext.getMessage( Entity.class ) ).thenReturn( entity );
+
+
+        //mock returning a mock mutation when we do a log entry write
+        final MvccLogEntrySerializationStrategy logStrategy = mock( MvccLogEntrySerializationStrategy.class );
+
+        final ArgumentCaptor<MvccLogEntry> logEntry = ArgumentCaptor.forClass( MvccLogEntry.class );
+
+        final MutationBatch mutation = mock( MutationBatch.class );
+
+        when( logStrategy.write( same( context ), logEntry.capture() ) ).thenReturn( mutation );
+
+
+        //run the stage
+        StartWrite newStage = new StartWrite( logStrategy );
+
+        newStage.performStage( executionContext );
+
+
+        //now verify our output was correct
+        ArgumentCaptor<MvccEntity> mvccEntity = ArgumentCaptor.forClass( MvccEntity.class );
+
+
+        //verify the log entry is correct
+        MvccLogEntry entry = logEntry.getValue();
+
+        assertEquals( "entity id did not match ", entity.getUuid(), entry.getEntityId() );
+        assertEquals( "version did not not match entityId", entity.getVersion(), entry.getVersion() );
+        assertEquals( "ExecutionStage is correct", Stage.ACTIVE, entry.getStage() );
+
+
+        //now verify we set the message into the write context
+        verify( executionContext ).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", entity.getUuid(), created.getUuid() );
+        assertEquals( "version did not not match entityId", entity.getVersion(), created.getVersion() );
+        assertSame( "Entity correct", entity, created.getEntity().get() );
+
+
+        //now verify the proceed was called
+        verify( executionContext ).proceed();
+    }
+
+
+    /** Test no entity in the pipeline */
+    @Test( expected = NullPointerException.class )
+    public void testNoEntity() throws Exception {
+
+
+        final ExecutionContext executionContext = mock( ExecutionContext.class );
+
+
+        //mock returning the entity from the write context
+        when( executionContext.getMessage( Entity.class ) ).thenReturn( null );
+
+
+        //mock returning a mock mutation when we do a log entry write
+        final MvccLogEntrySerializationStrategy logStrategy = mock( MvccLogEntrySerializationStrategy.class );
+
+        //run the stage
+        StartWrite newStage = new StartWrite( logStrategy );
+
+        newStage.performStage( executionContext );
+    }
+
+
+    /** Test no entity id on the entity */
+    @Test( expected = NullPointerException.class )
+    public void testNoEntityId() throws Exception {
+
+
+        final ExecutionContext executionContext = mock( ExecutionContext.class );
+
+
+        final Entity entity = new Entity();
+        final UUID version = UUIDGenerator.newTimeUUID();
+
+        entity.setVersion( version );
+
+        //mock returning the entity from the write context
+        when( executionContext.getMessage( Entity.class ) ).thenReturn( entity );
+
+
+        //mock returning a mock mutation when we do a log entry write
+        final MvccLogEntrySerializationStrategy logStrategy = mock( MvccLogEntrySerializationStrategy.class );
+
+        //run the stage
+        StartWrite newStage = new StartWrite( logStrategy );
+
+        newStage.performStage( executionContext );
+    }
+
+
+    /** Test no entity id on the entity */
+    @Test( expected = NullPointerException.class )
+    public void testNoEntityVersion() throws Exception {
+
+
+        final ExecutionContext executionContext = mock( ExecutionContext.class );
+
+
+        final Entity entity = new Entity();
+        final UUID entityId = UUIDGenerator.newTimeUUID();
+
+
+        FieldUtils.writeDeclaredField( entity, "uuid", entityId, true );
+
+
+        //mock returning the entity from the write context
+        when( executionContext.getMessage( Entity.class ) ).thenReturn( entity );
+
+
+        //mock returning a mock mutation when we do a log entry write
+        final MvccLogEntrySerializationStrategy logStrategy = mock( MvccLogEntrySerializationStrategy.class );
+
+        //run the stage
+        StartWrite newStage = new StartWrite( logStrategy );
+
+        newStage.performStage( executionContext );
+    }
+
+
+    private Entity generateEntity() throws IllegalAccessException {
+        final Entity entity = new Entity();
+        final UUID entityId = UUIDGenerator.newTimeUUID();
+        final UUID version = UUIDGenerator.newTimeUUID();
+
+        FieldUtils.writeDeclaredField( entity, "uuid", entityId, true );
+        entity.setVersion( version );
+
+        return entity;
+    }
+}
+
+

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/44072d59/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/write/UpdateTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/write/UpdateTest.java b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/write/UpdateTest.java
new file mode 100644
index 0000000..24ec265
--- /dev/null
+++ b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/write/UpdateTest.java
@@ -0,0 +1,189 @@
+package org.apache.usergrid.persistence.collection.mvcc.stage.impl.write;
+
+
+import java.util.UUID;
+import java.util.concurrent.ExecutionException;
+
+import org.junit.Test;
+import org.mockito.ArgumentCaptor;
+
+import org.apache.commons.lang3.reflect.FieldUtils;
+
+import org.apache.usergrid.persistence.collection.mvcc.stage.ExecutionContext;
+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.netflix.astyanax.connectionpool.exceptions.ConnectionException;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+
+/** @author tnine */
+public class UpdateTest {
+
+
+    /** Test the start stage for happy path */
+    @Test
+    public void testValidInput() throws Exception {
+
+        final ExecutionContext executionContext = mock( ExecutionContext.class );
+
+
+        //set up the mock to return the entity from the start phase
+        final Entity entity = new Entity();
+        final UUID existingEntityId = UUIDGenerator.newTimeUUID();
+        final long createdTime = 100;
+
+        FieldUtils.writeDeclaredField( entity, "uuid", existingEntityId, true );
+        entity.setCreated( createdTime );
+
+
+        when( executionContext.getMessage( Entity.class ) ).thenReturn( entity );
+
+
+        //mock returning the time
+        final TimeService timeService = mock( TimeService.class );
+
+        final long updateTime = System.currentTimeMillis();
+
+        when( timeService.getTime() ).thenReturn( updateTime );
+
+
+        //mock the uuid service
+        final UUIDService uuidService = mock( UUIDService.class );
+
+
+        final UUID newVersion = UUIDGenerator.newTimeUUID();
+
+
+        //mock the uuid service
+        when( uuidService.newTimeUUID() ).thenReturn( newVersion );
+
+
+        //perform the stage
+        final Update create = new Update( timeService, uuidService );
+
+
+        create.performStage( executionContext );
+
+
+        //now verify our output was correct
+        ArgumentCaptor<Entity> mvccEntity = ArgumentCaptor.forClass( Entity.class );
+
+
+        verify( executionContext ).setMessage( mvccEntity.capture() );
+
+        Entity created = mvccEntity.getValue();
+
+        //verify uuid and version in both the MvccEntity and the entity itself
+        assertEquals( "Entity re-set into context", entity, created );
+        assertEquals( "entity id did not match generator", existingEntityId, created.getUuid() );
+        assertEquals( "version did not not match entityId", newVersion, created.getVersion() );
+
+        //check the time
+        assertEquals( "created time matches generator", createdTime, created.getCreated() );
+        assertEquals( "updated time matches generator", updateTime, created.getUpdated() );
+
+
+        //now verify the proceed was called
+        verify( executionContext ).proceed();
+    }
+
+
+    /** Test the start stage for happy path */
+    @Test(expected = NullPointerException.class)
+    public void testInvalidInput() throws ConnectionException, ExecutionException, InterruptedException {
+
+        final ExecutionContext executionContext = mock( ExecutionContext.class );
+
+
+        when( executionContext.getMessage( Entity.class ) ).thenReturn( null );
+
+
+        //mock returning the time
+        final TimeService timeService = mock( TimeService.class );
+
+
+        //mock the uuid service
+        final UUIDService uuidService = mock( UUIDService.class );
+
+
+        //perform the stage
+        final Update create = new Update( timeService, uuidService );
+
+        //should throw an NPE
+        create.performStage( executionContext );
+
+
+    }
+
+    @Test(expected = NullPointerException.class)
+     public void testInvalidInputNoId() throws ConnectionException, ExecutionException, InterruptedException {
+
+         final ExecutionContext executionContext = mock( ExecutionContext.class );
+
+
+         when( executionContext.getMessage( Entity.class ) ).thenReturn( new Entity(  ) );
+
+
+         //mock returning the time
+         final TimeService timeService = mock( TimeService.class );
+
+
+         //mock the uuid service
+         final UUIDService uuidService = mock( UUIDService.class );
+
+
+         //perform the stage
+         final Update create = new Update( timeService, uuidService );
+
+         //should throw an NPE
+         create.performStage( executionContext );
+
+
+     }
+
+
+    /** Test no time service */
+    @Test(expected = NullPointerException.class)
+    public void testNoTimeService() throws ConnectionException, ExecutionException, InterruptedException {
+
+        final ExecutionContext executionContext = mock( ExecutionContext.class );
+
+
+        when( executionContext.getMessage( Entity.class ) ).thenReturn( null );
+
+
+        //mock the uuid service
+        final UUIDService uuidService = mock( UUIDService.class );
+
+
+        //perform the stage
+        new Update( null, uuidService );
+    }
+
+
+    /** Test no time service */
+    @Test(expected = NullPointerException.class)
+    public void testNoUUIDService() throws ConnectionException, ExecutionException, InterruptedException {
+
+        final ExecutionContext executionContext = mock( ExecutionContext.class );
+
+
+        when( executionContext.getMessage( Entity.class ) ).thenReturn( null );
+
+
+        //mock returning the time
+        final TimeService timeService = mock( TimeService.class );
+
+
+        //throw NPE
+        new Update( timeService, null );
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/44072d59/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 2569c3a..5cc021c 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,7 +2,7 @@ package org.apache.usergrid.persistence.index.stage;
 
 
 import org.apache.usergrid.persistence.collection.mvcc.stage.ExecutionContext;
-import org.apache.usergrid.persistence.collection.mvcc.stage.Stage;
+import org.apache.usergrid.persistence.collection.mvcc.stage.ExecutionStage;
 
 
 /**
@@ -10,7 +10,7 @@ import org.apache.usergrid.persistence.collection.mvcc.stage.Stage;
  * @author: tnine
  *
  */
-public class Complete implements Stage
+public class Complete implements ExecutionStage
 {
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/44072d59/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 3809880..ddaa0f3 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,11 +2,11 @@ package org.apache.usergrid.persistence.index.stage;
 
 
 import org.apache.usergrid.persistence.collection.mvcc.stage.ExecutionContext;
-import org.apache.usergrid.persistence.collection.mvcc.stage.Stage;
+import org.apache.usergrid.persistence.collection.mvcc.stage.ExecutionStage;
 
 
 /** This state should signal an index update has started */
-public class Start implements Stage
+public class Start implements ExecutionStage
 {
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/44072d59/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 b9433a6..252f5af 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,12 +1,12 @@
 package org.apache.usergrid.persistence.index.stage;
 
 
-import org.apache.usergrid.persistence.collection.mvcc.stage.Stage;
+import org.apache.usergrid.persistence.collection.mvcc.stage.ExecutionStage;
 import org.apache.usergrid.persistence.collection.mvcc.stage.ExecutionContext;
 
 
 /** This state should perform an update of the index. */
-public class Write implements Stage
+public class Write implements ExecutionStage
 {
 
 


[3/6] Working deletes. Need to add more test cases

Posted by to...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/43aba652/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/CreateTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/CreateTest.java b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/CreateTest.java
index 0ce01c3..4547c80 100644
--- a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/CreateTest.java
+++ b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/CreateTest.java
@@ -7,7 +7,7 @@ import java.util.concurrent.ExecutionException;
 import org.junit.Test;
 import org.mockito.ArgumentCaptor;
 
-import org.apache.usergrid.persistence.collection.mvcc.stage.WriteContext;
+import org.apache.usergrid.persistence.collection.mvcc.stage.ExecutionContext;
 import org.apache.usergrid.persistence.collection.service.TimeService;
 import org.apache.usergrid.persistence.collection.service.UUIDService;
 import org.apache.usergrid.persistence.model.entity.Entity;
@@ -28,13 +28,13 @@ public class CreateTest {
     @Test
     public void testValidInput() throws ConnectionException, ExecutionException, InterruptedException {
 
-        final WriteContext writeContext = mock( WriteContext.class );
+        final ExecutionContext executionContext = mock( ExecutionContext.class );
 
 
         //set up the mock to return the entity from the start phase
         final Entity entity = new Entity();
 
-        when( writeContext.getMessage( Entity.class ) ).thenReturn( entity );
+        when( executionContext.getMessage( Entity.class ) ).thenReturn( entity );
 
 
         //mock returning the time
@@ -59,14 +59,14 @@ public class CreateTest {
         //perform the stage
         final Create create = new Create( timeService, uuidService );
 
-        create.performStage( writeContext );
+        create.performStage( executionContext );
 
 
         //now verify our output was correct
         ArgumentCaptor<Entity> mvccEntity = ArgumentCaptor.forClass( Entity.class );
 
 
-        verify( writeContext ).setMessage( mvccEntity.capture() );
+        verify( executionContext ).setMessage( mvccEntity.capture() );
 
         Entity created = mvccEntity.getValue();
 
@@ -81,7 +81,7 @@ public class CreateTest {
 
 
         //now verify the proceed was called
-        verify( writeContext ).proceed();
+        verify( executionContext ).proceed();
     }
 
 
@@ -89,10 +89,10 @@ public class CreateTest {
     @Test(expected = NullPointerException.class)
     public void testInvalidInput() throws ConnectionException, ExecutionException, InterruptedException {
 
-        final WriteContext writeContext = mock( WriteContext.class );
+        final ExecutionContext executionContext = mock( ExecutionContext.class );
 
 
-        when( writeContext.getMessage( Entity.class ) ).thenReturn( null );
+        when( executionContext.getMessage( Entity.class ) ).thenReturn( null );
 
 
         //mock returning the time
@@ -107,7 +107,7 @@ public class CreateTest {
         final Create create = new Create( timeService, uuidService );
 
         //should throw an NPE
-        create.performStage( writeContext );
+        create.performStage( executionContext );
 
 
     }
@@ -117,10 +117,10 @@ public class CreateTest {
     @Test(expected = NullPointerException.class)
     public void testNoTimeService() throws ConnectionException, ExecutionException, InterruptedException {
 
-        final WriteContext writeContext = mock( WriteContext.class );
+        final ExecutionContext executionContext = mock( ExecutionContext.class );
 
 
-        when( writeContext.getMessage( Entity.class ) ).thenReturn( null );
+        when( executionContext.getMessage( Entity.class ) ).thenReturn( null );
 
 
         //mock the uuid service
@@ -136,10 +136,10 @@ public class CreateTest {
     @Test(expected = NullPointerException.class)
     public void testNoUUIDService() throws ConnectionException, ExecutionException, InterruptedException {
 
-        final WriteContext writeContext = mock( WriteContext.class );
+        final ExecutionContext executionContext = mock( ExecutionContext.class );
 
 
-        when( writeContext.getMessage( Entity.class ) ).thenReturn( null );
+        when( executionContext.getMessage( Entity.class ) ).thenReturn( null );
 
 
         //mock returning the time

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/43aba652/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/StartTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/StartTest.java b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/StartTest.java
deleted file mode 100644
index a6786b1..0000000
--- a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/StartTest.java
+++ /dev/null
@@ -1,187 +0,0 @@
-package org.apache.usergrid.persistence.collection.mvcc.stage.impl;
-
-
-import java.util.UUID;
-
-import org.junit.Test;
-import org.mockito.ArgumentCaptor;
-
-import org.apache.commons.lang3.reflect.FieldUtils;
-
-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.serialization.MvccLogEntrySerializationStrategy;
-import org.apache.usergrid.persistence.model.entity.Entity;
-import org.apache.usergrid.persistence.model.util.UUIDGenerator;
-
-import com.netflix.astyanax.MutationBatch;
-
-import static junit.framework.TestCase.assertSame;
-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 StartTest {
-
-    /** Standard flow */
-    @Test
-    public void testStartStage() throws Exception {
-
-
-        final WriteContext writeContext = mock( WriteContext.class );
-        final CollectionContext context = mock( CollectionContext.class );
-
-
-        //mock returning the context
-        when( writeContext.getCollectionContext() ).thenReturn( context );
-
-
-        //set up the mock to return the entity from the start phase
-        final Entity entity = generateEntity();
-
-        //mock returning the entity from the write context
-        when( writeContext.getMessage( Entity.class ) ).thenReturn( entity );
-
-
-        //mock returning a mock mutation when we do a log entry write
-        final MvccLogEntrySerializationStrategy logStrategy = mock( MvccLogEntrySerializationStrategy.class );
-
-        final ArgumentCaptor<MvccLogEntry> logEntry = ArgumentCaptor.forClass( MvccLogEntry.class );
-
-        final MutationBatch mutation = mock( MutationBatch.class );
-
-        when( logStrategy.write( same( context ), logEntry.capture() ) ).thenReturn( mutation );
-
-
-        //run the stage
-        Start newStage = new Start( logStrategy );
-
-        newStage.performStage( writeContext );
-
-
-        //now verify our output was correct
-        ArgumentCaptor<MvccEntity> mvccEntity = ArgumentCaptor.forClass( MvccEntity.class );
-
-
-        //verify the log entry is correct
-        MvccLogEntry entry = logEntry.getValue();
-
-        assertEquals( "entity id did not match ", entity.getUuid(), entry.getEntityId() );
-        assertEquals( "version did not not match entityId", entity.getVersion(), entry.getVersion() );
-        assertEquals( "Stage is correct", Stage.ACTIVE, entry.getStage() );
-
-
-        //now verify we set the message into the write context
-        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", entity.getUuid(), created.getUuid() );
-        assertEquals( "version did not not match entityId", entity.getVersion(), created.getVersion() );
-        assertSame( "Entity correct", entity, created.getEntity().get() );
-
-
-        //now verify the proceed was called
-        verify( writeContext ).proceed();
-    }
-
-
-    /** Test no entity in the pipeline */
-    @Test( expected = NullPointerException.class )
-    public void testNoEntity() throws Exception {
-
-
-        final WriteContext writeContext = mock( WriteContext.class );
-
-
-        //mock returning the entity from the write context
-        when( writeContext.getMessage( Entity.class ) ).thenReturn( null );
-
-
-        //mock returning a mock mutation when we do a log entry write
-        final MvccLogEntrySerializationStrategy logStrategy = mock( MvccLogEntrySerializationStrategy.class );
-
-        //run the stage
-        Start newStage = new Start( logStrategy );
-
-        newStage.performStage( writeContext );
-    }
-
-
-    /** Test no entity id on the entity */
-    @Test( expected = NullPointerException.class )
-    public void testNoEntityId() throws Exception {
-
-
-        final WriteContext writeContext = mock( WriteContext.class );
-
-
-        final Entity entity = new Entity();
-        final UUID version = UUIDGenerator.newTimeUUID();
-
-        entity.setVersion( version );
-
-        //mock returning the entity from the write context
-        when( writeContext.getMessage( Entity.class ) ).thenReturn( entity );
-
-
-        //mock returning a mock mutation when we do a log entry write
-        final MvccLogEntrySerializationStrategy logStrategy = mock( MvccLogEntrySerializationStrategy.class );
-
-        //run the stage
-        Start newStage = new Start( logStrategy );
-
-        newStage.performStage( writeContext );
-    }
-
-
-    /** Test no entity id on the entity */
-    @Test( expected = NullPointerException.class )
-    public void testNoEntityVersion() throws Exception {
-
-
-        final WriteContext writeContext = mock( WriteContext.class );
-
-
-        final Entity entity = new Entity();
-        final UUID entityId = UUIDGenerator.newTimeUUID();
-
-
-        FieldUtils.writeDeclaredField( entity, "uuid", entityId, true );
-
-
-        //mock returning the entity from the write context
-        when( writeContext.getMessage( Entity.class ) ).thenReturn( entity );
-
-
-        //mock returning a mock mutation when we do a log entry write
-        final MvccLogEntrySerializationStrategy logStrategy = mock( MvccLogEntrySerializationStrategy.class );
-
-        //run the stage
-        Start newStage = new Start( logStrategy );
-
-        newStage.performStage( writeContext );
-    }
-
-
-    private Entity generateEntity() throws IllegalAccessException {
-        final Entity entity = new Entity();
-        final UUID entityId = UUIDGenerator.newTimeUUID();
-        final UUID version = UUIDGenerator.newTimeUUID();
-
-        FieldUtils.writeDeclaredField( entity, "uuid", entityId, true );
-        entity.setVersion( version );
-
-        return entity;
-    }
-}
-
-

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/43aba652/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/StartWriteTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/StartWriteTest.java b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/StartWriteTest.java
new file mode 100644
index 0000000..d7a6b46
--- /dev/null
+++ b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/StartWriteTest.java
@@ -0,0 +1,187 @@
+package org.apache.usergrid.persistence.collection.mvcc.stage.impl;
+
+
+import java.util.UUID;
+
+import org.junit.Test;
+import org.mockito.ArgumentCaptor;
+
+import org.apache.commons.lang3.reflect.FieldUtils;
+
+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.ExecutionContext;
+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 com.netflix.astyanax.MutationBatch;
+
+import static junit.framework.TestCase.assertSame;
+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 StartWriteTest {
+
+    /** Standard flow */
+    @Test
+    public void testStartStage() throws Exception {
+
+
+        final ExecutionContext executionContext = mock( ExecutionContext.class );
+        final CollectionContext context = mock( CollectionContext.class );
+
+
+        //mock returning the context
+        when( executionContext.getCollectionContext() ).thenReturn( context );
+
+
+        //set up the mock to return the entity from the start phase
+        final Entity entity = generateEntity();
+
+        //mock returning the entity from the write context
+        when( executionContext.getMessage( Entity.class ) ).thenReturn( entity );
+
+
+        //mock returning a mock mutation when we do a log entry write
+        final MvccLogEntrySerializationStrategy logStrategy = mock( MvccLogEntrySerializationStrategy.class );
+
+        final ArgumentCaptor<MvccLogEntry> logEntry = ArgumentCaptor.forClass( MvccLogEntry.class );
+
+        final MutationBatch mutation = mock( MutationBatch.class );
+
+        when( logStrategy.write( same( context ), logEntry.capture() ) ).thenReturn( mutation );
+
+
+        //run the stage
+        StartWrite newStage = new StartWrite( logStrategy );
+
+        newStage.performStage( executionContext );
+
+
+        //now verify our output was correct
+        ArgumentCaptor<MvccEntity> mvccEntity = ArgumentCaptor.forClass( MvccEntity.class );
+
+
+        //verify the log entry is correct
+        MvccLogEntry entry = logEntry.getValue();
+
+        assertEquals( "entity id did not match ", entity.getUuid(), entry.getEntityId() );
+        assertEquals( "version did not not match entityId", entity.getVersion(), entry.getVersion() );
+        assertEquals( "Stage is correct", Stage.ACTIVE, entry.getStage() );
+
+
+        //now verify we set the message into the write context
+        verify( executionContext ).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", entity.getUuid(), created.getUuid() );
+        assertEquals( "version did not not match entityId", entity.getVersion(), created.getVersion() );
+        assertSame( "Entity correct", entity, created.getEntity().get() );
+
+
+        //now verify the proceed was called
+        verify( executionContext ).proceed();
+    }
+
+
+    /** Test no entity in the pipeline */
+    @Test( expected = NullPointerException.class )
+    public void testNoEntity() throws Exception {
+
+
+        final ExecutionContext executionContext = mock( ExecutionContext.class );
+
+
+        //mock returning the entity from the write context
+        when( executionContext.getMessage( Entity.class ) ).thenReturn( null );
+
+
+        //mock returning a mock mutation when we do a log entry write
+        final MvccLogEntrySerializationStrategy logStrategy = mock( MvccLogEntrySerializationStrategy.class );
+
+        //run the stage
+        StartWrite newStage = new StartWrite( logStrategy );
+
+        newStage.performStage( executionContext );
+    }
+
+
+    /** Test no entity id on the entity */
+    @Test( expected = NullPointerException.class )
+    public void testNoEntityId() throws Exception {
+
+
+        final ExecutionContext executionContext = mock( ExecutionContext.class );
+
+
+        final Entity entity = new Entity();
+        final UUID version = UUIDGenerator.newTimeUUID();
+
+        entity.setVersion( version );
+
+        //mock returning the entity from the write context
+        when( executionContext.getMessage( Entity.class ) ).thenReturn( entity );
+
+
+        //mock returning a mock mutation when we do a log entry write
+        final MvccLogEntrySerializationStrategy logStrategy = mock( MvccLogEntrySerializationStrategy.class );
+
+        //run the stage
+        StartWrite newStage = new StartWrite( logStrategy );
+
+        newStage.performStage( executionContext );
+    }
+
+
+    /** Test no entity id on the entity */
+    @Test( expected = NullPointerException.class )
+    public void testNoEntityVersion() throws Exception {
+
+
+        final ExecutionContext executionContext = mock( ExecutionContext.class );
+
+
+        final Entity entity = new Entity();
+        final UUID entityId = UUIDGenerator.newTimeUUID();
+
+
+        FieldUtils.writeDeclaredField( entity, "uuid", entityId, true );
+
+
+        //mock returning the entity from the write context
+        when( executionContext.getMessage( Entity.class ) ).thenReturn( entity );
+
+
+        //mock returning a mock mutation when we do a log entry write
+        final MvccLogEntrySerializationStrategy logStrategy = mock( MvccLogEntrySerializationStrategy.class );
+
+        //run the stage
+        StartWrite newStage = new StartWrite( logStrategy );
+
+        newStage.performStage( executionContext );
+    }
+
+
+    private Entity generateEntity() throws IllegalAccessException {
+        final Entity entity = new Entity();
+        final UUID entityId = UUIDGenerator.newTimeUUID();
+        final UUID version = UUIDGenerator.newTimeUUID();
+
+        FieldUtils.writeDeclaredField( entity, "uuid", entityId, true );
+        entity.setVersion( version );
+
+        return entity;
+    }
+}
+
+

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/43aba652/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 dad2b21..2569c3a 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,8 +1,8 @@
 package org.apache.usergrid.persistence.index.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.mvcc.stage.ExecutionContext;
+import org.apache.usergrid.persistence.collection.mvcc.stage.Stage;
 
 
 /**
@@ -10,11 +10,11 @@ import org.apache.usergrid.persistence.collection.mvcc.stage.WriteStage;
  * @author: tnine
  *
  */
-public class Complete implements WriteStage
+public class Complete implements Stage
 {
 
     @Override
-        public void performStage( final WriteContext context ) {
+        public void performStage( final ExecutionContext context ) {
             //To change body of implemented methods use File | Settings | File Templates.
         }
 

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/43aba652/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 05ecb1d..3809880 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,16 +1,16 @@
 package org.apache.usergrid.persistence.index.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.mvcc.stage.ExecutionContext;
+import org.apache.usergrid.persistence.collection.mvcc.stage.Stage;
 
 
 /** This state should signal an index update has started */
-public class Start implements WriteStage
+public class Start implements Stage
 {
 
     @Override
-    public void performStage( final WriteContext context ) {
+    public void performStage( final ExecutionContext context ) {
         //To change body of implemented methods use File | Settings | File Templates.
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/43aba652/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 cff6d97..b9433a6 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,17 +1,17 @@
 package org.apache.usergrid.persistence.index.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.mvcc.stage.Stage;
+import org.apache.usergrid.persistence.collection.mvcc.stage.ExecutionContext;
 
 
 /** This state should perform an update of the index. */
-public class Write implements WriteStage
+public class Write implements Stage
 {
 
 
 @Override
-       public void performStage( final WriteContext context ) {
+       public void performStage( final ExecutionContext context ) {
            //To change body of implemented methods use File | Settings | File Templates.
        }
 }

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/43aba652/stack/corepersistence/perftest/Readme.md
----------------------------------------------------------------------
diff --git a/stack/corepersistence/perftest/Readme.md b/stack/corepersistence/perftest/Readme.md
index 8061dda..d507e98 100644
--- a/stack/corepersistence/perftest/Readme.md
+++ b/stack/corepersistence/perftest/Readme.md
@@ -21,7 +21,7 @@ Perftest instance.
 
 The following endpoints are used to control the framework:
 
- * /perftest/start
+ * /perftest/startWrite
  * /perftest/stop
  * /perftest/reset
  * /perftest/stats
@@ -29,7 +29,7 @@ The following endpoints are used to control the framework:
 The following ascii text shows the states of the framework which one can 
 go through while issuing POSTs to the end points above:
 
-            start           stop
+            startWrite           stop
     +-----+       +-------+     +-------+
  ---+ready+-------+running+-----+stopped|
     +--+--+       +-------+     +---+---+


[6/6] git commit: Commit after refactor. Need to evaluate an event bus in guava instead of using coupled stages

Posted by to...@apache.org.
Commit after refactor.  Need to evaluate an event bus in guava instead of using coupled stages


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

Branch: refs/heads/two-dot-o
Commit: 44072d594f76f9f4fd0e6bc828e6b4d5ba7b8d81
Parents: 43aba65
Author: Todd Nine <to...@apache.org>
Authored: Wed Dec 4 17:42:24 2013 -0700
Committer: Todd Nine <to...@apache.org>
Committed: Wed Dec 4 17:52:04 2013 -0700

----------------------------------------------------------------------
 .../collection/impl/CollectionManagerImpl.java  |  14 +-
 .../collection/mvcc/stage/ExecutionStage.java   |  15 ++
 .../collection/mvcc/stage/Stage.java            |  15 --
 .../collection/mvcc/stage/StagePipeline.java    |   8 +-
 .../collection/mvcc/stage/impl/Clear.java       |  91 ---------
 .../stage/impl/CollectionPipelineModule.java    |  33 +++-
 .../collection/mvcc/stage/impl/Commit.java      |  90 ---------
 .../collection/mvcc/stage/impl/Create.java      |  85 ---------
 .../mvcc/stage/impl/CreatePipeline.java         |  23 ---
 .../mvcc/stage/impl/DeletePipeline.java         |  23 ---
 .../mvcc/stage/impl/ExecutionContextImpl.java   |   6 +-
 .../collection/mvcc/stage/impl/Load.java        |  82 --------
 .../mvcc/stage/impl/LoadPipeline.java           |  23 ---
 .../mvcc/stage/impl/StagePipelineImpl.java      |  32 ++--
 .../collection/mvcc/stage/impl/StartDelete.java |  97 ----------
 .../collection/mvcc/stage/impl/StartWrite.java  |  92 ---------
 .../collection/mvcc/stage/impl/Update.java      |  66 -------
 .../mvcc/stage/impl/UpdatePipeline.java         |  23 ---
 .../collection/mvcc/stage/impl/Verify.java      |  25 ---
 .../mvcc/stage/impl/WriteContextCallback.java   |  59 ------
 .../mvcc/stage/impl/delete/Delete.java          |  91 +++++++++
 .../mvcc/stage/impl/delete/DeletePipeline.java  |  23 +++
 .../mvcc/stage/impl/delete/StartDelete.java     |  96 ++++++++++
 .../collection/mvcc/stage/impl/read/Load.java   |  82 ++++++++
 .../mvcc/stage/impl/read/PipelineLoad.java      |  23 +++
 .../mvcc/stage/impl/write/Commit.java           |  90 +++++++++
 .../mvcc/stage/impl/write/Create.java           |  85 +++++++++
 .../mvcc/stage/impl/write/PipelineCreate.java   |  23 +++
 .../mvcc/stage/impl/write/PipelineUpdate.java   |  23 +++
 .../mvcc/stage/impl/write/StartWrite.java       |  92 +++++++++
 .../mvcc/stage/impl/write/Update.java           |  70 +++++++
 .../mvcc/stage/impl/write/Verify.java           |  25 +++
 .../stage/impl/write/WriteContextCallback.java  |  59 ++++++
 .../MvccEntitySerializationStrategy.java        |   2 +-
 .../collection/CollectionManagerTest.java       |  13 +-
 .../mvcc/stage/ExecutionContextTest.java        |  24 +--
 .../mvcc/stage/StagePipelineTest.java           |  22 +--
 .../collection/mvcc/stage/impl/CreateTest.java  | 152 ---------------
 .../mvcc/stage/impl/StartWriteTest.java         | 187 ------------------
 .../mvcc/stage/impl/write/CreateTest.java       | 153 +++++++++++++++
 .../mvcc/stage/impl/write/StartWriteTest.java   | 188 ++++++++++++++++++
 .../mvcc/stage/impl/write/UpdateTest.java       | 189 +++++++++++++++++++
 .../persistence/index/stage/Complete.java       |   4 +-
 .../usergrid/persistence/index/stage/Start.java |   4 +-
 .../usergrid/persistence/index/stage/Write.java |   4 +-
 45 files changed, 1420 insertions(+), 1206 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/44072d59/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
index c20d2c3..e20ba62 100644
--- 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
@@ -11,11 +11,11 @@ import org.apache.usergrid.persistence.collection.CollectionManager;
 import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntity;
 import org.apache.usergrid.persistence.collection.mvcc.stage.ExecutionContext;
 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.read.PipelineLoad;
+import org.apache.usergrid.persistence.collection.mvcc.stage.impl.write.PipelineCreate;
+import org.apache.usergrid.persistence.collection.mvcc.stage.impl.delete.DeletePipeline;
 import org.apache.usergrid.persistence.collection.mvcc.stage.impl.ExecutionContextImpl;
-import org.apache.usergrid.persistence.collection.mvcc.stage.impl.LoadPipeline;
-import org.apache.usergrid.persistence.collection.mvcc.stage.impl.UpdatePipeline;
+import org.apache.usergrid.persistence.collection.mvcc.stage.impl.write.PipelineUpdate;
 import org.apache.usergrid.persistence.model.entity.Entity;
 
 import com.google.inject.Inject;
@@ -39,10 +39,10 @@ public class CollectionManagerImpl implements CollectionManager {
 
 
     @Inject
-    public CollectionManagerImpl( @CreatePipeline final StagePipeline createPipeline,
-                                  @UpdatePipeline final StagePipeline updatePipeline,
+    public CollectionManagerImpl( @PipelineCreate final StagePipeline createPipeline,
+                                  @PipelineUpdate final StagePipeline updatePipeline,
                                   @DeletePipeline final StagePipeline deletePipeline,
-                                  @LoadPipeline final StagePipeline loadPipeline,
+                                  @PipelineLoad final StagePipeline loadPipeline,
                                   @Assisted final CollectionContext context ) {
 
         this.createPipeline = createPipeline;

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/44072d59/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/ExecutionStage.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/ExecutionStage.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/ExecutionStage.java
new file mode 100644
index 0000000..a98c813
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/ExecutionStage.java
@@ -0,0 +1,15 @@
+package org.apache.usergrid.persistence.collection.mvcc.stage;
+
+
+/** The possible stages in our write flow. */
+public interface ExecutionStage {
+
+    /**
+     * 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
+     *
+     * @return The asynchronous listener to signal success
+     */
+    public void performStage( ExecutionContext context );
+}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/44072d59/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/Stage.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/Stage.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/Stage.java
deleted file mode 100644
index 538a546..0000000
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/Stage.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package org.apache.usergrid.persistence.collection.mvcc.stage;
-
-
-/** The possible stages in our write flow. */
-public interface Stage {
-
-    /**
-     * 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
-     *
-     * @return The asynchronous listener to signal success
-     */
-    public void performStage( ExecutionContext context );
-}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/44072d59/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 0b032d9..9d68e10 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
@@ -13,14 +13,14 @@ public interface StagePipeline {
     /**
      * Get the first stage in this pipeline.
      */
-    Stage first();
+    ExecutionStage first();
 
 
     /**
-     * get the next stage after the stage specified
-     * @param stage The stage to seek in our pipeline
+     * get the next executionStage after the executionStage specified
+     * @param executionStage The executionStage to seek in our pipeline
      */
-    Stage nextStage(Stage stage);
+    ExecutionStage nextStage(ExecutionStage executionStage );
 
 
 

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/44072d59/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Clear.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Clear.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Clear.java
deleted file mode 100644
index 854ec24..0000000
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Clear.java
+++ /dev/null
@@ -1,91 +0,0 @@
-package org.apache.usergrid.persistence.collection.mvcc.stage.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.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.impl.MvccLogEntryImpl;
-import org.apache.usergrid.persistence.collection.mvcc.stage.Stage;
-import org.apache.usergrid.persistence.collection.mvcc.stage.ExecutionContext;
-import org.apache.usergrid.persistence.collection.serialization.MvccEntitySerializationStrategy;
-import org.apache.usergrid.persistence.collection.serialization.MvccLogEntrySerializationStrategy;
-
-import com.google.common.base.Preconditions;
-import com.google.inject.Inject;
-import com.netflix.astyanax.MutationBatch;
-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 Clear implements Stage {
-
-
-    private static final Logger LOG = LoggerFactory.getLogger( Clear.class );
-
-    private final MvccLogEntrySerializationStrategy logEntrySerializationStrategy;
-    private final MvccEntitySerializationStrategy entitySerializationStrategy;
-
-
-    @Inject
-    public Clear( final MvccLogEntrySerializationStrategy logEntrySerializationStrategy,
-                  final MvccEntitySerializationStrategy entitySerializationStrategy ) {
-
-        Preconditions.checkNotNull( logEntrySerializationStrategy, "logEntrySerializationStrategy is required" );
-              Preconditions.checkNotNull( entitySerializationStrategy, "entitySerializationStrategy is required" );
-
-
-        this.logEntrySerializationStrategy = logEntrySerializationStrategy;
-        this.entitySerializationStrategy = entitySerializationStrategy;
-    }
-
-
-    @Override
-    public void performStage( final ExecutionContext executionContext ) {
-        final MvccEntity entity = executionContext.getMessage( MvccEntity.class );
-
-        Preconditions.checkNotNull( entity, "Entity is required in the new stage of the mvcc write" );
-
-        final UUID entityId = entity.getUuid();
-        final UUID version = entity.getVersion();
-
-        Preconditions.checkNotNull( entityId, "Entity id is required in this stage" );
-        Preconditions.checkNotNull( version, "Entity version is required in this stage" );
-
-
-        final CollectionContext collectionContext = executionContext.getCollectionContext();
-
-
-        final MvccLogEntry startEntry = new MvccLogEntryImpl( entityId, version, org.apache.usergrid.persistence
-                .collection.mvcc.entity.Stage.COMMITTED );
-
-        MutationBatch logMutation = logEntrySerializationStrategy.write( collectionContext, startEntry );
-
-        //insert a "cleared" value into the versions.  Post processing should actually delete
-        MutationBatch entityMutation = entitySerializationStrategy.clear( collectionContext, entityId, version );
-
-        //merge the 2 into 1 mutation
-        logMutation.mergeShallow( entityMutation );
-
-
-        try {
-            logMutation.execute();
-        }
-        catch ( ConnectionException e ) {
-            LOG.error( "Failed to execute write asynchronously ", e );
-            throw new CollectionRuntimeException( "Failed to execute write asynchronously ", e );
-        }
-
-        /**
-         * We're done executing.
-         */
-        executionContext.proceed();
-
-        //TODO connect to post processors via listener
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/44072d59/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 8390e7b..68dab72 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,8 +1,20 @@
 package org.apache.usergrid.persistence.collection.mvcc.stage.impl;
 
 
-import org.apache.usergrid.persistence.collection.mvcc.stage.Stage;
+import org.apache.usergrid.persistence.collection.mvcc.stage.ExecutionStage;
 import org.apache.usergrid.persistence.collection.mvcc.stage.StagePipeline;
+import org.apache.usergrid.persistence.collection.mvcc.stage.impl.delete.Delete;
+import org.apache.usergrid.persistence.collection.mvcc.stage.impl.delete.DeletePipeline;
+import org.apache.usergrid.persistence.collection.mvcc.stage.impl.delete.StartDelete;
+import org.apache.usergrid.persistence.collection.mvcc.stage.impl.read.Load;
+import org.apache.usergrid.persistence.collection.mvcc.stage.impl.read.PipelineLoad;
+import org.apache.usergrid.persistence.collection.mvcc.stage.impl.write.Commit;
+import org.apache.usergrid.persistence.collection.mvcc.stage.impl.write.Create;
+import org.apache.usergrid.persistence.collection.mvcc.stage.impl.write.PipelineCreate;
+import org.apache.usergrid.persistence.collection.mvcc.stage.impl.write.PipelineUpdate;
+import org.apache.usergrid.persistence.collection.mvcc.stage.impl.write.StartWrite;
+import org.apache.usergrid.persistence.collection.mvcc.stage.impl.write.Update;
+import org.apache.usergrid.persistence.collection.mvcc.stage.impl.write.Verify;
 
 import com.google.inject.AbstractModule;
 import com.google.inject.Inject;
@@ -24,7 +36,7 @@ public class CollectionPipelineModule extends AbstractModule {
      * objects are mutable
      */
     @Provides
-    @CreatePipeline
+    @PipelineCreate
     @Inject
     @Singleton
     public StagePipeline createPipeline( final Create create, final StartWrite startWrite, final Verify write,
@@ -34,7 +46,7 @@ public class CollectionPipelineModule extends AbstractModule {
 
 
     @Provides
-    @UpdatePipeline
+    @PipelineUpdate
     @Inject
     @Singleton
     public StagePipeline updatePipeline( final Update update, final StartWrite startWrite, final Verify write,
@@ -47,13 +59,13 @@ public class CollectionPipelineModule extends AbstractModule {
     @DeletePipeline
     @Inject
     @Singleton
-    public StagePipeline deletePipeline(final StartDelete startDelete,  final Clear delete ) {
+    public StagePipeline deletePipeline(final StartDelete startDelete,  final Delete delete ) {
         return StagePipelineImpl.fromStages(startDelete, delete );
     }
 
 
     @Provides
-    @LoadPipeline
+    @PipelineLoad
     @Inject
     @Singleton
     public StagePipeline deletePipeline( final Load load ) {
@@ -67,17 +79,20 @@ public class CollectionPipelineModule extends AbstractModule {
         /**
          * Configure all stages here
          */
-        Multibinder<Stage> stageBinder = Multibinder.newSetBinder( binder(), Stage.class );
+        Multibinder<ExecutionStage> stageBinder = Multibinder.newSetBinder( binder(), ExecutionStage.class );
 
 
 
         //creation stages
+        stageBinder.addBinding().to( Commit.class );
         stageBinder.addBinding().to( Create.class );
-        stageBinder.addBinding().to( Update.class );
         stageBinder.addBinding().to( StartWrite.class );
+        stageBinder.addBinding().to( Update.class );
         stageBinder.addBinding().to( Verify.class );
-        stageBinder.addBinding().to( Commit.class );
-        stageBinder.addBinding().to( Clear.class );
+
+        //delete stages
+        stageBinder.addBinding().to( Delete.class );
+        stageBinder.addBinding().to( StartDelete.class );
 
         //loading stages
         stageBinder.addBinding().to(Load.class);

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/44072d59/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 f29bf93..0000000
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Commit.java
+++ /dev/null
@@ -1,90 +0,0 @@
-package org.apache.usergrid.persistence.collection.mvcc.stage.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.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.impl.MvccLogEntryImpl;
-import org.apache.usergrid.persistence.collection.mvcc.stage.Stage;
-import org.apache.usergrid.persistence.collection.mvcc.stage.ExecutionContext;
-import org.apache.usergrid.persistence.collection.serialization.MvccEntitySerializationStrategy;
-import org.apache.usergrid.persistence.collection.serialization.MvccLogEntrySerializationStrategy;
-
-import com.google.common.base.Preconditions;
-import com.google.inject.Inject;
-import com.netflix.astyanax.MutationBatch;
-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 Stage {
-
-
-    private static final Logger LOG = LoggerFactory.getLogger( Commit.class );
-
-    private final MvccLogEntrySerializationStrategy logEntrySerializationStrategy;
-    private final MvccEntitySerializationStrategy entitySerializationStrategy;
-
-
-    @Inject
-    public Commit( final MvccLogEntrySerializationStrategy logEntrySerializationStrategy,
-                   final MvccEntitySerializationStrategy entitySerializationStrategy ) {
-        Preconditions.checkNotNull( logEntrySerializationStrategy, "logEntrySerializationStrategy is required" );
-                      Preconditions.checkNotNull( entitySerializationStrategy, "entitySerializationStrategy is required" );
-
-
-        this.logEntrySerializationStrategy = logEntrySerializationStrategy;
-        this.entitySerializationStrategy = entitySerializationStrategy;
-    }
-
-
-    @Override
-    public void performStage( final ExecutionContext executionContext ) {
-        final MvccEntity entity = executionContext.getMessage( MvccEntity.class );
-
-        Preconditions.checkNotNull( entity, "Entity is required in the new stage of the mvcc write" );
-
-        final UUID entityId = entity.getUuid();
-        final UUID version = entity.getVersion();
-
-        Preconditions.checkNotNull( entityId, "Entity id is required in this stage" );
-        Preconditions.checkNotNull( version, "Entity version is required in this stage" );
-
-
-        final CollectionContext collectionContext = executionContext.getCollectionContext();
-
-
-        final MvccLogEntry startEntry = new MvccLogEntryImpl( entityId, version, org.apache.usergrid.persistence
-                .collection.mvcc.entity.Stage.COMMITTED );
-
-        MutationBatch logMutation = logEntrySerializationStrategy.write( collectionContext, startEntry );
-
-        //now get our actual insert into the entity data
-        MutationBatch entityMutation = entitySerializationStrategy.write( collectionContext, entity );
-
-        //merge the 2 into 1 mutation
-        logMutation.mergeShallow( entityMutation );
-
-
-        try {
-            logMutation.execute();
-        }
-        catch ( ConnectionException e ) {
-            LOG.error( "Failed to execute write asynchronously ", e );
-            throw new CollectionRuntimeException( "Failed to execute write asynchronously ", e );
-        }
-
-        /**
-         * We're done executing.
-         */
-        executionContext.proceed();
-
-        //TODO connect to post processors via listener
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/44072d59/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Create.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Create.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Create.java
deleted file mode 100644
index 2026274..0000000
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Create.java
+++ /dev/null
@@ -1,85 +0,0 @@
-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.exception.CollectionRuntimeException;
-import org.apache.usergrid.persistence.collection.mvcc.stage.Stage;
-import org.apache.usergrid.persistence.collection.mvcc.stage.ExecutionContext;
-import org.apache.usergrid.persistence.collection.service.TimeService;
-import org.apache.usergrid.persistence.collection.service.UUIDService;
-import org.apache.usergrid.persistence.collection.util.Verify;
-import org.apache.usergrid.persistence.model.entity.Entity;
-
-import com.google.common.base.Preconditions;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-
-
-/**
- * This is the first stage and should be invoked immediately when a new entity create is started. No UUIDs should be
- * present, and this should set the entityId, version, created, and updated dates
- */
-@Singleton
-public class Create implements Stage {
-
-    private static final Logger LOG = LoggerFactory.getLogger( Create.class );
-
-
-    private final TimeService timeService;
-    private final UUIDService uuidService;
-
-
-    @Inject
-    public Create( final TimeService timeService, final UUIDService uuidService ) {
-        Preconditions.checkNotNull( timeService, "timeService is required" );
-        Preconditions.checkNotNull( uuidService, "uuidService is required" );
-
-
-        this.timeService = timeService;
-        this.uuidService = uuidService;
-    }
-
-
-    /**
-     * Create the entity Id  and inject it, as well as set the timestamp versions
-     *
-     * @param executionContext The context of the current write operation
-     */
-    @Override
-    public void performStage( final ExecutionContext executionContext ) {
-
-        final Entity entity = executionContext.getMessage( Entity.class );
-
-        Preconditions.checkNotNull( entity, "Entity is required in the new stage of the mvcc write" );
-
-        Verify.isNull( entity.getUuid(), "A new entity should not have an id set.  This is an update operation" );
-
-
-        final UUID entityId = uuidService.newTimeUUID();
-        final UUID version = entityId;
-        final long created = timeService.getTime();
-
-
-        try {
-            FieldUtils.writeDeclaredField( entity, "uuid", entityId, true );
-        }
-        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 );
-
-        //set the updated entity for the next stage
-        executionContext.setMessage( entity );
-        executionContext.proceed();
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/44072d59/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
deleted file mode 100644
index efe50c8..0000000
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/CreatePipeline.java
+++ /dev/null
@@ -1,23 +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 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/44072d59/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
deleted file mode 100644
index 3d95ddb..0000000
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/DeletePipeline.java
+++ /dev/null
@@ -1,23 +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 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/44072d59/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/ExecutionContextImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/ExecutionContextImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/ExecutionContextImpl.java
index 8139f3d..805d1e3 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/ExecutionContextImpl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/ExecutionContextImpl.java
@@ -3,7 +3,7 @@ package org.apache.usergrid.persistence.collection.mvcc.stage.impl;
 
 import org.apache.usergrid.persistence.collection.CollectionContext;
 import org.apache.usergrid.persistence.collection.mvcc.stage.ExecutionContext;
-import org.apache.usergrid.persistence.collection.mvcc.stage.Stage;
+import org.apache.usergrid.persistence.collection.mvcc.stage.ExecutionStage;
 import org.apache.usergrid.persistence.collection.mvcc.stage.StagePipeline;
 
 import com.google.common.base.Preconditions;
@@ -17,7 +17,7 @@ public class ExecutionContextImpl implements ExecutionContext {
     private final CollectionContext context;
 
     private Object message;
-    private Stage current;
+    private ExecutionStage current;
 
 
     @Inject
@@ -72,7 +72,7 @@ public class ExecutionContextImpl implements ExecutionContext {
 
     @Override
     public void proceed() {
-        Stage next = this.pipeline.nextStage( current );
+        ExecutionStage next = this.pipeline.nextStage( current );
 
         //Nothing to do
         if ( next == null ) {

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/44072d59/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Load.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Load.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Load.java
deleted file mode 100644
index b0ac251..0000000
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Load.java
+++ /dev/null
@@ -1,82 +0,0 @@
-package org.apache.usergrid.persistence.collection.mvcc.stage.impl;
-
-
-import java.util.List;
-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.mvcc.entity.MvccEntity;
-import org.apache.usergrid.persistence.collection.mvcc.stage.ExecutionContext;
-import org.apache.usergrid.persistence.collection.mvcc.stage.Stage;
-import org.apache.usergrid.persistence.collection.serialization.MvccEntitySerializationStrategy;
-import org.apache.usergrid.persistence.collection.service.UUIDService;
-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;
-
-
-/**
- * This stage is a load stage to load a single entity
- */
-public class Load implements Stage {
-
-
-    private static final Logger LOG = LoggerFactory.getLogger( Load.class );
-
-    private final UUIDService uuidService;
-    private final MvccEntitySerializationStrategy entitySerializationStrategy;
-
-
-    @Inject
-    public Load( final UUIDService uuidService, final MvccEntitySerializationStrategy entitySerializationStrategy ) {
-        Preconditions.checkNotNull( entitySerializationStrategy, "entitySerializationStrategy is required" );
-        Preconditions.checkNotNull( uuidService, "uuidService is required" );
-
-
-        this.uuidService = uuidService;
-        this.entitySerializationStrategy = entitySerializationStrategy;
-    }
-
-
-    @Override
-    public void performStage( final ExecutionContext executionContext ) {
-        final UUID entityId = executionContext.getMessage( UUID.class );
-
-        Preconditions.checkNotNull( entityId, "Entity id required in the read stage" );
-
-
-        final CollectionContext collectionContext = executionContext.getCollectionContext();
-
-        //generate  a version that represents now
-        final UUID versionMax = uuidService.newTimeUUID();
-
-        List<MvccEntity> results = entitySerializationStrategy.load( collectionContext, entityId, versionMax, 1 );
-
-        //nothing to do, we didn't get a result back
-        if(results.size() != 1){
-            executionContext.setMessage( null );
-            executionContext.proceed();
-            return;
-        }
-
-        final Optional<Entity> targetVersion = results.get(0).getEntity();
-
-        //this entity has been marked as cleared.  The version exists, but does not have entity data
-        if(!targetVersion.isPresent()){
-
-            //TODO, a lazy async repair/cleanup here?
-
-            executionContext.setMessage( null );
-            executionContext.proceed();
-            return;
-        }
-
-        executionContext.setMessage( targetVersion.get() );
-        executionContext.proceed();
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/44072d59/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/LoadPipeline.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/LoadPipeline.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/LoadPipeline.java
deleted file mode 100644
index f712b2c..0000000
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/LoadPipeline.java
+++ /dev/null
@@ -1,23 +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 delete pipeline
- *
- * @author tnine
- */
-@BindingAnnotation
-@Target({ FIELD, PARAMETER, METHOD })
-@Retention(RUNTIME)
-public @interface LoadPipeline {}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/44072d59/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 74dc003..1f3a0fe 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
@@ -4,7 +4,7 @@ package org.apache.usergrid.persistence.collection.mvcc.stage.impl;
 import java.util.Arrays;
 import java.util.List;
 
-import org.apache.usergrid.persistence.collection.mvcc.stage.Stage;
+import org.apache.usergrid.persistence.collection.mvcc.stage.ExecutionStage;
 import org.apache.usergrid.persistence.collection.mvcc.stage.StagePipeline;
 
 import com.google.common.base.Preconditions;
@@ -13,25 +13,25 @@ import com.google.common.base.Preconditions;
 /** @author tnine */
 public class StagePipelineImpl implements StagePipeline {
 
-    private final List<Stage> stages;
+    private final List<ExecutionStage> executionStages;
 
 
-    protected StagePipelineImpl( List<Stage> stages ) {
-        Preconditions.checkNotNull(stages, "stages is required");
-        Preconditions.checkArgument(  stages.size() > 0, "stages must have more than 1 element" );
+    protected StagePipelineImpl( List<ExecutionStage> executionStages ) {
+        Preconditions.checkNotNull( executionStages, "executionStages is required");
+        Preconditions.checkArgument(  executionStages.size() > 0, "executionStages must have more than 1 element" );
 
-        this.stages = stages;
+        this.executionStages = executionStages;
     }
 
 
     @Override
-    public Stage first() {
+    public ExecutionStage first() {
 
-        if ( stages.size() == 0 ) {
+        if ( executionStages.size() == 0 ) {
             return null;
         }
 
-        return stages.get( 0 );
+        return executionStages.get( 0 );
     }
 
 
@@ -39,23 +39,23 @@ public class StagePipelineImpl implements StagePipeline {
 
 
     @Override
-    public Stage nextStage( final Stage stage ) {
+    public ExecutionStage nextStage( final ExecutionStage executionStage ) {
 
-        Preconditions.checkNotNull( stage, "Stage cannot be null" );
+        Preconditions.checkNotNull( executionStage, "ExecutionStage cannot be null" );
 
-        int index = stages.indexOf( stage );
+        int index = executionStages.indexOf( executionStage );
 
         //we're done, do nothing
-        if ( index == stages.size() -1  ) {
+        if ( index == executionStages.size() -1  ) {
             return null;
         }
 
-        return  stages.get( index + 1 );
+        return  executionStages.get( index + 1 );
     }
 
 
     /** Factory to create a new instance. */
-    public static StagePipelineImpl fromStages( Stage... stages ) {
-        return new StagePipelineImpl(Arrays.asList(  stages ));
+    public static StagePipelineImpl fromStages( ExecutionStage... executionStages ) {
+        return new StagePipelineImpl(Arrays.asList( executionStages ));
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/44072d59/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/StartDelete.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/StartDelete.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/StartDelete.java
deleted file mode 100644
index 383ee9e..0000000
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/StartDelete.java
+++ /dev/null
@@ -1,97 +0,0 @@
-package org.apache.usergrid.persistence.collection.mvcc.stage.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.exception.CollectionRuntimeException;
-import org.apache.usergrid.persistence.collection.mvcc.entity.MvccLogEntry;
-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.ExecutionContext;
-import org.apache.usergrid.persistence.collection.mvcc.stage.Stage;
-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.Optional;
-import com.google.common.base.Preconditions;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import com.netflix.astyanax.MutationBatch;
-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 StartDelete implements Stage {
-
-    private static final Logger LOG = LoggerFactory.getLogger( StartDelete.class );
-
-    private final MvccLogEntrySerializationStrategy logStrategy;
-    private final UUIDService uuidService;
-
-
-    /** Create a new stage with the current context */
-    @Inject
-    public StartDelete( final MvccLogEntrySerializationStrategy logStrategy, final UUIDService uuidService ) {
-
-        Preconditions.checkNotNull( logStrategy, "logStrategy is required" );
-        Preconditions.checkNotNull( uuidService, "uuidService is required" );
-
-
-        this.logStrategy = logStrategy;
-        this.uuidService = uuidService;
-    }
-
-
-    /**
-     * Create the entity Id  and inject it, as well as set the timestamp versions
-     *
-     * @param executionContext The context of the current write operation
-     */
-    @Override
-    public void performStage( final ExecutionContext executionContext ) {
-
-        final UUID entityId = executionContext.getMessage( UUID.class );
-
-
-        final UUID version = uuidService.newTimeUUID();
-
-        Preconditions.checkNotNull( entityId, "Entity id is required in this stage" );
-        Preconditions.checkNotNull( version, "Entity version is required in this stage" );
-
-
-
-        final CollectionContext collectionContext = executionContext.getCollectionContext();
-
-
-        final MvccLogEntry startEntry = new MvccLogEntryImpl( entityId, version, org.apache.usergrid.persistence
-                .collection.mvcc.entity.Stage.ACTIVE );
-
-        MutationBatch write = logStrategy.write( collectionContext, startEntry );
-
-
-        try {
-            write.execute();
-        }
-        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
-        final MvccEntityImpl nextStage = new MvccEntityImpl( entityId, version, Optional.<Entity>absent() );
-
-        executionContext.setMessage( nextStage );
-        executionContext.proceed();
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/44072d59/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/StartWrite.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/StartWrite.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/StartWrite.java
deleted file mode 100644
index 4c55ae6..0000000
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/StartWrite.java
+++ /dev/null
@@ -1,92 +0,0 @@
-package org.apache.usergrid.persistence.collection.mvcc.stage.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.exception.CollectionRuntimeException;
-import org.apache.usergrid.persistence.collection.mvcc.entity.MvccLogEntry;
-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.ExecutionContext;
-import org.apache.usergrid.persistence.collection.mvcc.stage.Stage;
-import org.apache.usergrid.persistence.collection.serialization.MvccLogEntrySerializationStrategy;
-import org.apache.usergrid.persistence.model.entity.Entity;
-
-import com.google.common.base.Preconditions;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import com.netflix.astyanax.MutationBatch;
-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 StartWrite implements Stage {
-
-    private static final Logger LOG = LoggerFactory.getLogger( StartWrite.class );
-
-    private final MvccLogEntrySerializationStrategy logStrategy;
-
-
-    /** Create a new stage with the current context */
-    @Inject
-    public StartWrite( final MvccLogEntrySerializationStrategy logStrategy ) {
-        Preconditions.checkNotNull( logStrategy, "logStrategy is required" );
-
-
-        this.logStrategy = logStrategy;
-    }
-
-
-    /**
-     * Create the entity Id  and inject it, as well as set the timestamp versions
-     *
-     * @param executionContext The context of the current write operation
-     */
-    @Override
-    public void performStage( final ExecutionContext executionContext ) {
-
-        final Entity entity = executionContext.getMessage( Entity.class );
-
-        Preconditions.checkNotNull( entity, "Entity is required in the new stage of the mvcc write" );
-
-        final UUID entityId = entity.getUuid();
-        final UUID version = entity.getVersion();
-
-        Preconditions.checkNotNull( entityId, "Entity id is required in this stage" );
-        Preconditions.checkNotNull( version, "Entity version is required in this stage" );
-
-
-
-        final CollectionContext collectionContext = executionContext.getCollectionContext();
-
-
-        final MvccLogEntry startEntry = new MvccLogEntryImpl( entityId, version, org.apache.usergrid.persistence
-                .collection.mvcc.entity.Stage.ACTIVE );
-
-        MutationBatch write = logStrategy.write( collectionContext, startEntry );
-
-
-        try {
-            write.execute();
-        }
-        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
-        final MvccEntityImpl nextStage = new MvccEntityImpl( entityId, version, entity );
-
-        executionContext.setMessage( nextStage );
-        executionContext.proceed();
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/44072d59/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Update.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Update.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Update.java
deleted file mode 100644
index ce1be76..0000000
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Update.java
+++ /dev/null
@@ -1,66 +0,0 @@
-package org.apache.usergrid.persistence.collection.mvcc.stage.impl;
-
-
-import java.util.UUID;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import org.apache.usergrid.persistence.collection.mvcc.stage.ExecutionContext;
-import org.apache.usergrid.persistence.collection.mvcc.stage.Stage;
-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 com.google.common.base.Preconditions;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-
-
-/**
- * This stage performs the initial commit log and write of an entity.  It assumes the entity id and created has already
- * been set correctly
- */
-@Singleton
-public class Update implements Stage {
-
-    private static final Logger LOG = LoggerFactory.getLogger( Update.class );
-
-    private final TimeService timeService;
-    private final UUIDService uuidService;
-
-
-    @Inject
-    public Update( final TimeService timeService, final UUIDService uuidService ) {
-        Preconditions.checkNotNull( timeService, "timeService is required" );
-        Preconditions.checkNotNull( uuidService, "uuidService is required" );
-
-        this.timeService = timeService;
-        this.uuidService = uuidService;
-    }
-
-
-    /**
-     * Create the entity Id  and inject it, as well as set the timestamp versions
-     *
-     * @param executionContext The context of the current write operation
-     */
-    @Override
-    public void performStage( final ExecutionContext executionContext ) {
-
-        final Entity entity = executionContext.getMessage( Entity.class );
-
-        Preconditions.checkNotNull( entity, "Entity is required in the new stage of the mvcc write" );
-
-
-        final UUID version = uuidService.newTimeUUID();
-        final long updated = timeService.getTime();
-
-
-        entity.setVersion( version );
-        entity.setUpdated( updated );
-
-        executionContext.setMessage( entity );
-        executionContext.proceed();
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/44072d59/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 abc6e15..0000000
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/UpdatePipeline.java
+++ /dev/null
@@ -1,23 +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 create pipeline
- *
- * @author tnine
- */
-@BindingAnnotation
-@Target( { FIELD, PARAMETER, METHOD } )
-@Retention( RUNTIME )
-public @interface UpdatePipeline {}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/44072d59/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Verify.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Verify.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Verify.java
deleted file mode 100644
index cc53000..0000000
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Verify.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package org.apache.usergrid.persistence.collection.mvcc.stage.impl;
-
-
-import org.apache.usergrid.persistence.collection.mvcc.stage.Stage;
-import org.apache.usergrid.persistence.collection.mvcc.stage.ExecutionContext;
-
-import com.google.inject.Singleton;
-
-
-/** This phase should execute any verification on the MvccEntity */
-@Singleton
-public class Verify implements Stage {
-
-
-    public Verify() {
-    }
-
-
-    @Override
-    public void performStage( final ExecutionContext executionContext ) {
-        //TODO no op for now, just continue to the next stage.  Verification logic goes in here
-
-        executionContext.proceed();
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/44072d59/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
deleted file mode 100644
index 2a34e95..0000000
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/WriteContextCallback.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package org.apache.usergrid.persistence.collection.mvcc.stage.impl;
-
-
-import org.apache.usergrid.persistence.collection.exception.CollectionRuntimeException;
-import org.apache.usergrid.persistence.collection.mvcc.stage.ExecutionContext;
-
-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;
-
-
-/**
- * Helper class to cause the async execution to continue
- * Not used ATM, just here for demonstration purposes with async astynax invocation on phase proceed
- *
- * @author tnine
- */
-public class WriteContextCallback implements FutureCallback<OperationResult<Void>> {
-
-    private final ExecutionContext context;
-
-
-    /** Create a new callback.  The data will be passed to the next stage */
-    private WriteContextCallback( final ExecutionContext context ) {
-        this.context = context;
-    }
-
-
-    public void onSuccess( final OperationResult<Void> result ) {
-
-        /**
-         * Proceed to the next stage
-         */
-        context.proceed();
-    }
-
-
-    @Override
-    public void onFailure( final Throwable 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 ExecutionContext context ) {
-
-        Futures.addCallback( future, new WriteContextCallback( context ) );
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/44072d59/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/delete/Delete.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/delete/Delete.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/delete/Delete.java
new file mode 100644
index 0000000..7810beb
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/delete/Delete.java
@@ -0,0 +1,91 @@
+package org.apache.usergrid.persistence.collection.mvcc.stage.impl.delete;
+
+
+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.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.impl.MvccLogEntryImpl;
+import org.apache.usergrid.persistence.collection.mvcc.stage.ExecutionStage;
+import org.apache.usergrid.persistence.collection.mvcc.stage.ExecutionContext;
+import org.apache.usergrid.persistence.collection.serialization.MvccEntitySerializationStrategy;
+import org.apache.usergrid.persistence.collection.serialization.MvccLogEntrySerializationStrategy;
+
+import com.google.common.base.Preconditions;
+import com.google.inject.Inject;
+import com.netflix.astyanax.MutationBatch;
+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 Delete implements ExecutionStage {
+
+
+    private static final Logger LOG = LoggerFactory.getLogger( Delete.class );
+
+    private final MvccLogEntrySerializationStrategy logEntrySerializationStrategy;
+    private final MvccEntitySerializationStrategy entitySerializationStrategy;
+
+
+    @Inject
+    public Delete( final MvccLogEntrySerializationStrategy logEntrySerializationStrategy,
+                   final MvccEntitySerializationStrategy entitySerializationStrategy ) {
+
+        Preconditions.checkNotNull( logEntrySerializationStrategy, "logEntrySerializationStrategy is required" );
+              Preconditions.checkNotNull( entitySerializationStrategy, "entitySerializationStrategy is required" );
+
+
+        this.logEntrySerializationStrategy = logEntrySerializationStrategy;
+        this.entitySerializationStrategy = entitySerializationStrategy;
+    }
+
+
+    @Override
+    public void performStage( final ExecutionContext executionContext ) {
+        final MvccEntity entity = executionContext.getMessage( MvccEntity.class );
+
+        Preconditions.checkNotNull( entity, "Entity is required in the new stage of the mvcc write" );
+
+        final UUID entityId = entity.getUuid();
+        final UUID version = entity.getVersion();
+
+        Preconditions.checkNotNull( entityId, "Entity id is required in this stage" );
+        Preconditions.checkNotNull( version, "Entity version is required in this stage" );
+
+
+        final CollectionContext collectionContext = executionContext.getCollectionContext();
+
+
+        final MvccLogEntry startEntry = new MvccLogEntryImpl( entityId, version, org.apache.usergrid.persistence
+                .collection.mvcc.entity.Stage.COMMITTED );
+
+        MutationBatch logMutation = logEntrySerializationStrategy.write( collectionContext, startEntry );
+
+        //insert a "cleared" value into the versions.  Post processing should actually delete
+        MutationBatch entityMutation = entitySerializationStrategy.clear( collectionContext, entityId, version );
+
+        //merge the 2 into 1 mutation
+        logMutation.mergeShallow( entityMutation );
+
+
+        try {
+            logMutation.execute();
+        }
+        catch ( ConnectionException e ) {
+            LOG.error( "Failed to execute write asynchronously ", e );
+            throw new CollectionRuntimeException( "Failed to execute write asynchronously ", e );
+        }
+
+        /**
+         * We're done executing.
+         */
+        executionContext.proceed();
+
+        //TODO connect to post processors via listener
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/44072d59/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/delete/DeletePipeline.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/delete/DeletePipeline.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/delete/DeletePipeline.java
new file mode 100644
index 0000000..52fe4b9
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/delete/DeletePipeline.java
@@ -0,0 +1,23 @@
+package org.apache.usergrid.persistence.collection.mvcc.stage.impl.delete;
+
+
+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/44072d59/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/delete/StartDelete.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/delete/StartDelete.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/delete/StartDelete.java
new file mode 100644
index 0000000..4208662
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/delete/StartDelete.java
@@ -0,0 +1,96 @@
+package org.apache.usergrid.persistence.collection.mvcc.stage.impl.delete;
+
+
+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.exception.CollectionRuntimeException;
+import org.apache.usergrid.persistence.collection.mvcc.entity.MvccLogEntry;
+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.ExecutionContext;
+import org.apache.usergrid.persistence.collection.mvcc.stage.ExecutionStage;
+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 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.MutationBatch;
+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 StartDelete implements ExecutionStage {
+
+    private static final Logger LOG = LoggerFactory.getLogger( StartDelete.class );
+
+    private final MvccLogEntrySerializationStrategy logStrategy;
+    private final UUIDService uuidService;
+
+
+    /** Create a new stage with the current context */
+    @Inject
+    public StartDelete( final MvccLogEntrySerializationStrategy logStrategy, final UUIDService uuidService ) {
+
+        Preconditions.checkNotNull( logStrategy, "logStrategy is required" );
+        Preconditions.checkNotNull( uuidService, "uuidService is required" );
+
+
+        this.logStrategy = logStrategy;
+        this.uuidService = uuidService;
+    }
+
+
+    /**
+     * Create the entity Id  and inject it, as well as set the timestamp versions
+     *
+     * @param executionContext The context of the current write operation
+     */
+    @Override
+    public void performStage( final ExecutionContext executionContext ) {
+
+        final UUID entityId = executionContext.getMessage( UUID.class );
+
+
+        final UUID version = uuidService.newTimeUUID();
+
+        Preconditions.checkNotNull( entityId, "Entity id is required in this stage" );
+        Preconditions.checkNotNull( version, "Entity version is required in this stage" );
+
+
+
+        final CollectionContext collectionContext = executionContext.getCollectionContext();
+
+
+        final MvccLogEntry startEntry = new MvccLogEntryImpl( entityId, version, org.apache.usergrid.persistence
+                .collection.mvcc.entity.Stage.ACTIVE );
+
+        MutationBatch write = logStrategy.write( collectionContext, startEntry );
+
+
+        try {
+            write.execute();
+        }
+        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
+        final MvccEntityImpl nextStage = new MvccEntityImpl( entityId, version, Optional.<Entity>absent() );
+
+        executionContext.setMessage( nextStage );
+        executionContext.proceed();
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/44072d59/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/read/Load.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/read/Load.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/read/Load.java
new file mode 100644
index 0000000..00a2d43
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/read/Load.java
@@ -0,0 +1,82 @@
+package org.apache.usergrid.persistence.collection.mvcc.stage.impl.read;
+
+
+import java.util.List;
+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.mvcc.entity.MvccEntity;
+import org.apache.usergrid.persistence.collection.mvcc.stage.ExecutionContext;
+import org.apache.usergrid.persistence.collection.mvcc.stage.ExecutionStage;
+import org.apache.usergrid.persistence.collection.serialization.MvccEntitySerializationStrategy;
+import org.apache.usergrid.persistence.collection.service.UUIDService;
+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;
+
+
+/**
+ * This stage is a load stage to load a single entity
+ */
+public class Load implements ExecutionStage {
+
+
+    private static final Logger LOG = LoggerFactory.getLogger( Load.class );
+
+    private final UUIDService uuidService;
+    private final MvccEntitySerializationStrategy entitySerializationStrategy;
+
+
+    @Inject
+    public Load( final UUIDService uuidService, final MvccEntitySerializationStrategy entitySerializationStrategy ) {
+        Preconditions.checkNotNull( entitySerializationStrategy, "entitySerializationStrategy is required" );
+        Preconditions.checkNotNull( uuidService, "uuidService is required" );
+
+
+        this.uuidService = uuidService;
+        this.entitySerializationStrategy = entitySerializationStrategy;
+    }
+
+
+    @Override
+    public void performStage( final ExecutionContext executionContext ) {
+        final UUID entityId = executionContext.getMessage( UUID.class );
+
+        Preconditions.checkNotNull( entityId, "Entity id required in the read stage" );
+
+
+        final CollectionContext collectionContext = executionContext.getCollectionContext();
+
+        //generate  a version that represents now
+        final UUID versionMax = uuidService.newTimeUUID();
+
+        List<MvccEntity> results = entitySerializationStrategy.load( collectionContext, entityId, versionMax, 1 );
+
+        //nothing to do, we didn't get a result back
+        if(results.size() != 1){
+            executionContext.setMessage( null );
+            executionContext.proceed();
+            return;
+        }
+
+        final Optional<Entity> targetVersion = results.get(0).getEntity();
+
+        //this entity has been marked as cleared.  The version exists, but does not have entity data
+        if(!targetVersion.isPresent()){
+
+            //TODO, a lazy async repair/cleanup here?
+
+            executionContext.setMessage( null );
+            executionContext.proceed();
+            return;
+        }
+
+        executionContext.setMessage( targetVersion.get() );
+        executionContext.proceed();
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/44072d59/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/read/PipelineLoad.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/read/PipelineLoad.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/read/PipelineLoad.java
new file mode 100644
index 0000000..0d24b27
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/read/PipelineLoad.java
@@ -0,0 +1,23 @@
+package org.apache.usergrid.persistence.collection.mvcc.stage.impl.read;
+
+
+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 PipelineLoad {}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/44072d59/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/write/Commit.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/write/Commit.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/write/Commit.java
new file mode 100644
index 0000000..4780ff1
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/write/Commit.java
@@ -0,0 +1,90 @@
+package org.apache.usergrid.persistence.collection.mvcc.stage.impl.write;
+
+
+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.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.impl.MvccLogEntryImpl;
+import org.apache.usergrid.persistence.collection.mvcc.stage.ExecutionStage;
+import org.apache.usergrid.persistence.collection.mvcc.stage.ExecutionContext;
+import org.apache.usergrid.persistence.collection.serialization.MvccEntitySerializationStrategy;
+import org.apache.usergrid.persistence.collection.serialization.MvccLogEntrySerializationStrategy;
+
+import com.google.common.base.Preconditions;
+import com.google.inject.Inject;
+import com.netflix.astyanax.MutationBatch;
+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 ExecutionStage {
+
+
+    private static final Logger LOG = LoggerFactory.getLogger( Commit.class );
+
+    private final MvccLogEntrySerializationStrategy logEntrySerializationStrategy;
+    private final MvccEntitySerializationStrategy entitySerializationStrategy;
+
+
+    @Inject
+    public Commit( final MvccLogEntrySerializationStrategy logEntrySerializationStrategy,
+                   final MvccEntitySerializationStrategy entitySerializationStrategy ) {
+        Preconditions.checkNotNull( logEntrySerializationStrategy, "logEntrySerializationStrategy is required" );
+                      Preconditions.checkNotNull( entitySerializationStrategy, "entitySerializationStrategy is required" );
+
+
+        this.logEntrySerializationStrategy = logEntrySerializationStrategy;
+        this.entitySerializationStrategy = entitySerializationStrategy;
+    }
+
+
+    @Override
+    public void performStage( final ExecutionContext executionContext ) {
+        final MvccEntity entity = executionContext.getMessage( MvccEntity.class );
+
+        Preconditions.checkNotNull( entity, "Entity is required in the new stage of the mvcc write" );
+
+        final UUID entityId = entity.getUuid();
+        final UUID version = entity.getVersion();
+
+        Preconditions.checkNotNull( entityId, "Entity id is required in this stage" );
+        Preconditions.checkNotNull( version, "Entity version is required in this stage" );
+
+
+        final CollectionContext collectionContext = executionContext.getCollectionContext();
+
+
+        final MvccLogEntry startEntry = new MvccLogEntryImpl( entityId, version, org.apache.usergrid.persistence
+                .collection.mvcc.entity.Stage.COMMITTED );
+
+        MutationBatch logMutation = logEntrySerializationStrategy.write( collectionContext, startEntry );
+
+        //now get our actual insert into the entity data
+        MutationBatch entityMutation = entitySerializationStrategy.write( collectionContext, entity );
+
+        //merge the 2 into 1 mutation
+        logMutation.mergeShallow( entityMutation );
+
+
+        try {
+            logMutation.execute();
+        }
+        catch ( ConnectionException e ) {
+            LOG.error( "Failed to execute write asynchronously ", e );
+            throw new CollectionRuntimeException( "Failed to execute write asynchronously ", e );
+        }
+
+        /**
+         * We're done executing.
+         */
+        executionContext.proceed();
+
+        //TODO connect to post processors via listener
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/44072d59/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/write/Create.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/write/Create.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/write/Create.java
new file mode 100644
index 0000000..cbd7d9b
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/write/Create.java
@@ -0,0 +1,85 @@
+package org.apache.usergrid.persistence.collection.mvcc.stage.impl.write;
+
+
+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.exception.CollectionRuntimeException;
+import org.apache.usergrid.persistence.collection.mvcc.stage.ExecutionStage;
+import org.apache.usergrid.persistence.collection.mvcc.stage.ExecutionContext;
+import org.apache.usergrid.persistence.collection.service.TimeService;
+import org.apache.usergrid.persistence.collection.service.UUIDService;
+import org.apache.usergrid.persistence.collection.util.Verify;
+import org.apache.usergrid.persistence.model.entity.Entity;
+
+import com.google.common.base.Preconditions;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+
+/**
+ * This is the first stage and should be invoked immediately when a new entity create is started. No UUIDs should be
+ * present, and this should set the entityId, version, created, and updated dates
+ */
+@Singleton
+public class Create implements ExecutionStage {
+
+    private static final Logger LOG = LoggerFactory.getLogger( Create.class );
+
+
+    private final TimeService timeService;
+    private final UUIDService uuidService;
+
+
+    @Inject
+    public Create( final TimeService timeService, final UUIDService uuidService ) {
+        Preconditions.checkNotNull( timeService, "timeService is required" );
+        Preconditions.checkNotNull( uuidService, "uuidService is required" );
+
+
+        this.timeService = timeService;
+        this.uuidService = uuidService;
+    }
+
+
+    /**
+     * Create the entity Id  and inject it, as well as set the timestamp versions
+     *
+     * @param executionContext The context of the current write operation
+     */
+    @Override
+    public void performStage( final ExecutionContext executionContext ) {
+
+        final Entity entity = executionContext.getMessage( Entity.class );
+
+        Preconditions.checkNotNull( entity, "Entity is required in the new stage of the mvcc write" );
+
+        Verify.isNull( entity.getUuid(), "A new entity should not have an id set.  This is an update operation" );
+
+
+        final UUID entityId = uuidService.newTimeUUID();
+        final UUID version = entityId;
+        final long created = timeService.getTime();
+
+
+        try {
+            FieldUtils.writeDeclaredField( entity, "uuid", entityId, true );
+        }
+        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 );
+
+        //set the updated entity for the next stage
+        executionContext.setMessage( entity );
+        executionContext.proceed();
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/44072d59/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/write/PipelineCreate.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/write/PipelineCreate.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/write/PipelineCreate.java
new file mode 100644
index 0000000..f3af972
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/write/PipelineCreate.java
@@ -0,0 +1,23 @@
+package org.apache.usergrid.persistence.collection.mvcc.stage.impl.write;
+
+
+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 create pipeline
+ *
+ * @author tnine
+ */
+@BindingAnnotation
+@Target({ FIELD, PARAMETER, METHOD })
+@Retention(RUNTIME)
+public @interface PipelineCreate {}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/44072d59/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/write/PipelineUpdate.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/write/PipelineUpdate.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/write/PipelineUpdate.java
new file mode 100644
index 0000000..85bc56d
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/write/PipelineUpdate.java
@@ -0,0 +1,23 @@
+package org.apache.usergrid.persistence.collection.mvcc.stage.impl.write;
+
+
+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 create pipeline
+ *
+ * @author tnine
+ */
+@BindingAnnotation
+@Target( { FIELD, PARAMETER, METHOD } )
+@Retention( RUNTIME )
+public @interface PipelineUpdate {}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/44072d59/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/write/StartWrite.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/write/StartWrite.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/write/StartWrite.java
new file mode 100644
index 0000000..d6e7d49
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/write/StartWrite.java
@@ -0,0 +1,92 @@
+package org.apache.usergrid.persistence.collection.mvcc.stage.impl.write;
+
+
+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.exception.CollectionRuntimeException;
+import org.apache.usergrid.persistence.collection.mvcc.entity.MvccLogEntry;
+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.ExecutionContext;
+import org.apache.usergrid.persistence.collection.mvcc.stage.ExecutionStage;
+import org.apache.usergrid.persistence.collection.serialization.MvccLogEntrySerializationStrategy;
+import org.apache.usergrid.persistence.model.entity.Entity;
+
+import com.google.common.base.Preconditions;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import com.netflix.astyanax.MutationBatch;
+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 StartWrite implements ExecutionStage {
+
+    private static final Logger LOG = LoggerFactory.getLogger( StartWrite.class );
+
+    private final MvccLogEntrySerializationStrategy logStrategy;
+
+
+    /** Create a new stage with the current context */
+    @Inject
+    public StartWrite( final MvccLogEntrySerializationStrategy logStrategy ) {
+        Preconditions.checkNotNull( logStrategy, "logStrategy is required" );
+
+
+        this.logStrategy = logStrategy;
+    }
+
+
+    /**
+     * Create the entity Id  and inject it, as well as set the timestamp versions
+     *
+     * @param executionContext The context of the current write operation
+     */
+    @Override
+    public void performStage( final ExecutionContext executionContext ) {
+
+        final Entity entity = executionContext.getMessage( Entity.class );
+
+        Preconditions.checkNotNull( entity, "Entity is required in the new stage of the mvcc write" );
+
+        final UUID entityId = entity.getUuid();
+        final UUID version = entity.getVersion();
+
+        Preconditions.checkNotNull( entityId, "Entity id is required in this stage" );
+        Preconditions.checkNotNull( version, "Entity version is required in this stage" );
+
+
+
+        final CollectionContext collectionContext = executionContext.getCollectionContext();
+
+
+        final MvccLogEntry startEntry = new MvccLogEntryImpl( entityId, version, org.apache.usergrid.persistence
+                .collection.mvcc.entity.Stage.ACTIVE );
+
+        MutationBatch write = logStrategy.write( collectionContext, startEntry );
+
+
+        try {
+            write.execute();
+        }
+        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
+        final MvccEntityImpl nextStage = new MvccEntityImpl( entityId, version, entity );
+
+        executionContext.setMessage( nextStage );
+        executionContext.proceed();
+    }
+}


[4/6] git commit: Working deletes. Need to add more test cases

Posted by to...@apache.org.
Working deletes.  Need to add more test cases


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

Branch: refs/heads/two-dot-o
Commit: 43aba652475ea989071664017f2de8ffd872b5aa
Parents: 0e0c8ff
Author: Todd Nine <to...@apache.org>
Authored: Wed Dec 4 16:45:19 2013 -0700
Committer: Todd Nine <to...@apache.org>
Committed: Wed Dec 4 17:16:37 2013 -0700

----------------------------------------------------------------------
 .../collection/impl/CollectionManagerImpl.java  |  42 ++--
 .../collection/mvcc/stage/ExecutionContext.java |  50 +++++
 .../collection/mvcc/stage/Stage.java            |  15 ++
 .../collection/mvcc/stage/StagePipeline.java    |  15 +-
 .../collection/mvcc/stage/WriteContext.java     |  50 -----
 .../collection/mvcc/stage/WriteStage.java       |  26 ---
 .../collection/mvcc/stage/impl/Clear.java       |  18 +-
 .../stage/impl/CollectionPipelineModule.java    |  32 ++-
 .../collection/mvcc/stage/impl/Commit.java      |  18 +-
 .../collection/mvcc/stage/impl/Create.java      |  16 +-
 .../mvcc/stage/impl/ExecutionContextImpl.java   |  92 ++++++++
 .../collection/mvcc/stage/impl/Load.java        |  82 +++++++
 .../mvcc/stage/impl/LoadPipeline.java           |  23 ++
 .../mvcc/stage/impl/StagePipelineImpl.java      |  36 +--
 .../collection/mvcc/stage/impl/Start.java       |  92 --------
 .../collection/mvcc/stage/impl/StartDelete.java |  97 +++++++++
 .../collection/mvcc/stage/impl/StartWrite.java  |  92 ++++++++
 .../collection/mvcc/stage/impl/Update.java      |  16 +-
 .../collection/mvcc/stage/impl/Verify.java      |  10 +-
 .../mvcc/stage/impl/WriteContextCallback.java   |   8 +-
 .../mvcc/stage/impl/WriteContextImpl.java       |  93 --------
 .../collection/CollectionManagerIT.java         | 104 ++++++++-
 .../collection/CollectionManagerTest.java       |  15 +-
 .../mvcc/stage/ExecutionContextTest.java        | 217 +++++++++++++++++++
 .../mvcc/stage/StagePipelineTest.java           |  89 ++++++++
 .../collection/mvcc/stage/WriteContextTest.java | 217 -------------------
 .../collection/mvcc/stage/impl/CreateTest.java  |  26 +--
 .../collection/mvcc/stage/impl/StartTest.java   | 187 ----------------
 .../mvcc/stage/impl/StartWriteTest.java         | 187 ++++++++++++++++
 .../persistence/index/stage/Complete.java       |   8 +-
 .../usergrid/persistence/index/stage/Start.java |   8 +-
 .../usergrid/persistence/index/stage/Write.java |   8 +-
 stack/corepersistence/perftest/Readme.md        |   4 +-
 33 files changed, 1191 insertions(+), 802 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/43aba652/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
index ae16b3a..c20d2c3 100644
--- 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
@@ -8,12 +8,14 @@ import org.slf4j.LoggerFactory;
 
 import org.apache.usergrid.persistence.collection.CollectionContext;
 import org.apache.usergrid.persistence.collection.CollectionManager;
+import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntity;
+import org.apache.usergrid.persistence.collection.mvcc.stage.ExecutionContext;
 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.impl.CreatePipeline;
 import org.apache.usergrid.persistence.collection.mvcc.stage.impl.DeletePipeline;
+import org.apache.usergrid.persistence.collection.mvcc.stage.impl.ExecutionContextImpl;
+import org.apache.usergrid.persistence.collection.mvcc.stage.impl.LoadPipeline;
 import org.apache.usergrid.persistence.collection.mvcc.stage.impl.UpdatePipeline;
-import org.apache.usergrid.persistence.collection.mvcc.stage.impl.WriteContextImpl;
 import org.apache.usergrid.persistence.model.entity.Entity;
 
 import com.google.inject.Inject;
@@ -33,55 +35,67 @@ public class CollectionManagerImpl implements CollectionManager {
     private final StagePipeline createPipeline;
     private final StagePipeline updatePipeline;
     private final StagePipeline deletePipeline;
+    private final StagePipeline loadPipeline;
 
 
     @Inject
     public CollectionManagerImpl( @CreatePipeline final StagePipeline createPipeline,
                                   @UpdatePipeline final StagePipeline updatePipeline,
                                   @DeletePipeline final StagePipeline deletePipeline,
-                                  @Assisted final CollectionContext context) {
-        this.context = context;
+                                  @LoadPipeline final StagePipeline loadPipeline,
+                                  @Assisted final CollectionContext context ) {
+
         this.createPipeline = createPipeline;
         this.updatePipeline = updatePipeline;
         this.deletePipeline = deletePipeline;
+        this.loadPipeline = loadPipeline;
+        this.context = context;
     }
 
 
     @Override
     public Entity create( final Entity entity ) {
         // Create a new context for the write
-        WriteContext writeContext = new WriteContextImpl( createPipeline, context );
+        ExecutionContext executionContext = new ExecutionContextImpl( createPipeline, context );
 
         //perform the write
-        writeContext.performWrite( entity );
+        executionContext.execute( entity );
 
-        return writeContext.getMessage( Entity.class );
+        MvccEntity result = executionContext.getMessage( MvccEntity.class );
+
+        return result.getEntity().get();
     }
 
 
     @Override
     public Entity update( final Entity entity ) {
         // Create a new context for the write
-        WriteContext writeContext = new WriteContextImpl( updatePipeline, context );
+        ExecutionContext executionContext = new ExecutionContextImpl( updatePipeline, context );
 
         //perform the write
-        writeContext.performWrite( entity );
+        executionContext.execute( entity );
+
+        MvccEntity result = executionContext.getMessage( MvccEntity.class );
 
-        return writeContext.getMessage( Entity.class );
+         return result.getEntity().get();
     }
 
 
     @Override
     public void delete( final UUID entityId ) {
-        WriteContext deleteContext =  new WriteContextImpl( deletePipeline, context );
-
-        deleteContext.performWrite( entityId );
+        ExecutionContext deleteContext = new ExecutionContextImpl( deletePipeline, context );
 
+        deleteContext.execute( entityId );
     }
 
 
     @Override
     public Entity load( final UUID entityId ) {
-        return null;  //To change body of implemented methods use File | Settings | File Templates.
+        ExecutionContext loadContext = new ExecutionContextImpl( loadPipeline, context );
+
+        loadContext.execute( entityId );
+
+        return loadContext.getMessage( Entity.class );
+
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/43aba652/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/ExecutionContext.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/ExecutionContext.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/ExecutionContext.java
new file mode 100644
index 0000000..f124dcf
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/ExecutionContext.java
@@ -0,0 +1,50 @@
+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 */
+public interface ExecutionContext {
+
+    /**
+     * Perform the write in the context with the specified entity
+     * @param inputData The data to use to being the write
+     */
+    void execute( 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();
+
+
+
+    /**
+     * Return the current collection context
+     * @return
+     */
+    CollectionContext getCollectionContext();
+
+
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/43aba652/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/Stage.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/Stage.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/Stage.java
new file mode 100644
index 0000000..538a546
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/Stage.java
@@ -0,0 +1,15 @@
+package org.apache.usergrid.persistence.collection.mvcc.stage;
+
+
+/** The possible stages in our write flow. */
+public interface Stage {
+
+    /**
+     * 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
+     *
+     * @return The asynchronous listener to signal success
+     */
+    public void performStage( ExecutionContext context );
+}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/43aba652/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 7bf31ea..0b032d9 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,23 +11,18 @@ public interface StagePipeline {
 
 
     /**
-     * Get the first stage in this pipeline.  Will return null if there are no more stages to execute
+     * Get the first stage in this pipeline.
      */
-    WriteStage first();
+    Stage first();
 
 
     /**
-     * get the next stage after this one
-     * @param stage
+     * get the next stage after the stage specified
+     * @param stage The stage to seek in our pipeline
      */
-    WriteStage nextStage(WriteStage stage);
+    Stage nextStage(Stage stage);
 
 
-    /**
-     * Get the current stage in the pipeline
-     * @return
-     */
-    WriteStage current();
 
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/43aba652/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
deleted file mode 100644
index 98e0742..0000000
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/WriteContext.java
+++ /dev/null
@@ -1,50 +0,0 @@
-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 */
-public interface WriteContext {
-
-    /**
-     * Perform the write in the context with the specified 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();
-
-
-
-    /**
-     * Return the current collection context
-     * @return
-     */
-    CollectionContext getCollectionContext();
-
-
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/43aba652/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
deleted file mode 100644
index 3f80348..0000000
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/WriteStage.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package org.apache.usergrid.persistence.collection.mvcc.stage;
-
-
-import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntity;
-
-import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
-
-
-/**
- * The possible stages in our write flow.
- */
-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
-     *
-     * @return The asynchronous listener to signal success
-     *
-     */
-    public void performStage( WriteContext context);
-
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/43aba652/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Clear.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Clear.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Clear.java
index 57a5e41..854ec24 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Clear.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Clear.java
@@ -10,10 +10,9 @@ import org.apache.usergrid.persistence.collection.CollectionContext;
 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.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.mvcc.stage.Stage;
+import org.apache.usergrid.persistence.collection.mvcc.stage.ExecutionContext;
 import org.apache.usergrid.persistence.collection.serialization.MvccEntitySerializationStrategy;
 import org.apache.usergrid.persistence.collection.serialization.MvccLogEntrySerializationStrategy;
 
@@ -24,7 +23,7 @@ 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 Clear implements WriteStage {
+public class Clear implements Stage {
 
 
     private static final Logger LOG = LoggerFactory.getLogger( Clear.class );
@@ -47,8 +46,8 @@ public class Clear implements WriteStage {
 
 
     @Override
-    public void performStage( final WriteContext writeContext ) {
-        final MvccEntity entity = writeContext.getMessage( MvccEntity.class );
+    public void performStage( final ExecutionContext executionContext ) {
+        final MvccEntity entity = executionContext.getMessage( MvccEntity.class );
 
         Preconditions.checkNotNull( entity, "Entity is required in the new stage of the mvcc write" );
 
@@ -59,10 +58,11 @@ public class Clear implements WriteStage {
         Preconditions.checkNotNull( version, "Entity version is required in this stage" );
 
 
-        final CollectionContext collectionContext = writeContext.getCollectionContext();
+        final CollectionContext collectionContext = executionContext.getCollectionContext();
 
 
-        final MvccLogEntry startEntry = new MvccLogEntryImpl( entityId, version, Stage.COMMITTED );
+        final MvccLogEntry startEntry = new MvccLogEntryImpl( entityId, version, org.apache.usergrid.persistence
+                .collection.mvcc.entity.Stage.COMMITTED );
 
         MutationBatch logMutation = logEntrySerializationStrategy.write( collectionContext, startEntry );
 
@@ -84,7 +84,7 @@ public class Clear implements WriteStage {
         /**
          * We're done executing.
          */
-        writeContext.proceed();
+        executionContext.proceed();
 
         //TODO connect to post processors via listener
     }

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/43aba652/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 2bd4596..8390e7b 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,8 +1,8 @@
 package org.apache.usergrid.persistence.collection.mvcc.stage.impl;
 
 
+import org.apache.usergrid.persistence.collection.mvcc.stage.Stage;
 import org.apache.usergrid.persistence.collection.mvcc.stage.StagePipeline;
-import org.apache.usergrid.persistence.collection.mvcc.stage.WriteStage;
 
 import com.google.inject.AbstractModule;
 import com.google.inject.Inject;
@@ -27,9 +27,9 @@ public class CollectionPipelineModule extends AbstractModule {
     @CreatePipeline
     @Inject
     @Singleton
-    public StagePipeline createPipeline( final Create create, final Start start, final Verify write,
+    public StagePipeline createPipeline( final Create create, final StartWrite startWrite, final Verify write,
                                          final Commit commit ) {
-        return StagePipelineImpl.fromStages( create, start, write, commit );
+        return StagePipelineImpl.fromStages( create, startWrite, write, commit );
     }
 
 
@@ -37,9 +37,9 @@ public class CollectionPipelineModule extends AbstractModule {
     @UpdatePipeline
     @Inject
     @Singleton
-    public StagePipeline updatePipeline( final Update update, final Start start, final Verify write,
+    public StagePipeline updatePipeline( final Update update, final StartWrite startWrite, final Verify write,
                                          final Commit commit ) {
-        return StagePipelineImpl.fromStages( update, start, write, commit );
+        return StagePipelineImpl.fromStages( update, startWrite, write, commit );
     }
 
 
@@ -47,8 +47,17 @@ public class CollectionPipelineModule extends AbstractModule {
     @DeletePipeline
     @Inject
     @Singleton
-    public StagePipeline deletePipeline( final Update update, final Start start, final Clear delete ) {
-        return StagePipelineImpl.fromStages( update, start, delete );
+    public StagePipeline deletePipeline(final StartDelete startDelete,  final Clear delete ) {
+        return StagePipelineImpl.fromStages(startDelete, delete );
+    }
+
+
+    @Provides
+    @LoadPipeline
+    @Inject
+    @Singleton
+    public StagePipeline deletePipeline( final Load load ) {
+        return StagePipelineImpl.fromStages( load );
     }
 
 
@@ -58,16 +67,19 @@ public class CollectionPipelineModule extends AbstractModule {
         /**
          * Configure all stages here
          */
-        Multibinder<WriteStage> stageBinder = Multibinder.newSetBinder( binder(), WriteStage.class );
+        Multibinder<Stage> stageBinder = Multibinder.newSetBinder( binder(), Stage.class );
 
 
+
+        //creation stages
         stageBinder.addBinding().to( Create.class );
         stageBinder.addBinding().to( Update.class );
-        stageBinder.addBinding().to( Start.class );
+        stageBinder.addBinding().to( StartWrite.class );
         stageBinder.addBinding().to( Verify.class );
         stageBinder.addBinding().to( Commit.class );
         stageBinder.addBinding().to( Clear.class );
 
-
+        //loading stages
+        stageBinder.addBinding().to(Load.class);
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/43aba652/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
index a2d7606..f29bf93 100644
--- 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
@@ -10,10 +10,9 @@ import org.apache.usergrid.persistence.collection.CollectionContext;
 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.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.mvcc.stage.Stage;
+import org.apache.usergrid.persistence.collection.mvcc.stage.ExecutionContext;
 import org.apache.usergrid.persistence.collection.serialization.MvccEntitySerializationStrategy;
 import org.apache.usergrid.persistence.collection.serialization.MvccLogEntrySerializationStrategy;
 
@@ -24,7 +23,7 @@ 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 class Commit implements Stage {
 
 
     private static final Logger LOG = LoggerFactory.getLogger( Commit.class );
@@ -46,8 +45,8 @@ public class Commit implements WriteStage {
 
 
     @Override
-    public void performStage( final WriteContext writeContext ) {
-        final MvccEntity entity = writeContext.getMessage( MvccEntity.class );
+    public void performStage( final ExecutionContext executionContext ) {
+        final MvccEntity entity = executionContext.getMessage( MvccEntity.class );
 
         Preconditions.checkNotNull( entity, "Entity is required in the new stage of the mvcc write" );
 
@@ -58,10 +57,11 @@ public class Commit implements WriteStage {
         Preconditions.checkNotNull( version, "Entity version is required in this stage" );
 
 
-        final CollectionContext collectionContext = writeContext.getCollectionContext();
+        final CollectionContext collectionContext = executionContext.getCollectionContext();
 
 
-        final MvccLogEntry startEntry = new MvccLogEntryImpl( entityId, version, Stage.COMMITTED );
+        final MvccLogEntry startEntry = new MvccLogEntryImpl( entityId, version, org.apache.usergrid.persistence
+                .collection.mvcc.entity.Stage.COMMITTED );
 
         MutationBatch logMutation = logEntrySerializationStrategy.write( collectionContext, startEntry );
 
@@ -83,7 +83,7 @@ public class Commit implements WriteStage {
         /**
          * We're done executing.
          */
-        writeContext.proceed();
+        executionContext.proceed();
 
         //TODO connect to post processors via listener
     }

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/43aba652/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Create.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Create.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Create.java
index c096748..2026274 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Create.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Create.java
@@ -9,8 +9,8 @@ import org.slf4j.LoggerFactory;
 import org.apache.commons.lang3.reflect.FieldUtils;
 
 import org.apache.usergrid.persistence.collection.exception.CollectionRuntimeException;
-import org.apache.usergrid.persistence.collection.mvcc.stage.WriteContext;
-import org.apache.usergrid.persistence.collection.mvcc.stage.WriteStage;
+import org.apache.usergrid.persistence.collection.mvcc.stage.Stage;
+import org.apache.usergrid.persistence.collection.mvcc.stage.ExecutionContext;
 import org.apache.usergrid.persistence.collection.service.TimeService;
 import org.apache.usergrid.persistence.collection.service.UUIDService;
 import org.apache.usergrid.persistence.collection.util.Verify;
@@ -26,7 +26,7 @@ import com.google.inject.Singleton;
  * present, and this should set the entityId, version, created, and updated dates
  */
 @Singleton
-public class Create implements WriteStage {
+public class Create implements Stage {
 
     private static final Logger LOG = LoggerFactory.getLogger( Create.class );
 
@@ -49,12 +49,12 @@ public class Create implements WriteStage {
     /**
      * Create the entity Id  and inject it, as well as set the timestamp versions
      *
-     * @param writeContext The context of the current write operation
+     * @param executionContext The context of the current write operation
      */
     @Override
-    public void performStage( final WriteContext writeContext ) {
+    public void performStage( final ExecutionContext executionContext ) {
 
-        final Entity entity = writeContext.getMessage( Entity.class );
+        final Entity entity = executionContext.getMessage( Entity.class );
 
         Preconditions.checkNotNull( entity, "Entity is required in the new stage of the mvcc write" );
 
@@ -79,7 +79,7 @@ public class Create implements WriteStage {
         entity.setUpdated( created );
 
         //set the updated entity for the next stage
-        writeContext.setMessage( entity );
-        writeContext.proceed();
+        executionContext.setMessage( entity );
+        executionContext.proceed();
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/43aba652/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/ExecutionContextImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/ExecutionContextImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/ExecutionContextImpl.java
new file mode 100644
index 0000000..8139f3d
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/ExecutionContextImpl.java
@@ -0,0 +1,92 @@
+package org.apache.usergrid.persistence.collection.mvcc.stage.impl;
+
+
+import org.apache.usergrid.persistence.collection.CollectionContext;
+import org.apache.usergrid.persistence.collection.mvcc.stage.ExecutionContext;
+import org.apache.usergrid.persistence.collection.mvcc.stage.Stage;
+import org.apache.usergrid.persistence.collection.mvcc.stage.StagePipeline;
+
+import com.google.common.base.Preconditions;
+import com.google.inject.Inject;
+
+
+/** @author tnine */
+public class ExecutionContextImpl implements ExecutionContext {
+
+    private final StagePipeline pipeline;
+    private final CollectionContext context;
+
+    private Object message;
+    private Stage current;
+
+
+    @Inject
+    public ExecutionContextImpl( final StagePipeline pipeline, final CollectionContext context ) {
+        Preconditions.checkNotNull( pipeline, "pipeline cannot be null" );
+        Preconditions.checkNotNull( context, "context cannot be null" );
+
+        this.pipeline = pipeline;
+        this.context = context;
+    }
+
+
+    @Override
+    public void execute( Object input ) {
+
+        current = this.pipeline.first();
+
+        setMessage( input );
+
+        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() {
+        Stage next = this.pipeline.nextStage( current );
+
+        //Nothing to do
+        if ( next == null ) {
+            return;
+        }
+
+        current = next;
+        current.performStage( this );
+    }
+
+
+
+    @Override
+    public CollectionContext getCollectionContext() {
+        return this.context;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/43aba652/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Load.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Load.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Load.java
new file mode 100644
index 0000000..b0ac251
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Load.java
@@ -0,0 +1,82 @@
+package org.apache.usergrid.persistence.collection.mvcc.stage.impl;
+
+
+import java.util.List;
+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.mvcc.entity.MvccEntity;
+import org.apache.usergrid.persistence.collection.mvcc.stage.ExecutionContext;
+import org.apache.usergrid.persistence.collection.mvcc.stage.Stage;
+import org.apache.usergrid.persistence.collection.serialization.MvccEntitySerializationStrategy;
+import org.apache.usergrid.persistence.collection.service.UUIDService;
+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;
+
+
+/**
+ * This stage is a load stage to load a single entity
+ */
+public class Load implements Stage {
+
+
+    private static final Logger LOG = LoggerFactory.getLogger( Load.class );
+
+    private final UUIDService uuidService;
+    private final MvccEntitySerializationStrategy entitySerializationStrategy;
+
+
+    @Inject
+    public Load( final UUIDService uuidService, final MvccEntitySerializationStrategy entitySerializationStrategy ) {
+        Preconditions.checkNotNull( entitySerializationStrategy, "entitySerializationStrategy is required" );
+        Preconditions.checkNotNull( uuidService, "uuidService is required" );
+
+
+        this.uuidService = uuidService;
+        this.entitySerializationStrategy = entitySerializationStrategy;
+    }
+
+
+    @Override
+    public void performStage( final ExecutionContext executionContext ) {
+        final UUID entityId = executionContext.getMessage( UUID.class );
+
+        Preconditions.checkNotNull( entityId, "Entity id required in the read stage" );
+
+
+        final CollectionContext collectionContext = executionContext.getCollectionContext();
+
+        //generate  a version that represents now
+        final UUID versionMax = uuidService.newTimeUUID();
+
+        List<MvccEntity> results = entitySerializationStrategy.load( collectionContext, entityId, versionMax, 1 );
+
+        //nothing to do, we didn't get a result back
+        if(results.size() != 1){
+            executionContext.setMessage( null );
+            executionContext.proceed();
+            return;
+        }
+
+        final Optional<Entity> targetVersion = results.get(0).getEntity();
+
+        //this entity has been marked as cleared.  The version exists, but does not have entity data
+        if(!targetVersion.isPresent()){
+
+            //TODO, a lazy async repair/cleanup here?
+
+            executionContext.setMessage( null );
+            executionContext.proceed();
+            return;
+        }
+
+        executionContext.setMessage( targetVersion.get() );
+        executionContext.proceed();
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/43aba652/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/LoadPipeline.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/LoadPipeline.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/LoadPipeline.java
new file mode 100644
index 0000000..f712b2c
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/LoadPipeline.java
@@ -0,0 +1,23 @@
+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 LoadPipeline {}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/43aba652/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 271e5e5..74dc003 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
@@ -4,24 +4,28 @@ package org.apache.usergrid.persistence.collection.mvcc.stage.impl;
 import java.util.Arrays;
 import java.util.List;
 
+import org.apache.usergrid.persistence.collection.mvcc.stage.Stage;
 import org.apache.usergrid.persistence.collection.mvcc.stage.StagePipeline;
-import org.apache.usergrid.persistence.collection.mvcc.stage.WriteStage;
+
+import com.google.common.base.Preconditions;
 
 
 /** @author tnine */
 public class StagePipelineImpl implements StagePipeline {
 
-    private final List<WriteStage> stages;
-    private WriteStage current;
+    private final List<Stage> stages;
+
 
+    protected StagePipelineImpl( List<Stage> stages ) {
+        Preconditions.checkNotNull(stages, "stages is required");
+        Preconditions.checkArgument(  stages.size() > 0, "stages must have more than 1 element" );
 
-    protected StagePipelineImpl( WriteStage[] stages ) {
-        this.stages = Arrays.asList( stages );
+        this.stages = stages;
     }
 
 
     @Override
-    public WriteStage first() {
+    public Stage first() {
 
         if ( stages.size() == 0 ) {
             return null;
@@ -31,29 +35,27 @@ public class StagePipelineImpl implements StagePipeline {
     }
 
 
-    @Override
-    public WriteStage current() {
-        return current;
-    }
+
 
 
     @Override
-    public WriteStage nextStage( final WriteStage stage ) {
+    public Stage nextStage( final Stage stage ) {
+
+        Preconditions.checkNotNull( stage, "Stage cannot be null" );
+
         int index = stages.indexOf( stage );
 
         //we're done, do nothing
-        if ( index == stages.size() ) {
+        if ( index == stages.size() -1  ) {
             return null;
         }
 
-        current = stages.get( index + 1 );
-
-        return current;
+        return  stages.get( index + 1 );
     }
 
 
     /** Factory to create a new instance. */
-    public static StagePipelineImpl fromStages( WriteStage... stages ) {
-        return new StagePipelineImpl( stages );
+    public static StagePipelineImpl fromStages( Stage... stages ) {
+        return new StagePipelineImpl(Arrays.asList(  stages ));
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/43aba652/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 bf58e06..0000000
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Start.java
+++ /dev/null
@@ -1,92 +0,0 @@
-package org.apache.usergrid.persistence.collection.mvcc.stage.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.exception.CollectionRuntimeException;
-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.model.entity.Entity;
-
-import com.google.common.base.Preconditions;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import com.netflix.astyanax.MutationBatch;
-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 */
-    @Inject
-    public Start( final MvccLogEntrySerializationStrategy logStrategy ) {
-        Preconditions.checkNotNull( logStrategy, "logStrategy is required" );
-
-
-        this.logStrategy = logStrategy;
-    }
-
-
-    /**
-     * 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 = entity.getUuid();
-        final UUID version = entity.getVersion();
-
-        Preconditions.checkNotNull( entityId, "Entity id is required in this stage" );
-        Preconditions.checkNotNull( version, "Entity version is required in this stage" );
-
-
-
-        final CollectionContext collectionContext = writeContext.getCollectionContext();
-
-
-        final MvccLogEntry startEntry = new MvccLogEntryImpl( entityId, version, Stage.ACTIVE );
-
-        MutationBatch write = logStrategy.write( collectionContext, startEntry );
-
-
-        try {
-            write.execute();
-        }
-        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
-        final MvccEntityImpl nextStage = new MvccEntityImpl( entityId, version, entity );
-
-        writeContext.setMessage( nextStage );
-        writeContext.proceed();
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/43aba652/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/StartDelete.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/StartDelete.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/StartDelete.java
new file mode 100644
index 0000000..383ee9e
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/StartDelete.java
@@ -0,0 +1,97 @@
+package org.apache.usergrid.persistence.collection.mvcc.stage.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.exception.CollectionRuntimeException;
+import org.apache.usergrid.persistence.collection.mvcc.entity.MvccLogEntry;
+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.ExecutionContext;
+import org.apache.usergrid.persistence.collection.mvcc.stage.Stage;
+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.Optional;
+import com.google.common.base.Preconditions;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import com.netflix.astyanax.MutationBatch;
+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 StartDelete implements Stage {
+
+    private static final Logger LOG = LoggerFactory.getLogger( StartDelete.class );
+
+    private final MvccLogEntrySerializationStrategy logStrategy;
+    private final UUIDService uuidService;
+
+
+    /** Create a new stage with the current context */
+    @Inject
+    public StartDelete( final MvccLogEntrySerializationStrategy logStrategy, final UUIDService uuidService ) {
+
+        Preconditions.checkNotNull( logStrategy, "logStrategy is required" );
+        Preconditions.checkNotNull( uuidService, "uuidService is required" );
+
+
+        this.logStrategy = logStrategy;
+        this.uuidService = uuidService;
+    }
+
+
+    /**
+     * Create the entity Id  and inject it, as well as set the timestamp versions
+     *
+     * @param executionContext The context of the current write operation
+     */
+    @Override
+    public void performStage( final ExecutionContext executionContext ) {
+
+        final UUID entityId = executionContext.getMessage( UUID.class );
+
+
+        final UUID version = uuidService.newTimeUUID();
+
+        Preconditions.checkNotNull( entityId, "Entity id is required in this stage" );
+        Preconditions.checkNotNull( version, "Entity version is required in this stage" );
+
+
+
+        final CollectionContext collectionContext = executionContext.getCollectionContext();
+
+
+        final MvccLogEntry startEntry = new MvccLogEntryImpl( entityId, version, org.apache.usergrid.persistence
+                .collection.mvcc.entity.Stage.ACTIVE );
+
+        MutationBatch write = logStrategy.write( collectionContext, startEntry );
+
+
+        try {
+            write.execute();
+        }
+        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
+        final MvccEntityImpl nextStage = new MvccEntityImpl( entityId, version, Optional.<Entity>absent() );
+
+        executionContext.setMessage( nextStage );
+        executionContext.proceed();
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/43aba652/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/StartWrite.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/StartWrite.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/StartWrite.java
new file mode 100644
index 0000000..4c55ae6
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/StartWrite.java
@@ -0,0 +1,92 @@
+package org.apache.usergrid.persistence.collection.mvcc.stage.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.exception.CollectionRuntimeException;
+import org.apache.usergrid.persistence.collection.mvcc.entity.MvccLogEntry;
+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.ExecutionContext;
+import org.apache.usergrid.persistence.collection.mvcc.stage.Stage;
+import org.apache.usergrid.persistence.collection.serialization.MvccLogEntrySerializationStrategy;
+import org.apache.usergrid.persistence.model.entity.Entity;
+
+import com.google.common.base.Preconditions;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import com.netflix.astyanax.MutationBatch;
+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 StartWrite implements Stage {
+
+    private static final Logger LOG = LoggerFactory.getLogger( StartWrite.class );
+
+    private final MvccLogEntrySerializationStrategy logStrategy;
+
+
+    /** Create a new stage with the current context */
+    @Inject
+    public StartWrite( final MvccLogEntrySerializationStrategy logStrategy ) {
+        Preconditions.checkNotNull( logStrategy, "logStrategy is required" );
+
+
+        this.logStrategy = logStrategy;
+    }
+
+
+    /**
+     * Create the entity Id  and inject it, as well as set the timestamp versions
+     *
+     * @param executionContext The context of the current write operation
+     */
+    @Override
+    public void performStage( final ExecutionContext executionContext ) {
+
+        final Entity entity = executionContext.getMessage( Entity.class );
+
+        Preconditions.checkNotNull( entity, "Entity is required in the new stage of the mvcc write" );
+
+        final UUID entityId = entity.getUuid();
+        final UUID version = entity.getVersion();
+
+        Preconditions.checkNotNull( entityId, "Entity id is required in this stage" );
+        Preconditions.checkNotNull( version, "Entity version is required in this stage" );
+
+
+
+        final CollectionContext collectionContext = executionContext.getCollectionContext();
+
+
+        final MvccLogEntry startEntry = new MvccLogEntryImpl( entityId, version, org.apache.usergrid.persistence
+                .collection.mvcc.entity.Stage.ACTIVE );
+
+        MutationBatch write = logStrategy.write( collectionContext, startEntry );
+
+
+        try {
+            write.execute();
+        }
+        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
+        final MvccEntityImpl nextStage = new MvccEntityImpl( entityId, version, entity );
+
+        executionContext.setMessage( nextStage );
+        executionContext.proceed();
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/43aba652/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Update.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Update.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Update.java
index 00764de..ce1be76 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Update.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Update.java
@@ -6,8 +6,8 @@ import java.util.UUID;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.usergrid.persistence.collection.mvcc.stage.WriteContext;
-import org.apache.usergrid.persistence.collection.mvcc.stage.WriteStage;
+import org.apache.usergrid.persistence.collection.mvcc.stage.ExecutionContext;
+import org.apache.usergrid.persistence.collection.mvcc.stage.Stage;
 import org.apache.usergrid.persistence.collection.service.TimeService;
 import org.apache.usergrid.persistence.collection.service.UUIDService;
 import org.apache.usergrid.persistence.model.entity.Entity;
@@ -22,7 +22,7 @@ import com.google.inject.Singleton;
  * been set correctly
  */
 @Singleton
-public class Update implements WriteStage {
+public class Update implements Stage {
 
     private static final Logger LOG = LoggerFactory.getLogger( Update.class );
 
@@ -43,12 +43,12 @@ public class Update implements WriteStage {
     /**
      * Create the entity Id  and inject it, as well as set the timestamp versions
      *
-     * @param writeContext The context of the current write operation
+     * @param executionContext The context of the current write operation
      */
     @Override
-    public void performStage( final WriteContext writeContext ) {
+    public void performStage( final ExecutionContext executionContext ) {
 
-        final Entity entity = writeContext.getMessage( Entity.class );
+        final Entity entity = executionContext.getMessage( Entity.class );
 
         Preconditions.checkNotNull( entity, "Entity is required in the new stage of the mvcc write" );
 
@@ -60,7 +60,7 @@ public class Update implements WriteStage {
         entity.setVersion( version );
         entity.setUpdated( updated );
 
-        writeContext.setMessage( entity );
-        writeContext.proceed();
+        executionContext.setMessage( entity );
+        executionContext.proceed();
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/43aba652/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Verify.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Verify.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Verify.java
index 7933266..cc53000 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Verify.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Verify.java
@@ -1,15 +1,15 @@
 package org.apache.usergrid.persistence.collection.mvcc.stage.impl;
 
 
-import org.apache.usergrid.persistence.collection.mvcc.stage.WriteContext;
-import org.apache.usergrid.persistence.collection.mvcc.stage.WriteStage;
+import org.apache.usergrid.persistence.collection.mvcc.stage.Stage;
+import org.apache.usergrid.persistence.collection.mvcc.stage.ExecutionContext;
 
 import com.google.inject.Singleton;
 
 
 /** This phase should execute any verification on the MvccEntity */
 @Singleton
-public class Verify implements WriteStage {
+public class Verify implements Stage {
 
 
     public Verify() {
@@ -17,9 +17,9 @@ public class Verify implements WriteStage {
 
 
     @Override
-    public void performStage( final WriteContext writeContext ) {
+    public void performStage( final ExecutionContext executionContext ) {
         //TODO no op for now, just continue to the next stage.  Verification logic goes in here
 
-        writeContext.proceed();
+        executionContext.proceed();
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/43aba652/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 65e5ba3..2a34e95 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
@@ -2,7 +2,7 @@ package org.apache.usergrid.persistence.collection.mvcc.stage.impl;
 
 
 import org.apache.usergrid.persistence.collection.exception.CollectionRuntimeException;
-import org.apache.usergrid.persistence.collection.mvcc.stage.WriteContext;
+import org.apache.usergrid.persistence.collection.mvcc.stage.ExecutionContext;
 
 import com.google.common.util.concurrent.FutureCallback;
 import com.google.common.util.concurrent.Futures;
@@ -18,11 +18,11 @@ import com.netflix.astyanax.connectionpool.OperationResult;
  */
 public class WriteContextCallback implements FutureCallback<OperationResult<Void>> {
 
-    private final WriteContext context;
+    private final ExecutionContext context;
 
 
     /** Create a new callback.  The data will be passed to the next stage */
-    private WriteContextCallback( final WriteContext context ) {
+    private WriteContextCallback( final ExecutionContext context ) {
         this.context = context;
     }
 
@@ -52,7 +52,7 @@ public class WriteContextCallback implements FutureCallback<OperationResult<Void
      * @param context The context to signal to continue in the callback
      */
     public static void createCallback( final ListenableFuture<OperationResult<Void>> future,
-                                       final WriteContext context ) {
+                                       final ExecutionContext context ) {
 
         Futures.addCallback( future, new WriteContextCallback( context ) );
     }

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/43aba652/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
deleted file mode 100644
index 0925f0b..0000000
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/WriteContextImpl.java
+++ /dev/null
@@ -1,93 +0,0 @@
-package org.apache.usergrid.persistence.collection.mvcc.stage.impl;
-
-
-import org.apache.usergrid.persistence.collection.CollectionContext;
-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 StagePipeline pipeline;
-    private final CollectionContext context;
-
-    private Object message;
-    private WriteStage current;
-
-
-    @Inject
-    public WriteContextImpl( final StagePipeline pipeline,
-                             final CollectionContext context ) {
-        Preconditions.checkNotNull( pipeline, "pipeline cannot be null" );
-        Preconditions.checkNotNull( context, "context cannot be null" );
-
-        this.pipeline = pipeline;
-        this.context = context;
-    }
-
-
-    @Override
-    public void performWrite( Object input ) {
-
-        current = this.pipeline.first();
-
-        setMessage( input );
-
-        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 CollectionContext getCollectionContext() {
-        return this.context;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/43aba652/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/CollectionManagerIT.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/CollectionManagerIT.java b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/CollectionManagerIT.java
index b7c7027..9672a6b 100644
--- a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/CollectionManagerIT.java
+++ b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/CollectionManagerIT.java
@@ -5,9 +5,9 @@ import org.junit.Rule;
 import org.junit.Test;
 
 import org.apache.usergrid.persistence.collection.guice.CassandraTestCollectionModule;
-import org.apache.usergrid.persistence.collection.guice.TestCollectionModule;
 import org.apache.usergrid.persistence.collection.impl.CollectionContextImpl;
 import org.apache.usergrid.persistence.model.entity.Entity;
+import org.apache.usergrid.persistence.model.field.IntegerField;
 import org.apache.usergrid.persistence.model.util.UUIDGenerator;
 import org.apache.usergrid.persistence.test.CassandraRule;
 
@@ -16,7 +16,8 @@ import com.google.inject.Inject;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
 
 
 /** @author tnine */
@@ -29,7 +30,6 @@ public class CollectionManagerIT {
     public final CassandraRule rule = new CassandraRule();
 
 
-
     @Inject
     private CollectionManagerFactory factory;
 
@@ -37,18 +37,102 @@ public class CollectionManagerIT {
     @Test
     public void create() {
 
-        CollectionContext context = new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test");
-        Entity newEntity = new Entity("test");
+        CollectionContext context =
+                new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" );
+        Entity newEntity = new Entity( "test" );
 
-        CollectionManager manager = factory.createCollectionManager(context);
+        CollectionManager manager = factory.createCollectionManager( context );
 
         Entity returned = manager.create( newEntity );
 
-        assertNotNull("Returned has a uuid", returned.getUuid());
-        assertEquals("Version matches uuid for create", returned.getUuid(), returned.getVersion());
+        assertNotNull( "Returned has a uuid", returned.getUuid() );
+        assertEquals( "Version matches uuid for create", returned.getUuid(), returned.getVersion() );
+
+        assertTrue( "Created time was set", returned.getCreated() > 0 );
+        assertEquals( "Created and updated time match on create", returned.getCreated(), returned.getUpdated() );
+    }
+
+
+    @Test
+    public void createAndLoad() {
+
+        CollectionContext context =
+                new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" );
+        Entity newEntity = new Entity( "test" );
+
+        CollectionManager manager = factory.createCollectionManager( context );
+
+        Entity createReturned = manager.create( newEntity );
+
+
+        assertNotNull( "Id was assigned", createReturned.getUuid() );
+
+        Entity loadReturned = manager.load( createReturned.getUuid() );
+
+        assertEquals( "Same value", createReturned, loadReturned );
+    }
+
+
+    @Test
+    public void createLoadDelete() {
+
+        CollectionContext context =
+                new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" );
+        Entity newEntity = new Entity( "test" );
+
+        CollectionManager manager = factory.createCollectionManager( context );
+
+        Entity createReturned = manager.create( newEntity );
+
+
+        assertNotNull( "Id was assigned", createReturned.getUuid() );
+
+        Entity loadReturned = manager.load( createReturned.getUuid() );
+
+        assertEquals( "Same value", createReturned, loadReturned );
+
+        manager.delete( createReturned.getUuid() );
+
+        loadReturned = manager.load( createReturned.getUuid() );
+
+        assertNull( "Entity was deleted", loadReturned );
+    }
+
+
+    @Test
+    public void createLoadUpdateLoad() {
+
+        CollectionContext context =
+                new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" );
+
+        Entity newEntity = new Entity( "test" );
+        newEntity.setField( new IntegerField( "counter", 1 ) );
+
+        CollectionManager manager = factory.createCollectionManager( context );
+
+        Entity createReturned = manager.create( newEntity );
+
+
+        assertNotNull( "Id was assigned", createReturned.getUuid() );
+
+        Entity loadReturned = manager.load( createReturned.getUuid() );
+
+        assertEquals( "Same value", createReturned, loadReturned );
+
+
+        assertEquals("Field value correct", createReturned.getField( "counter" ), loadReturned.getField( "counter" ));
+
+
+        //update the field to 2
+        createReturned.setField( new IntegerField( "counter", 2 ) );
+
+        manager.update( createReturned );
+
+        loadReturned = manager.load( createReturned.getUuid() );
+
+        assertEquals( "Same value", createReturned, loadReturned );
 
-        assertTrue("Created time was set", returned.getCreated() > 0);
-        assertEquals("Created and updated time match on create", returned.getCreated(), returned.getUpdated());
 
+        assertEquals("Field value correct", createReturned.getField( "counter" ), loadReturned.getField( "counter" ));
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/43aba652/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/CollectionManagerTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/CollectionManagerTest.java b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/CollectionManagerTest.java
index fca9044..9028cbf 100644
--- a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/CollectionManagerTest.java
+++ b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/CollectionManagerTest.java
@@ -6,9 +6,9 @@ import org.mockito.ArgumentCaptor;
 
 import org.apache.usergrid.persistence.collection.impl.CollectionContextImpl;
 import org.apache.usergrid.persistence.collection.impl.CollectionManagerImpl;
+import org.apache.usergrid.persistence.collection.mvcc.stage.ExecutionContext;
+import org.apache.usergrid.persistence.collection.mvcc.stage.Stage;
 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 org.apache.usergrid.persistence.model.entity.Entity;
 import org.apache.usergrid.persistence.model.util.UUIDGenerator;
 
@@ -26,11 +26,14 @@ public class CollectionManagerTest {
     @Test
     public void create(){
 
-        WriteStage mockStage = mock(WriteStage.class);
+        Stage mockStage = mock(Stage.class);
 
         StagePipeline createPipeline = mock(StagePipeline.class);
         StagePipeline updatePipeline = mock(StagePipeline.class);
         StagePipeline deletePipeline = mock(StagePipeline.class);
+        StagePipeline loadPipeline = mock(StagePipeline.class);
+
+
 
         //mock up returning the first stage
         when(createPipeline.first()).thenReturn(mockStage);
@@ -38,7 +41,7 @@ public class CollectionManagerTest {
 
         CollectionContext context = new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" );
 
-        CollectionManager collectionManager = new CollectionManagerImpl(createPipeline, updatePipeline, deletePipeline,  context);
+        CollectionManager collectionManager = new CollectionManagerImpl(createPipeline, updatePipeline, deletePipeline, loadPipeline, context);
 
         Entity create = new Entity();
 
@@ -47,12 +50,12 @@ public class CollectionManagerTest {
         //verify the first stage was asked for
         verify(createPipeline).first();
 
-        ArgumentCaptor<WriteContext> contextArg = ArgumentCaptor.forClass(WriteContext.class);
+        ArgumentCaptor<ExecutionContext> contextArg = ArgumentCaptor.forClass(ExecutionContext.class);
 
         //verify the first perform stage was invoked
         verify(mockStage).performStage( contextArg.capture() );
 
-        //verify we set the passed entity into the WriteContext
+        //verify we set the passed entity into the ExecutionContext
         assertEquals("Entity should be present in the write context", create, contextArg.getValue().getMessage( Entity.class ));
 
     }

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/43aba652/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/ExecutionContextTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/ExecutionContextTest.java b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/ExecutionContextTest.java
new file mode 100644
index 0000000..4b917e4
--- /dev/null
+++ b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/ExecutionContextTest.java
@@ -0,0 +1,217 @@
+package org.apache.usergrid.persistence.collection.mvcc.stage;
+
+
+import org.junit.Test;
+
+import org.apache.usergrid.persistence.collection.CollectionContext;
+import org.apache.usergrid.persistence.collection.mvcc.stage.impl.ExecutionContextImpl;
+
+import static junit.framework.TestCase.assertSame;
+import static org.junit.Assert.assertNull;
+import static org.mockito.Matchers.same;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+
+/** @author tnine */
+public class ExecutionContextTest {
+
+    @Test
+    public void performWrite() {
+
+        CollectionContext collectionContext = mock( CollectionContext.class );
+
+        StagePipeline pipeline = mock( StagePipeline.class );
+
+        Stage stage = mock( Stage.class );
+
+        when( pipeline.first() ).thenReturn( stage );
+
+        ExecutionContext executionContext = new ExecutionContextImpl( pipeline, collectionContext );
+
+        Object test = new Object();
+
+        executionContext.execute( test );
+
+        //verify we called first in the pipeline to get the first value
+        verify( pipeline ).first();
+
+        //verify the first stage was invoked
+        verify( stage ).performStage( same( executionContext ) );
+
+        //verify the bean value was set
+        assertSame( test, executionContext.getMessage( Object.class ) );
+    }
+
+
+    @Test
+    public void setAndGet() {
+        Object test = new Object();
+
+        CollectionContext collectionContext = mock( CollectionContext.class );
+
+        StagePipeline pipeline = mock( StagePipeline.class );
+
+
+        ExecutionContext executionContext = new ExecutionContextImpl( pipeline, collectionContext );
+
+        executionContext.setMessage( test );
+
+        assertSame( "Same value returned", test, executionContext.getMessage( Object.class ) );
+    }
+
+
+    @Test
+    public void setAndGetTypeSafe() {
+        TestBean test = new TestBean();
+
+        CollectionContext collectionContext = mock( CollectionContext.class );
+
+        StagePipeline pipeline = mock( StagePipeline.class );
+
+
+        ExecutionContext executionContext = new ExecutionContextImpl( pipeline, collectionContext );
+
+        executionContext.setMessage( test );
+
+        //works because Test is an instance of object
+        assertSame( "Test instance of object", test, executionContext.getMessage( Object.class ) );
+
+        assertSame( "Test instance of object", test, executionContext.getMessage( TestBean.class ) );
+    }
+
+
+    @Test( expected = ClassCastException.class )
+    public void setAndGetBadType() {
+        Object test = new Object();
+
+        CollectionContext collectionContext = mock( CollectionContext.class );
+
+        StagePipeline pipeline = mock( StagePipeline.class );
+
+
+        ExecutionContext executionContext = new ExecutionContextImpl( pipeline, collectionContext );
+
+        executionContext.setMessage( test );
+
+        //works because Test is an instance of object
+        assertSame( "Test instance of object", test, executionContext.getMessage( Object.class ) );
+
+        //should blow up, not type save.  The object test is not an instance of TestBean
+        executionContext.getMessage( TestBean.class );
+    }
+
+
+    @Test
+    public void nullMessage() {
+
+        CollectionContext collectionContext = mock( CollectionContext.class );
+
+        StagePipeline pipeline = mock( StagePipeline.class );
+
+
+        ExecutionContext executionContext = new ExecutionContextImpl( pipeline, collectionContext );
+
+        executionContext.setMessage( null );
+
+        //works because Test is an instance of object
+        assertNull( "Null message returned", executionContext.getMessage( Object.class ) );
+    }
+
+
+    @Test
+    public void proceedHasNextStep() {
+
+        CollectionContext collectionContext = mock( CollectionContext.class );
+
+        StagePipeline pipeline = mock( StagePipeline.class );
+
+        Stage firstStage = mock( Stage.class );
+
+        Stage secondStage = mock( Stage.class );
+
+
+        when( pipeline.first() ).thenReturn( firstStage );
+
+        when( pipeline.nextStage( same( firstStage ) ) ).thenReturn( secondStage );
+
+
+        ExecutionContext executionContext = new ExecutionContextImpl( pipeline, collectionContext );
+
+        Object test = new Object();
+
+        executionContext.execute( test );
+
+        //now proceed and validate we were called
+        executionContext.proceed();
+
+        verify( secondStage ).performStage( same( executionContext ) );
+    }
+
+
+    @Test
+    public void proceedNoNextStep() {
+
+        CollectionContext collectionContext = mock( CollectionContext.class );
+
+        StagePipeline pipeline = mock( StagePipeline.class );
+
+        Stage firstStage = mock( Stage.class );
+
+        when( pipeline.first() ).thenReturn( firstStage );
+
+        when( pipeline.nextStage( same( firstStage ) ) ).thenReturn( null );
+
+
+        ExecutionContext executionContext = new ExecutionContextImpl( pipeline, collectionContext );
+
+        Object test = new Object();
+
+        executionContext.execute( test );
+
+        //now proceed and validate we were called
+        executionContext.proceed();
+    }
+
+
+    @Test
+    public void getContextCorrect() {
+
+        CollectionContext collectionContext = mock( CollectionContext.class );
+
+        StagePipeline pipeline = mock( StagePipeline.class );
+
+
+        ExecutionContext executionContext = new ExecutionContextImpl( pipeline, collectionContext );
+
+        assertSame( "Collection context pointer correct", collectionContext, executionContext.getCollectionContext() );
+    }
+
+
+
+
+    @Test( expected = NullPointerException.class )
+    public void nullContextFails() {
+
+        CollectionContext collectionContext = mock( CollectionContext.class );
+
+
+        new ExecutionContextImpl( null, collectionContext );
+    }
+
+
+    @Test( expected = NullPointerException.class )
+    public void nullPipelineFails() {
+
+        CollectionContext collectionContext = mock( CollectionContext.class );
+
+
+        new ExecutionContextImpl( null, collectionContext );
+    }
+
+
+    private static class TestBean {
+
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/43aba652/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/StagePipelineTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/StagePipelineTest.java b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/StagePipelineTest.java
new file mode 100644
index 0000000..6f0fa35
--- /dev/null
+++ b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/StagePipelineTest.java
@@ -0,0 +1,89 @@
+package org.apache.usergrid.persistence.collection.mvcc.stage;
+
+
+import org.junit.Test;
+
+import org.apache.usergrid.persistence.collection.mvcc.stage.impl.StagePipelineImpl;
+
+import static junit.framework.TestCase.assertSame;
+import static org.junit.Assert.assertNull;
+import static org.mockito.Mockito.mock;
+
+
+/** @author tnine */
+public class StagePipelineTest {
+
+    @Test
+    public void oneStage() {
+        Stage first = mock( Stage.class );
+
+        StagePipeline pipeline = StagePipelineImpl.fromStages( first );
+
+        assertSame( "Correct stage returned", first, pipeline.first() );
+
+        Stage next = pipeline.nextStage( first );
+
+        assertNull( "No next stage", next );
+    }
+
+
+    @Test
+    public void threeStages() {
+        Stage first = mock( Stage.class );
+        Stage second = mock( Stage.class );
+        Stage third = mock( Stage.class );
+
+        StagePipeline pipeline = StagePipelineImpl.fromStages( first, second, third );
+
+        assertSame( "Correct stage returned", first, pipeline.first() );
+
+        Stage next = pipeline.nextStage( first );
+
+        assertSame( "Correct stage returned", second, next );
+
+        next = pipeline.nextStage( next );
+
+        assertSame( "Correct stage returned", third, next );
+
+        next = pipeline.nextStage( next );
+
+        assertNull( "No next stage", next );
+    }
+
+
+    /**
+     * Test seeking without calling .first() just to make sure there's no side effects
+     */
+    @Test
+    public void stageSeek() {
+        Stage first = mock( Stage.class );
+        Stage second = mock( Stage.class );
+        Stage third = mock( Stage.class );
+
+        StagePipeline pipeline = StagePipelineImpl.fromStages( first, second, third );
+
+
+        Stage next = pipeline.nextStage( second );
+
+        assertSame( "Correct stage returned", third, next );
+
+        next = pipeline.nextStage( next );
+
+        assertNull( "No next stage", next );
+    }
+
+
+    @Test( expected = NullPointerException.class )
+    public void invalidStageInput() {
+        Stage first = mock( Stage.class );
+
+        StagePipeline pipeline = StagePipelineImpl.fromStages( first );
+        pipeline.nextStage( null );
+    }
+
+
+    @Test( expected = IllegalArgumentException.class )
+    public void noStagesErrors() {
+        StagePipelineImpl.fromStages();
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/43aba652/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/WriteContextTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/WriteContextTest.java b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/WriteContextTest.java
deleted file mode 100644
index 490b249..0000000
--- a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/WriteContextTest.java
+++ /dev/null
@@ -1,217 +0,0 @@
-package org.apache.usergrid.persistence.collection.mvcc.stage;
-
-
-import org.junit.Test;
-
-import org.apache.usergrid.persistence.collection.CollectionContext;
-import org.apache.usergrid.persistence.collection.mvcc.stage.impl.WriteContextImpl;
-
-import static junit.framework.TestCase.assertSame;
-import static org.junit.Assert.assertNull;
-import static org.mockito.Matchers.same;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-
-/** @author tnine */
-public class WriteContextTest {
-
-    @Test
-    public void performWrite() {
-
-        CollectionContext collectionContext = mock( CollectionContext.class );
-
-        StagePipeline pipeline = mock( StagePipeline.class );
-
-        WriteStage stage = mock( WriteStage.class );
-
-        when( pipeline.first() ).thenReturn( stage );
-
-        WriteContext writeContext = new WriteContextImpl( pipeline, collectionContext );
-
-        Object test = new Object();
-
-        writeContext.performWrite( test );
-
-        //verify we called first in the pipeline to get the first value
-        verify( pipeline ).first();
-
-        //verify the first stage was invoked
-        verify( stage ).performStage( same( writeContext ) );
-
-        //verify the bean value was set
-        assertSame( test, writeContext.getMessage( Object.class ) );
-    }
-
-
-    @Test
-    public void setAndGet() {
-        Object test = new Object();
-
-        CollectionContext collectionContext = mock( CollectionContext.class );
-
-        StagePipeline pipeline = mock( StagePipeline.class );
-
-
-        WriteContext writeContext = new WriteContextImpl( pipeline, collectionContext );
-
-        writeContext.setMessage( test );
-
-        assertSame( "Same value returned", test, writeContext.getMessage( Object.class ) );
-    }
-
-
-    @Test
-    public void setAndGetTypeSafe() {
-        TestBean test = new TestBean();
-
-        CollectionContext collectionContext = mock( CollectionContext.class );
-
-        StagePipeline pipeline = mock( StagePipeline.class );
-
-
-        WriteContext writeContext = new WriteContextImpl( pipeline, collectionContext );
-
-        writeContext.setMessage( test );
-
-        //works because Test is an instance of object
-        assertSame( "Test instance of object", test, writeContext.getMessage( Object.class ) );
-
-        assertSame( "Test instance of object", test, writeContext.getMessage( TestBean.class ) );
-    }
-
-
-    @Test( expected = ClassCastException.class )
-    public void setAndGetBadType() {
-        Object test = new Object();
-
-        CollectionContext collectionContext = mock( CollectionContext.class );
-
-        StagePipeline pipeline = mock( StagePipeline.class );
-
-
-        WriteContext writeContext = new WriteContextImpl( pipeline, collectionContext );
-
-        writeContext.setMessage( test );
-
-        //works because Test is an instance of object
-        assertSame( "Test instance of object", test, writeContext.getMessage( Object.class ) );
-
-        //should blow up, not type save.  The object test is not an instance of TestBean
-        writeContext.getMessage( TestBean.class );
-    }
-
-
-    @Test
-    public void nullMessage() {
-
-        CollectionContext collectionContext = mock( CollectionContext.class );
-
-        StagePipeline pipeline = mock( StagePipeline.class );
-
-
-        WriteContext writeContext = new WriteContextImpl( pipeline, collectionContext );
-
-        writeContext.setMessage( null );
-
-        //works because Test is an instance of object
-        assertNull( "Null message returned", writeContext.getMessage( Object.class ) );
-    }
-
-
-    @Test
-    public void proceedHasNextStep() {
-
-        CollectionContext collectionContext = mock( CollectionContext.class );
-
-        StagePipeline pipeline = mock( StagePipeline.class );
-
-        WriteStage firstStage = mock( WriteStage.class );
-
-        WriteStage secondStage = mock( WriteStage.class );
-
-
-        when( pipeline.first() ).thenReturn( firstStage );
-
-        when( pipeline.nextStage( same( firstStage ) ) ).thenReturn( secondStage );
-
-
-        WriteContext writeContext = new WriteContextImpl( pipeline, collectionContext );
-
-        Object test = new Object();
-
-        writeContext.performWrite( test );
-
-        //now proceed and validate we were called
-        writeContext.proceed();
-
-        verify( secondStage ).performStage( same( writeContext ) );
-    }
-
-
-    @Test
-    public void proceedNoNextStep() {
-
-        CollectionContext collectionContext = mock( CollectionContext.class );
-
-        StagePipeline pipeline = mock( StagePipeline.class );
-
-        WriteStage firstStage = mock( WriteStage.class );
-
-        when( pipeline.first() ).thenReturn( firstStage );
-
-        when( pipeline.nextStage( same( firstStage ) ) ).thenReturn( null );
-
-
-        WriteContext writeContext = new WriteContextImpl( pipeline, collectionContext );
-
-        Object test = new Object();
-
-        writeContext.performWrite( test );
-
-        //now proceed and validate we were called
-        writeContext.proceed();
-    }
-
-
-    @Test
-    public void getContextCorrect() {
-
-        CollectionContext collectionContext = mock( CollectionContext.class );
-
-        StagePipeline pipeline = mock( StagePipeline.class );
-
-
-        WriteContext writeContext = new WriteContextImpl( pipeline, collectionContext );
-
-        assertSame( "Collection context pointer correct", collectionContext, writeContext.getCollectionContext() );
-    }
-
-
-
-
-    @Test( expected = NullPointerException.class )
-    public void nullContextFails() {
-
-        CollectionContext collectionContext = mock( CollectionContext.class );
-
-
-        new WriteContextImpl( null, collectionContext );
-    }
-
-
-    @Test( expected = NullPointerException.class )
-    public void nullPipelineFails() {
-
-        CollectionContext collectionContext = mock( CollectionContext.class );
-
-
-        new WriteContextImpl( null, collectionContext );
-    }
-
-
-    private static class TestBean {
-
-    }
-}