You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by bt...@apache.org on 2017/08/22 03:31:56 UTC

[1/9] james-project git commit: JAMES-2108 Add a self describing comment on Cassandra tables.

Repository: james-project
Updated Branches:
  refs/heads/master 87523ac81 -> 656de840c


JAMES-2108 Add a self describing comment on Cassandra tables.


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/621ba9a6
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/621ba9a6
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/621ba9a6

Branch: refs/heads/master
Commit: 621ba9a60638e16d9fcf9170bfae329e7ef72c2b
Parents: 87523ac
Author: benwa <bt...@linagora.com>
Authored: Thu Aug 3 09:52:09 2017 +0700
Committer: benwa <bt...@linagora.com>
Committed: Tue Aug 22 10:29:33 2017 +0700

----------------------------------------------------------------------
 .../versions/CassandraSchemaVersionModule.java  |  4 ++-
 .../cassandra/modules/CassandraAclModule.java   |  1 +
 .../modules/CassandraAnnotationModule.java      |  1 +
 .../modules/CassandraApplicableFlagsModule.java |  2 ++
 .../modules/CassandraAttachmentModule.java      |  4 ++-
 .../cassandra/modules/CassandraBlobModule.java  | 30 ++++++++++++--------
 .../modules/CassandraDeletedMessageModule.java  |  1 +
 .../modules/CassandraFirstUnseenModule.java     |  1 +
 .../modules/CassandraMailboxCounterModule.java  |  1 +
 .../modules/CassandraMailboxModule.java         |  3 ++
 .../modules/CassandraMailboxRecentsModule.java  |  2 ++
 .../modules/CassandraMessageModule.java         | 11 +++++--
 .../modules/CassandraModSeqModule.java          |  1 +
 .../cassandra/modules/CassandraQuotaModule.java |  3 ++
 .../modules/CassandraSubscriptionModule.java    |  1 +
 .../cassandra/modules/CassandraUidModule.java   |  1 +
 .../cassandra/CassandraDomainListModule.java    |  1 +
 .../james/rrt/cassandra/CassandraRRTModule.java |  1 +
 .../CassandraSieveRepositoryModule.java         | 20 +++++++++----
 .../CassandraUsersRepositoryModule.java         |  4 ++-
 .../cassandra/access/CassandraAccessModule.java |  1 +
 .../CassandraNotificationRegistryModule.java    |  1 +
 .../vacation/CassandraVacationModule.java       |  1 +
 23 files changed, 74 insertions(+), 22 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/621ba9a6/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/versions/CassandraSchemaVersionModule.java
----------------------------------------------------------------------
diff --git a/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/versions/CassandraSchemaVersionModule.java b/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/versions/CassandraSchemaVersionModule.java
index 4eb7325..0b5d55d 100644
--- a/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/versions/CassandraSchemaVersionModule.java
+++ b/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/versions/CassandraSchemaVersionModule.java
@@ -42,7 +42,9 @@ public class CassandraSchemaVersionModule implements CassandraModule {
                 SchemaBuilder.createTable(CassandraSchemaVersionTable.TABLE_NAME)
                     .ifNotExists()
                     .addPartitionKey(CassandraSchemaVersionTable.KEY, timeuuid())
-                    .addClusteringColumn(CassandraSchemaVersionTable.VALUE, cint())));
+                    .addClusteringColumn(CassandraSchemaVersionTable.VALUE, cint())
+                    .withOptions()
+                    .comment("Holds the history of the versions of the schema used.")));
     }
 
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/621ba9a6/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraAclModule.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraAclModule.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraAclModule.java
index 55ca04e..25f4e47 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraAclModule.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraAclModule.java
@@ -48,6 +48,7 @@ public class CassandraAclModule implements CassandraModule {
                     .addColumn(CassandraACLTable.ACL, text())
                     .addColumn(CassandraACLTable.VERSION, bigint())
                     .withOptions()
+                    .comment("Holds mailbox ACLs")
                     .caching(SchemaBuilder.KeyCaching.ALL,
                         SchemaBuilder.rows(CassandraConstants.DEFAULT_CACHED_ROW_PER_PARTITION))));
         types = ImmutableList.of();

http://git-wip-us.apache.org/repos/asf/james-project/blob/621ba9a6/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraAnnotationModule.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraAnnotationModule.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraAnnotationModule.java
index a1e049d..98af388 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraAnnotationModule.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraAnnotationModule.java
@@ -46,6 +46,7 @@ public class CassandraAnnotationModule implements CassandraModule {
                     .addClusteringColumn(CassandraAnnotationTable.KEY, text())
                     .addColumn(CassandraAnnotationTable.VALUE, text())
                     .withOptions()
+                    .comment("Holds Cassandra mailbox annotations")
                     .compactionOptions(SchemaBuilder.leveledStrategy())
                     .caching(SchemaBuilder.KeyCaching.ALL,
                         SchemaBuilder.rows(CassandraConstants.DEFAULT_CACHED_ROW_PER_PARTITION))));

http://git-wip-us.apache.org/repos/asf/james-project/blob/621ba9a6/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraApplicableFlagsModule.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraApplicableFlagsModule.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraApplicableFlagsModule.java
index 35de1b4..46dea02 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraApplicableFlagsModule.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraApplicableFlagsModule.java
@@ -47,6 +47,8 @@ public class CassandraApplicableFlagsModule implements CassandraModule {
                     .addPartitionKey(CassandraApplicableFlagTable.MAILBOX_ID, timeuuid())
                     .addColumn(Flag.USER_FLAGS, set(text()))
                     .withOptions()
+                    .comment("Holds flags being used on specific mailboxes. As system flags are implicit, this table " +
+                        "stores user flags.")
                     .compactionOptions(SchemaBuilder.leveledStrategy())
                     .caching(SchemaBuilder.KeyCaching.ALL,
                         SchemaBuilder.rows(CassandraConstants.DEFAULT_CACHED_ROW_PER_PARTITION))));

http://git-wip-us.apache.org/repos/asf/james-project/blob/621ba9a6/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraAttachmentModule.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraAttachmentModule.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraAttachmentModule.java
index 6c9f2bd..d576f91 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraAttachmentModule.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraAttachmentModule.java
@@ -46,7 +46,9 @@ public class CassandraAttachmentModule implements CassandraModule {
                     .addPartitionKey(CassandraAttachmentTable.ID, text())
                     .addColumn(CassandraAttachmentTable.PAYLOAD, blob())
                     .addColumn(CassandraAttachmentTable.TYPE, text())
-                    .addColumn(CassandraAttachmentTable.SIZE, bigint())));
+                    .addColumn(CassandraAttachmentTable.SIZE, bigint())
+                    .withOptions()
+                    .comment("Holds attachment for fast attachment retrieval")));
         types = ImmutableList.of();
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/621ba9a6/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraBlobModule.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraBlobModule.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraBlobModule.java
index a8a382b..b672e34 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraBlobModule.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraBlobModule.java
@@ -24,11 +24,11 @@ import java.util.List;
 import org.apache.james.backends.cassandra.components.CassandraModule;
 import org.apache.james.backends.cassandra.components.CassandraTable;
 import org.apache.james.backends.cassandra.components.CassandraType;
+import org.apache.james.mailbox.cassandra.table.BlobTable;
 
 import com.datastax.driver.core.DataType;
 import com.datastax.driver.core.schemabuilder.SchemaBuilder;
 import com.google.common.collect.ImmutableList;
-import org.apache.james.mailbox.cassandra.table.BlobTable;
 
 public class CassandraBlobModule implements CassandraModule {
 
@@ -37,17 +37,23 @@ public class CassandraBlobModule implements CassandraModule {
 
     public CassandraBlobModule() {
         tables = ImmutableList.of(
-                new CassandraTable(BlobTable.TABLE_NAME,
-                        SchemaBuilder.createTable(BlobTable.TABLE_NAME)
-                                .ifNotExists()
-                                .addPartitionKey(BlobTable.ID, DataType.text())
-                                .addClusteringColumn(BlobTable.NUMBER_OF_CHUNK, DataType.cint())),
-                new CassandraTable(BlobTable.BlobParts.TABLE_NAME,
-                        SchemaBuilder.createTable(BlobTable.BlobParts.TABLE_NAME)
-                                .ifNotExists()
-                                .addPartitionKey(BlobTable.ID, DataType.text())
-                                .addClusteringColumn(BlobTable.BlobParts.CHUNK_NUMBER, DataType.cint())
-                                .addColumn(BlobTable.BlobParts.DATA, DataType.blob())));
+            new CassandraTable(BlobTable.TABLE_NAME,
+                SchemaBuilder.createTable(BlobTable.TABLE_NAME)
+                    .ifNotExists()
+                    .addPartitionKey(BlobTable.ID, DataType.text())
+                    .addClusteringColumn(BlobTable.NUMBER_OF_CHUNK, DataType.cint())
+                    .withOptions()
+                    .comment("Holds information for retrieving all blob parts composing this blob. " +
+                        "Messages` headers and bodies are stored as blobparts.")),
+            new CassandraTable(BlobTable.BlobParts.TABLE_NAME,
+                SchemaBuilder.createTable(BlobTable.BlobParts.TABLE_NAME)
+                    .ifNotExists()
+                    .addPartitionKey(BlobTable.ID, DataType.text())
+                    .addClusteringColumn(BlobTable.BlobParts.CHUNK_NUMBER, DataType.cint())
+                    .addColumn(BlobTable.BlobParts.DATA, DataType.blob())
+                    .withOptions()
+                    .comment("Holds blob parts composing blobs ." +
+                        "Messages` headers and bodies are stored, chunked in blobparts.")));
         types = ImmutableList.of();
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/621ba9a6/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraDeletedMessageModule.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraDeletedMessageModule.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraDeletedMessageModule.java
index 2e97e36..46e99fb 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraDeletedMessageModule.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraDeletedMessageModule.java
@@ -46,6 +46,7 @@ public class CassandraDeletedMessageModule implements CassandraModule {
                 .addPartitionKey(MAILBOX_ID, DataType.timeuuid())
                 .addClusteringColumn(UID, DataType.bigint())
                 .withOptions()
+                .comment("Denormalisation table. Allows to retrieve UID marked as DELETED in specific mailboxes.")
                 .compactionOptions(SchemaBuilder.leveledStrategy())
                 .caching(SchemaBuilder.KeyCaching.ALL,
                     SchemaBuilder.rows(CassandraConstants.DEFAULT_CACHED_ROW_PER_PARTITION))));

http://git-wip-us.apache.org/repos/asf/james-project/blob/621ba9a6/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraFirstUnseenModule.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraFirstUnseenModule.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraFirstUnseenModule.java
index 871f779..1af9c0f 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraFirstUnseenModule.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraFirstUnseenModule.java
@@ -43,6 +43,7 @@ public class CassandraFirstUnseenModule implements CassandraModule {
                 .addPartitionKey(CassandraFirstUnseenTable.MAILBOX_ID, DataType.timeuuid())
                 .addClusteringColumn(CassandraFirstUnseenTable.UID, DataType.bigint())
                 .withOptions()
+                .comment("Denormalisation table. Allow to quickly retrieve the first UNSEEN UID of a specific mailbox.")
                 .compactionOptions(SchemaBuilder.leveledStrategy())
                 .caching(SchemaBuilder.KeyCaching.ALL,
                     SchemaBuilder.rows(CassandraConstants.DEFAULT_CACHED_ROW_PER_PARTITION))

http://git-wip-us.apache.org/repos/asf/james-project/blob/621ba9a6/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraMailboxCounterModule.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraMailboxCounterModule.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraMailboxCounterModule.java
index 3fad014..5a402f3 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraMailboxCounterModule.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraMailboxCounterModule.java
@@ -47,6 +47,7 @@ public class CassandraMailboxCounterModule implements CassandraModule {
                     .addColumn(CassandraMailboxCountersTable.COUNT, counter())
                     .addColumn(CassandraMailboxCountersTable.UNSEEN, counter())
                     .withOptions()
+                    .comment("Holds messages count and unseen message count for each mailbox.")
                     .compactionOptions(SchemaBuilder.leveledStrategy())
                     .caching(SchemaBuilder.KeyCaching.ALL,
                         SchemaBuilder.rows(CassandraConstants.DEFAULT_CACHED_ROW_PER_PARTITION))));

http://git-wip-us.apache.org/repos/asf/james-project/blob/621ba9a6/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraMailboxModule.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraMailboxModule.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraMailboxModule.java
index 3b44c7e..20e05fb 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraMailboxModule.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraMailboxModule.java
@@ -50,6 +50,7 @@ public class CassandraMailboxModule implements CassandraModule {
                     .addColumn(CassandraMailboxTable.NAME, text())
                     .addColumn(CassandraMailboxTable.UIDVALIDITY, bigint())
                     .withOptions()
+                    .comment("Holds the mailboxes information.")
                     .caching(SchemaBuilder.KeyCaching.ALL,
                         SchemaBuilder.rows(CassandraConstants.DEFAULT_CACHED_ROW_PER_PARTITION))),
             new CassandraTable(CassandraMailboxPathTable.TABLE_NAME,
@@ -59,6 +60,8 @@ public class CassandraMailboxModule implements CassandraModule {
                     .addClusteringColumn(CassandraMailboxPathTable.MAILBOX_NAME, text())
                     .addColumn(CassandraMailboxPathTable.MAILBOX_ID, timeuuid())
                     .withOptions()
+                    .comment("Denormalisation table. Allow to retrieve mailboxes belonging to a certain user. This is a " +
+                        "LIST optimisation.")
                     .caching(SchemaBuilder.KeyCaching.ALL,
                         SchemaBuilder.rows(CassandraConstants.DEFAULT_CACHED_ROW_PER_PARTITION))));
         types = ImmutableList.of(

http://git-wip-us.apache.org/repos/asf/james-project/blob/621ba9a6/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraMailboxRecentsModule.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraMailboxRecentsModule.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraMailboxRecentsModule.java
index 2f860e0..da37060 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraMailboxRecentsModule.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraMailboxRecentsModule.java
@@ -46,6 +46,8 @@ public class CassandraMailboxRecentsModule implements CassandraModule {
                     .addPartitionKey(CassandraMailboxRecentsTable.MAILBOX_ID, timeuuid())
                     .addClusteringColumn(CassandraMailboxRecentsTable.RECENT_MESSAGE_UID, bigint())
                     .withOptions()
+                    .comment("Denormalisation table. This table holds for each mailbox the messages marked as RECENT. This" +
+                        " is a SELECT optimisation.")
                     .compactionOptions(SchemaBuilder.leveledStrategy())
                     .caching(SchemaBuilder.KeyCaching.ALL,
                         SchemaBuilder.rows(CassandraConstants.DEFAULT_CACHED_ROW_PER_PARTITION))));

http://git-wip-us.apache.org/repos/asf/james-project/blob/621ba9a6/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraMessageModule.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraMessageModule.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraMessageModule.java
index db1bc58..9284d9e 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraMessageModule.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraMessageModule.java
@@ -68,6 +68,7 @@ public class CassandraMessageModule implements CassandraModule {
                     .addColumn(Flag.USER, cboolean())
                     .addColumn(Flag.USER_FLAGS, set(text()))
                     .withOptions()
+                    .comment("Holds mailbox and flags for each message, lookup by message ID")
                     .compactionOptions(SchemaBuilder.leveledStrategy())
                     .caching(SchemaBuilder.KeyCaching.ALL,
                         SchemaBuilder.rows(CACHED_IMAP_UID_ROWS))),
@@ -87,6 +88,7 @@ public class CassandraMessageModule implements CassandraModule {
                     .addColumn(Flag.USER, cboolean())
                     .addColumn(Flag.USER_FLAGS, set(text()))
                     .withOptions()
+                    .comment("Holds mailbox and flags for each message, lookup by mailbox ID + UID")
                     .compactionOptions(SchemaBuilder.leveledStrategy())
                     .caching(SchemaBuilder.KeyCaching.ALL,
                         SchemaBuilder.rows(CACHED_MESSAGE_ID_ROWS))),
@@ -102,7 +104,9 @@ public class CassandraMessageModule implements CassandraModule {
                     .addColumn(CassandraMessageV1Table.BODY_CONTENT, blob())
                     .addColumn(CassandraMessageV1Table.HEADER_CONTENT, blob())
                     .addUDTListColumn(CassandraMessageV1Table.ATTACHMENTS, SchemaBuilder.frozen(CassandraMessageV1Table.ATTACHMENTS))
-                    .addUDTListColumn(CassandraMessageV1Table.PROPERTIES, SchemaBuilder.frozen(CassandraMessageV1Table.PROPERTIES))),
+                    .addUDTListColumn(CassandraMessageV1Table.PROPERTIES, SchemaBuilder.frozen(CassandraMessageV1Table.PROPERTIES))
+                    .withOptions()
+                    .comment("Deprecated table. Was used to store messages. See `messagev2` instead.")),
             new CassandraTable(CassandraMessageV2Table.TABLE_NAME,
                 SchemaBuilder.createTable(CassandraMessageV2Table.TABLE_NAME)
                     .ifNotExists()
@@ -115,7 +119,10 @@ public class CassandraMessageModule implements CassandraModule {
                     .addColumn(CassandraMessageV2Table.BODY_CONTENT, text())
                     .addColumn(CassandraMessageV2Table.HEADER_CONTENT, text())
                     .addUDTListColumn(CassandraMessageV2Table.ATTACHMENTS, SchemaBuilder.frozen(CassandraMessageV2Table.ATTACHMENTS))
-                    .addUDTListColumn(CassandraMessageV2Table.PROPERTIES, SchemaBuilder.frozen(CassandraMessageV2Table.PROPERTIES))));
+                    .addUDTListColumn(CassandraMessageV2Table.PROPERTIES, SchemaBuilder.frozen(CassandraMessageV2Table.PROPERTIES))
+                    .withOptions()
+                    .comment("Holds message metadata, independently of any mailboxes. Content of messages is stored " +
+                        "in `blobs` and `blobparts` tables.")));
         types = ImmutableList.of(
             new CassandraType(CassandraMessageV1Table.PROPERTIES,
                 SchemaBuilder.createType(CassandraMessageV1Table.PROPERTIES)

http://git-wip-us.apache.org/repos/asf/james-project/blob/621ba9a6/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraModSeqModule.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraModSeqModule.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraModSeqModule.java
index 66e4e63..49013ab 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraModSeqModule.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraModSeqModule.java
@@ -46,6 +46,7 @@ public class CassandraModSeqModule implements CassandraModule {
                     .addPartitionKey(CassandraMessageModseqTable.MAILBOX_ID, timeuuid())
                     .addColumn(CassandraMessageModseqTable.NEXT_MODSEQ, bigint())
                     .withOptions()
+                    .comment("Holds and is used to generate MODSEQ. A monotic counter is implemented on top of this table.")
                     .compactionOptions(SchemaBuilder.leveledStrategy())
                     .caching(SchemaBuilder.KeyCaching.ALL,
                         SchemaBuilder.rows(CassandraConstants.DEFAULT_CACHED_ROW_PER_PARTITION))));

http://git-wip-us.apache.org/repos/asf/james-project/blob/621ba9a6/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraQuotaModule.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraQuotaModule.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraQuotaModule.java
index a56aec7..32a963c 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraQuotaModule.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraQuotaModule.java
@@ -50,6 +50,7 @@ public class CassandraQuotaModule implements CassandraModule {
                     .addColumn(CassandraCurrentQuota.MESSAGE_COUNT, counter())
                     .addColumn(CassandraCurrentQuota.STORAGE, counter())
                     .withOptions()
+                    .comment("Holds per quota-root current values. Quota-roots defines groups of mailboxes which shares quotas limitations.")
                     .caching(SchemaBuilder.KeyCaching.ALL,
                         SchemaBuilder.rows(CassandraConstants.DEFAULT_CACHED_ROW_PER_PARTITION))),
             new CassandraTable(CassandraMaxQuota.TABLE_NAME,
@@ -59,6 +60,7 @@ public class CassandraQuotaModule implements CassandraModule {
                     .addColumn(CassandraMaxQuota.MESSAGE_COUNT, bigint())
                     .addColumn(CassandraMaxQuota.STORAGE, bigint())
                     .withOptions()
+                    .comment("Holds per quota-root limitations. Limitations can concern the number of messages in a quota-root or the total size of a quota-root.")
                     .caching(SchemaBuilder.KeyCaching.ALL,
                         SchemaBuilder.rows(CassandraConstants.DEFAULT_CACHED_ROW_PER_PARTITION))),
             new CassandraTable(CassandraDefaultMaxQuota.TABLE_NAME,
@@ -67,6 +69,7 @@ public class CassandraQuotaModule implements CassandraModule {
                     .addPartitionKey(CassandraDefaultMaxQuota.TYPE, text())
                     .addColumn(CassandraDefaultMaxQuota.VALUE, bigint())
                     .withOptions()
+                    .comment("Holds defaults limitations definition.")
                     .caching(SchemaBuilder.KeyCaching.ALL,
                         SchemaBuilder.rows(CassandraConstants.DEFAULT_CACHED_ROW_PER_PARTITION))));
         types = ImmutableList.of();

http://git-wip-us.apache.org/repos/asf/james-project/blob/621ba9a6/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraSubscriptionModule.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraSubscriptionModule.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraSubscriptionModule.java
index e29c8b5..f85fe53 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraSubscriptionModule.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraSubscriptionModule.java
@@ -45,6 +45,7 @@ public class CassandraSubscriptionModule implements CassandraModule {
                     .addPartitionKey(CassandraSubscriptionTable.USER, text())
                     .addClusteringColumn(CassandraSubscriptionTable.MAILBOX, text())
                     .withOptions()
+                    .comment("Holds per user list of IMAP subscriptions")
                     .caching(SchemaBuilder.KeyCaching.ALL,
                         SchemaBuilder.rows(PER_USER_CACHED_SUBSCRIPTIONS))));
         types = ImmutableList.of();

http://git-wip-us.apache.org/repos/asf/james-project/blob/621ba9a6/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraUidModule.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraUidModule.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraUidModule.java
index 2e43884..49dc902 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraUidModule.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraUidModule.java
@@ -46,6 +46,7 @@ public class CassandraUidModule implements CassandraModule {
                     .addPartitionKey(CassandraMessageUidTable.MAILBOX_ID, timeuuid())
                     .addColumn(CassandraMessageUidTable.NEXT_UID, bigint())
                     .withOptions()
+                    .comment("Holds and is used to generate UID. A monotic counter is implemented on top of this table.")
                     .compactionOptions(SchemaBuilder.leveledStrategy())
                     .caching(SchemaBuilder.KeyCaching.ALL,
                         SchemaBuilder.rows(CassandraConstants.DEFAULT_CACHED_ROW_PER_PARTITION))));

http://git-wip-us.apache.org/repos/asf/james-project/blob/621ba9a6/server/data/data-cassandra/src/main/java/org/apache/james/domainlist/cassandra/CassandraDomainListModule.java
----------------------------------------------------------------------
diff --git a/server/data/data-cassandra/src/main/java/org/apache/james/domainlist/cassandra/CassandraDomainListModule.java b/server/data/data-cassandra/src/main/java/org/apache/james/domainlist/cassandra/CassandraDomainListModule.java
index a682bfe..2b797c9 100644
--- a/server/data/data-cassandra/src/main/java/org/apache/james/domainlist/cassandra/CassandraDomainListModule.java
+++ b/server/data/data-cassandra/src/main/java/org/apache/james/domainlist/cassandra/CassandraDomainListModule.java
@@ -43,6 +43,7 @@ public class CassandraDomainListModule implements CassandraModule {
                     .ifNotExists()
                     .addPartitionKey(CassandraDomainsTable.DOMAIN, text())
                     .withOptions()
+                    .comment("Holds domains this James server is operating on.")
                     .caching(SchemaBuilder.KeyCaching.ALL,
                         SchemaBuilder.rows(CassandraConstants.DEFAULT_CACHED_ROW_PER_PARTITION))));
         types = ImmutableList.of();

http://git-wip-us.apache.org/repos/asf/james-project/blob/621ba9a6/server/data/data-cassandra/src/main/java/org/apache/james/rrt/cassandra/CassandraRRTModule.java
----------------------------------------------------------------------
diff --git a/server/data/data-cassandra/src/main/java/org/apache/james/rrt/cassandra/CassandraRRTModule.java b/server/data/data-cassandra/src/main/java/org/apache/james/rrt/cassandra/CassandraRRTModule.java
index 1374d48..401babd 100644
--- a/server/data/data-cassandra/src/main/java/org/apache/james/rrt/cassandra/CassandraRRTModule.java
+++ b/server/data/data-cassandra/src/main/java/org/apache/james/rrt/cassandra/CassandraRRTModule.java
@@ -46,6 +46,7 @@ public class CassandraRRTModule implements CassandraModule {
                     .addClusteringColumn(CassandraRecipientRewriteTableTable.DOMAIN, text())
                     .addClusteringColumn(CassandraRecipientRewriteTableTable.MAPPING, text())
                     .withOptions()
+                    .comment("Holds address re-writing rules.")
                     .caching(SchemaBuilder.KeyCaching.ALL,
                         SchemaBuilder.rows(CassandraConstants.DEFAULT_CACHED_ROW_PER_PARTITION))));
         types = ImmutableList.of();

http://git-wip-us.apache.org/repos/asf/james-project/blob/621ba9a6/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/CassandraSieveRepositoryModule.java
----------------------------------------------------------------------
diff --git a/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/CassandraSieveRepositoryModule.java b/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/CassandraSieveRepositoryModule.java
index 8e50433..a599eb4 100644
--- a/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/CassandraSieveRepositoryModule.java
+++ b/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/CassandraSieveRepositoryModule.java
@@ -53,28 +53,38 @@ public class CassandraSieveRepositoryModule implements CassandraModule {
                     .addClusteringColumn(CassandraSieveTable.SCRIPT_NAME, text())
                     .addColumn(CassandraSieveTable.SCRIPT_CONTENT, text())
                     .addColumn(CassandraSieveTable.IS_ACTIVE, cboolean())
-                    .addColumn(CassandraSieveTable.SIZE, bigint())),
+                    .addColumn(CassandraSieveTable.SIZE, bigint())
+                    .withOptions()
+                    .comment("Holds SIEVE scripts.")),
             new CassandraTable(CassandraSieveSpaceTable.TABLE_NAME,
                 SchemaBuilder.createTable(CassandraSieveSpaceTable.TABLE_NAME)
                     .ifNotExists()
                     .addPartitionKey(CassandraSieveSpaceTable.USER_NAME, text())
-                    .addColumn(CassandraSieveSpaceTable.SPACE_USED, counter())),
+                    .addColumn(CassandraSieveSpaceTable.SPACE_USED, counter())
+                    .withOptions()
+                    .comment("Holds per user current space occupied by SIEVE scripts.")),
             new CassandraTable(CassandraSieveQuotaTable.TABLE_NAME,
                 SchemaBuilder.createTable(CassandraSieveQuotaTable.TABLE_NAME)
                     .ifNotExists()
                     .addPartitionKey(CassandraSieveQuotaTable.USER_NAME, text())
-                    .addColumn(CassandraSieveQuotaTable.QUOTA, bigint())),
+                    .addColumn(CassandraSieveQuotaTable.QUOTA, bigint())
+                    .withOptions()
+                    .comment("Holds per user size limitations for SIEVE script storage.")),
             new CassandraTable(CassandraSieveClusterQuotaTable.TABLE_NAME,
                 SchemaBuilder.createTable(CassandraSieveClusterQuotaTable.TABLE_NAME)
                     .ifNotExists()
                     .addPartitionKey(CassandraSieveClusterQuotaTable.NAME, text())
-                    .addColumn(CassandraSieveClusterQuotaTable.VALUE, bigint())),
+                    .addColumn(CassandraSieveClusterQuotaTable.VALUE, bigint())
+                        .withOptions()
+                        .comment("Holds default size limitations for SIEVE script storage.")),
             new CassandraTable(CassandraSieveActiveTable.TABLE_NAME,
                 SchemaBuilder.createTable(CassandraSieveActiveTable.TABLE_NAME)
                     .ifNotExists()
                     .addPartitionKey(CassandraSieveActiveTable.USER_NAME, text())
                     .addColumn(CassandraSieveActiveTable.SCRIPT_NAME, text())
-                    .addColumn(CassandraSieveActiveTable.DATE, timestamp())));
+                    .addColumn(CassandraSieveActiveTable.DATE, timestamp())
+                    .withOptions()
+                    .comment("Denormalisation table. Allows per user direct active SIEVE script retrieval.")));
         types = ImmutableList.of();
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/621ba9a6/server/data/data-cassandra/src/main/java/org/apache/james/user/cassandra/CassandraUsersRepositoryModule.java
----------------------------------------------------------------------
diff --git a/server/data/data-cassandra/src/main/java/org/apache/james/user/cassandra/CassandraUsersRepositoryModule.java b/server/data/data-cassandra/src/main/java/org/apache/james/user/cassandra/CassandraUsersRepositoryModule.java
index db7a337..67d2775 100644
--- a/server/data/data-cassandra/src/main/java/org/apache/james/user/cassandra/CassandraUsersRepositoryModule.java
+++ b/server/data/data-cassandra/src/main/java/org/apache/james/user/cassandra/CassandraUsersRepositoryModule.java
@@ -44,7 +44,9 @@ public class CassandraUsersRepositoryModule implements CassandraModule {
                         .addPartitionKey(CassandraUserTable.NAME, text())
                         .addColumn(CassandraUserTable.REALNAME, text())
                         .addColumn(CassandraUserTable.PASSWORD, text())
-                        .addColumn(CassandraUserTable.ALGORITHM, text())));
+                        .addColumn(CassandraUserTable.ALGORITHM, text())
+                        .withOptions()
+                        .comment("Holds users of this James server.")));
         types = ImmutableList.of();
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/621ba9a6/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/access/CassandraAccessModule.java
----------------------------------------------------------------------
diff --git a/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/access/CassandraAccessModule.java b/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/access/CassandraAccessModule.java
index 53fb2f3..b57f71e 100644
--- a/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/access/CassandraAccessModule.java
+++ b/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/access/CassandraAccessModule.java
@@ -46,6 +46,7 @@ public class CassandraAccessModule implements CassandraModule {
                     .addPartitionKey(CassandraAccessTokenTable.TOKEN, uuid())
                     .addColumn(CassandraAccessTokenTable.USERNAME, text())
                     .withOptions()
+                    .comment("Holds JMAP access token required to process to authentication.")
                     .caching(SchemaBuilder.KeyCaching.ALL,
                         SchemaBuilder.rows(CassandraConstants.DEFAULT_CACHED_ROW_PER_PARTITION))));
         types = ImmutableList.of();

http://git-wip-us.apache.org/repos/asf/james-project/blob/621ba9a6/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/vacation/CassandraNotificationRegistryModule.java
----------------------------------------------------------------------
diff --git a/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/vacation/CassandraNotificationRegistryModule.java b/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/vacation/CassandraNotificationRegistryModule.java
index c920eba..734556a 100644
--- a/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/vacation/CassandraNotificationRegistryModule.java
+++ b/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/vacation/CassandraNotificationRegistryModule.java
@@ -45,6 +45,7 @@ public class CassandraNotificationRegistryModule implements CassandraModule {
                     .addPartitionKey(CassandraNotificationTable.ACCOUNT_ID, text())
                     .addClusteringColumn(CassandraNotificationTable.RECIPIENT_ID, text())
                     .withOptions()
+                    .comment("Stores registry of vacation notification being sent.")
                     .compactionOptions(SchemaBuilder.dateTieredStrategy())
                     .caching(SchemaBuilder.KeyCaching.ALL,
                         SchemaBuilder.rows(CassandraConstants.DEFAULT_CACHED_ROW_PER_PARTITION))));

http://git-wip-us.apache.org/repos/asf/james-project/blob/621ba9a6/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/vacation/CassandraVacationModule.java
----------------------------------------------------------------------
diff --git a/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/vacation/CassandraVacationModule.java b/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/vacation/CassandraVacationModule.java
index 4565b86..2a9ba0a 100644
--- a/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/vacation/CassandraVacationModule.java
+++ b/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/vacation/CassandraVacationModule.java
@@ -52,6 +52,7 @@ public class CassandraVacationModule implements CassandraModule {
                     .addColumn(CassandraVacationTable.SUBJECT, text())
                     .addColumn(CassandraVacationTable.HTML, text())
                     .withOptions()
+                    .comment("Holds vacation definition. Allow one to automatically respond to emails with a custom message.")
                     .caching(SchemaBuilder.KeyCaching.ALL,
                         SchemaBuilder.rows(CassandraConstants.DEFAULT_CACHED_ROW_PER_PARTITION))));
         types = ImmutableList.of();


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org

[8/9] james-project git commit: JAMES-2111 Install is missing collapse option

Posted by bt...@apache.org.
JAMES-2111 Install is missing collapse option


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/39847c2d
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/39847c2d
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/39847c2d

Branch: refs/heads/master
Commit: 39847c2d506af38c05988db8661ac74b2e0e7b76
Parents: 9360cb3
Author: benwa <bt...@linagora.com>
Authored: Fri Aug 18 09:37:19 2017 +0700
Committer: benwa <bt...@linagora.com>
Committed: Tue Aug 22 10:31:08 2017 +0700

----------------------------------------------------------------------
 src/site/site.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/39847c2d/src/site/site.xml
----------------------------------------------------------------------
diff --git a/src/site/site.xml b/src/site/site.xml
index 1d62152..04777de 100644
--- a/src/site/site.xml
+++ b/src/site/site.xml
@@ -114,7 +114,7 @@
                         <item name="Security" href="/server/feature-security.html" />
                     </item>
                     <item name="2. Packaging" href="/server/packaging.html" />
-                    <item name="3. Install James" href="/server/install.html" >
+                    <item name="3. Install James" href="/server/install.html" collapse="true">
                         <item name="Cassandra-guice" href="/server/install/guice-cassandra.html" />
                         <item name="JPA-guice" href="/server/install/guice-jpa.html" />
                         <item name="JPA-SMTP-guice" href="/server/install/guice-jpa-smtp.html" />


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org

[3/9] james-project git commit: JAMES-2111 s/CassandraMessageDAOV2/CassandraMessageDAO/g

Posted by bt...@apache.org.
http://git-wip-us.apache.org/repos/asf/james-project/blob/9360cb3a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxModule.java
----------------------------------------------------------------------
diff --git a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxModule.java b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxModule.java
index 536cae0..ae0b844 100644
--- a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxModule.java
+++ b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxModule.java
@@ -35,7 +35,7 @@ import org.apache.james.mailbox.cassandra.ids.CassandraId;
 import org.apache.james.mailbox.cassandra.ids.CassandraMessageId;
 import org.apache.james.mailbox.cassandra.mail.CassandraBlobsDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMailboxMapper;
-import org.apache.james.mailbox.cassandra.mail.CassandraMessageDAOV2;
+import org.apache.james.mailbox.cassandra.mail.CassandraMessageDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMessageIdDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMessageIdToImapUidDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraModSeqProvider;
@@ -92,7 +92,7 @@ public class CassandraMailboxModule extends AbstractModule {
         bind(StoreMessageIdManager.class).in(Scopes.SINGLETON);
         bind(StoreAttachmentManager.class).in(Scopes.SINGLETON);
         bind(CassandraMailboxMapper.class).in(Scopes.SINGLETON);
-        bind(CassandraMessageDAOV2.class).in(Scopes.SINGLETON);
+        bind(CassandraMessageDAO.class).in(Scopes.SINGLETON);
         bind(CassandraBlobsDAO.class).in(Scopes.SINGLETON);
 
         bind(MessageMapperFactory.class).to(CassandraMailboxSessionMapperFactory.class);


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[6/9] james-project git commit: JAMES-2111 Remove Message V1 related code

Posted by bt...@apache.org.
http://git-wip-us.apache.org/repos/asf/james-project/blob/4e0f1310/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOTest.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOTest.java
deleted file mode 100644
index 98c2fa6..0000000
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOTest.java
+++ /dev/null
@@ -1,166 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one   *
- * or more contributor license agreements.  See the NOTICE file *
- * distributed with this work for additional information        *
- * regarding copyright ownership.  The ASF licenses this file   *
- * to you under the Apache License, Version 2.0 (the            *
- * "License"); you may not use this file except in compliance   *
- * with the License.  You may obtain a copy of the License at   *
- *                                                              *
- *   http://www.apache.org/licenses/LICENSE-2.0                 *
- *                                                              *
- * Unless required by applicable law or agreed to in writing,   *
- * software distributed under the License is distributed on an  *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
- * KIND, either express or implied.  See the License for the    *
- * specific language governing permissions and limitations      *
- * under the License.                                           *
- ****************************************************************/
-package org.apache.james.mailbox.cassandra.mail;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import java.util.Date;
-import java.util.List;
-import java.util.Optional;
-import javax.mail.Flags;
-import javax.mail.util.SharedByteArrayInputStream;
-
-import org.apache.james.backends.cassandra.CassandraCluster;
-import org.apache.james.mailbox.MessageUid;
-import org.apache.james.mailbox.cassandra.ids.CassandraId;
-import org.apache.james.mailbox.cassandra.ids.CassandraMessageId;
-import org.apache.james.mailbox.cassandra.mail.utils.Limit;
-import org.apache.james.mailbox.cassandra.modules.CassandraMessageModule;
-import org.apache.james.mailbox.model.Attachment;
-import org.apache.james.mailbox.model.AttachmentId;
-import org.apache.james.mailbox.model.Cid;
-import org.apache.james.mailbox.model.ComposedMessageId;
-import org.apache.james.mailbox.model.ComposedMessageIdWithMetaData;
-import org.apache.james.mailbox.model.MessageAttachment;
-import org.apache.james.mailbox.model.MessageId;
-import org.apache.james.mailbox.store.mail.MessageMapper;
-import org.apache.james.mailbox.store.mail.model.impl.PropertyBuilder;
-import org.apache.james.mailbox.store.mail.model.impl.SimpleMailboxMessage;
-
-import com.github.steveash.guavate.Guavate;
-import com.google.common.base.Charsets;
-import com.google.common.collect.ImmutableList;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-public class CassandraMessageDAOTest {
-    private static final int BODY_START = 16;
-    private static final CassandraId MAILBOX_ID = CassandraId.timeBased();
-    private static final String CONTENT = "Subject: Test7 \n\nBody7\n.\n";
-    private static final MessageUid messageUid = MessageUid.of(1);
-
-    private CassandraCluster cassandra;
-
-    private CassandraMessageDAO testee;
-    private CassandraMessageId.Factory messageIdFactory;
-
-    private SimpleMailboxMessage messageWith1Attachment;
-    private CassandraMessageId messageId;
-    private Attachment attachment;
-    private ComposedMessageId composedMessageId;
-    private List<ComposedMessageIdWithMetaData> messageIds;
-
-    @Before
-    public void setUp() {
-        cassandra = CassandraCluster.create(new CassandraMessageModule());
-        cassandra.ensureAllTables();
-
-        messageIdFactory = new CassandraMessageId.Factory();
-        messageId = messageIdFactory.generate();
-        testee = new CassandraMessageDAO(cassandra.getConf(), cassandra.getTypesProvider());
-
-        attachment = Attachment.builder()
-                .attachmentId(AttachmentId.from("123"))
-                .bytes("attachment".getBytes())
-                .type("content")
-                .build();
-
-        composedMessageId = new ComposedMessageId(MAILBOX_ID, messageId, messageUid);
-
-        messageIds = ImmutableList.of(ComposedMessageIdWithMetaData.builder()
-                .composedMessageId(composedMessageId)
-                .flags(new Flags())
-                .modSeq(1)
-                .build());
-    }
-
-    @After
-    public void tearDown() {
-        cassandra.clearAllTables();
-        cassandra.close();
-    }
-
-    @Test
-    public void saveShouldStoreMessageWithAttachmentAndCid() throws Exception {
-        messageWith1Attachment = createMessage(messageId, CONTENT, BODY_START, new PropertyBuilder(),
-                ImmutableList.of(MessageAttachment.builder()
-                        .attachment(attachment)
-                        .cid(Cid.from("<cid>"))
-                        .isInline(true)
-                        .build()));
-
-        testee.save(messageWith1Attachment).join();
-
-        List<Optional<MessageAttachmentRepresentation>> attachmentRepresentation =
-            testee.retrieveMessages(messageIds, MessageMapper.FetchType.Body, Limit.unlimited())
-                .get()
-                .map(pair -> pair.getRight())
-                .map(streamAttachemnt -> streamAttachemnt.findFirst())
-                .collect(Guavate.toImmutableList());
-
-        Cid expectedCid = Cid.from("cid");
-
-        assertThat(attachmentRepresentation).hasSize(1);
-        assertThat(attachmentRepresentation.get(0).get().getCid().get()).isEqualTo(expectedCid);
-    }
-
-    @Test
-    public void saveShouldStoreMessageWithAttachmentButNoCid() throws Exception {
-        messageWith1Attachment = createMessage(messageId, CONTENT, BODY_START, new PropertyBuilder(),
-                ImmutableList.of(MessageAttachment.builder()
-                        .attachment(attachment)
-                        .isInline(true)
-                        .build()));
-
-        testee.save(messageWith1Attachment).join();
-
-        List<Optional<MessageAttachmentRepresentation>> attachmentRepresentation =
-            testee.retrieveMessages(messageIds, MessageMapper.FetchType.Body, Limit.unlimited())
-                .get()
-                .map(pair -> pair.getRight())
-                .map(streamAttachemnt -> streamAttachemnt.findFirst())
-                .collect(Guavate.toImmutableList());
-
-        assertThat(attachmentRepresentation).hasSize(1);
-        assertThat(attachmentRepresentation.get(0).get().getCid().isPresent()).isFalse();
-    }
-
-    private SimpleMailboxMessage createMessage(
-            MessageId messageId,
-            String content,
-            int bodyStart,
-            PropertyBuilder propertyBuilder,
-            List<MessageAttachment> attachments) {
-
-        return SimpleMailboxMessage.builder()
-            .messageId(messageId)
-            .mailboxId(MAILBOX_ID)
-            .uid(messageUid)
-            .internalDate(new Date())
-            .bodyStartOctet(bodyStart)
-            .size(content.length())
-            .content(new SharedByteArrayInputStream(content.getBytes(Charsets.UTF_8)))
-            .flags(new Flags())
-            .propertyBuilder(propertyBuilder)
-            .addAttachments(attachments)
-            .build();
-    }
-
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/james-project/blob/4e0f1310/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/migration/V1ToV2MigrationTest.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/migration/V1ToV2MigrationTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/migration/V1ToV2MigrationTest.java
deleted file mode 100644
index 6b0edea..0000000
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/migration/V1ToV2MigrationTest.java
+++ /dev/null
@@ -1,304 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one   *
- * or more contributor license agreements.  See the NOTICE file *
- * distributed with this work for additional information        *
- * regarding copyright ownership.  The ASF licenses this file   *
- * to you under the Apache License, Version 2.0 (the            *
- * "License"); you may not use this file except in compliance   *
- * with the License.  You may obtain a copy of the License at   *
- *                                                              *
- *   http://www.apache.org/licenses/LICENSE-2.0                 *
- *                                                              *
- * Unless required by applicable law or agreed to in writing,   *
- * software distributed under the License is distributed on an  *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
- * KIND, either express or implied.  See the License for the    *
- * specific language governing permissions and limitations      *
- * under the License.                                           *
- ****************************************************************/
-package org.apache.james.mailbox.cassandra.mail.migration;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
-import java.util.Date;
-import java.util.List;
-import java.util.Optional;
-import java.util.concurrent.TimeUnit;
-import java.util.stream.Stream;
-
-import javax.mail.Flags;
-import javax.mail.util.SharedByteArrayInputStream;
-
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang3.tuple.Pair;
-import org.apache.james.backends.cassandra.CassandraCluster;
-import org.apache.james.backends.cassandra.CassandraConfiguration;
-import org.apache.james.backends.cassandra.init.CassandraModuleComposite;
-import org.apache.james.mailbox.MessageUid;
-import org.apache.james.mailbox.cassandra.ids.CassandraId;
-import org.apache.james.mailbox.cassandra.ids.CassandraMessageId;
-import org.apache.james.mailbox.cassandra.mail.CassandraAttachmentMapper;
-import org.apache.james.mailbox.cassandra.mail.CassandraBlobsDAO;
-import org.apache.james.mailbox.cassandra.mail.CassandraMessageDAO;
-import org.apache.james.mailbox.cassandra.mail.CassandraMessageDAOV2;
-import org.apache.james.mailbox.cassandra.mail.MessageAttachmentRepresentation;
-import org.apache.james.mailbox.cassandra.mail.MessageWithoutAttachment;
-import org.apache.james.mailbox.cassandra.mail.utils.Limit;
-import org.apache.james.mailbox.cassandra.modules.CassandraAttachmentModule;
-import org.apache.james.mailbox.cassandra.modules.CassandraBlobModule;
-import org.apache.james.mailbox.cassandra.modules.CassandraMessageModule;
-import org.apache.james.mailbox.model.Attachment;
-import org.apache.james.mailbox.model.AttachmentId;
-import org.apache.james.mailbox.model.Cid;
-import org.apache.james.mailbox.model.ComposedMessageId;
-import org.apache.james.mailbox.model.ComposedMessageIdWithMetaData;
-import org.apache.james.mailbox.model.MessageAttachment;
-import org.apache.james.mailbox.model.MessageId;
-import org.apache.james.mailbox.store.mail.MessageMapper;
-import org.apache.james.mailbox.store.mail.model.impl.PropertyBuilder;
-import org.apache.james.mailbox.store.mail.model.impl.SimpleMailboxMessage;
-import org.apache.james.util.OptionalConverter;
-import org.assertj.core.api.JUnitSoftAssertions;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-
-import com.github.steveash.guavate.Guavate;
-import com.google.common.base.Charsets;
-import com.google.common.collect.ImmutableList;
-import com.jayway.awaitility.Awaitility;
-import com.jayway.awaitility.Duration;
-import com.jayway.awaitility.core.ConditionFactory;
-
-public class V1ToV2MigrationTest {
-    private static final int BODY_START = 16;
-    private static final CassandraId MAILBOX_ID = CassandraId.timeBased();
-    private static final String CONTENT = "Subject: Test7 \n\nBody7\n.\n";
-    private static final MessageUid messageUid = MessageUid.of(1);
-
-    private CassandraCluster cassandra;
-
-    private CassandraMessageDAO messageDAOV1;
-    private CassandraMessageDAOV2 messageDAOV2;
-    private CassandraAttachmentMapper attachmentMapper;
-    private V1ToV2Migration testee;
-
-    private Attachment attachment;
-    private CassandraMessageId messageId;
-    private CassandraMessageId.Factory messageIdFactory;
-    private ComposedMessageId composedMessageId;
-    private List<ComposedMessageIdWithMetaData> metaDataList;
-    private ComposedMessageIdWithMetaData metaData;
-    private MessageAttachment messageAttachment;
-    
-    @Rule
-    public final JUnitSoftAssertions softly = new JUnitSoftAssertions();
-    private ConditionFactory awaitability;
-
-    @Before
-    public void setUp() {
-        cassandra = CassandraCluster.create(new CassandraModuleComposite(
-            new CassandraMessageModule(),
-            new CassandraBlobModule(),
-            new CassandraAttachmentModule()));
-        cassandra.ensureAllTables();
-
-        messageDAOV1 = new CassandraMessageDAO(cassandra.getConf(), cassandra.getTypesProvider());
-        CassandraBlobsDAO blobsDAO = new CassandraBlobsDAO(cassandra.getConf());
-        messageDAOV2 = new CassandraMessageDAOV2(cassandra.getConf(), cassandra.getTypesProvider(), blobsDAO);
-        attachmentMapper = new CassandraAttachmentMapper(cassandra.getConf());
-        testee = new V1ToV2Migration(messageDAOV1, messageDAOV2, attachmentMapper, CassandraConfiguration.builder()
-            .onTheFlyV1ToV2Migration(true)
-            .build());
-
-
-        messageIdFactory = new CassandraMessageId.Factory();
-        messageId = messageIdFactory.generate();
-
-        attachment = Attachment.builder()
-                .attachmentId(AttachmentId.from("123"))
-                .bytes("attachment".getBytes())
-                .type("content")
-                .build();
-
-        composedMessageId = new ComposedMessageId(MAILBOX_ID, messageId, messageUid);
-
-        metaData = ComposedMessageIdWithMetaData.builder()
-            .composedMessageId(composedMessageId)
-            .flags(new Flags())
-            .modSeq(1)
-            .build();
-        metaDataList = ImmutableList.of(metaData);
-        messageAttachment = MessageAttachment.builder()
-            .attachment(attachment)
-            .cid(Cid.from("<cid>"))
-            .isInline(true)
-            .name("toto.png")
-            .build();
-
-        Duration slowPacedPollInterval = Duration.FIVE_HUNDRED_MILLISECONDS;
-        awaitability = Awaitility
-            .with()
-            .pollInterval(slowPacedPollInterval)
-            .and()
-            .pollDelay(slowPacedPollInterval).await();
-    }
-
-    @After
-    public void tearDown() {
-        testee.stop();
-        cassandra.clearAllTables();
-        cassandra.close();
-    }
-
-    @Test
-    public void migrationShouldWorkWithoutAttachments() throws Exception {
-        SimpleMailboxMessage originalMessage = createMessage(messageId, CONTENT, BODY_START,
-            new PropertyBuilder(), ImmutableList.of());
-        messageDAOV1.save(originalMessage).join();
-
-        testee.getFromV2orElseFromV1AfterMigration(CassandraMessageDAOV2.notFound(metaData)).join();
-
-        awaitMigration();
-
-        CassandraMessageDAOV2.MessageResult messageResult = retrieveMessageOnV2().get();
-        softly.assertThat(messageResult.message().getLeft().getMessageId()).isEqualTo(messageId);
-        softly.assertThat(IOUtils.toString(messageResult.message().getLeft().getContent(), Charsets.UTF_8))
-            .isEqualTo(CONTENT);
-        softly.assertThat(messageResult.message().getRight().findAny().isPresent()).isFalse();
-    }
-
-    @Test
-    public void runShouldMigrateMessages() throws Exception {
-        SimpleMailboxMessage originalMessage = createMessage(messageId, CONTENT, BODY_START,
-            new PropertyBuilder(), ImmutableList.of());
-        messageDAOV1.save(originalMessage).join();
-
-        testee.run();
-
-        CassandraMessageDAOV2.MessageResult messageResult = retrieveMessageOnV2().get();
-        softly.assertThat(messageResult.message().getLeft().getMessageId()).isEqualTo(messageId);
-        softly.assertThat(IOUtils.toString(messageResult.message().getLeft().getContent(), Charsets.UTF_8))
-            .isEqualTo(CONTENT);
-        softly.assertThat(messageResult.message().getRight().findAny().isPresent()).isFalse();
-    }
-
-    @Test
-    public void runShouldBeIdempotent() throws Exception {
-        SimpleMailboxMessage originalMessage = createMessage(messageId, CONTENT, BODY_START,
-            new PropertyBuilder(), ImmutableList.of());
-        messageDAOV1.save(originalMessage).join();
-
-        testee.run();
-
-        testee.run();
-
-        CassandraMessageDAOV2.MessageResult messageResult = retrieveMessageOnV2().get();
-        softly.assertThat(messageResult.message().getLeft().getMessageId()).isEqualTo(messageId);
-        softly.assertThat(IOUtils.toString(messageResult.message().getLeft().getContent(), Charsets.UTF_8))
-            .isEqualTo(CONTENT);
-        softly.assertThat(messageResult.message().getRight().findAny().isPresent()).isFalse();
-    }
-
-    @Test
-    public void runShouldSucceedWhenOneMessage() throws Exception {
-        SimpleMailboxMessage originalMessage = createMessage(messageId, CONTENT, BODY_START,
-            new PropertyBuilder(), ImmutableList.of());
-        messageDAOV1.save(originalMessage).join();
-
-        assertThat(testee.run()).isEqualTo(Migration.MigrationResult.COMPLETED);
-    }
-
-    @Test
-    public void runShouldSucceedWhenNoMessages() throws Exception {
-        assertThat(testee.run()).isEqualTo(Migration.MigrationResult.COMPLETED);
-    }
-
-    @Test
-    public void migrationShouldWorkWithAttachments() throws Exception {
-        SimpleMailboxMessage originalMessage = createMessage(messageId, CONTENT, BODY_START,
-            new PropertyBuilder(), ImmutableList.of(messageAttachment));
-
-        attachmentMapper.storeAttachment(attachment);
-
-        messageDAOV1.save(originalMessage).join();
-
-        testee.getFromV2orElseFromV1AfterMigration(CassandraMessageDAOV2.notFound(metaData)).join();
-
-        awaitMigration();
-
-        CassandraMessageDAOV2.MessageResult messageResult = retrieveMessageOnV2().get();
-        softly.assertThat(messageResult.message().getLeft().getMessageId()).isEqualTo(messageId);
-        softly.assertThat(IOUtils.toString(messageResult.message().getLeft().getContent(), Charsets.UTF_8))
-            .isEqualTo(CONTENT);
-        softly.assertThat(messageResult.message().getRight().findAny().get()).isEqualTo(MessageAttachmentRepresentation.builder()
-            .attachmentId(attachment.getAttachmentId())
-            .cid(OptionalConverter.fromGuava(messageAttachment.getCid()))
-            .isInline(messageAttachment.isInline())
-            .name(messageAttachment.getName().get())
-            .build());
-    }
-
-    @Test
-    public void migratedDataShouldBeRetrievedNoAttachment() throws Exception {
-        SimpleMailboxMessage originalMessage = createMessage(messageId, CONTENT, BODY_START,
-            new PropertyBuilder(), ImmutableList.of());
-
-        messageDAOV1.save(originalMessage).join();
-
-        Pair<MessageWithoutAttachment, Stream<MessageAttachmentRepresentation>> migratedData =
-            testee.getFromV2orElseFromV1AfterMigration(CassandraMessageDAOV2.notFound(metaData)).join();
-
-        awaitMigration();
-
-        softly.assertThat(migratedData.getLeft().getMessageId()).isEqualTo(messageId);
-        softly.assertThat(migratedData.getRight().collect(Guavate.toImmutableList()))
-            .isEmpty();
-    }
-
-    @Test
-    public void migratedDataShouldBeRetrievedWhenAttachment() throws Exception {
-        SimpleMailboxMessage originalMessage = createMessage(messageId, CONTENT, BODY_START,
-            new PropertyBuilder(), ImmutableList.of(messageAttachment));
-
-        attachmentMapper.storeAttachment(attachment);
-
-        messageDAOV1.save(originalMessage).join();
-
-        Pair<MessageWithoutAttachment, Stream<MessageAttachmentRepresentation>> migratedData =
-            testee.getFromV2orElseFromV1AfterMigration(CassandraMessageDAOV2.notFound(metaData)).join();
-
-        awaitMigration();
-
-        softly.assertThat(migratedData.getLeft().getMessageId()).isEqualTo(messageId);
-        softly.assertThat(migratedData.getRight().collect(Guavate.toImmutableList()))
-            .containsOnly(MessageAttachmentRepresentation.fromAttachment(messageAttachment));
-    }
-
-    private void awaitMigration() {
-        awaitability.atMost(1, TimeUnit.MINUTES)
-            .until(() -> {
-                try {
-                    retrieveMessageOnV2();
-                    return true;
-                } catch(AssertionError e) {
-                    return false;
-                }
-            });
-    }
-
-    private Optional<CassandraMessageDAOV2.MessageResult> retrieveMessageOnV2() {
-        Optional<CassandraMessageDAOV2.MessageResult> messageResult = messageDAOV2.retrieveMessages(metaDataList, MessageMapper.FetchType.Full, Limit.unlimited())
-            .join()
-            .findAny();
-
-        assertThat(messageResult.isPresent()).isTrue();
-        return messageResult;
-    }
-
-    private SimpleMailboxMessage createMessage(MessageId messageId, String content, int bodyStart, PropertyBuilder propertyBuilder, List<MessageAttachment> attachments) {
-        return new SimpleMailboxMessage(messageId, new Date(), content.length(), bodyStart, new SharedByteArrayInputStream(content.getBytes()), new Flags(), propertyBuilder, MAILBOX_ID, attachments);
-    }
-
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/james-project/blob/4e0f1310/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/host/CassandraHostSystem.java
----------------------------------------------------------------------
diff --git a/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/host/CassandraHostSystem.java b/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/host/CassandraHostSystem.java
index 54dc713..75969a3 100644
--- a/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/host/CassandraHostSystem.java
+++ b/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/host/CassandraHostSystem.java
@@ -29,15 +29,14 @@ import org.apache.james.mailbox.SubscriptionManager;
 import org.apache.james.mailbox.cassandra.CassandraMailboxManager;
 import org.apache.james.mailbox.cassandra.CassandraMailboxSessionMapperFactory;
 import org.apache.james.mailbox.cassandra.ids.CassandraMessageId;
+import org.apache.james.mailbox.cassandra.mail.CassandraApplicableFlagDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraBlobsDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraDeletedMessageDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraFirstUnseenDAO;
-import org.apache.james.mailbox.cassandra.mail.CassandraApplicableFlagDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMailboxCounterDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMailboxDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMailboxPathDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMailboxRecentsDAO;
-import org.apache.james.mailbox.cassandra.mail.CassandraMessageDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMessageDAOV2;
 import org.apache.james.mailbox.cassandra.mail.CassandraMessageIdDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMessageIdToImapUidDAO;
@@ -110,7 +109,6 @@ public class CassandraHostSystem extends JamesImapHostSystem {
         CassandraUidProvider uidProvider = new CassandraUidProvider(session);
         CassandraTypesProvider typesProvider = new CassandraTypesProvider(mailboxModule, session);
         CassandraMessageId.Factory messageIdFactory = new CassandraMessageId.Factory();
-        CassandraMessageDAO messageDAO = new CassandraMessageDAO(session, typesProvider);
         CassandraBlobsDAO cassandraBlobsDAO = new CassandraBlobsDAO(session);
         CassandraMessageDAOV2 messageDAOV2 = new CassandraMessageDAOV2(session, typesProvider, cassandraBlobsDAO);
         CassandraMessageIdDAO messageIdDAO = new CassandraMessageIdDAO(session, messageIdFactory);
@@ -127,7 +125,6 @@ public class CassandraHostSystem extends JamesImapHostSystem {
             uidProvider,
             modSeqProvider,
             session,
-            messageDAO,
             messageDAOV2,
             messageIdDAO,
             imapUidDAO,

http://git-wip-us.apache.org/repos/asf/james-project/blob/4e0f1310/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxModule.java
----------------------------------------------------------------------
diff --git a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxModule.java b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxModule.java
index 3ab79b7..536cae0 100644
--- a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxModule.java
+++ b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxModule.java
@@ -35,7 +35,6 @@ import org.apache.james.mailbox.cassandra.ids.CassandraId;
 import org.apache.james.mailbox.cassandra.ids.CassandraMessageId;
 import org.apache.james.mailbox.cassandra.mail.CassandraBlobsDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMailboxMapper;
-import org.apache.james.mailbox.cassandra.mail.CassandraMessageDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMessageDAOV2;
 import org.apache.james.mailbox.cassandra.mail.CassandraMessageIdDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMessageIdToImapUidDAO;
@@ -87,7 +86,6 @@ public class CassandraMailboxModule extends AbstractModule {
         bind(UserRepositoryAuthorizator.class).in(Scopes.SINGLETON);
         bind(CassandraId.Factory.class).in(Scopes.SINGLETON);
         bind(CassandraMessageId.Factory.class).in(Scopes.SINGLETON);
-        bind(CassandraMessageDAO.class).in(Scopes.SINGLETON);
         bind(CassandraMessageIdDAO.class).in(Scopes.SINGLETON);
         bind(CassandraMessageIdToImapUidDAO.class).in(Scopes.SINGLETON);
         bind(MailboxEventDispatcher.class).in(Scopes.SINGLETON);

http://git-wip-us.apache.org/repos/asf/james-project/blob/4e0f1310/server/container/guice/protocols/webadmin-cassandra/src/main/java/org/apache/james/modules/server/CassandraRoutesModule.java
----------------------------------------------------------------------
diff --git a/server/container/guice/protocols/webadmin-cassandra/src/main/java/org/apache/james/modules/server/CassandraRoutesModule.java b/server/container/guice/protocols/webadmin-cassandra/src/main/java/org/apache/james/modules/server/CassandraRoutesModule.java
index 8e8f940..55b8c23 100644
--- a/server/container/guice/protocols/webadmin-cassandra/src/main/java/org/apache/james/modules/server/CassandraRoutesModule.java
+++ b/server/container/guice/protocols/webadmin-cassandra/src/main/java/org/apache/james/modules/server/CassandraRoutesModule.java
@@ -21,7 +21,6 @@ package org.apache.james.modules.server;
 
 import org.apache.james.backends.cassandra.versions.CassandraSchemaVersionManager;
 import org.apache.james.mailbox.cassandra.mail.migration.Migration;
-import org.apache.james.mailbox.cassandra.mail.migration.V1ToV2Migration;
 import org.apache.james.webadmin.Routes;
 import org.apache.james.webadmin.routes.CassandraMigrationRoutes;
 import org.apache.james.webadmin.service.CassandraMigrationService;
@@ -33,22 +32,18 @@ import com.google.inject.multibindings.Multibinder;
 import com.google.inject.name.Names;
 
 public class CassandraRoutesModule extends AbstractModule {
-
-    private static final int FROM_V1_TO_V2 = 1;
+    private static final int FROM_V2_TO_V3 = 2;
 
     @Override
     protected void configure() {
         bind(CassandraRoutesModule.class).in(Scopes.SINGLETON);
         bind(CassandraMigrationService.class).in(Scopes.SINGLETON);
 
-        Multibinder<Migration> migrationMultibinder = Multibinder.newSetBinder(binder(), Migration.class);
-        migrationMultibinder.addBinding().to(V1ToV2Migration.class);
-
         Multibinder<Routes> routesMultibinder = Multibinder.newSetBinder(binder(), Routes.class);
         routesMultibinder.addBinding().to(CassandraMigrationRoutes.class);
 
         MapBinder<Integer, Migration> allMigrationClazzBinder = MapBinder.newMapBinder(binder(), Integer.class, Migration.class);
-        allMigrationClazzBinder.addBinding(FROM_V1_TO_V2).to(V1ToV2Migration.class);
+        allMigrationClazzBinder.addBinding(FROM_V2_TO_V3).toInstance(() -> Migration.MigrationResult.COMPLETED);
 
         bindConstant()
             .annotatedWith(Names.named(CassandraMigrationService.LATEST_VERSION))


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org

[7/9] james-project git commit: JAMES-2111 Remove Message V1 related code

Posted by bt...@apache.org.
JAMES-2111 Remove Message V1 related code

A new schema version 3 is created with table Message


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/4e0f1310
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/4e0f1310
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/4e0f1310

Branch: refs/heads/master
Commit: 4e0f131028a608dbe2e53ad932f7a2ecc340cc4e
Parents: 55300fe
Author: benwa <bt...@linagora.com>
Authored: Fri Aug 18 09:08:57 2017 +0700
Committer: benwa <bt...@linagora.com>
Committed: Tue Aug 22 10:31:07 2017 +0700

----------------------------------------------------------------------
 .../versions/CassandraSchemaVersionManager.java |   6 +-
 .../CassandraMailboxSessionMapperFactory.java   |  22 +-
 .../cassandra/mail/CassandraMessageDAO.java     | 418 -------------------
 .../cassandra/mail/CassandraMessageDAOV2.java   |  43 +-
 .../mail/CassandraMessageIdMapper.java          |  22 +-
 .../cassandra/mail/CassandraMessageMapper.java  |  27 +-
 .../mail/migration/V1ToV2Migration.java         | 154 -------
 .../mail/migration/V1ToV2MigrationThread.java   |  96 -----
 .../modules/CassandraMessageModule.java         |  39 +-
 .../table/CassandraMessageV1Table.java          |  54 ---
 .../CassandraMailboxManagerProvider.java        |   3 -
 .../CassandraSubscriptionManagerTest.java       |   5 +-
 .../cassandra/CassandraTestSystemFixture.java   |   5 +-
 .../CassandraMailboxManagerAttachmentTest.java  |   4 +-
 .../cassandra/mail/CassandraMapperProvider.java |   4 +-
 .../cassandra/mail/CassandraMessageDAOTest.java | 166 --------
 .../mail/migration/V1ToV2MigrationTest.java     | 304 --------------
 .../cassandra/host/CassandraHostSystem.java     |   5 +-
 .../modules/mailbox/CassandraMailboxModule.java |   2 -
 .../modules/server/CassandraRoutesModule.java   |   9 +-
 20 files changed, 44 insertions(+), 1344 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/4e0f1310/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/versions/CassandraSchemaVersionManager.java
----------------------------------------------------------------------
diff --git a/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/versions/CassandraSchemaVersionManager.java b/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/versions/CassandraSchemaVersionManager.java
index 45fa2a2..79072b7 100644
--- a/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/versions/CassandraSchemaVersionManager.java
+++ b/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/versions/CassandraSchemaVersionManager.java
@@ -33,9 +33,9 @@ import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Preconditions;
 
 public class CassandraSchemaVersionManager {
-    public static final int MIN_VERSION = 1;
-    public static final int MAX_VERSION = 2;
-    public static final int DEFAULT_VERSION = 1;
+    public static final int MIN_VERSION = 2;
+    public static final int MAX_VERSION = 3;
+    public static final int DEFAULT_VERSION = 2;
 
     private static final Logger LOGGER = LoggerFactory.getLogger(CassandraSchemaVersionManager.class);
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/4e0f1310/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxSessionMapperFactory.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxSessionMapperFactory.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxSessionMapperFactory.java
index cabd043..e02d5cd 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxSessionMapperFactory.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxSessionMapperFactory.java
@@ -27,6 +27,7 @@ import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.cassandra.mail.CassandraAnnotationMapper;
 import org.apache.james.mailbox.cassandra.mail.CassandraApplicableFlagDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraAttachmentMapper;
+import org.apache.james.mailbox.cassandra.mail.CassandraDeletedMessageDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraFirstUnseenDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraIndexTableHandler;
 import org.apache.james.mailbox.cassandra.mail.CassandraMailboxCounterDAO;
@@ -34,15 +35,13 @@ import org.apache.james.mailbox.cassandra.mail.CassandraMailboxDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMailboxMapper;
 import org.apache.james.mailbox.cassandra.mail.CassandraMailboxPathDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMailboxRecentsDAO;
-import org.apache.james.mailbox.cassandra.mail.CassandraMessageDAO;
+import org.apache.james.mailbox.cassandra.mail.CassandraMessageDAOV2;
 import org.apache.james.mailbox.cassandra.mail.CassandraMessageIdDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMessageIdMapper;
 import org.apache.james.mailbox.cassandra.mail.CassandraMessageIdToImapUidDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMessageMapper;
 import org.apache.james.mailbox.cassandra.mail.CassandraModSeqProvider;
 import org.apache.james.mailbox.cassandra.mail.CassandraUidProvider;
-import org.apache.james.mailbox.cassandra.mail.*;
-import org.apache.james.mailbox.cassandra.mail.migration.V1ToV2Migration;
 import org.apache.james.mailbox.cassandra.user.CassandraSubscriptionMapper;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
@@ -64,7 +63,6 @@ public class CassandraMailboxSessionMapperFactory extends MailboxSessionMapperFa
     private final Session session;
     private final CassandraUidProvider uidProvider;
     private final CassandraModSeqProvider modSeqProvider;
-    private final CassandraMessageDAO messageDAO;
     private final CassandraMessageDAOV2 messageDAOV2;
     private final CassandraMessageIdDAO messageIdDAO;
     private final CassandraMessageIdToImapUidDAO imapUidDAO;
@@ -75,22 +73,20 @@ public class CassandraMailboxSessionMapperFactory extends MailboxSessionMapperFa
     private final CassandraMailboxPathDAO mailboxPathDAO;
     private final CassandraFirstUnseenDAO firstUnseenDAO;
     private final CassandraApplicableFlagDAO applicableFlagDAO;
-    private final V1ToV2Migration v1ToV2Migration;
     private CassandraUtils cassandraUtils;
     private CassandraConfiguration cassandraConfiguration;
     private final CassandraDeletedMessageDAO deletedMessageDAO;
 
     @Inject
     public CassandraMailboxSessionMapperFactory(CassandraUidProvider uidProvider, CassandraModSeqProvider modSeqProvider, Session session,
-                                                CassandraMessageDAO messageDAO, CassandraMessageDAOV2 messageDAOV2,
+                                                CassandraMessageDAOV2 messageDAOV2,
                                                 CassandraMessageIdDAO messageIdDAO, CassandraMessageIdToImapUidDAO imapUidDAO,
                                                 CassandraMailboxCounterDAO mailboxCounterDAO, CassandraMailboxRecentsDAO mailboxRecentsDAO, CassandraMailboxDAO mailboxDAO,
                                                 CassandraMailboxPathDAO mailboxPathDAO, CassandraFirstUnseenDAO firstUnseenDAO, CassandraApplicableFlagDAO applicableFlagDAO,
-                                                CassandraDeletedMessageDAO deletedMessageDAO, V1ToV2Migration v1ToV2Migration, CassandraUtils cassandraUtils, CassandraConfiguration cassandraConfiguration) {
+                                                CassandraDeletedMessageDAO deletedMessageDAO, CassandraUtils cassandraUtils, CassandraConfiguration cassandraConfiguration) {
         this.uidProvider = uidProvider;
         this.modSeqProvider = modSeqProvider;
         this.session = session;
-        this.messageDAO = messageDAO;
         this.messageDAOV2 = messageDAOV2;
         this.messageIdDAO = messageIdDAO;
         this.imapUidDAO = imapUidDAO;
@@ -109,14 +105,12 @@ public class CassandraMailboxSessionMapperFactory extends MailboxSessionMapperFa
             firstUnseenDAO,
             applicableFlagDAO,
             deletedMessageDAO);
-        this.v1ToV2Migration = v1ToV2Migration;
     }
 
     public CassandraMailboxSessionMapperFactory(
         CassandraUidProvider uidProvider,
         CassandraModSeqProvider modSeqProvider,
         Session session,
-        CassandraMessageDAO messageDAO,
         CassandraMessageDAOV2 messageDAOV2,
         CassandraMessageIdDAO messageIdDAO,
         CassandraMessageIdToImapUidDAO imapUidDAO,
@@ -128,9 +122,8 @@ public class CassandraMailboxSessionMapperFactory extends MailboxSessionMapperFa
         CassandraApplicableFlagDAO applicableFlagDAO,
         CassandraDeletedMessageDAO deletedMesageDAO) {
 
-        this(uidProvider, modSeqProvider, session, messageDAO, messageDAOV2, messageIdDAO, imapUidDAO, mailboxCounterDAO,
+        this(uidProvider, modSeqProvider, session, messageDAOV2, messageIdDAO, imapUidDAO, mailboxCounterDAO,
             mailboxRecentsDAO, mailboxDAO, mailboxPathDAO, firstUnseenDAO, applicableFlagDAO, deletedMesageDAO,
-            new V1ToV2Migration(messageDAO, messageDAOV2, new CassandraAttachmentMapper(session), CassandraConfiguration.DEFAULT_CONFIGURATION),
             CassandraUtils.WITH_DEFAULT_CONFIGURATION, CassandraConfiguration.DEFAULT_CONFIGURATION);
     }
 
@@ -150,7 +143,6 @@ public class CassandraMailboxSessionMapperFactory extends MailboxSessionMapperFa
                                           indexTableHandler,
                                           firstUnseenDAO,
                                           deletedMessageDAO,
-                                          v1ToV2Migration,
                                           cassandraConfiguration);
     }
 
@@ -158,8 +150,8 @@ public class CassandraMailboxSessionMapperFactory extends MailboxSessionMapperFa
     public MessageIdMapper createMessageIdMapper(MailboxSession mailboxSession) throws MailboxException {
         return new CassandraMessageIdMapper(getMailboxMapper(mailboxSession), mailboxDAO,
                 (CassandraAttachmentMapper) getAttachmentMapper(mailboxSession),
-                imapUidDAO, messageIdDAO, messageDAO, messageDAOV2, indexTableHandler, modSeqProvider, mailboxSession,
-                v1ToV2Migration, cassandraConfiguration);
+                imapUidDAO, messageIdDAO, messageDAOV2, indexTableHandler, modSeqProvider, mailboxSession,
+                cassandraConfiguration);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/james-project/blob/4e0f1310/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAO.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAO.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAO.java
deleted file mode 100644
index 35c6a3f..0000000
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAO.java
+++ /dev/null
@@ -1,418 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one   *
- * or more contributor license agreements.  See the NOTICE file *
- * distributed with this work for additional information        *
- * regarding copyright ownership.  The ASF licenses this file   *
- * to you under the Apache License, Version 2.0 (the            *
- * "License"); you may not use this file except in compliance   *
- * with the License.  You may obtain a copy of the License at   *
- *                                                              *
- *   http://www.apache.org/licenses/LICENSE-2.0                 *
- *                                                              *
- * Unless required by applicable law or agreed to in writing,   *
- * software distributed under the License is distributed on an  *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
- * KIND, either express or implied.  See the License for the    *
- * specific language governing permissions and limitations      *
- * under the License.                                           *
- ****************************************************************/
-
-package org.apache.james.mailbox.cassandra.mail;
-
-import static com.datastax.driver.core.querybuilder.QueryBuilder.bindMarker;
-import static com.datastax.driver.core.querybuilder.QueryBuilder.eq;
-import static com.datastax.driver.core.querybuilder.QueryBuilder.insertInto;
-import static com.datastax.driver.core.querybuilder.QueryBuilder.select;
-import static org.apache.james.mailbox.cassandra.table.CassandraMessageIds.MESSAGE_ID;
-import static org.apache.james.mailbox.cassandra.table.CassandraMessageV1Table.ATTACHMENTS;
-import static org.apache.james.mailbox.cassandra.table.CassandraMessageV1Table.BODY;
-import static org.apache.james.mailbox.cassandra.table.CassandraMessageV1Table.BODY_CONTENT;
-import static org.apache.james.mailbox.cassandra.table.CassandraMessageV1Table.BODY_OCTECTS;
-import static org.apache.james.mailbox.cassandra.table.CassandraMessageV1Table.BODY_START_OCTET;
-import static org.apache.james.mailbox.cassandra.table.CassandraMessageV1Table.FIELDS;
-import static org.apache.james.mailbox.cassandra.table.CassandraMessageV1Table.FULL_CONTENT_OCTETS;
-import static org.apache.james.mailbox.cassandra.table.CassandraMessageV1Table.HEADERS;
-import static org.apache.james.mailbox.cassandra.table.CassandraMessageV1Table.HEADER_CONTENT;
-import static org.apache.james.mailbox.cassandra.table.CassandraMessageV1Table.INTERNAL_DATE;
-import static org.apache.james.mailbox.cassandra.table.CassandraMessageV1Table.METADATA;
-import static org.apache.james.mailbox.cassandra.table.CassandraMessageV1Table.PROPERTIES;
-import static org.apache.james.mailbox.cassandra.table.CassandraMessageV1Table.TABLE_NAME;
-import static org.apache.james.mailbox.cassandra.table.CassandraMessageV1Table.TEXTUAL_LINE_COUNT;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.ByteBuffer;
-import java.util.Date;
-import java.util.List;
-import java.util.Optional;
-import java.util.concurrent.CompletableFuture;
-import java.util.function.Function;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-
-import javax.inject.Inject;
-import javax.mail.util.SharedByteArrayInputStream;
-
-import org.apache.commons.lang3.tuple.Pair;
-import org.apache.james.backends.cassandra.CassandraConfiguration;
-import org.apache.james.backends.cassandra.init.CassandraTypesProvider;
-import org.apache.james.backends.cassandra.utils.CassandraAsyncExecutor;
-import org.apache.james.backends.cassandra.utils.CassandraUtils;
-import org.apache.james.mailbox.cassandra.ids.CassandraMessageId;
-import org.apache.james.mailbox.cassandra.mail.utils.Limit;
-import org.apache.james.mailbox.cassandra.table.CassandraMessageV1Table.Attachments;
-import org.apache.james.mailbox.cassandra.table.CassandraMessageV1Table.Properties;
-import org.apache.james.mailbox.exception.MailboxException;
-import org.apache.james.mailbox.model.AttachmentId;
-import org.apache.james.mailbox.model.Cid;
-import org.apache.james.mailbox.model.ComposedMessageId;
-import org.apache.james.mailbox.model.ComposedMessageIdWithMetaData;
-import org.apache.james.mailbox.model.MessageId;
-import org.apache.james.mailbox.store.mail.MessageMapper.FetchType;
-import org.apache.james.mailbox.store.mail.model.MailboxMessage;
-import org.apache.james.mailbox.store.mail.model.impl.PropertyBuilder;
-import org.apache.james.mailbox.store.mail.model.impl.SimpleProperty;
-import org.apache.james.util.CompletableFutureUtil;
-import org.apache.james.util.FluentFutureStream;
-import org.apache.james.util.OptionalConverter;
-import org.apache.james.util.streams.JamesCollectors;
-
-import com.datastax.driver.core.BoundStatement;
-import com.datastax.driver.core.PreparedStatement;
-import com.datastax.driver.core.ResultSet;
-import com.datastax.driver.core.Row;
-import com.datastax.driver.core.Session;
-import com.datastax.driver.core.UDTValue;
-import com.datastax.driver.core.querybuilder.QueryBuilder;
-import com.github.steveash.guavate.Guavate;
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.io.ByteStreams;
-import com.google.common.primitives.Bytes;
-
-public class CassandraMessageDAO {
-    private final CassandraAsyncExecutor cassandraAsyncExecutor;
-    private final CassandraTypesProvider typesProvider;
-    private final PreparedStatement insert;
-    private final PreparedStatement delete;
-    private final PreparedStatement selectMetadata;
-    private final PreparedStatement selectHeaders;
-    private final PreparedStatement selectFields;
-    private final PreparedStatement selectBody;
-    private final PreparedStatement selectByBatch;
-    private CassandraUtils cassandraUtils;
-    private final CassandraConfiguration cassandraConfiguration;
-    private final Cid.CidParser cidParser;
-
-    @Inject
-    public CassandraMessageDAO(Session session, CassandraTypesProvider typesProvider, CassandraConfiguration cassandraConfiguration,
-                               CassandraUtils cassandraUtils) {
-        this.cassandraAsyncExecutor = new CassandraAsyncExecutor(session);
-        this.typesProvider = typesProvider;
-        this.insert = prepareInsert(session);
-        this.delete = prepareDelete(session);
-        this.selectMetadata = prepareSelect(session, METADATA);
-        this.selectHeaders = prepareSelect(session, HEADERS);
-        this.selectFields = prepareSelect(session, FIELDS);
-        this.selectBody = prepareSelect(session, BODY);
-        this.cassandraConfiguration = cassandraConfiguration;
-        this.selectByBatch = prepareSelectBatch(session, cassandraConfiguration);
-        this.cassandraUtils = cassandraUtils;
-        this.cidParser = Cid.parser().relaxed();
-    }
-
-    @VisibleForTesting
-    public CassandraMessageDAO(Session session, CassandraTypesProvider typesProvider) {
-        this(session, typesProvider, CassandraConfiguration.DEFAULT_CONFIGURATION, CassandraUtils.WITH_DEFAULT_CONFIGURATION);
-    }
-
-    private PreparedStatement prepareSelectBatch(Session session, CassandraConfiguration cassandraConfiguration) {
-        return session.prepare(select().from(TABLE_NAME)
-            .limit(cassandraConfiguration.getFetchNextPageInAdvanceRow()));
-    }
-
-    private PreparedStatement prepareSelect(Session session, String[] fields) {
-        return session.prepare(select(fields)
-            .from(TABLE_NAME)
-            .where(eq(MESSAGE_ID, bindMarker(MESSAGE_ID))));
-    }
-
-    private PreparedStatement prepareInsert(Session session) {
-        return session.prepare(insertInto(TABLE_NAME)
-                .value(MESSAGE_ID, bindMarker(MESSAGE_ID))
-                .value(INTERNAL_DATE, bindMarker(INTERNAL_DATE))
-                .value(BODY_START_OCTET, bindMarker(BODY_START_OCTET))
-                .value(FULL_CONTENT_OCTETS, bindMarker(FULL_CONTENT_OCTETS))
-                .value(BODY_OCTECTS, bindMarker(BODY_OCTECTS))
-                .value(BODY_CONTENT, bindMarker(BODY_CONTENT))
-                .value(HEADER_CONTENT, bindMarker(HEADER_CONTENT))
-                .value(PROPERTIES, bindMarker(PROPERTIES))
-                .value(TEXTUAL_LINE_COUNT, bindMarker(TEXTUAL_LINE_COUNT))
-                .value(ATTACHMENTS, bindMarker(ATTACHMENTS)));
-    }
-
-    private PreparedStatement prepareDelete(Session session) {
-        return session.prepare(QueryBuilder.delete()
-                .from(TABLE_NAME)
-                .where(eq(MESSAGE_ID, bindMarker(MESSAGE_ID))));
-    }
-
-    public List<RawMessage> readBatch() {
-        return cassandraUtils.convertToStream(
-            cassandraAsyncExecutor.execute(selectByBatch.bind()
-                .setFetchSize(cassandraConfiguration.getV1ReadFetchSize()))
-                .join())
-            .map(this::fromRow)
-            .collect(Guavate.toImmutableList());
-    }
-
-    public CompletableFuture<Void> save(MailboxMessage message) throws MailboxException {
-        try {
-            CassandraMessageId messageId = (CassandraMessageId) message.getMessageId();
-            BoundStatement boundStatement = insert.bind()
-                .setUUID(MESSAGE_ID, messageId.get())
-                .setTimestamp(INTERNAL_DATE, message.getInternalDate())
-                .setInt(BODY_START_OCTET, (int) (message.getHeaderOctets()))
-                .setLong(FULL_CONTENT_OCTETS, message.getFullContentOctets())
-                .setLong(BODY_OCTECTS, message.getBodyOctets())
-                .setBytes(BODY_CONTENT, toByteBuffer(message.getBodyContent()))
-                .setBytes(HEADER_CONTENT, toByteBuffer(message.getHeaderContent()))
-                .setList(PROPERTIES, message.getProperties().stream()
-                    .map(x -> typesProvider.getDefinedUserType(PROPERTIES)
-                        .newValue()
-                        .setString(Properties.NAMESPACE, x.getNamespace())
-                        .setString(Properties.NAME, x.getLocalName())
-                        .setString(Properties.VALUE, x.getValue()))
-                    .collect(Collectors.toList()))
-                .setList(ATTACHMENTS, message.getAttachments().stream()
-                    .map(this::toUDT)
-                    .collect(Collectors.toList()));
-
-            return cassandraAsyncExecutor.executeVoid(setTextualLineCount(boundStatement, message.getTextualLineCount()));
-
-        } catch (IOException e) {
-            throw new MailboxException("Error saving mail", e);
-        }
-    }
-
-    private BoundStatement setTextualLineCount(BoundStatement boundStatement, Long textualLineCount) {
-        return Optional.ofNullable(textualLineCount)
-               .map(value -> boundStatement.setLong(TEXTUAL_LINE_COUNT, value))
-               .orElseGet(() -> boundStatement.setToNull(TEXTUAL_LINE_COUNT));
-    }
-
-    private UDTValue toUDT(org.apache.james.mailbox.model.MessageAttachment messageAttachment) {
-        return typesProvider.getDefinedUserType(ATTACHMENTS)
-            .newValue()
-            .setString(Attachments.ID, messageAttachment.getAttachmentId().getId())
-            .setString(Attachments.NAME, messageAttachment.getName().orNull())
-            .setString(Attachments.CID, messageAttachment.getCid().transform(Cid::getValue).orNull())
-            .setBool(Attachments.IS_INLINE, messageAttachment.isInline());
-    }
-
-    private ByteBuffer toByteBuffer(InputStream stream) throws IOException {
-        return ByteBuffer.wrap(ByteStreams.toByteArray(stream));
-    }
-
-    public CompletableFuture<Stream<Pair<MessageWithoutAttachment, Stream<MessageAttachmentRepresentation>>>> retrieveMessages(
-        List<ComposedMessageIdWithMetaData> messageIds,
-        FetchType fetchType,
-        Limit limit
-    ) {
-        return CompletableFutureUtil.chainAll(
-            limit.applyOnStream(messageIds.stream().distinct())
-                .collect(JamesCollectors.chunker(cassandraConfiguration.getMessageReadChunkSize())),
-            ids -> FluentFutureStream.of(
-                ids.stream()
-                    .map(id -> retrieveRow(id, fetchType)
-                        .thenApply((ResultSet resultSet) ->
-                            message(resultSet.one(), id, fetchType))))
-                .completableFuture())
-            .thenApply(stream -> stream.flatMap(Function.identity()));
-    }
-
-    private CompletableFuture<ResultSet> retrieveRow(ComposedMessageIdWithMetaData messageId, FetchType fetchType) {
-        CassandraMessageId cassandraMessageId = (CassandraMessageId) messageId.getComposedMessageId().getMessageId();
-
-        return cassandraAsyncExecutor.execute(retrieveSelect(fetchType)
-            .bind()
-            .setUUID(MESSAGE_ID, cassandraMessageId.get()));
-    }
-
-    private Pair<MessageWithoutAttachment, Stream<MessageAttachmentRepresentation>> message(Row row, ComposedMessageIdWithMetaData messageIdWithMetaData, FetchType fetchType) {
-        ComposedMessageId messageId = messageIdWithMetaData.getComposedMessageId();
-
-        MessageWithoutAttachment messageWithoutAttachment =
-            new MessageWithoutAttachment(
-                messageId.getMessageId(),
-                row.getTimestamp(INTERNAL_DATE),
-                row.getLong(FULL_CONTENT_OCTETS),
-                row.getInt(BODY_START_OCTET),
-                buildContent(row, fetchType),
-                messageIdWithMetaData.getFlags(),
-                retrievePropertyBuilder(row),
-                messageId.getMailboxId(),
-                messageId.getUid(),
-                messageIdWithMetaData.getModSeq());
-        return Pair.of(messageWithoutAttachment, retrieveAttachments(row, fetchType));
-    }
-
-    private PropertyBuilder retrievePropertyBuilder(Row row) {
-        PropertyBuilder property = new PropertyBuilder(
-            row.getList(PROPERTIES, UDTValue.class).stream()
-                .map(x -> new SimpleProperty(x.getString(Properties.NAMESPACE), x.getString(Properties.NAME), x.getString(Properties.VALUE)))
-                .collect(Collectors.toList()));
-        property.setTextualLineCount(row.getLong(TEXTUAL_LINE_COUNT));
-        return property;
-    }
-
-    private Stream<MessageAttachmentRepresentation> retrieveAttachments(Row row, FetchType fetchType) {
-        switch (fetchType) {
-        case Full:
-        case Body:
-            List<UDTValue> udtValues = row.getList(ATTACHMENTS, UDTValue.class);
-
-            return attachmentByIds(udtValues);
-        default:
-            return Stream.of();
-        }
-    }
-
-    private Stream<MessageAttachmentRepresentation> attachmentByIds(List<UDTValue> udtValues) {
-        return udtValues.stream()
-            .map(this::messageAttachmentByIdFrom);
-    }
-
-    private MessageAttachmentRepresentation messageAttachmentByIdFrom(UDTValue udtValue) {
-        return MessageAttachmentRepresentation.builder()
-                .attachmentId(AttachmentId.from(udtValue.getString(Attachments.ID)))
-                .name(udtValue.getString(Attachments.NAME))
-                .cid(OptionalConverter.fromGuava(
-                    cidParser.parse(udtValue.getString(Attachments.CID))))
-                .isInline(udtValue.getBool(Attachments.IS_INLINE))
-                .build();
-    }
-
-    private PreparedStatement retrieveSelect(FetchType fetchType) {
-        switch (fetchType) {
-            case Body:
-                return selectBody;
-            case Full:
-                return selectFields;
-            case Headers:
-                return selectHeaders;
-            case Metadata:
-                return selectMetadata;
-            default:
-                throw new RuntimeException("Unknown FetchType " + fetchType);
-        }
-    }
-
-    public CompletableFuture<Void> delete(CassandraMessageId messageId) {
-        return cassandraAsyncExecutor.executeVoid(delete.bind()
-            .setUUID(MESSAGE_ID, messageId.get()));
-    }
-
-    private SharedByteArrayInputStream buildContent(Row row, FetchType fetchType) {
-        switch (fetchType) {
-            case Full:
-                return new SharedByteArrayInputStream(getFullContent(row));
-            case Headers:
-                return new SharedByteArrayInputStream(getFieldContent(HEADER_CONTENT, row));
-            case Body:
-                return new SharedByteArrayInputStream(getBodyContent(row));
-            case Metadata:
-                return new SharedByteArrayInputStream(new byte[]{});
-            default:
-                throw new RuntimeException("Unknown FetchType " + fetchType);
-        }
-    }
-
-    private byte[] getFullContent(Row row) {
-        return Bytes.concat(getFieldContent(HEADER_CONTENT, row), getFieldContent(BODY_CONTENT, row));
-    }
-
-    private byte[] getBodyContent(Row row) {
-        return Bytes.concat(new byte[row.getInt(BODY_START_OCTET)], getFieldContent(BODY_CONTENT, row));
-    }
-
-    private byte[] getFieldContent(String field, Row row) {
-        byte[] headerContent = new byte[row.getBytes(field).remaining()];
-        row.getBytes(field).get(headerContent);
-        return headerContent;
-    }
-
-    private RawMessage fromRow(Row row) {
-        return new RawMessage(
-            row.getTimestamp(INTERNAL_DATE),
-            new CassandraMessageId.Factory().of(row.getUUID(MESSAGE_ID)),
-            row.getInt(BODY_START_OCTET),
-            row.getLong(FULL_CONTENT_OCTETS),
-            getFieldContent(BODY_CONTENT, row),
-            getFieldContent(HEADER_CONTENT, row),
-            retrievePropertyBuilder(row),
-            row.getLong(TEXTUAL_LINE_COUNT),
-            retrieveAttachments(row, FetchType.Full).collect(Guavate.toImmutableList()));
-    }
-
-    public static class RawMessage {
-        private final Date internalDate;
-        private final MessageId messageId;
-        private final int bodyStartOctet;
-        private final long fullContentOctet;
-        private final byte[] bodyContent;
-        private final byte[] headerContent;
-        private final PropertyBuilder propertyBuilder;
-        private final long textuaLineCount;
-        private final List<MessageAttachmentRepresentation> attachments;
-
-        private RawMessage(Date internalDate, MessageId messageId, int bodyStartOctet, long fullContentOctet, byte[] bodyContent,
-                          byte[] headerContent, PropertyBuilder propertyBuilder, long textuaLineCount,
-                          List<MessageAttachmentRepresentation> attachments) {
-            this.internalDate = internalDate;
-            this.messageId = messageId;
-            this.bodyStartOctet = bodyStartOctet;
-            this.fullContentOctet = fullContentOctet;
-            this.bodyContent = bodyContent;
-            this.headerContent = headerContent;
-            this.propertyBuilder = propertyBuilder;
-            this.textuaLineCount = textuaLineCount;
-            this.attachments = attachments;
-        }
-
-        public Date getInternalDate() {
-            return internalDate;
-        }
-
-        public MessageId getMessageId() {
-            return messageId;
-        }
-
-        public int getBodyStartOctet() {
-            return bodyStartOctet;
-        }
-
-        public long getFullContentOctet() {
-            return fullContentOctet;
-        }
-
-        public byte[] getBodyContent() {
-            return bodyContent;
-        }
-
-        public byte[] getHeaderContent() {
-            return headerContent;
-        }
-
-        public PropertyBuilder getPropertyBuilder() {
-            return propertyBuilder;
-        }
-
-        public long getTextuaLineCount() {
-            return textuaLineCount;
-        }
-
-        public List<MessageAttachmentRepresentation> getAttachments() {
-            return attachments;
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/james-project/blob/4e0f1310/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOV2.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOV2.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOV2.java
index b44bd8c..ae86d59 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOV2.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOV2.java
@@ -59,7 +59,7 @@ import org.apache.james.backends.cassandra.utils.CassandraAsyncExecutor;
 import org.apache.james.mailbox.cassandra.ids.BlobId;
 import org.apache.james.mailbox.cassandra.ids.CassandraMessageId;
 import org.apache.james.mailbox.cassandra.mail.utils.Limit;
-import org.apache.james.mailbox.cassandra.table.CassandraMessageV1Table;
+import org.apache.james.mailbox.cassandra.table.CassandraMessageV2Table;
 import org.apache.james.mailbox.cassandra.table.CassandraMessageV2Table.Attachments;
 import org.apache.james.mailbox.cassandra.table.CassandraMessageV2Table.Properties;
 import org.apache.james.mailbox.exception.MailboxException;
@@ -213,30 +213,6 @@ public class CassandraMessageDAOV2 {
             .setBool(Attachments.IS_INLINE, messageAttachment.isInline());
     }
 
-    public CompletableFuture<Void> save(CassandraMessageDAO.RawMessage rawMessage) {
-        return CompletableFutureUtil.combine(
-            blobsDAO.save(rawMessage.getHeaderContent()),
-            blobsDAO.save(rawMessage.getBodyContent()),
-            Pair::of)
-            .thenCompose(pair ->
-                cassandraAsyncExecutor.executeVoid(boundWriteStatement(rawMessage, pair)));
-    }
-
-    private BoundStatement boundWriteStatement(CassandraMessageDAO.RawMessage message, Pair<Optional<BlobId>, Optional<BlobId>> pair) {
-        CassandraMessageId messageId = (CassandraMessageId) message.getMessageId();
-        return insert.bind()
-            .setUUID(MESSAGE_ID, messageId.get())
-            .setTimestamp(INTERNAL_DATE, message.getInternalDate())
-            .setInt(BODY_START_OCTET, message.getBodyStartOctet())
-            .setLong(FULL_CONTENT_OCTETS, message.getFullContentOctet())
-            .setLong(BODY_OCTECTS, message.getFullContentOctet() - message.getBodyStartOctet())
-            .setString(BODY_CONTENT, pair.getRight().map(BlobId::getId).orElse(DEFAULT_OBJECT_VALUE))
-            .setString(HEADER_CONTENT, pair.getLeft().map(BlobId::getId).orElse(DEFAULT_OBJECT_VALUE))
-            .setLong(TEXTUAL_LINE_COUNT, message.getTextuaLineCount())
-            .setList(PROPERTIES, buildPropertiesUdt(message.getPropertyBuilder().toProperties()))
-            .setList(ATTACHMENTS, buildAttachmentUdt(message));
-    }
-
     private List<UDTValue> buildPropertiesUdt(MailboxMessage message) {
         return message.getProperties().stream()
             .map(x -> typesProvider.getDefinedUserType(PROPERTIES)
@@ -247,21 +223,6 @@ public class CassandraMessageDAOV2 {
             .collect(Guavate.toImmutableList());
     }
 
-    private ImmutableList<UDTValue> buildAttachmentUdt(CassandraMessageDAO.RawMessage message) {
-        return message.getAttachments().stream()
-            .map(this::toUDT)
-            .collect(Guavate.toImmutableList());
-    }
-
-    private UDTValue toUDT(MessageAttachmentRepresentation messageAttachment) {
-        return typesProvider.getDefinedUserType(ATTACHMENTS)
-            .newValue()
-            .setString(Attachments.ID, messageAttachment.getAttachmentId().getId())
-            .setString(Attachments.NAME, messageAttachment.getName().orElse(null))
-            .setString(Attachments.CID, messageAttachment.getCid().map(Cid::getValue).orElse(null))
-            .setBool(Attachments.IS_INLINE, messageAttachment.isInline());
-    }
-
     public CompletableFuture<Stream<MessageResult>> retrieveMessages(List<ComposedMessageIdWithMetaData> messageIds, FetchType fetchType, Limit limit) {
         return CompletableFutureUtil.chainAll(
                 limit.applyOnStream(messageIds.stream().distinct())
@@ -345,7 +306,7 @@ public class CassandraMessageDAOV2 {
             .attachmentId(AttachmentId.from(udtValue.getString(Attachments.ID)))
             .name(udtValue.getString(Attachments.NAME))
             .cid(OptionalConverter.fromGuava(
-                cidParser.parse(udtValue.getString(CassandraMessageV1Table.Attachments.CID))))
+                cidParser.parse(udtValue.getString(CassandraMessageV2Table.Attachments.CID))))
             .isInline(udtValue.getBool(Attachments.IS_INLINE))
             .build();
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/4e0f1310/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapper.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapper.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapper.java
index 0af8c74..868b382 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapper.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapper.java
@@ -35,7 +35,6 @@ import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageManager;
 import org.apache.james.mailbox.cassandra.ids.CassandraId;
 import org.apache.james.mailbox.cassandra.ids.CassandraMessageId;
-import org.apache.james.mailbox.cassandra.mail.migration.V1ToV2Migration;
 import org.apache.james.mailbox.cassandra.mail.utils.Limit;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.ComposedMessageId;
@@ -56,7 +55,6 @@ import org.slf4j.LoggerFactory;
 
 import com.github.steveash.guavate.Guavate;
 import com.google.common.base.Throwables;
-import com.google.common.collect.ImmutableList;
 
 public class CassandraMessageIdMapper implements MessageIdMapper {
     private static final Logger LOGGER = LoggerFactory.getLogger(CassandraMessageIdMapper.class);
@@ -70,14 +68,12 @@ public class CassandraMessageIdMapper implements MessageIdMapper {
     private final ModSeqProvider modSeqProvider;
     private final MailboxSession mailboxSession;
     private final AttachmentLoader attachmentLoader;
-    private final V1ToV2Migration v1ToV2Migration;
     private final CassandraConfiguration cassandraConfiguration;
 
     public CassandraMessageIdMapper(MailboxMapper mailboxMapper, CassandraMailboxDAO mailboxDAO, CassandraAttachmentMapper attachmentMapper,
                                     CassandraMessageIdToImapUidDAO imapUidDAO, CassandraMessageIdDAO messageIdDAO,
-                                    CassandraMessageDAO messageDAOV1, CassandraMessageDAOV2 messageDAOV2,
-                                    CassandraIndexTableHandler indexTableHandler, ModSeqProvider modSeqProvider, MailboxSession mailboxSession,
-                                    V1ToV2Migration v1ToV2Migration, CassandraConfiguration cassandraConfiguration) {
+                                    CassandraMessageDAOV2 messageDAOV2, CassandraIndexTableHandler indexTableHandler,
+                                    ModSeqProvider modSeqProvider, MailboxSession mailboxSession, CassandraConfiguration cassandraConfiguration) {
 
         this.mailboxMapper = mailboxMapper;
         this.mailboxDAO = mailboxDAO;
@@ -89,7 +85,6 @@ public class CassandraMessageIdMapper implements MessageIdMapper {
         this.mailboxSession = mailboxSession;
         this.attachmentLoader = new AttachmentLoader(attachmentMapper);
         this.cassandraConfiguration = cassandraConfiguration;
-        this.v1ToV2Migration = v1ToV2Migration;
     }
 
     @Override
@@ -104,21 +99,16 @@ public class CassandraMessageIdMapper implements MessageIdMapper {
                 .map(messageId -> imapUidDAO.retrieve((CassandraMessageId) messageId, Optional.empty())))
             .completableFuture()
             .thenApply(stream -> stream.collect(Guavate.toImmutableList()))
-            .thenCompose(composedMessageIds -> retrieveMessagesAndDoMigrationIfNeeded(fetchType, composedMessageIds))
+            .thenCompose(composedMessageIds -> messageDAOV2.retrieveMessages(composedMessageIds, fetchType, Limit.unlimited()))
+            .thenApply(stream -> stream
+                .filter(CassandraMessageDAOV2.MessageResult::isFound)
+                .map(CassandraMessageDAOV2.MessageResult::message))
             .thenCompose(stream -> attachmentLoader.addAttachmentToMessages(stream, fetchType))
             .thenCompose(this::filterMessagesWithExistingMailbox)
             .join()
             .sorted(Comparator.comparing(MailboxMessage::getUid));
     }
 
-    private CompletableFuture<Stream<Pair<MessageWithoutAttachment, Stream<MessageAttachmentRepresentation>>>>
-            retrieveMessagesAndDoMigrationIfNeeded(FetchType fetchType, ImmutableList<ComposedMessageIdWithMetaData> composedMessageIds) {
-
-        return FluentFutureStream.of(messageDAOV2.retrieveMessages(composedMessageIds, fetchType, Limit.unlimited()))
-            .thenComposeOnAll(v1ToV2Migration::getFromV2orElseFromV1AfterMigration)
-            .completableFuture();
-    }
-
     private CompletableFuture<Stream<SimpleMailboxMessage>> filterMessagesWithExistingMailbox(Stream<SimpleMailboxMessage> stream) {
         return FluentFutureStream.ofOptionals(stream.map(this::keepMessageIfMailboxExists))
             .completableFuture();

http://git-wip-us.apache.org/repos/asf/james-project/blob/4e0f1310/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java
index 859f551..074f336 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java
@@ -31,7 +31,6 @@ import java.util.stream.Stream;
 import javax.mail.Flags;
 import javax.mail.Flags.Flag;
 
-import org.apache.commons.lang3.tuple.Pair;
 import org.apache.james.backends.cassandra.CassandraConfiguration;
 import org.apache.james.mailbox.ApplicableFlagBuilder;
 import org.apache.james.mailbox.FlagsBuilder;
@@ -39,7 +38,6 @@ import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.cassandra.ids.CassandraId;
 import org.apache.james.mailbox.cassandra.ids.CassandraMessageId;
-import org.apache.james.mailbox.cassandra.mail.migration.V1ToV2Migration;
 import org.apache.james.mailbox.cassandra.mail.utils.FlagsUpdateStageResult;
 import org.apache.james.mailbox.cassandra.mail.utils.Limit;
 import org.apache.james.mailbox.exception.MailboxException;
@@ -85,7 +83,6 @@ public class CassandraMessageMapper implements MessageMapper {
     private final CassandraFirstUnseenDAO firstUnseenDAO;
     private final AttachmentLoader attachmentLoader;
     private final CassandraDeletedMessageDAO deletedMessageDAO;
-    private final V1ToV2Migration v1ToV2Migration;
     private final CassandraConfiguration cassandraConfiguration;
 
     public CassandraMessageMapper(CassandraUidProvider uidProvider, CassandraModSeqProvider modSeqProvider,
@@ -94,8 +91,7 @@ public class CassandraMessageMapper implements MessageMapper {
                                   CassandraMessageIdToImapUidDAO imapUidDAO, CassandraMailboxCounterDAO mailboxCounterDAO,
                                   CassandraMailboxRecentsDAO mailboxRecentDAO, CassandraApplicableFlagDAO applicableFlagDAO,
                                   CassandraIndexTableHandler indexTableHandler, CassandraFirstUnseenDAO firstUnseenDAO,
-                                  CassandraDeletedMessageDAO deletedMessageDAO, V1ToV2Migration v1ToV2Migration,
-                                  CassandraConfiguration cassandraConfiguration) {
+                                  CassandraDeletedMessageDAO deletedMessageDAO, CassandraConfiguration cassandraConfiguration) {
         this.uidProvider = uidProvider;
         this.modSeqProvider = modSeqProvider;
         this.mailboxSession = mailboxSession;
@@ -109,7 +105,6 @@ public class CassandraMessageMapper implements MessageMapper {
         this.attachmentLoader = new AttachmentLoader(attachmentMapper);
         this.applicableFlagDAO = applicableFlagDAO;
         this.deletedMessageDAO = deletedMessageDAO;
-        this.v1ToV2Migration = v1ToV2Migration;
         this.cassandraConfiguration = cassandraConfiguration;
     }
 
@@ -183,10 +178,10 @@ public class CassandraMessageMapper implements MessageMapper {
     }
 
     private CompletableFuture<Stream<SimpleMailboxMessage>> retrieveMessages(List<ComposedMessageIdWithMetaData> messageIds, FetchType fetchType, Limit limit) {
-        CompletableFuture<Stream<Pair<MessageWithoutAttachment, Stream<MessageAttachmentRepresentation>>>>
-            messageRepresentations = retrieveMessagesAndDoMigrationIfNeeded(messageIds, fetchType, limit);
-
-        return messageRepresentations
+        return messageDAOV2.retrieveMessages(messageIds, fetchType, limit)
+            .thenApply(steam -> steam
+                .filter(CassandraMessageDAOV2.MessageResult::isFound)
+                .map(CassandraMessageDAOV2.MessageResult::message))
             .thenCompose(stream -> attachmentLoader.addAttachmentToMessages(stream, fetchType));
     }
 
@@ -222,7 +217,9 @@ public class CassandraMessageMapper implements MessageMapper {
         return FluentFutureStream.ofOptionals(
                 uidChunk.stream().map(uid -> retrieveComposedId(mailboxId, uid)))
             .performOnAll(this::deleteUsingMailboxId)
-            .thenFlatCompose(idWithMetadata -> retrieveMessagesAndDoMigrationIfNeeded(ImmutableList.of(idWithMetadata), FetchType.Metadata, Limit.unlimited()))
+            .thenFlatCompose(idWithMetadata -> messageDAOV2.retrieveMessages(ImmutableList.of(idWithMetadata), FetchType.Metadata, Limit.unlimited()))
+            .filter(CassandraMessageDAOV2.MessageResult::isFound)
+            .map(CassandraMessageDAOV2.MessageResult::message)
             .map(pair -> pair.getKey().toMailboxMessage(ImmutableList.of()))
             .completableFuture();
     }
@@ -233,14 +230,6 @@ public class CassandraMessageMapper implements MessageMapper {
                 () -> LOGGER.warn("Could not retrieve message {} {}", mailboxId, uid)));
     }
 
-    private CompletableFuture<Stream<Pair<MessageWithoutAttachment, Stream<MessageAttachmentRepresentation>>>> retrieveMessagesAndDoMigrationIfNeeded(
-        List<ComposedMessageIdWithMetaData> messageIds, FetchType fetchType, Limit limit) {
-
-        return FluentFutureStream.of(messageDAOV2.retrieveMessages(messageIds, fetchType, limit))
-            .thenComposeOnAll(v1ToV2Migration::getFromV2orElseFromV1AfterMigration)
-            .completableFuture();
-    }
-
     @Override
     public MessageMetaData move(Mailbox destinationMailbox, MailboxMessage original) throws MailboxException {
         ComposedMessageIdWithMetaData composedMessageIdWithMetaData = original.getComposedMessageIdWithMetaData();

http://git-wip-us.apache.org/repos/asf/james-project/blob/4e0f1310/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/migration/V1ToV2Migration.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/migration/V1ToV2Migration.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/migration/V1ToV2Migration.java
deleted file mode 100644
index db87065..0000000
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/migration/V1ToV2Migration.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one   *
- * or more contributor license agreements.  See the NOTICE file *
- * distributed with this work for additional information        *
- * regarding copyright ownership.  The ASF licenses this file   *
- * to you under the Apache License, Version 2.0 (the            *
- * "License"); you may not use this file except in compliance   *
- * with the License.  You may obtain a copy of the License at   *
- *                                                              *
- *   http://www.apache.org/licenses/LICENSE-2.0                 *
- *                                                              *
- * Unless required by applicable law or agreed to in writing,   *
- * software distributed under the License is distributed on an  *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
- * KIND, either express or implied.  See the License for the    *
- * specific language governing permissions and limitations      *
- * under the License.                                           *
- ****************************************************************/
-
-package org.apache.james.mailbox.cassandra.mail.migration;
-
-import java.util.List;
-import java.util.concurrent.ArrayBlockingQueue;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.stream.IntStream;
-import java.util.stream.Stream;
-
-import javax.annotation.PreDestroy;
-import javax.inject.Inject;
-
-import org.apache.commons.lang3.tuple.Pair;
-import org.apache.james.backends.cassandra.CassandraConfiguration;
-import org.apache.james.mailbox.cassandra.ids.CassandraMessageId;
-import org.apache.james.mailbox.cassandra.mail.AttachmentLoader;
-import org.apache.james.mailbox.cassandra.mail.CassandraAttachmentMapper;
-import org.apache.james.mailbox.cassandra.mail.CassandraMessageDAO;
-import org.apache.james.mailbox.cassandra.mail.CassandraMessageDAOV2;
-import org.apache.james.mailbox.cassandra.mail.MessageAttachmentRepresentation;
-import org.apache.james.mailbox.cassandra.mail.MessageWithoutAttachment;
-import org.apache.james.mailbox.cassandra.mail.utils.Limit;
-import org.apache.james.mailbox.store.mail.MessageMapper;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.github.fge.lambdas.Throwing;
-import com.github.steveash.guavate.Guavate;
-import com.google.common.collect.ImmutableList;
-
-public class V1ToV2Migration implements Migration {
-
-    private static final Logger LOGGER = LoggerFactory.getLogger(V1ToV2MigrationThread.class);
-
-    private final CassandraMessageDAO messageDAOV1;
-    private final CassandraMessageDAOV2 messageDAOV2;
-    private final AttachmentLoader attachmentLoader;
-    private final CassandraConfiguration cassandraConfiguration;
-    private final ExecutorService migrationExecutor;
-    private final ArrayBlockingQueue<Pair<MessageWithoutAttachment, List<MessageAttachmentRepresentation>>> messagesToBeMigrated;
-
-    @Inject
-    public V1ToV2Migration(CassandraMessageDAO messageDAOV1, CassandraMessageDAOV2 messageDAOV2,
-                           CassandraAttachmentMapper attachmentMapper, CassandraConfiguration cassandraConfiguration) {
-        this.messageDAOV1 = messageDAOV1;
-        this.messageDAOV2 = messageDAOV2;
-        this.attachmentLoader = new AttachmentLoader(attachmentMapper);
-        this.cassandraConfiguration = cassandraConfiguration;
-        this.migrationExecutor = Executors.newFixedThreadPool(cassandraConfiguration.getV1ToV2ThreadCount());
-        boolean ensureFifoOrder = false;
-        this.messagesToBeMigrated = new ArrayBlockingQueue<>(cassandraConfiguration.getV1ToV2QueueLength(), ensureFifoOrder);
-        executeMigrationThread(messageDAOV1, messageDAOV2, cassandraConfiguration);
-    }
-
-    private void executeMigrationThread(CassandraMessageDAO messageDAOV1, CassandraMessageDAOV2 messageDAOV2, CassandraConfiguration cassandraConfiguration) {
-        if (cassandraConfiguration.isOnTheFlyV1ToV2Migration()) {
-            IntStream.range(0, cassandraConfiguration.getV1ToV2ThreadCount())
-                .mapToObj(i -> new V1ToV2MigrationThread(messagesToBeMigrated, messageDAOV1, messageDAOV2, attachmentLoader))
-                .forEach(migrationExecutor::execute);
-        }
-    }
-
-    @PreDestroy
-    public void stop() {
-        migrationExecutor.shutdownNow();
-    }
-
-    public CompletableFuture<Pair<MessageWithoutAttachment, Stream<MessageAttachmentRepresentation>>>
-            getFromV2orElseFromV1AfterMigration(CassandraMessageDAOV2.MessageResult result) {
-
-        if (result.isFound()) {
-            return CompletableFuture.completedFuture(result.message());
-        }
-
-        return messageDAOV1.retrieveMessages(ImmutableList.of(result.getMetadata()), MessageMapper.FetchType.Full, Limit.unlimited())
-            .thenApply(
-                Throwing.function(results -> results.findAny()
-                    .orElseThrow(() -> new IllegalArgumentException("Message not found in DAO V1" + result.getMetadata()))))
-            .thenApply(this::submitMigration);
-    }
-
-    private Pair<MessageWithoutAttachment, Stream<MessageAttachmentRepresentation>> submitMigration(Pair<MessageWithoutAttachment, Stream<MessageAttachmentRepresentation>> messageV1) {
-        if (cassandraConfiguration.isOnTheFlyV1ToV2Migration()) {
-            Pair<MessageWithoutAttachment, List<MessageAttachmentRepresentation>> messageV1WithAttachmentCopied =
-                Pair.of(messageV1.getLeft(), messageV1.getRight().collect(Guavate.toImmutableList()));
-            synchronized (messagesToBeMigrated) {
-
-                if (!messagesToBeMigrated.offer(messageV1WithAttachmentCopied)) {
-                    LOGGER.info("Migration queue is full message {} is ignored", messageV1.getLeft().getMessageId());
-                }
-            }
-            return Pair.of(messageV1.getLeft(), messageV1WithAttachmentCopied.getRight().stream());
-        }
-        return messageV1;
-    }
-
-    @Override
-    public MigrationResult run() {
-        boolean allResultFetched = false;
-        MigrationResult result = MigrationResult.COMPLETED;
-
-        while (!allResultFetched) {
-            List<CassandraMessageDAO.RawMessage> batch = messageDAOV1.readBatch();
-            allResultFetched = batch.isEmpty();
-            result = Migration.combine(result, migrateBatch(batch));
-        }
-        return result;
-    }
-
-    private MigrationResult migrateBatch(List<CassandraMessageDAO.RawMessage> batch) {
-        return batch
-            .stream()
-            .map(this::migrate)
-            .reduce(MigrationResult.COMPLETED, Migration::combine);
-    }
-
-    private MigrationResult migrate(CassandraMessageDAO.RawMessage rawMessage) {
-        try {
-            CassandraMessageId messageId = (CassandraMessageId) rawMessage.getMessageId();
-
-            messageDAOV2.save(rawMessage)
-                .thenCompose(any -> messageDAOV1.delete(messageId))
-                .join();
-
-            LOGGER.debug("{} migrated", rawMessage.getMessageId());
-
-            return MigrationResult.COMPLETED;
-        } catch (Exception e) {
-            LOGGER.warn("Error while migrating {}", rawMessage.getMessageId(), e);
-
-            return MigrationResult.PARTIAL;
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/james-project/blob/4e0f1310/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/migration/V1ToV2MigrationThread.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/migration/V1ToV2MigrationThread.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/migration/V1ToV2MigrationThread.java
deleted file mode 100644
index c65a521..0000000
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/migration/V1ToV2MigrationThread.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one   *
- * or more contributor license agreements.  See the NOTICE file *
- * distributed with this work for additional information        *
- * regarding copyright ownership.  The ASF licenses this file   *
- * to you under the Apache License, Version 2.0 (the            *
- * "License"); you may not use this file except in compliance   *
- * with the License.  You may obtain a copy of the License at   *
- *                                                              *
- *   http://www.apache.org/licenses/LICENSE-2.0                 *
- *                                                              *
- * Unless required by applicable law or agreed to in writing,   *
- * software distributed under the License is distributed on an  *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
- * KIND, either express or implied.  See the License for the    *
- * specific language governing permissions and limitations      *
- * under the License.                                           *
- ****************************************************************/
-
-package org.apache.james.mailbox.cassandra.mail.migration;
-
-import java.util.List;
-import java.util.Optional;
-import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.CompletableFuture;
-import java.util.stream.Stream;
-
-import org.apache.commons.lang3.tuple.Pair;
-import org.apache.james.mailbox.cassandra.ids.CassandraMessageId;
-import org.apache.james.mailbox.cassandra.mail.AttachmentLoader;
-import org.apache.james.mailbox.cassandra.mail.CassandraMessageDAO;
-import org.apache.james.mailbox.cassandra.mail.CassandraMessageDAOV2;
-import org.apache.james.mailbox.cassandra.mail.MessageAttachmentRepresentation;
-import org.apache.james.mailbox.cassandra.mail.MessageWithoutAttachment;
-import org.apache.james.mailbox.exception.MailboxException;
-import org.apache.james.mailbox.store.mail.MessageMapper;
-import org.apache.james.mailbox.store.mail.model.impl.SimpleMailboxMessage;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class V1ToV2MigrationThread implements Runnable {
-
-    private static final Logger LOGGER = LoggerFactory.getLogger(V1ToV2MigrationThread.class);
-
-    private final BlockingQueue<Pair<MessageWithoutAttachment, List<MessageAttachmentRepresentation>>> messagesToBeMigrated;
-    private final CassandraMessageDAO messageDAOV1;
-    private final CassandraMessageDAOV2 messageDAOV2;
-    private final AttachmentLoader attachmentLoader;
-
-    public V1ToV2MigrationThread(BlockingQueue<Pair<MessageWithoutAttachment, List<MessageAttachmentRepresentation>>> messagesToBeMigrated,
-                                 CassandraMessageDAO messageDAOV1, CassandraMessageDAOV2 messageDAOV2, AttachmentLoader attachmentLoader) {
-        this.messagesToBeMigrated = messagesToBeMigrated;
-        this.messageDAOV1 = messageDAOV1;
-        this.messageDAOV2 = messageDAOV2;
-        this.attachmentLoader = attachmentLoader;
-    }
-
-    @Override
-    public void run() {
-        while (true) {
-            try {
-                Pair<MessageWithoutAttachment, List<MessageAttachmentRepresentation>> message = messagesToBeMigrated.take();
-                performV1ToV2Migration(Pair.of(message.getLeft(), message.getRight().stream())).join();
-            } catch (Exception e) {
-                LOGGER.error("Error occured in migration thread", e);
-            }
-        }
-    }
-
-    private CompletableFuture<Void> performV1ToV2Migration(Pair<MessageWithoutAttachment, Stream<MessageAttachmentRepresentation>> messageV1) {
-        return attachmentLoader.addAttachmentToMessages(Stream.of(messageV1), MessageMapper.FetchType.Full)
-            .thenApply(stream -> stream.findAny().get())
-            .thenCompose(this::performV1ToV2Migration);
-    }
-
-    private CompletableFuture<Void> performV1ToV2Migration(SimpleMailboxMessage message) {
-        return saveInV2FromV1(message)
-            .thenCompose(this::deleteInV1);
-    }
-
-    private CompletableFuture<Void> deleteInV1(Optional<SimpleMailboxMessage> optional) {
-        return optional.map(SimpleMailboxMessage::getMessageId)
-            .map(messageId -> (CassandraMessageId) messageId)
-            .map(messageDAOV1::delete)
-            .orElse(CompletableFuture.completedFuture(null));
-    }
-
-    private CompletableFuture<Optional<SimpleMailboxMessage>> saveInV2FromV1(SimpleMailboxMessage message) {
-        try {
-            return messageDAOV2.save(message).thenApply(any -> Optional.of(message));
-        } catch (MailboxException e) {
-            LOGGER.error("Exception while saving message during migration", e);
-            return CompletableFuture.completedFuture(Optional.<SimpleMailboxMessage>empty());
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/james-project/blob/4e0f1310/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraMessageModule.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraMessageModule.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraMessageModule.java
index 9284d9e..428a45a 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraMessageModule.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraMessageModule.java
@@ -20,7 +20,6 @@
 package org.apache.james.mailbox.cassandra.modules;
 
 import static com.datastax.driver.core.DataType.bigint;
-import static com.datastax.driver.core.DataType.blob;
 import static com.datastax.driver.core.DataType.cboolean;
 import static com.datastax.driver.core.DataType.cint;
 import static com.datastax.driver.core.DataType.set;
@@ -35,7 +34,6 @@ import org.apache.james.backends.cassandra.components.CassandraTable;
 import org.apache.james.backends.cassandra.components.CassandraType;
 import org.apache.james.mailbox.cassandra.table.CassandraMessageIdTable;
 import org.apache.james.mailbox.cassandra.table.CassandraMessageIds;
-import org.apache.james.mailbox.cassandra.table.CassandraMessageV1Table;
 import org.apache.james.mailbox.cassandra.table.CassandraMessageV2Table;
 import org.apache.james.mailbox.cassandra.table.Flag;
 import org.apache.james.mailbox.cassandra.table.MessageIdToImapUid;
@@ -92,21 +90,6 @@ public class CassandraMessageModule implements CassandraModule {
                     .compactionOptions(SchemaBuilder.leveledStrategy())
                     .caching(SchemaBuilder.KeyCaching.ALL,
                         SchemaBuilder.rows(CACHED_MESSAGE_ID_ROWS))),
-            new CassandraTable(CassandraMessageV1Table.TABLE_NAME,
-                SchemaBuilder.createTable(CassandraMessageV1Table.TABLE_NAME)
-                    .ifNotExists()
-                    .addPartitionKey(CassandraMessageIds.MESSAGE_ID, timeuuid())
-                    .addColumn(CassandraMessageV1Table.INTERNAL_DATE, timestamp())
-                    .addColumn(CassandraMessageV1Table.BODY_START_OCTET, cint())
-                    .addColumn(CassandraMessageV1Table.BODY_OCTECTS, bigint())
-                    .addColumn(CassandraMessageV1Table.TEXTUAL_LINE_COUNT, bigint())
-                    .addColumn(CassandraMessageV1Table.FULL_CONTENT_OCTETS, bigint())
-                    .addColumn(CassandraMessageV1Table.BODY_CONTENT, blob())
-                    .addColumn(CassandraMessageV1Table.HEADER_CONTENT, blob())
-                    .addUDTListColumn(CassandraMessageV1Table.ATTACHMENTS, SchemaBuilder.frozen(CassandraMessageV1Table.ATTACHMENTS))
-                    .addUDTListColumn(CassandraMessageV1Table.PROPERTIES, SchemaBuilder.frozen(CassandraMessageV1Table.PROPERTIES))
-                    .withOptions()
-                    .comment("Deprecated table. Was used to store messages. See `messagev2` instead.")),
             new CassandraTable(CassandraMessageV2Table.TABLE_NAME,
                 SchemaBuilder.createTable(CassandraMessageV2Table.TABLE_NAME)
                     .ifNotExists()
@@ -124,19 +107,19 @@ public class CassandraMessageModule implements CassandraModule {
                     .comment("Holds message metadata, independently of any mailboxes. Content of messages is stored " +
                         "in `blobs` and `blobparts` tables.")));
         types = ImmutableList.of(
-            new CassandraType(CassandraMessageV1Table.PROPERTIES,
-                SchemaBuilder.createType(CassandraMessageV1Table.PROPERTIES)
+            new CassandraType(CassandraMessageV2Table.PROPERTIES,
+                SchemaBuilder.createType(CassandraMessageV2Table.PROPERTIES)
                     .ifNotExists()
-                    .addColumn(CassandraMessageV1Table.Properties.NAMESPACE, text())
-                    .addColumn(CassandraMessageV1Table.Properties.NAME, text())
-                    .addColumn(CassandraMessageV1Table.Properties.VALUE, text())),
-            new CassandraType(CassandraMessageV1Table.ATTACHMENTS,
-                SchemaBuilder.createType(CassandraMessageV1Table.ATTACHMENTS)
+                    .addColumn(CassandraMessageV2Table.Properties.NAMESPACE, text())
+                    .addColumn(CassandraMessageV2Table.Properties.NAME, text())
+                    .addColumn(CassandraMessageV2Table.Properties.VALUE, text())),
+            new CassandraType(CassandraMessageV2Table.ATTACHMENTS,
+                SchemaBuilder.createType(CassandraMessageV2Table.ATTACHMENTS)
                     .ifNotExists()
-                    .addColumn(CassandraMessageV1Table.Attachments.ID, text())
-                    .addColumn(CassandraMessageV1Table.Attachments.NAME, text())
-                    .addColumn(CassandraMessageV1Table.Attachments.CID, text())
-                    .addColumn(CassandraMessageV1Table.Attachments.IS_INLINE, cboolean())));
+                    .addColumn(CassandraMessageV2Table.Attachments.ID, text())
+                    .addColumn(CassandraMessageV2Table.Attachments.NAME, text())
+                    .addColumn(CassandraMessageV2Table.Attachments.CID, text())
+                    .addColumn(CassandraMessageV2Table.Attachments.IS_INLINE, cboolean())));
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/james-project/blob/4e0f1310/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMessageV1Table.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMessageV1Table.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMessageV1Table.java
deleted file mode 100644
index d932807..0000000
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMessageV1Table.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one   *
- * or more contributor license agreements.  See the NOTICE file *
- * distributed with this work for additional information        *
- * regarding copyright ownership.  The ASF licenses this file   *
- * to you under the Apache License, Version 2.0 (the            *
- * "License"); you may not use this file except in compliance   *
- * with the License.  You may obtain a copy of the License at   *
- *                                                              *
- *   http://www.apache.org/licenses/LICENSE-2.0                 *
- *                                                              *
- * Unless required by applicable law or agreed to in writing,   *
- * software distributed under the License is distributed on an  *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
- * KIND, either express or implied.  See the License for the    *
- * specific language governing permissions and limitations      *
- * under the License.                                           *
- ****************************************************************/
-
-package org.apache.james.mailbox.cassandra.table;
-
-import static org.apache.james.mailbox.cassandra.table.CassandraMessageIds.MESSAGE_ID;
-
-public interface CassandraMessageV1Table {
-
-    String TABLE_NAME = "message";
-    String INTERNAL_DATE = "internalDate";
-    String BODY_START_OCTET = "bodyStartOctet";
-    String FULL_CONTENT_OCTETS = "fullContentOctets";
-    String BODY_OCTECTS = "bodyOctets";
-    String TEXTUAL_LINE_COUNT = "textualLineCount";
-    String BODY_CONTENT = "bodyContent";
-    String HEADER_CONTENT = "headerContent";
-    String PROPERTIES = "properties";
-    String ATTACHMENTS = "attachments";
-
-    String[] FIELDS = { MESSAGE_ID, INTERNAL_DATE, BODY_START_OCTET, FULL_CONTENT_OCTETS, BODY_OCTECTS, BODY_CONTENT, HEADER_CONTENT, TEXTUAL_LINE_COUNT, PROPERTIES, ATTACHMENTS };
-    String[] METADATA = { MESSAGE_ID, INTERNAL_DATE, BODY_START_OCTET, FULL_CONTENT_OCTETS, BODY_OCTECTS, TEXTUAL_LINE_COUNT, PROPERTIES };
-    String[] HEADERS = { MESSAGE_ID, INTERNAL_DATE, BODY_START_OCTET, FULL_CONTENT_OCTETS, BODY_OCTECTS, HEADER_CONTENT, TEXTUAL_LINE_COUNT, PROPERTIES };
-    String[] BODY = { MESSAGE_ID, INTERNAL_DATE, BODY_START_OCTET, FULL_CONTENT_OCTETS, BODY_OCTECTS, BODY_CONTENT, TEXTUAL_LINE_COUNT, PROPERTIES, ATTACHMENTS };
-
-    interface Properties {
-        String NAMESPACE = "namespace";
-        String NAME = "name";
-        String VALUE = "value";
-    }
-
-    interface Attachments {
-        String ID = "id";
-        String NAME = "name";
-        String CID = "cid";
-        String IS_INLINE = "isInline";
-    }
-}

http://git-wip-us.apache.org/repos/asf/james-project/blob/4e0f1310/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerProvider.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerProvider.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerProvider.java
index 8640cf9..3fcbe7f 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerProvider.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerProvider.java
@@ -33,7 +33,6 @@ import org.apache.james.mailbox.cassandra.mail.CassandraMailboxCounterDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMailboxDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMailboxPathDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMailboxRecentsDAO;
-import org.apache.james.mailbox.cassandra.mail.CassandraMessageDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMessageDAOV2;
 import org.apache.james.mailbox.cassandra.mail.CassandraMessageIdDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMessageIdToImapUidDAO;
@@ -59,7 +58,6 @@ public class CassandraMailboxManagerProvider {
         CassandraMessageIdDAO messageIdDAO = new CassandraMessageIdDAO(session, messageIdFactory);
         CassandraMessageIdToImapUidDAO imapUidDAO = new CassandraMessageIdToImapUidDAO(session, messageIdFactory);
         CassandraBlobsDAO blobsDAO = new CassandraBlobsDAO(session);
-        CassandraMessageDAO messageDAO = new CassandraMessageDAO(session, cassandraTypesProvider);
         CassandraMessageDAOV2 messageDAOV2 = new CassandraMessageDAOV2(session, cassandraTypesProvider, blobsDAO);
         CassandraMailboxCounterDAO mailboxCounterDAO = new CassandraMailboxCounterDAO(session);
         CassandraMailboxRecentsDAO mailboxRecentsDAO = new CassandraMailboxRecentsDAO(session);
@@ -72,7 +70,6 @@ public class CassandraMailboxManagerProvider {
         CassandraMailboxSessionMapperFactory mapperFactory = new CassandraMailboxSessionMapperFactory(uidProvider,
             modSeqProvider,
             session,
-            messageDAO,
             messageDAOV2,
             messageIdDAO,
             imapUidDAO,

http://git-wip-us.apache.org/repos/asf/james-project/blob/4e0f1310/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraSubscriptionManagerTest.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraSubscriptionManagerTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraSubscriptionManagerTest.java
index c2c89bf..c945204 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraSubscriptionManagerTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraSubscriptionManagerTest.java
@@ -23,14 +23,13 @@ import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.init.CassandraModuleComposite;
 import org.apache.james.mailbox.AbstractSubscriptionManagerTest;
 import org.apache.james.mailbox.SubscriptionManager;
+import org.apache.james.mailbox.cassandra.mail.CassandraApplicableFlagDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraDeletedMessageDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraFirstUnseenDAO;
-import org.apache.james.mailbox.cassandra.mail.CassandraApplicableFlagDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMailboxCounterDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMailboxDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMailboxPathDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMailboxRecentsDAO;
-import org.apache.james.mailbox.cassandra.mail.CassandraMessageDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMessageDAOV2;
 import org.apache.james.mailbox.cassandra.mail.CassandraMessageIdDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMessageIdToImapUidDAO;
@@ -68,7 +67,6 @@ public class CassandraSubscriptionManagerTest extends AbstractSubscriptionManage
     @Override
     public SubscriptionManager createSubscriptionManager() {
         CassandraMessageIdToImapUidDAO imapUidDAO = null;
-        CassandraMessageDAO messageDAO = null;
         CassandraMessageDAOV2 messageDAOV2 = null;
         CassandraMessageIdDAO messageIdDAO = null;
         CassandraMailboxCounterDAO mailboxCounterDAO = null;
@@ -83,7 +81,6 @@ public class CassandraSubscriptionManagerTest extends AbstractSubscriptionManage
                 new CassandraUidProvider(cassandra.getConf()),
                 new CassandraModSeqProvider(cassandra.getConf()),
                 cassandra.getConf(),
-                messageDAO,
                 messageDAOV2,
                 messageIdDAO,
                 imapUidDAO,

http://git-wip-us.apache.org/repos/asf/james-project/blob/4e0f1310/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraTestSystemFixture.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraTestSystemFixture.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraTestSystemFixture.java
index 8e1a5bd..24895ed 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraTestSystemFixture.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraTestSystemFixture.java
@@ -24,15 +24,14 @@ import static org.mockito.Mockito.mock;
 import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.init.CassandraModuleComposite;
 import org.apache.james.mailbox.cassandra.ids.CassandraMessageId;
+import org.apache.james.mailbox.cassandra.mail.CassandraApplicableFlagDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraBlobsDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraDeletedMessageDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraFirstUnseenDAO;
-import org.apache.james.mailbox.cassandra.mail.CassandraApplicableFlagDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMailboxCounterDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMailboxDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMailboxPathDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMailboxRecentsDAO;
-import org.apache.james.mailbox.cassandra.mail.CassandraMessageDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMessageDAOV2;
 import org.apache.james.mailbox.cassandra.mail.CassandraMessageIdDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMessageIdToImapUidDAO;
@@ -93,7 +92,6 @@ public class CassandraTestSystemFixture {
         CassandraMessageIdDAO messageIdDAO = new CassandraMessageIdDAO(cassandra.getConf(), messageIdFactory);
         CassandraMessageIdToImapUidDAO imapUidDAO = new CassandraMessageIdToImapUidDAO(cassandra.getConf(), messageIdFactory);
         CassandraBlobsDAO blobsDAO = new CassandraBlobsDAO(cassandra.getConf());
-        CassandraMessageDAO messageDAO = new CassandraMessageDAO(cassandra.getConf(), cassandra.getTypesProvider());
         CassandraMessageDAOV2 messageDAOV2 = new CassandraMessageDAOV2(cassandra.getConf(), cassandra.getTypesProvider(), blobsDAO);
         CassandraMailboxCounterDAO mailboxCounterDAO = new CassandraMailboxCounterDAO(cassandra.getConf());
         CassandraMailboxRecentsDAO mailboxRecentsDAO = new CassandraMailboxRecentsDAO(cassandra.getConf());
@@ -106,7 +104,6 @@ public class CassandraTestSystemFixture {
         return new CassandraMailboxSessionMapperFactory(uidProvider,
             modSeqProvider,
             cassandra.getConf(),
-            messageDAO,
             messageDAOV2,
             messageIdDAO,
             imapUidDAO,

http://git-wip-us.apache.org/repos/asf/james-project/blob/4e0f1310/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxManagerAttachmentTest.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxManagerAttachmentTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxManagerAttachmentTest.java
index a14ab52..9bfe467 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxManagerAttachmentTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxManagerAttachmentTest.java
@@ -89,14 +89,12 @@ public class CassandraMailboxManagerAttachmentTest extends AbstractMailboxManage
         CassandraDeletedMessageDAO deletedMessageDAO = new CassandraDeletedMessageDAO(cassandra.getConf());
 
         CassandraBlobsDAO blobsDAO = new CassandraBlobsDAO(cassandra.getConf());
-        CassandraMessageDAO messageDAO = new CassandraMessageDAO(cassandra.getConf(), cassandra.getTypesProvider());
         CassandraMessageDAOV2 messageDAOV2 = new CassandraMessageDAOV2(cassandra.getConf(), cassandra.getTypesProvider(), blobsDAO);
         mailboxSessionMapperFactory = new CassandraMailboxSessionMapperFactory(
                 new CassandraUidProvider(cassandra.getConf()),
                 new CassandraModSeqProvider(cassandra.getConf()),
                 cassandra.getConf(),
-                messageDAO,
-                messageDAOV2,
+            messageDAOV2,
                 new CassandraMessageIdDAO(cassandra.getConf(), messageIdFactory),
                 new CassandraMessageIdToImapUidDAO(cassandra.getConf(), messageIdFactory),
                 new CassandraMailboxCounterDAO(cassandra.getConf()),

http://git-wip-us.apache.org/repos/asf/james-project/blob/4e0f1310/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMapperProvider.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMapperProvider.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMapperProvider.java
index b600bab..1d1f9c9 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMapperProvider.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMapperProvider.java
@@ -24,8 +24,8 @@ import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.init.CassandraModuleComposite;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageUid;
-import org.apache.james.mailbox.cassandra.ids.CassandraId;
 import org.apache.james.mailbox.cassandra.CassandraMailboxSessionMapperFactory;
+import org.apache.james.mailbox.cassandra.ids.CassandraId;
 import org.apache.james.mailbox.cassandra.ids.CassandraMessageId;
 import org.apache.james.mailbox.cassandra.ids.CassandraMessageId.Factory;
 import org.apache.james.mailbox.cassandra.modules.CassandraAclModule;
@@ -112,13 +112,11 @@ public class CassandraMapperProvider implements MapperProvider {
         CassandraFirstUnseenDAO firstUnseenDAO = new CassandraFirstUnseenDAO(cassandra.getConf());
         CassandraDeletedMessageDAO deletedMessageDAO = new CassandraDeletedMessageDAO(cassandra.getConf());
         CassandraBlobsDAO blobsDAO = new CassandraBlobsDAO(cassandra.getConf());
-        CassandraMessageDAO messageDAO = new CassandraMessageDAO(cassandra.getConf(), cassandra.getTypesProvider());
         CassandraMessageDAOV2 messageDAOV2 = new CassandraMessageDAOV2(cassandra.getConf(), cassandra.getTypesProvider(), blobsDAO);
         return new CassandraMailboxSessionMapperFactory(
             new CassandraUidProvider(cassandra.getConf()),
             cassandraModSeqProvider,
             cassandra.getConf(),
-            messageDAO,
             messageDAOV2,
             new CassandraMessageIdDAO(cassandra.getConf(), MESSAGE_ID_FACTORY),
             new CassandraMessageIdToImapUidDAO(cassandra.getConf(), MESSAGE_ID_FACTORY),


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[9/9] james-project git commit: JAMES-2111 Restructure migration information in documentation

Posted by bt...@apache.org.
JAMES-2111 Restructure migration information in documentation


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/656de840
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/656de840
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/656de840

Branch: refs/heads/master
Commit: 656de840cc550ce9cf73bd207f2dfc184bcaaf05
Parents: 39847c2
Author: benwa <bt...@linagora.com>
Authored: Fri Aug 18 09:43:53 2017 +0700
Committer: benwa <bt...@linagora.com>
Committed: Tue Aug 22 10:31:08 2017 +0700

----------------------------------------------------------------------
 src/site/xdoc/server/config-cassandra.xml | 45 +++++++++++++++++++++-----
 1 file changed, 37 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/656de840/src/site/xdoc/server/config-cassandra.xml
----------------------------------------------------------------------
diff --git a/src/site/xdoc/server/config-cassandra.xml b/src/site/xdoc/server/config-cassandra.xml
index db5f92c..b8dc965 100644
--- a/src/site/xdoc/server/config-cassandra.xml
+++ b/src/site/xdoc/server/config-cassandra.xml
@@ -113,14 +113,6 @@
         <dd>Optional. Defaults to 100.<br/> Controls the number of messages to be expunged in parallel.</dd>
         <dt><strong>mailbox.blob.part.size</strong></dt>
         <dd>Optional. Defaults to 102400 (100KB).<br/> Controls the size of blob parts used to store messages.</dd>
-        <dt><strong>migration.v1.v2.on.the.fly</strong></dt>
-        <dd>Only available on tag cassandra_migration_v1_to_v2. Optional. Defaults to false.<br/> Controls wether v1 to v2 migration should be run on the fly.</dd>
-        <dt><strong>migration.v1.v2.thread.count</strong></dt>
-        <dd>Only available on tag cassandra_migration_v1_to_v2. Optional. Defaults to 2.<br/> Controls the number of threads used to asynchronously migrate from v1 to v2.</dd>
-        <dt><strong>migration.v1.v2.queue.length</strong></dt>
-        <dd>Only available on tag cassandra_migration_v1_to_v2. Optional. Defaults to 1000.<br/> Controls the queue size of v1 to v2 migration task. Drops when full.</dd>
-        <dt><strong>migration.v1.read.fetch.size</strong></dt>
-        <dd>Only available on tag cassandra_migration_v1_to_v2. Optional. Defaults to 10.<br/> Controls the fetch size of the request to retrieve all messages stored in V1 during the migration process.</dd>
       </dl>
 
 
@@ -142,6 +134,43 @@
     <p>These schema updates can be triggered by <a href="manage-webadmin.html">webadmin</a> using the Cassandra backend.</p>
 
     <p>Note that currently the progress can be tracked by logs.</p>
+
+    Here are the implemented migrations:
+
+    <subsection name="From V1 to V2">
+
+      <p>Migration tag on git repository: <a href="https://github.com/apache/james-project/releases/tag/cassandra_migration_v1_to_v2">cassandra_migration_v1_to_v2</a></p>
+
+      <p>Goal is to create a messageV2 table that aims at replacing message table. Message table is both storing message
+        metadata and blobs. It have been proven inefficient. Instead version 2 is chunking message blobs and storing it
+        in an other table. The migration process involves moving all messages from message table to messageV2 table
+        (contains only metadata) and blobs / blobParts tables.</p>
+
+      <p>Read more about this migration <a href="https://medium.com/p/7e8607eb3c4f">here</a>.</p>
+
+      <p>Summary of available options for this migration:</p>
+
+      <dl>
+        <dt><strong>migration.v1.v2.on.the.fly</strong></dt>
+        <dd>Only available on tag cassandra_migration_v1_to_v2. Optional. Defaults to false.<br/> Controls wether v1 to v2 migration should be run on the fly.</dd>
+        <dt><strong>migration.v1.v2.thread.count</strong></dt>
+        <dd>Only available on tag cassandra_migration_v1_to_v2. Optional. Defaults to 2.<br/> Controls the number of threads used to asynchronously migrate from v1 to v2.</dd>
+        <dt><strong>migration.v1.v2.queue.length</strong></dt>
+        <dd>Only available on tag cassandra_migration_v1_to_v2. Optional. Defaults to 1000.<br/> Controls the queue size of v1 to v2 migration task. Drops when full.</dd>
+        <dt><strong>migration.v1.read.fetch.size</strong></dt>
+        <dd>Only available on tag cassandra_migration_v1_to_v2. Optional. Defaults to 10.<br/> Controls the fetch size of the request to retrieve all messages stored in V1 during the migration process.</dd>
+      </dl>
+
+    </subsection>
+
+    <subsection name="From V2 to V3">
+
+      <p>Migration tag on git repository: <a href="https://github.com/apache/james-project/releases/tag/cassandra_migration_v2_to_v3">cassandra_migration_v2_to_v3</a></p>
+
+      <p>Goal is to drop <b>message</b> table. After this migration, one can manually delete this table.</p>
+
+    </subsection>
+
   </section>
 
 </body>


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[4/9] james-project git commit: JAMES-2111 s/CassandraMessageDAOV2/CassandraMessageDAO/g

Posted by bt...@apache.org.
JAMES-2111 s/CassandraMessageDAOV2/CassandraMessageDAO/g


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/9360cb3a
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/9360cb3a
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/9360cb3a

Branch: refs/heads/master
Commit: 9360cb3a3ad6c0543c036beceb7b608d1f6f637d
Parents: 51a1311
Author: benwa <bt...@linagora.com>
Authored: Tue Aug 15 15:55:56 2017 +0700
Committer: benwa <bt...@linagora.com>
Committed: Tue Aug 22 10:31:07 2017 +0700

----------------------------------------------------------------------
 .../CassandraMailboxSessionMapperFactory.java   |  16 +-
 .../cassandra/mail/CassandraMessageDAO.java     | 398 +++++++++++++++++++
 .../cassandra/mail/CassandraMessageDAOV2.java   | 398 -------------------
 .../mail/CassandraMessageIdMapper.java          |  14 +-
 .../cassandra/mail/CassandraMessageMapper.java  |  20 +-
 .../CassandraMailboxManagerProvider.java        |   6 +-
 .../CassandraSubscriptionManagerTest.java       |   6 +-
 .../cassandra/CassandraTestSystemFixture.java   |   6 +-
 .../CassandraMailboxManagerAttachmentTest.java  |   4 +-
 .../cassandra/mail/CassandraMapperProvider.java |   5 +-
 .../cassandra/mail/CassandraMessageDAOTest.java | 191 +++++++++
 .../mail/CassandraMessageDAOV2Test.java         | 191 ---------
 .../cassandra/host/CassandraHostSystem.java     |   6 +-
 .../modules/mailbox/CassandraMailboxModule.java |   4 +-
 14 files changed, 632 insertions(+), 633 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/9360cb3a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxSessionMapperFactory.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxSessionMapperFactory.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxSessionMapperFactory.java
index e02d5cd..020e6a1 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxSessionMapperFactory.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxSessionMapperFactory.java
@@ -35,7 +35,7 @@ import org.apache.james.mailbox.cassandra.mail.CassandraMailboxDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMailboxMapper;
 import org.apache.james.mailbox.cassandra.mail.CassandraMailboxPathDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMailboxRecentsDAO;
-import org.apache.james.mailbox.cassandra.mail.CassandraMessageDAOV2;
+import org.apache.james.mailbox.cassandra.mail.CassandraMessageDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMessageIdDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMessageIdMapper;
 import org.apache.james.mailbox.cassandra.mail.CassandraMessageIdToImapUidDAO;
@@ -63,7 +63,7 @@ public class CassandraMailboxSessionMapperFactory extends MailboxSessionMapperFa
     private final Session session;
     private final CassandraUidProvider uidProvider;
     private final CassandraModSeqProvider modSeqProvider;
-    private final CassandraMessageDAOV2 messageDAOV2;
+    private final CassandraMessageDAO messageDAO;
     private final CassandraMessageIdDAO messageIdDAO;
     private final CassandraMessageIdToImapUidDAO imapUidDAO;
     private final CassandraMailboxCounterDAO mailboxCounterDAO;
@@ -79,7 +79,7 @@ public class CassandraMailboxSessionMapperFactory extends MailboxSessionMapperFa
 
     @Inject
     public CassandraMailboxSessionMapperFactory(CassandraUidProvider uidProvider, CassandraModSeqProvider modSeqProvider, Session session,
-                                                CassandraMessageDAOV2 messageDAOV2,
+                                                CassandraMessageDAO messageDAO,
                                                 CassandraMessageIdDAO messageIdDAO, CassandraMessageIdToImapUidDAO imapUidDAO,
                                                 CassandraMailboxCounterDAO mailboxCounterDAO, CassandraMailboxRecentsDAO mailboxRecentsDAO, CassandraMailboxDAO mailboxDAO,
                                                 CassandraMailboxPathDAO mailboxPathDAO, CassandraFirstUnseenDAO firstUnseenDAO, CassandraApplicableFlagDAO applicableFlagDAO,
@@ -87,7 +87,7 @@ public class CassandraMailboxSessionMapperFactory extends MailboxSessionMapperFa
         this.uidProvider = uidProvider;
         this.modSeqProvider = modSeqProvider;
         this.session = session;
-        this.messageDAOV2 = messageDAOV2;
+        this.messageDAO = messageDAO;
         this.messageIdDAO = messageIdDAO;
         this.imapUidDAO = imapUidDAO;
         this.mailboxCounterDAO = mailboxCounterDAO;
@@ -111,7 +111,7 @@ public class CassandraMailboxSessionMapperFactory extends MailboxSessionMapperFa
         CassandraUidProvider uidProvider,
         CassandraModSeqProvider modSeqProvider,
         Session session,
-        CassandraMessageDAOV2 messageDAOV2,
+        CassandraMessageDAO messageDAO,
         CassandraMessageIdDAO messageIdDAO,
         CassandraMessageIdToImapUidDAO imapUidDAO,
         CassandraMailboxCounterDAO mailboxCounterDAO,
@@ -122,7 +122,7 @@ public class CassandraMailboxSessionMapperFactory extends MailboxSessionMapperFa
         CassandraApplicableFlagDAO applicableFlagDAO,
         CassandraDeletedMessageDAO deletedMesageDAO) {
 
-        this(uidProvider, modSeqProvider, session, messageDAOV2, messageIdDAO, imapUidDAO, mailboxCounterDAO,
+        this(uidProvider, modSeqProvider, session, messageDAO, messageIdDAO, imapUidDAO, mailboxCounterDAO,
             mailboxRecentsDAO, mailboxDAO, mailboxPathDAO, firstUnseenDAO, applicableFlagDAO, deletedMesageDAO,
             CassandraUtils.WITH_DEFAULT_CONFIGURATION, CassandraConfiguration.DEFAULT_CONFIGURATION);
     }
@@ -134,7 +134,7 @@ public class CassandraMailboxSessionMapperFactory extends MailboxSessionMapperFa
                                           modSeqProvider,
                                           null,
                                           (CassandraAttachmentMapper) createAttachmentMapper(mailboxSession),
-                                          messageDAOV2,
+            messageDAO,
                                           messageIdDAO,
                                           imapUidDAO,
                                           mailboxCounterDAO,
@@ -150,7 +150,7 @@ public class CassandraMailboxSessionMapperFactory extends MailboxSessionMapperFa
     public MessageIdMapper createMessageIdMapper(MailboxSession mailboxSession) throws MailboxException {
         return new CassandraMessageIdMapper(getMailboxMapper(mailboxSession), mailboxDAO,
                 (CassandraAttachmentMapper) getAttachmentMapper(mailboxSession),
-                imapUidDAO, messageIdDAO, messageDAOV2, indexTableHandler, modSeqProvider, mailboxSession,
+                imapUidDAO, messageIdDAO, messageDAO, indexTableHandler, modSeqProvider, mailboxSession,
                 cassandraConfiguration);
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/9360cb3a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAO.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAO.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAO.java
new file mode 100644
index 0000000..5129f3b
--- /dev/null
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAO.java
@@ -0,0 +1,398 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.mailbox.cassandra.mail;
+
+import static com.datastax.driver.core.querybuilder.QueryBuilder.bindMarker;
+import static com.datastax.driver.core.querybuilder.QueryBuilder.eq;
+import static com.datastax.driver.core.querybuilder.QueryBuilder.insertInto;
+import static com.datastax.driver.core.querybuilder.QueryBuilder.select;
+import static org.apache.james.mailbox.cassandra.table.CassandraMessageIds.MESSAGE_ID;
+import static org.apache.james.mailbox.cassandra.table.CassandraMessageV2Table.ATTACHMENTS;
+import static org.apache.james.mailbox.cassandra.table.CassandraMessageV2Table.BODY;
+import static org.apache.james.mailbox.cassandra.table.CassandraMessageV2Table.BODY_CONTENT;
+import static org.apache.james.mailbox.cassandra.table.CassandraMessageV2Table.BODY_OCTECTS;
+import static org.apache.james.mailbox.cassandra.table.CassandraMessageV2Table.BODY_START_OCTET;
+import static org.apache.james.mailbox.cassandra.table.CassandraMessageV2Table.FIELDS;
+import static org.apache.james.mailbox.cassandra.table.CassandraMessageV2Table.FULL_CONTENT_OCTETS;
+import static org.apache.james.mailbox.cassandra.table.CassandraMessageV2Table.HEADERS;
+import static org.apache.james.mailbox.cassandra.table.CassandraMessageV2Table.HEADER_CONTENT;
+import static org.apache.james.mailbox.cassandra.table.CassandraMessageV2Table.INTERNAL_DATE;
+import static org.apache.james.mailbox.cassandra.table.CassandraMessageV2Table.METADATA;
+import static org.apache.james.mailbox.cassandra.table.CassandraMessageV2Table.PROPERTIES;
+import static org.apache.james.mailbox.cassandra.table.CassandraMessageV2Table.TABLE_NAME;
+import static org.apache.james.mailbox.cassandra.table.CassandraMessageV2Table.TEXTUAL_LINE_COUNT;
+
+import java.io.IOException;
+import java.util.Collection;
+import java.util.List;
+import java.util.Optional;
+import java.util.concurrent.CompletableFuture;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import javax.inject.Inject;
+import javax.mail.util.SharedByteArrayInputStream;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang3.tuple.Pair;
+import org.apache.james.backends.cassandra.CassandraConfiguration;
+import org.apache.james.backends.cassandra.init.CassandraTypesProvider;
+import org.apache.james.backends.cassandra.utils.CassandraAsyncExecutor;
+import org.apache.james.mailbox.cassandra.ids.BlobId;
+import org.apache.james.mailbox.cassandra.ids.CassandraMessageId;
+import org.apache.james.mailbox.cassandra.mail.utils.Limit;
+import org.apache.james.mailbox.cassandra.table.CassandraMessageV2Table;
+import org.apache.james.mailbox.cassandra.table.CassandraMessageV2Table.Attachments;
+import org.apache.james.mailbox.cassandra.table.CassandraMessageV2Table.Properties;
+import org.apache.james.mailbox.exception.MailboxException;
+import org.apache.james.mailbox.model.AttachmentId;
+import org.apache.james.mailbox.model.Cid;
+import org.apache.james.mailbox.model.ComposedMessageId;
+import org.apache.james.mailbox.model.ComposedMessageIdWithMetaData;
+import org.apache.james.mailbox.model.MessageAttachment;
+import org.apache.james.mailbox.store.mail.MessageMapper.FetchType;
+import org.apache.james.mailbox.store.mail.model.MailboxMessage;
+import org.apache.james.mailbox.store.mail.model.Property;
+import org.apache.james.mailbox.store.mail.model.impl.PropertyBuilder;
+import org.apache.james.mailbox.store.mail.model.impl.SimpleProperty;
+import org.apache.james.util.CompletableFutureUtil;
+import org.apache.james.util.FluentFutureStream;
+import org.apache.james.util.OptionalConverter;
+import org.apache.james.util.streams.JamesCollectors;
+
+import com.datastax.driver.core.BoundStatement;
+import com.datastax.driver.core.PreparedStatement;
+import com.datastax.driver.core.ResultSet;
+import com.datastax.driver.core.Row;
+import com.datastax.driver.core.Session;
+import com.datastax.driver.core.UDTValue;
+import com.datastax.driver.core.querybuilder.QueryBuilder;
+import com.github.steveash.guavate.Guavate;
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.collect.ImmutableList;
+import com.google.common.primitives.Bytes;
+
+public class CassandraMessageDAO {
+    public static final long DEFAULT_LONG_VALUE = 0L;
+    public static final String DEFAULT_OBJECT_VALUE = null;
+    private static final byte[] EMPTY_BYTE_ARRAY = {};
+
+    private final CassandraAsyncExecutor cassandraAsyncExecutor;
+    private final CassandraTypesProvider typesProvider;
+    private final CassandraBlobsDAO blobsDAO;
+    private final CassandraConfiguration configuration;
+    private final PreparedStatement insert;
+    private final PreparedStatement delete;
+    private final PreparedStatement selectMetadata;
+    private final PreparedStatement selectHeaders;
+    private final PreparedStatement selectFields;
+    private final PreparedStatement selectBody;
+    private final Cid.CidParser cidParser;
+
+    @Inject
+    public CassandraMessageDAO(Session session, CassandraTypesProvider typesProvider, CassandraBlobsDAO blobsDAO, CassandraConfiguration cassandraConfiguration) {
+        this.cassandraAsyncExecutor = new CassandraAsyncExecutor(session);
+        this.typesProvider = typesProvider;
+        this.blobsDAO = blobsDAO;
+        this.configuration = cassandraConfiguration;
+        this.insert = prepareInsert(session);
+        this.delete = prepareDelete(session);
+        this.selectMetadata = prepareSelect(session, METADATA);
+        this.selectHeaders = prepareSelect(session, HEADERS);
+        this.selectFields = prepareSelect(session, FIELDS);
+        this.selectBody = prepareSelect(session, BODY);
+        this.cidParser = Cid.parser().relaxed();
+    }
+
+    @VisibleForTesting
+    public CassandraMessageDAO(Session session, CassandraTypesProvider typesProvider, CassandraBlobsDAO blobsDAO) {
+        this(session, typesProvider, blobsDAO, CassandraConfiguration.DEFAULT_CONFIGURATION);
+    }
+
+    private PreparedStatement prepareSelect(Session session, String[] fields) {
+        return session.prepare(select(fields)
+            .from(TABLE_NAME)
+            .where(eq(MESSAGE_ID, bindMarker(MESSAGE_ID))));
+    }
+
+    private PreparedStatement prepareInsert(Session session) {
+        return session.prepare(insertInto(TABLE_NAME)
+            .value(MESSAGE_ID, bindMarker(MESSAGE_ID))
+            .value(INTERNAL_DATE, bindMarker(INTERNAL_DATE))
+            .value(BODY_START_OCTET, bindMarker(BODY_START_OCTET))
+            .value(FULL_CONTENT_OCTETS, bindMarker(FULL_CONTENT_OCTETS))
+            .value(BODY_OCTECTS, bindMarker(BODY_OCTECTS))
+            .value(BODY_CONTENT, bindMarker(BODY_CONTENT))
+            .value(HEADER_CONTENT, bindMarker(HEADER_CONTENT))
+            .value(PROPERTIES, bindMarker(PROPERTIES))
+            .value(TEXTUAL_LINE_COUNT, bindMarker(TEXTUAL_LINE_COUNT))
+            .value(ATTACHMENTS, bindMarker(ATTACHMENTS)));
+    }
+
+    private PreparedStatement prepareDelete(Session session) {
+        return session.prepare(QueryBuilder.delete()
+            .from(TABLE_NAME)
+            .where(eq(MESSAGE_ID, bindMarker(MESSAGE_ID))));
+    }
+
+    public CompletableFuture<Void> save(MailboxMessage message) throws MailboxException {
+        return saveContent(message).thenCompose(pair ->
+            cassandraAsyncExecutor.executeVoid(boundWriteStatement(message, pair)));
+    }
+
+    private CompletableFuture<Pair<Optional<BlobId>, Optional<BlobId>>> saveContent(MailboxMessage message) throws MailboxException {
+        try {
+            return CompletableFutureUtil.combine(
+                blobsDAO.save(
+                    IOUtils.toByteArray(
+                        message.getHeaderContent())),
+                blobsDAO.save(
+                    IOUtils.toByteArray(
+                        message.getBodyContent())),
+                Pair::of);
+        } catch (IOException e) {
+            throw new MailboxException("Error saving mail content", e);
+        }
+    }
+
+    private BoundStatement boundWriteStatement(MailboxMessage message, Pair<Optional<BlobId>, Optional<BlobId>> pair) {
+        CassandraMessageId messageId = (CassandraMessageId) message.getMessageId();
+        return insert.bind()
+            .setUUID(MESSAGE_ID, messageId.get())
+            .setTimestamp(INTERNAL_DATE, message.getInternalDate())
+            .setInt(BODY_START_OCTET, (int) (message.getHeaderOctets()))
+            .setLong(FULL_CONTENT_OCTETS, message.getFullContentOctets())
+            .setLong(BODY_OCTECTS, message.getBodyOctets())
+            .setString(BODY_CONTENT, pair.getRight().map(BlobId::getId).orElse(DEFAULT_OBJECT_VALUE))
+            .setString(HEADER_CONTENT, pair.getLeft().map(BlobId::getId).orElse(DEFAULT_OBJECT_VALUE))
+            .setLong(TEXTUAL_LINE_COUNT, Optional.ofNullable(message.getTextualLineCount()).orElse(DEFAULT_LONG_VALUE))
+            .setList(PROPERTIES, buildPropertiesUdt(message))
+            .setList(ATTACHMENTS, buildAttachmentUdt(message));
+    }
+
+    private ImmutableList<UDTValue> buildAttachmentUdt(MailboxMessage message) {
+        return message.getAttachments().stream()
+            .map(this::toUDT)
+            .collect(Guavate.toImmutableList());
+    }
+
+    private List<UDTValue> buildPropertiesUdt(List<Property> properties) {
+        return properties.stream()
+            .map(property -> typesProvider.getDefinedUserType(PROPERTIES)
+                .newValue()
+                .setString(Properties.NAMESPACE, property.getNamespace())
+                .setString(Properties.NAME, property.getLocalName())
+                .setString(Properties.VALUE, property.getValue()))
+            .collect(Guavate.toImmutableList());
+    }
+
+    private UDTValue toUDT(MessageAttachment messageAttachment) {
+        return typesProvider.getDefinedUserType(ATTACHMENTS)
+            .newValue()
+            .setString(Attachments.ID, messageAttachment.getAttachmentId().getId())
+            .setString(Attachments.NAME, messageAttachment.getName().orNull())
+            .setString(Attachments.CID, messageAttachment.getCid().transform(Cid::getValue).orNull())
+            .setBool(Attachments.IS_INLINE, messageAttachment.isInline());
+    }
+
+    private List<UDTValue> buildPropertiesUdt(MailboxMessage message) {
+        return message.getProperties().stream()
+            .map(x -> typesProvider.getDefinedUserType(PROPERTIES)
+                .newValue()
+                .setString(Properties.NAMESPACE, x.getNamespace())
+                .setString(Properties.NAME, x.getLocalName())
+                .setString(Properties.VALUE, x.getValue()))
+            .collect(Guavate.toImmutableList());
+    }
+
+    public CompletableFuture<Stream<MessageResult>> retrieveMessages(List<ComposedMessageIdWithMetaData> messageIds, FetchType fetchType, Limit limit) {
+        return CompletableFutureUtil.chainAll(
+                limit.applyOnStream(messageIds.stream().distinct())
+                    .collect(JamesCollectors.chunker(configuration.getMessageReadChunkSize())),
+            ids -> rowToMessages(fetchType, ids))
+            .thenApply(stream -> stream.flatMap(Function.identity()));
+    }
+
+    private CompletableFuture<Stream<MessageResult>> rowToMessages(FetchType fetchType, Collection<ComposedMessageIdWithMetaData> ids) {
+        return FluentFutureStream.of(
+            ids.stream()
+                .map(id -> retrieveRow(id, fetchType)
+                    .thenCompose((ResultSet resultSet) -> message(resultSet, id, fetchType))))
+            .completableFuture();
+    }
+
+    private CompletableFuture<ResultSet> retrieveRow(ComposedMessageIdWithMetaData messageId, FetchType fetchType) {
+        CassandraMessageId cassandraMessageId = (CassandraMessageId) messageId.getComposedMessageId().getMessageId();
+
+        return cassandraAsyncExecutor.execute(retrieveSelect(fetchType)
+            .bind()
+            .setUUID(MESSAGE_ID, cassandraMessageId.get()));
+    }
+
+    private CompletableFuture<MessageResult>
+    message(ResultSet rows,ComposedMessageIdWithMetaData messageIdWithMetaData, FetchType fetchType) {
+        ComposedMessageId messageId = messageIdWithMetaData.getComposedMessageId();
+
+        if (rows.isExhausted()) {
+            return CompletableFuture.completedFuture(notFound(messageIdWithMetaData));
+        }
+
+        Row row = rows.one();
+        CompletableFuture<byte[]> contentFuture = buildContentRetriever(fetchType).apply(row);
+
+        return contentFuture.thenApply(content -> {
+            MessageWithoutAttachment messageWithoutAttachment =
+                new MessageWithoutAttachment(
+                    messageId.getMessageId(),
+                    row.getTimestamp(INTERNAL_DATE),
+                    row.getLong(FULL_CONTENT_OCTETS),
+                    row.getInt(BODY_START_OCTET),
+                    new SharedByteArrayInputStream(content),
+                    messageIdWithMetaData.getFlags(),
+                    getPropertyBuilder(row),
+                    messageId.getMailboxId(),
+                    messageId.getUid(),
+                    messageIdWithMetaData.getModSeq());
+            return found(Pair.of(messageWithoutAttachment, getAttachments(row, fetchType)));
+        });
+    }
+
+    private PropertyBuilder getPropertyBuilder(Row row) {
+        PropertyBuilder property = new PropertyBuilder(
+            row.getList(PROPERTIES, UDTValue.class).stream()
+                .map(x -> new SimpleProperty(x.getString(Properties.NAMESPACE), x.getString(Properties.NAME), x.getString(Properties.VALUE)))
+                .collect(Collectors.toList()));
+        property.setTextualLineCount(row.getLong(TEXTUAL_LINE_COUNT));
+        return property;
+    }
+
+    private Stream<MessageAttachmentRepresentation> getAttachments(Row row, FetchType fetchType) {
+        switch (fetchType) {
+            case Full:
+            case Body:
+                List<UDTValue> udtValues = row.getList(ATTACHMENTS, UDTValue.class);
+
+                return attachmentByIds(udtValues);
+            default:
+                return Stream.of();
+        }
+    }
+
+    private Stream<MessageAttachmentRepresentation> attachmentByIds(List<UDTValue> udtValues) {
+        return udtValues.stream()
+            .map(this::messageAttachmentByIdFrom);
+    }
+
+    private MessageAttachmentRepresentation messageAttachmentByIdFrom(UDTValue udtValue) {
+        return MessageAttachmentRepresentation.builder()
+            .attachmentId(AttachmentId.from(udtValue.getString(Attachments.ID)))
+            .name(udtValue.getString(Attachments.NAME))
+            .cid(OptionalConverter.fromGuava(
+                cidParser.parse(udtValue.getString(CassandraMessageV2Table.Attachments.CID))))
+            .isInline(udtValue.getBool(Attachments.IS_INLINE))
+            .build();
+    }
+
+    private PreparedStatement retrieveSelect(FetchType fetchType) {
+        switch (fetchType) {
+            case Body:
+                return selectBody;
+            case Full:
+                return selectFields;
+            case Headers:
+                return selectHeaders;
+            case Metadata:
+                return selectMetadata;
+            default:
+                throw new RuntimeException("Unknown FetchType " + fetchType);
+        }
+    }
+
+    public CompletableFuture<Void> delete(CassandraMessageId messageId) {
+        return cassandraAsyncExecutor.executeVoid(delete.bind()
+            .setUUID(MESSAGE_ID, messageId.get()));
+    }
+
+    private Function<Row, CompletableFuture<byte[]>> buildContentRetriever(FetchType fetchType) {
+        switch (fetchType) {
+            case Full:
+                return this::getFullContent;
+            case Headers:
+                return this::getHeaderContent;
+            case Body:
+                return row -> getBodyContent(row)
+                    .thenApply(data -> Bytes.concat(new byte[row.getInt(BODY_START_OCTET)], data));
+            case Metadata:
+                return row -> CompletableFuture.completedFuture(EMPTY_BYTE_ARRAY);
+            default:
+                throw new RuntimeException("Unknown FetchType " + fetchType);
+        }
+    }
+
+    private CompletableFuture<byte[]> getFullContent(Row row) {
+        return CompletableFutureUtil.combine(
+            getHeaderContent(row),
+            getBodyContent(row),
+            Bytes::concat);
+    }
+
+    private CompletableFuture<byte[]> getBodyContent(Row row) {
+        return getFieldContent(BODY_CONTENT, row);
+    }
+
+    private CompletableFuture<byte[]> getHeaderContent(Row row) {
+        return getFieldContent(HEADER_CONTENT, row);
+    }
+
+    private CompletableFuture<byte[]> getFieldContent(String field, Row row) {
+        return blobsDAO.read(BlobId.from(row.getString(field)));
+    }
+
+    public static MessageResult notFound(ComposedMessageIdWithMetaData id) {
+        return new MessageResult(id, Optional.empty());
+    }
+
+    public static MessageResult found(Pair<MessageWithoutAttachment, Stream<MessageAttachmentRepresentation>> message) {
+        return new MessageResult(message.getLeft().getMetadata(), Optional.of(message));
+    }
+
+    public static class MessageResult {
+        private final ComposedMessageIdWithMetaData metaData;
+        private final Optional<Pair<MessageWithoutAttachment, Stream<MessageAttachmentRepresentation>>> message;
+
+        public MessageResult(ComposedMessageIdWithMetaData metaData, Optional<Pair<MessageWithoutAttachment, Stream<MessageAttachmentRepresentation>>> message) {
+            this.metaData = metaData;
+            this.message = message;
+        }
+
+        public ComposedMessageIdWithMetaData getMetadata() {
+            return metaData;
+        }
+
+        public boolean isFound() {
+            return message.isPresent();
+        }
+
+        public Pair<MessageWithoutAttachment, Stream<MessageAttachmentRepresentation>> message() {
+            return message.get();
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/9360cb3a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOV2.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOV2.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOV2.java
deleted file mode 100644
index ae86d59..0000000
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOV2.java
+++ /dev/null
@@ -1,398 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one   *
- * or more contributor license agreements.  See the NOTICE file *
- * distributed with this work for additional information        *
- * regarding copyright ownership.  The ASF licenses this file   *
- * to you under the Apache License, Version 2.0 (the            *
- * "License"); you may not use this file except in compliance   *
- * with the License.  You may obtain a copy of the License at   *
- *                                                              *
- *   http://www.apache.org/licenses/LICENSE-2.0                 *
- *                                                              *
- * Unless required by applicable law or agreed to in writing,   *
- * software distributed under the License is distributed on an  *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
- * KIND, either express or implied.  See the License for the    *
- * specific language governing permissions and limitations      *
- * under the License.                                           *
- ****************************************************************/
-
-package org.apache.james.mailbox.cassandra.mail;
-
-import static com.datastax.driver.core.querybuilder.QueryBuilder.bindMarker;
-import static com.datastax.driver.core.querybuilder.QueryBuilder.eq;
-import static com.datastax.driver.core.querybuilder.QueryBuilder.insertInto;
-import static com.datastax.driver.core.querybuilder.QueryBuilder.select;
-import static org.apache.james.mailbox.cassandra.table.CassandraMessageIds.MESSAGE_ID;
-import static org.apache.james.mailbox.cassandra.table.CassandraMessageV2Table.ATTACHMENTS;
-import static org.apache.james.mailbox.cassandra.table.CassandraMessageV2Table.BODY;
-import static org.apache.james.mailbox.cassandra.table.CassandraMessageV2Table.BODY_CONTENT;
-import static org.apache.james.mailbox.cassandra.table.CassandraMessageV2Table.BODY_OCTECTS;
-import static org.apache.james.mailbox.cassandra.table.CassandraMessageV2Table.BODY_START_OCTET;
-import static org.apache.james.mailbox.cassandra.table.CassandraMessageV2Table.FIELDS;
-import static org.apache.james.mailbox.cassandra.table.CassandraMessageV2Table.FULL_CONTENT_OCTETS;
-import static org.apache.james.mailbox.cassandra.table.CassandraMessageV2Table.HEADERS;
-import static org.apache.james.mailbox.cassandra.table.CassandraMessageV2Table.HEADER_CONTENT;
-import static org.apache.james.mailbox.cassandra.table.CassandraMessageV2Table.INTERNAL_DATE;
-import static org.apache.james.mailbox.cassandra.table.CassandraMessageV2Table.METADATA;
-import static org.apache.james.mailbox.cassandra.table.CassandraMessageV2Table.PROPERTIES;
-import static org.apache.james.mailbox.cassandra.table.CassandraMessageV2Table.TABLE_NAME;
-import static org.apache.james.mailbox.cassandra.table.CassandraMessageV2Table.TEXTUAL_LINE_COUNT;
-
-import java.io.IOException;
-import java.util.Collection;
-import java.util.List;
-import java.util.Optional;
-import java.util.concurrent.CompletableFuture;
-import java.util.function.Function;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-
-import javax.inject.Inject;
-import javax.mail.util.SharedByteArrayInputStream;
-
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang3.tuple.Pair;
-import org.apache.james.backends.cassandra.CassandraConfiguration;
-import org.apache.james.backends.cassandra.init.CassandraTypesProvider;
-import org.apache.james.backends.cassandra.utils.CassandraAsyncExecutor;
-import org.apache.james.mailbox.cassandra.ids.BlobId;
-import org.apache.james.mailbox.cassandra.ids.CassandraMessageId;
-import org.apache.james.mailbox.cassandra.mail.utils.Limit;
-import org.apache.james.mailbox.cassandra.table.CassandraMessageV2Table;
-import org.apache.james.mailbox.cassandra.table.CassandraMessageV2Table.Attachments;
-import org.apache.james.mailbox.cassandra.table.CassandraMessageV2Table.Properties;
-import org.apache.james.mailbox.exception.MailboxException;
-import org.apache.james.mailbox.model.AttachmentId;
-import org.apache.james.mailbox.model.Cid;
-import org.apache.james.mailbox.model.ComposedMessageId;
-import org.apache.james.mailbox.model.ComposedMessageIdWithMetaData;
-import org.apache.james.mailbox.model.MessageAttachment;
-import org.apache.james.mailbox.store.mail.MessageMapper.FetchType;
-import org.apache.james.mailbox.store.mail.model.MailboxMessage;
-import org.apache.james.mailbox.store.mail.model.Property;
-import org.apache.james.mailbox.store.mail.model.impl.PropertyBuilder;
-import org.apache.james.mailbox.store.mail.model.impl.SimpleProperty;
-import org.apache.james.util.CompletableFutureUtil;
-import org.apache.james.util.FluentFutureStream;
-import org.apache.james.util.OptionalConverter;
-import org.apache.james.util.streams.JamesCollectors;
-
-import com.datastax.driver.core.BoundStatement;
-import com.datastax.driver.core.PreparedStatement;
-import com.datastax.driver.core.ResultSet;
-import com.datastax.driver.core.Row;
-import com.datastax.driver.core.Session;
-import com.datastax.driver.core.UDTValue;
-import com.datastax.driver.core.querybuilder.QueryBuilder;
-import com.github.steveash.guavate.Guavate;
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.collect.ImmutableList;
-import com.google.common.primitives.Bytes;
-
-public class CassandraMessageDAOV2 {
-    public static final long DEFAULT_LONG_VALUE = 0L;
-    public static final String DEFAULT_OBJECT_VALUE = null;
-    private static final byte[] EMPTY_BYTE_ARRAY = {};
-
-    private final CassandraAsyncExecutor cassandraAsyncExecutor;
-    private final CassandraTypesProvider typesProvider;
-    private final CassandraBlobsDAO blobsDAO;
-    private final CassandraConfiguration configuration;
-    private final PreparedStatement insert;
-    private final PreparedStatement delete;
-    private final PreparedStatement selectMetadata;
-    private final PreparedStatement selectHeaders;
-    private final PreparedStatement selectFields;
-    private final PreparedStatement selectBody;
-    private final Cid.CidParser cidParser;
-
-    @Inject
-    public CassandraMessageDAOV2(Session session, CassandraTypesProvider typesProvider, CassandraBlobsDAO blobsDAO, CassandraConfiguration cassandraConfiguration) {
-        this.cassandraAsyncExecutor = new CassandraAsyncExecutor(session);
-        this.typesProvider = typesProvider;
-        this.blobsDAO = blobsDAO;
-        this.configuration = cassandraConfiguration;
-        this.insert = prepareInsert(session);
-        this.delete = prepareDelete(session);
-        this.selectMetadata = prepareSelect(session, METADATA);
-        this.selectHeaders = prepareSelect(session, HEADERS);
-        this.selectFields = prepareSelect(session, FIELDS);
-        this.selectBody = prepareSelect(session, BODY);
-        this.cidParser = Cid.parser().relaxed();
-    }
-
-    @VisibleForTesting
-    public CassandraMessageDAOV2(Session session, CassandraTypesProvider typesProvider, CassandraBlobsDAO blobsDAO) {
-        this(session, typesProvider, blobsDAO, CassandraConfiguration.DEFAULT_CONFIGURATION);
-    }
-
-    private PreparedStatement prepareSelect(Session session, String[] fields) {
-        return session.prepare(select(fields)
-            .from(TABLE_NAME)
-            .where(eq(MESSAGE_ID, bindMarker(MESSAGE_ID))));
-    }
-
-    private PreparedStatement prepareInsert(Session session) {
-        return session.prepare(insertInto(TABLE_NAME)
-            .value(MESSAGE_ID, bindMarker(MESSAGE_ID))
-            .value(INTERNAL_DATE, bindMarker(INTERNAL_DATE))
-            .value(BODY_START_OCTET, bindMarker(BODY_START_OCTET))
-            .value(FULL_CONTENT_OCTETS, bindMarker(FULL_CONTENT_OCTETS))
-            .value(BODY_OCTECTS, bindMarker(BODY_OCTECTS))
-            .value(BODY_CONTENT, bindMarker(BODY_CONTENT))
-            .value(HEADER_CONTENT, bindMarker(HEADER_CONTENT))
-            .value(PROPERTIES, bindMarker(PROPERTIES))
-            .value(TEXTUAL_LINE_COUNT, bindMarker(TEXTUAL_LINE_COUNT))
-            .value(ATTACHMENTS, bindMarker(ATTACHMENTS)));
-    }
-
-    private PreparedStatement prepareDelete(Session session) {
-        return session.prepare(QueryBuilder.delete()
-            .from(TABLE_NAME)
-            .where(eq(MESSAGE_ID, bindMarker(MESSAGE_ID))));
-    }
-
-    public CompletableFuture<Void> save(MailboxMessage message) throws MailboxException {
-        return saveContent(message).thenCompose(pair ->
-            cassandraAsyncExecutor.executeVoid(boundWriteStatement(message, pair)));
-    }
-
-    private CompletableFuture<Pair<Optional<BlobId>, Optional<BlobId>>> saveContent(MailboxMessage message) throws MailboxException {
-        try {
-            return CompletableFutureUtil.combine(
-                blobsDAO.save(
-                    IOUtils.toByteArray(
-                        message.getHeaderContent())),
-                blobsDAO.save(
-                    IOUtils.toByteArray(
-                        message.getBodyContent())),
-                Pair::of);
-        } catch (IOException e) {
-            throw new MailboxException("Error saving mail content", e);
-        }
-    }
-
-    private BoundStatement boundWriteStatement(MailboxMessage message, Pair<Optional<BlobId>, Optional<BlobId>> pair) {
-        CassandraMessageId messageId = (CassandraMessageId) message.getMessageId();
-        return insert.bind()
-            .setUUID(MESSAGE_ID, messageId.get())
-            .setTimestamp(INTERNAL_DATE, message.getInternalDate())
-            .setInt(BODY_START_OCTET, (int) (message.getHeaderOctets()))
-            .setLong(FULL_CONTENT_OCTETS, message.getFullContentOctets())
-            .setLong(BODY_OCTECTS, message.getBodyOctets())
-            .setString(BODY_CONTENT, pair.getRight().map(BlobId::getId).orElse(DEFAULT_OBJECT_VALUE))
-            .setString(HEADER_CONTENT, pair.getLeft().map(BlobId::getId).orElse(DEFAULT_OBJECT_VALUE))
-            .setLong(TEXTUAL_LINE_COUNT, Optional.ofNullable(message.getTextualLineCount()).orElse(DEFAULT_LONG_VALUE))
-            .setList(PROPERTIES, buildPropertiesUdt(message))
-            .setList(ATTACHMENTS, buildAttachmentUdt(message));
-    }
-
-    private ImmutableList<UDTValue> buildAttachmentUdt(MailboxMessage message) {
-        return message.getAttachments().stream()
-            .map(this::toUDT)
-            .collect(Guavate.toImmutableList());
-    }
-
-    private List<UDTValue> buildPropertiesUdt(List<Property> properties) {
-        return properties.stream()
-            .map(property -> typesProvider.getDefinedUserType(PROPERTIES)
-                .newValue()
-                .setString(Properties.NAMESPACE, property.getNamespace())
-                .setString(Properties.NAME, property.getLocalName())
-                .setString(Properties.VALUE, property.getValue()))
-            .collect(Guavate.toImmutableList());
-    }
-
-    private UDTValue toUDT(MessageAttachment messageAttachment) {
-        return typesProvider.getDefinedUserType(ATTACHMENTS)
-            .newValue()
-            .setString(Attachments.ID, messageAttachment.getAttachmentId().getId())
-            .setString(Attachments.NAME, messageAttachment.getName().orNull())
-            .setString(Attachments.CID, messageAttachment.getCid().transform(Cid::getValue).orNull())
-            .setBool(Attachments.IS_INLINE, messageAttachment.isInline());
-    }
-
-    private List<UDTValue> buildPropertiesUdt(MailboxMessage message) {
-        return message.getProperties().stream()
-            .map(x -> typesProvider.getDefinedUserType(PROPERTIES)
-                .newValue()
-                .setString(Properties.NAMESPACE, x.getNamespace())
-                .setString(Properties.NAME, x.getLocalName())
-                .setString(Properties.VALUE, x.getValue()))
-            .collect(Guavate.toImmutableList());
-    }
-
-    public CompletableFuture<Stream<MessageResult>> retrieveMessages(List<ComposedMessageIdWithMetaData> messageIds, FetchType fetchType, Limit limit) {
-        return CompletableFutureUtil.chainAll(
-                limit.applyOnStream(messageIds.stream().distinct())
-                    .collect(JamesCollectors.chunker(configuration.getMessageReadChunkSize())),
-            ids -> rowToMessages(fetchType, ids))
-            .thenApply(stream -> stream.flatMap(Function.identity()));
-    }
-
-    private CompletableFuture<Stream<MessageResult>> rowToMessages(FetchType fetchType, Collection<ComposedMessageIdWithMetaData> ids) {
-        return FluentFutureStream.of(
-            ids.stream()
-                .map(id -> retrieveRow(id, fetchType)
-                    .thenCompose((ResultSet resultSet) -> message(resultSet, id, fetchType))))
-            .completableFuture();
-    }
-
-    private CompletableFuture<ResultSet> retrieveRow(ComposedMessageIdWithMetaData messageId, FetchType fetchType) {
-        CassandraMessageId cassandraMessageId = (CassandraMessageId) messageId.getComposedMessageId().getMessageId();
-
-        return cassandraAsyncExecutor.execute(retrieveSelect(fetchType)
-            .bind()
-            .setUUID(MESSAGE_ID, cassandraMessageId.get()));
-    }
-
-    private CompletableFuture<MessageResult>
-    message(ResultSet rows,ComposedMessageIdWithMetaData messageIdWithMetaData, FetchType fetchType) {
-        ComposedMessageId messageId = messageIdWithMetaData.getComposedMessageId();
-
-        if (rows.isExhausted()) {
-            return CompletableFuture.completedFuture(notFound(messageIdWithMetaData));
-        }
-
-        Row row = rows.one();
-        CompletableFuture<byte[]> contentFuture = buildContentRetriever(fetchType).apply(row);
-
-        return contentFuture.thenApply(content -> {
-            MessageWithoutAttachment messageWithoutAttachment =
-                new MessageWithoutAttachment(
-                    messageId.getMessageId(),
-                    row.getTimestamp(INTERNAL_DATE),
-                    row.getLong(FULL_CONTENT_OCTETS),
-                    row.getInt(BODY_START_OCTET),
-                    new SharedByteArrayInputStream(content),
-                    messageIdWithMetaData.getFlags(),
-                    getPropertyBuilder(row),
-                    messageId.getMailboxId(),
-                    messageId.getUid(),
-                    messageIdWithMetaData.getModSeq());
-            return found(Pair.of(messageWithoutAttachment, getAttachments(row, fetchType)));
-        });
-    }
-
-    private PropertyBuilder getPropertyBuilder(Row row) {
-        PropertyBuilder property = new PropertyBuilder(
-            row.getList(PROPERTIES, UDTValue.class).stream()
-                .map(x -> new SimpleProperty(x.getString(Properties.NAMESPACE), x.getString(Properties.NAME), x.getString(Properties.VALUE)))
-                .collect(Collectors.toList()));
-        property.setTextualLineCount(row.getLong(TEXTUAL_LINE_COUNT));
-        return property;
-    }
-
-    private Stream<MessageAttachmentRepresentation> getAttachments(Row row, FetchType fetchType) {
-        switch (fetchType) {
-            case Full:
-            case Body:
-                List<UDTValue> udtValues = row.getList(ATTACHMENTS, UDTValue.class);
-
-                return attachmentByIds(udtValues);
-            default:
-                return Stream.of();
-        }
-    }
-
-    private Stream<MessageAttachmentRepresentation> attachmentByIds(List<UDTValue> udtValues) {
-        return udtValues.stream()
-            .map(this::messageAttachmentByIdFrom);
-    }
-
-    private MessageAttachmentRepresentation messageAttachmentByIdFrom(UDTValue udtValue) {
-        return MessageAttachmentRepresentation.builder()
-            .attachmentId(AttachmentId.from(udtValue.getString(Attachments.ID)))
-            .name(udtValue.getString(Attachments.NAME))
-            .cid(OptionalConverter.fromGuava(
-                cidParser.parse(udtValue.getString(CassandraMessageV2Table.Attachments.CID))))
-            .isInline(udtValue.getBool(Attachments.IS_INLINE))
-            .build();
-    }
-
-    private PreparedStatement retrieveSelect(FetchType fetchType) {
-        switch (fetchType) {
-            case Body:
-                return selectBody;
-            case Full:
-                return selectFields;
-            case Headers:
-                return selectHeaders;
-            case Metadata:
-                return selectMetadata;
-            default:
-                throw new RuntimeException("Unknown FetchType " + fetchType);
-        }
-    }
-
-    public CompletableFuture<Void> delete(CassandraMessageId messageId) {
-        return cassandraAsyncExecutor.executeVoid(delete.bind()
-            .setUUID(MESSAGE_ID, messageId.get()));
-    }
-
-    private Function<Row, CompletableFuture<byte[]>> buildContentRetriever(FetchType fetchType) {
-        switch (fetchType) {
-            case Full:
-                return this::getFullContent;
-            case Headers:
-                return this::getHeaderContent;
-            case Body:
-                return row -> getBodyContent(row)
-                    .thenApply(data -> Bytes.concat(new byte[row.getInt(BODY_START_OCTET)], data));
-            case Metadata:
-                return row -> CompletableFuture.completedFuture(EMPTY_BYTE_ARRAY);
-            default:
-                throw new RuntimeException("Unknown FetchType " + fetchType);
-        }
-    }
-
-    private CompletableFuture<byte[]> getFullContent(Row row) {
-        return CompletableFutureUtil.combine(
-            getHeaderContent(row),
-            getBodyContent(row),
-            Bytes::concat);
-    }
-
-    private CompletableFuture<byte[]> getBodyContent(Row row) {
-        return getFieldContent(BODY_CONTENT, row);
-    }
-
-    private CompletableFuture<byte[]> getHeaderContent(Row row) {
-        return getFieldContent(HEADER_CONTENT, row);
-    }
-
-    private CompletableFuture<byte[]> getFieldContent(String field, Row row) {
-        return blobsDAO.read(BlobId.from(row.getString(field)));
-    }
-
-    public static MessageResult notFound(ComposedMessageIdWithMetaData id) {
-        return new MessageResult(id, Optional.empty());
-    }
-
-    public static MessageResult found(Pair<MessageWithoutAttachment, Stream<MessageAttachmentRepresentation>> message) {
-        return new MessageResult(message.getLeft().getMetadata(), Optional.of(message));
-    }
-
-    public static class MessageResult {
-        private final ComposedMessageIdWithMetaData metaData;
-        private final Optional<Pair<MessageWithoutAttachment, Stream<MessageAttachmentRepresentation>>> message;
-
-        public MessageResult(ComposedMessageIdWithMetaData metaData, Optional<Pair<MessageWithoutAttachment, Stream<MessageAttachmentRepresentation>>> message) {
-            this.metaData = metaData;
-            this.message = message;
-        }
-
-        public ComposedMessageIdWithMetaData getMetadata() {
-            return metaData;
-        }
-
-        public boolean isFound() {
-            return message.isPresent();
-        }
-
-        public Pair<MessageWithoutAttachment, Stream<MessageAttachmentRepresentation>> message() {
-            return message.get();
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/james-project/blob/9360cb3a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapper.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapper.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapper.java
index 868b382..c9e7880 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapper.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapper.java
@@ -63,7 +63,7 @@ public class CassandraMessageIdMapper implements MessageIdMapper {
     private final CassandraMailboxDAO mailboxDAO;
     private final CassandraMessageIdToImapUidDAO imapUidDAO;
     private final CassandraMessageIdDAO messageIdDAO;
-    private final CassandraMessageDAOV2 messageDAOV2;
+    private final CassandraMessageDAO messageDAO;
     private final CassandraIndexTableHandler indexTableHandler;
     private final ModSeqProvider modSeqProvider;
     private final MailboxSession mailboxSession;
@@ -72,14 +72,14 @@ public class CassandraMessageIdMapper implements MessageIdMapper {
 
     public CassandraMessageIdMapper(MailboxMapper mailboxMapper, CassandraMailboxDAO mailboxDAO, CassandraAttachmentMapper attachmentMapper,
                                     CassandraMessageIdToImapUidDAO imapUidDAO, CassandraMessageIdDAO messageIdDAO,
-                                    CassandraMessageDAOV2 messageDAOV2, CassandraIndexTableHandler indexTableHandler,
+                                    CassandraMessageDAO messageDAO, CassandraIndexTableHandler indexTableHandler,
                                     ModSeqProvider modSeqProvider, MailboxSession mailboxSession, CassandraConfiguration cassandraConfiguration) {
 
         this.mailboxMapper = mailboxMapper;
         this.mailboxDAO = mailboxDAO;
         this.imapUidDAO = imapUidDAO;
         this.messageIdDAO = messageIdDAO;
-        this.messageDAOV2 = messageDAOV2;
+        this.messageDAO = messageDAO;
         this.indexTableHandler = indexTableHandler;
         this.modSeqProvider = modSeqProvider;
         this.mailboxSession = mailboxSession;
@@ -99,10 +99,10 @@ public class CassandraMessageIdMapper implements MessageIdMapper {
                 .map(messageId -> imapUidDAO.retrieve((CassandraMessageId) messageId, Optional.empty())))
             .completableFuture()
             .thenApply(stream -> stream.collect(Guavate.toImmutableList()))
-            .thenCompose(composedMessageIds -> messageDAOV2.retrieveMessages(composedMessageIds, fetchType, Limit.unlimited()))
+            .thenCompose(composedMessageIds -> messageDAO.retrieveMessages(composedMessageIds, fetchType, Limit.unlimited()))
             .thenApply(stream -> stream
-                .filter(CassandraMessageDAOV2.MessageResult::isFound)
-                .map(CassandraMessageDAOV2.MessageResult::message))
+                .filter(CassandraMessageDAO.MessageResult::isFound)
+                .map(CassandraMessageDAO.MessageResult::message))
             .thenCompose(stream -> attachmentLoader.addAttachmentToMessages(stream, fetchType))
             .thenCompose(this::filterMessagesWithExistingMailbox)
             .join()
@@ -147,7 +147,7 @@ public class CassandraMessageIdMapper implements MessageIdMapper {
             .flags(mailboxMessage.createFlags())
             .modSeq(mailboxMessage.getModSeq())
             .build();
-        messageDAOV2.save(mailboxMessage)
+        messageDAO.save(mailboxMessage)
             .thenCompose(voidValue -> CompletableFuture.allOf(
                 imapUidDAO.insert(composedMessageIdWithMetaData),
                 messageIdDAO.insert(composedMessageIdWithMetaData)))

http://git-wip-us.apache.org/repos/asf/james-project/blob/9360cb3a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java
index 074f336..cb3c583 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java
@@ -73,7 +73,7 @@ public class CassandraMessageMapper implements MessageMapper {
     private final CassandraModSeqProvider modSeqProvider;
     private final MailboxSession mailboxSession;
     private final CassandraUidProvider uidProvider;
-    private final CassandraMessageDAOV2 messageDAOV2;
+    private final CassandraMessageDAO messageDAO;
     private final CassandraMessageIdDAO messageIdDAO;
     private final CassandraMessageIdToImapUidDAO imapUidDAO;
     private final CassandraMailboxCounterDAO mailboxCounterDAO;
@@ -87,7 +87,7 @@ public class CassandraMessageMapper implements MessageMapper {
 
     public CassandraMessageMapper(CassandraUidProvider uidProvider, CassandraModSeqProvider modSeqProvider,
                                   MailboxSession mailboxSession, CassandraAttachmentMapper attachmentMapper,
-                                  CassandraMessageDAOV2 messageDAOV2, CassandraMessageIdDAO messageIdDAO,
+                                  CassandraMessageDAO messageDAO, CassandraMessageIdDAO messageIdDAO,
                                   CassandraMessageIdToImapUidDAO imapUidDAO, CassandraMailboxCounterDAO mailboxCounterDAO,
                                   CassandraMailboxRecentsDAO mailboxRecentDAO, CassandraApplicableFlagDAO applicableFlagDAO,
                                   CassandraIndexTableHandler indexTableHandler, CassandraFirstUnseenDAO firstUnseenDAO,
@@ -95,7 +95,7 @@ public class CassandraMessageMapper implements MessageMapper {
         this.uidProvider = uidProvider;
         this.modSeqProvider = modSeqProvider;
         this.mailboxSession = mailboxSession;
-        this.messageDAOV2 = messageDAOV2;
+        this.messageDAO = messageDAO;
         this.messageIdDAO = messageIdDAO;
         this.imapUidDAO = imapUidDAO;
         this.mailboxCounterDAO = mailboxCounterDAO;
@@ -178,10 +178,10 @@ public class CassandraMessageMapper implements MessageMapper {
     }
 
     private CompletableFuture<Stream<SimpleMailboxMessage>> retrieveMessages(List<ComposedMessageIdWithMetaData> messageIds, FetchType fetchType, Limit limit) {
-        return messageDAOV2.retrieveMessages(messageIds, fetchType, limit)
+        return messageDAO.retrieveMessages(messageIds, fetchType, limit)
             .thenApply(steam -> steam
-                .filter(CassandraMessageDAOV2.MessageResult::isFound)
-                .map(CassandraMessageDAOV2.MessageResult::message))
+                .filter(CassandraMessageDAO.MessageResult::isFound)
+                .map(CassandraMessageDAO.MessageResult::message))
             .thenCompose(stream -> attachmentLoader.addAttachmentToMessages(stream, fetchType));
     }
 
@@ -217,9 +217,9 @@ public class CassandraMessageMapper implements MessageMapper {
         return FluentFutureStream.ofOptionals(
                 uidChunk.stream().map(uid -> retrieveComposedId(mailboxId, uid)))
             .performOnAll(this::deleteUsingMailboxId)
-            .thenFlatCompose(idWithMetadata -> messageDAOV2.retrieveMessages(ImmutableList.of(idWithMetadata), FetchType.Metadata, Limit.unlimited()))
-            .filter(CassandraMessageDAOV2.MessageResult::isFound)
-            .map(CassandraMessageDAOV2.MessageResult::message)
+            .thenFlatCompose(idWithMetadata -> messageDAO.retrieveMessages(ImmutableList.of(idWithMetadata), FetchType.Metadata, Limit.unlimited()))
+            .filter(CassandraMessageDAO.MessageResult::isFound)
+            .map(CassandraMessageDAO.MessageResult::message)
             .map(pair -> pair.getKey().toMailboxMessage(ImmutableList.of()))
             .completableFuture();
     }
@@ -373,7 +373,7 @@ public class CassandraMessageMapper implements MessageMapper {
 
     private CompletableFuture<Void> save(Mailbox mailbox, MailboxMessage message) throws MailboxException {
         CassandraId mailboxId = (CassandraId) mailbox.getMailboxId();
-        return messageDAOV2.save(message)
+        return messageDAO.save(message)
             .thenCompose(aVoid -> insertIds(message, mailboxId));
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/9360cb3a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerProvider.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerProvider.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerProvider.java
index 3fcbe7f..0589cc6 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerProvider.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerProvider.java
@@ -33,7 +33,7 @@ import org.apache.james.mailbox.cassandra.mail.CassandraMailboxCounterDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMailboxDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMailboxPathDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMailboxRecentsDAO;
-import org.apache.james.mailbox.cassandra.mail.CassandraMessageDAOV2;
+import org.apache.james.mailbox.cassandra.mail.CassandraMessageDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMessageIdDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMessageIdToImapUidDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraModSeqProvider;
@@ -58,7 +58,7 @@ public class CassandraMailboxManagerProvider {
         CassandraMessageIdDAO messageIdDAO = new CassandraMessageIdDAO(session, messageIdFactory);
         CassandraMessageIdToImapUidDAO imapUidDAO = new CassandraMessageIdToImapUidDAO(session, messageIdFactory);
         CassandraBlobsDAO blobsDAO = new CassandraBlobsDAO(session);
-        CassandraMessageDAOV2 messageDAOV2 = new CassandraMessageDAOV2(session, cassandraTypesProvider, blobsDAO);
+        CassandraMessageDAO messageDAO = new CassandraMessageDAO(session, cassandraTypesProvider, blobsDAO);
         CassandraMailboxCounterDAO mailboxCounterDAO = new CassandraMailboxCounterDAO(session);
         CassandraMailboxRecentsDAO mailboxRecentsDAO = new CassandraMailboxRecentsDAO(session);
         CassandraMailboxDAO mailboxDAO = new CassandraMailboxDAO(session, cassandraTypesProvider);
@@ -70,7 +70,7 @@ public class CassandraMailboxManagerProvider {
         CassandraMailboxSessionMapperFactory mapperFactory = new CassandraMailboxSessionMapperFactory(uidProvider,
             modSeqProvider,
             session,
-            messageDAOV2,
+            messageDAO,
             messageIdDAO,
             imapUidDAO,
             mailboxCounterDAO,

http://git-wip-us.apache.org/repos/asf/james-project/blob/9360cb3a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraSubscriptionManagerTest.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraSubscriptionManagerTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraSubscriptionManagerTest.java
index c945204..93eb618 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraSubscriptionManagerTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraSubscriptionManagerTest.java
@@ -30,7 +30,7 @@ import org.apache.james.mailbox.cassandra.mail.CassandraMailboxCounterDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMailboxDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMailboxPathDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMailboxRecentsDAO;
-import org.apache.james.mailbox.cassandra.mail.CassandraMessageDAOV2;
+import org.apache.james.mailbox.cassandra.mail.CassandraMessageDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMessageIdDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMessageIdToImapUidDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraModSeqProvider;
@@ -67,7 +67,7 @@ public class CassandraSubscriptionManagerTest extends AbstractSubscriptionManage
     @Override
     public SubscriptionManager createSubscriptionManager() {
         CassandraMessageIdToImapUidDAO imapUidDAO = null;
-        CassandraMessageDAOV2 messageDAOV2 = null;
+        CassandraMessageDAO messageDAO = null;
         CassandraMessageIdDAO messageIdDAO = null;
         CassandraMailboxCounterDAO mailboxCounterDAO = null;
         CassandraMailboxRecentsDAO mailboxRecentsDAO = null;
@@ -81,7 +81,7 @@ public class CassandraSubscriptionManagerTest extends AbstractSubscriptionManage
                 new CassandraUidProvider(cassandra.getConf()),
                 new CassandraModSeqProvider(cassandra.getConf()),
                 cassandra.getConf(),
-                messageDAOV2,
+                messageDAO,
                 messageIdDAO,
                 imapUidDAO,
                 mailboxCounterDAO,

http://git-wip-us.apache.org/repos/asf/james-project/blob/9360cb3a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraTestSystemFixture.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraTestSystemFixture.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraTestSystemFixture.java
index 24895ed..c38adf5 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraTestSystemFixture.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraTestSystemFixture.java
@@ -32,7 +32,7 @@ import org.apache.james.mailbox.cassandra.mail.CassandraMailboxCounterDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMailboxDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMailboxPathDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMailboxRecentsDAO;
-import org.apache.james.mailbox.cassandra.mail.CassandraMessageDAOV2;
+import org.apache.james.mailbox.cassandra.mail.CassandraMessageDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMessageIdDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMessageIdToImapUidDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraModSeqProvider;
@@ -92,7 +92,7 @@ public class CassandraTestSystemFixture {
         CassandraMessageIdDAO messageIdDAO = new CassandraMessageIdDAO(cassandra.getConf(), messageIdFactory);
         CassandraMessageIdToImapUidDAO imapUidDAO = new CassandraMessageIdToImapUidDAO(cassandra.getConf(), messageIdFactory);
         CassandraBlobsDAO blobsDAO = new CassandraBlobsDAO(cassandra.getConf());
-        CassandraMessageDAOV2 messageDAOV2 = new CassandraMessageDAOV2(cassandra.getConf(), cassandra.getTypesProvider(), blobsDAO);
+        CassandraMessageDAO messageDAO = new CassandraMessageDAO(cassandra.getConf(), cassandra.getTypesProvider(), blobsDAO);
         CassandraMailboxCounterDAO mailboxCounterDAO = new CassandraMailboxCounterDAO(cassandra.getConf());
         CassandraMailboxRecentsDAO mailboxRecentsDAO = new CassandraMailboxRecentsDAO(cassandra.getConf());
         CassandraApplicableFlagDAO applicableFlagDAO = new CassandraApplicableFlagDAO(cassandra.getConf());
@@ -104,7 +104,7 @@ public class CassandraTestSystemFixture {
         return new CassandraMailboxSessionMapperFactory(uidProvider,
             modSeqProvider,
             cassandra.getConf(),
-            messageDAOV2,
+            messageDAO,
             messageIdDAO,
             imapUidDAO,
             mailboxCounterDAO,

http://git-wip-us.apache.org/repos/asf/james-project/blob/9360cb3a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxManagerAttachmentTest.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxManagerAttachmentTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxManagerAttachmentTest.java
index 9bfe467..b904598 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxManagerAttachmentTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxManagerAttachmentTest.java
@@ -89,12 +89,12 @@ public class CassandraMailboxManagerAttachmentTest extends AbstractMailboxManage
         CassandraDeletedMessageDAO deletedMessageDAO = new CassandraDeletedMessageDAO(cassandra.getConf());
 
         CassandraBlobsDAO blobsDAO = new CassandraBlobsDAO(cassandra.getConf());
-        CassandraMessageDAOV2 messageDAOV2 = new CassandraMessageDAOV2(cassandra.getConf(), cassandra.getTypesProvider(), blobsDAO);
+        CassandraMessageDAO messageDAO = new CassandraMessageDAO(cassandra.getConf(), cassandra.getTypesProvider(), blobsDAO);
         mailboxSessionMapperFactory = new CassandraMailboxSessionMapperFactory(
                 new CassandraUidProvider(cassandra.getConf()),
                 new CassandraModSeqProvider(cassandra.getConf()),
                 cassandra.getConf(),
-            messageDAOV2,
+            messageDAO,
                 new CassandraMessageIdDAO(cassandra.getConf(), messageIdFactory),
                 new CassandraMessageIdToImapUidDAO(cassandra.getConf(), messageIdFactory),
                 new CassandraMailboxCounterDAO(cassandra.getConf()),

http://git-wip-us.apache.org/repos/asf/james-project/blob/9360cb3a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMapperProvider.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMapperProvider.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMapperProvider.java
index 1d1f9c9..827e869 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMapperProvider.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMapperProvider.java
@@ -58,7 +58,6 @@ import com.google.common.collect.ImmutableList;
 public class CassandraMapperProvider implements MapperProvider {
 
     private static final Factory MESSAGE_ID_FACTORY = new CassandraMessageId.Factory();
-    public static final int MAX_ACL_RETRY = 10;
 
     private final CassandraCluster cassandra;
     private final MessageUidProvider messageUidProvider;
@@ -112,12 +111,12 @@ public class CassandraMapperProvider implements MapperProvider {
         CassandraFirstUnseenDAO firstUnseenDAO = new CassandraFirstUnseenDAO(cassandra.getConf());
         CassandraDeletedMessageDAO deletedMessageDAO = new CassandraDeletedMessageDAO(cassandra.getConf());
         CassandraBlobsDAO blobsDAO = new CassandraBlobsDAO(cassandra.getConf());
-        CassandraMessageDAOV2 messageDAOV2 = new CassandraMessageDAOV2(cassandra.getConf(), cassandra.getTypesProvider(), blobsDAO);
+        CassandraMessageDAO messageDAO = new CassandraMessageDAO(cassandra.getConf(), cassandra.getTypesProvider(), blobsDAO);
         return new CassandraMailboxSessionMapperFactory(
             new CassandraUidProvider(cassandra.getConf()),
             cassandraModSeqProvider,
             cassandra.getConf(),
-            messageDAOV2,
+            messageDAO,
             new CassandraMessageIdDAO(cassandra.getConf(), MESSAGE_ID_FACTORY),
             new CassandraMessageIdToImapUidDAO(cassandra.getConf(), MESSAGE_ID_FACTORY),
             new CassandraMailboxCounterDAO(cassandra.getConf()),

http://git-wip-us.apache.org/repos/asf/james-project/blob/9360cb3a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOTest.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOTest.java
new file mode 100644
index 0000000..0fbfc71
--- /dev/null
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOTest.java
@@ -0,0 +1,191 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.mailbox.cassandra.mail;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.io.ByteArrayInputStream;
+import java.util.Date;
+import java.util.List;
+import java.util.concurrent.CompletableFuture;
+import java.util.stream.Stream;
+
+import javax.mail.Flags;
+import javax.mail.util.SharedByteArrayInputStream;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang3.tuple.Pair;
+import org.apache.james.backends.cassandra.CassandraCluster;
+import org.apache.james.backends.cassandra.init.CassandraModuleComposite;
+import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.cassandra.ids.CassandraId;
+import org.apache.james.mailbox.cassandra.ids.CassandraMessageId;
+import org.apache.james.mailbox.cassandra.mail.utils.Limit;
+import org.apache.james.mailbox.cassandra.modules.CassandraBlobModule;
+import org.apache.james.mailbox.cassandra.modules.CassandraMessageModule;
+import org.apache.james.mailbox.model.ComposedMessageId;
+import org.apache.james.mailbox.model.ComposedMessageIdWithMetaData;
+import org.apache.james.mailbox.model.MessageId;
+import org.apache.james.mailbox.store.mail.MessageMapper;
+import org.apache.james.mailbox.store.mail.model.impl.PropertyBuilder;
+import org.apache.james.mailbox.store.mail.model.impl.SimpleMailboxMessage;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.google.common.base.Charsets;
+import com.google.common.collect.ImmutableList;
+import com.google.common.primitives.Bytes;
+
+public class CassandraMessageDAOTest {
+    private static final int BODY_START = 16;
+    private static final CassandraId MAILBOX_ID = CassandraId.timeBased();
+    private static final String CONTENT = "Subject: Test7 \n\nBody7\n.\n";
+    private static final MessageUid messageUid = MessageUid.of(1);
+
+    private CassandraCluster cassandra;
+
+    private CassandraMessageDAO testee;
+    private CassandraBlobsDAO blobsDAO;
+    private CassandraMessageId.Factory messageIdFactory;
+
+    private SimpleMailboxMessage message;
+    private CassandraMessageId messageId;
+    private ComposedMessageId composedMessageId;
+    private List<ComposedMessageIdWithMetaData> messageIds;
+
+    @Before
+    public void setUp() {
+        cassandra = CassandraCluster.create(new CassandraModuleComposite(new CassandraMessageModule(), new CassandraBlobModule()));
+        cassandra.ensureAllTables();
+
+        messageIdFactory = new CassandraMessageId.Factory();
+        messageId = messageIdFactory.generate();
+        blobsDAO = new CassandraBlobsDAO(cassandra.getConf());
+        testee = new CassandraMessageDAO(cassandra.getConf(), cassandra.getTypesProvider(), blobsDAO);
+
+        composedMessageId = new ComposedMessageId(MAILBOX_ID, messageId, messageUid);
+
+        messageIds = ImmutableList.of(ComposedMessageIdWithMetaData.builder()
+                .composedMessageId(composedMessageId)
+                .flags(new Flags())
+                .modSeq(1)
+                .build());
+    }
+
+    @After
+    public void tearDown() {
+        cassandra.clearAllTables();
+        cassandra.close();
+    }
+
+    @Test
+    public void saveShouldSaveNullValueForTextualLineCountAsZero() throws Exception {
+        message = createMessage(messageId, CONTENT, BODY_START, new PropertyBuilder());
+
+        testee.save(message).join();
+
+        MessageWithoutAttachment attachmentRepresentation =
+            toMessage(testee.retrieveMessages(messageIds, MessageMapper.FetchType.Metadata, Limit.unlimited()));
+
+        assertThat(attachmentRepresentation.getPropertyBuilder().getTextualLineCount())
+            .isEqualTo(0L);
+    }
+
+    @Test
+    public void saveShouldSaveTextualLineCount() throws Exception {
+        long textualLineCount = 10L;
+        PropertyBuilder propertyBuilder = new PropertyBuilder();
+        propertyBuilder.setTextualLineCount(textualLineCount);
+        message = createMessage(messageId, CONTENT, BODY_START, propertyBuilder);
+
+        testee.save(message).join();
+
+        MessageWithoutAttachment attachmentRepresentation =
+            toMessage(testee.retrieveMessages(messageIds, MessageMapper.FetchType.Metadata, Limit.unlimited()));
+
+        assertThat(attachmentRepresentation.getPropertyBuilder().getTextualLineCount()).isEqualTo(textualLineCount);
+    }
+
+    @Test
+    public void saveShouldStoreMessageWithFullContent() throws Exception {
+        message = createMessage(messageId, CONTENT, BODY_START, new PropertyBuilder());
+
+        testee.save(message).join();
+
+        MessageWithoutAttachment attachmentRepresentation =
+            toMessage(testee.retrieveMessages(messageIds, MessageMapper.FetchType.Full, Limit.unlimited()));
+
+        assertThat(IOUtils.toString(attachmentRepresentation.getContent(), Charsets.UTF_8))
+            .isEqualTo(CONTENT);
+    }
+
+    @Test
+    public void saveShouldStoreMessageWithBodyContent() throws Exception {
+        message = createMessage(messageId, CONTENT, BODY_START, new PropertyBuilder());
+
+        testee.save(message).join();
+
+        MessageWithoutAttachment attachmentRepresentation =
+            toMessage(testee.retrieveMessages(messageIds, MessageMapper.FetchType.Body, Limit.unlimited()));
+
+        byte[] expected = Bytes.concat(
+            new byte[BODY_START],
+            CONTENT.substring(BODY_START).getBytes(Charsets.UTF_8));
+        assertThat(IOUtils.toString(attachmentRepresentation.getContent(), Charsets.UTF_8))
+            .isEqualTo(IOUtils.toString(new ByteArrayInputStream(expected), Charsets.UTF_8));
+    }
+
+    @Test
+    public void saveShouldStoreMessageWithHeaderContent() throws Exception {
+        message = createMessage(messageId, CONTENT, BODY_START, new PropertyBuilder());
+
+        testee.save(message).join();
+
+        MessageWithoutAttachment attachmentRepresentation =
+            toMessage(testee.retrieveMessages(messageIds, MessageMapper.FetchType.Headers, Limit.unlimited()));
+
+        assertThat(IOUtils.toString(attachmentRepresentation.getContent(), Charsets.UTF_8))
+            .isEqualTo(CONTENT.substring(0, BODY_START));
+    }
+
+    private SimpleMailboxMessage createMessage(MessageId messageId, String content, int bodyStart, PropertyBuilder propertyBuilder) {
+        return SimpleMailboxMessage.builder()
+            .messageId(messageId)
+            .mailboxId(MAILBOX_ID)
+            .uid(messageUid)
+            .internalDate(new Date())
+            .bodyStartOctet(bodyStart)
+            .size(content.length())
+            .content(new SharedByteArrayInputStream(content.getBytes(Charsets.UTF_8)))
+            .flags(new Flags())
+            .propertyBuilder(propertyBuilder)
+            .build();
+    }
+
+    private MessageWithoutAttachment toMessage(CompletableFuture<Stream<CassandraMessageDAO.MessageResult>> readOptional) throws InterruptedException, java.util.concurrent.ExecutionException {
+        return readOptional.join()
+            .map(CassandraMessageDAO.MessageResult::message)
+            .map(Pair::getLeft)
+            .findAny()
+            .orElseThrow(() -> new IllegalStateException("Collection is not supposed to be empty"));
+    }
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/james-project/blob/9360cb3a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOV2Test.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOV2Test.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOV2Test.java
deleted file mode 100644
index 5b98aa7..0000000
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOV2Test.java
+++ /dev/null
@@ -1,191 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one   *
- * or more contributor license agreements.  See the NOTICE file *
- * distributed with this work for additional information        *
- * regarding copyright ownership.  The ASF licenses this file   *
- * to you under the Apache License, Version 2.0 (the            *
- * "License"); you may not use this file except in compliance   *
- * with the License.  You may obtain a copy of the License at   *
- *                                                              *
- *   http://www.apache.org/licenses/LICENSE-2.0                 *
- *                                                              *
- * Unless required by applicable law or agreed to in writing,   *
- * software distributed under the License is distributed on an  *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
- * KIND, either express or implied.  See the License for the    *
- * specific language governing permissions and limitations      *
- * under the License.                                           *
- ****************************************************************/
-
-package org.apache.james.mailbox.cassandra.mail;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
-import java.io.ByteArrayInputStream;
-import java.util.Date;
-import java.util.List;
-import java.util.concurrent.CompletableFuture;
-import java.util.stream.Stream;
-
-import javax.mail.Flags;
-import javax.mail.util.SharedByteArrayInputStream;
-
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang3.tuple.Pair;
-import org.apache.james.backends.cassandra.CassandraCluster;
-import org.apache.james.backends.cassandra.init.CassandraModuleComposite;
-import org.apache.james.mailbox.MessageUid;
-import org.apache.james.mailbox.cassandra.ids.CassandraId;
-import org.apache.james.mailbox.cassandra.ids.CassandraMessageId;
-import org.apache.james.mailbox.cassandra.mail.utils.Limit;
-import org.apache.james.mailbox.cassandra.modules.CassandraBlobModule;
-import org.apache.james.mailbox.cassandra.modules.CassandraMessageModule;
-import org.apache.james.mailbox.model.ComposedMessageId;
-import org.apache.james.mailbox.model.ComposedMessageIdWithMetaData;
-import org.apache.james.mailbox.model.MessageId;
-import org.apache.james.mailbox.store.mail.MessageMapper;
-import org.apache.james.mailbox.store.mail.model.impl.PropertyBuilder;
-import org.apache.james.mailbox.store.mail.model.impl.SimpleMailboxMessage;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-import com.google.common.base.Charsets;
-import com.google.common.collect.ImmutableList;
-import com.google.common.primitives.Bytes;
-
-public class CassandraMessageDAOV2Test {
-    private static final int BODY_START = 16;
-    private static final CassandraId MAILBOX_ID = CassandraId.timeBased();
-    private static final String CONTENT = "Subject: Test7 \n\nBody7\n.\n";
-    private static final MessageUid messageUid = MessageUid.of(1);
-
-    private CassandraCluster cassandra;
-
-    private CassandraMessageDAOV2 testee;
-    private CassandraBlobsDAO blobsDAO;
-    private CassandraMessageId.Factory messageIdFactory;
-
-    private SimpleMailboxMessage message;
-    private CassandraMessageId messageId;
-    private ComposedMessageId composedMessageId;
-    private List<ComposedMessageIdWithMetaData> messageIds;
-
-    @Before
-    public void setUp() {
-        cassandra = CassandraCluster.create(new CassandraModuleComposite(new CassandraMessageModule(), new CassandraBlobModule()));
-        cassandra.ensureAllTables();
-
-        messageIdFactory = new CassandraMessageId.Factory();
-        messageId = messageIdFactory.generate();
-        blobsDAO = new CassandraBlobsDAO(cassandra.getConf());
-        testee = new CassandraMessageDAOV2(cassandra.getConf(), cassandra.getTypesProvider(), blobsDAO);
-
-        composedMessageId = new ComposedMessageId(MAILBOX_ID, messageId, messageUid);
-
-        messageIds = ImmutableList.of(ComposedMessageIdWithMetaData.builder()
-                .composedMessageId(composedMessageId)
-                .flags(new Flags())
-                .modSeq(1)
-                .build());
-    }
-
-    @After
-    public void tearDown() {
-        cassandra.clearAllTables();
-        cassandra.close();
-    }
-
-    @Test
-    public void saveShouldSaveNullValueForTextualLineCountAsZero() throws Exception {
-        message = createMessage(messageId, CONTENT, BODY_START, new PropertyBuilder());
-
-        testee.save(message).join();
-
-        MessageWithoutAttachment attachmentRepresentation =
-            toMessage(testee.retrieveMessages(messageIds, MessageMapper.FetchType.Metadata, Limit.unlimited()));
-
-        assertThat(attachmentRepresentation.getPropertyBuilder().getTextualLineCount())
-            .isEqualTo(0L);
-    }
-
-    @Test
-    public void saveShouldSaveTextualLineCount() throws Exception {
-        long textualLineCount = 10L;
-        PropertyBuilder propertyBuilder = new PropertyBuilder();
-        propertyBuilder.setTextualLineCount(textualLineCount);
-        message = createMessage(messageId, CONTENT, BODY_START, propertyBuilder);
-
-        testee.save(message).join();
-
-        MessageWithoutAttachment attachmentRepresentation =
-            toMessage(testee.retrieveMessages(messageIds, MessageMapper.FetchType.Metadata, Limit.unlimited()));
-
-        assertThat(attachmentRepresentation.getPropertyBuilder().getTextualLineCount()).isEqualTo(textualLineCount);
-    }
-
-    @Test
-    public void saveShouldStoreMessageWithFullContent() throws Exception {
-        message = createMessage(messageId, CONTENT, BODY_START, new PropertyBuilder());
-
-        testee.save(message).join();
-
-        MessageWithoutAttachment attachmentRepresentation =
-            toMessage(testee.retrieveMessages(messageIds, MessageMapper.FetchType.Full, Limit.unlimited()));
-
-        assertThat(IOUtils.toString(attachmentRepresentation.getContent(), Charsets.UTF_8))
-            .isEqualTo(CONTENT);
-    }
-
-    @Test
-    public void saveShouldStoreMessageWithBodyContent() throws Exception {
-        message = createMessage(messageId, CONTENT, BODY_START, new PropertyBuilder());
-
-        testee.save(message).join();
-
-        MessageWithoutAttachment attachmentRepresentation =
-            toMessage(testee.retrieveMessages(messageIds, MessageMapper.FetchType.Body, Limit.unlimited()));
-
-        byte[] expected = Bytes.concat(
-            new byte[BODY_START],
-            CONTENT.substring(BODY_START).getBytes(Charsets.UTF_8));
-        assertThat(IOUtils.toString(attachmentRepresentation.getContent(), Charsets.UTF_8))
-            .isEqualTo(IOUtils.toString(new ByteArrayInputStream(expected), Charsets.UTF_8));
-    }
-
-    @Test
-    public void saveShouldStoreMessageWithHeaderContent() throws Exception {
-        message = createMessage(messageId, CONTENT, BODY_START, new PropertyBuilder());
-
-        testee.save(message).join();
-
-        MessageWithoutAttachment attachmentRepresentation =
-            toMessage(testee.retrieveMessages(messageIds, MessageMapper.FetchType.Headers, Limit.unlimited()));
-
-        assertThat(IOUtils.toString(attachmentRepresentation.getContent(), Charsets.UTF_8))
-            .isEqualTo(CONTENT.substring(0, BODY_START));
-    }
-
-    private SimpleMailboxMessage createMessage(MessageId messageId, String content, int bodyStart, PropertyBuilder propertyBuilder) {
-        return SimpleMailboxMessage.builder()
-            .messageId(messageId)
-            .mailboxId(MAILBOX_ID)
-            .uid(messageUid)
-            .internalDate(new Date())
-            .bodyStartOctet(bodyStart)
-            .size(content.length())
-            .content(new SharedByteArrayInputStream(content.getBytes(Charsets.UTF_8)))
-            .flags(new Flags())
-            .propertyBuilder(propertyBuilder)
-            .build();
-    }
-
-    private MessageWithoutAttachment toMessage(CompletableFuture<Stream<CassandraMessageDAOV2.MessageResult>> readOptional) throws InterruptedException, java.util.concurrent.ExecutionException {
-        return readOptional.join()
-            .map(CassandraMessageDAOV2.MessageResult::message)
-            .map(Pair::getLeft)
-            .findAny()
-            .orElseThrow(() -> new IllegalStateException("Collection is not supposed to be empty"));
-    }
-
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/james-project/blob/9360cb3a/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/host/CassandraHostSystem.java
----------------------------------------------------------------------
diff --git a/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/host/CassandraHostSystem.java b/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/host/CassandraHostSystem.java
index 75969a3..0ca4992 100644
--- a/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/host/CassandraHostSystem.java
+++ b/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/host/CassandraHostSystem.java
@@ -37,7 +37,7 @@ import org.apache.james.mailbox.cassandra.mail.CassandraMailboxCounterDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMailboxDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMailboxPathDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMailboxRecentsDAO;
-import org.apache.james.mailbox.cassandra.mail.CassandraMessageDAOV2;
+import org.apache.james.mailbox.cassandra.mail.CassandraMessageDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMessageIdDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMessageIdToImapUidDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraModSeqProvider;
@@ -110,7 +110,7 @@ public class CassandraHostSystem extends JamesImapHostSystem {
         CassandraTypesProvider typesProvider = new CassandraTypesProvider(mailboxModule, session);
         CassandraMessageId.Factory messageIdFactory = new CassandraMessageId.Factory();
         CassandraBlobsDAO cassandraBlobsDAO = new CassandraBlobsDAO(session);
-        CassandraMessageDAOV2 messageDAOV2 = new CassandraMessageDAOV2(session, typesProvider, cassandraBlobsDAO);
+        CassandraMessageDAO messageDAO = new CassandraMessageDAO(session, typesProvider, cassandraBlobsDAO);
         CassandraMessageIdDAO messageIdDAO = new CassandraMessageIdDAO(session, messageIdFactory);
         CassandraMessageIdToImapUidDAO imapUidDAO = new CassandraMessageIdToImapUidDAO(session, messageIdFactory);
         CassandraMailboxCounterDAO mailboxCounterDAO = new CassandraMailboxCounterDAO(session);
@@ -125,7 +125,7 @@ public class CassandraHostSystem extends JamesImapHostSystem {
             uidProvider,
             modSeqProvider,
             session,
-            messageDAOV2,
+            messageDAO,
             messageIdDAO,
             imapUidDAO,
             mailboxCounterDAO,


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org

[2/9] james-project git commit: JAMES-2111 Generify migration versions using Cassandra defined constants

Posted by bt...@apache.org.
JAMES-2111 Generify migration versions using Cassandra defined constants


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/55300fed
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/55300fed
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/55300fed

Branch: refs/heads/master
Commit: 55300fedca613a26ffe9fbb658d04b222933d834
Parents: 621ba9a
Author: benwa <bt...@linagora.com>
Authored: Fri Aug 18 09:24:07 2017 +0700
Committer: benwa <bt...@linagora.com>
Committed: Tue Aug 22 10:30:18 2017 +0700

----------------------------------------------------------------------
 .../integration/WebAdminServerIntegrationTest.java        |  4 ++--
 .../james/webadmin/service/CassandraMigrationService.java | 10 +++++-----
 2 files changed, 7 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/55300fed/server/protocols/webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/WebAdminServerIntegrationTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/WebAdminServerIntegrationTest.java b/server/protocols/webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/WebAdminServerIntegrationTest.java
index eba71f8..03963eb 100644
--- a/server/protocols/webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/WebAdminServerIntegrationTest.java
+++ b/server/protocols/webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/WebAdminServerIntegrationTest.java
@@ -216,7 +216,7 @@ public class WebAdminServerIntegrationTest {
     public void postShouldDoMigrationAndUpdateCurrentVersion() throws Exception {
         given()
             .port(webAdminGuiceProbe.getWebAdminPort())
-            .body("2")
+            .body(String.valueOf(CassandraSchemaVersionManager.MAX_VERSION))
         .when()
             .post(UPGRADE_VERSION)
         .then()
@@ -228,7 +228,7 @@ public class WebAdminServerIntegrationTest {
             .get(VERSION)
         .then()
             .statusCode(200)
-            .body(is("{\"version\":2}"));
+            .body(is("{\"version\":" + CassandraSchemaVersionManager.MAX_VERSION + "}"));
     }
 
     @Test

http://git-wip-us.apache.org/repos/asf/james-project/blob/55300fed/server/protocols/webadmin/webadmin-cassandra/src/main/java/org/apache/james/webadmin/service/CassandraMigrationService.java
----------------------------------------------------------------------
diff --git a/server/protocols/webadmin/webadmin-cassandra/src/main/java/org/apache/james/webadmin/service/CassandraMigrationService.java b/server/protocols/webadmin/webadmin-cassandra/src/main/java/org/apache/james/webadmin/service/CassandraMigrationService.java
index 2876f38..004cd60 100644
--- a/server/protocols/webadmin/webadmin-cassandra/src/main/java/org/apache/james/webadmin/service/CassandraMigrationService.java
+++ b/server/protocols/webadmin/webadmin-cassandra/src/main/java/org/apache/james/webadmin/service/CassandraMigrationService.java
@@ -22,21 +22,21 @@ package org.apache.james.webadmin.service;
 import java.util.Map;
 import java.util.Optional;
 import java.util.stream.IntStream;
+
 import javax.inject.Inject;
 import javax.inject.Named;
 
 import org.apache.commons.lang.NotImplementedException;
 import org.apache.james.backends.cassandra.versions.CassandraSchemaVersionDAO;
+import org.apache.james.backends.cassandra.versions.CassandraSchemaVersionManager;
 import org.apache.james.mailbox.cassandra.mail.migration.Migration;
 import org.apache.james.webadmin.dto.CassandraVersionResponse;
-
-import com.google.common.base.Preconditions;
-
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.base.Preconditions;
+
 public class CassandraMigrationService {
-    private static final int FIRST_VERSION = 1;
     public static final String LATEST_VERSION = "latestVersion";
     private final CassandraSchemaVersionDAO schemaVersionDAO;
     private final int latestVersion;
@@ -60,7 +60,7 @@ public class CassandraMigrationService {
     }
 
     public synchronized void upgradeToVersion(int newVersion) {
-        int currentVersion = schemaVersionDAO.getCurrentSchemaVersion().join().orElse(FIRST_VERSION);
+        int currentVersion = schemaVersionDAO.getCurrentSchemaVersion().join().orElse(CassandraSchemaVersionManager.DEFAULT_VERSION);
         if (currentVersion >= newVersion) {
             throw new IllegalStateException("Current version is already up to date");
         }


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[5/9] james-project git commit: JAMES-2111 Drop V1 -> V2 configuration options

Posted by bt...@apache.org.
JAMES-2111 Drop V1 -> V2 configuration options


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/51a1311f
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/51a1311f
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/51a1311f

Branch: refs/heads/master
Commit: 51a1311ffb06f684feb62aea7acc51f5a589189f
Parents: 4e0f131
Author: benwa <bt...@linagora.com>
Authored: Tue Aug 15 15:50:39 2017 +0700
Committer: benwa <bt...@linagora.com>
Committed: Tue Aug 22 10:31:07 2017 +0700

----------------------------------------------------------------------
 .../cassandra/CassandraConfiguration.java       | 97 +-------------------
 .../cassandra/CassandraConfigurationTest.java   | 60 ------------
 .../destination/conf/cassandra.properties       |  3 -
 .../destination/conf/cassandra.properties       |  3 -
 .../modules/mailbox/CassandraSessionModule.java | 12 ---
 .../mailbox/CassandraSessionModuleTest.java     |  4 -
 .../modules/mailbox/cassandra.properties        |  4 -
 src/site/xdoc/server/config-cassandra.xml       |  8 +-
 8 files changed, 8 insertions(+), 183 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/51a1311f/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/CassandraConfiguration.java
----------------------------------------------------------------------
diff --git a/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/CassandraConfiguration.java b/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/CassandraConfiguration.java
index 5de74a4..f976242 100644
--- a/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/CassandraConfiguration.java
+++ b/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/CassandraConfiguration.java
@@ -38,11 +38,7 @@ public class CassandraConfiguration {
     public static final int DEFAULT_UID_MAX_RETRY = 100000;
     public static final int DEFAULT_ACL_MAX_RETRY = 1000;
     public static final int DEFAULT_FETCH_NEXT_PAGE_ADVANCE_IN_ROW = 100;
-    public static final boolean DEFAULT_ON_THE_FLY_MIGRATION_V1_TO_V2 = false;
     public static final int DEFAULT_BLOB_PART_SIZE = 100 * 1024;
-    public static final int DEFAULT_MIGRATION_V1_TO_V2_QUEUE_LENGTH = 1000;
-    public static final int DEFAULT_MIGRATION_V1_TO_V2_THREAD_COUNT = 2;
-    public static final int DEFAULT_MIGRATION_V1_READ_FETCH_SIZE = 10;
 
     public static class Builder {
         private Optional<Integer> messageReadChunkSize = Optional.empty();
@@ -55,10 +51,6 @@ public class CassandraConfiguration {
         private Optional<Integer> aclMaxRetry = Optional.empty();
         private Optional<Integer> fetchNextPageInAdvanceRow = Optional.empty();
         private Optional<Integer> blobPartSize = Optional.empty();
-        private Optional<Boolean> onTheFlyV1ToV2Migration = Optional.empty();
-        private Optional<Integer> v1ToV2QueueLength = Optional.empty();
-        private Optional<Integer> v1ToV2ThreadCount = Optional.empty();
-        private Optional<Integer> v1ReadFetchSize = Optional.empty();
 
         public Builder messageReadChunkSize(int value) {
             Preconditions.checkArgument(value > 0, "messageReadChunkSize needs to be strictly positive");
@@ -120,29 +112,6 @@ public class CassandraConfiguration {
             return this;
         }
 
-        public Builder v1ToV2QueueLength(int value) {
-            Preconditions.checkArgument(value > 0, "v1ToV2QueueLength needs to be strictly positive");
-            this.v1ToV2QueueLength = Optional.of(value);
-            return this;
-        }
-
-        public Builder v1ToV2ThreadCount(int value) {
-            Preconditions.checkArgument(value > 0, "v1ToV2ThreadCount needs to be strictly positive");
-            this.v1ToV2ThreadCount = Optional.of(value);
-            return this;
-        }
-
-        public Builder v1ReadFetchSize(int value) {
-            Preconditions.checkArgument(value > 0, "v1ReadFetchSize needs to be strictly positive");
-            this.v1ReadFetchSize = Optional.of(value);
-            return this;
-        }
-
-        public Builder onTheFlyV1ToV2Migration(boolean value) {
-            this.onTheFlyV1ToV2Migration = Optional.of(value);
-            return this;
-        }
-
         public Builder messageReadChunkSize(Optional<Integer> value) {
             value.ifPresent(this::messageReadChunkSize);
             return this;
@@ -193,26 +162,6 @@ public class CassandraConfiguration {
             return this;
         }
 
-        public Builder onTheFlyV1ToV2Migration(Optional<Boolean> value) {
-            value.ifPresent(this::onTheFlyV1ToV2Migration);
-            return this;
-        }
-
-        public Builder v1ToV2QueueLength(Optional<Integer> value) {
-            value.ifPresent(this::v1ToV2QueueLength);
-            return this;
-        }
-
-        public Builder v1ToV2ThreadCount(Optional<Integer> value) {
-            value.ifPresent(this::v1ToV2ThreadCount);
-            return this;
-        }
-
-        public Builder v1ReadFetchSize(Optional<Integer> value) {
-            value.ifPresent(this::v1ReadFetchSize);
-            return this;
-        }
-
         public CassandraConfiguration build() {
             return new CassandraConfiguration(aclMaxRetry.orElse(DEFAULT_ACL_MAX_RETRY),
                 messageReadChunkSize.orElse(DEFAULT_MESSAGE_CHUNK_SIZE_ON_READ),
@@ -223,11 +172,7 @@ public class CassandraConfiguration {
                 modSeqMaxRetry.orElse(DEFAULT_MODSEQ_MAX_RETRY),
                 uidMaxRetry.orElse(DEFAULT_UID_MAX_RETRY),
                 fetchNextPageInAdvanceRow.orElse(DEFAULT_FETCH_NEXT_PAGE_ADVANCE_IN_ROW),
-                blobPartSize.orElse(DEFAULT_BLOB_PART_SIZE),
-                onTheFlyV1ToV2Migration.orElse(DEFAULT_ON_THE_FLY_MIGRATION_V1_TO_V2),
-                v1ToV2QueueLength.orElse(DEFAULT_MIGRATION_V1_TO_V2_QUEUE_LENGTH),
-                v1ToV2ThreadCount.orElse(DEFAULT_MIGRATION_V1_TO_V2_THREAD_COUNT),
-                v1ReadFetchSize.orElse(DEFAULT_MIGRATION_V1_READ_FETCH_SIZE));
+                blobPartSize.orElse(DEFAULT_BLOB_PART_SIZE));
         }
     }
 
@@ -245,18 +190,12 @@ public class CassandraConfiguration {
     private final int aclMaxRetry;
     private final int fetchNextPageInAdvanceRow;
     private final int blobPartSize;
-    private final boolean onTheFlyV1ToV2Migration;
-    private final int v1ToV2QueueLength;
-    private final int v1ToV2ThreadCount;
-    private final int v1ReadFetchSize;
 
     @VisibleForTesting
     CassandraConfiguration(int aclMaxRetry, int messageReadChunkSize, int expungeChunkSize,
                            int flagsUpdateChunkSize, int flagsUpdateMessageIdMaxRetry, int flagsUpdateMessageMaxRetry,
                            int modSeqMaxRetry, int uidMaxRetry, int fetchNextPageInAdvanceRow,
-                           int blobPartSize, boolean onTheFlyV1ToV2Migration, int v1ToV2QueueLength,
-                           int v1ToV2ThreadCount, int v1ReadFetchSize
-    ) {
+                           int blobPartSize) {
         this.aclMaxRetry = aclMaxRetry;
         this.messageReadChunkSize = messageReadChunkSize;
         this.expungeChunkSize = expungeChunkSize;
@@ -267,20 +206,12 @@ public class CassandraConfiguration {
         this.fetchNextPageInAdvanceRow = fetchNextPageInAdvanceRow;
         this.flagsUpdateChunkSize = flagsUpdateChunkSize;
         this.blobPartSize = blobPartSize;
-        this.onTheFlyV1ToV2Migration = onTheFlyV1ToV2Migration;
-        this.v1ToV2QueueLength = v1ToV2QueueLength;
-        this.v1ToV2ThreadCount = v1ToV2ThreadCount;
-        this.v1ReadFetchSize = v1ReadFetchSize;
     }
 
     public int getBlobPartSize() {
         return blobPartSize;
     }
 
-    public boolean isOnTheFlyV1ToV2Migration() {
-        return onTheFlyV1ToV2Migration;
-    }
-
     public int getFlagsUpdateChunkSize() {
         return flagsUpdateChunkSize;
     }
@@ -317,18 +248,6 @@ public class CassandraConfiguration {
         return fetchNextPageInAdvanceRow;
     }
 
-    public int getV1ToV2QueueLength() {
-        return v1ToV2QueueLength;
-    }
-
-    public int getV1ToV2ThreadCount() {
-        return v1ToV2ThreadCount;
-    }
-
-    public int getV1ReadFetchSize() {
-        return v1ReadFetchSize;
-    }
-
     @Override
     public final boolean equals(Object o) {
         if (o instanceof CassandraConfiguration) {
@@ -343,11 +262,7 @@ public class CassandraConfiguration {
                 && Objects.equals(this.uidMaxRetry, that.uidMaxRetry)
                 && Objects.equals(this.flagsUpdateChunkSize, that.flagsUpdateChunkSize)
                 && Objects.equals(this.fetchNextPageInAdvanceRow, that.fetchNextPageInAdvanceRow)
-                && Objects.equals(this.blobPartSize, that.blobPartSize)
-                && Objects.equals(this.onTheFlyV1ToV2Migration, that.onTheFlyV1ToV2Migration)
-                && Objects.equals(this.v1ToV2ThreadCount, that.v1ToV2ThreadCount)
-                && Objects.equals(this.v1ToV2QueueLength, that.v1ToV2QueueLength)
-                && Objects.equals(this.v1ReadFetchSize, that.v1ReadFetchSize);
+                && Objects.equals(this.blobPartSize, that.blobPartSize);
         }
         return false;
     }
@@ -356,7 +271,7 @@ public class CassandraConfiguration {
     public final int hashCode() {
         return Objects.hash(aclMaxRetry, messageReadChunkSize, expungeChunkSize, flagsUpdateMessageIdMaxRetry,
             flagsUpdateMessageMaxRetry, modSeqMaxRetry, uidMaxRetry, fetchNextPageInAdvanceRow, flagsUpdateChunkSize,
-            blobPartSize, onTheFlyV1ToV2Migration, v1ToV2ThreadCount, v1ToV2QueueLength, v1ReadFetchSize);
+            blobPartSize);
     }
 
     @Override
@@ -372,10 +287,6 @@ public class CassandraConfiguration {
             .add("flagsUpdateChunkSize", flagsUpdateChunkSize)
             .add("uidMaxRetry", uidMaxRetry)
             .add("blobPartSize", blobPartSize)
-            .add("onTheFlyV1ToV2Migration", onTheFlyV1ToV2Migration)
-            .add("v1ToV2ThreadCount", v1ToV2ThreadCount)
-            .add("v1ToV2QueueLength", v1ToV2QueueLength)
-            .add("v1ReadFetchSize", v1ReadFetchSize)
             .toString();
     }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/51a1311f/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/CassandraConfigurationTest.java
----------------------------------------------------------------------
diff --git a/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/CassandraConfigurationTest.java b/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/CassandraConfigurationTest.java
index b38dbf8..9366b13 100644
--- a/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/CassandraConfigurationTest.java
+++ b/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/CassandraConfigurationTest.java
@@ -192,54 +192,6 @@ public class CassandraConfigurationTest {
     }
 
     @Test
-    public void v1toV2ThreadCountShouldThrowOnZero() {
-        expectedException.expect(IllegalArgumentException.class);
-
-        CassandraConfiguration.builder()
-            .v1ToV2ThreadCount(0);
-    }
-
-    @Test
-    public void v1toV2ThreadCountShouldThrowOnNegative() {
-        expectedException.expect(IllegalArgumentException.class);
-
-        CassandraConfiguration.builder()
-            .v1ToV2ThreadCount(-1);
-    }
-
-    @Test
-    public void v1toV2QueueLengthShouldThrowOnZero() {
-        expectedException.expect(IllegalArgumentException.class);
-
-        CassandraConfiguration.builder()
-            .v1ToV2QueueLength(0);
-    }
-
-    @Test
-    public void v1toV2QueueLengthShouldThrowOnNegative() {
-        expectedException.expect(IllegalArgumentException.class);
-
-        CassandraConfiguration.builder()
-            .v1ToV2QueueLength(-1);
-    }
-
-    @Test
-    public void v1ReadFetchSizeShouldThrowOnNegative() {
-        expectedException.expect(IllegalArgumentException.class);
-
-        CassandraConfiguration.builder()
-            .v1ReadFetchSize(-1);
-    }
-
-    @Test
-    public void v1ReadFetchSizeShouldThrowOnZero() {
-        expectedException.expect(IllegalArgumentException.class);
-
-        CassandraConfiguration.builder()
-            .v1ToV2QueueLength(0);
-    }
-
-    @Test
     public void builderShouldCreateTheRightObject() {
         int aclMaxRetry = 1;
         int modSeqMaxRetry = 2;
@@ -251,10 +203,6 @@ public class CassandraConfigurationTest {
         int messageReadChunkSize = 8;
         int expungeChunkSize = 9;
         int blobPartSize = 10;
-        boolean onTheFlyV1ToV2Migration = true;
-        int v1ToV2ThreadCount = 11;
-        int v1ToV2QueueLength = 12;
-        int v1ReadFetchSize = 13;
 
         CassandraConfiguration configuration = CassandraConfiguration.builder()
             .aclMaxRetry(aclMaxRetry)
@@ -267,10 +215,6 @@ public class CassandraConfigurationTest {
             .messageReadChunkSize(messageReadChunkSize)
             .expungeChunkSize(expungeChunkSize)
             .blobPartSize(blobPartSize)
-            .onTheFlyV1ToV2Migration(onTheFlyV1ToV2Migration)
-            .v1ToV2ThreadCount(v1ToV2ThreadCount)
-            .v1ToV2QueueLength(v1ToV2QueueLength)
-            .v1ReadFetchSize(v1ReadFetchSize)
             .build();
 
         softly.assertThat(configuration.getAclMaxRetry()).isEqualTo(aclMaxRetry);
@@ -283,10 +227,6 @@ public class CassandraConfigurationTest {
         softly.assertThat(configuration.getMessageReadChunkSize()).isEqualTo(messageReadChunkSize);
         softly.assertThat(configuration.getExpungeChunkSize()).isEqualTo(expungeChunkSize);
         softly.assertThat(configuration.getBlobPartSize()).isEqualTo(blobPartSize);
-        softly.assertThat(configuration.isOnTheFlyV1ToV2Migration()).isEqualTo(onTheFlyV1ToV2Migration);
-        softly.assertThat(configuration.getV1ToV2ThreadCount()).isEqualTo(v1ToV2ThreadCount);
-        softly.assertThat(configuration.getV1ToV2QueueLength()).isEqualTo(v1ToV2QueueLength);
-        softly.assertThat(configuration.getV1ReadFetchSize()).isEqualTo(v1ReadFetchSize);
     }
 
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/51a1311f/dockerfiles/run/guice/cassandra-ldap/destination/conf/cassandra.properties
----------------------------------------------------------------------
diff --git a/dockerfiles/run/guice/cassandra-ldap/destination/conf/cassandra.properties b/dockerfiles/run/guice/cassandra-ldap/destination/conf/cassandra.properties
index 9a7a175..0ce3a25 100644
--- a/dockerfiles/run/guice/cassandra-ldap/destination/conf/cassandra.properties
+++ b/dockerfiles/run/guice/cassandra-ldap/destination/conf/cassandra.properties
@@ -18,6 +18,3 @@ cassandra.retryConnection.minDelay=5000
 # chunk.size.message.read=100
 # chunk.size.expunge=100
 # mailbox.blob.part.size=102400
-# migration.v1.v2.on.the.fly=false
-# migration.v1.v2.thread.count=2
-# migration.v1.v2.queue.length=1000

http://git-wip-us.apache.org/repos/asf/james-project/blob/51a1311f/dockerfiles/run/guice/cassandra/destination/conf/cassandra.properties
----------------------------------------------------------------------
diff --git a/dockerfiles/run/guice/cassandra/destination/conf/cassandra.properties b/dockerfiles/run/guice/cassandra/destination/conf/cassandra.properties
index 61d55de..afc5915 100644
--- a/dockerfiles/run/guice/cassandra/destination/conf/cassandra.properties
+++ b/dockerfiles/run/guice/cassandra/destination/conf/cassandra.properties
@@ -27,6 +27,3 @@ cassandra.retryConnection.minDelay=5000
 # chunk.size.message.read=100
 # chunk.size.expunge=100
 # mailbox.blob.part.size=102400
-# migration.v1.v2.on.the.fly=false
-# migration.v1.v2.thread.count=2
-# migration.v1.v2.queue.length=1000

http://git-wip-us.apache.org/repos/asf/james-project/blob/51a1311f/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraSessionModule.java
----------------------------------------------------------------------
diff --git a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraSessionModule.java b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraSessionModule.java
index a9447f9..144d5d3 100644
--- a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraSessionModule.java
+++ b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraSessionModule.java
@@ -95,10 +95,6 @@ public class CassandraSessionModule extends AbstractModule {
     private static final String CHUNK_SIZE_MESSAGE_READ = "chunk.size.message.read";
     private static final String CHUNK_SIZE_EXPUNGE = "chunk.size.expunge";
     private static final String BLOB_PART_SIZE = "mailbox.blob.part.size";
-    private static final String MIGRATION_V1_V2_ON_THE_FLY = "migration.v1.v2.on.the.fly";
-    private static final String MIGRATION_V1_V2_THREAD_COUNT = "migration.v1.v2.thread.count";
-    private static final String MIGRATION_V1_V2_QUEUE_LENGTH = "migration.v1.v2.queue.length";
-    public static final String MIGRATION_V1_READ_SIZE = "migration.v1.read.fetch.size";
 
     @Override
     protected void configure() {
@@ -298,14 +294,6 @@ public class CassandraSessionModule extends AbstractModule {
                 propertiesConfiguration.getInteger(CHUNK_SIZE_EXPUNGE, null)))
             .blobPartSize(Optional.ofNullable(
                 propertiesConfiguration.getInteger(BLOB_PART_SIZE, null)))
-            .onTheFlyV1ToV2Migration(Optional.ofNullable(
-                propertiesConfiguration.getBoolean(MIGRATION_V1_V2_ON_THE_FLY, null)))
-            .v1ToV2ThreadCount(Optional.ofNullable(
-                propertiesConfiguration.getInteger(MIGRATION_V1_V2_THREAD_COUNT, null)))
-            .v1ToV2QueueLength(Optional.ofNullable(
-                propertiesConfiguration.getInteger(MIGRATION_V1_V2_QUEUE_LENGTH, null)))
-            .v1ReadFetchSize(Optional.ofNullable(
-                propertiesConfiguration.getInteger(MIGRATION_V1_READ_SIZE, null)))
             .build();
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/51a1311f/server/container/guice/cassandra-guice/src/test/java/org/apache/james/modules/mailbox/CassandraSessionModuleTest.java
----------------------------------------------------------------------
diff --git a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/modules/mailbox/CassandraSessionModuleTest.java b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/modules/mailbox/CassandraSessionModuleTest.java
index 7ccc8a8..5ed9f0f 100644
--- a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/modules/mailbox/CassandraSessionModuleTest.java
+++ b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/modules/mailbox/CassandraSessionModuleTest.java
@@ -60,10 +60,6 @@ public class CassandraSessionModuleTest {
                 .messageReadChunkSize(8)
                 .expungeChunkSize(9)
                 .blobPartSize(10)
-                .onTheFlyV1ToV2Migration(true)
-                .v1ToV2ThreadCount(11)
-                .v1ToV2QueueLength(12)
-                .v1ReadFetchSize(13)
                 .build());
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/51a1311f/server/container/guice/cassandra-guice/src/test/resources/modules/mailbox/cassandra.properties
----------------------------------------------------------------------
diff --git a/server/container/guice/cassandra-guice/src/test/resources/modules/mailbox/cassandra.properties b/server/container/guice/cassandra-guice/src/test/resources/modules/mailbox/cassandra.properties
index 54ede24..8d6c9fe 100644
--- a/server/container/guice/cassandra-guice/src/test/resources/modules/mailbox/cassandra.properties
+++ b/server/container/guice/cassandra-guice/src/test/resources/modules/mailbox/cassandra.properties
@@ -8,7 +8,3 @@ chunk.size.flags.update=7
 chunk.size.message.read=8
 chunk.size.expunge=9
 mailbox.blob.part.size=10
-migration.v1.v2.on.the.fly=true
-migration.v1.v2.thread.count=11
-migration.v1.v2.queue.length=12
-migration.v1.read.fetch.size=13

http://git-wip-us.apache.org/repos/asf/james-project/blob/51a1311f/src/site/xdoc/server/config-cassandra.xml
----------------------------------------------------------------------
diff --git a/src/site/xdoc/server/config-cassandra.xml b/src/site/xdoc/server/config-cassandra.xml
index 6b9bf24..db5f92c 100644
--- a/src/site/xdoc/server/config-cassandra.xml
+++ b/src/site/xdoc/server/config-cassandra.xml
@@ -114,13 +114,13 @@
         <dt><strong>mailbox.blob.part.size</strong></dt>
         <dd>Optional. Defaults to 102400 (100KB).<br/> Controls the size of blob parts used to store messages.</dd>
         <dt><strong>migration.v1.v2.on.the.fly</strong></dt>
-        <dd>Optional. Defaults to false.<br/> Controls wether v1 to v2 migration should be run on the fly.</dd>
+        <dd>Only available on tag cassandra_migration_v1_to_v2. Optional. Defaults to false.<br/> Controls wether v1 to v2 migration should be run on the fly.</dd>
         <dt><strong>migration.v1.v2.thread.count</strong></dt>
-        <dd>Optional. Defaults to 2.<br/> Controls the number of threads used to asynchronously migrate from v1 to v2.</dd>
+        <dd>Only available on tag cassandra_migration_v1_to_v2. Optional. Defaults to 2.<br/> Controls the number of threads used to asynchronously migrate from v1 to v2.</dd>
         <dt><strong>migration.v1.v2.queue.length</strong></dt>
-        <dd>Optional. Defaults to 1000.<br/> Controls the queue size of v1 to v2 migration task. Drops when full.</dd>
+        <dd>Only available on tag cassandra_migration_v1_to_v2. Optional. Defaults to 1000.<br/> Controls the queue size of v1 to v2 migration task. Drops when full.</dd>
         <dt><strong>migration.v1.read.fetch.size</strong></dt>
-        <dd>Optional. Defaults to 10.<br/> Controls the fetch size of the request to retrieve all messages stored in V1 during the migration process.</dd>
+        <dd>Only available on tag cassandra_migration_v1_to_v2. Optional. Defaults to 10.<br/> Controls the fetch size of the request to retrieve all messages stored in V1 during the migration process.</dd>
       </dl>
 
 


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org