You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@usergrid.apache.org by to...@apache.org on 2013/12/04 04:45:15 UTC
[1/5] git commit: WIP. Need to finish creating pipelines etc before
merging.
Updated Branches:
refs/heads/two-dot-o 04b9497c9 -> cb9ec94e3
WIP. Need to finish creating pipelines etc before merging.
Project: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/commit/b2833c39
Tree: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/tree/b2833c39
Diff: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/diff/b2833c39
Branch: refs/heads/two-dot-o
Commit: b2833c39ea46a2d4037671bda019d07ac69d9449
Parents: 04b9497
Author: Todd Nine <to...@apache.org>
Authored: Mon Dec 2 20:22:55 2013 -0700
Committer: Todd Nine <to...@apache.org>
Committed: Mon Dec 2 20:22:55 2013 -0700
----------------------------------------------------------------------
stack/corepersistence/collection/pom.xml | 2 +
.../collection/CollectionManagerImpl.java | 25 ++------
.../collection/guice/CollectionModule.java | 34 ++++++++--
.../collection/mvcc/stage/Commit.java | 22 -------
.../collection/mvcc/stage/StagePipeline.java | 35 +++++++++++
.../collection/mvcc/stage/Start.java | 44 -------------
.../collection/mvcc/stage/Write.java | 29 ---------
.../collection/mvcc/stage/WriteContext.java | 25 ++++++++
.../collection/mvcc/stage/WriteListener.java | 10 ---
.../collection/mvcc/stage/WriteStage.java | 7 +--
.../stage/impl/CollectionPipelineModule.java | 65 +++++++++++++++++++
.../collection/mvcc/stage/impl/Commit.java | 24 +++++++
.../mvcc/stage/impl/CreatePipeline.java | 20 ++++++
.../mvcc/stage/impl/DeletePipeline.java | 20 ++++++
.../mvcc/stage/impl/StagePipelineImpl.java | 59 +++++++++++++++++
.../collection/mvcc/stage/impl/Start.java | 66 ++++++++++++++++++++
.../mvcc/stage/impl/UpdatePipeline.java | 20 ++++++
.../collection/mvcc/stage/impl/Write.java | 27 ++++++++
.../collection/mvcc/stage/StartTest.java | 2 +-
.../persistence/index/stage/Complete.java | 9 +--
.../usergrid/persistence/index/stage/Start.java | 10 +--
.../usergrid/persistence/index/stage/Write.java | 10 +--
22 files changed, 416 insertions(+), 149 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/b2833c39/stack/corepersistence/collection/pom.xml
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/pom.xml b/stack/corepersistence/collection/pom.xml
index 7e48ea4..1a0f358 100644
--- a/stack/corepersistence/collection/pom.xml
+++ b/stack/corepersistence/collection/pom.xml
@@ -91,6 +91,8 @@
<version>${guice.version}</version>
</dependency>
+
+
<!-- Google Guice Integration Test Injectors -->
<dependency>
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/b2833c39/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/CollectionManagerImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/CollectionManagerImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/CollectionManagerImpl.java
index 679a8cb..b5f0afb 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/CollectionManagerImpl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/CollectionManagerImpl.java
@@ -1,7 +1,6 @@
package org.apache.usergrid.persistence.collection;
-import java.lang.reflect.InvocationTargetException;
import java.util.UUID;
import org.slf4j.Logger;
@@ -10,15 +9,9 @@ import org.slf4j.LoggerFactory;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntityImpl;
-import org.apache.usergrid.persistence.collection.mvcc.stage.Commit;
-import org.apache.usergrid.persistence.collection.mvcc.stage.Start;
-import org.apache.usergrid.persistence.collection.mvcc.stage.Write;
import org.apache.usergrid.persistence.model.entity.Entity;
import org.apache.usergrid.persistence.model.util.UUIDGenerator;
-import com.google.inject.Inject;
-import com.netflix.astyanax.MutationBatch;
-
/**
* Simple implementation. Should perform
@@ -30,19 +23,12 @@ public class CollectionManagerImpl implements CollectionManager {
private final CollectionContext context;
private final TimeService timeService;
- private final Start startStage;
- private final Write writeStage;
- private final Commit commitStage;
- @Inject
- public CollectionManagerImpl( final CollectionContext context, final TimeService timeService, final Start startStage, final Write writeStage,
- final Commit commitStage ) {
+
+ public CollectionManagerImpl( final CollectionContext context, final TimeService timeService ) {
this.context = context;
this.timeService = timeService;
- this.startStage = startStage;
- this.writeStage = writeStage;
- this.commitStage = commitStage;
}
@@ -69,9 +55,7 @@ public class CollectionManagerImpl implements CollectionManager {
MvccEntityImpl mvccEntity = new MvccEntityImpl(context, entityId, version, entity );
- MutationBatch mutation = startStage.performStage( mvccEntity );
- writeStage.performStage( mvccEntity );
- commitStage.performStage( mvccEntity );
+
}
@@ -91,4 +75,7 @@ public class CollectionManagerImpl implements CollectionManager {
public Entity load( final UUID entityId ) {
return null; //To change body of implemented methods use File | Settings | File Templates.
}
+
+
+
}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/b2833c39/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/guice/CollectionModule.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/guice/CollectionModule.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/guice/CollectionModule.java
index c83fe4f..e675e88 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/guice/CollectionModule.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/guice/CollectionModule.java
@@ -5,12 +5,17 @@ import org.apache.usergrid.persistence.collection.astynax.AstynaxKeyspaceProvide
import org.apache.usergrid.persistence.collection.migration.Migration;
import org.apache.usergrid.persistence.collection.migration.MigrationManager;
import org.apache.usergrid.persistence.collection.migration.MigrationManagerImpl;
+import org.apache.usergrid.persistence.collection.mvcc.stage.StagePipeline;
+import org.apache.usergrid.persistence.collection.mvcc.stage.impl.UpdatePipeline;
+import org.apache.usergrid.persistence.collection.mvcc.stage.impl.CreatePipeline;
+import org.apache.usergrid.persistence.collection.mvcc.stage.impl.DeletePipeline;
import org.apache.usergrid.persistence.collection.serialization.MvccEntitySerializationStrategy;
import org.apache.usergrid.persistence.collection.serialization.MvccEntitySerializationStrategyImpl;
import org.apache.usergrid.persistence.collection.serialization.MvccLogEntrySerializationStrategy;
import org.apache.usergrid.persistence.collection.serialization.MvccLogEntrySerializationStrategyImpl;
import com.google.inject.AbstractModule;
+import com.google.inject.Provides;
import com.google.inject.multibindings.Multibinder;
import com.google.inject.name.Names;
import com.netflix.astyanax.Keyspace;
@@ -23,9 +28,7 @@ import com.netflix.astyanax.Keyspace;
*/
public class CollectionModule extends AbstractModule {
- /**
- * The location of the properties file
- */
+ /** The location of the properties file */
private static final String CASS_PROPS = "cassandra.properties";
@@ -44,7 +47,7 @@ public class CollectionModule extends AbstractModule {
bind( Keyspace.class ).toProvider( AstynaxKeyspaceProvider.class );
//bind our migration manager
- bind(MigrationManager.class).to( MigrationManagerImpl.class );
+ bind( MigrationManager.class ).to( MigrationManagerImpl.class );
//bind the serialization strategies
@@ -61,4 +64,27 @@ public class CollectionModule extends AbstractModule {
uriBinder.addBinding().to( MvccEntitySerializationStrategyImpl.class );
uriBinder.addBinding().to( MvccLogEntrySerializationStrategyImpl.class );
}
+
+
+ /** Wire the pipeline of operations for create. This should create a new
+ * instance every time, since StagePipeline objects are mutable */
+ @Provides
+ @CreatePipeline
+ public StagePipeline createWritePipeline() {
+ return null; //To change body of created methods use File | Settings | File Templates.
+ }
+
+
+ @Provides
+ @DeletePipeline
+ public StagePipeline deletePipeline() {
+ return null; //To change body of created methods use File | Settings | File Templates.
+ }
+
+
+ @Provides
+ @UpdatePipeline
+ public StagePipeline updatePipeline() {
+ return null; //To change body of created methods use File | Settings | File Templates.
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/b2833c39/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/Commit.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/Commit.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/Commit.java
deleted file mode 100644
index 019c497..0000000
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/Commit.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package org.apache.usergrid.persistence.collection.mvcc.stage;
-
-
-import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntity;
-
-import com.google.common.util.concurrent.ListenableFuture;
-import com.netflix.astyanax.MutationBatch;
-import com.netflix.astyanax.connectionpool.OperationResult;
-
-
-/**
- * This phase should invoke any finalization, and mark the entity as committed in the data store before returning
- */
-public class Commit implements WriteStage {
-
-
-
- @Override
- public MutationBatch performStage( final MvccEntity entity ) {
- return null;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/b2833c39/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/StagePipeline.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/StagePipeline.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/StagePipeline.java
new file mode 100644
index 0000000..30b274c
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/StagePipeline.java
@@ -0,0 +1,35 @@
+package org.apache.usergrid.persistence.collection.mvcc.stage;
+
+
+/**
+ * Pipeline that represents a collection of stages to execute
+ * An implementation is mutable, so this instance should not be
+ * reused across threads
+ *
+ * @author tnine */
+public interface StagePipeline {
+
+
+ /**
+ * Get the next stage in this pipeline. Will return null if there are no more stages to execute
+ */
+ public WriteStage next();
+
+ /**
+ * Insert a new stage directly after the current stage. This can be used
+ * to add additional validation during write phases depending on the mvcc entity
+ *
+ * @param stage
+ */
+ public void insert(WriteStage stage);
+
+
+ /**
+ * Add a new stage to the end of the pipline
+ * @param stage
+ */
+ public void addLast(WriteStage stage);
+
+
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/b2833c39/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/Start.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/Start.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/Start.java
deleted file mode 100644
index e66eb52..0000000
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/Start.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package org.apache.usergrid.persistence.collection.mvcc.stage;
-
-
-import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntity;
-import org.apache.usergrid.persistence.collection.mvcc.entity.MvccLogEntry;
-import org.apache.usergrid.persistence.collection.mvcc.entity.MvccLogEntryImpl;
-import org.apache.usergrid.persistence.collection.mvcc.entity.Stage;
-import org.apache.usergrid.persistence.collection.serialization.MvccLogEntrySerializationStrategy;
-
-import com.google.common.util.concurrent.ListenableFuture;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import com.netflix.astyanax.MutationBatch;
-import com.netflix.astyanax.connectionpool.OperationResult;
-import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
-
-
-/**
- * This is the first stage and should be invoked immediately when a write is started. It should persist the start of a
- * new write in the data store for a checkpoint and recovery
- */
-@Singleton
-public class Start implements WriteStage {
-
- private final MvccLogEntrySerializationStrategy logStrategy;
- /**
- * Create a new stage with the current context
- * @param logStrategy
- */
- @Inject
- protected Start( final MvccLogEntrySerializationStrategy logStrategy ){
- this.logStrategy = logStrategy;
- }
-
-
- @Override
- public MutationBatch performStage( final MvccEntity entity ) {
- final MvccLogEntry startEntry = new MvccLogEntryImpl(entity.getContext(), entity.getUuid(), entity.getVersion(),Stage.ACTIVE);
-
- MutationBatch write = logStrategy.write( startEntry );
-
- return write;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/b2833c39/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/Write.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/Write.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/Write.java
deleted file mode 100644
index 690416f..0000000
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/Write.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package org.apache.usergrid.persistence.collection.mvcc.stage;
-
-
-import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntity;
-
-import com.google.common.util.concurrent.ListenableFuture;
-import com.netflix.astyanax.MutationBatch;
-import com.netflix.astyanax.connectionpool.OperationResult;
-
-
-/**
- * This phase should execute the serialization to the data store.
- */
-public class Write implements WriteStage {
-
- /**
- * Create a new stage with the current context
- */
- protected Write( ){
- }
-
-
- @Override
- public MutationBatch performStage( final MvccEntity entity ) {
-
-
- return null;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/b2833c39/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/WriteContext.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/WriteContext.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/WriteContext.java
new file mode 100644
index 0000000..38aa9d4
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/WriteContext.java
@@ -0,0 +1,25 @@
+package org.apache.usergrid.persistence.collection.mvcc.stage;
+
+
+import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntity;
+
+
+/** @author tnine */
+public interface WriteContext {
+
+
+ /**
+ * Get the stage pipeline for this write context
+ * @return
+ */
+ StagePipeline getStagePipeline();
+
+ /**
+ * Perform the write in the context with the specified entity
+ * @param entity
+ */
+ void performWrite(MvccEntity entity);
+
+
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/b2833c39/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/WriteListener.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/WriteListener.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/WriteListener.java
deleted file mode 100644
index 4a78226..0000000
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/WriteListener.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package org.apache.usergrid.persistence.collection.mvcc.stage;
-
-
-import com.google.common.util.concurrent.FutureCallback;
-import com.google.common.util.concurrent.ListenableFuture;
-import com.netflix.astyanax.connectionpool.OperationResult;
-
-
-/** @author tnine */
-public interface WriteListener extends ListenableFuture<OperationResult<Void>> {}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/b2833c39/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/WriteStage.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/WriteStage.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/WriteStage.java
index 1960fdb..a45df6b 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/WriteStage.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/WriteStage.java
@@ -3,9 +3,6 @@ package org.apache.usergrid.persistence.collection.mvcc.stage;
import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntity;
-import com.google.common.util.concurrent.ListenableFuture;
-import com.netflix.astyanax.MutationBatch;
-import com.netflix.astyanax.connectionpool.OperationResult;
import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
@@ -17,10 +14,12 @@ public interface WriteStage {
/**
* Run this stage. This will return the MvccEntity that should be returned or passed to the next stage
*
+ *
+ * @param context The context of the current write operation
* @param entity The entity to use in this stage
*
* @return The asynchronous listener to signal success
*
*/
- public MutationBatch performStage( MvccEntity entity ) throws ConnectionException;
+ public void performStage( WriteContext context, MvccEntity entity ) throws ConnectionException;
}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/b2833c39/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/CollectionPipelineModule.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/CollectionPipelineModule.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/CollectionPipelineModule.java
new file mode 100644
index 0000000..67ca516
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/CollectionPipelineModule.java
@@ -0,0 +1,65 @@
+package org.apache.usergrid.persistence.collection.mvcc.stage.impl;
+
+
+import org.apache.usergrid.persistence.collection.astynax.AstynaxKeyspaceProvider;
+import org.apache.usergrid.persistence.collection.guice.PropertyUtils;
+import org.apache.usergrid.persistence.collection.migration.Migration;
+import org.apache.usergrid.persistence.collection.migration.MigrationManager;
+import org.apache.usergrid.persistence.collection.migration.MigrationManagerImpl;
+import org.apache.usergrid.persistence.collection.mvcc.stage.StagePipeline;
+import org.apache.usergrid.persistence.collection.mvcc.stage.WriteStage;
+import org.apache.usergrid.persistence.collection.serialization.MvccEntitySerializationStrategy;
+import org.apache.usergrid.persistence.collection.serialization.MvccEntitySerializationStrategyImpl;
+import org.apache.usergrid.persistence.collection.serialization.MvccLogEntrySerializationStrategy;
+import org.apache.usergrid.persistence.collection.serialization.MvccLogEntrySerializationStrategyImpl;
+
+import com.google.inject.AbstractModule;
+import com.google.inject.Inject;
+import com.google.inject.Provides;
+import com.google.inject.multibindings.Multibinder;
+import com.google.inject.name.Names;
+import com.netflix.astyanax.Keyspace;
+
+
+/**
+ * Simple module for wiring our pipelines
+ *
+ * @author tnine
+ */
+public class CollectionPipelineModule extends AbstractModule {
+
+ @Inject
+ private MvccLogEntrySerializationStrategy mvccLogEntrySerializationStrategy;
+
+ @Inject
+ private MvccEntitySerializationStrategy mvccEntitySerializationStrategy;
+
+
+ /** Wire the pipeline of operations for create. This should create a new
+ * instance every time, since StagePipeline objects are mutable */
+ @Provides
+ @CreatePipeline
+ public StagePipeline createWritePipeline() {
+ return StagePipelineImpl.fromStages( new Start( mvccLogEntrySerializationStrategy ), new Write(), new Commit() );
+ }
+
+
+ @Provides
+ @DeletePipeline
+ public StagePipeline deletePipeline() {
+ return null; //To change body of created methods use File | Settings | File Templates.
+ }
+
+
+ @Provides
+ @UpdatePipeline
+ public StagePipeline updatePipeline() {
+ return createWritePipeline();
+ }
+
+
+ @Override
+ protected void configure() {
+ //no op, we get our values from the provides above
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/b2833c39/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Commit.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Commit.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Commit.java
new file mode 100644
index 0000000..378e649
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Commit.java
@@ -0,0 +1,24 @@
+package org.apache.usergrid.persistence.collection.mvcc.stage.impl;
+
+
+import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntity;
+import org.apache.usergrid.persistence.collection.mvcc.stage.WriteContext;
+import org.apache.usergrid.persistence.collection.mvcc.stage.WriteStage;
+
+import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
+
+
+/**
+ * This phase should invoke any finalization, and mark the entity as committed in the data store before returning
+ */
+public class Commit implements WriteStage {
+
+ public Commit(){
+
+ }
+
+ @Override
+ public void performStage( final WriteContext context, final MvccEntity entity ) throws ConnectionException {
+ //To change body of implemented methods use File | Settings | File Templates.
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/b2833c39/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/CreatePipeline.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/CreatePipeline.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/CreatePipeline.java
new file mode 100644
index 0000000..fb7e7c1
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/CreatePipeline.java
@@ -0,0 +1,20 @@
+package org.apache.usergrid.persistence.collection.mvcc.stage.impl;
+
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import com.google.inject.BindingAnnotation;
+
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+
+
+/**
+ * Marks the create pipeline
+ * @author tnine */
+@BindingAnnotation
+@Target({ FIELD, PARAMETER, METHOD }) @Retention(RUNTIME)
+public @interface CreatePipeline {}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/b2833c39/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/DeletePipeline.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/DeletePipeline.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/DeletePipeline.java
new file mode 100644
index 0000000..e531a7f
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/DeletePipeline.java
@@ -0,0 +1,20 @@
+package org.apache.usergrid.persistence.collection.mvcc.stage.impl;
+
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import com.google.inject.BindingAnnotation;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+
+/**
+ * Marks the delete pipeline
+ * @author tnine */
+@BindingAnnotation
+@Target({ FIELD, PARAMETER, METHOD }) @Retention(RUNTIME)
+public @interface DeletePipeline {}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/b2833c39/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/StagePipelineImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/StagePipelineImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/StagePipelineImpl.java
new file mode 100644
index 0000000..5de58c5
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/StagePipelineImpl.java
@@ -0,0 +1,59 @@
+package org.apache.usergrid.persistence.collection.mvcc.stage.impl;
+
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.NoSuchElementException;
+
+import org.apache.usergrid.persistence.collection.mvcc.entity.Stage;
+import org.apache.usergrid.persistence.collection.mvcc.stage.StagePipeline;
+import org.apache.usergrid.persistence.collection.mvcc.stage.WriteStage;
+
+
+/** @author tnine */
+public class StagePipelineImpl implements StagePipeline {
+
+ private int currentIndex = 0;
+ private final List<WriteStage> stages;
+
+ protected StagePipelineImpl(WriteStage[] stages){
+ this.stages = Arrays.asList(stages);
+ }
+
+ @Override
+ public WriteStage next() {
+
+ if(currentIndex < stages.size()){
+
+ //get our current stage and increment
+ return stages.get( currentIndex ++);
+ }
+
+ return null;
+ }
+
+
+ @Override
+ public void insert( final WriteStage stage ) {
+ throw new UnsupportedOperationException("This needs written");
+
+ }
+
+
+ @Override
+ public void addLast( final WriteStage stage ) {
+ stages.add( stage );
+ }
+
+
+ /**
+ * Factory to create a new instance.
+ * @param stages
+ * @return
+ */
+ public static StagePipelineImpl fromStages(WriteStage... stages){
+ return new StagePipelineImpl( stages );
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/b2833c39/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Start.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Start.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Start.java
new file mode 100644
index 0000000..6d4b63c
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Start.java
@@ -0,0 +1,66 @@
+package org.apache.usergrid.persistence.collection.mvcc.stage.impl;
+
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntity;
+import org.apache.usergrid.persistence.collection.mvcc.entity.MvccLogEntry;
+import org.apache.usergrid.persistence.collection.mvcc.entity.MvccLogEntryImpl;
+import org.apache.usergrid.persistence.collection.mvcc.entity.Stage;
+import org.apache.usergrid.persistence.collection.mvcc.stage.WriteContext;
+import org.apache.usergrid.persistence.collection.mvcc.stage.WriteStage;
+import org.apache.usergrid.persistence.collection.serialization.MvccLogEntrySerializationStrategy;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import com.netflix.astyanax.MutationBatch;
+import com.netflix.astyanax.connectionpool.OperationResult;
+import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
+
+
+
+/**
+ * This is the first stage and should be invoked immediately when a write is started. It should persist the start of a
+ * new write in the data store for a checkpoint and recovery
+ */
+@Singleton
+public class Start implements WriteStage {
+
+ private static final Logger LOG = LoggerFactory.getLogger( Start.class );
+
+ private final MvccLogEntrySerializationStrategy logStrategy;
+ /**
+ * Create a new stage with the current context
+ * @param logStrategy
+ */
+ @Inject
+ public Start( final MvccLogEntrySerializationStrategy logStrategy ){
+ this.logStrategy = logStrategy;
+ }
+
+
+ @Override
+ public void performStage(final WriteContext context, final MvccEntity entity ) {
+ final MvccLogEntry startEntry = new MvccLogEntryImpl(entity.getContext(), entity.getUuid(), entity.getVersion(),Stage.ACTIVE);
+
+ MutationBatch write = logStrategy.write( startEntry );
+
+ ListenableFuture<OperationResult<Void>> future;
+
+ try {
+ future = write.executeAsync();
+ }
+ catch ( ConnectionException e ) {
+ LOG.error( "Failed to execute write asynchronously ", e );
+ throw new RuntimeException( "Failed to execute write asynchronously ", e );
+ }
+
+ //todo next stage invocation
+ //Futures.addCallback();
+
+ }
+
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/b2833c39/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/UpdatePipeline.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/UpdatePipeline.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/UpdatePipeline.java
new file mode 100644
index 0000000..556e92c
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/UpdatePipeline.java
@@ -0,0 +1,20 @@
+package org.apache.usergrid.persistence.collection.mvcc.stage.impl;
+
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import com.google.inject.BindingAnnotation;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+
+/**
+ * Marks the update pipeline
+ * @author tnine */
+@BindingAnnotation
+@Target({ FIELD, PARAMETER, METHOD }) @Retention(RUNTIME)
+public @interface UpdatePipeline {}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/b2833c39/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Write.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Write.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Write.java
new file mode 100644
index 0000000..b45ccd5
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Write.java
@@ -0,0 +1,27 @@
+package org.apache.usergrid.persistence.collection.mvcc.stage.impl;
+
+
+import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntity;
+import org.apache.usergrid.persistence.collection.mvcc.stage.WriteContext;
+import org.apache.usergrid.persistence.collection.mvcc.stage.WriteStage;
+
+
+/**
+ * This phase should execute the serialization to the data store.
+ */
+public class Write implements WriteStage {
+
+ /**
+ * Create a new stage with the current context
+ */
+ public Write( ){
+ }
+
+
+ @Override
+ public void performStage(WriteContext context, final MvccEntity entity ) {
+
+
+
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/b2833c39/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/StartTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/StartTest.java b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/StartTest.java
index 76d6326..aa79a70 100644
--- a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/StartTest.java
+++ b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/StartTest.java
@@ -5,9 +5,9 @@ import java.util.UUID;
import org.junit.Test;
-import org.apache.usergrid.persistence.collection.CollectionContext;
import org.apache.usergrid.persistence.collection.CollectionContextImpl;
import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntityImpl;
+import org.apache.usergrid.persistence.collection.mvcc.stage.impl.Start;
import org.apache.usergrid.persistence.collection.serialization.MvccLogEntrySerializationStrategy;
import org.apache.usergrid.persistence.model.entity.Entity;
import org.apache.usergrid.persistence.model.util.UUIDGenerator;
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/b2833c39/stack/corepersistence/index/src/main/java/org/apache/usergrid/persistence/index/stage/Complete.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/index/src/main/java/org/apache/usergrid/persistence/index/stage/Complete.java b/stack/corepersistence/index/src/main/java/org/apache/usergrid/persistence/index/stage/Complete.java
index 17903fe..cc0bc35 100644
--- a/stack/corepersistence/index/src/main/java/org/apache/usergrid/persistence/index/stage/Complete.java
+++ b/stack/corepersistence/index/src/main/java/org/apache/usergrid/persistence/index/stage/Complete.java
@@ -2,12 +2,9 @@ package org.apache.usergrid.persistence.index.stage;
import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntity;
+import org.apache.usergrid.persistence.collection.mvcc.stage.WriteContext;
import org.apache.usergrid.persistence.collection.mvcc.stage.WriteStage;
-import com.google.common.util.concurrent.ListenableFuture;
-import com.netflix.astyanax.MutationBatch;
-import com.netflix.astyanax.connectionpool.OperationResult;
-
/**
*
@@ -18,8 +15,8 @@ public class Complete implements WriteStage
{
@Override
- public MutationBatch performStage( final MvccEntity entity ) {
- return null; //To change body of implemented methods use File | Settings | File Templates.
+ public void performStage( WriteContext context, final MvccEntity entity ) {
+
}
}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/b2833c39/stack/corepersistence/index/src/main/java/org/apache/usergrid/persistence/index/stage/Start.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/index/src/main/java/org/apache/usergrid/persistence/index/stage/Start.java b/stack/corepersistence/index/src/main/java/org/apache/usergrid/persistence/index/stage/Start.java
index 4270629..d97b81c 100644
--- a/stack/corepersistence/index/src/main/java/org/apache/usergrid/persistence/index/stage/Start.java
+++ b/stack/corepersistence/index/src/main/java/org/apache/usergrid/persistence/index/stage/Start.java
@@ -2,19 +2,19 @@ package org.apache.usergrid.persistence.index.stage;
import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntity;
+import org.apache.usergrid.persistence.collection.mvcc.stage.WriteContext;
import org.apache.usergrid.persistence.collection.mvcc.stage.WriteStage;
-import com.google.common.util.concurrent.ListenableFuture;
-import com.netflix.astyanax.MutationBatch;
-import com.netflix.astyanax.connectionpool.OperationResult;
+import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
/** This state should signal an index update has started */
public class Start implements WriteStage
{
+
@Override
- public MutationBatch performStage( final MvccEntity entity ) {
- return null; //To change body of implemented methods use File | Settings | File Templates.
+ public void performStage( final WriteContext context, final MvccEntity entity ) throws ConnectionException {
+ //To change body of implemented methods use File | Settings | File Templates.
}
}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/b2833c39/stack/corepersistence/index/src/main/java/org/apache/usergrid/persistence/index/stage/Write.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/index/src/main/java/org/apache/usergrid/persistence/index/stage/Write.java b/stack/corepersistence/index/src/main/java/org/apache/usergrid/persistence/index/stage/Write.java
index c5d857b..e143a6b 100644
--- a/stack/corepersistence/index/src/main/java/org/apache/usergrid/persistence/index/stage/Write.java
+++ b/stack/corepersistence/index/src/main/java/org/apache/usergrid/persistence/index/stage/Write.java
@@ -2,20 +2,20 @@ package org.apache.usergrid.persistence.index.stage;
import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntity;
+import org.apache.usergrid.persistence.collection.mvcc.stage.WriteContext;
import org.apache.usergrid.persistence.collection.mvcc.stage.WriteStage;
-import com.google.common.util.concurrent.ListenableFuture;
-import com.netflix.astyanax.MutationBatch;
-import com.netflix.astyanax.connectionpool.OperationResult;
+import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
/** This state should perform an update of the index. */
public class Write implements WriteStage
{
+
@Override
- public MutationBatch performStage( final MvccEntity entity ) {
- return null; //To change body of implemented methods use File | Settings | File Templates.
+ public void performStage( final WriteContext context, final MvccEntity entity ) throws ConnectionException {
+ //To change body of implemented methods use File | Settings | File Templates.
}
}
[5/5] git commit: Major refactor complete. Need to work on scheduling
of futures.
Posted by to...@apache.org.
Major refactor complete. Need to work on scheduling of futures.
Project: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/commit/cb9ec94e
Tree: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/tree/cb9ec94e
Diff: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/diff/cb9ec94e
Branch: refs/heads/two-dot-o
Commit: cb9ec94e31df24e191f2fa4010c020e2ce16c36e
Parents: 271b26c
Author: Todd Nine <to...@apache.org>
Authored: Tue Dec 3 11:12:57 2013 -0700
Committer: Todd Nine <to...@apache.org>
Committed: Tue Dec 3 20:44:14 2013 -0700
----------------------------------------------------------------------
stack/corepersistence/collection/pom.xml | 42 +-
.../collection/CollectionContextImpl.java | 93 ----
.../collection/CollectionManager.java | 4 +-
.../CollectionManagerFactoryImpl.java | 16 -
.../collection/CollectionManagerImpl.java | 81 ----
.../persistence/collection/TimeService.java | 12 -
.../exception/CollectionRuntimeException.java | 29 ++
.../collection/guice/CollectionModule.java | 74 +---
.../collection/impl/CollectionContextImpl.java | 95 ++++
.../impl/CollectionManagerFactoryImpl.java | 21 +
.../collection/impl/CollectionManagerImpl.java | 77 ++++
.../collection/mvcc/entity/MvccEntity.java | 4 -
.../collection/mvcc/entity/MvccEntityImpl.java | 110 -----
.../collection/mvcc/entity/MvccLogEntry.java | 5 -
.../mvcc/entity/MvccLogEntryImpl.java | 113 -----
.../mvcc/entity/impl/MvccEntityImpl.java | 98 +++++
.../mvcc/entity/impl/MvccLogEntryImpl.java | 100 +++++
.../mvcc/event/PostProcessListener.java | 6 +-
.../collection/mvcc/stage/MvccStrategy.java | 42 --
.../collection/mvcc/stage/StagePipeline.java | 27 +-
.../collection/mvcc/stage/WriteContext.java | 46 +-
.../mvcc/stage/WriteContextFactory.java | 30 ++
.../collection/mvcc/stage/WriteStage.java | 7 +-
.../stage/impl/CollectionPipelineModule.java | 38 +-
.../collection/mvcc/stage/impl/Commit.java | 24 -
.../mvcc/stage/impl/MvccEntityCommit.java | 28 ++
.../mvcc/stage/impl/MvccEntityNew.java | 116 +++++
.../mvcc/stage/impl/MvccEntityWrite.java | 25 ++
.../mvcc/stage/impl/StagePipelineImpl.java | 45 +-
.../collection/mvcc/stage/impl/Start.java | 67 ---
.../mvcc/stage/impl/UpdatePipeline.java | 20 -
.../collection/mvcc/stage/impl/Write.java | 27 --
.../mvcc/stage/impl/WriteContextCallback.java | 42 +-
.../stage/impl/WriteContextFactoryImpl.java | 47 ++
.../mvcc/stage/impl/WriteContextImpl.java | 111 +++++
.../MvccEntitySerializationStrategy.java | 7 +-
.../MvccEntitySerializationStrategyImpl.java | 227 ----------
.../MvccLogEntrySerializationStrategy.java | 2 +-
.../MvccLogEntrySerializationStrategyImpl.java | 238 ----------
.../MvccEntitySerializationStrategyImpl.java | 238 ++++++++++
.../MvccLogEntrySerializationStrategyImpl.java | 239 ++++++++++
.../serialization/impl/SerializationModule.java | 45 ++
.../collection/service/TimeService.java | 12 +
.../collection/service/UUIDService.java | 15 +
.../collection/service/impl/ServiceModule.java | 34 ++
.../service/impl/TimeServiceImpl.java | 14 +
.../service/impl/UUIDServiceImpl.java | 17 +
.../collection/CollectionContextImplTest.java | 1 +
.../collection/guice/TestCollectionModule.java | 3 +-
.../mvcc/entity/MvccEntityImplTest.java | 132 ------
.../mvcc/entity/MvccLogEntryImplTest.java | 104 -----
.../collection/mvcc/entity/StageTest.java | 91 ----
.../mvcc/entity/impl/MvccEntityImplTest.java | 107 +++++
.../mvcc/entity/impl/MvccLogEntryImplTest.java | 95 ++++
.../collection/mvcc/entity/impl/StageTest.java | 93 ++++
.../collection/mvcc/stage/StartTest.java | 51 ---
.../mvcc/stage/impl/MvccEntityNewTest.java | 136 ++++++
...MvccEntitySerializationStrategyImplTest.java | 430 ------------------
...ccLogEntrySerializationStrategyImplTest.java | 311 -------------
.../serialization/SerializationComparison.java | 182 --------
...MvccEntitySerializationStrategyImplTest.java | 438 +++++++++++++++++++
...ccLogEntrySerializationStrategyImplTest.java | 319 ++++++++++++++
.../impl/SerializationComparison.java | 182 ++++++++
.../persistence/index/stage/Complete.java | 7 +-
.../usergrid/persistence/index/stage/Start.java | 6 +-
.../usergrid/persistence/index/stage/Write.java | 11 +-
66 files changed, 2989 insertions(+), 2520 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/pom.xml
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/pom.xml b/stack/corepersistence/collection/pom.xml
index 1a0f358..0f4eb6d 100644
--- a/stack/corepersistence/collection/pom.xml
+++ b/stack/corepersistence/collection/pom.xml
@@ -43,32 +43,31 @@
<version>${astynax.version}</version>
</dependency>
- <!-- bean utils for setting uuids etc -->
+ <!-- lang utils for setting uuids etc -->
<dependency>
- <groupId>commons-beanutils</groupId>
- <artifactId>commons-beanutils-core</artifactId>
- <version>1.8.3</version>
+ <groupId>org.apache.commons</groupId>
+ <artifactId>commons-lang3</artifactId>
+ <version>3.1</version>
</dependency>
-
<!-- Serialization libraries -->
<dependency>
- <groupId>org.codehaus.jackson</groupId>
- <artifactId>jackson-smile</artifactId>
- <version>1.9.13</version>
+ <groupId>org.codehaus.jackson</groupId>
+ <artifactId>jackson-smile</artifactId>
+ <version>1.9.13</version>
</dependency>
<dependency>
- <groupId>com.esotericsoftware.kryo</groupId>
- <artifactId>kryo</artifactId>
- <version>2.22</version>
+ <groupId>com.esotericsoftware.kryo</groupId>
+ <artifactId>kryo</artifactId>
+ <version>2.22</version>
</dependency>
<!-- helper serializers for kryo -->
<dependency>
- <groupId>de.javakaffee</groupId>
- <artifactId>kryo-serializers</artifactId>
- <version>0.26</version>
+ <groupId>de.javakaffee</groupId>
+ <artifactId>kryo-serializers</artifactId>
+ <version>0.26</version>
</dependency>
<!-- Google Guice -->
@@ -91,7 +90,11 @@
<version>${guice.version}</version>
</dependency>
-
+ <dependency>
+ <groupId>com.google.inject.extensions</groupId>
+ <artifactId>guice-assistedinject</artifactId>
+ <version>${guice.version}</version>
+ </dependency>
<!-- Google Guice Integration Test Injectors -->
@@ -102,7 +105,6 @@
<scope>test</scope>
</dependency>
-
<dependency>
<groupId>${project.parent.groupId}</groupId>
<artifactId>testutils</artifactId>
@@ -111,10 +113,10 @@
</dependency>
<dependency>
- <groupId>org.mockito</groupId>
- <artifactId>mockito-all</artifactId>
- <version>1.9.5</version>
- <scope>test</scope>
+ <groupId>org.mockito</groupId>
+ <artifactId>mockito-all</artifactId>
+ <version>1.9.5</version>
+ <scope>test</scope>
</dependency>
</dependencies>
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/CollectionContextImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/CollectionContextImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/CollectionContextImpl.java
deleted file mode 100644
index 1aef1d3..0000000
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/CollectionContextImpl.java
+++ /dev/null
@@ -1,93 +0,0 @@
-package org.apache.usergrid.persistence.collection;
-
-
-import java.util.UUID;
-
-import com.google.common.base.Preconditions;
-
-
-/**
- * Simple impl of hte collection context
- * @author tnine
- */
-public class CollectionContextImpl implements CollectionContext {
-
- private final UUID applicationId;
- private final UUID ownerId;
- private final String name;
-
-
- public CollectionContextImpl( final UUID applicationId, final UUID ownerId, final String name ) {
- Preconditions.checkNotNull( applicationId , "applicationId is required");
- Preconditions.checkNotNull( ownerId , "ownerId is required");
- Preconditions.checkNotNull( name , "name is required");
- Preconditions.checkArgument( name.length() > 0, "name must have a length" );
-
-
- this.applicationId = applicationId;
- this.ownerId = ownerId;
- this.name = name;
- }
-
-
- @Override
- public UUID getApplication() {
- return applicationId;
- }
-
-
- @Override
- public UUID getOwner() {
- return ownerId;
- }
-
-
- @Override
- public String getName() {
- return name;
- }
-
-
- @Override
- public boolean equals( final Object o ) {
- if ( this == o ) {
- return true;
- }
- if ( o == null || getClass() != o.getClass() ) {
- return false;
- }
-
- final CollectionContextImpl that = ( CollectionContextImpl ) o;
-
- if ( !applicationId.equals( that.applicationId ) ) {
- return false;
- }
- if ( !name.equals( that.name ) ) {
- return false;
- }
- if ( !ownerId.equals( that.ownerId ) ) {
- return false;
- }
-
- return true;
- }
-
-
- @Override
- public int hashCode() {
- int result = applicationId.hashCode();
- result = 31 * result + ownerId.hashCode();
- result = 31 * result + name.hashCode();
- return result;
- }
-
-
- @Override
- public String toString() {
- return "CollectionContextImpl{" +
- "applicationId=" + applicationId +
- ", ownerId=" + ownerId +
- ", name='" + name + '\'' +
- '}';
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/CollectionManager.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/CollectionManager.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/CollectionManager.java
index 570a1e4..53c14d6 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/CollectionManager.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/CollectionManager.java
@@ -20,14 +20,14 @@ public interface CollectionManager
*
* @param entity The entity to update
*/
- public void create( Entity entity );
+ public Entity create( Entity entity );
/**
* Update the entity with the given fields.
*
* @param entity The entity properties to update
*/
- public void update( Entity entity );
+ public Entity update( Entity entity );
/** Delete the entity and remove it's indexes with the given entity id */
public void delete( UUID entityId );
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/CollectionManagerFactoryImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/CollectionManagerFactoryImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/CollectionManagerFactoryImpl.java
deleted file mode 100644
index 3ce0e7b..0000000
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/CollectionManagerFactoryImpl.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package org.apache.usergrid.persistence.collection;
-
-
-/**
- * Basic Imple
- * @author tnine
- */
-public class CollectionManagerFactoryImpl implements CollectionManagerFactory {
-
-
- @Override
- public CollectionManager createCollectionManager( final CollectionContext context ) {
-// return new CollectionManagerImpl( context );
- return null;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/CollectionManagerImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/CollectionManagerImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/CollectionManagerImpl.java
deleted file mode 100644
index b5f0afb..0000000
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/CollectionManagerImpl.java
+++ /dev/null
@@ -1,81 +0,0 @@
-package org.apache.usergrid.persistence.collection;
-
-
-import java.util.UUID;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import org.apache.commons.beanutils.BeanUtils;
-
-import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntityImpl;
-import org.apache.usergrid.persistence.model.entity.Entity;
-import org.apache.usergrid.persistence.model.util.UUIDGenerator;
-
-
-/**
- * Simple implementation. Should perform
- * @author tnine
- */
-public class CollectionManagerImpl implements CollectionManager {
-
- private static final Logger logger = LoggerFactory.getLogger(CollectionManagerImpl.class);
-
- private final CollectionContext context;
- private final TimeService timeService;
-
-
-
- public CollectionManagerImpl( final CollectionContext context, final TimeService timeService ) {
- this.context = context;
- this.timeService = timeService;
- }
-
-
- @Override
- public void create( final Entity entity ) {
-
- final UUID entityId = UUIDGenerator.newTimeUUID();
- final UUID version = entityId;
- final long created = timeService.getTime();
-
-
- try {
- BeanUtils.setProperty(entity, "uuid", entityId);
- }
- catch ( Throwable t ) {
- logger.error( "Unable to set uuid. See nested exception", t );
- throw new RuntimeException( "Unable to set uuid. See nested exception", t );
- }
-
- entity.setVersion( version );
- entity.setCreated( created );
- entity.setUpdated( created );
-
- MvccEntityImpl mvccEntity = new MvccEntityImpl(context, entityId, version, entity );
-
-
-
- }
-
-
- @Override
- public void update( final Entity entity ) {
- //To change body of implemented methods use File | Settings | File Templates.
- }
-
-
- @Override
- public void delete( final UUID entityId ) {
- //To change body of implemented methods use File | Settings | File Templates.
- }
-
-
- @Override
- public Entity load( final UUID entityId ) {
- return null; //To change body of implemented methods use File | Settings | File Templates.
- }
-
-
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/TimeService.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/TimeService.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/TimeService.java
deleted file mode 100644
index eea1e36..0000000
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/TimeService.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package org.apache.usergrid.persistence.collection;
-
-
-/** @author tnine */
-public interface TimeService {
-
- /**
- * Get the current time in milliseconds since epoch
- * @return
- */
- long getTime();
-}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/exception/CollectionRuntimeException.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/exception/CollectionRuntimeException.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/exception/CollectionRuntimeException.java
new file mode 100644
index 0000000..9696bc1
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/exception/CollectionRuntimeException.java
@@ -0,0 +1,29 @@
+package org.apache.usergrid.persistence.collection.exception;
+
+
+/** @author tnine */
+public class CollectionRuntimeException extends RuntimeException {
+ public CollectionRuntimeException() {
+ }
+
+
+ public CollectionRuntimeException( final String message ) {
+ super( message );
+ }
+
+
+ public CollectionRuntimeException( final String message, final Throwable cause ) {
+ super( message, cause );
+ }
+
+
+ public CollectionRuntimeException( final Throwable cause ) {
+ super( cause );
+ }
+
+
+ public CollectionRuntimeException( final String message, final Throwable cause, final boolean enableSuppression,
+ final boolean writableStackTrace ) {
+ super( message, cause, enableSuppression, writableStackTrace );
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/guice/CollectionModule.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/guice/CollectionModule.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/guice/CollectionModule.java
index 5f5d544..80f48d7 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/guice/CollectionModule.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/guice/CollectionModule.java
@@ -1,24 +1,15 @@
package org.apache.usergrid.persistence.collection.guice;
+import java.util.Properties;
+
import org.apache.usergrid.persistence.collection.astynax.AstynaxKeyspaceProvider;
-import org.apache.usergrid.persistence.collection.migration.Migration;
-import org.apache.usergrid.persistence.collection.migration.MigrationManager;
-import org.apache.usergrid.persistence.collection.migration.MigrationManagerImpl;
-import org.apache.usergrid.persistence.collection.mvcc.stage.StagePipeline;
-import org.apache.usergrid.persistence.collection.mvcc.stage.impl.CreatePipeline;
-import org.apache.usergrid.persistence.collection.mvcc.stage.impl.DeletePipeline;
-import org.apache.usergrid.persistence.collection.mvcc.stage.impl.UpdatePipeline;
-import org.apache.usergrid.persistence.collection.serialization.MvccEntitySerializationStrategy;
-import org.apache.usergrid.persistence.collection.serialization.MvccEntitySerializationStrategyImpl;
-import org.apache.usergrid.persistence.collection.serialization.MvccLogEntrySerializationStrategy;
-import org.apache.usergrid.persistence.collection.serialization.MvccLogEntrySerializationStrategyImpl;
+import org.apache.usergrid.persistence.collection.mvcc.stage.impl.CollectionPipelineModule;
+import org.apache.usergrid.persistence.collection.serialization.impl.SerializationModule;
+import org.apache.usergrid.persistence.collection.service.impl.ServiceModule;
import com.google.inject.AbstractModule;
-import com.google.inject.Provides;
-import com.google.inject.multibindings.Multibinder;
import com.google.inject.name.Names;
-import com.netflix.astyanax.Keyspace;
/**
@@ -35,56 +26,33 @@ public class CollectionModule extends AbstractModule {
@Override
protected void configure() {
+ /**
+ * Load our properties for the entire colleciton module
+ *
+ */
//bind our cassandra properties
- Names.bindProperties( binder(), PropertyUtils.loadFromClassPath( CASS_PROPS ) );
+
+ Properties props = PropertyUtils.loadFromClassPath( CASS_PROPS );
+
+ Names.bindProperties( binder(), props );
//Load the cassandra url if set on the system properties
Names.bindProperties( binder(),
PropertyUtils.loadSystemProperties( AstynaxKeyspaceProvider.getRuntimeOptions() ) );
- //bind our keyspace to the AstynaxKeyspaceProvider
- bind( Keyspace.class ).toProvider( AstynaxKeyspaceProvider.class );
-
- //bind our migration manager
- bind( MigrationManager.class ).to( MigrationManagerImpl.class );
-
-
- //bind the serialization strategies
-
- bind( MvccEntitySerializationStrategy.class ).to( MvccEntitySerializationStrategyImpl.class );
-
- bind( MvccLogEntrySerializationStrategy.class ).to( MvccLogEntrySerializationStrategyImpl.class );
+ //TODO allow override of all properties in the file by the system
- //do multibindings for migrations
- Multibinder<Migration> uriBinder = Multibinder.newSetBinder( binder(), Migration.class );
-
- uriBinder.addBinding().to( MvccEntitySerializationStrategyImpl.class );
- uriBinder.addBinding().to( MvccLogEntrySerializationStrategyImpl.class );
- }
-
-
- /** Wire the pipeline of operations for create. This should create a new
- * instance every time, since StagePipeline objects are mutable */
- @Provides
- @CreatePipeline
- public StagePipeline createWritePipeline() {
- return null; //To change body of created methods use File | Settings | File Templates.
- }
-
-
- @Provides
- @DeletePipeline
- public StagePipeline deletePipeline() {
- return null; //To change body of created methods use File | Settings | File Templates.
- }
+ /**
+ * Install the write pipeline configuration
+ */
+ install( new CollectionPipelineModule() );
+ //Install serialization modules
+ install( new SerializationModule());
- @Provides
- @UpdatePipeline
- public StagePipeline updatePipeline() {
- return null; //To change body of created methods use File | Settings | File Templates.
+ install (new ServiceModule());
}
}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/impl/CollectionContextImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/impl/CollectionContextImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/impl/CollectionContextImpl.java
new file mode 100644
index 0000000..5f2d334
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/impl/CollectionContextImpl.java
@@ -0,0 +1,95 @@
+package org.apache.usergrid.persistence.collection.impl;
+
+
+import java.util.UUID;
+
+import org.apache.usergrid.persistence.collection.CollectionContext;
+
+import com.google.common.base.Preconditions;
+
+
+/**
+ * Simple impl of hte collection context
+ * @author tnine
+ */
+public class CollectionContextImpl implements CollectionContext {
+
+ private final UUID applicationId;
+ private final UUID ownerId;
+ private final String name;
+
+
+ public CollectionContextImpl( final UUID applicationId, final UUID ownerId, final String name ) {
+ Preconditions.checkNotNull( applicationId , "applicationId is required");
+ Preconditions.checkNotNull( ownerId , "ownerId is required");
+ Preconditions.checkNotNull( name , "name is required");
+ Preconditions.checkArgument( name.length() > 0, "name must have a length" );
+
+
+ this.applicationId = applicationId;
+ this.ownerId = ownerId;
+ this.name = name;
+ }
+
+
+ @Override
+ public UUID getApplication() {
+ return applicationId;
+ }
+
+
+ @Override
+ public UUID getOwner() {
+ return ownerId;
+ }
+
+
+ @Override
+ public String getName() {
+ return name;
+ }
+
+
+ @Override
+ public boolean equals( final Object o ) {
+ if ( this == o ) {
+ return true;
+ }
+ if ( o == null || getClass() != o.getClass() ) {
+ return false;
+ }
+
+ final CollectionContextImpl that = ( CollectionContextImpl ) o;
+
+ if ( !applicationId.equals( that.applicationId ) ) {
+ return false;
+ }
+ if ( !name.equals( that.name ) ) {
+ return false;
+ }
+ if ( !ownerId.equals( that.ownerId ) ) {
+ return false;
+ }
+
+ return true;
+ }
+
+
+ @Override
+ public int hashCode() {
+ int result = applicationId.hashCode();
+ result = 31 * result + ownerId.hashCode();
+ result = 31 * result + name.hashCode();
+ return result;
+ }
+
+
+ @Override
+ public String toString() {
+ return "CollectionContextImpl{" +
+ "applicationId=" + applicationId +
+ ", ownerId=" + ownerId +
+ ", name='" + name + '\'' +
+ '}';
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/impl/CollectionManagerFactoryImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/impl/CollectionManagerFactoryImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/impl/CollectionManagerFactoryImpl.java
new file mode 100644
index 0000000..2ab0761
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/impl/CollectionManagerFactoryImpl.java
@@ -0,0 +1,21 @@
+package org.apache.usergrid.persistence.collection.impl;
+
+
+import org.apache.usergrid.persistence.collection.CollectionContext;
+import org.apache.usergrid.persistence.collection.CollectionManager;
+import org.apache.usergrid.persistence.collection.CollectionManagerFactory;
+
+
+/**
+ * Basic Imple
+ * @author tnine
+ */
+public class CollectionManagerFactoryImpl implements CollectionManagerFactory {
+
+
+ @Override
+ public CollectionManager createCollectionManager( final CollectionContext context ) {
+// return new CollectionManagerImpl( context );
+ return null;
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/impl/CollectionManagerImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/impl/CollectionManagerImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/impl/CollectionManagerImpl.java
new file mode 100644
index 0000000..72ed6ce
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/impl/CollectionManagerImpl.java
@@ -0,0 +1,77 @@
+package org.apache.usergrid.persistence.collection.impl;
+
+
+import java.util.UUID;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.usergrid.persistence.collection.CollectionContext;
+import org.apache.usergrid.persistence.collection.CollectionManager;
+import org.apache.usergrid.persistence.collection.service.TimeService;
+import org.apache.usergrid.persistence.collection.mvcc.stage.WriteContext;
+import org.apache.usergrid.persistence.collection.mvcc.stage.WriteContextFactory;
+import org.apache.usergrid.persistence.model.entity.Entity;
+
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+
+
+/**
+ * Simple implementation. Should perform
+ *
+ * @author tnine
+ */
+public class CollectionManagerImpl implements CollectionManager {
+
+ private static final Logger logger = LoggerFactory.getLogger( CollectionManagerImpl.class );
+
+ private final CollectionContext context;
+ private final TimeService timeService;
+ private final WriteContextFactory factory;
+
+
+ @Inject
+ public CollectionManagerImpl( final TimeService timeService, final WriteContextFactory factory,
+ @Assisted final CollectionContext context ) {
+ this.context = context;
+ this.timeService = timeService;
+ this.factory = factory;
+ }
+
+
+ @Override
+ public Entity create( final Entity entity ) {
+ // Create a new context for the write
+ WriteContext writeContext = factory.newCreateContext( context );
+
+ //perform the write
+ writeContext.performWrite( entity );
+
+ //TODO this shouldn't block, give a callback
+ return writeContext.getMessage( Entity.class );
+
+ }
+
+
+ @Override
+ public Entity update( final Entity entity ) {
+ return null;
+ }
+
+
+ @Override
+ public void delete( final UUID entityId ) {
+ WriteContext deleteContext = factory.newDeleteContext(context);
+
+ deleteContext.performWrite( entityId );
+
+ deleteContext.getMessage(Void.class);
+ }
+
+
+ @Override
+ public Entity load( final UUID entityId ) {
+ return null; //To change body of implemented methods use File | Settings | File Templates.
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/entity/MvccEntity.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/entity/MvccEntity.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/entity/MvccEntity.java
index 3e544ad..cc212c8 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/entity/MvccEntity.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/entity/MvccEntity.java
@@ -31,8 +31,4 @@ public interface MvccEntity {
*/
UUID getUuid();
- /**
- * Get the collection context this entity belongs i
- */
- CollectionContext getContext();
}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/entity/MvccEntityImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/entity/MvccEntityImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/entity/MvccEntityImpl.java
deleted file mode 100644
index b85b314..0000000
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/entity/MvccEntityImpl.java
+++ /dev/null
@@ -1,110 +0,0 @@
-package org.apache.usergrid.persistence.collection.mvcc.entity;
-
-
-import java.util.UUID;
-
-import org.apache.usergrid.persistence.collection.CollectionContext;
-import org.apache.usergrid.persistence.model.entity.Entity;
-
-import com.google.common.base.Optional;
-import com.google.common.base.Preconditions;
-
-
-/** @author tnine */
-public class MvccEntityImpl implements MvccEntity {
-
- private final CollectionContext context;
- private final UUID entityId;
- private final UUID version;
- private final Optional<Entity> entity;
-
-
- public MvccEntityImpl( final CollectionContext context, final UUID entityId, final UUID version,
- final Entity entity ) {
- this( context, entityId, version, Optional.of( entity ) );
- }
-
-
- public MvccEntityImpl( final CollectionContext context, final UUID entityId, final UUID version,
- final Optional<Entity> entity ) {
- Preconditions.checkNotNull( context, "context is required" );
- Preconditions.checkNotNull( entityId, "entity id is required" );
- Preconditions.checkNotNull( version, "version id is required" );
- Preconditions.checkNotNull( entity, "entity is required" );
-
- this.context = context;
- this.entityId = entityId;
- this.version = version;
- this.entity = entity;
- }
-
-
- @Override
- public Optional<Entity> getEntity() {
- return entity;
- }
-
-
- @Override
- public UUID getVersion() {
- return version;
- }
-
-
- @Override
- public UUID getUuid() {
- return entityId;
- }
-
-
- @Override
- public CollectionContext getContext() {
- return context;
- }
-
-
- @Override
- public boolean equals( final Object o ) {
- if ( this == o ) {
- return true;
- }
- if ( o == null || getClass() != o.getClass() ) {
- return false;
- }
-
- final MvccEntityImpl that = ( MvccEntityImpl ) o;
-
- if ( !context.equals( that.context ) ) {
- return false;
- }
- if ( !getUuid().equals( that.getUuid() ) ) {
- return false;
- }
-
- if ( !getVersion().equals( that.getVersion() ) ) {
- return false;
- }
-
- return true;
- }
-
-
- @Override
- public int hashCode() {
- int result = context.hashCode();
- result = 31 * result + getUuid().hashCode();
- result = 31 * result + getVersion().hashCode();
- return result;
- }
-
-
- @Override
- public String toString() {
- return "MvccEntityImpl{" +
- "context=" + context +
- ", entityId=" + entityId +
- ", version=" + version +
- ", entity=" + entity +
- '}';
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/entity/MvccLogEntry.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/entity/MvccLogEntry.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/entity/MvccLogEntry.java
index 40ff498..c6886d1 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/entity/MvccLogEntry.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/entity/MvccLogEntry.java
@@ -29,10 +29,5 @@ public interface MvccLogEntry {
*/
UUID getVersion();
- /**
- * Get the context of the entity
- * @return
- */
- CollectionContext getContext();
}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/entity/MvccLogEntryImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/entity/MvccLogEntryImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/entity/MvccLogEntryImpl.java
deleted file mode 100644
index 91e68ef..0000000
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/entity/MvccLogEntryImpl.java
+++ /dev/null
@@ -1,113 +0,0 @@
-package org.apache.usergrid.persistence.collection.mvcc.entity;
-
-
-import java.util.UUID;
-
-import org.apache.usergrid.persistence.collection.CollectionContext;
-
-import com.google.common.base.Preconditions;
-
-
-/**
- * The simple implementation of a log entry
- *
- * @author tnine
- */
-public class MvccLogEntryImpl implements MvccLogEntry {
-
- private final CollectionContext context;
- private final UUID entityId;
- private final UUID version;
- private final Stage stage;
-
-
- public MvccLogEntryImpl( final CollectionContext context, final UUID entityId, final UUID version,
- final Stage stage ) {
-
- Preconditions.checkNotNull( context, "context is required" );
- Preconditions.checkNotNull( entityId, "entity id is required" );
- Preconditions.checkNotNull( version, "version id is required" );
- Preconditions.checkNotNull( stage, "entity is required" );
-
-
- this.context = context;
- this.entityId = entityId;
- this.version = version;
- this.stage = stage;
- }
-
-
- @Override
- public Stage getStage() {
- return stage;
- }
-
-
- @Override
- public UUID getEntityId() {
- return entityId;
- }
-
-
- @Override
- public UUID getVersion() {
- return version;
- }
-
-
- @Override
- public CollectionContext getContext() {
- return context;
- }
-
-
- @Override
- public boolean equals( final Object o ) {
- if ( this == o ) {
- return true;
- }
- if ( o == null || getClass() != o.getClass() ) {
- return false;
- }
-
- final MvccLogEntryImpl that = ( MvccLogEntryImpl ) o;
-
- if ( !context.equals( that.context ) ) {
- return false;
- }
- if ( !entityId.equals( that.entityId ) ) {
- return false;
- }
- if ( !version.equals( that.version ) ) {
- return false;
- }
-
- if ( stage != that.stage ) {
- return false;
- }
-
-
- return true;
- }
-
-
- @Override
- public int hashCode() {
- int result = context.hashCode();
- result = 31 * result + entityId.hashCode();
- result = 31 * result + version.hashCode();
- result = 31 * result + stage.hashCode();
- return result;
- }
-
-
- @Override
- public String toString() {
- return "MvccLogEntryImpl{" +
- "context=" + context +
- ", entityId=" + entityId +
- ", version=" + version +
- ", stage=" + stage +
- '}';
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/entity/impl/MvccEntityImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/entity/impl/MvccEntityImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/entity/impl/MvccEntityImpl.java
new file mode 100644
index 0000000..1179dad
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/entity/impl/MvccEntityImpl.java
@@ -0,0 +1,98 @@
+package org.apache.usergrid.persistence.collection.mvcc.entity.impl;
+
+
+import java.util.UUID;
+
+import org.apache.usergrid.persistence.collection.CollectionContext;
+import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntity;
+import org.apache.usergrid.persistence.model.entity.Entity;
+
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
+
+
+/** @author tnine */
+public class MvccEntityImpl implements MvccEntity {
+
+ private final UUID entityId;
+ private final UUID version;
+ private final Optional<Entity> entity;
+
+
+ public MvccEntityImpl( final UUID entityId, final UUID version,
+ final Entity entity ) {
+ this( entityId, version, Optional.of( entity ) );
+ }
+
+
+ public MvccEntityImpl( final UUID entityId, final UUID version,
+ final Optional<Entity> entity ) {
+ Preconditions.checkNotNull( entityId, "entity id is required" );
+ Preconditions.checkNotNull( version, "version id is required" );
+ Preconditions.checkNotNull( entity, "entity is required" );
+
+ this.entityId = entityId;
+ this.version = version;
+ this.entity = entity;
+ }
+
+
+ @Override
+ public Optional<Entity> getEntity() {
+ return entity;
+ }
+
+
+ @Override
+ public UUID getVersion() {
+ return version;
+ }
+
+
+ @Override
+ public UUID getUuid() {
+ return entityId;
+ }
+
+
+
+ @Override
+ public boolean equals( final Object o ) {
+ if ( this == o ) {
+ return true;
+ }
+ if ( o == null || getClass() != o.getClass() ) {
+ return false;
+ }
+
+ final MvccEntityImpl that = ( MvccEntityImpl ) o;
+
+ if ( !getUuid().equals( that.getUuid() ) ) {
+ return false;
+ }
+
+ if ( !getVersion().equals( that.getVersion() ) ) {
+ return false;
+ }
+
+ return true;
+ }
+
+
+ @Override
+ public int hashCode() {
+ int result = 31 * getUuid().hashCode();
+ result = 31 * result + getVersion().hashCode();
+ return result;
+ }
+
+
+ @Override
+ public String toString() {
+ return "MvccEntityImpl{" +
+ ", entityId=" + entityId +
+ ", version=" + version +
+ ", entity=" + entity +
+ '}';
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/entity/impl/MvccLogEntryImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/entity/impl/MvccLogEntryImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/entity/impl/MvccLogEntryImpl.java
new file mode 100644
index 0000000..2f0b4d7
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/entity/impl/MvccLogEntryImpl.java
@@ -0,0 +1,100 @@
+package org.apache.usergrid.persistence.collection.mvcc.entity.impl;
+
+
+import java.util.UUID;
+
+import org.apache.usergrid.persistence.collection.CollectionContext;
+import org.apache.usergrid.persistence.collection.mvcc.entity.MvccLogEntry;
+import org.apache.usergrid.persistence.collection.mvcc.entity.Stage;
+
+import com.google.common.base.Preconditions;
+
+
+/**
+ * The simple implementation of a log entry
+ *
+ * @author tnine
+ */
+public class MvccLogEntryImpl implements MvccLogEntry {
+
+ private final UUID entityId;
+ private final UUID version;
+ private final Stage stage;
+
+
+ public MvccLogEntryImpl( final UUID entityId, final UUID version,
+ final Stage stage ) {
+ Preconditions.checkNotNull( entityId, "entity id is required" );
+ Preconditions.checkNotNull( version, "version id is required" );
+ Preconditions.checkNotNull( stage, "entity is required" );
+
+
+ this.entityId = entityId;
+ this.version = version;
+ this.stage = stage;
+ }
+
+
+ @Override
+ public Stage getStage() {
+ return stage;
+ }
+
+
+ @Override
+ public UUID getEntityId() {
+ return entityId;
+ }
+
+
+ @Override
+ public UUID getVersion() {
+ return version;
+ }
+
+
+ @Override
+ public boolean equals( final Object o ) {
+ if ( this == o ) {
+ return true;
+ }
+ if ( o == null || getClass() != o.getClass() ) {
+ return false;
+ }
+
+ final MvccLogEntryImpl that = ( MvccLogEntryImpl ) o;
+
+ if ( !entityId.equals( that.entityId ) ) {
+ return false;
+ }
+ if ( !version.equals( that.version ) ) {
+ return false;
+ }
+
+ if ( stage != that.stage ) {
+ return false;
+ }
+
+
+ return true;
+ }
+
+
+ @Override
+ public int hashCode() {
+ int result = 31 * entityId.hashCode();
+ result = 31 * result + version.hashCode();
+ result = 31 * result + stage.hashCode();
+ return result;
+ }
+
+
+ @Override
+ public String toString() {
+ return "MvccLogEntryImpl{" +
+ ", entityId=" + entityId +
+ ", version=" + version +
+ ", stage=" + stage +
+ '}';
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/event/PostProcessListener.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/event/PostProcessListener.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/event/PostProcessListener.java
index 47ad997..29e6515 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/event/PostProcessListener.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/event/PostProcessListener.java
@@ -9,16 +9,16 @@ import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntity;
* @author: tnine
*
*/
-public interface PostProcessListener<T extends MvccEntity>
+public interface PostProcessListener<T>
{
/**
* The entity was rejected by the MVCC system and will be removed
*
- * @param mvccEntity The mvcc entity to perform post processing on
+ * @param data The data used in the write pipeline
* @return the MvccEntity to use during this stage
*/
- public MvccEntity doPostProcessing(MvccEntity mvccEntity );
+ public T doPostProcessing(T data );
}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/MvccStrategy.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/MvccStrategy.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/MvccStrategy.java
deleted file mode 100644
index c11f420..0000000
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/MvccStrategy.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package org.apache.usergrid.persistence.collection.mvcc.stage;
-
-
-import java.util.UUID;
-
-import org.apache.usergrid.persistence.collection.CollectionContext;
-import org.apache.usergrid.persistence.model.entity.Entity;
-
-
-/**
- * Interface to define mvcc operations
- *
- * TODO: Not sure we need this any more
- */
-public interface MvccStrategy {
-
- /**
- * Start progress through states for this entity
- *
- * @param context The context this entity belongs in
- * @param entityId The entity id to assign to this entity
- * @param entity The entity values to write
- */
- public WriteStage beingWrite( CollectionContext context, UUID entityId, Entity entity );
-
-
- /**
- * Get the current stage of the entity in the context at the current version. Should be used for write verification
- * on resume
- *
- * @param context The context this entity belongs in
- * @param entityId The entity Id to search for in the context
- * @param version The version of the entityId to review
- */
- public WriteStage getCurrentState( CollectionContext context, UUID entityId, UUID version );
-
-
- /**
- * Get the write stage of the entity in the context with a version <= the current version and a stage of Comitted
- */
- public WriteStage getCurrentStateOfEntity( CollectionContext context, UUID entityId, UUID maxVersion );
-}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/StagePipeline.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/StagePipeline.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/StagePipeline.java
index 562d852..7e88915 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/StagePipeline.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/StagePipeline.java
@@ -11,9 +11,9 @@ public interface StagePipeline {
/**
- * Get the next stage in this pipeline. Will return null if there are no more stages to execute
+ * Get the first stage in this pipeline. Will return null if there are no more stages to execute
*/
- public WriteStage next();
+ WriteStage first();
/**
@@ -22,15 +22,34 @@ public interface StagePipeline {
*
* @param stage
*/
- public void insert(WriteStage stage);
+ void insert(WriteStage stage);
/**
* Add a new stage to the end of the pipline
* @param stage
*/
- public void addLast(WriteStage stage);
+ void addLast(WriteStage stage);
+ /**
+ * get the next stage after this one
+ * @param stage
+ */
+ WriteStage nextStage(WriteStage stage);
+
+
+ /**
+ * Get the last stage in this pipeline
+ * @return
+ */
+ WriteStage last();
+
+ /**
+ * Get the current stage in the pipeline
+ * @return
+ */
+ WriteStage current();
+
}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/WriteContext.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/WriteContext.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/WriteContext.java
index 42cb6ab..4f5d82a 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/WriteContext.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/WriteContext.java
@@ -1,7 +1,12 @@
package org.apache.usergrid.persistence.collection.mvcc.stage;
+import java.util.Collection;
+import java.util.List;
+
+import org.apache.usergrid.persistence.collection.CollectionContext;
import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntity;
+import org.apache.usergrid.persistence.collection.mvcc.event.PostProcessListener;
/** @author tnine */
@@ -16,9 +21,46 @@ public interface WriteContext {
/**
* Perform the write in the context with the specified entity
- * @param entity
+ * @param inputData The data to use to being the write
+ */
+ void performWrite(Object inputData);
+
+
+ /**
+ * Get the current message. If the message is not the right type at runtime, an assertion exception will be thrown
+ * @return
+ */
+ <T> T getMessage(Class<T> clazz);
+
+ /**
+ * Set the message into the write context
+ * @return
+ */
+ Object setMessage(Object object);
+
+
+ /**
+ * Signal that the next stage in the write should proceed
+ */
+ void proceed();
+
+ /**
+ * Signal we should stop processing
+ */
+ void stop();
+
+
+ /**
+ * Add a post process listener to this write context
+ * @return A list of all post proces
+ */
+ Collection<PostProcessListener> getPostProcessors();
+
+ /**
+ * Return the current collection context
+ * @return
*/
- void nextStage(MvccEntity entity);
+ CollectionContext getCollectionContext();
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/WriteContextFactory.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/WriteContextFactory.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/WriteContextFactory.java
new file mode 100644
index 0000000..99da0fb
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/WriteContextFactory.java
@@ -0,0 +1,30 @@
+package org.apache.usergrid.persistence.collection.mvcc.stage;
+
+
+import java.util.UUID;
+
+import org.apache.usergrid.persistence.collection.CollectionContext;
+import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntity;
+import org.apache.usergrid.persistence.model.entity.Entity;
+
+
+/** @author tnine */
+public interface WriteContextFactory {
+
+ /**
+ * Return a new write context for the given stage pipeline
+ * @param
+ * @return A write context that can be used for creating entities. Returns the new entity to use after
+ * the write has completed
+ */
+ WriteContext newCreateContext(CollectionContext context);
+
+ /**
+ * Create a write context that cna be used for deleting entitie
+ * @return
+ */
+ WriteContext newDeleteContext(CollectionContext context);
+
+
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/WriteStage.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/WriteStage.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/WriteStage.java
index a45df6b..3f80348 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/WriteStage.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/WriteStage.java
@@ -9,17 +9,18 @@ import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
/**
* The possible stages in our write flow.
*/
-public interface WriteStage {
+public interface WriteStage{
/**
* Run this stage. This will return the MvccEntity that should be returned or passed to the next stage
*
*
* @param context The context of the current write operation
- * @param entity The entity to use in this stage
*
* @return The asynchronous listener to signal success
*
*/
- public void performStage( WriteContext context, MvccEntity entity ) throws ConnectionException;
+ public void performStage( WriteContext context);
+
+
}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/CollectionPipelineModule.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/CollectionPipelineModule.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/CollectionPipelineModule.java
index 809d92f..16735ca 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/CollectionPipelineModule.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/CollectionPipelineModule.java
@@ -1,13 +1,20 @@
package org.apache.usergrid.persistence.collection.mvcc.stage.impl;
+import org.apache.usergrid.persistence.collection.migration.Migration;
+import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntity;
import org.apache.usergrid.persistence.collection.mvcc.stage.StagePipeline;
+import org.apache.usergrid.persistence.collection.mvcc.stage.WriteStage;
import org.apache.usergrid.persistence.collection.serialization.MvccEntitySerializationStrategy;
import org.apache.usergrid.persistence.collection.serialization.MvccLogEntrySerializationStrategy;
+import org.apache.usergrid.persistence.collection.serialization.impl.MvccEntitySerializationStrategyImpl;
+import org.apache.usergrid.persistence.collection.serialization.impl.MvccLogEntrySerializationStrategyImpl;
import com.google.inject.AbstractModule;
import com.google.inject.Inject;
import com.google.inject.Provides;
+import com.google.inject.assistedinject.FactoryModuleBuilder;
+import com.google.inject.multibindings.Multibinder;
/**
@@ -17,38 +24,37 @@ import com.google.inject.Provides;
*/
public class CollectionPipelineModule extends AbstractModule {
- @Inject
- private MvccLogEntrySerializationStrategy mvccLogEntrySerializationStrategy;
-
- @Inject
- private MvccEntitySerializationStrategy mvccEntitySerializationStrategy;
-
/** Wire the pipeline of operations for create. This should create a new
* instance every time, since StagePipeline objects are mutable */
@Provides
@CreatePipeline
- public StagePipeline createWritePipeline() {
- return StagePipelineImpl.fromStages( new Start( mvccLogEntrySerializationStrategy ), new Write(), new Commit() );
+ @Inject
+ public StagePipeline createWritePipeline(MvccEntityNew start, MvccEntityWrite write, MvccEntityCommit commit) {
+ return StagePipelineImpl.fromStages(start, write, commit );
}
@Provides
@DeletePipeline
public StagePipeline deletePipeline() {
- return null; //To change body of created methods use File | Settings | File Templates.
+ return StagePipelineImpl.fromStages( );
}
- @Provides
- @UpdatePipeline
- public StagePipeline updatePipeline() {
- return createWritePipeline();
- }
-
@Override
protected void configure() {
- //no op, we get our values from the provides above
+
+ /**
+ * Configure all stages here
+ */
+ Multibinder<WriteStage> stageBinder = Multibinder.newSetBinder( binder(), WriteStage.class );
+
+ stageBinder.addBinding().to( MvccEntityNew.class );
+ stageBinder.addBinding().to( MvccEntityWrite.class );
+ stageBinder.addBinding().to( MvccEntityCommit.class );
+
+
}
}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Commit.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Commit.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Commit.java
deleted file mode 100644
index 378e649..0000000
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Commit.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package org.apache.usergrid.persistence.collection.mvcc.stage.impl;
-
-
-import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntity;
-import org.apache.usergrid.persistence.collection.mvcc.stage.WriteContext;
-import org.apache.usergrid.persistence.collection.mvcc.stage.WriteStage;
-
-import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
-
-
-/**
- * This phase should invoke any finalization, and mark the entity as committed in the data store before returning
- */
-public class Commit implements WriteStage {
-
- public Commit(){
-
- }
-
- @Override
- public void performStage( final WriteContext context, final MvccEntity entity ) throws ConnectionException {
- //To change body of implemented methods use File | Settings | File Templates.
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/MvccEntityCommit.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/MvccEntityCommit.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/MvccEntityCommit.java
new file mode 100644
index 0000000..88bfca6
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/MvccEntityCommit.java
@@ -0,0 +1,28 @@
+package org.apache.usergrid.persistence.collection.mvcc.stage.impl;
+
+
+import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntity;
+import org.apache.usergrid.persistence.collection.mvcc.stage.WriteContext;
+import org.apache.usergrid.persistence.collection.mvcc.stage.WriteStage;
+
+import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
+
+
+/**
+ * This phase should invoke any finalization, and mark the entity as committed in the data store before returning
+ */
+public class MvccEntityCommit implements WriteStage {
+
+ public MvccEntityCommit(){
+
+ }
+
+
+ @Override
+ public void performStage( final WriteContext context ) {
+ //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/MvccEntityNew.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/MvccEntityNew.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/MvccEntityNew.java
new file mode 100644
index 0000000..576394a
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/MvccEntityNew.java
@@ -0,0 +1,116 @@
+package org.apache.usergrid.persistence.collection.mvcc.stage.impl;
+
+
+import java.util.UUID;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.commons.lang3.reflect.FieldUtils;
+
+import org.apache.usergrid.persistence.collection.CollectionContext;
+import org.apache.usergrid.persistence.collection.service.TimeService;
+import org.apache.usergrid.persistence.collection.exception.CollectionRuntimeException;
+import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntity;
+import org.apache.usergrid.persistence.collection.mvcc.entity.MvccLogEntry;
+import org.apache.usergrid.persistence.collection.mvcc.entity.Stage;
+import org.apache.usergrid.persistence.collection.mvcc.entity.impl.MvccEntityImpl;
+import org.apache.usergrid.persistence.collection.mvcc.entity.impl.MvccLogEntryImpl;
+import org.apache.usergrid.persistence.collection.mvcc.stage.WriteContext;
+import org.apache.usergrid.persistence.collection.mvcc.stage.WriteStage;
+import org.apache.usergrid.persistence.collection.serialization.MvccLogEntrySerializationStrategy;
+import org.apache.usergrid.persistence.collection.service.UUIDService;
+import org.apache.usergrid.persistence.model.entity.Entity;
+import org.apache.usergrid.persistence.model.util.UUIDGenerator;
+
+import com.google.common.base.Preconditions;
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.inject.Inject;
+import com.netflix.astyanax.MutationBatch;
+import com.netflix.astyanax.connectionpool.OperationResult;
+import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
+
+
+/**
+ * This is the first stage and should be invoked immediately when a write is started. It should persist the start of a
+ * new write in the data store for a checkpoint and recovery
+ */
+public class MvccEntityNew implements WriteStage {
+
+ private static final Logger LOG = LoggerFactory.getLogger( MvccEntityNew.class );
+
+ private final MvccLogEntrySerializationStrategy logStrategy;
+ private final TimeService timeService;
+ private final UUIDService uuidService;
+
+
+
+ /** Create a new stage with the current context */
+ @Inject
+ public MvccEntityNew( final MvccLogEntrySerializationStrategy logStrategy, final TimeService timeService,
+ final UUIDService uuidService ) {
+ this.logStrategy = logStrategy;
+ this.timeService = timeService;
+ this.uuidService = uuidService;
+ }
+
+
+ /**
+ * Create the entity Id and inject it, as well as set the timestamp versions
+ * @param writeContext The context of the current write operation
+ */
+ @Override
+ public void performStage( final WriteContext writeContext) {
+
+ final Entity entity = writeContext.getMessage(Entity.class);
+
+ Preconditions.checkNotNull( entity, "Entity is required in the new stage of the mvcc write" );
+
+
+ final UUID entityId = uuidService.newTimeUUID();
+ final UUID version = entityId;
+ final long created = timeService.getTime();
+
+
+ try {
+ FieldUtils.writeDeclaredField( entity, "uuid", entityId );
+ }
+ catch ( Throwable t ) {
+ LOG.error( "Unable to set uuid. See nested exception", t );
+ throw new CollectionRuntimeException( "Unable to set uuid. See nested exception", t );
+ }
+
+ entity.setVersion( version );
+ entity.setCreated( created );
+ entity.setUpdated( created );
+
+ final CollectionContext collectionContext = writeContext.getCollectionContext();
+
+
+ final MvccLogEntry startEntry = new MvccLogEntryImpl( entityId, version, Stage.ACTIVE );
+
+ MutationBatch write = logStrategy.write(collectionContext, startEntry );
+
+ ListenableFuture<OperationResult<Void>> future;
+
+ try {
+ future = write.executeAsync();
+ }
+ catch ( ConnectionException e ) {
+ LOG.error( "Failed to execute write asynchronously ", e );
+ throw new CollectionRuntimeException( "Failed to execute write asynchronously ", e );
+ }
+
+ //create the mvcc entity for the next stage
+ MvccEntityImpl nextStage = new MvccEntityImpl( entityId, version, entity );
+
+ writeContext.setMessage( nextStage );
+
+
+ //set the next stage to invoke on return
+ WriteContextCallback.createCallback( future, writeContext );
+ }
+
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/MvccEntityWrite.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/MvccEntityWrite.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/MvccEntityWrite.java
new file mode 100644
index 0000000..0e795db
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/MvccEntityWrite.java
@@ -0,0 +1,25 @@
+package org.apache.usergrid.persistence.collection.mvcc.stage.impl;
+
+
+import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntity;
+import org.apache.usergrid.persistence.collection.mvcc.stage.WriteContext;
+import org.apache.usergrid.persistence.collection.mvcc.stage.WriteStage;
+
+
+/**
+ * This phase should execute the serialization to the data store.
+ */
+public class MvccEntityWrite implements WriteStage {
+
+ /**
+ * Create a new stage with the current context
+ */
+ public MvccEntityWrite( ){
+ }
+
+
+ @Override
+ public void performStage( final WriteContext context ) {
+ //To change body of implemented methods use File | Settings | File Templates.
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/StagePipelineImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/StagePipelineImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/StagePipelineImpl.java
index b63769b..811b6eb 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/StagePipelineImpl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/StagePipelineImpl.java
@@ -5,35 +5,50 @@ import java.util.Arrays;
import java.util.List;
import org.apache.usergrid.persistence.collection.mvcc.stage.StagePipeline;
+import org.apache.usergrid.persistence.collection.mvcc.stage.WriteContext;
import org.apache.usergrid.persistence.collection.mvcc.stage.WriteStage;
/** @author tnine */
public class StagePipelineImpl implements StagePipeline {
- private int currentIndex = 0;
private final List<WriteStage> stages;
+ private WriteStage current;
protected StagePipelineImpl(WriteStage[] stages){
this.stages = Arrays.asList(stages);
}
@Override
- public WriteStage next() {
+ public WriteStage first() {
- if(currentIndex < stages.size()){
+ if(stages.size() == 0){
+ return null;
+ }
+
+ return stages.get( 0 );
+ }
- //get our current stage and increment
- return stages.get( currentIndex ++);
+
+ @Override
+ public WriteStage last() {
+ if(stages.size() == 0){
+ return null;
}
- return null;
+ return stages.get( stages.size()-1 );
+ }
+
+
+ @Override
+ public WriteStage current() {
+ return current;
}
@Override
public void insert( final WriteStage stage ) {
- throw new UnsupportedOperationException("This needs written");
+ throw new UnsupportedOperationException("This needs implemented");
}
@@ -44,6 +59,22 @@ public class StagePipelineImpl implements StagePipeline {
}
+ @Override
+ public WriteStage nextStage( final WriteStage stage ) {
+ int index = stages.indexOf( stage );
+
+ //we're done, do nothing
+ if(index == stages.size()){
+ return null;
+ }
+
+ current = stages.get( index+1 );
+
+ return current;
+ }
+
+
+
/**
* Factory to create a new instance.
* @param stages
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Start.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Start.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Start.java
deleted file mode 100644
index d86276d..0000000
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Start.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package org.apache.usergrid.persistence.collection.mvcc.stage.impl;
-
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntity;
-import org.apache.usergrid.persistence.collection.mvcc.entity.MvccLogEntry;
-import org.apache.usergrid.persistence.collection.mvcc.entity.MvccLogEntryImpl;
-import org.apache.usergrid.persistence.collection.mvcc.entity.Stage;
-import org.apache.usergrid.persistence.collection.mvcc.stage.WriteContext;
-import org.apache.usergrid.persistence.collection.mvcc.stage.WriteStage;
-import org.apache.usergrid.persistence.collection.serialization.MvccLogEntrySerializationStrategy;
-
-import com.google.common.util.concurrent.Futures;
-import com.google.common.util.concurrent.ListenableFuture;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import com.netflix.astyanax.MutationBatch;
-import com.netflix.astyanax.connectionpool.OperationResult;
-import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
-
-
-
-/**
- * This is the first stage and should be invoked immediately when a write is started. It should persist the start of a
- * new write in the data store for a checkpoint and recovery
- */
-@Singleton
-public class Start implements WriteStage {
-
- private static final Logger LOG = LoggerFactory.getLogger( Start.class );
-
- private final MvccLogEntrySerializationStrategy logStrategy;
- /**
- * Create a new stage with the current context
- * @param logStrategy
- */
- @Inject
- public Start( final MvccLogEntrySerializationStrategy logStrategy ){
- this.logStrategy = logStrategy;
- }
-
-
- @Override
- public void performStage(final WriteContext context, final MvccEntity entity ) {
- final MvccLogEntry startEntry = new MvccLogEntryImpl(entity.getContext(), entity.getUuid(), entity.getVersion(),Stage.ACTIVE);
-
- MutationBatch write = logStrategy.write( startEntry );
-
- ListenableFuture<OperationResult<Void>> future;
-
- try {
- future = write.executeAsync();
- }
- catch ( ConnectionException e ) {
- LOG.error( "Failed to execute write asynchronously ", e );
- throw new RuntimeException( "Failed to execute write asynchronously ", e );
- }
-
- //set the next stage to invoke on return
- Futures.addCallback(future, new WriteContextCallback(context, entity));
-
- }
-
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/UpdatePipeline.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/UpdatePipeline.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/UpdatePipeline.java
deleted file mode 100644
index 556e92c..0000000
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/UpdatePipeline.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package org.apache.usergrid.persistence.collection.mvcc.stage.impl;
-
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-import com.google.inject.BindingAnnotation;
-
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.PARAMETER;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-
-
-/**
- * Marks the update pipeline
- * @author tnine */
-@BindingAnnotation
-@Target({ FIELD, PARAMETER, METHOD }) @Retention(RUNTIME)
-public @interface UpdatePipeline {}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Write.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Write.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Write.java
deleted file mode 100644
index b45ccd5..0000000
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Write.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package org.apache.usergrid.persistence.collection.mvcc.stage.impl;
-
-
-import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntity;
-import org.apache.usergrid.persistence.collection.mvcc.stage.WriteContext;
-import org.apache.usergrid.persistence.collection.mvcc.stage.WriteStage;
-
-
-/**
- * This phase should execute the serialization to the data store.
- */
-public class Write implements WriteStage {
-
- /**
- * Create a new stage with the current context
- */
- public Write( ){
- }
-
-
- @Override
- public void performStage(WriteContext context, final MvccEntity entity ) {
-
-
-
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/WriteContextCallback.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/WriteContextCallback.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/WriteContextCallback.java
index 0fa408a..e5ca9bd 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/WriteContextCallback.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/WriteContextCallback.java
@@ -1,34 +1,62 @@
package org.apache.usergrid.persistence.collection.mvcc.stage.impl;
+import org.apache.usergrid.persistence.collection.exception.CollectionRuntimeException;
import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntity;
import org.apache.usergrid.persistence.collection.mvcc.stage.WriteContext;
+import org.apache.usergrid.persistence.collection.mvcc.stage.WriteStage;
import com.google.common.util.concurrent.FutureCallback;
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
import com.netflix.astyanax.connectionpool.OperationResult;
-/** @author tnine */
+/**
+ * Helper class to cause the async execution to continue
+ * @author tnine */
public class WriteContextCallback implements FutureCallback<OperationResult<Void>> {
private final WriteContext context;
- private final MvccEntity entity;
- public WriteContextCallback( final WriteContext context, final MvccEntity entity ) {
+ /**
+ * Create a new callback. The data will be passed to the next stage
+ * @param context
+ */
+ private WriteContextCallback( final WriteContext context ) {
this.context = context;
- this.entity = entity;
}
public void onSuccess( final OperationResult<Void> result ) {
- //proceed to the next stage
- context.nextStage( entity );
+
+ /**
+ * Proceed to the next stage
+ */
+ context.proceed();
}
@Override
public void onFailure( final Throwable t ) {
- throw new RuntimeException( "Failed to execute write", t );
+ context.stop();
+ throw new CollectionRuntimeException( "Failed to execute write", t );
+ }
+
+
+ /**
+ * This encapsulated type of Void in the listenable future is intentional. If you're not returning
+ * void in your future, you shouldn't be using this callback, you should be using a callback
+ * that will set the Response value into the next stage and invoke it
+ *
+ * @param future The listenable future returned by the Astyanax async op
+ * @param context The context to signal to continue in the callback
+ */
+ public static void createCallback( final ListenableFuture<OperationResult<Void>> future,
+ final WriteContext context ) {
+
+ Futures.addCallback(future, new WriteContextCallback( context ));
+
}
}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/WriteContextFactoryImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/WriteContextFactoryImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/WriteContextFactoryImpl.java
new file mode 100644
index 0000000..f9b627f
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/WriteContextFactoryImpl.java
@@ -0,0 +1,47 @@
+package org.apache.usergrid.persistence.collection.mvcc.stage.impl;
+
+
+import java.util.Collection;
+import java.util.UUID;
+
+import org.apache.usergrid.persistence.collection.CollectionContext;
+import org.apache.usergrid.persistence.collection.mvcc.event.PostProcessListener;
+import org.apache.usergrid.persistence.collection.mvcc.stage.StagePipeline;
+import org.apache.usergrid.persistence.collection.mvcc.stage.WriteContext;
+import org.apache.usergrid.persistence.collection.mvcc.stage.WriteContextFactory;
+import org.apache.usergrid.persistence.model.entity.Entity;
+
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+
+/** @author tnine */
+@Singleton
+public class WriteContextFactoryImpl implements WriteContextFactory {
+
+ private final StagePipeline writeStage;
+ private final StagePipeline deleteStage;
+ private final Collection<PostProcessListener> postProcessListener;
+
+
+ @Inject
+ public WriteContextFactoryImpl( @CreatePipeline final StagePipeline writeStage,
+ @DeletePipeline final StagePipeline deleteStage,
+ final Collection<PostProcessListener> postProcessListener ) {
+ this.writeStage = writeStage;
+ this.deleteStage = deleteStage;
+ this.postProcessListener = postProcessListener;
+ }
+
+
+ @Override
+ public WriteContext newCreateContext(CollectionContext context) {
+ return new WriteContextImpl( postProcessListener, writeStage, context );
+ }
+
+
+ @Override
+ public WriteContext newDeleteContext(CollectionContext context) {
+ return new WriteContextImpl( postProcessListener, deleteStage, context );
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/WriteContextImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/WriteContextImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/WriteContextImpl.java
new file mode 100644
index 0000000..cbddcd1
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/WriteContextImpl.java
@@ -0,0 +1,111 @@
+package org.apache.usergrid.persistence.collection.mvcc.stage.impl;
+
+
+import java.util.Collection;
+
+import org.apache.usergrid.persistence.collection.CollectionContext;
+import org.apache.usergrid.persistence.collection.mvcc.event.PostProcessListener;
+import org.apache.usergrid.persistence.collection.mvcc.stage.StagePipeline;
+import org.apache.usergrid.persistence.collection.mvcc.stage.WriteContext;
+import org.apache.usergrid.persistence.collection.mvcc.stage.WriteStage;
+
+import com.google.common.base.Preconditions;
+import com.google.inject.Inject;
+
+
+/** @author tnine */
+public class WriteContextImpl implements WriteContext {
+
+ private final Collection<PostProcessListener> listeners;
+ private final StagePipeline pipeline;
+ private final CollectionContext context;
+
+ private Object message;
+ private WriteStage current;
+
+
+ @Inject
+ public WriteContextImpl( final Collection<PostProcessListener> listeners, final StagePipeline pipeline,
+ final CollectionContext context ) {
+ this.listeners = listeners;
+ this.pipeline = pipeline;
+ this.context = context;
+ }
+
+
+ @Override
+ public StagePipeline getStagePipeline() {
+ return this.pipeline;
+ }
+
+
+ @Override
+ public void performWrite( Object input ) {
+
+ current = this.pipeline.first();
+
+ current.performStage( this );
+ }
+
+
+ @Override
+ public <T> T getMessage( final Class<T> clazz ) {
+ Preconditions.checkNotNull( clazz, "Class must be specified" );
+
+ if ( message == null ) {
+ return null;
+ }
+
+ if ( !clazz.isInstance( message ) ) {
+ throw new ClassCastException(
+ "Message must be an instance of class " + clazz + ". However it was of type '" + message.getClass()
+ + "'" );
+ }
+
+
+ return ( T ) message;
+ }
+
+
+ @Override
+ public Object setMessage( final Object object ) {
+ Object original = message;
+
+ this.message = object;
+
+ return original;
+ }
+
+
+ @Override
+ public void proceed() {
+ WriteStage next = this.pipeline.nextStage( current );
+
+ //Nothing to do
+ if ( next == null ) {
+ return;
+ }
+
+ current = next;
+ current.performStage( this );
+ }
+
+
+ @Override
+ public void stop() {
+ //No op ATM
+ current = null;
+ }
+
+
+ @Override
+ public Collection<PostProcessListener> getPostProcessors() {
+ return listeners;
+ }
+
+
+ @Override
+ public CollectionContext getCollectionContext() {
+ return this.context;
+ }
+}
[4/5] Major refactor complete. Need to work on scheduling of futures.
Posted by to...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/MvccEntitySerializationStrategy.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/MvccEntitySerializationStrategy.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/MvccEntitySerializationStrategy.java
index 3d16fe1..f3350ad 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/MvccEntitySerializationStrategy.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/MvccEntitySerializationStrategy.java
@@ -21,7 +21,7 @@ public interface MvccEntitySerializationStrategy
* @param entity The entity to persist
* @return The MutationBatch operations for this update
*/
- public MutationBatch write( MvccEntity entity );
+ public MutationBatch write(CollectionContext context, MvccEntity entity );
/**
@@ -35,7 +35,7 @@ public interface MvccEntitySerializationStrategy
* If the entity version has been cleared, the MvccEntity will be returned, but the optional entity
* will not be set
*/
- public MvccEntity load( CollectionContext context, UUID entityId, UUID version ) throws ConnectionException;
+ public MvccEntity load( CollectionContext context, UUID entityId, UUID version );
/**
* Load a list, from highest to lowest of the entity with versions <= version up to maxSize elements
@@ -48,8 +48,7 @@ public interface MvccEntitySerializationStrategy
* @return A list of entities up to max size ordered from max(UUID)=> min(UUID). The return value should be null safe
* and return an empty list when there are no matches
*/
- public List<MvccEntity> load( CollectionContext context, UUID entityId, UUID version, int maxSize )
- throws ConnectionException;
+ public List<MvccEntity> load( CollectionContext context, UUID entityId, UUID version, int maxSize );
/**
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/MvccEntitySerializationStrategyImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/MvccEntitySerializationStrategyImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/MvccEntitySerializationStrategyImpl.java
deleted file mode 100644
index afec2f8..0000000
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/MvccEntitySerializationStrategyImpl.java
+++ /dev/null
@@ -1,227 +0,0 @@
-package org.apache.usergrid.persistence.collection.serialization;
-
-
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.UUID;
-
-import org.apache.cassandra.db.marshal.ReversedType;
-import org.apache.cassandra.db.marshal.UUIDType;
-
-import org.apache.usergrid.persistence.collection.CollectionContext;
-import org.apache.usergrid.persistence.collection.migration.CollectionColumnFamily;
-import org.apache.usergrid.persistence.collection.migration.Migration;
-import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntity;
-import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntityImpl;
-import org.apache.usergrid.persistence.model.entity.Entity;
-
-import com.google.common.base.Optional;
-import com.google.common.base.Preconditions;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import com.netflix.astyanax.ColumnListMutation;
-import com.netflix.astyanax.Keyspace;
-import com.netflix.astyanax.MutationBatch;
-import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
-import com.netflix.astyanax.connectionpool.exceptions.NotFoundException;
-import com.netflix.astyanax.model.Column;
-import com.netflix.astyanax.model.ColumnFamily;
-import com.netflix.astyanax.model.ColumnList;
-import com.netflix.astyanax.serializers.AbstractSerializer;
-import com.netflix.astyanax.serializers.ObjectSerializer;
-import com.netflix.astyanax.serializers.UUIDSerializer;
-
-
-/** @author tnine */
-@Singleton
-public class MvccEntitySerializationStrategyImpl implements MvccEntitySerializationStrategy, Migration {
-
-
- private static final EntitySerializer SER = new EntitySerializer();
-
-
- private static final ColumnFamily<UUID, UUID> CF_ENTITY_DATA =
- new ColumnFamily<UUID, UUID>( "Entity_Version_Data", UUIDSerializer.get(), UUIDSerializer.get() );
-
-
- protected final Keyspace keyspace;
-
-
- @Inject
- public MvccEntitySerializationStrategyImpl( final Keyspace keyspace ) {
- this.keyspace = keyspace;
- }
-
-
- @Override
- public MutationBatch write( final MvccEntity entity ) {
- Preconditions.checkNotNull( entity, "entity is required" );
-
- final UUID colName = entity.getVersion();
- final UUID entityId = entity.getUuid();
-
- final Optional<Entity> colValue = entity.getEntity();
-
- return doWrite( entityId, new RowOp() {
- @Override
- public void doOp( final ColumnListMutation<UUID> colMutation ) {
- colMutation.putColumn( colName, SER.toByteBuffer( colValue ) );
- }
- } );
- }
-
-
- @Override
- public MvccEntity load( final CollectionContext context, final UUID entityId, final UUID version )
- throws ConnectionException {
- Preconditions.checkNotNull( context, "context is required" );
- Preconditions.checkNotNull( entityId, "entity id is required" );
- Preconditions.checkNotNull( version, "version is required" );
-
-
- Column<UUID> column;
-
- try {
- column = keyspace.prepareQuery( CF_ENTITY_DATA ).getKey( entityId ).getColumn( version ).execute()
- .getResult();
- }
-
- catch ( NotFoundException e ) {
- //swallow, there's just no column
- return null;
- }
-
-
- return new MvccEntityImpl( context, entityId, version, column.getValue( SER ) );
- }
-
-
- @Override
- public List<MvccEntity> load( final CollectionContext context, final UUID entityId, final UUID version,
- final int maxSize ) throws ConnectionException {
-
- Preconditions.checkNotNull( context, "context is required" );
- Preconditions.checkNotNull( entityId, "entity id is required" );
- Preconditions.checkNotNull( version, "version is required" );
- Preconditions.checkArgument( maxSize > 0, "max Size must be greater than 0" );
-
-
- ColumnList<UUID> columns = keyspace.prepareQuery( CF_ENTITY_DATA ).getKey( entityId )
- .withColumnRange( version, null, false, maxSize ).execute().getResult();
-
-
- List<MvccEntity> results = new ArrayList<MvccEntity>( columns.size() );
-
- for ( Column<UUID> col : columns ) {
- results.add( new MvccEntityImpl( context, entityId, col.getName(), col.getValue( SER ) ) );
- }
-
- return results;
- }
-
-
- @Override
- public MutationBatch clear( final CollectionContext context, final UUID entityId, final UUID version ) {
- Preconditions.checkNotNull( context, "context is required" );
- Preconditions.checkNotNull( entityId, "entity id is required" );
- Preconditions.checkNotNull( version, "version is required" );
-
- final Optional<Entity> value = Optional.absent();
-
- return doWrite( entityId, new RowOp() {
- @Override
- public void doOp( final ColumnListMutation<UUID> colMutation ) {
- colMutation.putColumn( version, SER.toByteBuffer( value ) );
- }
- } );
- }
-
-
- @Override
- public MutationBatch delete( final CollectionContext context, final UUID entityId, final UUID version ) {
- Preconditions.checkNotNull( context, "context is required" );
- Preconditions.checkNotNull( entityId, "entity id is required" );
- Preconditions.checkNotNull( version, "version is required" );
-
-
- return doWrite( entityId, new RowOp() {
- @Override
- public void doOp( final ColumnListMutation<UUID> colMutation ) {
- colMutation.deleteColumn( version );
- }
- } );
- }
-
-
- @Override
- public Collection<CollectionColumnFamily> getColumnFamilies() {
-
- //create the CF entity data. We want it reversed b/c we want the most recent version at the top of the
- //row for fast seeks
- CollectionColumnFamily cf = new CollectionColumnFamily( CF_ENTITY_DATA,
- ReversedType.class.getName() + "(" + UUIDType.class.getName() + ")", true );
-
-
- return Collections.singleton( cf );
- }
-
-
- /** Do the write on the correct row for the entity id with the operation */
- private MutationBatch doWrite( UUID entityId, RowOp op ) {
- final MutationBatch batch = keyspace.prepareMutationBatch();
-
- op.doOp( batch.withRow( CF_ENTITY_DATA, entityId ) );
-
- return batch;
- }
-
-
- /** Simple callback to perform puts and deletes with a common row setup code */
- private static interface RowOp {
-
- /** The operation to perform on the row */
- void doOp( ColumnListMutation<UUID> colMutation );
- }
-
-
- /**
- * TODO: Serializer for the entity. This just uses object serialization, change this to use SMILE before production!
- * We want to retain the Optional wrapper. It helps us easily mark something as cleaned without removing the column
- * and makes it obvious that the entity could be missing in the api
- */
- private static class EntitySerializer extends AbstractSerializer<Optional<Entity>> {
-
- private static final ObjectSerializer SER = ObjectSerializer.get();
-
- //the marker for when we're passed a "null" value
- private static final byte[] EMPTY = new byte[] { 0x0 };
-
-
- @Override
- public ByteBuffer toByteBuffer( final Optional<Entity> obj ) {
-
- //mark this version as empty
- if ( !obj.isPresent() ) {
- return ByteBuffer.wrap( EMPTY );
- }
-
- return SER.toByteBuffer( obj.get() );
- }
-
-
- @Override
- public Optional<Entity> fromByteBuffer( final ByteBuffer byteBuffer ) {
-
- final ByteBuffer check = byteBuffer.duplicate();
-
- if ( check.remaining() == 1 && check.get() == EMPTY[0] ) {
- return Optional.absent();
- }
-
- return Optional.of( ( Entity ) SER.fromByteBuffer( byteBuffer ) );
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/MvccLogEntrySerializationStrategy.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/MvccLogEntrySerializationStrategy.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/MvccLogEntrySerializationStrategy.java
index 3206e60..e79e95f 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/MvccLogEntrySerializationStrategy.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/MvccLogEntrySerializationStrategy.java
@@ -21,7 +21,7 @@ public interface MvccLogEntrySerializationStrategy
* @param entry the entry to write
* @return The mutation batch with the mutation operations for this write.
*/
- public MutationBatch write( MvccLogEntry entry );
+ public MutationBatch write( final CollectionContext context, MvccLogEntry entry );
/**
* Load and return the stage with the given id and a version that is <= the version provided
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/MvccLogEntrySerializationStrategyImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/MvccLogEntrySerializationStrategyImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/MvccLogEntrySerializationStrategyImpl.java
deleted file mode 100644
index a418ecc..0000000
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/MvccLogEntrySerializationStrategyImpl.java
+++ /dev/null
@@ -1,238 +0,0 @@
-package org.apache.usergrid.persistence.collection.serialization;
-
-
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
-
-import org.apache.cassandra.db.marshal.ReversedType;
-import org.apache.cassandra.db.marshal.UUIDType;
-
-import org.apache.usergrid.persistence.collection.CollectionContext;
-import org.apache.usergrid.persistence.collection.migration.CollectionColumnFamily;
-import org.apache.usergrid.persistence.collection.migration.Migration;
-import org.apache.usergrid.persistence.collection.mvcc.entity.MvccLogEntry;
-import org.apache.usergrid.persistence.collection.mvcc.entity.MvccLogEntryImpl;
-import org.apache.usergrid.persistence.collection.mvcc.entity.Stage;
-
-import com.google.common.base.Preconditions;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import com.google.inject.name.Named;
-import com.netflix.astyanax.ColumnListMutation;
-import com.netflix.astyanax.Keyspace;
-import com.netflix.astyanax.MutationBatch;
-import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
-import com.netflix.astyanax.connectionpool.exceptions.NotFoundException;
-import com.netflix.astyanax.model.Column;
-import com.netflix.astyanax.model.ColumnFamily;
-import com.netflix.astyanax.model.ColumnList;
-import com.netflix.astyanax.serializers.AbstractSerializer;
-import com.netflix.astyanax.serializers.UUIDSerializer;
-
-
-/**
- * Simple implementation for reading and writing log entries
- *
- * @author tnine
- */
-@Singleton
-public class MvccLogEntrySerializationStrategyImpl implements MvccLogEntrySerializationStrategy, Migration {
-
- public static final String TIMEOUT_PROP = "collection.stage.transient.timeout";
-
- private static final StageSerializer SER = new StageSerializer();
-
- private static final ColumnFamily<UUID, UUID> CF_ENTITY_LOG =
- new ColumnFamily<UUID, UUID>( "Entity_Log", UUIDSerializer.get(), UUIDSerializer.get() );
-
-
- protected final Keyspace keyspace;
- protected final int timeout;
-
-
- @Inject
- public MvccLogEntrySerializationStrategyImpl( final Keyspace keyspace, @Named( TIMEOUT_PROP ) final int timeout ) {
- this.keyspace = keyspace;
- this.timeout = timeout;
- }
-
-
- @Override
- public MutationBatch write( final MvccLogEntry entry ) {
-
- Preconditions.checkNotNull( entry, "entry is required" );
-
-
- final Stage stage = entry.getStage();
- final UUID colName = entry.getVersion();
-
- return doWrite( entry.getContext(), entry.getEntityId(), new RowOp() {
- @Override
- public void doOp( final ColumnListMutation<UUID> colMutation ) {
-
- //Write the stage with a timeout, it's set as transient
- if ( stage.isTransient() ) {
- colMutation.putColumn( colName, stage, SER, timeout );
- return;
- }
-
- //otherwise it's persistent, write it with no expiration
- colMutation.putColumn( colName, stage, SER, null );
- }
- } );
- }
-
-
- @Override
- public MvccLogEntry load( final CollectionContext context, final UUID entityId, final UUID version )
- throws ConnectionException {
- Preconditions.checkNotNull( context, "context is required" );
- Preconditions.checkNotNull( entityId, "entity id is required" );
- Preconditions.checkNotNull( version, "version is required" );
-
-
- Column<UUID> result;
-
- try {
- result = keyspace.prepareQuery( CF_ENTITY_LOG ).getKey( entityId ).getColumn( version ).execute()
- .getResult();
- }
- catch ( NotFoundException nfe ) {
- return null;
- }
-
-
- final Stage stage = result.getValue( SER );
-
- return new MvccLogEntryImpl( context, entityId, version, stage );
- }
-
-
- @Override
- public List<MvccLogEntry> load( final CollectionContext context, final UUID entityId, final UUID version,
- final int maxSize ) throws ConnectionException {
- Preconditions.checkNotNull( context, "context is required" );
- Preconditions.checkNotNull( entityId, "entity id is required" );
- Preconditions.checkNotNull( version, "version is required" );
- Preconditions.checkArgument( maxSize > 0, "max Size must be greater than 0" );
-
-
- ColumnList<UUID> columns = keyspace.prepareQuery( CF_ENTITY_LOG ).getKey( entityId )
- .withColumnRange( version, null, false, maxSize ).execute().getResult();
-
-
- List<MvccLogEntry> results = new ArrayList<MvccLogEntry>( columns.size() );
-
- for ( Column<UUID> col : columns ) {
- final UUID storedVersion = col.getName();
- final Stage stage = col.getValue( SER );
-
- results.add( new MvccLogEntryImpl( context, entityId, storedVersion, stage ) );
- }
-
- return results;
- }
-
-
- @Override
- public MutationBatch delete( final CollectionContext context, final UUID entityId, final UUID version ) {
-
- Preconditions.checkNotNull( context, "context is required" );
- Preconditions.checkNotNull( entityId, "entityId is required" );
- Preconditions.checkNotNull( version, "version context is required" );
-
- return doWrite( context, entityId, new RowOp() {
- @Override
- public void doOp( final ColumnListMutation<UUID> colMutation ) {
- colMutation.deleteColumn( version );
- }
- } );
- }
-
-
- @Override
- public Collection<CollectionColumnFamily> getColumnFamilies() {
- //create the CF entity data. We want it reversed b/c we want the most recent version at the top of the
- //row for fast seeks
- CollectionColumnFamily cf = new CollectionColumnFamily( CF_ENTITY_LOG,
- ReversedType.class.getName() + "(" + UUIDType.class.getName() + ")", true );
-
-
- return Collections.singleton( cf );
- }
-
-
- /** Simple callback to perform puts and deletes with a common row setup code */
- private static interface RowOp {
-
- /** The operation to perform on the row */
- void doOp( ColumnListMutation<UUID> colMutation );
- }
-
-
- /**
- * Do the column update or delete for the given column and row key
- *
- * @param context We need to use this when getting the keyspace
- */
- private MutationBatch doWrite( CollectionContext context, UUID entityId, RowOp op ) {
-
- final MutationBatch batch = keyspace.prepareMutationBatch();
-
- op.doOp( batch.withRow( CF_ENTITY_LOG, entityId ) );
-
- return batch;
- }
-
-
- /** Internal stage cache */
- private static class StageCache {
- private Map<Byte, Stage> values = new HashMap<Byte, Stage>( Stage.values().length );
-
-
- private StageCache() {
- for ( Stage stage : Stage.values() ) {
-
- final byte stageValue = stage.getId();
-
- values.put( stageValue, stage );
- }
- }
-
-
- /** Get the stage with the byte value */
- private Stage getStage( final byte value ) {
- return values.get( value );
- }
- }
-
-
- public static class StageSerializer extends AbstractSerializer<Stage> {
-
- /** Used for caching the byte => stage mapping */
- private static final StageCache CACHE = new StageCache();
-
-
- @Override
- public ByteBuffer toByteBuffer( final Stage obj ) {
- ByteBuffer buff = ByteBuffer.allocate( 1 );
- buff.put( obj.getId() );
- buff.rewind();
- return buff;
- }
-
-
- @Override
- public Stage fromByteBuffer( final ByteBuffer byteBuffer ) {
- final byte value = byteBuffer.get();
-
- return CACHE.getStage(value);
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyImpl.java
new file mode 100644
index 0000000..7a5c5c5
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyImpl.java
@@ -0,0 +1,238 @@
+package org.apache.usergrid.persistence.collection.serialization.impl;
+
+
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.UUID;
+
+import org.apache.cassandra.db.marshal.ReversedType;
+import org.apache.cassandra.db.marshal.UUIDType;
+
+import org.apache.usergrid.persistence.collection.CollectionContext;
+import org.apache.usergrid.persistence.collection.exception.CollectionRuntimeException;
+import org.apache.usergrid.persistence.collection.migration.CollectionColumnFamily;
+import org.apache.usergrid.persistence.collection.migration.Migration;
+import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntity;
+import org.apache.usergrid.persistence.collection.mvcc.entity.impl.MvccEntityImpl;
+import org.apache.usergrid.persistence.collection.serialization.MvccEntitySerializationStrategy;
+import org.apache.usergrid.persistence.model.entity.Entity;
+
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import com.netflix.astyanax.ColumnListMutation;
+import com.netflix.astyanax.Keyspace;
+import com.netflix.astyanax.MutationBatch;
+import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
+import com.netflix.astyanax.connectionpool.exceptions.NotFoundException;
+import com.netflix.astyanax.model.Column;
+import com.netflix.astyanax.model.ColumnFamily;
+import com.netflix.astyanax.model.ColumnList;
+import com.netflix.astyanax.serializers.AbstractSerializer;
+import com.netflix.astyanax.serializers.ObjectSerializer;
+import com.netflix.astyanax.serializers.UUIDSerializer;
+
+
+/** @author tnine */
+@Singleton
+public class MvccEntitySerializationStrategyImpl implements MvccEntitySerializationStrategy, Migration {
+
+
+
+ private static final EntitySerializer SER = new EntitySerializer();
+
+
+ private static final ColumnFamily<UUID, UUID> CF_ENTITY_DATA =
+ new ColumnFamily<UUID, UUID>( "Entity_Version_Data", UUIDSerializer.get(), UUIDSerializer.get() );
+
+
+ protected final Keyspace keyspace;
+
+
+ @Inject
+ public MvccEntitySerializationStrategyImpl( final Keyspace keyspace ) {
+ this.keyspace = keyspace;
+ }
+
+
+ @Override
+ public MutationBatch write(final CollectionContext context, final MvccEntity entity ) {
+ Preconditions.checkNotNull( entity, "entity is required" );
+
+ final UUID colName = entity.getVersion();
+ final UUID entityId = entity.getUuid();
+
+ final Optional<Entity> colValue = entity.getEntity();
+
+ return doWrite( entityId, new RowOp() {
+ @Override
+ public void doOp( final ColumnListMutation<UUID> colMutation ) {
+ colMutation.putColumn( colName, SER.toByteBuffer( colValue ) );
+ }
+ } );
+ }
+
+
+ @Override
+ public MvccEntity load( final CollectionContext context, final UUID entityId, final UUID version ) {
+ Preconditions.checkNotNull( context, "context is required" );
+ Preconditions.checkNotNull( entityId, "entity id is required" );
+ Preconditions.checkNotNull( version, "version is required" );
+
+
+ Column<UUID> column;
+
+ try {
+ column = keyspace.prepareQuery( CF_ENTITY_DATA ).getKey( entityId ).getColumn( version ).execute()
+ .getResult();
+ }
+
+ catch ( NotFoundException e ) {
+ //swallow, there's just no column
+ return null;
+ }
+ catch ( ConnectionException e ) {
+ throw new CollectionRuntimeException( "An error occurred connecting to cassandra", e );
+ }
+
+
+ return new MvccEntityImpl( entityId, version, column.getValue( SER ) );
+ }
+
+
+ @Override
+ public List<MvccEntity> load( final CollectionContext context, final UUID entityId, final UUID version,
+ final int maxSize ) {
+
+ Preconditions.checkNotNull( context, "context is required" );
+ Preconditions.checkNotNull( entityId, "entity id is required" );
+ Preconditions.checkNotNull( version, "version is required" );
+ Preconditions.checkArgument( maxSize > 0, "max Size must be greater than 0" );
+
+
+ ColumnList<UUID> columns = null;
+ try {
+ columns = keyspace.prepareQuery( CF_ENTITY_DATA ).getKey( entityId )
+ .withColumnRange( version, null, false, maxSize ).execute().getResult();
+ }
+ catch ( ConnectionException e ) {
+ throw new CollectionRuntimeException( "An error occurred connecting to cassandra", e );
+ }
+
+
+ List<MvccEntity> results = new ArrayList<MvccEntity>( columns.size() );
+
+ for ( Column<UUID> col : columns ) {
+ results.add( new MvccEntityImpl( entityId, col.getName(), col.getValue( SER ) ) );
+ }
+
+ return results;
+ }
+
+
+ @Override
+ public MutationBatch clear( final CollectionContext context, final UUID entityId, final UUID version ) {
+ Preconditions.checkNotNull( context, "context is required" );
+ Preconditions.checkNotNull( entityId, "entity id is required" );
+ Preconditions.checkNotNull( version, "version is required" );
+
+ final Optional<Entity> value = Optional.absent();
+
+ return doWrite( entityId, new RowOp() {
+ @Override
+ public void doOp( final ColumnListMutation<UUID> colMutation ) {
+ colMutation.putColumn( version, SER.toByteBuffer( value ) );
+ }
+ } );
+ }
+
+
+ @Override
+ public MutationBatch delete( final CollectionContext context, final UUID entityId, final UUID version ) {
+ Preconditions.checkNotNull( context, "context is required" );
+ Preconditions.checkNotNull( entityId, "entity id is required" );
+ Preconditions.checkNotNull( version, "version is required" );
+
+
+ return doWrite( entityId, new RowOp() {
+ @Override
+ public void doOp( final ColumnListMutation<UUID> colMutation ) {
+ colMutation.deleteColumn( version );
+ }
+ } );
+ }
+
+
+ @Override
+ public Collection<CollectionColumnFamily> getColumnFamilies() {
+
+ //create the CF entity data. We want it reversed b/c we want the most recent version at the top of the
+ //row for fast seeks
+ CollectionColumnFamily cf = new CollectionColumnFamily( CF_ENTITY_DATA,
+ ReversedType.class.getName() + "(" + UUIDType.class.getName() + ")", true );
+
+
+ return Collections.singleton( cf );
+ }
+
+
+ /** Do the write on the correct row for the entity id with the operation */
+ private MutationBatch doWrite( UUID entityId, RowOp op ) {
+ final MutationBatch batch = keyspace.prepareMutationBatch();
+
+ op.doOp( batch.withRow( CF_ENTITY_DATA, entityId ) );
+
+ return batch;
+ }
+
+
+ /** Simple callback to perform puts and deletes with a common row setup code */
+ private static interface RowOp {
+
+ /** The operation to perform on the row */
+ void doOp( ColumnListMutation<UUID> colMutation );
+ }
+
+
+ /**
+ * TODO: Serializer for the entity. This just uses object serialization, change this to use SMILE before production!
+ * We want to retain the Optional wrapper. It helps us easily mark something as cleaned without removing the column
+ * and makes it obvious that the entity could be missing in the api
+ */
+ private static class EntitySerializer extends AbstractSerializer<Optional<Entity>> {
+
+ private static final ObjectSerializer SER = ObjectSerializer.get();
+
+ //the marker for when we're passed a "null" value
+ private static final byte[] EMPTY = new byte[] { 0x0 };
+
+
+ @Override
+ public ByteBuffer toByteBuffer( final Optional<Entity> obj ) {
+
+ //mark this version as empty
+ if ( !obj.isPresent() ) {
+ return ByteBuffer.wrap( EMPTY );
+ }
+
+ return SER.toByteBuffer( obj.get() );
+ }
+
+
+ @Override
+ public Optional<Entity> fromByteBuffer( final ByteBuffer byteBuffer ) {
+
+ final ByteBuffer check = byteBuffer.duplicate();
+
+ if ( check.remaining() == 1 && check.get() == EMPTY[0] ) {
+ return Optional.absent();
+ }
+
+ return Optional.of( ( Entity ) SER.fromByteBuffer( byteBuffer ) );
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccLogEntrySerializationStrategyImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccLogEntrySerializationStrategyImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccLogEntrySerializationStrategyImpl.java
new file mode 100644
index 0000000..1ce64aa
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccLogEntrySerializationStrategyImpl.java
@@ -0,0 +1,239 @@
+package org.apache.usergrid.persistence.collection.serialization.impl;
+
+
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+import org.apache.cassandra.db.marshal.ReversedType;
+import org.apache.cassandra.db.marshal.UUIDType;
+
+import org.apache.usergrid.persistence.collection.CollectionContext;
+import org.apache.usergrid.persistence.collection.migration.CollectionColumnFamily;
+import org.apache.usergrid.persistence.collection.migration.Migration;
+import org.apache.usergrid.persistence.collection.mvcc.entity.MvccLogEntry;
+import org.apache.usergrid.persistence.collection.mvcc.entity.impl.MvccLogEntryImpl;
+import org.apache.usergrid.persistence.collection.mvcc.entity.Stage;
+import org.apache.usergrid.persistence.collection.serialization.MvccLogEntrySerializationStrategy;
+
+import com.google.common.base.Preconditions;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import com.google.inject.name.Named;
+import com.netflix.astyanax.ColumnListMutation;
+import com.netflix.astyanax.Keyspace;
+import com.netflix.astyanax.MutationBatch;
+import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
+import com.netflix.astyanax.connectionpool.exceptions.NotFoundException;
+import com.netflix.astyanax.model.Column;
+import com.netflix.astyanax.model.ColumnFamily;
+import com.netflix.astyanax.model.ColumnList;
+import com.netflix.astyanax.serializers.AbstractSerializer;
+import com.netflix.astyanax.serializers.UUIDSerializer;
+
+
+/**
+ * Simple implementation for reading and writing log entries
+ *
+ * @author tnine
+ */
+@Singleton
+public class MvccLogEntrySerializationStrategyImpl implements MvccLogEntrySerializationStrategy, Migration {
+
+ public static final String TIMEOUT_PROP = "collection.stage.transient.timeout";
+
+ private static final StageSerializer SER = new StageSerializer();
+
+ private static final ColumnFamily<UUID, UUID> CF_ENTITY_LOG =
+ new ColumnFamily<UUID, UUID>( "Entity_Log", UUIDSerializer.get(), UUIDSerializer.get() );
+
+
+ protected final Keyspace keyspace;
+ protected final int timeout;
+
+
+ @Inject
+ public MvccLogEntrySerializationStrategyImpl( final Keyspace keyspace, @Named( TIMEOUT_PROP ) final int timeout ) {
+ this.keyspace = keyspace;
+ this.timeout = timeout;
+ }
+
+
+ @Override
+ public MutationBatch write( final CollectionContext context, final MvccLogEntry entry ) {
+
+ Preconditions.checkNotNull( entry, "entry is required" );
+
+
+ final Stage stage = entry.getStage();
+ final UUID colName = entry.getVersion();
+
+ return doWrite( context, entry.getEntityId(), new RowOp() {
+ @Override
+ public void doOp( final ColumnListMutation<UUID> colMutation ) {
+
+ //Write the stage with a timeout, it's set as transient
+ if ( stage.isTransient() ) {
+ colMutation.putColumn( colName, stage, SER, timeout );
+ return;
+ }
+
+ //otherwise it's persistent, write it with no expiration
+ colMutation.putColumn( colName, stage, SER, null );
+ }
+ } );
+ }
+
+
+ @Override
+ public MvccLogEntry load( final CollectionContext context, final UUID entityId, final UUID version )
+ throws ConnectionException {
+ Preconditions.checkNotNull( context, "context is required" );
+ Preconditions.checkNotNull( entityId, "entity id is required" );
+ Preconditions.checkNotNull( version, "version is required" );
+
+
+ Column<UUID> result;
+
+ try {
+ result = keyspace.prepareQuery( CF_ENTITY_LOG ).getKey( entityId ).getColumn( version ).execute()
+ .getResult();
+ }
+ catch ( NotFoundException nfe ) {
+ return null;
+ }
+
+
+ final Stage stage = result.getValue( SER );
+
+ return new MvccLogEntryImpl( entityId, version, stage );
+ }
+
+
+ @Override
+ public List<MvccLogEntry> load( final CollectionContext context, final UUID entityId, final UUID version,
+ final int maxSize ) throws ConnectionException {
+ Preconditions.checkNotNull( context, "context is required" );
+ Preconditions.checkNotNull( entityId, "entity id is required" );
+ Preconditions.checkNotNull( version, "version is required" );
+ Preconditions.checkArgument( maxSize > 0, "max Size must be greater than 0" );
+
+
+ ColumnList<UUID> columns = keyspace.prepareQuery( CF_ENTITY_LOG ).getKey( entityId )
+ .withColumnRange( version, null, false, maxSize ).execute().getResult();
+
+
+ List<MvccLogEntry> results = new ArrayList<MvccLogEntry>( columns.size() );
+
+ for ( Column<UUID> col : columns ) {
+ final UUID storedVersion = col.getName();
+ final Stage stage = col.getValue( SER );
+
+ results.add( new MvccLogEntryImpl( entityId, storedVersion, stage ) );
+ }
+
+ return results;
+ }
+
+
+ @Override
+ public MutationBatch delete( final CollectionContext context, final UUID entityId, final UUID version ) {
+
+ Preconditions.checkNotNull( context, "context is required" );
+ Preconditions.checkNotNull( entityId, "entityId is required" );
+ Preconditions.checkNotNull( version, "version context is required" );
+
+ return doWrite( context, entityId, new RowOp() {
+ @Override
+ public void doOp( final ColumnListMutation<UUID> colMutation ) {
+ colMutation.deleteColumn( version );
+ }
+ } );
+ }
+
+
+ @Override
+ public Collection<CollectionColumnFamily> getColumnFamilies() {
+ //create the CF entity data. We want it reversed b/c we want the most recent version at the top of the
+ //row for fast seeks
+ CollectionColumnFamily cf = new CollectionColumnFamily( CF_ENTITY_LOG,
+ ReversedType.class.getName() + "(" + UUIDType.class.getName() + ")", true );
+
+
+ return Collections.singleton( cf );
+ }
+
+
+ /** Simple callback to perform puts and deletes with a common row setup code */
+ private static interface RowOp {
+
+ /** The operation to perform on the row */
+ void doOp( ColumnListMutation<UUID> colMutation );
+ }
+
+
+ /**
+ * Do the column update or delete for the given column and row key
+ *
+ * @param context We need to use this when getting the keyspace
+ */
+ private MutationBatch doWrite( CollectionContext context, UUID entityId, RowOp op ) {
+
+ final MutationBatch batch = keyspace.prepareMutationBatch();
+
+ op.doOp( batch.withRow( CF_ENTITY_LOG, entityId ) );
+
+ return batch;
+ }
+
+
+ /** Internal stage cache */
+ private static class StageCache {
+ private Map<Byte, Stage> values = new HashMap<Byte, Stage>( Stage.values().length );
+
+
+ private StageCache() {
+ for ( Stage stage : Stage.values() ) {
+
+ final byte stageValue = stage.getId();
+
+ values.put( stageValue, stage );
+ }
+ }
+
+
+ /** Get the stage with the byte value */
+ private Stage getStage( final byte value ) {
+ return values.get( value );
+ }
+ }
+
+
+ public static class StageSerializer extends AbstractSerializer<Stage> {
+
+ /** Used for caching the byte => stage mapping */
+ private static final StageCache CACHE = new StageCache();
+
+
+ @Override
+ public ByteBuffer toByteBuffer( final Stage obj ) {
+ ByteBuffer buff = ByteBuffer.allocate( 1 );
+ buff.put( obj.getId() );
+ buff.rewind();
+ return buff;
+ }
+
+
+ @Override
+ public Stage fromByteBuffer( final ByteBuffer byteBuffer ) {
+ final byte value = byteBuffer.get();
+
+ return CACHE.getStage(value);
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/SerializationModule.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/SerializationModule.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/SerializationModule.java
new file mode 100644
index 0000000..f27b6ad
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/SerializationModule.java
@@ -0,0 +1,45 @@
+package org.apache.usergrid.persistence.collection.serialization.impl;
+
+
+import org.apache.usergrid.persistence.collection.astynax.AstynaxKeyspaceProvider;
+import org.apache.usergrid.persistence.collection.guice.PropertyUtils;
+import org.apache.usergrid.persistence.collection.migration.Migration;
+import org.apache.usergrid.persistence.collection.migration.MigrationManager;
+import org.apache.usergrid.persistence.collection.migration.MigrationManagerImpl;
+import org.apache.usergrid.persistence.collection.serialization.MvccEntitySerializationStrategy;
+import org.apache.usergrid.persistence.collection.serialization.MvccLogEntrySerializationStrategy;
+
+import com.google.inject.AbstractModule;
+import com.google.inject.multibindings.Multibinder;
+import com.google.inject.name.Names;
+import com.netflix.astyanax.Keyspace;
+
+
+/** @author tnine */
+public class SerializationModule extends AbstractModule{
+
+ @Override
+ protected void configure() {
+
+ //bind our keyspace to the AstynaxKeyspaceProvider
+ bind( Keyspace.class ).toProvider( AstynaxKeyspaceProvider.class );
+
+ //bind our migration manager
+ bind( MigrationManager.class ).to( MigrationManagerImpl.class );
+
+
+ //bind the serialization strategies
+
+ bind( MvccEntitySerializationStrategy.class ).to( MvccEntitySerializationStrategyImpl.class );
+
+
+ bind( MvccLogEntrySerializationStrategy.class ).to( MvccLogEntrySerializationStrategyImpl.class );
+
+
+ //do multibindings for migrations
+ Multibinder<Migration> uriBinder = Multibinder.newSetBinder( binder(), Migration.class );
+
+ uriBinder.addBinding().to( MvccEntitySerializationStrategyImpl.class );
+ uriBinder.addBinding().to( MvccLogEntrySerializationStrategyImpl.class );
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/service/TimeService.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/service/TimeService.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/service/TimeService.java
new file mode 100644
index 0000000..410d2f5
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/service/TimeService.java
@@ -0,0 +1,12 @@
+package org.apache.usergrid.persistence.collection.service;
+
+
+/** @author tnine */
+public interface TimeService {
+
+ /**
+ * Get the current time in milliseconds since epoch
+ * @return
+ */
+ long getTime();
+}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/service/UUIDService.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/service/UUIDService.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/service/UUIDService.java
new file mode 100644
index 0000000..31a3072
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/service/UUIDService.java
@@ -0,0 +1,15 @@
+package org.apache.usergrid.persistence.collection.service;
+
+
+import java.util.UUID;
+
+
+/** @author tnine */
+public interface UUIDService {
+
+ /**
+ * Generate a new time uuid
+ * @return
+ */
+ UUID newTimeUUID();
+}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/service/impl/ServiceModule.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/service/impl/ServiceModule.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/service/impl/ServiceModule.java
new file mode 100644
index 0000000..858aed7
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/service/impl/ServiceModule.java
@@ -0,0 +1,34 @@
+package org.apache.usergrid.persistence.collection.service.impl;
+
+
+import org.apache.usergrid.persistence.collection.astynax.AstynaxKeyspaceProvider;
+import org.apache.usergrid.persistence.collection.migration.Migration;
+import org.apache.usergrid.persistence.collection.migration.MigrationManager;
+import org.apache.usergrid.persistence.collection.migration.MigrationManagerImpl;
+import org.apache.usergrid.persistence.collection.serialization.MvccEntitySerializationStrategy;
+import org.apache.usergrid.persistence.collection.serialization.MvccLogEntrySerializationStrategy;
+import org.apache.usergrid.persistence.collection.serialization.impl.MvccEntitySerializationStrategyImpl;
+import org.apache.usergrid.persistence.collection.serialization.impl.MvccLogEntrySerializationStrategyImpl;
+import org.apache.usergrid.persistence.collection.service.TimeService;
+import org.apache.usergrid.persistence.collection.service.UUIDService;
+
+import com.google.inject.AbstractModule;
+import com.google.inject.multibindings.Multibinder;
+import com.netflix.astyanax.Keyspace;
+
+
+/** @author tnine */
+public class ServiceModule extends AbstractModule{
+
+ @Override
+ protected void configure() {
+
+ //bind our keyspace to the AstynaxKeyspaceProvider
+ bind( TimeService.class ).to( TimeServiceImpl.class );
+
+ //bind our migration manager
+ bind( UUIDService.class ).to( UUIDServiceImpl.class );
+
+
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/service/impl/TimeServiceImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/service/impl/TimeServiceImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/service/impl/TimeServiceImpl.java
new file mode 100644
index 0000000..ba49edd
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/service/impl/TimeServiceImpl.java
@@ -0,0 +1,14 @@
+package org.apache.usergrid.persistence.collection.service.impl;
+
+
+import org.apache.usergrid.persistence.collection.service.TimeService;
+
+
+/** @author tnine */
+public class TimeServiceImpl implements TimeService {
+
+ @Override
+ public long getTime() {
+ return System.currentTimeMillis();
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/service/impl/UUIDServiceImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/service/impl/UUIDServiceImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/service/impl/UUIDServiceImpl.java
new file mode 100644
index 0000000..223d13c
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/service/impl/UUIDServiceImpl.java
@@ -0,0 +1,17 @@
+package org.apache.usergrid.persistence.collection.service.impl;
+
+
+import java.util.UUID;
+
+import org.apache.usergrid.persistence.collection.service.UUIDService;
+import org.apache.usergrid.persistence.model.util.UUIDGenerator;
+
+
+/** @author tnine */
+public class UUIDServiceImpl implements UUIDService {
+
+ @Override
+ public UUID newTimeUUID() {
+ return UUIDGenerator.newTimeUUID();
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/CollectionContextImplTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/CollectionContextImplTest.java b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/CollectionContextImplTest.java
index ed0a17b..dd7770a 100644
--- a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/CollectionContextImplTest.java
+++ b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/CollectionContextImplTest.java
@@ -5,6 +5,7 @@ import java.util.UUID;
import org.junit.Test;
+import org.apache.usergrid.persistence.collection.impl.CollectionContextImpl;
import org.apache.usergrid.persistence.model.util.UUIDGenerator;
import static junit.framework.TestCase.assertEquals;
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/guice/TestCollectionModule.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/guice/TestCollectionModule.java b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/guice/TestCollectionModule.java
index 1d56a5d..e8a16bd 100644
--- a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/guice/TestCollectionModule.java
+++ b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/guice/TestCollectionModule.java
@@ -3,7 +3,6 @@ package org.apache.usergrid.persistence.collection.guice;
import java.util.HashMap;
import java.util.Map;
-import java.util.Properties;
import org.apache.cassandra.locator.SimpleStrategy;
@@ -11,7 +10,7 @@ import org.apache.usergrid.persistence.collection.astynax.AstynaxKeyspaceProvide
import org.apache.usergrid.persistence.collection.migration.MigrationException;
import org.apache.usergrid.persistence.collection.migration.MigrationManager;
import org.apache.usergrid.persistence.collection.migration.MigrationManagerImpl;
-import org.apache.usergrid.persistence.collection.serialization.MvccLogEntrySerializationStrategyImpl;
+import org.apache.usergrid.persistence.collection.serialization.impl.MvccLogEntrySerializationStrategyImpl;
import org.apache.usergrid.persistence.test.CassandraRule;
import com.google.guiceberry.GuiceBerryEnvMain;
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/entity/MvccEntityImplTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/entity/MvccEntityImplTest.java b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/entity/MvccEntityImplTest.java
deleted file mode 100644
index 324c931..0000000
--- a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/entity/MvccEntityImplTest.java
+++ /dev/null
@@ -1,132 +0,0 @@
-package org.apache.usergrid.persistence.collection.mvcc.entity;
-
-
-import java.util.UUID;
-
-import org.junit.Test;
-
-import org.apache.usergrid.persistence.collection.CollectionContext;
-import org.apache.usergrid.persistence.collection.CollectionContextImpl;
-import org.apache.usergrid.persistence.model.entity.Entity;
-import org.apache.usergrid.persistence.model.util.UUIDGenerator;
-
-import com.google.common.base.Optional;
-
-import static org.junit.Assert.assertEquals;
-
-
-/** @author tnine */
-public class MvccEntityImplTest {
-
- @Test( expected = NullPointerException.class )
- public void contextRequired() {
- new MvccEntityImpl( null, UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(),
- Optional.of( new Entity() ) );
- }
-
-
- @Test( expected = NullPointerException.class )
- public void entityIdRequired() {
- final CollectionContext context =
- new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" );
-
- new MvccEntityImpl( context, null, UUIDGenerator.newTimeUUID(), Optional.of( new Entity() ) );
- }
-
-
- @Test( expected = NullPointerException.class )
- public void versionRequired() {
- final CollectionContext context =
- new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" );
-
- new MvccEntityImpl( context, UUIDGenerator.newTimeUUID(), null, Optional.of( new Entity() ) );
- }
-
-
- @Test( expected = NullPointerException.class )
- public void entityRequired() {
- final CollectionContext context =
- new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" );
-
- new MvccEntityImpl( context, UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), ( Entity ) null );
- }
-
-
- @Test( expected = NullPointerException.class )
- public void optionalRequired() {
- final CollectionContext context =
- new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" );
-
- new MvccEntityImpl( context, UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), ( Optional ) null );
- }
-
-
- @Test
- public void correctValueEntity() {
- final CollectionContext context =
- new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" );
-
- final UUID entityId = UUIDGenerator.newTimeUUID();
- final UUID version = UUIDGenerator.newTimeUUID();
- final Entity entity = new Entity( entityId, "test" );
-
- MvccEntityImpl logEntry = new MvccEntityImpl( context, entityId, version, entity );
-
- assertEquals( context, logEntry.getContext() );
- assertEquals( entityId, logEntry.getUuid() );
- assertEquals( version, logEntry.getVersion() );
- assertEquals( entity, logEntry.getEntity().get() );
- }
-
-
- @Test
- public void correctValueOptional() {
- final CollectionContext context =
- new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" );
-
- final UUID entityId = UUIDGenerator.newTimeUUID();
- final UUID version = UUIDGenerator.newTimeUUID();
- final Entity entity = new Entity( entityId, "test" );
-
- MvccEntityImpl logEntry = new MvccEntityImpl( context, entityId, version, Optional.of( entity ) );
-
- assertEquals( context, logEntry.getContext() );
- assertEquals( entityId, logEntry.getUuid() );
- assertEquals( version, logEntry.getVersion() );
- assertEquals( entity, logEntry.getEntity().get() );
- }
-
-
- @Test
- public void equals() {
- final CollectionContext context =
- new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" );
-
- final UUID entityId = UUIDGenerator.newTimeUUID();
- final UUID version = UUIDGenerator.newTimeUUID();
- final Entity entity = new Entity( entityId, "test" );
-
- MvccEntityImpl first = new MvccEntityImpl( context, entityId, version, Optional.of( entity ) );
-
- MvccEntityImpl second = new MvccEntityImpl( context, entityId, version, Optional.of( entity ) );
-
- assertEquals( first, second );
- }
-
-
- @Test
- public void testHashCode() {
- final CollectionContext context =
- new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" );
-
- final UUID entityId = UUIDGenerator.newTimeUUID();
- final UUID version = UUIDGenerator.newTimeUUID();
- final Entity entity = new Entity( entityId, "test" );
-
- MvccEntityImpl first = new MvccEntityImpl( context, entityId, version, Optional.of( entity ) );
-
- MvccEntityImpl second = new MvccEntityImpl( context, entityId, version, Optional.of( entity ) );
-
- assertEquals( first.hashCode(), second.hashCode() );
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/entity/MvccLogEntryImplTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/entity/MvccLogEntryImplTest.java b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/entity/MvccLogEntryImplTest.java
deleted file mode 100644
index 918498f..0000000
--- a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/entity/MvccLogEntryImplTest.java
+++ /dev/null
@@ -1,104 +0,0 @@
-package org.apache.usergrid.persistence.collection.mvcc.entity;
-
-
-import java.util.UUID;
-
-import org.junit.Test;
-
-import org.apache.usergrid.persistence.collection.CollectionContext;
-import org.apache.usergrid.persistence.collection.CollectionContextImpl;
-import org.apache.usergrid.persistence.model.util.UUIDGenerator;
-
-import static org.junit.Assert.assertEquals;
-
-
-/** @author tnine */
-public class MvccLogEntryImplTest {
-
- @Test( expected = NullPointerException.class )
- public void contextRequired() {
- new MvccLogEntryImpl( null, UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), Stage.ACTIVE );
- }
-
-
- @Test( expected = NullPointerException.class )
- public void entityIdRequired() {
- final CollectionContext context =
- new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" );
-
- new MvccLogEntryImpl( context, null, UUIDGenerator.newTimeUUID(), Stage.ACTIVE );
- }
-
-
- @Test( expected = NullPointerException.class )
- public void versionRequired() {
- final CollectionContext context =
- new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" );
-
- new MvccLogEntryImpl( context, UUIDGenerator.newTimeUUID(), null, Stage.ACTIVE );
- }
-
-
- @Test( expected = NullPointerException.class )
- public void stageRequired() {
- final CollectionContext context =
- new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" );
-
- new MvccLogEntryImpl( context, UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), null );
- }
-
-
- @Test
- public void correctValue() {
- final CollectionContext context =
- new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" );
-
- final UUID entityId = UUIDGenerator.newTimeUUID();
- final UUID version = UUIDGenerator.newTimeUUID();
- final Stage stage = Stage.COMPLETE;
-
-
- MvccLogEntry logEntry = new MvccLogEntryImpl( context, entityId, version, stage );
-
- assertEquals( context, logEntry.getContext() );
- assertEquals( entityId, logEntry.getEntityId() );
- assertEquals( version, logEntry.getVersion() );
- assertEquals( stage, logEntry.getStage() );
- }
-
-
- @Test
- public void equals() {
- final CollectionContext context =
- new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" );
-
- final UUID entityId = UUIDGenerator.newTimeUUID();
- final UUID version = UUIDGenerator.newTimeUUID();
- final Stage stage = Stage.COMPLETE;
-
-
- MvccLogEntry first = new MvccLogEntryImpl( context, entityId, version, stage );
-
- MvccLogEntry second = new MvccLogEntryImpl( context, entityId, version, stage );
-
- assertEquals( first, second );
- }
-
-
- @Test
- public void testHashCode() {
- final CollectionContext context =
- new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" );
-
- final UUID entityId = UUIDGenerator.newTimeUUID();
- final UUID version = UUIDGenerator.newTimeUUID();
- final Stage stage = Stage.COMPLETE;
-
-
- MvccLogEntry first = new MvccLogEntryImpl( context, entityId, version, stage );
-
- MvccLogEntry second = new MvccLogEntryImpl( context, entityId, version, stage );
-
- assertEquals( first.hashCode(), second.hashCode() );
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/entity/StageTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/entity/StageTest.java b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/entity/StageTest.java
deleted file mode 100644
index 0090e64..0000000
--- a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/entity/StageTest.java
+++ /dev/null
@@ -1,91 +0,0 @@
-package org.apache.usergrid.persistence.collection.mvcc.entity;
-
-
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-
-/**
- * @author tnine
- */
-public class StageTest {
-
- @Test
- public void active() {
-
- assertTrue( Stage.ACTIVE.isTransient() );
-
- assertEquals( ( byte ) 0, Stage.ACTIVE.getId() );
-
- testUnique( Stage.ACTIVE );
- }
-
-
- @Test
- public void rollback() {
-
- assertTrue( Stage.ROLLBACK.isTransient() );
-
- assertEquals( ( byte ) 1, Stage.ROLLBACK.getId() );
-
- testUnique( Stage.ROLLBACK );
- }
-
-
- @Test
- public void comitted() {
-
- assertFalse( Stage.COMMITTED.isTransient() );
-
- assertEquals( ( byte ) 2, Stage.COMMITTED.getId() );
-
- testUnique( Stage.COMMITTED );
- }
-
-
-
-
- @Test
- public void postProcess() {
-
- assertFalse( Stage.POSTPROCESS.isTransient() );
-
- assertEquals( ( byte ) 6, Stage.POSTPROCESS.getId() );
-
- testUnique( Stage.POSTPROCESS );
- }
-
-
- @Test
- public void complete() {
-
- assertFalse( Stage.COMPLETE.isTransient() );
-
- assertEquals( ( byte ) 14, Stage.COMPLETE.getId() );
-
- testUnique( Stage.COMPLETE );
- }
-
-
- /**
- * Test we don't have dups in the byte value
- * @param test
- */
- private void testUnique( Stage test ) {
-
- for ( Stage stage : Stage.values() ) {
-
- //skip self
- if ( stage == test ) {
- continue;
- }
-
- assertFalse( stage.getId() == test.getId() );
- }
- }
-
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/entity/impl/MvccEntityImplTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/entity/impl/MvccEntityImplTest.java b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/entity/impl/MvccEntityImplTest.java
new file mode 100644
index 0000000..1b80318
--- /dev/null
+++ b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/entity/impl/MvccEntityImplTest.java
@@ -0,0 +1,107 @@
+package org.apache.usergrid.persistence.collection.mvcc.entity.impl;
+
+
+import java.util.UUID;
+
+import org.junit.Test;
+
+import org.apache.usergrid.persistence.collection.mvcc.entity.impl.MvccEntityImpl;
+import org.apache.usergrid.persistence.model.entity.Entity;
+import org.apache.usergrid.persistence.model.util.UUIDGenerator;
+
+import com.google.common.base.Optional;
+
+import static org.junit.Assert.assertEquals;
+
+
+/** @author tnine */
+public class MvccEntityImplTest {
+
+
+ @Test( expected = NullPointerException.class )
+ public void entityIdRequired() {
+
+ new MvccEntityImpl( null, UUIDGenerator.newTimeUUID(), Optional.of( new Entity() ) );
+ }
+
+
+ @Test( expected = NullPointerException.class )
+ public void versionRequired() {
+
+ new MvccEntityImpl( UUIDGenerator.newTimeUUID(), null, Optional.of( new Entity() ) );
+ }
+
+
+ @Test( expected = NullPointerException.class )
+ public void entityRequired() {
+
+ new MvccEntityImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), ( Entity ) null );
+ }
+
+
+ @Test( expected = NullPointerException.class )
+ public void optionalRequired() {
+
+ new MvccEntityImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), ( Optional ) null );
+ }
+
+
+ @Test
+ public void correctValueEntity() {
+
+ final UUID entityId = UUIDGenerator.newTimeUUID();
+ final UUID version = UUIDGenerator.newTimeUUID();
+ final Entity entity = new Entity( entityId, "test" );
+
+ MvccEntityImpl logEntry = new MvccEntityImpl( entityId, version, entity );
+
+ assertEquals( entityId, logEntry.getUuid() );
+ assertEquals( version, logEntry.getVersion() );
+ assertEquals( entity, logEntry.getEntity().get() );
+ }
+
+
+ @Test
+ public void correctValueOptional() {
+
+ final UUID entityId = UUIDGenerator.newTimeUUID();
+ final UUID version = UUIDGenerator.newTimeUUID();
+ final Entity entity = new Entity( entityId, "test" );
+
+ MvccEntityImpl logEntry = new MvccEntityImpl( entityId, version, Optional.of( entity ) );
+
+ assertEquals( entityId, logEntry.getUuid() );
+ assertEquals( version, logEntry.getVersion() );
+ assertEquals( entity, logEntry.getEntity().get() );
+ }
+
+
+ @Test
+ public void equals() {
+
+ final UUID entityId = UUIDGenerator.newTimeUUID();
+ final UUID version = UUIDGenerator.newTimeUUID();
+ final Entity entity = new Entity( entityId, "test" );
+
+ MvccEntityImpl first = new MvccEntityImpl( entityId, version, Optional.of( entity ) );
+
+ MvccEntityImpl second = new MvccEntityImpl( entityId, version, Optional.of( entity ) );
+
+ assertEquals( first, second );
+ }
+
+
+ @Test
+ public void testHashCode() {
+
+ final UUID entityId = UUIDGenerator.newTimeUUID();
+ final UUID version = UUIDGenerator.newTimeUUID();
+ final Entity entity = new Entity( entityId, "test" );
+
+ MvccEntityImpl first = new MvccEntityImpl( entityId, version, Optional.of( entity ) );
+
+ MvccEntityImpl second = new MvccEntityImpl( entityId, version, Optional.of( entity ) );
+
+ assertEquals( first.hashCode(), second.hashCode() );
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/entity/impl/MvccLogEntryImplTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/entity/impl/MvccLogEntryImplTest.java b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/entity/impl/MvccLogEntryImplTest.java
new file mode 100644
index 0000000..947541f
--- /dev/null
+++ b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/entity/impl/MvccLogEntryImplTest.java
@@ -0,0 +1,95 @@
+package org.apache.usergrid.persistence.collection.mvcc.entity.impl;
+
+
+import java.util.UUID;
+
+import org.junit.Test;
+
+import org.apache.usergrid.persistence.collection.CollectionContext;
+import org.apache.usergrid.persistence.collection.impl.CollectionContextImpl;
+import org.apache.usergrid.persistence.collection.mvcc.entity.MvccLogEntry;
+import org.apache.usergrid.persistence.collection.mvcc.entity.Stage;
+import org.apache.usergrid.persistence.collection.mvcc.entity.impl.MvccLogEntryImpl;
+import org.apache.usergrid.persistence.model.util.UUIDGenerator;
+
+import static org.junit.Assert.assertEquals;
+
+
+/** @author tnine */
+public class MvccLogEntryImplTest {
+
+
+ @Test( expected = NullPointerException.class )
+ public void entityIdRequired() {
+ final CollectionContext context =
+ new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" );
+
+ new MvccLogEntryImpl( null, UUIDGenerator.newTimeUUID(), Stage.ACTIVE );
+ }
+
+
+ @Test( expected = NullPointerException.class )
+ public void versionRequired() {
+ final CollectionContext context =
+ new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" );
+
+ new MvccLogEntryImpl( UUIDGenerator.newTimeUUID(), null, Stage.ACTIVE );
+ }
+
+
+ @Test( expected = NullPointerException.class )
+ public void stageRequired() {
+ final CollectionContext context =
+ new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" );
+
+ new MvccLogEntryImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), null );
+ }
+
+
+ @Test
+ public void correctValue() {
+
+ final UUID entityId = UUIDGenerator.newTimeUUID();
+ final UUID version = UUIDGenerator.newTimeUUID();
+ final Stage stage = Stage.COMPLETE;
+
+
+ MvccLogEntry logEntry = new MvccLogEntryImpl( entityId, version, stage );
+
+ assertEquals( entityId, logEntry.getEntityId() );
+ assertEquals( version, logEntry.getVersion() );
+ assertEquals( stage, logEntry.getStage() );
+ }
+
+
+ @Test
+ public void equals() {
+
+ final UUID entityId = UUIDGenerator.newTimeUUID();
+ final UUID version = UUIDGenerator.newTimeUUID();
+ final Stage stage = Stage.COMPLETE;
+
+
+ MvccLogEntry first = new MvccLogEntryImpl( entityId, version, stage );
+
+ MvccLogEntry second = new MvccLogEntryImpl( entityId, version, stage );
+
+ assertEquals( first, second );
+ }
+
+
+ @Test
+ public void testHashCode() {
+
+ final UUID entityId = UUIDGenerator.newTimeUUID();
+ final UUID version = UUIDGenerator.newTimeUUID();
+ final Stage stage = Stage.COMPLETE;
+
+
+ MvccLogEntry first = new MvccLogEntryImpl( entityId, version, stage );
+
+ MvccLogEntry second = new MvccLogEntryImpl( entityId, version, stage );
+
+ assertEquals( first.hashCode(), second.hashCode() );
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/entity/impl/StageTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/entity/impl/StageTest.java b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/entity/impl/StageTest.java
new file mode 100644
index 0000000..51fe34b
--- /dev/null
+++ b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/entity/impl/StageTest.java
@@ -0,0 +1,93 @@
+package org.apache.usergrid.persistence.collection.mvcc.entity.impl;
+
+
+import org.junit.Test;
+
+import org.apache.usergrid.persistence.collection.mvcc.entity.Stage;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+
+/**
+ * @author tnine
+ */
+public class StageTest {
+
+ @Test
+ public void active() {
+
+ assertTrue( Stage.ACTIVE.isTransient() );
+
+ assertEquals( ( byte ) 0, Stage.ACTIVE.getId() );
+
+ testUnique( Stage.ACTIVE );
+ }
+
+
+ @Test
+ public void rollback() {
+
+ assertTrue( Stage.ROLLBACK.isTransient() );
+
+ assertEquals( ( byte ) 1, Stage.ROLLBACK.getId() );
+
+ testUnique( Stage.ROLLBACK );
+ }
+
+
+ @Test
+ public void comitted() {
+
+ assertFalse( Stage.COMMITTED.isTransient() );
+
+ assertEquals( ( byte ) 2, Stage.COMMITTED.getId() );
+
+ testUnique( Stage.COMMITTED );
+ }
+
+
+
+
+ @Test
+ public void postProcess() {
+
+ assertFalse( Stage.POSTPROCESS.isTransient() );
+
+ assertEquals( ( byte ) 6, Stage.POSTPROCESS.getId() );
+
+ testUnique( Stage.POSTPROCESS );
+ }
+
+
+ @Test
+ public void complete() {
+
+ assertFalse( Stage.COMPLETE.isTransient() );
+
+ assertEquals( ( byte ) 14, Stage.COMPLETE.getId() );
+
+ testUnique( Stage.COMPLETE );
+ }
+
+
+ /**
+ * Test we don't have dups in the byte value
+ * @param test
+ */
+ private void testUnique( Stage test ) {
+
+ for ( Stage stage : Stage.values() ) {
+
+ //skip self
+ if ( stage == test ) {
+ continue;
+ }
+
+ assertFalse( stage.getId() == test.getId() );
+ }
+ }
+
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/StartTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/StartTest.java b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/StartTest.java
deleted file mode 100644
index aa79a70..0000000
--- a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/StartTest.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package org.apache.usergrid.persistence.collection.mvcc.stage;
-
-
-import java.util.UUID;
-
-import org.junit.Test;
-
-import org.apache.usergrid.persistence.collection.CollectionContextImpl;
-import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntityImpl;
-import org.apache.usergrid.persistence.collection.mvcc.stage.impl.Start;
-import org.apache.usergrid.persistence.collection.serialization.MvccLogEntrySerializationStrategy;
-import org.apache.usergrid.persistence.model.entity.Entity;
-import org.apache.usergrid.persistence.model.util.UUIDGenerator;
-
-import static org.mockito.Mockito.mock;
-
-
-/** @author tnine */
-public class StartTest {
-
- @Test
- public void testStartStage(){
-
- final MvccLogEntrySerializationStrategy logStrategy = mock(MvccLogEntrySerializationStrategy.class);
-
- Start start = new Start( logStrategy );
-
- //set up the data
-
- final UUID applicationId = UUIDGenerator.newTimeUUID();
-
- final UUID ownerId = UUIDGenerator.newTimeUUID();
-
- final UUID entityId = UUIDGenerator.newTimeUUID();
-
- final UUID version = UUIDGenerator.newTimeUUID();
-
- final String name = "tests";
-
-
- CollectionContextImpl collection = new CollectionContextImpl( applicationId, ownerId, name );
-
-
- Entity entity = new Entity();
-
- MvccEntityImpl mvccEntity = new MvccEntityImpl(collection, entityId, version, entity );
-
-
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/MvccEntityNewTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/MvccEntityNewTest.java b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/MvccEntityNewTest.java
new file mode 100644
index 0000000..05e9460
--- /dev/null
+++ b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/MvccEntityNewTest.java
@@ -0,0 +1,136 @@
+package org.apache.usergrid.persistence.collection.mvcc.stage.impl;
+
+
+import java.util.UUID;
+import java.util.concurrent.ExecutionException;
+
+import org.junit.Test;
+import org.mockito.ArgumentCaptor;
+
+import org.apache.usergrid.persistence.collection.CollectionContext;
+import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntity;
+import org.apache.usergrid.persistence.collection.mvcc.entity.MvccLogEntry;
+import org.apache.usergrid.persistence.collection.mvcc.entity.Stage;
+import org.apache.usergrid.persistence.collection.mvcc.stage.WriteContext;
+import org.apache.usergrid.persistence.collection.mvcc.stage.impl.MvccEntityNew;
+import org.apache.usergrid.persistence.collection.serialization.MvccLogEntrySerializationStrategy;
+import org.apache.usergrid.persistence.collection.service.TimeService;
+import org.apache.usergrid.persistence.collection.service.UUIDService;
+import org.apache.usergrid.persistence.model.entity.Entity;
+import org.apache.usergrid.persistence.model.util.UUIDGenerator;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import com.netflix.astyanax.MutationBatch;
+import com.netflix.astyanax.connectionpool.OperationResult;
+import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.same;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+
+/** @author tnine */
+public class MvccEntityNewTest {
+
+ /**
+ * Test the start stage for happy path
+ * TODO throw junk at it
+ * TODO refactor a lot of this mock setup. It's common across a lot of tests
+ */
+ @Test
+ public void testStartStage() throws ConnectionException, ExecutionException, InterruptedException {
+
+ final MvccLogEntrySerializationStrategy logStrategy = mock( MvccLogEntrySerializationStrategy.class );
+
+ final ArgumentCaptor<MvccLogEntry> logEntry = ArgumentCaptor.forClass( MvccLogEntry.class );
+
+
+ final WriteContext writeContext = mock( WriteContext.class );
+ final CollectionContext context = mock( CollectionContext.class );
+
+
+ //mock returning the context
+ when( writeContext.getCollectionContext() ).thenReturn( context );
+
+
+ final MutationBatch mutation = mock( MutationBatch.class );
+
+
+ //mock returning a mock mutation when we do a log entry write
+ when( logStrategy.write( same( context ), logEntry.capture() ) ).thenReturn( mutation );
+
+
+ //mock the listenable future
+ final ListenableFuture<OperationResult<Void>> future = mock( ListenableFuture.class);
+ final OperationResult<Void> result = mock(OperationResult.class);
+
+ when(mutation.executeAsync()).thenReturn( future );
+
+ //mock the "get" on the future
+ when(future.get()).thenReturn( result );
+
+
+ //set up the mock to return the entity from the start phase
+ final Entity entity = new Entity();
+
+ when( writeContext.getMessage( Entity.class ) ).thenReturn( entity );
+
+
+ //mock returning the time
+ final TimeService timeService = mock( TimeService.class );
+
+ final long time = System.currentTimeMillis();
+
+ when( timeService.getTime() ).thenReturn( time );
+
+
+ //mock the uuid service
+ final UUIDService uuidService = mock( UUIDService.class );
+
+ final UUID newEntityId = UUIDGenerator.newTimeUUID();
+ final UUID newVersion = newEntityId;
+
+
+ //mock the uuid service
+ when( uuidService.newTimeUUID() ).thenReturn( newEntityId );
+
+
+ //run the stage
+ MvccEntityNew newStage = new MvccEntityNew( logStrategy, timeService, uuidService );
+
+ newStage.performStage( writeContext );
+
+
+ //now verify our output was correct
+ ArgumentCaptor<MvccEntity> mvccEntity = ArgumentCaptor.forClass( MvccEntity.class );
+
+
+ verify( writeContext).setMessage( mvccEntity.capture() );
+
+ MvccEntity created = mvccEntity.getValue();
+
+ //verify uuid and version in both the MvccEntity and the entity itself
+ assertEquals( "entity id did not match generator", newEntityId, created.getUuid() );
+ assertEquals( "entity id did not match generator", newEntityId, created.getEntity().get().getUuid() );
+ assertEquals( "version did not not match entityId", newVersion, created.getVersion() );
+ assertEquals( "version did not not match entityId", newVersion, created.getEntity().get().getVersion() );
+
+ //check the time
+ assertEquals( "created time matches generator", time, created.getEntity().get().getCreated() );
+ assertEquals( "updated time matches generator", time, created.getEntity().get().getUpdated() );
+
+ //now verify we invoked the mvcc log operation correctly
+
+ MvccLogEntry entry = logEntry.getValue();
+
+ assertEquals("Log entry has correct uuid", newEntityId, entry.getEntityId());
+ assertEquals("Log entry has correct version", newVersion, entry.getEntityId());
+ assertEquals( "Stage was correct", Stage.ACTIVE, entry.getStage() );
+
+ //now verify the proceed was called
+ verify(writeContext).proceed();
+
+ }
+}
[3/5] Major refactor complete. Need to work on scheduling of futures.
Posted by to...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/MvccEntitySerializationStrategyImplTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/MvccEntitySerializationStrategyImplTest.java b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/MvccEntitySerializationStrategyImplTest.java
deleted file mode 100644
index ffa868e..0000000
--- a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/MvccEntitySerializationStrategyImplTest.java
+++ /dev/null
@@ -1,430 +0,0 @@
-package org.apache.usergrid.persistence.collection.serialization;
-
-
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.UUID;
-
-import org.junit.Rule;
-import org.junit.Test;
-
-import org.apache.cassandra.db.marshal.UUIDType;
-
-import org.apache.usergrid.persistence.collection.CollectionContext;
-import org.apache.usergrid.persistence.collection.CollectionContextImpl;
-import org.apache.usergrid.persistence.collection.guice.TestCollectionModule;
-import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntity;
-import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntityImpl;
-import org.apache.usergrid.persistence.model.entity.Entity;
-import org.apache.usergrid.persistence.model.field.BooleanField;
-import org.apache.usergrid.persistence.model.field.DoubleField;
-import org.apache.usergrid.persistence.model.field.Field;
-import org.apache.usergrid.persistence.model.field.IntegerField;
-import org.apache.usergrid.persistence.model.field.LongField;
-import org.apache.usergrid.persistence.model.field.StringField;
-import org.apache.usergrid.persistence.model.field.UUIDField;
-import org.apache.usergrid.persistence.model.util.UUIDGenerator;
-import org.apache.usergrid.persistence.test.CassandraRule;
-
-import com.google.common.base.Optional;
-import com.google.guiceberry.junit4.GuiceBerryRule;
-import com.google.inject.Inject;
-import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
-import com.netflix.astyanax.serializers.UUIDSerializer;
-import com.netflix.astyanax.util.TimeUUIDUtils;
-
-import static junit.framework.Assert.assertEquals;
-import static junit.framework.Assert.assertSame;
-import static junit.framework.TestCase.assertFalse;
-import static junit.framework.TestCase.assertNull;
-import static org.junit.Assert.assertTrue;
-
-
-/**
- * @author tnine
- */
-public class MvccEntitySerializationStrategyImplTest {
-
- @Rule
- public final GuiceBerryRule guiceBerry = new GuiceBerryRule( TestCollectionModule.class );
-
- @Rule
- public final CassandraRule rule = new CassandraRule();
-
- @Inject
- private MvccEntitySerializationStrategy serializationStrategy;
-
-
- @Test
- public void writeLoadDelete() throws ConnectionException {
-
- final UUID applicationId = UUIDGenerator.newTimeUUID();
- final String name = "test";
-
- CollectionContext context = new CollectionContextImpl( applicationId, applicationId, name );
-
-
- final UUID entityId = UUIDGenerator.newTimeUUID();
- final UUID version = UUIDGenerator.newTimeUUID();
- final String type = "test";
- final long created = 1l;
- final long updated = 2l;
-
- Entity entity = new Entity( entityId, type );
-
- entity.setVersion( version );
- entity.setCreated( created );
- entity.setUpdated( updated );
-
-
- BooleanField boolField = new BooleanField( "boolean", false );
- DoubleField doubleField = new DoubleField( "double", 1d );
- IntegerField intField = new IntegerField( "long", 1 );
- LongField longField = new LongField( "int", 1l );
- StringField stringField = new StringField( "name", "test" );
- UUIDField uuidField = new UUIDField( "uuid", UUIDGenerator.newTimeUUID() );
-
- entity.setField( boolField );
- entity.setField( doubleField );
- entity.setField( intField );
- entity.setField( longField );
- entity.setField( stringField );
- entity.setField( uuidField );
-
-
- MvccEntity saved = new MvccEntityImpl( context, entityId, version, Optional.of( entity ) );
-
-
- //persist the entity
- serializationStrategy.write( saved ).execute();
-
- //now read it back
-
- MvccEntity returned = serializationStrategy.load( context, entityId, version );
-
- assertEquals( "Mvcc entities are the same", saved, returned );
-
-
- assertEquals( entityId, entity.getUuid() );
- assertEquals( type, entity.getType() );
- assertEquals( created, entity.getCreated() );
- assertEquals( updated, entity.getUpdated() );
-
-
- Field<Boolean> boolFieldReturned = entity.getField( boolField.getName() );
-
- assertSame( boolField, boolFieldReturned );
-
- Field<Double> doubleFieldReturned = entity.getField( doubleField.getName() );
-
- assertSame( doubleField, doubleFieldReturned );
-
- Field<Integer> intFieldReturned = entity.getField( intField.getName() );
-
- assertSame( intField, intFieldReturned );
-
- Field<Long> longFieldReturned = entity.getField( longField.getName() );
-
- assertSame( longField, longFieldReturned );
-
- Field<String> stringFieldReturned = entity.getField( stringField.getName() );
-
- assertSame( stringField, stringFieldReturned );
-
- Field<UUID> uuidFieldReturned = entity.getField( uuidField.getName() );
-
- assertSame( uuidField, uuidFieldReturned );
-
-
- Set<Field> results = new HashSet<Field>();
- results.addAll( entity.getFields() );
-
-
- assertTrue( results.contains( boolField ) );
- assertTrue( results.contains( doubleField ) );
- assertTrue( results.contains( intField ) );
- assertTrue( results.contains( longField ) );
- assertTrue( results.contains( stringField ) );
- assertTrue( results.contains( uuidField ) );
-
- assertEquals( 6, results.size() );
-
-
- assertEquals( entityId, entity.getUuid() );
- assertEquals( version, entity.getVersion() );
-
-
- //now delete it
- serializationStrategy.delete( context, entityId, version ).execute();
-
- //now get it, should be gone
-
- returned = serializationStrategy.load( context, entityId, version );
-
- assertNull( returned );
- }
-
-
- @Test
- public void writeLoadClearDelete() throws ConnectionException {
-
- final UUID applicationId = UUIDGenerator.newTimeUUID();
- final String name = "test";
-
- CollectionContext context = new CollectionContextImpl( applicationId, applicationId, name );
-
-
- final UUID entityId = UUIDGenerator.newTimeUUID();
- final UUID version = UUIDGenerator.newTimeUUID();
- final String type = "test";
- final long created = 1l;
- final long updated = 2l;
-
- Entity entity = new Entity( entityId, type );
-
- entity.setVersion( version );
- entity.setCreated( created );
- entity.setUpdated( updated );
-
-
- MvccEntity saved = new MvccEntityImpl( context, entityId, version, Optional.of( entity ) );
-
-
- //persist the entity
- serializationStrategy.write( saved ).execute();
-
- //now read it back
-
- MvccEntity returned = serializationStrategy.load( context, entityId, version );
-
- assertEquals( "Mvcc entities are the same", saved, returned );
-
-
- assertEquals( entityId, entity.getUuid() );
- assertEquals( type, entity.getType() );
- assertEquals( created, entity.getCreated() );
- assertEquals( updated, entity.getUpdated() );
-
-
- //now clear it
-
- serializationStrategy.clear( context, entityId, version ).execute();
-
- returned = serializationStrategy.load( context, entityId, version );
-
- assertEquals( context, returned.getContext() );
- assertEquals( entityId, returned.getUuid() );
- assertEquals( version, returned.getVersion() );
- assertFalse( returned.getEntity().isPresent() );
-
- //now delete it
- serializationStrategy.delete( context, entityId, version ).execute();
-
- //now get it, should be gone
-
- returned = serializationStrategy.load( context, entityId, version );
-
- assertNull( returned );
- }
-
-
- @Test
- public void writeX2ClearDelete() throws ConnectionException {
-
- final UUID applicationId = UUIDGenerator.newTimeUUID();
- final String name = "test";
-
- CollectionContext context = new CollectionContextImpl( applicationId, applicationId, name );
-
-
- final UUID entityId = UUIDGenerator.newTimeUUID();
- final UUID version1 = UUIDGenerator.newTimeUUID();
- final String type = "test";
-
- Entity entityv1 = new Entity( entityId, type );
-
- entityv1.setVersion( version1 );
-
-
- MvccEntity saved = new MvccEntityImpl( context, entityId, version1, Optional.of( entityv1 ) );
-
-
- //persist the entity
- serializationStrategy.write( saved ).execute();
-
- //now read it back
-
- MvccEntity returnedV1 = serializationStrategy.load( context, entityId, version1 );
-
- assertEquals( "Mvcc entities are the same", saved, returnedV1 );
-
-
- assertEquals( entityId, entityv1.getUuid() );
- assertEquals( type, entityv1.getType() );
-
-
- //now write a new version of it
-
-
- Entity entityv2 = new Entity( entityId, type );
-
- UUID version2 = UUIDGenerator.newTimeUUID();
- entityv2.setVersion( version2 );
-
-
- UUIDType comparator = UUIDType.instance;
-
- int value = comparator.compare( UUIDSerializer.get().toByteBuffer( version1 ), UUIDSerializer.get().toByteBuffer( version2 ) );
-
- assertTrue(value < 0);
-
- value = comparator.compare( UUIDSerializer.get().toByteBuffer( version2 ), UUIDSerializer.get().toByteBuffer( version2 ) );
-
- assertEquals(0, value);
-
- MvccEntity savedV2 = new MvccEntityImpl( context, entityId, version2, Optional.of( entityv2 ) );
-
- serializationStrategy.write( savedV2 ).execute();
-
- MvccEntity returnedV2 = serializationStrategy.load( context, entityId, version2 );
-
- assertEquals( "Mvcc entities are the same", savedV2, returnedV2 );
-
-
- //now clear it at v3
-
- UUID version3 = UUIDGenerator.newTimeUUID();
-
- serializationStrategy.clear( context, entityId, version3 ).execute();
-
-
- final Optional<Entity> empty = Optional.absent();
-
- MvccEntity clearedV3 = new MvccEntityImpl( context, entityId, version3, empty );
-
- MvccEntity returnedV3 = serializationStrategy.load( context, entityId, version3 );
-
- assertEquals("entities are the same", clearedV3, returnedV3);
-
- //now ask for up to 10 versions from the current version, we should get cleared, v2, v1
- UUID current = UUIDGenerator.newTimeUUID();
-
- List<MvccEntity> entities = serializationStrategy.load( context, entityId, current, 3 );
-
- assertEquals( 3, entities.size() );
-
- assertEquals( clearedV3, entities.get( 0 ) );
-
- assertEquals( returnedV2, entities.get( 1 ) );
-
- assertEquals( returnedV1, entities.get( 2 ) );
-
-
- //now delete v2 and v1, we should still get v3
- serializationStrategy.delete( context, entityId, version1 ).execute();
- serializationStrategy.delete( context, entityId, version2 ).execute();
-
- entities = serializationStrategy.load( context, entityId, current, 3 );
-
- assertEquals( 1, entities.size() );
-
- assertEquals( clearedV3, entities.get( 0 ) );
-
-
- //now get it, should be gone
- serializationStrategy.delete( context, entityId, version3 ).execute();
-
-
- entities = serializationStrategy.load( context, entityId, current, 3 );
-
- assertEquals( 0, entities.size() );
- }
-
-
- @Test(expected = NullPointerException.class)
- public void writeParams() throws ConnectionException {
- serializationStrategy.write( null );
- }
-
-
- @Test(expected = NullPointerException.class)
- public void deleteParamContext() throws ConnectionException {
- serializationStrategy.delete( null, UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID() );
- }
-
-
- @Test(expected = NullPointerException.class)
- public void deleteParamEntityId() throws ConnectionException {
-
- serializationStrategy
- .delete( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
- null, UUIDGenerator.newTimeUUID() );
- }
-
-
- @Test(expected = NullPointerException.class)
- public void deleteParamVersion() throws ConnectionException {
-
- serializationStrategy
- .delete( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
- UUIDGenerator.newTimeUUID(), null );
- }
-
-
- @Test(expected = NullPointerException.class)
- public void loadParamContext() throws ConnectionException {
- serializationStrategy.load( null, UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID() );
- }
-
-
- @Test(expected = NullPointerException.class)
- public void loadParamEntityId() throws ConnectionException {
-
- serializationStrategy
- .load( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
- null, UUIDGenerator.newTimeUUID() );
- }
-
-
- @Test(expected = NullPointerException.class)
- public void loadParamVersion() throws ConnectionException {
-
- serializationStrategy
- .load( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
- UUIDGenerator.newTimeUUID(), null );
- }
-
-
- @Test(expected = NullPointerException.class)
- public void loadListParamContext() throws ConnectionException {
- serializationStrategy.load( null, UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), 1 );
- }
-
-
- @Test(expected = NullPointerException.class)
- public void loadListParamEntityId() throws ConnectionException {
-
- serializationStrategy
- .load( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
- null, UUIDGenerator.newTimeUUID(), 1 );
- }
-
-
- @Test(expected = NullPointerException.class)
- public void loadListParamVersion() throws ConnectionException {
-
- serializationStrategy
- .load( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
- UUIDGenerator.newTimeUUID(), null, 1 );
- }
-
-
- @Test(expected = IllegalArgumentException.class)
- public void loadListParamSize() throws ConnectionException {
-
- serializationStrategy
- .load( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
- UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), 0 );
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/MvccLogEntrySerializationStrategyImplTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/MvccLogEntrySerializationStrategyImplTest.java b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/MvccLogEntrySerializationStrategyImplTest.java
deleted file mode 100644
index 195443e..0000000
--- a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/MvccLogEntrySerializationStrategyImplTest.java
+++ /dev/null
@@ -1,311 +0,0 @@
-package org.apache.usergrid.persistence.collection.serialization;
-
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
-
-import org.junit.Rule;
-import org.junit.Test;
-
-import org.apache.usergrid.persistence.collection.CollectionContext;
-import org.apache.usergrid.persistence.collection.CollectionContextImpl;
-import org.apache.usergrid.persistence.collection.guice.TestCollectionModule;
-import org.apache.usergrid.persistence.collection.mvcc.entity.MvccLogEntry;
-import org.apache.usergrid.persistence.collection.mvcc.entity.MvccLogEntryImpl;
-import org.apache.usergrid.persistence.collection.mvcc.entity.Stage;
-import org.apache.usergrid.persistence.model.util.UUIDGenerator;
-import org.apache.usergrid.persistence.test.CassandraRule;
-
-import com.google.guiceberry.GuiceBerryEnvSelector;
-import com.google.guiceberry.TestDescription;
-import com.google.guiceberry.junit4.GuiceBerryRule;
-import com.google.inject.Inject;
-import com.google.inject.Module;
-import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
-
-import static junit.framework.Assert.assertNotNull;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-
-
-/** @author tnine */
-public class MvccLogEntrySerializationStrategyImplTest {
-
-
- /** Set our timeout to 1 seconds. If it works for 1 seconds, we'll be good a any value */
- private static final int TIMEOUT = 1;
-
-
- @Rule
- public final GuiceBerryRule guiceBerry = new GuiceBerryRule( new TimeoutModMapper() );
-
- @Rule
- public final CassandraRule rule = new CassandraRule();
-
- @Inject
- private MvccLogEntrySerializationStrategy logEntryStrategy;
-
-
- @Test
- public void createAndDelete() throws ConnectionException {
-
- final UUID applicationId = UUIDGenerator.newTimeUUID();
- final String name = "test";
-
-
- CollectionContext context = new CollectionContextImpl( applicationId, applicationId, name );
-
-
- final UUID uuid = UUIDGenerator.newTimeUUID();
- final UUID version = UUIDGenerator.newTimeUUID();
-
- for ( Stage stage : Stage.values() ) {
- MvccLogEntry saved = new MvccLogEntryImpl( context, uuid, version, stage );
- logEntryStrategy.write( saved ).execute();
-
- //Read it back
-
- MvccLogEntry returned = logEntryStrategy.load( context, uuid, version );
-
- assertNotNull( "Returned value should not be null", returned );
-
- assertEquals( "Returned should equal the saved", saved, returned );
- }
- }
-
-
- @Test
- public void loadNoData() throws ConnectionException {
-
- final UUID applicationId = UUIDGenerator.newTimeUUID();
- final String name = "test";
-
-
- CollectionContext context = new CollectionContextImpl( applicationId, applicationId, name );
-
-
- final UUID uuid = UUIDGenerator.newTimeUUID();
- final UUID version = UUIDGenerator.newTimeUUID();
-
-
- MvccLogEntry returned = logEntryStrategy.load( context, uuid, version );
-
- assertNull( "Returned value should not exist", returned );
- }
-
-
- @Test
- public void getMultipleEntries() throws ConnectionException {
-
- final UUID applicationId = UUIDGenerator.newTimeUUID();
- final String name = "test";
-
-
- CollectionContext context = new CollectionContextImpl( applicationId, applicationId, name );
-
-
- final UUID uuid = UUIDGenerator.newTimeUUID();
-
- int count = 10;
-
- final UUID[] versions = new UUID[count];
- final Stage COMPLETE = Stage.COMPLETE;
- final MvccLogEntry[] entries = new MvccLogEntry[count];
-
-
- for ( int i = 0; i < count; i++ ) {
- versions[i] = UUIDGenerator.newTimeUUID();
-
- entries[i] = new MvccLogEntryImpl( context, uuid, versions[i], COMPLETE );
- logEntryStrategy.write( entries[i] ).execute();
-
- //Read it back
-
- MvccLogEntry returned = logEntryStrategy.load( context, uuid, versions[i] );
-
- assertNotNull( "Returned value should not be null", returned );
-
- assertEquals( "Returned should equal the saved", entries[i], returned );
- }
-
- //now do a range scan from the end
-
- List<MvccLogEntry> results = logEntryStrategy.load( context, uuid, versions[count - 1], count );
-
- assertEquals( count, results.size() );
-
- for ( int i = 0; i < count; i++ ) {
- final MvccLogEntry saved = entries[count - i - 1];
- final MvccLogEntry returned = results.get( i );
-
- assertEquals( "Entry was not equal to the saved value", saved, returned );
- }
-
- //now delete them all and ensure we get no results back
- for ( int i = 0; i < count; i++ ) {
- logEntryStrategy.delete( context, uuid, versions[i] ).execute();
- }
-
- results = logEntryStrategy.load( context, uuid, versions[versions.length - 1], versions.length );
-
- assertEquals( "All log entries were deleted", 0, results.size() );
- }
-
-
- @Test
- public void transientTimeout() throws ConnectionException, InterruptedException {
-
- final UUID applicationId = UUIDGenerator.newTimeUUID();
- final String name = "test";
-
-
- CollectionContext context = new CollectionContextImpl( applicationId, applicationId, name );
-
-
- final UUID uuid = UUIDGenerator.newTimeUUID();
- final UUID version = UUIDGenerator.newTimeUUID();
-
- for ( Stage stage : Stage.values() ) {
-
- MvccLogEntry saved = new MvccLogEntryImpl( context, uuid, version, stage );
- logEntryStrategy.write( saved ).execute();
-
- //Read it back after the timeout
-
- Thread.sleep( TIMEOUT * 1000 );
-
- MvccLogEntry returned = logEntryStrategy.load( context, uuid, version );
-
-
- if ( stage.isTransient() ) {
-
- assertNull( "Active is transient and should time out", returned );
- }
- else {
- assertNotNull( "Committed is not transient and should be returned", returned );
-
- assertEquals( "Returned should equal the saved", saved, returned );
- }
- }
- }
-
-
- @Test(expected = NullPointerException.class)
- public void writeParams() throws ConnectionException {
- logEntryStrategy.write( null );
- }
-
-
- @Test(expected = NullPointerException.class)
- public void deleteParamContext() throws ConnectionException {
- logEntryStrategy.delete( null, UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID() );
- }
-
-
- @Test(expected = NullPointerException.class)
- public void deleteParamEntityId() throws ConnectionException {
-
- logEntryStrategy
- .delete( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
- null, UUIDGenerator.newTimeUUID() );
- }
-
-
- @Test(expected = NullPointerException.class)
- public void deleteParamVersion() throws ConnectionException {
-
- logEntryStrategy
- .delete( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
- UUIDGenerator.newTimeUUID(), null );
- }
-
-
- @Test(expected = NullPointerException.class)
- public void loadParamContext() throws ConnectionException {
- logEntryStrategy.load( null, UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID() );
- }
-
-
- @Test(expected = NullPointerException.class)
- public void loadParamEntityId() throws ConnectionException {
-
- logEntryStrategy
- .load( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
- null, UUIDGenerator.newTimeUUID() );
- }
-
-
- @Test(expected = NullPointerException.class)
- public void loadParamVersion() throws ConnectionException {
-
- logEntryStrategy
- .load( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
- UUIDGenerator.newTimeUUID(), null );
- }
-
-
- @Test(expected = NullPointerException.class)
- public void loadListParamContext() throws ConnectionException {
- logEntryStrategy.load( null, UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), 1 );
- }
-
-
- @Test(expected = NullPointerException.class)
- public void loadListParamEntityId() throws ConnectionException {
-
- logEntryStrategy
- .load( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
- null, UUIDGenerator.newTimeUUID(), 1 );
- }
-
-
- @Test(expected = NullPointerException.class)
- public void loadListParamVersion() throws ConnectionException {
-
- logEntryStrategy
- .load( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
- UUIDGenerator.newTimeUUID(), null, 1 );
- }
-
-
- @Test(expected = IllegalArgumentException.class)
- public void loadListParamSize() throws ConnectionException {
-
- logEntryStrategy
- .load( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
- UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), 0 );
- }
-
-
- /** Mapper that will change which module we implement based on the test case */
- public static class TimeoutModMapper implements GuiceBerryEnvSelector {
-
- @Override
- public Class<? extends Module> guiceBerryEnvToUse( final TestDescription testDescription ) {
-
- //in this edge case, we want to truncate the timeout to 1 second for this test, override the env to use
- //this module setup
- if ( ( MvccLogEntrySerializationStrategyImplTest.class.getName() + ".transientTimeout" )
- .equals( testDescription.getName() ) ) {
- return TimeoutEnv.class;
- }
-
- //by default, we wnat to run the TestCollectionModule
- return TestCollectionModule.class;
- }
- }
-
-
- public static class TimeoutEnv extends TestCollectionModule {
-
- @Override
- public Map<String, String> getOverrides() {
- Map<String, String> timeout = new HashMap<String, String>();
- timeout.put( MvccLogEntrySerializationStrategyImpl.TIMEOUT_PROP, TIMEOUT + "" );
- return timeout;
- }
- }
-}
-
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/SerializationComparison.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/SerializationComparison.java b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/SerializationComparison.java
deleted file mode 100644
index a78293b..0000000
--- a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/SerializationComparison.java
+++ /dev/null
@@ -1,182 +0,0 @@
-package org.apache.usergrid.persistence.collection.serialization;
-
-
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.util.UUID;
-
-import org.codehaus.jackson.map.ObjectMapper;
-import org.codehaus.jackson.smile.SmileFactory;
-import org.junit.Ignore;
-import org.junit.Test;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import org.apache.usergrid.persistence.model.entity.Entity;
-import org.apache.usergrid.persistence.model.field.ArrayField;
-import org.apache.usergrid.persistence.model.field.BooleanField;
-import org.apache.usergrid.persistence.model.field.ByteBufferField;
-import org.apache.usergrid.persistence.model.field.DoubleField;
-import org.apache.usergrid.persistence.model.field.EntityObjectField;
-import org.apache.usergrid.persistence.model.field.IntegerField;
-import org.apache.usergrid.persistence.model.field.ListField;
-import org.apache.usergrid.persistence.model.field.LocationField;
-import org.apache.usergrid.persistence.model.field.LongField;
-import org.apache.usergrid.persistence.model.field.SetField;
-import org.apache.usergrid.persistence.model.field.StringField;
-import org.apache.usergrid.persistence.model.field.UUIDField;
-import org.apache.usergrid.persistence.model.util.UUIDGenerator;
-import org.apache.usergrid.persistence.model.value.EntityObject;
-import org.apache.usergrid.persistence.model.value.Location;
-
-import com.esotericsoftware.kryo.Kryo;
-import com.esotericsoftware.kryo.io.ByteBufferInputStream;
-import com.esotericsoftware.kryo.io.ByteBufferOutputStream;
-import com.esotericsoftware.kryo.io.Input;
-import com.esotericsoftware.kryo.io.Output;
-
-
-/**
- * TODO We need to get both of these serialization methods working, and benchmark them for comparison
- * Neither works out of the box for us without custom work.
- * @author tnine
- */
-public class SerializationComparison {
-
- private static final Logger logger = LoggerFactory.getLogger( SerializationComparison.class );
-
- private static final int count = 10000;
-
-
- @Test
- @Ignore
- public void smileSerialization() throws IOException {
- SmileFactory smile = new SmileFactory();
-
- ObjectMapper smileMapper = new ObjectMapper( smile );
-
-
- Entity entity = createEntity();
-
- long writeTime = 0;
- long readTime = 0;
-
- for ( int i = 0; i < count; i++ ) {
-
- //capture time in nannos for write
- long writeStart = System.nanoTime();
-
- byte[] smileData = smileMapper.writeValueAsBytes( entity );
-
- writeTime += System.nanoTime() - writeStart;
-
- long readStart = System.nanoTime();
-
- Entity otherValue = smileMapper.readValue( smileData, Entity.class );
-
- readTime += System.nanoTime() - readStart;
- }
-
- logger.info( "Smile took {} nanos for writing {} entities", writeTime, count );
- logger.info( "Smile took {} nanos for reading {} entities", readTime, count );
- }
-
-
- @Test
- @Ignore
- public void kyroSerialization() {
- Kryo kryo = new Kryo();
-
- //container classes
- kryo.register( Entity.class );
-
- kryo.register( EntityObject.class );
- kryo.register( Location.class );
-
-
- //field classes
- kryo.register( ArrayField.class );
- kryo.register( BooleanField.class );
- kryo.register( ByteBufferField.class );
- kryo.register( DoubleField.class );
- kryo.register( EntityObjectField.class );
- kryo.register( IntegerField.class );
- kryo.register( ListField.class );
- kryo.register( LocationField.class );
- kryo.register( LongField.class );
- kryo.register( SetField.class );
- kryo.register( StringField.class );
- kryo.register( UUIDField.class, new de.javakaffee.kryoserializers.UUIDSerializer() );
-
-
- long writeTime = 0;
- long readTime = 0;
-
- for ( int i = 0; i < count; i++ ) {
-
- //capture time in nanos for write
- long writeStart = System.nanoTime();
-
- ByteBuffer data = ByteBuffer.allocate( 1024 );
- ByteBufferOutputStream byteBuffOutputStream = new ByteBufferOutputStream(data);
- Output output = new Output( byteBuffOutputStream );
-
- Entity entity = createEntity();
-
- kryo.writeObject( output, entity );
- output.close();
-
- writeTime += System.nanoTime() - writeStart;
-
- data.rewind();
-
- long readStart = System.nanoTime();
-
-
- Input input = new Input( new ByteBufferInputStream( data ) );
- Entity loaded = kryo.readObject( input, Entity.class );
- input.close();
-
- readTime += System.nanoTime() - readStart;
- }
-
- logger.info( "Smile took {} nanos for writing {} entities", writeTime, count );
- logger.info( "Smile took {} nanos for reading {} entities", readTime, count );
- }
-
-
- private Entity createEntity() {
-
- final UUID entityId = UUIDGenerator.newTimeUUID();
-
- final UUID version = UUIDGenerator.newTimeUUID();
-
- Entity entity = new Entity( entityId, "test" );
- entity.setCreated( 1l );
- entity.setUpdated( 2l );
- entity.setVersion( version );
-
-
- BooleanField boolField = new BooleanField( "boolean", false );
- DoubleField doubleField = new DoubleField( "double", 1d );
- IntegerField intField = new IntegerField( "long", 1 );
- LongField longField = new LongField( "int", 1l );
- StringField stringField = new StringField( "name", "test" );
- UUIDField uuidField = new UUIDField( "uuid", UUIDGenerator.newTimeUUID() );
-
- entity.setField( boolField );
- entity.setField( doubleField );
- entity.setField( intField );
- entity.setField( longField );
- entity.setField( stringField );
- entity.setField( uuidField );
-
- return entity;
- }
-
-
-}
-
-
-
-
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyImplTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyImplTest.java b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyImplTest.java
new file mode 100644
index 0000000..daa9edd
--- /dev/null
+++ b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyImplTest.java
@@ -0,0 +1,438 @@
+package org.apache.usergrid.persistence.collection.serialization.impl;
+
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.UUID;
+
+import org.junit.Rule;
+import org.junit.Test;
+
+import org.apache.cassandra.db.marshal.UUIDType;
+
+import org.apache.usergrid.persistence.collection.CollectionContext;
+import org.apache.usergrid.persistence.collection.guice.TestCollectionModule;
+import org.apache.usergrid.persistence.collection.impl.CollectionContextImpl;
+import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntity;
+import org.apache.usergrid.persistence.collection.mvcc.entity.impl.MvccEntityImpl;
+import org.apache.usergrid.persistence.collection.serialization.MvccEntitySerializationStrategy;
+import org.apache.usergrid.persistence.model.entity.Entity;
+import org.apache.usergrid.persistence.model.field.BooleanField;
+import org.apache.usergrid.persistence.model.field.DoubleField;
+import org.apache.usergrid.persistence.model.field.Field;
+import org.apache.usergrid.persistence.model.field.IntegerField;
+import org.apache.usergrid.persistence.model.field.LongField;
+import org.apache.usergrid.persistence.model.field.StringField;
+import org.apache.usergrid.persistence.model.field.UUIDField;
+import org.apache.usergrid.persistence.model.util.UUIDGenerator;
+import org.apache.usergrid.persistence.test.CassandraRule;
+
+import com.google.common.base.Optional;
+import com.google.guiceberry.junit4.GuiceBerryRule;
+import com.google.inject.Inject;
+import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
+import com.netflix.astyanax.serializers.UUIDSerializer;
+
+import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertSame;
+import static junit.framework.TestCase.assertFalse;
+import static junit.framework.TestCase.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+
+
+/** @author tnine */
+public class MvccEntitySerializationStrategyImplTest {
+
+ @Rule
+ public final GuiceBerryRule guiceBerry = new GuiceBerryRule( TestCollectionModule.class );
+
+ @Rule
+ public final CassandraRule rule = new CassandraRule();
+
+ @Inject
+ private MvccEntitySerializationStrategy serializationStrategy;
+
+
+ @Test
+ public void writeLoadDelete() throws ConnectionException {
+
+ final UUID applicationId = UUIDGenerator.newTimeUUID();
+ final String name = "test";
+
+ CollectionContext context = new CollectionContextImpl( applicationId, applicationId, name );
+
+
+ final UUID entityId = UUIDGenerator.newTimeUUID();
+ final UUID version = UUIDGenerator.newTimeUUID();
+ final String type = "test";
+ final long created = 1l;
+ final long updated = 2l;
+
+ Entity entity = new Entity( entityId, type );
+
+ entity.setVersion( version );
+ entity.setCreated( created );
+ entity.setUpdated( updated );
+
+
+ BooleanField boolField = new BooleanField( "boolean", false );
+ DoubleField doubleField = new DoubleField( "double", 1d );
+ IntegerField intField = new IntegerField( "long", 1 );
+ LongField longField = new LongField( "int", 1l );
+ StringField stringField = new StringField( "name", "test" );
+ UUIDField uuidField = new UUIDField( "uuid", UUIDGenerator.newTimeUUID() );
+
+ entity.setField( boolField );
+ entity.setField( doubleField );
+ entity.setField( intField );
+ entity.setField( longField );
+ entity.setField( stringField );
+ entity.setField( uuidField );
+
+
+ MvccEntity saved = new MvccEntityImpl( entityId, version, Optional.of( entity ) );
+
+
+ //persist the entity
+ serializationStrategy.write( context, saved ).execute();
+
+ //now read it back
+
+ MvccEntity returned = serializationStrategy.load( context, entityId, version );
+
+ assertEquals( "Mvcc entities are the same", saved, returned );
+
+
+ assertEquals( entityId, entity.getUuid() );
+ assertEquals( type, entity.getType() );
+ assertEquals( created, entity.getCreated() );
+ assertEquals( updated, entity.getUpdated() );
+
+
+ Field<Boolean> boolFieldReturned = entity.getField( boolField.getName() );
+
+ assertSame( boolField, boolFieldReturned );
+
+ Field<Double> doubleFieldReturned = entity.getField( doubleField.getName() );
+
+ assertSame( doubleField, doubleFieldReturned );
+
+ Field<Integer> intFieldReturned = entity.getField( intField.getName() );
+
+ assertSame( intField, intFieldReturned );
+
+ Field<Long> longFieldReturned = entity.getField( longField.getName() );
+
+ assertSame( longField, longFieldReturned );
+
+ Field<String> stringFieldReturned = entity.getField( stringField.getName() );
+
+ assertSame( stringField, stringFieldReturned );
+
+ Field<UUID> uuidFieldReturned = entity.getField( uuidField.getName() );
+
+ assertSame( uuidField, uuidFieldReturned );
+
+
+ Set<Field> results = new HashSet<Field>();
+ results.addAll( entity.getFields() );
+
+
+ assertTrue( results.contains( boolField ) );
+ assertTrue( results.contains( doubleField ) );
+ assertTrue( results.contains( intField ) );
+ assertTrue( results.contains( longField ) );
+ assertTrue( results.contains( stringField ) );
+ assertTrue( results.contains( uuidField ) );
+
+ assertEquals( 6, results.size() );
+
+
+ assertEquals( entityId, entity.getUuid() );
+ assertEquals( version, entity.getVersion() );
+
+
+ //now delete it
+ serializationStrategy.delete( context, entityId, version ).execute();
+
+ //now get it, should be gone
+
+ returned = serializationStrategy.load( context, entityId, version );
+
+ assertNull( returned );
+ }
+
+
+ @Test
+ public void writeLoadClearDelete() throws ConnectionException {
+
+ final UUID applicationId = UUIDGenerator.newTimeUUID();
+ final String name = "test";
+
+ CollectionContext context = new CollectionContextImpl( applicationId, applicationId, name );
+
+
+ final UUID entityId = UUIDGenerator.newTimeUUID();
+ final UUID version = UUIDGenerator.newTimeUUID();
+ final String type = "test";
+ final long created = 1l;
+ final long updated = 2l;
+
+ Entity entity = new Entity( entityId, type );
+
+ entity.setVersion( version );
+ entity.setCreated( created );
+ entity.setUpdated( updated );
+
+
+ MvccEntity saved = new MvccEntityImpl( entityId, version, Optional.of( entity ) );
+
+
+ //persist the entity
+ serializationStrategy.write( context, saved ).execute();
+
+ //now read it back
+
+ MvccEntity returned = serializationStrategy.load( context, entityId, version );
+
+ assertEquals( "Mvcc entities are the same", saved, returned );
+
+
+ assertEquals( entityId, entity.getUuid() );
+ assertEquals( type, entity.getType() );
+ assertEquals( created, entity.getCreated() );
+ assertEquals( updated, entity.getUpdated() );
+
+
+ //now clear it
+
+ serializationStrategy.clear( context, entityId, version ).execute();
+
+ returned = serializationStrategy.load( context, entityId, version );
+
+ assertEquals( entityId, returned.getUuid() );
+ assertEquals( version, returned.getVersion() );
+ assertFalse( returned.getEntity().isPresent() );
+
+ //now delete it
+ serializationStrategy.delete( context, entityId, version ).execute();
+
+ //now get it, should be gone
+
+ returned = serializationStrategy.load( context, entityId, version );
+
+ assertNull( returned );
+ }
+
+
+ @Test
+ public void writeX2ClearDelete() throws ConnectionException {
+
+ final UUID applicationId = UUIDGenerator.newTimeUUID();
+ final String name = "test";
+
+ CollectionContext context = new CollectionContextImpl( applicationId, applicationId, name );
+
+
+ final UUID entityId = UUIDGenerator.newTimeUUID();
+ final UUID version1 = UUIDGenerator.newTimeUUID();
+ final String type = "test";
+
+ Entity entityv1 = new Entity( entityId, type );
+
+ entityv1.setVersion( version1 );
+
+
+ MvccEntity saved = new MvccEntityImpl( entityId, version1, Optional.of( entityv1 ) );
+
+
+ //persist the entity
+ serializationStrategy.write( context, saved ).execute();
+
+ //now read it back
+
+ MvccEntity returnedV1 = serializationStrategy.load( context, entityId, version1 );
+
+ assertEquals( "Mvcc entities are the same", saved, returnedV1 );
+
+
+ assertEquals( entityId, entityv1.getUuid() );
+ assertEquals( type, entityv1.getType() );
+
+
+ //now write a new version of it
+
+
+ Entity entityv2 = new Entity( entityId, type );
+
+ UUID version2 = UUIDGenerator.newTimeUUID();
+ entityv2.setVersion( version2 );
+
+
+ UUIDType comparator = UUIDType.instance;
+
+ int value = comparator.compare( UUIDSerializer.get().toByteBuffer( version1 ),
+ UUIDSerializer.get().toByteBuffer( version2 ) );
+
+ assertTrue( value < 0 );
+
+ value = comparator.compare( UUIDSerializer.get().toByteBuffer( version2 ),
+ UUIDSerializer.get().toByteBuffer( version2 ) );
+
+ assertEquals( 0, value );
+
+ MvccEntity savedV2 = new MvccEntityImpl( entityId, version2, Optional.of( entityv2 ) );
+
+ serializationStrategy.write( context, savedV2 ).execute();
+
+ MvccEntity returnedV2 = serializationStrategy.load( context, entityId, version2 );
+
+ assertEquals( "Mvcc entities are the same", savedV2, returnedV2 );
+
+
+ //now clear it at v3
+
+ UUID version3 = UUIDGenerator.newTimeUUID();
+
+ serializationStrategy.clear( context, entityId, version3 ).execute();
+
+
+ final Optional<Entity> empty = Optional.absent();
+
+ MvccEntity clearedV3 = new MvccEntityImpl( entityId, version3, empty );
+
+ MvccEntity returnedV3 = serializationStrategy.load( context, entityId, version3 );
+
+ assertEquals( "entities are the same", clearedV3, returnedV3 );
+
+ //now ask for up to 10 versions from the current version, we should get cleared, v2, v1
+ UUID current = UUIDGenerator.newTimeUUID();
+
+ List<MvccEntity> entities = serializationStrategy.load( context, entityId, current, 3 );
+
+ assertEquals( 3, entities.size() );
+
+ assertEquals( clearedV3, entities.get( 0 ) );
+
+ assertEquals( returnedV2, entities.get( 1 ) );
+
+ assertEquals( returnedV1, entities.get( 2 ) );
+
+
+ //now delete v2 and v1, we should still get v3
+ serializationStrategy.delete( context, entityId, version1 ).execute();
+ serializationStrategy.delete( context, entityId, version2 ).execute();
+
+ entities = serializationStrategy.load( context, entityId, current, 3 );
+
+ assertEquals( 1, entities.size() );
+
+ assertEquals( clearedV3, entities.get( 0 ) );
+
+
+ //now get it, should be gone
+ serializationStrategy.delete( context, entityId, version3 ).execute();
+
+
+ entities = serializationStrategy.load( context, entityId, current, 3 );
+
+ assertEquals( 0, entities.size() );
+ }
+
+
+ @Test( expected = NullPointerException.class )
+ public void writeParamsContext() throws ConnectionException {
+ serializationStrategy.write( null, mock( MvccEntity.class ) );
+ }
+
+
+ @Test( expected = NullPointerException.class )
+ public void writeParamsEntity() throws ConnectionException {
+ serializationStrategy
+ .write( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
+ null );
+ }
+
+
+ @Test( expected = NullPointerException.class )
+ public void deleteParamContext() throws ConnectionException {
+ serializationStrategy.delete( null, UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID() );
+ }
+
+
+ @Test( expected = NullPointerException.class )
+ public void deleteParamEntityId() throws ConnectionException {
+
+ serializationStrategy
+ .delete( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
+ null, UUIDGenerator.newTimeUUID() );
+ }
+
+
+ @Test( expected = NullPointerException.class )
+ public void deleteParamVersion() throws ConnectionException {
+
+ serializationStrategy
+ .delete( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
+ UUIDGenerator.newTimeUUID(), null );
+ }
+
+
+ @Test( expected = NullPointerException.class )
+ public void loadParamContext() throws ConnectionException {
+ serializationStrategy.load( null, UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID() );
+ }
+
+
+ @Test( expected = NullPointerException.class )
+ public void loadParamEntityId() throws ConnectionException {
+
+ serializationStrategy
+ .load( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
+ null, UUIDGenerator.newTimeUUID() );
+ }
+
+
+ @Test( expected = NullPointerException.class )
+ public void loadParamVersion() throws ConnectionException {
+
+ serializationStrategy
+ .load( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
+ UUIDGenerator.newTimeUUID(), null );
+ }
+
+
+ @Test( expected = NullPointerException.class )
+ public void loadListParamContext() throws ConnectionException {
+ serializationStrategy.load( null, UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), 1 );
+ }
+
+
+ @Test( expected = NullPointerException.class )
+ public void loadListParamEntityId() throws ConnectionException {
+
+ serializationStrategy
+ .load( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
+ null, UUIDGenerator.newTimeUUID(), 1 );
+ }
+
+
+ @Test( expected = NullPointerException.class )
+ public void loadListParamVersion() throws ConnectionException {
+
+ serializationStrategy
+ .load( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
+ UUIDGenerator.newTimeUUID(), null, 1 );
+ }
+
+
+ @Test( expected = IllegalArgumentException.class )
+ public void loadListParamSize() throws ConnectionException {
+
+ serializationStrategy
+ .load( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
+ UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), 0 );
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccLogEntrySerializationStrategyImplTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccLogEntrySerializationStrategyImplTest.java b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccLogEntrySerializationStrategyImplTest.java
new file mode 100644
index 0000000..9c47e08
--- /dev/null
+++ b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccLogEntrySerializationStrategyImplTest.java
@@ -0,0 +1,319 @@
+package org.apache.usergrid.persistence.collection.serialization.impl;
+
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+import org.junit.Rule;
+import org.junit.Test;
+
+import org.apache.usergrid.persistence.collection.CollectionContext;
+import org.apache.usergrid.persistence.collection.impl.CollectionContextImpl;
+import org.apache.usergrid.persistence.collection.guice.TestCollectionModule;
+import org.apache.usergrid.persistence.collection.mvcc.entity.MvccLogEntry;
+import org.apache.usergrid.persistence.collection.mvcc.entity.impl.MvccLogEntryImpl;
+import org.apache.usergrid.persistence.collection.mvcc.entity.Stage;
+import org.apache.usergrid.persistence.collection.serialization.MvccLogEntrySerializationStrategy;
+import org.apache.usergrid.persistence.model.util.UUIDGenerator;
+import org.apache.usergrid.persistence.test.CassandraRule;
+
+import com.google.guiceberry.GuiceBerryEnvSelector;
+import com.google.guiceberry.TestDescription;
+import com.google.guiceberry.junit4.GuiceBerryRule;
+import com.google.inject.Inject;
+import com.google.inject.Module;
+import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
+
+import static junit.framework.Assert.assertNotNull;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.mockito.Mockito.mock;
+
+
+/** @author tnine */
+public class MvccLogEntrySerializationStrategyImplTest {
+
+
+ /** Set our timeout to 1 seconds. If it works for 1 seconds, we'll be good a any value */
+ private static final int TIMEOUT = 1;
+
+
+ @Rule
+ public final GuiceBerryRule guiceBerry = new GuiceBerryRule( new TimeoutModMapper() );
+
+ @Rule
+ public final CassandraRule rule = new CassandraRule();
+
+ @Inject
+ private MvccLogEntrySerializationStrategy logEntryStrategy;
+
+
+ @Test
+ public void createAndDelete() throws ConnectionException {
+
+ final UUID applicationId = UUIDGenerator.newTimeUUID();
+ final String name = "test";
+
+
+ CollectionContext context = new CollectionContextImpl( applicationId, applicationId, name );
+
+
+ final UUID uuid = UUIDGenerator.newTimeUUID();
+ final UUID version = UUIDGenerator.newTimeUUID();
+
+ for ( Stage stage : Stage.values() ) {
+ MvccLogEntry saved = new MvccLogEntryImpl( uuid, version, stage );
+ logEntryStrategy.write( context, saved ).execute();
+
+ //Read it back
+
+ MvccLogEntry returned = logEntryStrategy.load( context, uuid, version );
+
+ assertNotNull( "Returned value should not be null", returned );
+
+ assertEquals( "Returned should equal the saved", saved, returned );
+ }
+ }
+
+
+ @Test
+ public void loadNoData() throws ConnectionException {
+
+ final UUID applicationId = UUIDGenerator.newTimeUUID();
+ final String name = "test";
+
+
+ CollectionContext context = new CollectionContextImpl( applicationId, applicationId, name );
+
+
+ final UUID uuid = UUIDGenerator.newTimeUUID();
+ final UUID version = UUIDGenerator.newTimeUUID();
+
+
+ MvccLogEntry returned = logEntryStrategy.load( context, uuid, version );
+
+ assertNull( "Returned value should not exist", returned );
+ }
+
+
+ @Test
+ public void getMultipleEntries() throws ConnectionException {
+
+ final UUID applicationId = UUIDGenerator.newTimeUUID();
+ final String name = "test";
+
+
+ CollectionContext context = new CollectionContextImpl( applicationId, applicationId, name );
+
+
+ final UUID uuid = UUIDGenerator.newTimeUUID();
+
+ int count = 10;
+
+ final UUID[] versions = new UUID[count];
+ final Stage COMPLETE = Stage.COMPLETE;
+ final MvccLogEntry[] entries = new MvccLogEntry[count];
+
+
+ for ( int i = 0; i < count; i++ ) {
+ versions[i] = UUIDGenerator.newTimeUUID();
+
+ entries[i] = new MvccLogEntryImpl( uuid, versions[i], COMPLETE );
+ logEntryStrategy.write( context, entries[i] ).execute();
+
+ //Read it back
+
+ MvccLogEntry returned = logEntryStrategy.load( context, uuid, versions[i] );
+
+ assertNotNull( "Returned value should not be null", returned );
+
+ assertEquals( "Returned should equal the saved", entries[i], returned );
+ }
+
+ //now do a range scan from the end
+
+ List<MvccLogEntry> results = logEntryStrategy.load( context, uuid, versions[count - 1], count );
+
+ assertEquals( count, results.size() );
+
+ for ( int i = 0; i < count; i++ ) {
+ final MvccLogEntry saved = entries[count - i - 1];
+ final MvccLogEntry returned = results.get( i );
+
+ assertEquals( "Entry was not equal to the saved value", saved, returned );
+ }
+
+ //now delete them all and ensure we get no results back
+ for ( int i = 0; i < count; i++ ) {
+ logEntryStrategy.delete( context, uuid, versions[i] ).execute();
+ }
+
+ results = logEntryStrategy.load( context, uuid, versions[versions.length - 1], versions.length );
+
+ assertEquals( "All log entries were deleted", 0, results.size() );
+ }
+
+
+ @Test
+ public void transientTimeout() throws ConnectionException, InterruptedException {
+
+ final UUID applicationId = UUIDGenerator.newTimeUUID();
+ final String name = "test";
+
+
+ CollectionContext context = new CollectionContextImpl( applicationId, applicationId, name );
+
+
+ final UUID uuid = UUIDGenerator.newTimeUUID();
+ final UUID version = UUIDGenerator.newTimeUUID();
+
+ for ( Stage stage : Stage.values() ) {
+
+ MvccLogEntry saved = new MvccLogEntryImpl( uuid, version, stage );
+ logEntryStrategy.write(context, saved ).execute();
+
+ //Read it back after the timeout
+
+ Thread.sleep( TIMEOUT * 1000 );
+
+ MvccLogEntry returned = logEntryStrategy.load( context, uuid, version );
+
+
+ if ( stage.isTransient() ) {
+
+ assertNull( "Active is transient and should time out", returned );
+ }
+ else {
+ assertNotNull( "Committed is not transient and should be returned", returned );
+
+ assertEquals( "Returned should equal the saved", saved, returned );
+ }
+ }
+ }
+
+
+ @Test(expected = NullPointerException.class)
+ public void writeParamsNoContext() throws ConnectionException {
+ logEntryStrategy.write( null, mock(MvccLogEntry.class) );
+ }
+
+
+ @Test(expected = NullPointerException.class)
+ public void writeParams() throws ConnectionException {
+ logEntryStrategy.write( mock(CollectionContext.class), null );
+ }
+
+
+ @Test(expected = NullPointerException.class)
+ public void deleteParamContext() throws ConnectionException {
+ logEntryStrategy.delete( null, UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID() );
+ }
+
+
+ @Test(expected = NullPointerException.class)
+ public void deleteParamEntityId() throws ConnectionException {
+
+ logEntryStrategy
+ .delete( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
+ null, UUIDGenerator.newTimeUUID() );
+ }
+
+
+ @Test(expected = NullPointerException.class)
+ public void deleteParamVersion() throws ConnectionException {
+
+ logEntryStrategy
+ .delete( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
+ UUIDGenerator.newTimeUUID(), null );
+ }
+
+
+ @Test(expected = NullPointerException.class)
+ public void loadParamContext() throws ConnectionException {
+ logEntryStrategy.load( null, UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID() );
+ }
+
+
+ @Test(expected = NullPointerException.class)
+ public void loadParamEntityId() throws ConnectionException {
+
+ logEntryStrategy
+ .load( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
+ null, UUIDGenerator.newTimeUUID() );
+ }
+
+
+ @Test(expected = NullPointerException.class)
+ public void loadParamVersion() throws ConnectionException {
+
+ logEntryStrategy
+ .load( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
+ UUIDGenerator.newTimeUUID(), null );
+ }
+
+
+ @Test(expected = NullPointerException.class)
+ public void loadListParamContext() throws ConnectionException {
+ logEntryStrategy.load( null, UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), 1 );
+ }
+
+
+ @Test(expected = NullPointerException.class)
+ public void loadListParamEntityId() throws ConnectionException {
+
+ logEntryStrategy
+ .load( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
+ null, UUIDGenerator.newTimeUUID(), 1 );
+ }
+
+
+ @Test(expected = NullPointerException.class)
+ public void loadListParamVersion() throws ConnectionException {
+
+ logEntryStrategy
+ .load( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
+ UUIDGenerator.newTimeUUID(), null, 1 );
+ }
+
+
+ @Test(expected = IllegalArgumentException.class)
+ public void loadListParamSize() throws ConnectionException {
+
+ logEntryStrategy
+ .load( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
+ UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), 0 );
+ }
+
+
+ /** Mapper that will change which module we implement based on the test case */
+ public static class TimeoutModMapper implements GuiceBerryEnvSelector {
+
+ @Override
+ public Class<? extends Module> guiceBerryEnvToUse( final TestDescription testDescription ) {
+
+ //in this edge case, we want to truncate the timeout to 1 second for this test, override the env to use
+ //this module setup
+ if ( ( MvccLogEntrySerializationStrategyImplTest.class.getName() + ".transientTimeout" )
+ .equals( testDescription.getName() ) ) {
+ return TimeoutEnv.class;
+ }
+
+ //by default, we wnat to run the TestCollectionModule
+ return TestCollectionModule.class;
+ }
+ }
+
+
+ public static class TimeoutEnv extends TestCollectionModule {
+
+ @Override
+ public Map<String, String> getOverrides() {
+ Map<String, String> timeout = new HashMap<String, String>();
+ timeout.put( MvccLogEntrySerializationStrategyImpl.TIMEOUT_PROP, TIMEOUT + "" );
+ return timeout;
+ }
+ }
+}
+
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/impl/SerializationComparison.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/impl/SerializationComparison.java b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/impl/SerializationComparison.java
new file mode 100644
index 0000000..e3dc3b1
--- /dev/null
+++ b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/impl/SerializationComparison.java
@@ -0,0 +1,182 @@
+package org.apache.usergrid.persistence.collection.serialization.impl;
+
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.util.UUID;
+
+import org.codehaus.jackson.map.ObjectMapper;
+import org.codehaus.jackson.smile.SmileFactory;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.usergrid.persistence.model.entity.Entity;
+import org.apache.usergrid.persistence.model.field.ArrayField;
+import org.apache.usergrid.persistence.model.field.BooleanField;
+import org.apache.usergrid.persistence.model.field.ByteBufferField;
+import org.apache.usergrid.persistence.model.field.DoubleField;
+import org.apache.usergrid.persistence.model.field.EntityObjectField;
+import org.apache.usergrid.persistence.model.field.IntegerField;
+import org.apache.usergrid.persistence.model.field.ListField;
+import org.apache.usergrid.persistence.model.field.LocationField;
+import org.apache.usergrid.persistence.model.field.LongField;
+import org.apache.usergrid.persistence.model.field.SetField;
+import org.apache.usergrid.persistence.model.field.StringField;
+import org.apache.usergrid.persistence.model.field.UUIDField;
+import org.apache.usergrid.persistence.model.util.UUIDGenerator;
+import org.apache.usergrid.persistence.model.value.EntityObject;
+import org.apache.usergrid.persistence.model.value.Location;
+
+import com.esotericsoftware.kryo.Kryo;
+import com.esotericsoftware.kryo.io.ByteBufferInputStream;
+import com.esotericsoftware.kryo.io.ByteBufferOutputStream;
+import com.esotericsoftware.kryo.io.Input;
+import com.esotericsoftware.kryo.io.Output;
+
+
+/**
+ * TODO We need to get both of these serialization methods working, and benchmark them for comparison
+ * Neither works out of the box for us without custom work.
+ * @author tnine
+ */
+public class SerializationComparison {
+
+ private static final Logger logger = LoggerFactory.getLogger( SerializationComparison.class );
+
+ private static final int count = 10000;
+
+
+ @Test
+ @Ignore
+ public void smileSerialization() throws IOException {
+ SmileFactory smile = new SmileFactory();
+
+ ObjectMapper smileMapper = new ObjectMapper( smile );
+
+
+ Entity entity = createEntity();
+
+ long writeTime = 0;
+ long readTime = 0;
+
+ for ( int i = 0; i < count; i++ ) {
+
+ //capture time in nannos for write
+ long writeStart = System.nanoTime();
+
+ byte[] smileData = smileMapper.writeValueAsBytes( entity );
+
+ writeTime += System.nanoTime() - writeStart;
+
+ long readStart = System.nanoTime();
+
+ Entity otherValue = smileMapper.readValue( smileData, Entity.class );
+
+ readTime += System.nanoTime() - readStart;
+ }
+
+ logger.info( "Smile took {} nanos for writing {} entities", writeTime, count );
+ logger.info( "Smile took {} nanos for reading {} entities", readTime, count );
+ }
+
+
+ @Test
+ @Ignore
+ public void kyroSerialization() {
+ Kryo kryo = new Kryo();
+
+ //container classes
+ kryo.register( Entity.class );
+
+ kryo.register( EntityObject.class );
+ kryo.register( Location.class );
+
+
+ //field classes
+ kryo.register( ArrayField.class );
+ kryo.register( BooleanField.class );
+ kryo.register( ByteBufferField.class );
+ kryo.register( DoubleField.class );
+ kryo.register( EntityObjectField.class );
+ kryo.register( IntegerField.class );
+ kryo.register( ListField.class );
+ kryo.register( LocationField.class );
+ kryo.register( LongField.class );
+ kryo.register( SetField.class );
+ kryo.register( StringField.class );
+ kryo.register( UUIDField.class, new de.javakaffee.kryoserializers.UUIDSerializer() );
+
+
+ long writeTime = 0;
+ long readTime = 0;
+
+ for ( int i = 0; i < count; i++ ) {
+
+ //capture time in nanos for write
+ long writeStart = System.nanoTime();
+
+ ByteBuffer data = ByteBuffer.allocate( 1024 );
+ ByteBufferOutputStream byteBuffOutputStream = new ByteBufferOutputStream(data);
+ Output output = new Output( byteBuffOutputStream );
+
+ Entity entity = createEntity();
+
+ kryo.writeObject( output, entity );
+ output.close();
+
+ writeTime += System.nanoTime() - writeStart;
+
+ data.rewind();
+
+ long readStart = System.nanoTime();
+
+
+ Input input = new Input( new ByteBufferInputStream( data ) );
+ Entity loaded = kryo.readObject( input, Entity.class );
+ input.close();
+
+ readTime += System.nanoTime() - readStart;
+ }
+
+ logger.info( "Smile took {} nanos for writing {} entities", writeTime, count );
+ logger.info( "Smile took {} nanos for reading {} entities", readTime, count );
+ }
+
+
+ private Entity createEntity() {
+
+ final UUID entityId = UUIDGenerator.newTimeUUID();
+
+ final UUID version = UUIDGenerator.newTimeUUID();
+
+ Entity entity = new Entity( entityId, "test" );
+ entity.setCreated( 1l );
+ entity.setUpdated( 2l );
+ entity.setVersion( version );
+
+
+ BooleanField boolField = new BooleanField( "boolean", false );
+ DoubleField doubleField = new DoubleField( "double", 1d );
+ IntegerField intField = new IntegerField( "long", 1 );
+ LongField longField = new LongField( "int", 1l );
+ StringField stringField = new StringField( "name", "test" );
+ UUIDField uuidField = new UUIDField( "uuid", UUIDGenerator.newTimeUUID() );
+
+ entity.setField( boolField );
+ entity.setField( doubleField );
+ entity.setField( intField );
+ entity.setField( longField );
+ entity.setField( stringField );
+ entity.setField( uuidField );
+
+ return entity;
+ }
+
+
+}
+
+
+
+
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/index/src/main/java/org/apache/usergrid/persistence/index/stage/Complete.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/index/src/main/java/org/apache/usergrid/persistence/index/stage/Complete.java b/stack/corepersistence/index/src/main/java/org/apache/usergrid/persistence/index/stage/Complete.java
index cc0bc35..dad2b21 100644
--- a/stack/corepersistence/index/src/main/java/org/apache/usergrid/persistence/index/stage/Complete.java
+++ b/stack/corepersistence/index/src/main/java/org/apache/usergrid/persistence/index/stage/Complete.java
@@ -1,7 +1,6 @@
package org.apache.usergrid.persistence.index.stage;
-import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntity;
import org.apache.usergrid.persistence.collection.mvcc.stage.WriteContext;
import org.apache.usergrid.persistence.collection.mvcc.stage.WriteStage;
@@ -15,8 +14,8 @@ public class Complete implements WriteStage
{
@Override
- public void performStage( WriteContext context, final MvccEntity entity ) {
-
- }
+ public void performStage( final WriteContext context ) {
+ //To change body of implemented methods use File | Settings | File Templates.
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/index/src/main/java/org/apache/usergrid/persistence/index/stage/Start.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/index/src/main/java/org/apache/usergrid/persistence/index/stage/Start.java b/stack/corepersistence/index/src/main/java/org/apache/usergrid/persistence/index/stage/Start.java
index d97b81c..05ecb1d 100644
--- a/stack/corepersistence/index/src/main/java/org/apache/usergrid/persistence/index/stage/Start.java
+++ b/stack/corepersistence/index/src/main/java/org/apache/usergrid/persistence/index/stage/Start.java
@@ -1,20 +1,16 @@
package org.apache.usergrid.persistence.index.stage;
-import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntity;
import org.apache.usergrid.persistence.collection.mvcc.stage.WriteContext;
import org.apache.usergrid.persistence.collection.mvcc.stage.WriteStage;
-import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
-
/** This state should signal an index update has started */
public class Start implements WriteStage
{
-
@Override
- public void performStage( final WriteContext context, final MvccEntity entity ) throws ConnectionException {
+ public void performStage( final WriteContext context ) {
//To change body of implemented methods use File | Settings | File Templates.
}
}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/index/src/main/java/org/apache/usergrid/persistence/index/stage/Write.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/index/src/main/java/org/apache/usergrid/persistence/index/stage/Write.java b/stack/corepersistence/index/src/main/java/org/apache/usergrid/persistence/index/stage/Write.java
index e143a6b..cff6d97 100644
--- a/stack/corepersistence/index/src/main/java/org/apache/usergrid/persistence/index/stage/Write.java
+++ b/stack/corepersistence/index/src/main/java/org/apache/usergrid/persistence/index/stage/Write.java
@@ -1,21 +1,18 @@
package org.apache.usergrid.persistence.index.stage;
-import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntity;
import org.apache.usergrid.persistence.collection.mvcc.stage.WriteContext;
import org.apache.usergrid.persistence.collection.mvcc.stage.WriteStage;
-import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
-
/** This state should perform an update of the index. */
public class Write implements WriteStage
{
- @Override
- public void performStage( final WriteContext context, final MvccEntity entity ) throws ConnectionException {
- //To change body of implemented methods use File | Settings | File Templates.
- }
+@Override
+ public void performStage( final WriteContext context ) {
+ //To change body of implemented methods use File | Settings | File Templates.
+ }
}
[2/5] git commit: WIP. Need to finish creating pipelines etc before
merging.
Posted by to...@apache.org.
WIP. Need to finish creating pipelines etc before merging.
Project: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/commit/271b26c8
Tree: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/tree/271b26c8
Diff: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/diff/271b26c8
Branch: refs/heads/two-dot-o
Commit: 271b26c8b25fa7e0f2250a35bc8e8caf78984581
Parents: b2833c3
Author: Todd Nine <to...@apache.org>
Authored: Mon Dec 2 20:29:39 2013 -0700
Committer: Todd Nine <to...@apache.org>
Committed: Mon Dec 2 20:29:39 2013 -0700
----------------------------------------------------------------------
.../collection/guice/CollectionModule.java | 2 +-
.../collection/mvcc/stage/StagePipeline.java | 1 +
.../collection/mvcc/stage/WriteContext.java | 2 +-
.../stage/impl/CollectionPipelineModule.java | 11 -------
.../mvcc/stage/impl/CreatePipeline.java | 4 +--
.../mvcc/stage/impl/StagePipelineImpl.java | 4 ---
.../collection/mvcc/stage/impl/Start.java | 5 +--
.../mvcc/stage/impl/WriteContextCallback.java | 34 ++++++++++++++++++++
8 files changed, 42 insertions(+), 21 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/271b26c8/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/guice/CollectionModule.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/guice/CollectionModule.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/guice/CollectionModule.java
index e675e88..5f5d544 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/guice/CollectionModule.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/guice/CollectionModule.java
@@ -6,9 +6,9 @@ import org.apache.usergrid.persistence.collection.migration.Migration;
import org.apache.usergrid.persistence.collection.migration.MigrationManager;
import org.apache.usergrid.persistence.collection.migration.MigrationManagerImpl;
import org.apache.usergrid.persistence.collection.mvcc.stage.StagePipeline;
-import org.apache.usergrid.persistence.collection.mvcc.stage.impl.UpdatePipeline;
import org.apache.usergrid.persistence.collection.mvcc.stage.impl.CreatePipeline;
import org.apache.usergrid.persistence.collection.mvcc.stage.impl.DeletePipeline;
+import org.apache.usergrid.persistence.collection.mvcc.stage.impl.UpdatePipeline;
import org.apache.usergrid.persistence.collection.serialization.MvccEntitySerializationStrategy;
import org.apache.usergrid.persistence.collection.serialization.MvccEntitySerializationStrategyImpl;
import org.apache.usergrid.persistence.collection.serialization.MvccLogEntrySerializationStrategy;
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/271b26c8/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/StagePipeline.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/StagePipeline.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/StagePipeline.java
index 30b274c..562d852 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/StagePipeline.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/StagePipeline.java
@@ -15,6 +15,7 @@ public interface StagePipeline {
*/
public WriteStage next();
+
/**
* Insert a new stage directly after the current stage. This can be used
* to add additional validation during write phases depending on the mvcc entity
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/271b26c8/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/WriteContext.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/WriteContext.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/WriteContext.java
index 38aa9d4..42cb6ab 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/WriteContext.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/WriteContext.java
@@ -18,7 +18,7 @@ public interface WriteContext {
* Perform the write in the context with the specified entity
* @param entity
*/
- void performWrite(MvccEntity entity);
+ void nextStage(MvccEntity entity);
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/271b26c8/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/CollectionPipelineModule.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/CollectionPipelineModule.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/CollectionPipelineModule.java
index 67ca516..809d92f 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/CollectionPipelineModule.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/CollectionPipelineModule.java
@@ -1,24 +1,13 @@
package org.apache.usergrid.persistence.collection.mvcc.stage.impl;
-import org.apache.usergrid.persistence.collection.astynax.AstynaxKeyspaceProvider;
-import org.apache.usergrid.persistence.collection.guice.PropertyUtils;
-import org.apache.usergrid.persistence.collection.migration.Migration;
-import org.apache.usergrid.persistence.collection.migration.MigrationManager;
-import org.apache.usergrid.persistence.collection.migration.MigrationManagerImpl;
import org.apache.usergrid.persistence.collection.mvcc.stage.StagePipeline;
-import org.apache.usergrid.persistence.collection.mvcc.stage.WriteStage;
import org.apache.usergrid.persistence.collection.serialization.MvccEntitySerializationStrategy;
-import org.apache.usergrid.persistence.collection.serialization.MvccEntitySerializationStrategyImpl;
import org.apache.usergrid.persistence.collection.serialization.MvccLogEntrySerializationStrategy;
-import org.apache.usergrid.persistence.collection.serialization.MvccLogEntrySerializationStrategyImpl;
import com.google.inject.AbstractModule;
import com.google.inject.Inject;
import com.google.inject.Provides;
-import com.google.inject.multibindings.Multibinder;
-import com.google.inject.name.Names;
-import com.netflix.astyanax.Keyspace;
/**
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/271b26c8/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/CreatePipeline.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/CreatePipeline.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/CreatePipeline.java
index fb7e7c1..e700940 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/CreatePipeline.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/CreatePipeline.java
@@ -6,10 +6,10 @@ import java.lang.annotation.Target;
import com.google.inject.BindingAnnotation;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
/**
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/271b26c8/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/StagePipelineImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/StagePipelineImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/StagePipelineImpl.java
index 5de58c5..b63769b 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/StagePipelineImpl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/StagePipelineImpl.java
@@ -1,13 +1,9 @@
package org.apache.usergrid.persistence.collection.mvcc.stage.impl;
-import java.util.ArrayList;
import java.util.Arrays;
-import java.util.Collections;
import java.util.List;
-import java.util.NoSuchElementException;
-import org.apache.usergrid.persistence.collection.mvcc.entity.Stage;
import org.apache.usergrid.persistence.collection.mvcc.stage.StagePipeline;
import org.apache.usergrid.persistence.collection.mvcc.stage.WriteStage;
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/271b26c8/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Start.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Start.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Start.java
index 6d4b63c..d86276d 100644
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Start.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/Start.java
@@ -12,6 +12,7 @@ import org.apache.usergrid.persistence.collection.mvcc.stage.WriteContext;
import org.apache.usergrid.persistence.collection.mvcc.stage.WriteStage;
import org.apache.usergrid.persistence.collection.serialization.MvccLogEntrySerializationStrategy;
+import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
import com.google.inject.Inject;
import com.google.inject.Singleton;
@@ -57,8 +58,8 @@ public class Start implements WriteStage {
throw new RuntimeException( "Failed to execute write asynchronously ", e );
}
- //todo next stage invocation
- //Futures.addCallback();
+ //set the next stage to invoke on return
+ Futures.addCallback(future, new WriteContextCallback(context, entity));
}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/271b26c8/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/WriteContextCallback.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/WriteContextCallback.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/WriteContextCallback.java
new file mode 100644
index 0000000..0fa408a
--- /dev/null
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/mvcc/stage/impl/WriteContextCallback.java
@@ -0,0 +1,34 @@
+package org.apache.usergrid.persistence.collection.mvcc.stage.impl;
+
+
+import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntity;
+import org.apache.usergrid.persistence.collection.mvcc.stage.WriteContext;
+
+import com.google.common.util.concurrent.FutureCallback;
+import com.netflix.astyanax.connectionpool.OperationResult;
+
+
+/** @author tnine */
+public class WriteContextCallback implements FutureCallback<OperationResult<Void>> {
+
+ private final WriteContext context;
+ private final MvccEntity entity;
+
+
+ public WriteContextCallback( final WriteContext context, final MvccEntity entity ) {
+ this.context = context;
+ this.entity = entity;
+ }
+
+
+ public void onSuccess( final OperationResult<Void> result ) {
+ //proceed to the next stage
+ context.nextStage( entity );
+ }
+
+
+ @Override
+ public void onFailure( final Throwable t ) {
+ throw new RuntimeException( "Failed to execute write", t );
+ }
+}