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 2018/07/26 07:02:33 UTC

[15/27] james-project git commit: MAILBOX-342 Use CassandraModule.Builder for Cassandra mailbox

MAILBOX-342 Use CassandraModule.Builder for Cassandra mailbox


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

Branch: refs/heads/master
Commit: 45318db56b2f726eebbb6c3cf34c152811667741
Parents: c675522
Author: benwa <bt...@linagora.com>
Authored: Tue Jul 24 15:10:14 2018 +0700
Committer: benwa <bt...@linagora.com>
Committed: Thu Jul 26 13:47:39 2018 +0700

----------------------------------------------------------------------
 .../cassandra/modules/CassandraAclModule.java   |  70 +++-----
 .../modules/CassandraAnnotationModule.java      |  48 ++----
 .../modules/CassandraApplicableFlagsModule.java |  48 ++----
 .../modules/CassandraAttachmentModule.java      | 113 +++++--------
 .../modules/CassandraDeletedMessageModule.java  |  46 ++---
 .../modules/CassandraFirstUnseenModule.java     |  47 ++----
 .../modules/CassandraMailboxCounterModule.java  |  48 ++----
 .../modules/CassandraMailboxModule.java         | 105 +++++-------
 .../modules/CassandraMailboxRecentsModule.java  |  48 ++----
 .../modules/CassandraMessageModule.java         | 167 ++++++++-----------
 .../modules/CassandraModSeqModule.java          |  46 ++---
 .../cassandra/modules/CassandraQuotaModule.java | 105 +++++-------
 .../modules/CassandraRegistrationModule.java    |  53 ++----
 .../modules/CassandraSubscriptionModule.java    |  44 ++---
 .../cassandra/modules/CassandraUidModule.java   |  46 ++---
 .../CassandraCombinationManagerTest.java        |  33 +---
 .../CassandraMailboxManagerStressTest.java      |  35 +---
 .../cassandra/CassandraMailboxManagerTest.java  |  35 +---
 .../CassandraMessageIdManagerQuotaTest.java     |  35 +---
 ...CassandraMessageIdManagerSideEffectTest.java |  31 +---
 .../CassandraMessageIdManagerStorageTest.java   |  31 +---
 .../CassandraSubscriptionManagerTest.java       |   7 +-
 ...istributedMailboxDelegatingListenerTest.java |   2 +-
 ...CassandraMailboxPathRegistrerMapperTest.java |   4 +-
 .../cassandra/mail/CassandraACLMapperTest.java  |   2 +-
 .../mail/CassandraAnnotationMapperTest.java     |   2 +-
 .../mail/CassandraApplicableFlagDAOTest.java    |   2 +-
 .../mail/CassandraAttachmentDAOTest.java        |   2 +-
 .../mail/CassandraAttachmentDAOV2Test.java      |   2 +-
 .../mail/CassandraAttachmentFallbackTest.java   |   8 +-
 .../mail/CassandraAttachmentMapperTest.java     |   8 +-
 .../mail/CassandraAttachmentOwnerDAOTest.java   |   2 +-
 .../mail/CassandraDeletedMessageDAOTest.java    |   2 +-
 .../mail/CassandraFirstUnseenDAOTest.java       |   2 +-
 .../mail/CassandraGenericMailboxMapperTest.java |  12 +-
 .../mail/CassandraIndexTableHandlerTest.java    |  14 +-
 .../mail/CassandraMailboxCounterDAOTest.java    |   2 +-
 .../cassandra/mail/CassandraMailboxDAOTest.java |   4 +-
 .../CassandraMailboxManagerAttachmentTest.java  |  29 +---
 .../mail/CassandraMailboxMapperAclTest.java     |   8 +-
 .../CassandraMailboxMapperConcurrencyTest.java  |   4 +-
 .../mail/CassandraMailboxMapperTest.java        |   4 +-
 .../mail/CassandraMailboxPathDAOTest.java       |   2 +-
 .../mail/CassandraMailboxPathV2DAOTest.java     |   1 -
 .../mail/CassandraMailboxRecentDAOTest.java     |   2 +-
 .../cassandra/mail/CassandraMessageDAOTest.java |   4 +-
 .../mail/CassandraMessageIdDAOTest.java         |   2 +-
 .../mail/CassandraMessageIdMapperTest.java      |  30 +---
 .../CassandraMessageIdToImapUidDAOTest.java     |   2 +-
 .../mail/CassandraMessageMapperTest.java        |  30 +---
 .../mail/CassandraMessageMoveTest.java          |  30 +---
 ...assandraMessageWithAttachmentMapperTest.java |  30 +---
 .../mail/CassandraModSeqProviderTest.java       |   2 +-
 .../mail/CassandraUidProviderTest.java          |   2 +-
 .../mail/CassandraUserMailboxRightsDAOTest.java |  10 +-
 .../cassandra/mail/MailboxAggregateModule.java  |  55 ++++++
 .../AttachmentMessageIdCreationTest.java        |  10 +-
 .../migration/AttachmentV2MigrationTest.java    |   8 +-
 .../migration/MailboxPathV2MigrationTest.java   |   8 +-
 .../quota/CassandraCurrentQuotaManagerTest.java |   2 +-
 .../CassandraPerUserMaxQuotaManagerTest.java    |   2 +-
 .../user/CassandraSubscriptionMapperTest.java   |   2 +-
 .../cassandra/host/CassandraHostSystem.java     |  32 +---
 .../modules/mailbox/CassandraMailboxModule.java |  38 +++--
 .../modules/mailbox/CassandraQuotaModule.java   |   2 +-
 65 files changed, 532 insertions(+), 1130 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/45318db5/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 a26fb18..c6da2a5 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
@@ -23,56 +23,36 @@ import static com.datastax.driver.core.DataType.bigint;
 import static com.datastax.driver.core.DataType.text;
 import static com.datastax.driver.core.DataType.timeuuid;
 
-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.backends.cassandra.utils.CassandraConstants;
 import org.apache.james.mailbox.cassandra.table.CassandraACLTable;
 import org.apache.james.mailbox.cassandra.table.CassandraUserMailboxRightsTable;
 
 import com.datastax.driver.core.schemabuilder.SchemaBuilder;
-import com.google.common.collect.ImmutableList;
-
-public class CassandraAclModule implements CassandraModule {
-
-    private final List<CassandraTable> tables;
-    private final List<CassandraType> types;
-
-    public CassandraAclModule() {
-        tables = ImmutableList.of(
-            new CassandraTable(CassandraACLTable.TABLE_NAME,
-                SchemaBuilder.createTable(CassandraACLTable.TABLE_NAME)
-                    .ifNotExists()
-                    .addPartitionKey(CassandraACLTable.ID, timeuuid())
-                    .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))),
-            new CassandraTable(CassandraUserMailboxRightsTable.TABLE_NAME,
-                    SchemaBuilder.createTable(CassandraUserMailboxRightsTable.TABLE_NAME)
-                        .ifNotExists()
-                        .addPartitionKey(CassandraUserMailboxRightsTable.USER_NAME, text())
-                        .addClusteringColumn(CassandraUserMailboxRightsTable.MAILBOX_ID, timeuuid())
-                        .addColumn(CassandraUserMailboxRightsTable.RIGHTS, text())
-                        .withOptions()
-                        .compactionOptions(SchemaBuilder.leveledStrategy())
-                        .caching(SchemaBuilder.KeyCaching.ALL,
-                            SchemaBuilder.rows(CassandraConstants.DEFAULT_CACHED_ROW_PER_PARTITION))
-                        .comment("Denormalisation table. Allow to retrieve non personal mailboxIds a user has right on")));
-        types = ImmutableList.of();
-    }
-
-    @Override
-    public List<CassandraTable> moduleTables() {
-        return tables;
-    }
 
-    @Override
-    public List<CassandraType> moduleTypes() {
-        return types;
-    }
+public interface CassandraAclModule {
+    CassandraModule MODULE = CassandraModule
+        .builder()
+        .table(CassandraACLTable.TABLE_NAME)
+        .statement(statement -> statement
+            .ifNotExists()
+            .addPartitionKey(CassandraACLTable.ID, timeuuid())
+            .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)))
+        .table(CassandraUserMailboxRightsTable.TABLE_NAME)
+        .statement(statement -> statement
+            .ifNotExists()
+            .addPartitionKey(CassandraUserMailboxRightsTable.USER_NAME, text())
+            .addClusteringColumn(CassandraUserMailboxRightsTable.MAILBOX_ID, timeuuid())
+            .addColumn(CassandraUserMailboxRightsTable.RIGHTS, text())
+            .withOptions()
+            .compactionOptions(SchemaBuilder.leveledStrategy())
+            .caching(SchemaBuilder.KeyCaching.ALL,
+                SchemaBuilder.rows(CassandraConstants.DEFAULT_CACHED_ROW_PER_PARTITION))
+            .comment("Denormalisation table. Allow to retrieve non personal mailboxIds a user has right on"))
+        .build();
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/45318db5/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 98af388..032ac3a 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
@@ -22,45 +22,23 @@ package org.apache.james.mailbox.cassandra.modules;
 import static com.datastax.driver.core.DataType.text;
 import static com.datastax.driver.core.DataType.timeuuid;
 
-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.backends.cassandra.utils.CassandraConstants;
 import org.apache.james.mailbox.cassandra.table.CassandraAnnotationTable;
 
 import com.datastax.driver.core.schemabuilder.SchemaBuilder;
-import com.google.common.collect.ImmutableList;
-
-public class CassandraAnnotationModule implements CassandraModule {
-    private final List<CassandraTable> tables;
-    private final List<CassandraType> types;
-
-    public CassandraAnnotationModule() {
-        tables = ImmutableList.of(
-            new CassandraTable(CassandraAnnotationTable.TABLE_NAME,
-                SchemaBuilder.createTable(CassandraAnnotationTable.TABLE_NAME)
-                    .ifNotExists()
-                    .addPartitionKey(CassandraAnnotationTable.MAILBOX_ID, timeuuid())
-                    .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))));
-        types = ImmutableList.of();
-    }
-
-    @Override
-    public List<CassandraTable> moduleTables() {
-        return tables;
-    }
-
-    @Override
-    public List<CassandraType> moduleTypes() {
-        return types;
-    }
 
+public interface CassandraAnnotationModule {
+    CassandraModule MODULE = CassandraModule.table(CassandraAnnotationTable.TABLE_NAME)
+        .statement(statement -> statement
+            .ifNotExists()
+            .addPartitionKey(CassandraAnnotationTable.MAILBOX_ID, timeuuid())
+            .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)))
+        .build();
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/45318db5/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 46dea02..11e5538 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
@@ -23,46 +23,24 @@ import static com.datastax.driver.core.DataType.set;
 import static com.datastax.driver.core.DataType.text;
 import static com.datastax.driver.core.DataType.timeuuid;
 
-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.backends.cassandra.utils.CassandraConstants;
 import org.apache.james.mailbox.cassandra.table.CassandraApplicableFlagTable;
 import org.apache.james.mailbox.cassandra.table.Flag;
 
 import com.datastax.driver.core.schemabuilder.SchemaBuilder;
-import com.google.common.collect.ImmutableList;
-
-public class CassandraApplicableFlagsModule implements CassandraModule {
-    private final List<CassandraTable> tables;
-    private final List<CassandraType> types;
-
-    public CassandraApplicableFlagsModule() {
-        tables = ImmutableList.of(
-            new CassandraTable(CassandraApplicableFlagTable.TABLE_NAME,
-                SchemaBuilder.createTable(CassandraApplicableFlagTable.TABLE_NAME)
-                    .ifNotExists()
-                    .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))));
-        types = ImmutableList.of();
-    }
-
-    @Override
-    public List<CassandraTable> moduleTables() {
-        return tables;
-    }
-
-    @Override
-    public List<CassandraType> moduleTypes() {
-        return types;
-    }
 
+public interface CassandraApplicableFlagsModule {
+    CassandraModule MODULE = CassandraModule.table(CassandraApplicableFlagTable.TABLE_NAME)
+        .statement(statement -> statement
+            .ifNotExists()
+            .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)))
+        .build();
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/45318db5/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 ffaa49a..acee1f1 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
@@ -24,11 +24,7 @@ import static com.datastax.driver.core.DataType.blob;
 import static com.datastax.driver.core.DataType.text;
 import static com.datastax.driver.core.DataType.uuid;
 
-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.backends.cassandra.utils.CassandraConstants;
 import org.apache.james.mailbox.cassandra.table.CassandraAttachmentMessageIdTable;
 import org.apache.james.mailbox.cassandra.table.CassandraAttachmentOwnerTable;
@@ -36,69 +32,52 @@ import org.apache.james.mailbox.cassandra.table.CassandraAttachmentTable;
 import org.apache.james.mailbox.cassandra.table.CassandraAttachmentV2Table;
 
 import com.datastax.driver.core.schemabuilder.SchemaBuilder;
-import com.google.common.collect.ImmutableList;
-
-public class CassandraAttachmentModule implements CassandraModule {
-
-    private final List<CassandraTable> tables;
-    private final List<CassandraType> types;
-
-    public CassandraAttachmentModule() {
-        tables = ImmutableList.of(
-            new CassandraTable(CassandraAttachmentTable.TABLE_NAME,
-                SchemaBuilder.createTable(CassandraAttachmentTable.TABLE_NAME)
-                    .ifNotExists()
-                    .addPartitionKey(CassandraAttachmentTable.ID, text())
-                    .addColumn(CassandraAttachmentTable.PAYLOAD, blob())
-                    .addColumn(CassandraAttachmentTable.TYPE, text())
-                    .addColumn(CassandraAttachmentTable.SIZE, bigint())
-                    .withOptions()
-                    .comment("Holds attachment for fast attachment retrieval")),
-            new CassandraTable(CassandraAttachmentV2Table.TABLE_NAME,
-                SchemaBuilder.createTable(CassandraAttachmentV2Table.TABLE_NAME)
-                    .ifNotExists()
-                    .addPartitionKey(CassandraAttachmentV2Table.ID_AS_UUID, uuid())
-                    .addColumn(CassandraAttachmentV2Table.ID, text())
-                    .addColumn(CassandraAttachmentV2Table.BLOB_ID, text())
-                    .addColumn(CassandraAttachmentV2Table.TYPE, text())
-                    .addColumn(CassandraAttachmentV2Table.SIZE, bigint())
-                    .withOptions()
-                    .compactionOptions(SchemaBuilder.leveledStrategy())
-                    .caching(SchemaBuilder.KeyCaching.ALL,
-                        SchemaBuilder.rows(CassandraConstants.DEFAULT_CACHED_ROW_PER_PARTITION))
-                    .comment("Holds attachment for fast attachment retrieval. Content of messages is stored" +
-                        "in `blobs` and `blobparts` tables.")),
-            new CassandraTable(CassandraAttachmentMessageIdTable.TABLE_NAME,
-                SchemaBuilder.createTable(CassandraAttachmentMessageIdTable.TABLE_NAME)
-                    .ifNotExists()
-                    .addPartitionKey(CassandraAttachmentMessageIdTable.ATTACHMENT_ID_AS_UUID, uuid())
-                    .addColumn(CassandraAttachmentMessageIdTable.ATTACHMENT_ID, text())
-                    .addClusteringColumn(CassandraAttachmentMessageIdTable.MESSAGE_ID, text())
-                    .withOptions()
-                    .compactionOptions(SchemaBuilder.leveledStrategy())
-                    .caching(SchemaBuilder.KeyCaching.ALL,
-                        SchemaBuilder.rows(CassandraConstants.DEFAULT_CACHED_ROW_PER_PARTITION))
-                    .comment("Holds ids of messages owning the attachment")),
-            new CassandraTable(CassandraAttachmentOwnerTable.TABLE_NAME,
-                SchemaBuilder.createTable(CassandraAttachmentOwnerTable.TABLE_NAME)
-                    .ifNotExists()
-                    .addPartitionKey(CassandraAttachmentOwnerTable.ID, uuid())
-                    .addClusteringColumn(CassandraAttachmentOwnerTable.OWNER, text())
-                    .withOptions()
-                    .compactionOptions(SchemaBuilder.leveledStrategy())
-                    .caching(SchemaBuilder.KeyCaching.ALL,
-                        SchemaBuilder.rows(CassandraConstants.DEFAULT_CACHED_ROW_PER_PARTITION))
-                    .comment("Holds explicit owners of some attachments")));
-        types = ImmutableList.of();
-    }
 
-    @Override
-    public List<CassandraTable> moduleTables() {
-        return tables;
-    }
+public interface CassandraAttachmentModule {
 
-    @Override
-    public List<CassandraType> moduleTypes() {
-        return types;
-    }
+    CassandraModule MODULE = CassandraModule.table(CassandraAttachmentTable.TABLE_NAME)
+        .statement(statement -> statement
+            .ifNotExists()
+            .addPartitionKey(CassandraAttachmentTable.ID, text())
+            .addColumn(CassandraAttachmentTable.PAYLOAD, blob())
+            .addColumn(CassandraAttachmentTable.TYPE, text())
+            .addColumn(CassandraAttachmentTable.SIZE, bigint())
+            .withOptions()
+            .comment("Holds attachment for fast attachment retrieval"))
+        .table(CassandraAttachmentV2Table.TABLE_NAME)
+        .statement(statement -> statement
+            .ifNotExists()
+            .addPartitionKey(CassandraAttachmentV2Table.ID_AS_UUID, uuid())
+            .addColumn(CassandraAttachmentV2Table.ID, text())
+            .addColumn(CassandraAttachmentV2Table.BLOB_ID, text())
+            .addColumn(CassandraAttachmentV2Table.TYPE, text())
+            .addColumn(CassandraAttachmentV2Table.SIZE, bigint())
+            .withOptions()
+            .compactionOptions(SchemaBuilder.leveledStrategy())
+            .caching(SchemaBuilder.KeyCaching.ALL,
+                SchemaBuilder.rows(CassandraConstants.DEFAULT_CACHED_ROW_PER_PARTITION))
+            .comment("Holds attachment for fast attachment retrieval. Content of messages is stored" +
+                "in `blobs` and `blobparts` tables."))
+        .table(CassandraAttachmentMessageIdTable.TABLE_NAME)
+        .statement(statement -> statement
+            .ifNotExists()
+            .addPartitionKey(CassandraAttachmentMessageIdTable.ATTACHMENT_ID_AS_UUID, uuid())
+            .addColumn(CassandraAttachmentMessageIdTable.ATTACHMENT_ID, text())
+            .addClusteringColumn(CassandraAttachmentMessageIdTable.MESSAGE_ID, text())
+            .withOptions()
+            .compactionOptions(SchemaBuilder.leveledStrategy())
+            .caching(SchemaBuilder.KeyCaching.ALL,
+                SchemaBuilder.rows(CassandraConstants.DEFAULT_CACHED_ROW_PER_PARTITION))
+            .comment("Holds ids of messages owning the attachment"))
+        .table(CassandraAttachmentOwnerTable.TABLE_NAME)
+        .statement(statement -> statement
+            .ifNotExists()
+            .addPartitionKey(CassandraAttachmentOwnerTable.ID, uuid())
+            .addClusteringColumn(CassandraAttachmentOwnerTable.OWNER, text())
+            .withOptions()
+            .compactionOptions(SchemaBuilder.leveledStrategy())
+            .caching(SchemaBuilder.KeyCaching.ALL,
+                SchemaBuilder.rows(CassandraConstants.DEFAULT_CACHED_ROW_PER_PARTITION))
+            .comment("Holds explicit owners of some attachments"))
+        .build();
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/45318db5/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 46e99fb..b2689d9 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
@@ -23,44 +23,22 @@ import static org.apache.james.mailbox.cassandra.table.CassandraDeletedMessageTa
 import static org.apache.james.mailbox.cassandra.table.CassandraDeletedMessageTable.TABLE_NAME;
 import static org.apache.james.mailbox.cassandra.table.CassandraDeletedMessageTable.UID;
 
-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.backends.cassandra.utils.CassandraConstants;
 
 import com.datastax.driver.core.DataType;
 import com.datastax.driver.core.schemabuilder.SchemaBuilder;
-import com.google.common.collect.ImmutableList;
-
-public class CassandraDeletedMessageModule implements CassandraModule {
-
-    private final List<CassandraTable> tables;
-    private final List<CassandraType> types;
-
-    public CassandraDeletedMessageModule() {
-        tables = ImmutableList.of(new CassandraTable(TABLE_NAME,
-            SchemaBuilder.createTable(TABLE_NAME)
-                .ifNotExists()
-                .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))));
-        types = ImmutableList.of();
-    }
-
-    @Override
-    public List<CassandraTable> moduleTables() {
-        return tables;
-    }
-
-    @Override
-    public List<CassandraType> moduleTypes() {
-        return types;
-    }
 
+public interface CassandraDeletedMessageModule {
+    CassandraModule MODULE = CassandraModule.table(TABLE_NAME)
+        .statement(statement -> statement
+            .ifNotExists()
+            .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)))
+        .build();
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/45318db5/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 1af9c0f..aec22b2 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
@@ -19,45 +19,24 @@
 
 package org.apache.james.mailbox.cassandra.modules;
 
-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.backends.cassandra.utils.CassandraConstants;
 import org.apache.james.mailbox.cassandra.table.CassandraFirstUnseenTable;
 
 import com.datastax.driver.core.DataType;
 import com.datastax.driver.core.schemabuilder.SchemaBuilder;
-import com.google.common.collect.ImmutableList;
-
-public class CassandraFirstUnseenModule implements CassandraModule {
-
-    private final List<CassandraTable> tables;
-    private final List<CassandraType> types;
-
-    public CassandraFirstUnseenModule() {
-        tables = ImmutableList.of(new CassandraTable(CassandraFirstUnseenTable.TABLE_NAME,
-            SchemaBuilder.createTable(CassandraFirstUnseenTable.TABLE_NAME)
-                .ifNotExists()
-                .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))
-                .clusteringOrder(CassandraFirstUnseenTable.UID, SchemaBuilder.Direction.ASC)));
-        types = ImmutableList.of();
-    }
-
-    @Override
-    public List<CassandraTable> moduleTables() {
-        return tables;
-    }
 
-    @Override
-    public List<CassandraType> moduleTypes() {
-        return types;
-    }
+public interface CassandraFirstUnseenModule {
+    CassandraModule MODULE = CassandraModule.table(CassandraFirstUnseenTable.TABLE_NAME)
+        .statement(statement -> statement
+            .ifNotExists()
+            .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))
+            .clusteringOrder(CassandraFirstUnseenTable.UID, SchemaBuilder.Direction.ASC))
+        .build();
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/45318db5/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 5a402f3..fdeb187 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
@@ -22,45 +22,23 @@ package org.apache.james.mailbox.cassandra.modules;
 import static com.datastax.driver.core.DataType.counter;
 import static com.datastax.driver.core.DataType.timeuuid;
 
-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.backends.cassandra.utils.CassandraConstants;
 import org.apache.james.mailbox.cassandra.table.CassandraMailboxCountersTable;
 
 import com.datastax.driver.core.schemabuilder.SchemaBuilder;
-import com.google.common.collect.ImmutableList;
-
-public class CassandraMailboxCounterModule implements CassandraModule {
-
-    private final List<CassandraTable> tables;
-    private final List<CassandraType> types;
-
-    public CassandraMailboxCounterModule() {
-        tables = ImmutableList.of(
-            new CassandraTable(CassandraMailboxCountersTable.TABLE_NAME,
-                SchemaBuilder.createTable(CassandraMailboxCountersTable.TABLE_NAME)
-                    .ifNotExists()
-                    .addPartitionKey(CassandraMailboxCountersTable.MAILBOX_ID, timeuuid())
-                    .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))));
-        types = ImmutableList.of();
-    }
-
-    @Override
-    public List<CassandraTable> moduleTables() {
-        return tables;
-    }
 
-    @Override
-    public List<CassandraType> moduleTypes() {
-        return types;
-    }
+public interface CassandraMailboxCounterModule {
+    CassandraModule MODULE = CassandraModule.table(CassandraMailboxCountersTable.TABLE_NAME)
+        .statement(statement -> statement
+            .ifNotExists()
+            .addPartitionKey(CassandraMailboxCountersTable.MAILBOX_ID, timeuuid())
+            .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)))
+        .build();
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/45318db5/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 85fd62d..c9e79dd 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
@@ -23,75 +23,54 @@ import static com.datastax.driver.core.DataType.bigint;
 import static com.datastax.driver.core.DataType.text;
 import static com.datastax.driver.core.DataType.timeuuid;
 
-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.backends.cassandra.utils.CassandraConstants;
 import org.apache.james.mailbox.cassandra.table.CassandraMailboxPathTable;
 import org.apache.james.mailbox.cassandra.table.CassandraMailboxPathV2Table;
 import org.apache.james.mailbox.cassandra.table.CassandraMailboxTable;
 
 import com.datastax.driver.core.schemabuilder.SchemaBuilder;
-import com.google.common.collect.ImmutableList;
-
-public class CassandraMailboxModule implements CassandraModule {
-
-    private final List<CassandraTable> tables;
-    private final List<CassandraType> types;
-
-    public CassandraMailboxModule() {
-        tables = ImmutableList.of(
-            new CassandraTable(CassandraMailboxTable.TABLE_NAME,
-                SchemaBuilder.createTable(CassandraMailboxTable.TABLE_NAME)
-                    .ifNotExists()
-                    .addPartitionKey(CassandraMailboxTable.ID, timeuuid())
-                    .addUDTColumn(CassandraMailboxTable.MAILBOX_BASE, SchemaBuilder.frozen(CassandraMailboxTable.MAILBOX_BASE))
-                    .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,
-                SchemaBuilder.createTable(CassandraMailboxPathTable.TABLE_NAME)
-                    .ifNotExists()
-                    .addUDTPartitionKey(CassandraMailboxPathTable.NAMESPACE_AND_USER, SchemaBuilder.frozen(CassandraMailboxTable.MAILBOX_BASE))
-                    .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))),
-            new CassandraTable(CassandraMailboxPathV2Table.TABLE_NAME,
-                    SchemaBuilder.createTable(CassandraMailboxPathV2Table.TABLE_NAME)
-                        .ifNotExists()
-                        .addPartitionKey(CassandraMailboxPathV2Table.NAMESPACE, text())
-                        .addPartitionKey(CassandraMailboxPathV2Table.USER, text())
-                        .addClusteringColumn(CassandraMailboxPathV2Table.MAILBOX_NAME, text())
-                        .addColumn(CassandraMailboxPathV2Table.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(
-            new CassandraType(CassandraMailboxTable.MAILBOX_BASE,
-                SchemaBuilder.createType(CassandraMailboxTable.MAILBOX_BASE)
-                    .ifNotExists()
-                    .addColumn(CassandraMailboxTable.MailboxBase.NAMESPACE, text())
-                    .addColumn(CassandraMailboxTable.MailboxBase.USER, text())));
-    }
-
-    @Override
-    public List<CassandraTable> moduleTables() {
-        return tables;
-    }
 
-    @Override
-    public List<CassandraType> moduleTypes() {
-        return types;
-    }
+public interface CassandraMailboxModule {
+    CassandraModule MODULE = CassandraModule.builder()
+        .type(CassandraMailboxTable.MAILBOX_BASE)
+        .statement(statement -> statement
+            .ifNotExists()
+            .addColumn(CassandraMailboxTable.MailboxBase.NAMESPACE, text())
+            .addColumn(CassandraMailboxTable.MailboxBase.USER, text()))
+        .table(CassandraMailboxTable.TABLE_NAME)
+        .statement(statement -> statement
+            .ifNotExists()
+            .addPartitionKey(CassandraMailboxTable.ID, timeuuid())
+            .addUDTColumn(CassandraMailboxTable.MAILBOX_BASE, SchemaBuilder.frozen(CassandraMailboxTable.MAILBOX_BASE))
+            .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)))
+        .table(CassandraMailboxPathTable.TABLE_NAME)
+        .statement(statement -> statement
+            .ifNotExists()
+            .addUDTPartitionKey(CassandraMailboxPathTable.NAMESPACE_AND_USER, SchemaBuilder.frozen(CassandraMailboxTable.MAILBOX_BASE))
+            .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)))
+        .table(CassandraMailboxPathV2Table.TABLE_NAME)
+        .statement(statement -> statement
+            .ifNotExists()
+            .addPartitionKey(CassandraMailboxPathV2Table.NAMESPACE, text())
+            .addPartitionKey(CassandraMailboxPathV2Table.USER, text())
+            .addClusteringColumn(CassandraMailboxPathV2Table.MAILBOX_NAME, text())
+            .addColumn(CassandraMailboxPathV2Table.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)))
+        .build();
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/45318db5/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 da37060..9193470 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
@@ -22,45 +22,23 @@ package org.apache.james.mailbox.cassandra.modules;
 import static com.datastax.driver.core.DataType.bigint;
 import static com.datastax.driver.core.DataType.timeuuid;
 
-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.backends.cassandra.utils.CassandraConstants;
 import org.apache.james.mailbox.cassandra.table.CassandraMailboxRecentsTable;
 
 import com.datastax.driver.core.schemabuilder.SchemaBuilder;
-import com.google.common.collect.ImmutableList;
-
-public class CassandraMailboxRecentsModule implements CassandraModule {
-
-    private final List<CassandraTable> tables;
-    private final List<CassandraType> types;
-
-    public CassandraMailboxRecentsModule() {
-        tables = ImmutableList.of(
-            new CassandraTable(CassandraMailboxRecentsTable.TABLE_NAME,
-                SchemaBuilder.createTable(CassandraMailboxRecentsTable.TABLE_NAME)
-                    .ifNotExists()
-                    .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))));
-        types = ImmutableList.of();
-    }
-
-    @Override
-    public List<CassandraTable> moduleTables() {
-        return tables;
-    }
 
-    @Override
-    public List<CassandraType> moduleTypes() {
-        return types;
-    }
+public interface CassandraMailboxRecentsModule {
+    CassandraModule MODULE = CassandraModule.table(CassandraMailboxRecentsTable.TABLE_NAME)
+        .statement(statement -> statement
+            .ifNotExists()
+            .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)))
+        .build();
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/45318db5/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 428a45a..856736a 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
@@ -27,11 +27,7 @@ import static com.datastax.driver.core.DataType.text;
 import static com.datastax.driver.core.DataType.timestamp;
 import static com.datastax.driver.core.DataType.timeuuid;
 
-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.CassandraMessageIdTable;
 import org.apache.james.mailbox.cassandra.table.CassandraMessageIds;
 import org.apache.james.mailbox.cassandra.table.CassandraMessageV2Table;
@@ -39,96 +35,81 @@ import org.apache.james.mailbox.cassandra.table.Flag;
 import org.apache.james.mailbox.cassandra.table.MessageIdToImapUid;
 
 import com.datastax.driver.core.schemabuilder.SchemaBuilder;
-import com.google.common.collect.ImmutableList;
-
-public class CassandraMessageModule implements CassandraModule {
-
-    public static final int CACHED_MESSAGE_ID_ROWS = 1000;
-    public static final int CACHED_IMAP_UID_ROWS = 100;
-    private final List<CassandraTable> tables;
-    private final List<CassandraType> types;
 
-    public CassandraMessageModule() {
-        tables = ImmutableList.of(
-            new CassandraTable(MessageIdToImapUid.TABLE_NAME,
-                SchemaBuilder.createTable(MessageIdToImapUid.TABLE_NAME)
-                    .ifNotExists()
-                    .addPartitionKey(CassandraMessageIds.MESSAGE_ID, timeuuid())
-                    .addClusteringColumn(CassandraMessageIds.MAILBOX_ID, timeuuid())
-                    .addClusteringColumn(CassandraMessageIds.IMAP_UID, bigint())
-                    .addColumn(MessageIdToImapUid.MOD_SEQ, bigint())
-                    .addColumn(Flag.ANSWERED, cboolean())
-                    .addColumn(Flag.DELETED, cboolean())
-                    .addColumn(Flag.DRAFT, cboolean())
-                    .addColumn(Flag.FLAGGED, cboolean())
-                    .addColumn(Flag.RECENT, cboolean())
-                    .addColumn(Flag.SEEN, cboolean())
-                    .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))),
-            new CassandraTable(CassandraMessageIdTable.TABLE_NAME,
-                SchemaBuilder.createTable(CassandraMessageIdTable.TABLE_NAME)
-                    .ifNotExists()
-                    .addPartitionKey(CassandraMessageIds.MAILBOX_ID, timeuuid())
-                    .addClusteringColumn(CassandraMessageIds.IMAP_UID, bigint())
-                    .addColumn(CassandraMessageIds.MESSAGE_ID, timeuuid())
-                    .addColumn(CassandraMessageIdTable.MOD_SEQ, bigint())
-                    .addColumn(Flag.ANSWERED, cboolean())
-                    .addColumn(Flag.DELETED, cboolean())
-                    .addColumn(Flag.DRAFT, cboolean())
-                    .addColumn(Flag.FLAGGED, cboolean())
-                    .addColumn(Flag.RECENT, cboolean())
-                    .addColumn(Flag.SEEN, cboolean())
-                    .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))),
-            new CassandraTable(CassandraMessageV2Table.TABLE_NAME,
-                SchemaBuilder.createTable(CassandraMessageV2Table.TABLE_NAME)
-                    .ifNotExists()
-                    .addPartitionKey(CassandraMessageIds.MESSAGE_ID, timeuuid())
-                    .addColumn(CassandraMessageV2Table.INTERNAL_DATE, timestamp())
-                    .addColumn(CassandraMessageV2Table.BODY_START_OCTET, cint())
-                    .addColumn(CassandraMessageV2Table.BODY_OCTECTS, bigint())
-                    .addColumn(CassandraMessageV2Table.TEXTUAL_LINE_COUNT, bigint())
-                    .addColumn(CassandraMessageV2Table.FULL_CONTENT_OCTETS, bigint())
-                    .addColumn(CassandraMessageV2Table.BODY_CONTENT, text())
-                    .addColumn(CassandraMessageV2Table.HEADER_CONTENT, text())
-                    .addUDTListColumn(CassandraMessageV2Table.ATTACHMENTS, SchemaBuilder.frozen(CassandraMessageV2Table.ATTACHMENTS))
-                    .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(CassandraMessageV2Table.PROPERTIES,
-                SchemaBuilder.createType(CassandraMessageV2Table.PROPERTIES)
-                    .ifNotExists()
-                    .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(CassandraMessageV2Table.Attachments.ID, text())
-                    .addColumn(CassandraMessageV2Table.Attachments.NAME, text())
-                    .addColumn(CassandraMessageV2Table.Attachments.CID, text())
-                    .addColumn(CassandraMessageV2Table.Attachments.IS_INLINE, cboolean())));
-    }
+public interface CassandraMessageModule {
 
-    @Override
-    public List<CassandraTable> moduleTables() {
-        return tables;
-    }
+    int CACHED_MESSAGE_ID_ROWS = 1000;
+    int CACHED_IMAP_UID_ROWS = 100;
 
-    @Override
-    public List<CassandraType> moduleTypes() {
-        return types;
-    }
+    CassandraModule MODULE = CassandraModule.builder()
+        .table(CassandraMessageIdTable.TABLE_NAME)
+        .statement(statement -> statement
+            .ifNotExists()
+            .addPartitionKey(CassandraMessageIds.MAILBOX_ID, timeuuid())
+            .addClusteringColumn(CassandraMessageIds.IMAP_UID, bigint())
+            .addColumn(CassandraMessageIds.MESSAGE_ID, timeuuid())
+            .addColumn(CassandraMessageIdTable.MOD_SEQ, bigint())
+            .addColumn(Flag.ANSWERED, cboolean())
+            .addColumn(Flag.DELETED, cboolean())
+            .addColumn(Flag.DRAFT, cboolean())
+            .addColumn(Flag.FLAGGED, cboolean())
+            .addColumn(Flag.RECENT, cboolean())
+            .addColumn(Flag.SEEN, cboolean())
+            .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)))
+        .table(MessageIdToImapUid.TABLE_NAME)
+        .statement(statement -> statement
+            .ifNotExists()
+            .addPartitionKey(CassandraMessageIds.MESSAGE_ID, timeuuid())
+            .addClusteringColumn(CassandraMessageIds.MAILBOX_ID, timeuuid())
+            .addClusteringColumn(CassandraMessageIds.IMAP_UID, bigint())
+            .addColumn(MessageIdToImapUid.MOD_SEQ, bigint())
+            .addColumn(Flag.ANSWERED, cboolean())
+            .addColumn(Flag.DELETED, cboolean())
+            .addColumn(Flag.DRAFT, cboolean())
+            .addColumn(Flag.FLAGGED, cboolean())
+            .addColumn(Flag.RECENT, cboolean())
+            .addColumn(Flag.SEEN, cboolean())
+            .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)))
+        .table(CassandraMessageV2Table.TABLE_NAME)
+        .statement(statement -> statement
+            .ifNotExists()
+            .addPartitionKey(CassandraMessageIds.MESSAGE_ID, timeuuid())
+            .addColumn(CassandraMessageV2Table.INTERNAL_DATE, timestamp())
+            .addColumn(CassandraMessageV2Table.BODY_START_OCTET, cint())
+            .addColumn(CassandraMessageV2Table.BODY_OCTECTS, bigint())
+            .addColumn(CassandraMessageV2Table.TEXTUAL_LINE_COUNT, bigint())
+            .addColumn(CassandraMessageV2Table.FULL_CONTENT_OCTETS, bigint())
+            .addColumn(CassandraMessageV2Table.BODY_CONTENT, text())
+            .addColumn(CassandraMessageV2Table.HEADER_CONTENT, text())
+            .addUDTListColumn(CassandraMessageV2Table.ATTACHMENTS, SchemaBuilder.frozen(CassandraMessageV2Table.ATTACHMENTS))
+            .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."))
+        .type(CassandraMessageV2Table.PROPERTIES)
+        .statement(statement -> statement
+            .ifNotExists()
+            .addColumn(CassandraMessageV2Table.Properties.NAMESPACE, text())
+            .addColumn(CassandraMessageV2Table.Properties.NAME, text())
+            .addColumn(CassandraMessageV2Table.Properties.VALUE, text()))
+        .type(CassandraMessageV2Table.ATTACHMENTS)
+        .statement(statement -> statement
+            .ifNotExists()
+            .addColumn(CassandraMessageV2Table.Attachments.ID, text())
+            .addColumn(CassandraMessageV2Table.Attachments.NAME, text())
+            .addColumn(CassandraMessageV2Table.Attachments.CID, text())
+            .addColumn(CassandraMessageV2Table.Attachments.IS_INLINE, cboolean()))
+        .build();
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/45318db5/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 49013ab..2e0169e 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
@@ -22,44 +22,22 @@ package org.apache.james.mailbox.cassandra.modules;
 import static com.datastax.driver.core.DataType.bigint;
 import static com.datastax.driver.core.DataType.timeuuid;
 
-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.backends.cassandra.utils.CassandraConstants;
 import org.apache.james.mailbox.cassandra.table.CassandraMessageModseqTable;
 
 import com.datastax.driver.core.schemabuilder.SchemaBuilder;
-import com.google.common.collect.ImmutableList;
-
-public class CassandraModSeqModule implements CassandraModule {
-
-    private final List<CassandraTable> tables;
-    private final List<CassandraType> types;
-
-    public CassandraModSeqModule() {
-        tables = ImmutableList.of(
-            new CassandraTable(CassandraMessageModseqTable.TABLE_NAME,
-                SchemaBuilder.createTable(CassandraMessageModseqTable.TABLE_NAME)
-                    .ifNotExists()
-                    .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))));
-        types = ImmutableList.of();
-    }
-
-    @Override
-    public List<CassandraTable> moduleTables() {
-        return tables;
-    }
 
-    @Override
-    public List<CassandraType> moduleTypes() {
-        return types;
-    }
+public interface CassandraModSeqModule {
+    CassandraModule MODULE = CassandraModule.table(CassandraMessageModseqTable.TABLE_NAME)
+        .statement(statement -> statement
+            .ifNotExists()
+            .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)))
+        .build();
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/45318db5/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 73c7353..3f50395 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
@@ -23,11 +23,7 @@ import static com.datastax.driver.core.DataType.bigint;
 import static com.datastax.driver.core.DataType.counter;
 import static com.datastax.driver.core.DataType.text;
 
-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.backends.cassandra.utils.CassandraConstants;
 import org.apache.james.mailbox.cassandra.table.CassandraCurrentQuota;
 import org.apache.james.mailbox.cassandra.table.CassandraDomainMaxQuota;
@@ -35,64 +31,47 @@ import org.apache.james.mailbox.cassandra.table.CassandraGlobalMaxQuota;
 import org.apache.james.mailbox.cassandra.table.CassandraMaxQuota;
 
 import com.datastax.driver.core.schemabuilder.SchemaBuilder;
-import com.google.common.collect.ImmutableList;
-
-public class CassandraQuotaModule implements CassandraModule {
-
-    private final List<CassandraTable> tables;
-    private final List<CassandraType> types;
-
-    public CassandraQuotaModule() {
-        tables = ImmutableList.of(
-            new CassandraTable(CassandraCurrentQuota.TABLE_NAME,
-                SchemaBuilder.createTable(CassandraCurrentQuota.TABLE_NAME)
-                    .ifNotExists()
-                    .addPartitionKey(CassandraCurrentQuota.QUOTA_ROOT, text())
-                    .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,
-                SchemaBuilder.createTable(CassandraMaxQuota.TABLE_NAME)
-                    .ifNotExists()
-                    .addPartitionKey(CassandraMaxQuota.QUOTA_ROOT, text())
-                    .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(CassandraDomainMaxQuota.TABLE_NAME,
-                SchemaBuilder.createTable(CassandraDomainMaxQuota.TABLE_NAME)
-                    .ifNotExists()
-                    .addPartitionKey(CassandraDomainMaxQuota.DOMAIN, text())
-                    .addColumn(CassandraDomainMaxQuota.MESSAGE_COUNT, bigint())
-                    .addColumn(CassandraDomainMaxQuota.STORAGE, bigint())
-                    .withOptions()
-                    .comment("Holds per domain 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(CassandraGlobalMaxQuota.TABLE_NAME,
-                SchemaBuilder.createTable(CassandraGlobalMaxQuota.TABLE_NAME)
-                    .ifNotExists()
-                    .addPartitionKey(CassandraGlobalMaxQuota.TYPE, text())
-                    .addColumn(CassandraGlobalMaxQuota.VALUE, bigint())
-                    .withOptions()
-                    .comment("Holds defaults limitations definition.")
-                    .caching(SchemaBuilder.KeyCaching.ALL,
-                        SchemaBuilder.rows(CassandraConstants.DEFAULT_CACHED_ROW_PER_PARTITION))));
-        types = ImmutableList.of();
-    }
-
-    @Override
-    public List<CassandraTable> moduleTables() {
-        return tables;
-    }
 
-    @Override
-    public List<CassandraType> moduleTypes() {
-        return types;
-    }
+public interface CassandraQuotaModule {
+    CassandraModule MODULE = CassandraModule.builder()
+        .table(CassandraCurrentQuota.TABLE_NAME)
+        .statement(statement -> statement
+            .ifNotExists()
+            .addPartitionKey(CassandraCurrentQuota.QUOTA_ROOT, text())
+            .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)))
+        .table(CassandraMaxQuota.TABLE_NAME)
+        .statement(statement -> statement
+            .ifNotExists()
+            .addPartitionKey(CassandraMaxQuota.QUOTA_ROOT, text())
+            .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)))
+        .table(CassandraDomainMaxQuota.TABLE_NAME)
+        .statement(statement -> statement
+            .ifNotExists()
+            .addPartitionKey(CassandraDomainMaxQuota.DOMAIN, text())
+            .addColumn(CassandraDomainMaxQuota.MESSAGE_COUNT, bigint())
+            .addColumn(CassandraDomainMaxQuota.STORAGE, bigint())
+            .withOptions()
+            .comment("Holds per domain 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)))
+        .table(CassandraGlobalMaxQuota.TABLE_NAME)
+        .statement(statement -> statement
+            .ifNotExists()
+            .addPartitionKey(CassandraGlobalMaxQuota.TYPE, text())
+            .addColumn(CassandraGlobalMaxQuota.VALUE, bigint())
+            .withOptions()
+            .comment("Holds defaults limitations definition.")
+            .caching(SchemaBuilder.KeyCaching.ALL,
+                SchemaBuilder.rows(CassandraConstants.DEFAULT_CACHED_ROW_PER_PARTITION)))
+        .build();
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/45318db5/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraRegistrationModule.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraRegistrationModule.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraRegistrationModule.java
index bb91fd4..97e6714 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraRegistrationModule.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraRegistrationModule.java
@@ -21,46 +21,25 @@ package org.apache.james.mailbox.cassandra.modules;
 
 import static com.datastax.driver.core.DataType.text;
 
-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.CassandraMailboxPathRegisterTable;
 
 import com.datastax.driver.core.schemabuilder.SchemaBuilder;
-import com.google.common.collect.ImmutableList;
-
-public class CassandraRegistrationModule implements CassandraModule {
-
-    private final List<CassandraTable> tables;
-    private final List<CassandraType> types;
-
-    public CassandraRegistrationModule() {
-        tables = ImmutableList.of(
-            new CassandraTable(CassandraMailboxPathRegisterTable.TABLE_NAME,
-                SchemaBuilder.createTable(CassandraMailboxPathRegisterTable.TABLE_NAME)
-                    .ifNotExists()
-                    .addUDTPartitionKey(CassandraMailboxPathRegisterTable.MAILBOX_PATH, SchemaBuilder.frozen(CassandraMailboxPathRegisterTable.MAILBOX_PATH))
-                    .addClusteringColumn(CassandraMailboxPathRegisterTable.TOPIC, text())
-                    .withOptions()
-                    .compactionOptions(SchemaBuilder.dateTieredStrategy())));
-        types = ImmutableList.of(
-            new CassandraType(CassandraMailboxPathRegisterTable.MAILBOX_PATH,
-                SchemaBuilder.createType(CassandraMailboxPathRegisterTable.MAILBOX_PATH)
-                    .ifNotExists()
-                    .addColumn(CassandraMailboxPathRegisterTable.MailboxPath.NAMESPACE, text())
-                    .addColumn(CassandraMailboxPathRegisterTable.MailboxPath.NAME, text())
-                    .addColumn(CassandraMailboxPathRegisterTable.MailboxPath.USER, text())));
-    }
-
-    @Override
-    public List<CassandraTable> moduleTables() {
-        return tables;
-    }
 
-    @Override
-    public List<CassandraType> moduleTypes() {
-        return types;
-    }
+public interface CassandraRegistrationModule {
+    CassandraModule MODULE = CassandraModule.builder()
+        .type(CassandraMailboxPathRegisterTable.MAILBOX_PATH)
+        .statement(statement -> statement
+            .ifNotExists()
+            .addColumn(CassandraMailboxPathRegisterTable.MailboxPath.NAMESPACE, text())
+            .addColumn(CassandraMailboxPathRegisterTable.MailboxPath.NAME, text())
+            .addColumn(CassandraMailboxPathRegisterTable.MailboxPath.USER, text()))
+        .table(CassandraMailboxPathRegisterTable.TABLE_NAME)
+        .statement(statement -> statement
+            .ifNotExists()
+            .addUDTPartitionKey(CassandraMailboxPathRegisterTable.MAILBOX_PATH, SchemaBuilder.frozen(CassandraMailboxPathRegisterTable.MAILBOX_PATH))
+            .addClusteringColumn(CassandraMailboxPathRegisterTable.TOPIC, text())
+            .withOptions()
+            .compactionOptions(SchemaBuilder.dateTieredStrategy()))
+        .build();
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/45318db5/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 f85fe53..068da26 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
@@ -21,43 +21,23 @@ package org.apache.james.mailbox.cassandra.modules;
 
 import static com.datastax.driver.core.DataType.text;
 
-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.CassandraSubscriptionTable;
 
 import com.datastax.driver.core.schemabuilder.SchemaBuilder;
-import com.google.common.collect.ImmutableList;
-
-public class CassandraSubscriptionModule implements CassandraModule {
-
-    public static final int PER_USER_CACHED_SUBSCRIPTIONS = 100;
-    private final List<CassandraTable> tables;
-    private final List<CassandraType> types;
 
-    public CassandraSubscriptionModule() {
-        tables = ImmutableList.of(
-            new CassandraTable(CassandraSubscriptionTable.TABLE_NAME,
-                SchemaBuilder.createTable(CassandraSubscriptionTable.TABLE_NAME)
-                    .ifNotExists()
-                    .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();
-    }
+public interface CassandraSubscriptionModule {
 
-    @Override
-    public List<CassandraTable> moduleTables() {
-        return tables;
-    }
+    int PER_USER_CACHED_SUBSCRIPTIONS = 100;
 
-    @Override
-    public List<CassandraType> moduleTypes() {
-        return types;
-    }
+    CassandraModule MODULE = CassandraModule.table(CassandraSubscriptionTable.TABLE_NAME)
+        .statement(statement -> statement
+            .ifNotExists()
+            .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)))
+        .build();
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/45318db5/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 49dc902..e32d8f0 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
@@ -22,44 +22,22 @@ package org.apache.james.mailbox.cassandra.modules;
 import static com.datastax.driver.core.DataType.bigint;
 import static com.datastax.driver.core.DataType.timeuuid;
 
-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.backends.cassandra.utils.CassandraConstants;
 import org.apache.james.mailbox.cassandra.table.CassandraMessageUidTable;
 
 import com.datastax.driver.core.schemabuilder.SchemaBuilder;
-import com.google.common.collect.ImmutableList;
-
-public class CassandraUidModule implements CassandraModule {
-
-    private final List<CassandraTable> tables;
-    private final List<CassandraType> types;
-
-    public CassandraUidModule() {
-        tables = ImmutableList.of(
-            new CassandraTable(CassandraMessageUidTable.TABLE_NAME,
-                SchemaBuilder.createTable(CassandraMessageUidTable.TABLE_NAME)
-                    .ifNotExists()
-                    .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))));
-        types = ImmutableList.of();
-    }
-
-    @Override
-    public List<CassandraTable> moduleTables() {
-        return tables;
-    }
 
-    @Override
-    public List<CassandraType> moduleTypes() {
-        return types;
-    }
+public interface CassandraUidModule {
+    CassandraModule MODULE = CassandraModule.table(CassandraMessageUidTable.TABLE_NAME)
+        .statement(statement -> statement
+            .ifNotExists()
+            .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)))
+        .build();
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/45318db5/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraCombinationManagerTest.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraCombinationManagerTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraCombinationManagerTest.java
index 2ad6deb..f20e7fc 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraCombinationManagerTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraCombinationManagerTest.java
@@ -23,22 +23,8 @@ import static org.mockito.Mockito.mock;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.DockerCassandraRule;
-import org.apache.james.backends.cassandra.init.CassandraModuleComposite;
-import org.apache.james.blob.cassandra.CassandraBlobModule;
 import org.apache.james.mailbox.MailboxListener;
-import org.apache.james.mailbox.cassandra.modules.CassandraAclModule;
-import org.apache.james.mailbox.cassandra.modules.CassandraAnnotationModule;
-import org.apache.james.mailbox.cassandra.modules.CassandraApplicableFlagsModule;
-import org.apache.james.mailbox.cassandra.modules.CassandraAttachmentModule;
-import org.apache.james.mailbox.cassandra.modules.CassandraDeletedMessageModule;
-import org.apache.james.mailbox.cassandra.modules.CassandraFirstUnseenModule;
-import org.apache.james.mailbox.cassandra.modules.CassandraMailboxCounterModule;
-import org.apache.james.mailbox.cassandra.modules.CassandraMailboxModule;
-import org.apache.james.mailbox.cassandra.modules.CassandraMailboxRecentsModule;
-import org.apache.james.mailbox.cassandra.modules.CassandraMessageModule;
-import org.apache.james.mailbox.cassandra.modules.CassandraModSeqModule;
-import org.apache.james.mailbox.cassandra.modules.CassandraSubscriptionModule;
-import org.apache.james.mailbox.cassandra.modules.CassandraUidModule;
+import org.apache.james.mailbox.cassandra.mail.MailboxAggregateModule;
 import org.apache.james.mailbox.store.AbstractCombinationManagerTest;
 import org.apache.james.mailbox.store.CombinationManagerTestSystem;
 import org.apache.james.mailbox.store.event.MailboxEventDispatcher;
@@ -57,22 +43,7 @@ public class CassandraCombinationManagerTest extends AbstractCombinationManagerT
 
     @BeforeClass
     public static void setUpClass() {
-        CassandraModuleComposite modules = new CassandraModuleComposite(
-            new CassandraAclModule(),
-            new CassandraMailboxModule(),
-            new CassandraMessageModule(),
-            new CassandraBlobModule(),
-            new CassandraMailboxCounterModule(),
-            new CassandraMailboxRecentsModule(),
-            new CassandraFirstUnseenModule(),
-            new CassandraUidModule(),
-            new CassandraModSeqModule(),
-            new CassandraSubscriptionModule(),
-            new CassandraAttachmentModule(),
-            new CassandraDeletedMessageModule(),
-            new CassandraAnnotationModule(),
-            new CassandraApplicableFlagsModule());
-        cassandra = CassandraCluster.create(modules, cassandraServer.getHost());
+        cassandra = CassandraCluster.create(MailboxAggregateModule.MODULE, cassandraServer.getHost());
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/james-project/blob/45318db5/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerStressTest.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerStressTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerStressTest.java
index 33c263c..75b7b3c 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerStressTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerStressTest.java
@@ -21,24 +21,9 @@ package org.apache.james.mailbox.cassandra;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.DockerCassandraRule;
-import org.apache.james.backends.cassandra.init.CassandraModuleComposite;
-import org.apache.james.blob.cassandra.CassandraBlobModule;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxManagerStressTest;
-import org.apache.james.mailbox.cassandra.modules.CassandraAclModule;
-import org.apache.james.mailbox.cassandra.modules.CassandraAnnotationModule;
-import org.apache.james.mailbox.cassandra.modules.CassandraApplicableFlagsModule;
-import org.apache.james.mailbox.cassandra.modules.CassandraAttachmentModule;
-import org.apache.james.mailbox.cassandra.modules.CassandraDeletedMessageModule;
-import org.apache.james.mailbox.cassandra.modules.CassandraFirstUnseenModule;
-import org.apache.james.mailbox.cassandra.modules.CassandraMailboxCounterModule;
-import org.apache.james.mailbox.cassandra.modules.CassandraMailboxModule;
-import org.apache.james.mailbox.cassandra.modules.CassandraMailboxRecentsModule;
-import org.apache.james.mailbox.cassandra.modules.CassandraMessageModule;
-import org.apache.james.mailbox.cassandra.modules.CassandraModSeqModule;
-import org.apache.james.mailbox.cassandra.modules.CassandraQuotaModule;
-import org.apache.james.mailbox.cassandra.modules.CassandraSubscriptionModule;
-import org.apache.james.mailbox.cassandra.modules.CassandraUidModule;
+import org.apache.james.mailbox.cassandra.mail.MailboxAggregateModule;
 import org.junit.After;
 import org.junit.AfterClass;
 import org.junit.Before;
@@ -53,23 +38,7 @@ public class CassandraMailboxManagerStressTest extends MailboxManagerStressTest
 
     @BeforeClass
     public static void setUpClass() {
-        CassandraModuleComposite modules = new CassandraModuleComposite(
-            new CassandraAclModule(),
-            new CassandraMailboxModule(),
-            new CassandraMessageModule(),
-            new CassandraBlobModule(),
-            new CassandraMailboxCounterModule(),
-            new CassandraMailboxRecentsModule(),
-            new CassandraFirstUnseenModule(),
-            new CassandraUidModule(),
-            new CassandraModSeqModule(),
-            new CassandraSubscriptionModule(),
-            new CassandraAttachmentModule(),
-            new CassandraDeletedMessageModule(),
-            new CassandraAnnotationModule(),
-            new CassandraApplicableFlagsModule(),
-            new CassandraQuotaModule());
-        cassandra = CassandraCluster.create(modules, cassandraServer.getHost());
+        cassandra = CassandraCluster.create(MailboxAggregateModule.MODULE_WITH_QUOTA, cassandraServer.getHost());
     }
     
     @Before

http://git-wip-us.apache.org/repos/asf/james-project/blob/45318db5/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerTest.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerTest.java
index 9e7e2e0..8193bca 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerTest.java
@@ -20,24 +20,9 @@ package org.apache.james.mailbox.cassandra;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.DockerCassandraRule;
-import org.apache.james.backends.cassandra.init.CassandraModuleComposite;
-import org.apache.james.blob.cassandra.CassandraBlobModule;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxManagerTest;
-import org.apache.james.mailbox.cassandra.modules.CassandraAclModule;
-import org.apache.james.mailbox.cassandra.modules.CassandraAnnotationModule;
-import org.apache.james.mailbox.cassandra.modules.CassandraApplicableFlagsModule;
-import org.apache.james.mailbox.cassandra.modules.CassandraAttachmentModule;
-import org.apache.james.mailbox.cassandra.modules.CassandraDeletedMessageModule;
-import org.apache.james.mailbox.cassandra.modules.CassandraFirstUnseenModule;
-import org.apache.james.mailbox.cassandra.modules.CassandraMailboxCounterModule;
-import org.apache.james.mailbox.cassandra.modules.CassandraMailboxModule;
-import org.apache.james.mailbox.cassandra.modules.CassandraMailboxRecentsModule;
-import org.apache.james.mailbox.cassandra.modules.CassandraMessageModule;
-import org.apache.james.mailbox.cassandra.modules.CassandraModSeqModule;
-import org.apache.james.mailbox.cassandra.modules.CassandraQuotaModule;
-import org.apache.james.mailbox.cassandra.modules.CassandraSubscriptionModule;
-import org.apache.james.mailbox.cassandra.modules.CassandraUidModule;
+import org.apache.james.mailbox.cassandra.mail.MailboxAggregateModule;
 import org.junit.After;
 import org.junit.AfterClass;
 import org.junit.Before;
@@ -52,23 +37,7 @@ public class CassandraMailboxManagerTest extends MailboxManagerTest {
 
     @BeforeClass
     public static void setUpClass() {
-        CassandraModuleComposite modules = new CassandraModuleComposite(
-            new CassandraAclModule(),
-            new CassandraMailboxModule(),
-            new CassandraMessageModule(),
-            new CassandraBlobModule(),
-            new CassandraMailboxCounterModule(),
-            new CassandraMailboxRecentsModule(),
-            new CassandraFirstUnseenModule(),
-            new CassandraUidModule(),
-            new CassandraModSeqModule(),
-            new CassandraSubscriptionModule(),
-            new CassandraAttachmentModule(),
-            new CassandraDeletedMessageModule(),
-            new CassandraAnnotationModule(),
-            new CassandraApplicableFlagsModule(),
-            new CassandraQuotaModule());
-        cassandra = CassandraCluster.create(modules, cassandraServer.getHost());
+        cassandra = CassandraCluster.create(MailboxAggregateModule.MODULE_WITH_QUOTA, cassandraServer.getHost());
     }
 
     @Before


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