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