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 ad...@apache.org on 2017/02/15 13:36:04 UTC
[01/20] james-project git commit: JAMES-1925 Mailbox should expose
its path
Repository: james-project
Updated Branches:
refs/heads/master adbec1a7d -> 7f6f70823
JAMES-1925 Mailbox should expose its path
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/5c4c181c
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/5c4c181c
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/5c4c181c
Branch: refs/heads/master
Commit: 5c4c181ca5011be115fe14499c7297cf1376e59e
Parents: 28acf6f
Author: Benoit Tellier <bt...@linagora.com>
Authored: Tue Feb 14 12:01:03 2017 +0700
Committer: Antoine Duprat <ad...@linagora.com>
Committed: Wed Feb 15 12:00:17 2017 +0100
----------------------------------------------------------------------
.../apache/james/mailbox/hbase/mail/model/HBaseMailbox.java | 5 +++++
.../org/apache/james/mailbox/jcr/mail/model/JCRMailbox.java | 4 ++++
.../org/apache/james/mailbox/jpa/mail/model/JPAMailbox.java | 5 +++++
.../lucene/search/LuceneMailboxMessageSearchIndexTest.java | 6 ++++++
.../org/apache/james/mailbox/store/mail/model/Mailbox.java | 3 +++
.../james/mailbox/store/mail/model/impl/SimpleMailbox.java | 5 +++++
.../james/mailbox/store/mail/model/ListMailboxAssertTest.java | 6 ++++++
7 files changed, 34 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/james-project/blob/5c4c181c/mailbox/hbase/src/main/java/org/apache/james/mailbox/hbase/mail/model/HBaseMailbox.java
----------------------------------------------------------------------
diff --git a/mailbox/hbase/src/main/java/org/apache/james/mailbox/hbase/mail/model/HBaseMailbox.java b/mailbox/hbase/src/main/java/org/apache/james/mailbox/hbase/mail/model/HBaseMailbox.java
index ea0a360..013371e 100644
--- a/mailbox/hbase/src/main/java/org/apache/james/mailbox/hbase/mail/model/HBaseMailbox.java
+++ b/mailbox/hbase/src/main/java/org/apache/james/mailbox/hbase/mail/model/HBaseMailbox.java
@@ -59,6 +59,11 @@ public class HBaseMailbox implements Mailbox {
this.mailboxId = HBaseId.of(UUID.randomUUID());
}
+ @Override
+ public MailboxPath generateAssociatedPath() {
+ return new MailboxPath(getNamespace(), getUser(), getName());
+ }
+
/**
* @see org.apache.james.mailbox.store.mail.model.Mailbox#getMailboxId()
*/
http://git-wip-us.apache.org/repos/asf/james-project/blob/5c4c181c/mailbox/jcr/src/main/java/org/apache/james/mailbox/jcr/mail/model/JCRMailbox.java
----------------------------------------------------------------------
diff --git a/mailbox/jcr/src/main/java/org/apache/james/mailbox/jcr/mail/model/JCRMailbox.java b/mailbox/jcr/src/main/java/org/apache/james/mailbox/jcr/mail/model/JCRMailbox.java
index 0c7a51c..7b570d5 100644
--- a/mailbox/jcr/src/main/java/org/apache/james/mailbox/jcr/mail/model/JCRMailbox.java
+++ b/mailbox/jcr/src/main/java/org/apache/james/mailbox/jcr/mail/model/JCRMailbox.java
@@ -80,6 +80,10 @@ public class JCRMailbox implements Mailbox, JCRImapConstants, Persistent{
return logger;
}
+ @Override
+ public MailboxPath generateAssociatedPath() {
+ return new MailboxPath(getNamespace(), getUser(), getName());
+ }
/*
* (non-Javadoc)
http://git-wip-us.apache.org/repos/asf/james-project/blob/5c4c181c/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/JPAMailbox.java
----------------------------------------------------------------------
diff --git a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/JPAMailbox.java b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/JPAMailbox.java
index da4b354..1d16eca 100644
--- a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/JPAMailbox.java
+++ b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/JPAMailbox.java
@@ -156,6 +156,11 @@ public class JPAMailbox implements Mailbox {
}
@Override
+ public MailboxPath generateAssociatedPath() {
+ return new MailboxPath(getNamespace(), getUser(), getName());
+ }
+
+ @Override
public String toString() {
return "Mailbox ( "
+ "mailboxId = " + this.mailboxId + TAB
http://git-wip-us.apache.org/repos/asf/james-project/blob/5c4c181c/mailbox/lucene/src/test/java/org/apache/james/mailbox/lucene/search/LuceneMailboxMessageSearchIndexTest.java
----------------------------------------------------------------------
diff --git a/mailbox/lucene/src/test/java/org/apache/james/mailbox/lucene/search/LuceneMailboxMessageSearchIndexTest.java b/mailbox/lucene/src/test/java/org/apache/james/mailbox/lucene/search/LuceneMailboxMessageSearchIndexTest.java
index d8c39e2..2068cd2 100644
--- a/mailbox/lucene/src/test/java/org/apache/james/mailbox/lucene/search/LuceneMailboxMessageSearchIndexTest.java
+++ b/mailbox/lucene/src/test/java/org/apache/james/mailbox/lucene/search/LuceneMailboxMessageSearchIndexTest.java
@@ -38,6 +38,7 @@ import org.apache.james.mailbox.MessageUid;
import org.apache.james.mailbox.mock.MockMailboxSession;
import org.apache.james.mailbox.model.MailboxACL;
import org.apache.james.mailbox.model.MailboxId;
+import org.apache.james.mailbox.model.MailboxPath;
import org.apache.james.mailbox.model.MessageId;
import org.apache.james.mailbox.model.MultimailboxesSearchQuery;
import org.apache.james.mailbox.model.SearchQuery;
@@ -643,6 +644,11 @@ public class LuceneMailboxMessageSearchIndexTest {
public void setMailboxId(MailboxId id) {
}
+ @Override
+ public MailboxPath generateAssociatedPath() {
+ return new MailboxPath(getNamespace(), getUser(), getName());
+ }
+
public TestId getMailboxId() {
return id;
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/5c4c181c/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/Mailbox.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/Mailbox.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/Mailbox.java
index 9f077f3..b840534 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/Mailbox.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/Mailbox.java
@@ -21,6 +21,7 @@ package org.apache.james.mailbox.store.mail.model;
import org.apache.james.mailbox.MailboxSession;
import org.apache.james.mailbox.model.MailboxACL;
import org.apache.james.mailbox.model.MailboxId;
+import org.apache.james.mailbox.model.MailboxPath;
/**
* Models long term mailbox data.
@@ -33,6 +34,8 @@ public interface Mailbox {
*/
MailboxId getMailboxId();
+ MailboxPath generateAssociatedPath();
+
/**
* Gets the current namespace for this mailbox.
* @return not null
http://git-wip-us.apache.org/repos/asf/james-project/blob/5c4c181c/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMailbox.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMailbox.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMailbox.java
index 49b79f0..23f4ad9 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMailbox.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMailbox.java
@@ -116,6 +116,11 @@ public class SimpleMailbox implements Mailbox {
return uidValidity;
}
+ @Override
+ public MailboxPath generateAssociatedPath() {
+ return new MailboxPath(getNamespace(), getUser(), getName());
+ }
+
/**
* @see java.lang.Object#equals(java.lang.Object)
*/
http://git-wip-us.apache.org/repos/asf/james-project/blob/5c4c181c/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/ListMailboxAssertTest.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/ListMailboxAssertTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/ListMailboxAssertTest.java
index 6e8e408..be5fef4 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/ListMailboxAssertTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/ListMailboxAssertTest.java
@@ -66,6 +66,12 @@ public class ListMailboxAssertTest {
private Mailbox createMailbox(final String namespace, final String user, final String name, final long uid_validity) {
return new Mailbox() {
+
+ @Override
+ public MailboxPath generateAssociatedPath() {
+ return new MailboxPath(getNamespace(), getUser(), getName());
+ }
+
@Override
public void setUser(String user) {
}
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org
[17/20] james-project git commit: JAMES-1925 Fix Eclipse warnings
Posted by ad...@apache.org.
JAMES-1925 Fix Eclipse warnings
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/8e9e40a8
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/8e9e40a8
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/8e9e40a8
Branch: refs/heads/master
Commit: 8e9e40a847c0a652c137786d67490ee6a31cb494
Parents: f518297
Author: Antoine Duprat <ad...@linagora.com>
Authored: Wed Feb 15 11:57:41 2017 +0100
Committer: Antoine Duprat <ad...@linagora.com>
Committed: Wed Feb 15 13:12:39 2017 +0100
----------------------------------------------------------------------
.../CassandraMailboxSessionMapperFactory.java | 11 +++--------
.../cassandra/modules/CassandraMailboxModule.java | 16 +++++++---------
.../cassandra/CassandraMailboxManagerTest.java | 1 -
.../cassandra/CassandraSubscriptionManagerTest.java | 1 -
.../cassandra/CassandraTestSystemFixture.java | 1 -
.../mail/CassandraMailboxManagerAttachmentTest.java | 1 -
.../cassandra/mail/CassandraMapperProvider.java | 1 -
.../james/mailbox/store/StoreMessageIdManager.java | 1 -
.../james/mailbox/store/quota/QuotaChecker.java | 1 -
.../imapmailbox/cassandra/CassandraMailboxTest.java | 2 +-
.../cassandra/host/CassandraHostSystem.java | 2 +-
.../apache/james/util/CompletableFutureUtil.java | 2 +-
.../apache/james/util/OptionalConverterTest.java | 1 -
13 files changed, 13 insertions(+), 28 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/james-project/blob/8e9e40a8/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 9d41a9c..07e51e7 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
@@ -22,7 +22,6 @@ package org.apache.james.mailbox.cassandra;
import javax.inject.Inject;
import javax.inject.Named;
-import org.apache.james.backends.cassandra.init.CassandraTypesProvider;
import org.apache.james.mailbox.MailboxSession;
import org.apache.james.mailbox.cassandra.mail.CassandraAnnotationMapper;
import org.apache.james.mailbox.cassandra.mail.CassandraAttachmentMapper;
@@ -60,7 +59,6 @@ public class CassandraMailboxSessionMapperFactory extends MailboxSessionMapperFa
private final Session session;
private final UidProvider uidProvider;
private final ModSeqProvider modSeqProvider;
- private final CassandraTypesProvider typesProvider;
private final CassandraMessageDAO messageDAO;
private final CassandraMessageIdDAO messageIdDAO;
private final CassandraMessageIdToImapUidDAO imapUidDAO;
@@ -72,8 +70,7 @@ public class CassandraMailboxSessionMapperFactory extends MailboxSessionMapperFa
private int maxRetry;
@Inject
- public CassandraMailboxSessionMapperFactory(UidProvider uidProvider, ModSeqProvider modSeqProvider,
- Session session, CassandraTypesProvider typesProvider,
+ public CassandraMailboxSessionMapperFactory(UidProvider uidProvider, ModSeqProvider modSeqProvider, Session session,
CassandraMessageDAO messageDAO, CassandraMessageIdDAO messageIdDAO, CassandraMessageIdToImapUidDAO imapUidDAO,
CassandraMailboxCounterDAO mailboxCounterDAO, CassandraMailboxRecentsDAO mailboxRecentsDAO, CassandraMailboxDAO mailboxDAO,
CassandraMailboxPathDAO mailboxPathDAO, @Named(CassandraMailboxDAO.MAX_ACL_RETRY) Integer maxRetry) {
@@ -89,15 +86,13 @@ public class CassandraMailboxSessionMapperFactory extends MailboxSessionMapperFa
this.mailboxPathDAO = mailboxPathDAO;
this.indexTableHandler = new CassandraIndexTableHandler(mailboxRecentsDAO, mailboxCounterDAO);
this.maxRetry = maxRetry;
- this.typesProvider = typesProvider;
}
- public CassandraMailboxSessionMapperFactory(UidProvider uidProvider, ModSeqProvider modSeqProvider,
- Session session, CassandraTypesProvider typesProvider,
+ public CassandraMailboxSessionMapperFactory(UidProvider uidProvider, ModSeqProvider modSeqProvider, Session session,
CassandraMessageDAO messageDAO, CassandraMessageIdDAO messageIdDAO, CassandraMessageIdToImapUidDAO imapUidDAO,
CassandraMailboxCounterDAO mailboxCounterDAO, CassandraMailboxRecentsDAO mailboxRecentsDAO, CassandraMailboxDAO mailboxDAO,
CassandraMailboxPathDAO mailboxPathDAO) {
- this(uidProvider, modSeqProvider, session, typesProvider, messageDAO, messageIdDAO, imapUidDAO, mailboxCounterDAO,
+ this(uidProvider, modSeqProvider, session, messageDAO, messageIdDAO, imapUidDAO, mailboxCounterDAO,
mailboxRecentsDAO, mailboxDAO, mailboxPathDAO, DEFAULT_MAX_RETRY);
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/8e9e40a8/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 566992a..80ec6a1 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
@@ -19,8 +19,11 @@
package org.apache.james.mailbox.cassandra.modules;
-import com.datastax.driver.core.schemabuilder.SchemaBuilder;
-import com.google.common.collect.ImmutableList;
+import static com.datastax.driver.core.DataType.bigint;
+import static com.datastax.driver.core.DataType.text;
+import static com.datastax.driver.core.DataType.timeuuid;
+
+import java.util.List;
import org.apache.james.backends.cassandra.components.CassandraIndex;
import org.apache.james.backends.cassandra.components.CassandraModule;
@@ -29,13 +32,8 @@ import org.apache.james.backends.cassandra.components.CassandraType;
import org.apache.james.mailbox.cassandra.table.CassandraMailboxPathTable;
import org.apache.james.mailbox.cassandra.table.CassandraMailboxTable;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import static com.datastax.driver.core.DataType.bigint;
-import static com.datastax.driver.core.DataType.text;
-import static com.datastax.driver.core.DataType.timeuuid;
+import com.datastax.driver.core.schemabuilder.SchemaBuilder;
+import com.google.common.collect.ImmutableList;
public class CassandraMailboxModule implements CassandraModule {
http://git-wip-us.apache.org/repos/asf/james-project/blob/8e9e40a8/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerTest.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerTest.java
index ab76b26..1a57076 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerTest.java
@@ -94,7 +94,6 @@ public class CassandraMailboxManagerTest {
CassandraMailboxSessionMapperFactory mapperFactory = new CassandraMailboxSessionMapperFactory(uidProvider,
modSeqProvider,
CASSANDRA.getConf(),
- CASSANDRA.getTypesProvider(),
messageDAO,
messageIdDAO,
imapUidDAO,
http://git-wip-us.apache.org/repos/asf/james-project/blob/8e9e40a8/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 246b28d..29c0785 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
@@ -58,7 +58,6 @@ public class CassandraSubscriptionManagerTest extends AbstractSubscriptionManage
new CassandraUidProvider(cassandra.getConf()),
new CassandraModSeqProvider(cassandra.getConf()),
cassandra.getConf(),
- cassandra.getTypesProvider(),
messageDAO,
messageIdDAO,
imapUidDAO,
http://git-wip-us.apache.org/repos/asf/james-project/blob/8e9e40a8/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 c18d540..a6f6214 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
@@ -80,7 +80,6 @@ public class CassandraTestSystemFixture {
return new CassandraMailboxSessionMapperFactory(uidProvider,
modSeqProvider,
CASSANDRA.getConf(),
- CASSANDRA.getTypesProvider(),
messageDAO,
messageIdDAO,
imapUidDAO,
http://git-wip-us.apache.org/repos/asf/james-project/blob/8e9e40a8/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 56f862d..e220626 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
@@ -68,7 +68,6 @@ public class CassandraMailboxManagerAttachmentTest extends AbstractMailboxManage
new CassandraUidProvider(cassandra.getConf()),
new CassandraModSeqProvider(cassandra.getConf()),
cassandra.getConf(),
- cassandra.getTypesProvider(),
new CassandraMessageDAO(cassandra.getConf(), cassandra.getTypesProvider(), messageIdFactory),
new CassandraMessageIdDAO(cassandra.getConf(), messageIdFactory),
new CassandraMessageIdToImapUidDAO(cassandra.getConf(), messageIdFactory),
http://git-wip-us.apache.org/repos/asf/james-project/blob/8e9e40a8/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 0342f18..a43fb88 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
@@ -102,7 +102,6 @@ public class CassandraMapperProvider implements MapperProvider {
new CassandraUidProvider(cassandra.getConf()),
cassandraModSeqProvider,
cassandra.getConf(),
- cassandra.getTypesProvider(),
new CassandraMessageDAO(cassandra.getConf(), cassandra.getTypesProvider(), MESSAGE_ID_FACTORY),
new CassandraMessageIdDAO(cassandra.getConf(), MESSAGE_ID_FACTORY),
new CassandraMessageIdToImapUidDAO(cassandra.getConf(), MESSAGE_ID_FACTORY),
http://git-wip-us.apache.org/repos/asf/james-project/blob/8e9e40a8/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageIdManager.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageIdManager.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageIdManager.java
index cde6f3b..2a63dd5 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageIdManager.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageIdManager.java
@@ -37,7 +37,6 @@ import org.apache.james.mailbox.MessageUid;
import org.apache.james.mailbox.exception.MailboxException;
import org.apache.james.mailbox.exception.MailboxNotFoundException;
import org.apache.james.mailbox.model.MailboxId;
-import org.apache.james.mailbox.model.MailboxPath;
import org.apache.james.mailbox.model.MessageAttachment;
import org.apache.james.mailbox.model.MessageId;
import org.apache.james.mailbox.model.MessageMetaData;
http://git-wip-us.apache.org/repos/asf/james-project/blob/8e9e40a8/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/QuotaChecker.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/QuotaChecker.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/QuotaChecker.java
index c5a73b4..25e768d 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/QuotaChecker.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/QuotaChecker.java
@@ -21,7 +21,6 @@ package org.apache.james.mailbox.store.quota;
import org.apache.james.mailbox.exception.MailboxException;
import org.apache.james.mailbox.exception.OverQuotaException;
-import org.apache.james.mailbox.model.MailboxPath;
import org.apache.james.mailbox.model.Quota;
import org.apache.james.mailbox.model.QuotaRoot;
import org.apache.james.mailbox.quota.QuotaManager;
http://git-wip-us.apache.org/repos/asf/james-project/blob/8e9e40a8/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/CassandraMailboxTest.java
----------------------------------------------------------------------
diff --git a/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/CassandraMailboxTest.java b/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/CassandraMailboxTest.java
index cc4d60d..ee8d4c9 100644
--- a/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/CassandraMailboxTest.java
+++ b/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/CassandraMailboxTest.java
@@ -20,7 +20,6 @@
package org.apache.james.mpt.imapmailbox.cassandra;
import org.apache.james.mpt.imapmailbox.AbstractMailboxTest;
-import org.apache.james.mpt.imapmailbox.suite.MailboxWithLongNameError;
import org.apache.james.mpt.imapmailbox.suite.AuthenticatePlain;
import org.apache.james.mpt.imapmailbox.suite.AuthenticatedState;
import org.apache.james.mpt.imapmailbox.suite.ConcurrentSessions;
@@ -32,6 +31,7 @@ import org.apache.james.mpt.imapmailbox.suite.FetchBodyStructure;
import org.apache.james.mpt.imapmailbox.suite.FetchHeaders;
import org.apache.james.mpt.imapmailbox.suite.Listing;
import org.apache.james.mpt.imapmailbox.suite.MailboxAnnotation;
+import org.apache.james.mpt.imapmailbox.suite.MailboxWithLongNameError;
import org.apache.james.mpt.imapmailbox.suite.Move;
import org.apache.james.mpt.imapmailbox.suite.NonAuthenticatedState;
import org.apache.james.mpt.imapmailbox.suite.PartialFetch;
http://git-wip-us.apache.org/repos/asf/james-project/blob/8e9e40a8/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 971139b..ea3e2ae 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
@@ -104,7 +104,7 @@ public class CassandraHostSystem extends JamesImapHostSystem {
CassandraMailboxPathDAO mailboxPathDAO = new CassandraMailboxPathDAO(session, typesProvider);
CassandraMailboxSessionMapperFactory mapperFactory = new CassandraMailboxSessionMapperFactory(uidProvider, modSeqProvider,
- session, typesProvider, messageDAO, messageIdDAO, imapUidDAO, mailboxCounterDAO, mailboxRecentsDAO, mailboxDAO, mailboxPathDAO);
+ session, messageDAO, messageIdDAO, imapUidDAO, mailboxCounterDAO, mailboxRecentsDAO, mailboxDAO, mailboxPathDAO);
mailboxManager = new CassandraMailboxManager(mapperFactory, authenticator, authorizator, new JVMMailboxPathLocker(), new MessageParser(), messageIdFactory);
QuotaRootResolver quotaRootResolver = new DefaultQuotaRootResolver(mapperFactory);
http://git-wip-us.apache.org/repos/asf/james-project/blob/8e9e40a8/server/container/util-java8/src/main/java/org/apache/james/util/CompletableFutureUtil.java
----------------------------------------------------------------------
diff --git a/server/container/util-java8/src/main/java/org/apache/james/util/CompletableFutureUtil.java b/server/container/util-java8/src/main/java/org/apache/james/util/CompletableFutureUtil.java
index 2d114ab..651e1c6 100644
--- a/server/container/util-java8/src/main/java/org/apache/james/util/CompletableFutureUtil.java
+++ b/server/container/util-java8/src/main/java/org/apache/james/util/CompletableFutureUtil.java
@@ -26,7 +26,7 @@ public class CompletableFutureUtil {
public static <T> CompletableFuture<Stream<T>> allOf(Stream<CompletableFuture<T>> futureStream) {
return futureStream
- .map(future -> future.thenApply(Stream::of))
+ .map((CompletableFuture<T> future) -> future.thenApply(Stream::of))
.reduce((future1, future2) ->
future1.thenCompose(
stream1 -> future2.thenCompose(
http://git-wip-us.apache.org/repos/asf/james-project/blob/8e9e40a8/server/container/util-java8/src/test/java/org/apache/james/util/OptionalConverterTest.java
----------------------------------------------------------------------
diff --git a/server/container/util-java8/src/test/java/org/apache/james/util/OptionalConverterTest.java b/server/container/util-java8/src/test/java/org/apache/james/util/OptionalConverterTest.java
index 5356f63..baa3aa0 100644
--- a/server/container/util-java8/src/test/java/org/apache/james/util/OptionalConverterTest.java
+++ b/server/container/util-java8/src/test/java/org/apache/james/util/OptionalConverterTest.java
@@ -21,7 +21,6 @@ package org.apache.james.util;
import static org.assertj.core.api.Assertions.assertThat;
import java.util.Optional;
-import java.util.stream.Collectors;
import org.junit.Rule;
import org.junit.Test;
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org
[07/20] james-project git commit: JAMES-1925 Rely on
mailbox::gererateAssociatedMailboxPath where we can
Posted by ad...@apache.org.
JAMES-1925 Rely on mailbox::gererateAssociatedMailboxPath where we can
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/0ac25301
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/0ac25301
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/0ac25301
Branch: refs/heads/master
Commit: 0ac2530127013530513014f881a4369aa658f9d9
Parents: 5c4c181
Author: Benoit Tellier <bt...@linagora.com>
Authored: Tue Feb 14 12:08:57 2017 +0700
Committer: Antoine Duprat <ad...@linagora.com>
Committed: Wed Feb 15 13:12:37 2017 +0100
----------------------------------------------------------------------
.../java/org/apache/james/mailbox/model/MailboxPath.java | 2 --
.../mailbox/caching/guava/GuavaMailboxByPathCache.java | 2 +-
.../org/apache/james/mailbox/maildir/MaildirStore.java | 2 +-
.../apache/james/mailbox/store/StoreMailboxManager.java | 2 +-
.../org/apache/james/mailbox/store/StoreMailboxPath.java | 2 +-
.../james/mailbox/store/StoreMessageIdManager.java | 2 +-
.../mailbox/store/quota/DefaultQuotaRootResolver.java | 2 +-
.../apache/james/mailbox/store/quota/QuotaChecker.java | 2 +-
.../james/mailbox/store/MailboxEventDispatcherTest.java | 11 +++++++----
.../store/event/MailboxAnnotationListenerTest.java | 10 ++++++++--
10 files changed, 22 insertions(+), 15 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/james-project/blob/0ac25301/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxPath.java
----------------------------------------------------------------------
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxPath.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxPath.java
index 9bedf42..3654dfb 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxPath.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxPath.java
@@ -32,8 +32,6 @@ public class MailboxPath {
private String namespace;
private String user;
private String name;
-
-
public MailboxPath(String namespace, String user, String name) {
if (namespace == null || namespace.equals("")) {
http://git-wip-us.apache.org/repos/asf/james-project/blob/0ac25301/mailbox/caching/src/main/java/org/apache/james/mailbox/caching/guava/GuavaMailboxByPathCache.java
----------------------------------------------------------------------
diff --git a/mailbox/caching/src/main/java/org/apache/james/mailbox/caching/guava/GuavaMailboxByPathCache.java b/mailbox/caching/src/main/java/org/apache/james/mailbox/caching/guava/GuavaMailboxByPathCache.java
index c6b4e29..f893b91 100644
--- a/mailbox/caching/src/main/java/org/apache/james/mailbox/caching/guava/GuavaMailboxByPathCache.java
+++ b/mailbox/caching/src/main/java/org/apache/james/mailbox/caching/guava/GuavaMailboxByPathCache.java
@@ -48,7 +48,7 @@ public class GuavaMailboxByPathCache extends AbstractGuavaCache implements Mailb
@Override
public void invalidate(Mailbox mailbox) {
- invalidate(new MailboxPath(mailbox.getNamespace(), mailbox.getUser(), mailbox.getName()));
+ invalidate(mailbox.generateAssociatedPath());
}
@Override
http://git-wip-us.apache.org/repos/asf/james-project/blob/0ac25301/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirStore.java
----------------------------------------------------------------------
diff --git a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirStore.java b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirStore.java
index 0c7e4da..bbb9244 100644
--- a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirStore.java
+++ b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirStore.java
@@ -85,7 +85,7 @@ public class MaildirStore implements UidProvider, ModSeqProvider {
* @return The MaildirFolder
*/
public MaildirFolder createMaildirFolder(Mailbox mailbox) {
- MaildirFolder mf = new MaildirFolder(getFolderName(mailbox), new MailboxPath(mailbox.getNamespace(), mailbox.getUser(), mailbox.getName()), locker);
+ MaildirFolder mf = new MaildirFolder(getFolderName(mailbox), mailbox.generateAssociatedPath(), locker);
mf.setMessageNameStrictParse(isMessageNameStrictParse());
return mf;
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/0ac25301/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
index 0175215..e426ebb 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
@@ -791,7 +791,7 @@ public class StoreMailboxManager implements MailboxManager {
List<MailboxPath> mList = new ArrayList<MailboxPath>();
List<Mailbox> mailboxes = mailboxSessionMapperFactory.getMailboxMapper(session).list();
for (Mailbox m : mailboxes) {
- mList.add(new MailboxPath(m.getNamespace(), m.getUser(), m.getName()));
+ mList.add(m.generateAssociatedPath());
}
return Collections.unmodifiableList(mList);
http://git-wip-us.apache.org/repos/asf/james-project/blob/0ac25301/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxPath.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxPath.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxPath.java
index 2e905c2..85fff49 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxPath.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxPath.java
@@ -37,7 +37,7 @@ public class StoreMailboxPath extends MailboxPath {
}
public StoreMailboxPath(Mailbox mailbox) {
- super(mailbox.getNamespace(), mailbox.getUser(), mailbox.getName());
+ super(mailbox.generateAssociatedPath());
}
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/0ac25301/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageIdManager.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageIdManager.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageIdManager.java
index 6f436a1..cde6f3b 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageIdManager.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageIdManager.java
@@ -215,7 +215,7 @@ public class StoreMessageIdManager implements MessageIdManager {
private QuotaRoot retrieveQuotaRoot(MailboxMapper mailboxMapper, MailboxId mailboxId) throws MailboxException {
Mailbox mailbox = mailboxMapper.findMailboxById(mailboxId);
- return quotaRootResolver.getQuotaRoot(new MailboxPath(mailbox.getNamespace(), mailbox.getUser(), mailbox.getName()));
+ return quotaRootResolver.getQuotaRoot(mailbox.generateAssociatedPath());
}
private void addMessageToMailboxes(MessageIdMapper messageIdMapper, MailboxMessage mailboxMessage, SetView<MailboxId> mailboxIds, MailboxSession mailboxSession) throws MailboxException {
http://git-wip-us.apache.org/repos/asf/james-project/blob/0ac25301/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/DefaultQuotaRootResolver.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/DefaultQuotaRootResolver.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/DefaultQuotaRootResolver.java
index 7dbf12e..1e49b7d 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/DefaultQuotaRootResolver.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/DefaultQuotaRootResolver.java
@@ -71,7 +71,7 @@ public class DefaultQuotaRootResolver implements QuotaRootResolver {
new Function<Mailbox, MailboxPath>() {
@Override
public MailboxPath apply(Mailbox idMailbox) {
- return new MailboxPath(idMailbox.getNamespace(), idMailbox.getUser(), idMailbox.getName());
+ return idMailbox.generateAssociatedPath();
}
});
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/0ac25301/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/QuotaChecker.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/QuotaChecker.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/QuotaChecker.java
index 2887086..c5a73b4 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/QuotaChecker.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/QuotaChecker.java
@@ -35,7 +35,7 @@ public class QuotaChecker {
private final QuotaRoot quotaRoot;
public QuotaChecker(QuotaManager quotaManager, QuotaRootResolver quotaRootResolver, Mailbox mailbox) throws MailboxException {
- this.quotaRoot = quotaRootResolver.getQuotaRoot(new MailboxPath(mailbox.getNamespace(), mailbox.getUser(), mailbox.getName()));
+ this.quotaRoot = quotaRootResolver.getQuotaRoot(mailbox.generateAssociatedPath());
this.messageQuota = quotaManager.getMessageQuota(quotaRoot);
this.sizeQuota = quotaManager.getStorageQuota(quotaRoot);
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/0ac25301/mailbox/store/src/test/java/org/apache/james/mailbox/store/MailboxEventDispatcherTest.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/MailboxEventDispatcherTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/MailboxEventDispatcherTest.java
index 552ac21..179d2f6 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/MailboxEventDispatcherTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/MailboxEventDispatcherTest.java
@@ -30,10 +30,14 @@ import org.apache.james.mailbox.MailboxListener;
import org.apache.james.mailbox.MailboxSession;
import org.apache.james.mailbox.MessageUid;
import org.apache.james.mailbox.mock.MockMailboxSession;
+import org.apache.james.mailbox.model.MailboxConstants;
+import org.apache.james.mailbox.model.MailboxPath;
import org.apache.james.mailbox.model.MessageResult;
+import org.apache.james.mailbox.model.TestId;
import org.apache.james.mailbox.model.UpdatedFlags;
import org.apache.james.mailbox.store.event.MailboxEventDispatcher;
import org.apache.james.mailbox.store.mail.model.Mailbox;
+import org.apache.james.mailbox.store.mail.model.impl.SimpleMailbox;
import org.apache.james.mailbox.util.EventCollector;
import org.assertj.core.api.Condition;
import org.junit.Before;
@@ -50,6 +54,8 @@ public class MailboxEventDispatcherTest {
return event instanceof MailboxListener.FlagsUpdated;
}
};
+ public static final TestId MAILBOX_ID = TestId.of(147L);
+ public static final int UID_VALIDITY = 145;
private MailboxEventDispatcher dispatcher;
private EventCollector collector;
@@ -69,12 +75,9 @@ public class MailboxEventDispatcherTest {
dispatcher = MailboxEventDispatcher.ofListener(collector);
result = mock(MessageResult.class);
- mailbox = mock(Mailbox.class);
+ mailbox = new SimpleMailbox(new MailboxPath(MailboxConstants.USER_NAMESPACE, "user", "name"), UID_VALIDITY, MAILBOX_ID);
when(result.getUid()).thenReturn(MessageUid.of(23));
- when(mailbox.getNamespace()).thenReturn("namespace");
- when(mailbox.getUser()).thenReturn("user");
- when(mailbox.getName()).thenReturn("name");
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/0ac25301/mailbox/store/src/test/java/org/apache/james/mailbox/store/event/MailboxAnnotationListenerTest.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/event/MailboxAnnotationListenerTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/event/MailboxAnnotationListenerTest.java
index fec0d22..5c94a3e 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/event/MailboxAnnotationListenerTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/event/MailboxAnnotationListenerTest.java
@@ -31,11 +31,14 @@ import org.apache.james.mailbox.MailboxSession;
import org.apache.james.mailbox.mock.MockMailboxSession;
import org.apache.james.mailbox.model.MailboxAnnotation;
import org.apache.james.mailbox.model.MailboxAnnotationKey;
+import org.apache.james.mailbox.model.MailboxConstants;
import org.apache.james.mailbox.model.MailboxId;
import org.apache.james.mailbox.model.MailboxPath;
+import org.apache.james.mailbox.model.TestId;
import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
import org.apache.james.mailbox.store.mail.AnnotationMapper;
import org.apache.james.mailbox.store.mail.model.Mailbox;
+import org.apache.james.mailbox.store.mail.model.impl.SimpleMailbox;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
@@ -54,12 +57,14 @@ public class MailboxAnnotationListenerTest {
private static final MailboxAnnotation SHARED_ANNOTATION = MailboxAnnotation.newInstance(SHARED_KEY, "My shared comment");
private static final List<MailboxAnnotation> ANNOTATIONS = ImmutableList.of(PRIVATE_ANNOTATION, SHARED_ANNOTATION);
+ public static final int UID_VALIDITY = 145;
+ public static final TestId MAILBOX_ID = TestId.of(45);
@Mock private MailboxSessionMapperFactory mailboxSessionMapperFactory;
@Mock private AnnotationMapper annotationMapper;
- @Mock private Mailbox mailbox;
@Mock private MailboxId mailboxId;
+ private Mailbox mailbox;
private EventFactory eventFactory;
private MailboxAnnotationListener listener;
private MailboxListener.Event deleteEvent;
@@ -69,9 +74,10 @@ public class MailboxAnnotationListenerTest {
MockitoAnnotations.initMocks(this);
listener = new MailboxAnnotationListener(mailboxSessionMapperFactory);
eventFactory = new EventFactory();
+ mailbox = new SimpleMailbox(new MailboxPath(MailboxConstants.USER_NAMESPACE, "user", "name"), UID_VALIDITY, mailboxId);
+
deleteEvent = eventFactory.mailboxDeleted(mailboxSession, mailbox);
- when(mailbox.getMailboxId()).thenReturn(mailboxId);
when(mailboxSessionMapperFactory.getAnnotationMapper(eq(deleteEvent.getSession()))).thenReturn(annotationMapper);
}
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org
[18/20] james-project git commit: JAMES-1925 Adding test for
CassandraMailboxMapper upon concurrency
Posted by ad...@apache.org.
JAMES-1925 Adding test for CassandraMailboxMapper upon concurrency
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/09934b1f
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/09934b1f
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/09934b1f
Branch: refs/heads/master
Commit: 09934b1fe006db1302f4d3b9379d393b5cfdba6d
Parents: 3a8d407
Author: Benoit Tellier <bt...@linagora.com>
Authored: Tue Feb 14 19:04:29 2017 +0700
Committer: Antoine Duprat <ad...@linagora.com>
Committed: Wed Feb 15 13:12:39 2017 +0100
----------------------------------------------------------------------
.../CassandraMailboxMapperConcurrencyTest.java | 27 +++++++++++++++++++-
1 file changed, 26 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/james-project/blob/09934b1f/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapperConcurrencyTest.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapperConcurrencyTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapperConcurrencyTest.java
index b6612be..14363c6 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapperConcurrencyTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapperConcurrencyTest.java
@@ -21,6 +21,7 @@ package org.apache.james.mailbox.cassandra.mail;
import static org.assertj.core.api.Assertions.assertThat;
+import java.util.List;
import java.util.concurrent.TimeUnit;
import org.apache.james.backends.cassandra.CassandraCluster;
@@ -28,12 +29,13 @@ import org.apache.james.backends.cassandra.init.CassandraModuleComposite;
import org.apache.james.mailbox.cassandra.modules.CassandraAclModule;
import org.apache.james.mailbox.cassandra.modules.CassandraMailboxModule;
import org.apache.james.mailbox.model.MailboxPath;
+import org.apache.james.mailbox.store.mail.model.Mailbox;
import org.apache.james.mailbox.store.mail.model.impl.SimpleMailbox;
import org.apache.james.util.concurrency.ConcurrentTestRunner;
+import org.junit.After;
import org.junit.Before;
import org.junit.Test;
-
public class CassandraMailboxMapperConcurrencyTest {
public static final int MAX_RETRY = 10;
@@ -54,6 +56,11 @@ public class CassandraMailboxMapperConcurrencyTest {
testee = new CassandraMailboxMapper(cassandra.getConf(), mailboxDAO, mailboxPathDAO, MAX_RETRY);
}
+ @After
+ public void tearDown() {
+ cassandra.clearAllTables();
+ }
+
@Test
public void saveShouldBeThreadSafe() throws Exception {
boolean termination = new ConcurrentTestRunner(THREAD_COUNT, OPERATION_COUNT,
@@ -64,4 +71,22 @@ public class CassandraMailboxMapperConcurrencyTest {
assertThat(termination).isTrue();
assertThat(testee.list()).hasSize(1);
}
+
+ @Test
+ public void saveWithUpdateShouldBeThreadSafe() throws Exception {
+ SimpleMailbox mailbox = new SimpleMailbox(MAILBOX_PATH, UID_VALIDITY);
+ testee.save(mailbox);
+
+ mailbox.setName("newName");
+
+ boolean termination = new ConcurrentTestRunner(THREAD_COUNT, OPERATION_COUNT,
+ (a, b) -> testee.save(mailbox))
+ .run()
+ .awaitTermination(1, TimeUnit.MINUTES);
+
+ assertThat(termination).isTrue();
+ List<Mailbox> list = testee.list();
+ assertThat(list).hasSize(1);
+ assertThat(list.get(0)).isEqualToComparingFieldByField(mailbox);
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org
[08/20] james-project git commit: JAMES-1925 CassandraMailboxMapper
should rely on mailboxDAO and MailboxPathDAO
Posted by ad...@apache.org.
JAMES-1925 CassandraMailboxMapper should rely on mailboxDAO and MailboxPathDAO
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/e007c1d4
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/e007c1d4
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/e007c1d4
Branch: refs/heads/master
Commit: e007c1d4d98b48f5055d716ddcb897615d025c57
Parents: b1dad43
Author: Benoit Tellier <bt...@linagora.com>
Authored: Tue Feb 14 16:46:33 2017 +0700
Committer: Antoine Duprat <ad...@linagora.com>
Committed: Wed Feb 15 13:12:38 2017 +0100
----------------------------------------------------------------------
.../CassandraMailboxSessionMapperFactory.java | 31 ++--
.../cassandra/mail/CassandraMailboxDAO.java | 7 +-
.../cassandra/mail/CassandraMailboxMapper.java | 162 +++++++------------
.../cassandra/CassandraMailboxManagerTest.java | 7 +-
.../CassandraSubscriptionManagerTest.java | 9 +-
.../cassandra/CassandraTestSystemFixture.java | 8 +-
.../CassandraMailboxManagerAttachmentTest.java | 6 +-
.../cassandra/mail/CassandraMapperProvider.java | 7 +-
.../mail/CassandraModSeqProviderTest.java | 4 +-
.../mail/CassandraUidProviderTest.java | 4 +-
.../cassandra/host/CassandraHostSystem.java | 9 +-
.../modules/mailbox/CassandraMailboxModule.java | 5 +
12 files changed, 138 insertions(+), 121 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/james-project/blob/e007c1d4/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 42dd429..9d41a9c 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
@@ -20,6 +20,7 @@
package org.apache.james.mailbox.cassandra;
import javax.inject.Inject;
+import javax.inject.Named;
import org.apache.james.backends.cassandra.init.CassandraTypesProvider;
import org.apache.james.mailbox.MailboxSession;
@@ -27,7 +28,9 @@ import org.apache.james.mailbox.cassandra.mail.CassandraAnnotationMapper;
import org.apache.james.mailbox.cassandra.mail.CassandraAttachmentMapper;
import org.apache.james.mailbox.cassandra.mail.CassandraIndexTableHandler;
import org.apache.james.mailbox.cassandra.mail.CassandraMailboxCounterDAO;
+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.CassandraMessageIdDAO;
@@ -52,7 +55,7 @@ import com.datastax.driver.core.Session;
*
*/
public class CassandraMailboxSessionMapperFactory extends MailboxSessionMapperFactory {
- private static final int DEFAULT_MAX_RETRY = 1000;
+ public static final Integer DEFAULT_MAX_RETRY = 1000;
private final Session session;
private final UidProvider uidProvider;
@@ -64,13 +67,16 @@ public class CassandraMailboxSessionMapperFactory extends MailboxSessionMapperFa
private final CassandraMailboxCounterDAO mailboxCounterDAO;
private final CassandraMailboxRecentsDAO mailboxRecentsDAO;
private final CassandraIndexTableHandler indexTableHandler;
+ private final CassandraMailboxDAO mailboxDAO;
+ private final CassandraMailboxPathDAO mailboxPathDAO;
private int maxRetry;
@Inject
- public CassandraMailboxSessionMapperFactory(UidProvider uidProvider, ModSeqProvider modSeqProvider,
- Session session, CassandraTypesProvider typesProvider,
- CassandraMessageDAO messageDAO, CassandraMessageIdDAO messageIdDAO, CassandraMessageIdToImapUidDAO imapUidDAO,
- CassandraMailboxCounterDAO mailboxCounterDAO, CassandraMailboxRecentsDAO mailboxRecentsDAO) {
+ public CassandraMailboxSessionMapperFactory(UidProvider uidProvider, ModSeqProvider modSeqProvider,
+ Session session, CassandraTypesProvider typesProvider,
+ CassandraMessageDAO messageDAO, CassandraMessageIdDAO messageIdDAO, CassandraMessageIdToImapUidDAO imapUidDAO,
+ CassandraMailboxCounterDAO mailboxCounterDAO, CassandraMailboxRecentsDAO mailboxRecentsDAO, CassandraMailboxDAO mailboxDAO,
+ CassandraMailboxPathDAO mailboxPathDAO, @Named(CassandraMailboxDAO.MAX_ACL_RETRY) Integer maxRetry) {
this.uidProvider = uidProvider;
this.modSeqProvider = modSeqProvider;
this.session = session;
@@ -79,13 +85,20 @@ public class CassandraMailboxSessionMapperFactory extends MailboxSessionMapperFa
this.imapUidDAO = imapUidDAO;
this.mailboxCounterDAO = mailboxCounterDAO;
this.mailboxRecentsDAO = mailboxRecentsDAO;
+ this.mailboxDAO = mailboxDAO;
+ this.mailboxPathDAO = mailboxPathDAO;
this.indexTableHandler = new CassandraIndexTableHandler(mailboxRecentsDAO, mailboxCounterDAO);
- this.maxRetry = DEFAULT_MAX_RETRY;
+ this.maxRetry = maxRetry;
this.typesProvider = typesProvider;
}
- public void setMaxRetry(int maxRetry) {
- this.maxRetry = maxRetry;
+ public CassandraMailboxSessionMapperFactory(UidProvider uidProvider, ModSeqProvider modSeqProvider,
+ Session session, CassandraTypesProvider typesProvider,
+ CassandraMessageDAO messageDAO, CassandraMessageIdDAO messageIdDAO, CassandraMessageIdToImapUidDAO imapUidDAO,
+ CassandraMailboxCounterDAO mailboxCounterDAO, CassandraMailboxRecentsDAO mailboxRecentsDAO, CassandraMailboxDAO mailboxDAO,
+ CassandraMailboxPathDAO mailboxPathDAO) {
+ this(uidProvider, modSeqProvider, session, typesProvider, messageDAO, messageIdDAO, imapUidDAO, mailboxCounterDAO,
+ mailboxRecentsDAO, mailboxDAO, mailboxPathDAO, DEFAULT_MAX_RETRY);
}
@Override
@@ -102,7 +115,7 @@ public class CassandraMailboxSessionMapperFactory extends MailboxSessionMapperFa
@Override
public MailboxMapper createMailboxMapper(MailboxSession mailboxSession) {
- return new CassandraMailboxMapper(session, typesProvider, maxRetry);
+ return new CassandraMailboxMapper(session, mailboxDAO, mailboxPathDAO, maxRetry);
}
@Override
http://git-wip-us.apache.org/repos/asf/james-project/blob/e007c1d4/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxDAO.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxDAO.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxDAO.java
index 2efce2a..9966151 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxDAO.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxDAO.java
@@ -37,6 +37,9 @@ import java.util.Optional;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Stream;
+import javax.inject.Inject;
+import javax.inject.Named;
+
import org.apache.james.backends.cassandra.init.CassandraTypesProvider;
import org.apache.james.backends.cassandra.utils.CassandraAsyncExecutor;
import org.apache.james.backends.cassandra.utils.CassandraUtils;
@@ -56,6 +59,7 @@ import com.datastax.driver.core.querybuilder.QueryBuilder;
public class CassandraMailboxDAO {
+ public static final String MAX_ACL_RETRY = "maxAclRetry";
private final CassandraAsyncExecutor executor;
private final MailboxBaseTupleUtil mailboxBaseTupleUtil;
private final Session session;
@@ -66,7 +70,8 @@ public class CassandraMailboxDAO {
private final PreparedStatement insertStatement;
private final PreparedStatement updateStatement;
- public CassandraMailboxDAO(Session session, CassandraTypesProvider typesProvider, int maxAclRetry) {
+ @Inject
+ public CassandraMailboxDAO(Session session, CassandraTypesProvider typesProvider, @Named(MAX_ACL_RETRY) Integer maxAclRetry) {
this.executor = new CassandraAsyncExecutor(session);
this.mailboxBaseTupleUtil = new MailboxBaseTupleUtil(typesProvider);
this.session = session;
http://git-wip-us.apache.org/repos/asf/james-project/blob/e007c1d4/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java
index d88a6e7..959bacf 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java
@@ -19,32 +19,19 @@
package org.apache.james.mailbox.cassandra.mail;
-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.CassandraMailboxTable.FIELDS;
-import static org.apache.james.mailbox.cassandra.table.CassandraMailboxTable.ID;
-import static org.apache.james.mailbox.cassandra.table.CassandraMailboxTable.MAILBOX_BASE;
-import static org.apache.james.mailbox.cassandra.table.CassandraMailboxTable.NAME;
-import static org.apache.james.mailbox.cassandra.table.CassandraMailboxTable.PATH;
-import static org.apache.james.mailbox.cassandra.table.CassandraMailboxTable.TABLE_NAME;
-import static org.apache.james.mailbox.cassandra.table.CassandraMailboxTable.UIDVALIDITY;
-
import java.util.Collections;
import java.util.List;
+import java.util.Optional;
import java.util.StringTokenizer;
+import java.util.concurrent.CompletableFuture;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
-import java.util.stream.Stream;
import org.apache.commons.lang3.StringUtils;
-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.CassandraId;
-import org.apache.james.mailbox.cassandra.table.CassandraMailboxTable;
-import org.apache.james.mailbox.cassandra.table.CassandraMailboxTable.MailboxBase;
import org.apache.james.mailbox.exception.MailboxException;
+import org.apache.james.mailbox.exception.MailboxExistsException;
import org.apache.james.mailbox.exception.MailboxNotFoundException;
import org.apache.james.mailbox.exception.TooLongMailboxNameException;
import org.apache.james.mailbox.model.MailboxACL;
@@ -53,53 +40,53 @@ import org.apache.james.mailbox.model.MailboxPath;
import org.apache.james.mailbox.store.mail.MailboxMapper;
import org.apache.james.mailbox.store.mail.model.Mailbox;
import org.apache.james.mailbox.store.mail.model.impl.SimpleMailbox;
+import org.apache.james.util.CompletableFutureUtil;
+import org.apache.james.util.OptionalConverter;
-import com.datastax.driver.core.ResultSet;
-import com.datastax.driver.core.Row;
import com.datastax.driver.core.Session;
import com.datastax.driver.core.exceptions.InvalidQueryException;
-import com.datastax.driver.core.querybuilder.QueryBuilder;
+import com.github.steveash.guavate.Guavate;
import com.google.common.base.Preconditions;
-/**
- * Data access management for mailbox.
- */
public class CassandraMailboxMapper implements MailboxMapper {
public static final String WILDCARD = "%";
public static final String VALUES_MAY_NOT_BE_LARGER_THAN_64_K = "Index expression values may not be larger than 64K";
- private final Session session;
private final int maxRetry;
- private final CassandraTypesProvider typesProvider;
private final CassandraAsyncExecutor cassandraAsyncExecutor;
+ private final CassandraMailboxPathDAO mailboxPathDAO;
+ private final CassandraMailboxDAO mailboxDAO;
+ private final Session session;
- public CassandraMailboxMapper(Session session, CassandraTypesProvider typesProvider, int maxRetry) {
- this.session = session;
+ public CassandraMailboxMapper(Session session, CassandraMailboxDAO mailboxDAO, CassandraMailboxPathDAO mailboxPathDAO, int maxRetry) {
this.maxRetry = maxRetry;
- this.typesProvider = typesProvider;
this.cassandraAsyncExecutor = new CassandraAsyncExecutor(session);
+ this.mailboxDAO = mailboxDAO;
+ this.mailboxPathDAO = mailboxPathDAO;
+ this.session = session;
}
@Override
public void delete(Mailbox mailbox) throws MailboxException {
CassandraId mailboxId = (CassandraId) mailbox.getMailboxId();
- session.execute(
- QueryBuilder.delete()
- .from(TABLE_NAME)
- .where(eq(ID, mailboxId.asUuid())));
+ mailboxPathDAO.delete(mailbox.generateAssociatedPath())
+ .thenCompose(any -> mailboxDAO.delete(mailboxId))
+ .join();
}
@Override
public Mailbox findMailboxByPath(MailboxPath path) throws MailboxException {
try {
- ResultSet resultSet = session.execute(select(FIELDS).from(TABLE_NAME).where(eq(PATH, path.toString())));
- if (resultSet.isExhausted()) {
- throw new MailboxNotFoundException(path);
- } else {
- return mailbox(resultSet.one());
- }
+ return mailboxPathDAO.retrieveId(path)
+ .thenCompose(cassandraIdOptional ->
+ cassandraIdOptional
+ .map(CassandraMailboxPathDAO.CassandraIdAndPath::getCassandraId)
+ .map(mailboxDAO::retrieveMailbox)
+ .orElse(CompletableFuture.completedFuture(Optional.empty())))
+ .join()
+ .orElseThrow(() -> new MailboxNotFoundException(path));
} catch (InvalidQueryException e) {
if (StringUtils.containsIgnoreCase(e.getMessage(), VALUES_MAY_NOT_BE_LARGER_THAN_64_K)) {
throw new TooLongMailboxNameException("too long mailbox name");
@@ -111,21 +98,23 @@ public class CassandraMailboxMapper implements MailboxMapper {
@Override
public Mailbox findMailboxById(MailboxId id) throws MailboxException {
CassandraId mailboxId = (CassandraId) id;
- ResultSet resultSet = session.execute(select(FIELDS).from(TABLE_NAME).where(eq(ID, mailboxId.asUuid())));
- if (resultSet.isExhausted()) {
- throw new MailboxNotFoundException(id.serialize());
- } else {
- return mailbox(resultSet.one());
- }
+ return mailboxDAO.retrieveMailbox(mailboxId)
+ .join()
+ .orElseThrow(() -> new MailboxNotFoundException(id.serialize()));
}
@Override
public List<Mailbox> findMailboxWithPathLike(MailboxPath path) throws MailboxException {
Pattern regex = Pattern.compile(constructEscapedRegexForMailboxNameMatching(path));
- return getMailboxFilteredByNamespaceAndUserStream(path.getNamespace(), path.getUser())
- .filter((row) -> regex.matcher(row.getString(NAME)).matches())
- .map(this::mailbox)
- .collect(Collectors.toList());
+ return mailboxPathDAO.listUserMailboxes(path.getNamespace(), path.getUser())
+ .thenApply(stream -> stream.filter(idAndPath -> regex.matcher(idAndPath.getMailboxPath().getName()).matches()))
+ .thenApply(stream -> stream.map(CassandraMailboxPathDAO.CassandraIdAndPath::getCassandraId))
+ .thenApply(stream -> stream.map(mailboxDAO::retrieveMailbox))
+ .thenCompose(CompletableFutureUtil::allOf)
+ .thenApply(stream -> stream
+ .flatMap(OptionalConverter::toStream)
+ .collect(Guavate.<Mailbox>toImmutableList()))
+ .join();
}
@Override
@@ -135,23 +124,31 @@ public class CassandraMailboxMapper implements MailboxMapper {
if (cassandraMailbox.getMailboxId() == null) {
cassandraMailbox.setMailboxId(CassandraId.timeBased());
}
- upsertMailbox(cassandraMailbox);
+ boolean applied = mailboxPathDAO.save(mailbox.generateAssociatedPath(), (CassandraId) cassandraMailbox.getMailboxId())
+ .thenCompose(result -> {
+ if (result) {
+ return mailboxDAO.save(cassandraMailbox).thenApply(any -> result);
+ }
+ return CompletableFuture.completedFuture(result);
+ }).join();
+ if (!applied) {
+ throw new MailboxExistsException(mailbox.generateAssociatedPath().asString());
+ }
}
@Override
public boolean hasChildren(Mailbox mailbox, char delimiter) {
- final Pattern regex = Pattern.compile(Pattern.quote( mailbox.getName() + String.valueOf(delimiter)) + ".*");
- return getMailboxFilteredByNamespaceAndUserStream(mailbox.getNamespace(), mailbox.getUser())
- .anyMatch((row) -> regex.matcher(row.getString(NAME)).matches());
+ return mailboxPathDAO.listUserMailboxes(mailbox.getNamespace(), mailbox.getUser())
+ .thenApply(stream -> stream
+ .anyMatch(idAndPath -> idAndPath.getMailboxPath().getName().startsWith(mailbox.getName() + String.valueOf(delimiter))))
+ .join();
}
@Override
public List<Mailbox> list() throws MailboxException {
- return CassandraUtils.convertToStream(
- session.execute(
- select(FIELDS).from(TABLE_NAME)))
- .map(this::mailbox)
- .collect(Collectors.toList());
+ return mailboxDAO.retrieveAllMailboxes()
+ .join()
+ .collect(Guavate.toImmutableList());
}
@Override
@@ -170,57 +167,20 @@ public class CassandraMailboxMapper implements MailboxMapper {
// Do nothing
}
- private SimpleMailbox mailbox(Row row) {
- SimpleMailbox mailbox = new SimpleMailbox(
- new MailboxPath(
- row.getUDTValue(MAILBOX_BASE).getString(MailboxBase.NAMESPACE),
- row.getUDTValue(MAILBOX_BASE).getString(MailboxBase.USER),
- row.getString(NAME)),
- row.getLong(UIDVALIDITY));
- CassandraId mailboxId = CassandraId.of(row.getUUID(ID));
- mailbox.setMailboxId(mailboxId);
- mailbox.setACL(new CassandraACLMapper(mailboxId, session, cassandraAsyncExecutor, maxRetry).getACL().join());
- return mailbox;
- }
-
private String constructEscapedRegexForMailboxNameMatching(MailboxPath path) {
return Collections
.list(new StringTokenizer(path.getName(), WILDCARD, true))
.stream()
- .map((token) -> {
- if (token.equals(WILDCARD)) {
- return ".*";
- } else {
- return Pattern.quote((String) token);
- }
- }
- ).collect(Collectors.joining());
- }
-
- private void upsertMailbox(SimpleMailbox mailbox) throws MailboxException {
- CassandraId mailboxId = (CassandraId) mailbox.getMailboxId();
- session.execute(
- insertInto(TABLE_NAME)
- .value(ID, mailboxId.asUuid())
- .value(NAME, mailbox.getName())
- .value(UIDVALIDITY, mailbox.getUidValidity())
- .value(MAILBOX_BASE, typesProvider.getDefinedUserType(CassandraMailboxTable.MAILBOX_BASE)
- .newValue()
- .setString(MailboxBase.NAMESPACE, mailbox.getNamespace())
- .setString(MailboxBase.USER, mailbox.getUser()))
- .value(PATH, path(mailbox).toString())
- );
- }
-
- private MailboxPath path(Mailbox mailbox) {
- return new MailboxPath(mailbox.getNamespace(), mailbox.getUser(), mailbox.getName());
+ .map(this::tokenToPatternPart)
+ .collect(Collectors.joining());
}
- private Stream<Row> getMailboxFilteredByNamespaceAndUserStream (String namespace, String user) {
- return CassandraUtils.convertToStream(session.execute(
- select(FIELDS)
- .from(TABLE_NAME)
- .where(eq(MAILBOX_BASE, typesProvider.getDefinedUserType(CassandraMailboxTable.MAILBOX_BASE).newValue().setString(MailboxBase.NAMESPACE, namespace).setString(MailboxBase.USER, user)))));
+ private String tokenToPatternPart(Object token) {
+ if (token.equals(WILDCARD)) {
+ return ".*";
+ } else {
+ return Pattern.quote((String) token);
+ }
}
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/e007c1d4/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerTest.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerTest.java
index 281dbf9..ab76b26 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerTest.java
@@ -25,6 +25,8 @@ import org.apache.james.mailbox.acl.MailboxACLResolver;
import org.apache.james.mailbox.acl.SimpleGroupMembershipResolver;
import org.apache.james.mailbox.acl.UnionMailboxACLResolver;
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.CassandraMessageIdDAO;
@@ -59,6 +61,7 @@ import com.google.common.base.Throwables;
public class CassandraMailboxManagerTest {
private static final int LIMIT_ANNOTATIONS = 3;
private static final int LIMIT_ANNOTATION_SIZE = 30;
+ public static final int MAX_ACL_RETRY = 10;
private static final CassandraCluster CASSANDRA = CassandraCluster.create(new CassandraModuleComposite(
new CassandraAclModule(),
@@ -85,6 +88,8 @@ public class CassandraMailboxManagerTest {
CassandraMessageDAO messageDAO = new CassandraMessageDAO(CASSANDRA.getConf(), CASSANDRA.getTypesProvider(), messageIdFactory);
CassandraMailboxCounterDAO mailboxCounterDAO = new CassandraMailboxCounterDAO(CASSANDRA.getConf());
CassandraMailboxRecentsDAO mailboxRecentsDAO = new CassandraMailboxRecentsDAO(CASSANDRA.getConf());
+ CassandraMailboxDAO mailboxDAO = new CassandraMailboxDAO(CASSANDRA.getConf(), CASSANDRA.getTypesProvider(), MAX_ACL_RETRY);
+ CassandraMailboxPathDAO mailboxPathDAO = new CassandraMailboxPathDAO(CASSANDRA.getConf(), CASSANDRA.getTypesProvider());
CassandraMailboxSessionMapperFactory mapperFactory = new CassandraMailboxSessionMapperFactory(uidProvider,
modSeqProvider,
@@ -94,7 +99,7 @@ public class CassandraMailboxManagerTest {
messageIdDAO,
imapUidDAO,
mailboxCounterDAO,
- mailboxRecentsDAO);
+ mailboxRecentsDAO, mailboxDAO, mailboxPathDAO);
MailboxACLResolver aclResolver = new UnionMailboxACLResolver();
GroupMembershipResolver groupMembershipResolver = new SimpleGroupMembershipResolver();
http://git-wip-us.apache.org/repos/asf/james-project/blob/e007c1d4/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 5d5e6c1..246b28d 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
@@ -24,6 +24,8 @@ 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.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.CassandraMessageIdDAO;
@@ -49,6 +51,8 @@ public class CassandraSubscriptionManagerTest extends AbstractSubscriptionManage
CassandraMessageIdDAO messageIdDAO = null;
CassandraMailboxCounterDAO mailboxCounterDAO = null;
CassandraMailboxRecentsDAO mailboxRecentsDAO = null;
+ CassandraMailboxDAO mailboxDAO = null;
+ CassandraMailboxPathDAO mailboxPathDAO = null;
return new CassandraSubscriptionManager(
new CassandraMailboxSessionMapperFactory(
new CassandraUidProvider(cassandra.getConf()),
@@ -59,8 +63,9 @@ public class CassandraSubscriptionManagerTest extends AbstractSubscriptionManage
messageIdDAO,
imapUidDAO,
mailboxCounterDAO,
- mailboxRecentsDAO
- )
+ mailboxRecentsDAO,
+ mailboxDAO,
+ mailboxPathDAO)
);
}
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/e007c1d4/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 c466e93..c18d540 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,6 +24,8 @@ 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.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.CassandraMessageIdDAO;
@@ -60,6 +62,7 @@ public class CassandraTestSystemFixture {
new CassandraAttachmentModule(),
new CassandraAnnotationModule()));
public static final int MOD_SEQ = 452;
+ public static final int MAX_ACL_RETRY = 10;
public static CassandraMailboxSessionMapperFactory createMapperFactory() {
CASSANDRA.ensureAllTables();
@@ -71,6 +74,9 @@ public class CassandraTestSystemFixture {
CassandraMessageDAO messageDAO = new CassandraMessageDAO(CASSANDRA.getConf(), CASSANDRA.getTypesProvider(), messageIdFactory);
CassandraMailboxCounterDAO mailboxCounterDAO = new CassandraMailboxCounterDAO(CASSANDRA.getConf());
CassandraMailboxRecentsDAO mailboxRecentsDAO = new CassandraMailboxRecentsDAO(CASSANDRA.getConf());
+
+ CassandraMailboxDAO mailboxDAO = new CassandraMailboxDAO(CASSANDRA.getConf(), CASSANDRA.getTypesProvider(), MAX_ACL_RETRY);
+ CassandraMailboxPathDAO mailboxPathDAO = new CassandraMailboxPathDAO(CASSANDRA.getConf(), CASSANDRA.getTypesProvider());
return new CassandraMailboxSessionMapperFactory(uidProvider,
modSeqProvider,
CASSANDRA.getConf(),
@@ -79,7 +85,7 @@ public class CassandraTestSystemFixture {
messageIdDAO,
imapUidDAO,
mailboxCounterDAO,
- mailboxRecentsDAO);
+ mailboxRecentsDAO, mailboxDAO, mailboxPathDAO);
}
public static CassandraMailboxManager createMailboxManager(CassandraMailboxSessionMapperFactory mapperFactory) throws Exception{
http://git-wip-us.apache.org/repos/asf/james-project/blob/e007c1d4/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 6c717ac..56f862d 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
@@ -53,6 +53,7 @@ public class CassandraMailboxManagerAttachmentTest extends AbstractMailboxManage
new CassandraModSeqModule(),
new CassandraUidModule(),
new CassandraAttachmentModule()));
+ public static final int MAX_ACL_RETRY = 10;
private CassandraMailboxSessionMapperFactory mailboxSessionMapperFactory;
private CassandraMailboxManager mailboxManager;
@@ -60,6 +61,9 @@ public class CassandraMailboxManagerAttachmentTest extends AbstractMailboxManage
public CassandraMailboxManagerAttachmentTest() throws Exception {
CassandraMessageId.Factory messageIdFactory = new CassandraMessageId.Factory();
+
+ CassandraMailboxDAO mailboxDAO = new CassandraMailboxDAO(cassandra.getConf(), cassandra.getTypesProvider(), MAX_ACL_RETRY);
+ CassandraMailboxPathDAO mailboxPathDAO = new CassandraMailboxPathDAO(cassandra.getConf(), cassandra.getTypesProvider());
mailboxSessionMapperFactory = new CassandraMailboxSessionMapperFactory(
new CassandraUidProvider(cassandra.getConf()),
new CassandraModSeqProvider(cassandra.getConf()),
@@ -69,7 +73,7 @@ public class CassandraMailboxManagerAttachmentTest extends AbstractMailboxManage
new CassandraMessageIdDAO(cassandra.getConf(), messageIdFactory),
new CassandraMessageIdToImapUidDAO(cassandra.getConf(), messageIdFactory),
new CassandraMailboxCounterDAO(cassandra.getConf()),
- new CassandraMailboxRecentsDAO(cassandra.getConf()));
+ new CassandraMailboxRecentsDAO(cassandra.getConf()), mailboxDAO, mailboxPathDAO);
Authenticator noAuthenticator = null;
Authorizator noAuthorizator = null;
mailboxManager = new CassandraMailboxManager(mailboxSessionMapperFactory, noAuthenticator, noAuthorizator, new NoMailboxPathLocker(), new MessageParser(), messageIdFactory);
http://git-wip-us.apache.org/repos/asf/james-project/blob/e007c1d4/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 ba39d49..0342f18 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
@@ -65,6 +65,7 @@ public class CassandraMapperProvider implements MapperProvider {
new CassandraUidModule(),
new CassandraAttachmentModule(),
new CassandraAnnotationModule()));
+ public static final int MAX_ACL_RETRY = 10;
private final MessageUidProvider messageUidProvider;
private final CassandraModSeqProvider cassandraModSeqProvider;
@@ -95,6 +96,8 @@ public class CassandraMapperProvider implements MapperProvider {
}
private CassandraMailboxSessionMapperFactory createMapperFactory() {
+ CassandraMailboxDAO mailboxDAO = new CassandraMailboxDAO(cassandra.getConf(), cassandra.getTypesProvider(), MAX_ACL_RETRY);
+ CassandraMailboxPathDAO mailboxPathDAO = new CassandraMailboxPathDAO(cassandra.getConf(), cassandra.getTypesProvider());
return new CassandraMailboxSessionMapperFactory(
new CassandraUidProvider(cassandra.getConf()),
cassandraModSeqProvider,
@@ -104,7 +107,9 @@ public class CassandraMapperProvider implements MapperProvider {
new CassandraMessageIdDAO(cassandra.getConf(), MESSAGE_ID_FACTORY),
new CassandraMessageIdToImapUidDAO(cassandra.getConf(), MESSAGE_ID_FACTORY),
new CassandraMailboxCounterDAO(cassandra.getConf()),
- new CassandraMailboxRecentsDAO(cassandra.getConf()));
+ new CassandraMailboxRecentsDAO(cassandra.getConf()),
+ mailboxDAO,
+ mailboxPathDAO);
}
@Override
http://git-wip-us.apache.org/repos/asf/james-project/blob/e007c1d4/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraModSeqProviderTest.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraModSeqProviderTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraModSeqProviderTest.java
index 4143cbc..badfd32 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraModSeqProviderTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraModSeqProviderTest.java
@@ -53,7 +53,9 @@ public class CassandraModSeqProviderTest {
public void setUpClass() throws Exception {
CASSANDRA.ensureAllTables();
modSeqProvider = new CassandraModSeqProvider(CASSANDRA.getConf());
- mapper = new CassandraMailboxMapper(CASSANDRA.getConf(), CASSANDRA.getTypesProvider(), MAX_RETRY);
+ CassandraMailboxDAO mailboxDAO = new CassandraMailboxDAO(CASSANDRA.getConf(), CASSANDRA.getTypesProvider(), MAX_RETRY);
+ CassandraMailboxPathDAO mailboxPathDAO = new CassandraMailboxPathDAO(CASSANDRA.getConf(), CASSANDRA.getTypesProvider());
+ mapper = new CassandraMailboxMapper(CASSANDRA.getConf(), mailboxDAO, mailboxPathDAO, MAX_RETRY);
MailboxPath path = new MailboxPath("gsoc", "ieugen", "Trash");
mailbox = new SimpleMailbox(path, 1234);
mapper.save(mailbox);
http://git-wip-us.apache.org/repos/asf/james-project/blob/e007c1d4/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraUidProviderTest.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraUidProviderTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraUidProviderTest.java
index f0a7027..5f74722 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraUidProviderTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraUidProviderTest.java
@@ -55,7 +55,9 @@ public class CassandraUidProviderTest {
public void setUpClass() throws Exception {
CASSANDRA.ensureAllTables();
uidProvider = new CassandraUidProvider(CASSANDRA.getConf());
- mapper = new CassandraMailboxMapper(CASSANDRA.getConf(), CASSANDRA.getTypesProvider(), MAX_RETRY);
+ CassandraMailboxDAO mailboxDAO = new CassandraMailboxDAO(CASSANDRA.getConf(), CASSANDRA.getTypesProvider(), MAX_RETRY);
+ CassandraMailboxPathDAO mailboxPathDAO = new CassandraMailboxPathDAO(CASSANDRA.getConf(), CASSANDRA.getTypesProvider());
+ mapper = new CassandraMailboxMapper(CASSANDRA.getConf(), mailboxDAO, mailboxPathDAO, MAX_RETRY);
MailboxPath path = new MailboxPath("gsoc", "ieugen", "Trash");
mailbox = new SimpleMailbox(path, 1234);
mapper.save(mailbox);
http://git-wip-us.apache.org/repos/asf/james-project/blob/e007c1d4/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 3f9750b..971139b 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
@@ -30,6 +30,8 @@ import org.apache.james.mailbox.cassandra.CassandraMailboxManager;
import org.apache.james.mailbox.cassandra.CassandraMailboxSessionMapperFactory;
import org.apache.james.mailbox.cassandra.CassandraMessageId;
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.CassandraMessageIdDAO;
@@ -69,7 +71,8 @@ public class CassandraHostSystem extends JamesImapHostSystem {
Feature.USER_FLAGS_SUPPORT,
Feature.QUOTA_SUPPORT,
Feature.ANNOTATION_SUPPORT);
-
+ public static final int MAX_ACL_RETRY = 10;
+
private final CassandraMailboxManager mailboxManager;
private final CassandraCluster cassandraClusterSingleton;
@@ -97,9 +100,11 @@ public class CassandraHostSystem extends JamesImapHostSystem {
CassandraMessageIdToImapUidDAO imapUidDAO = new CassandraMessageIdToImapUidDAO(session, messageIdFactory);
CassandraMailboxCounterDAO mailboxCounterDAO = new CassandraMailboxCounterDAO(session);
CassandraMailboxRecentsDAO mailboxRecentsDAO = new CassandraMailboxRecentsDAO(session);
+ CassandraMailboxDAO mailboxDAO = new CassandraMailboxDAO(session, typesProvider, MAX_ACL_RETRY);
+ CassandraMailboxPathDAO mailboxPathDAO = new CassandraMailboxPathDAO(session, typesProvider);
CassandraMailboxSessionMapperFactory mapperFactory = new CassandraMailboxSessionMapperFactory(uidProvider, modSeqProvider,
- session, typesProvider, messageDAO, messageIdDAO, imapUidDAO, mailboxCounterDAO, mailboxRecentsDAO);
+ session, typesProvider, messageDAO, messageIdDAO, imapUidDAO, mailboxCounterDAO, mailboxRecentsDAO, mailboxDAO, mailboxPathDAO);
mailboxManager = new CassandraMailboxManager(mapperFactory, authenticator, authorizator, new JVMMailboxPathLocker(), new MessageParser(), messageIdFactory);
QuotaRootResolver quotaRootResolver = new DefaultQuotaRootResolver(mapperFactory);
http://git-wip-us.apache.org/repos/asf/james-project/blob/e007c1d4/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 46cc66a..a786964 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
@@ -32,6 +32,7 @@ import org.apache.james.mailbox.cassandra.CassandraMailboxManager;
import org.apache.james.mailbox.cassandra.CassandraMailboxSessionMapperFactory;
import org.apache.james.mailbox.cassandra.CassandraMessageId;
import org.apache.james.mailbox.cassandra.CassandraSubscriptionManager;
+import org.apache.james.mailbox.cassandra.mail.CassandraMailboxDAO;
import org.apache.james.mailbox.cassandra.mail.CassandraMessageDAO;
import org.apache.james.mailbox.cassandra.mail.CassandraMessageIdDAO;
import org.apache.james.mailbox.cassandra.mail.CassandraMessageIdToImapUidDAO;
@@ -67,6 +68,10 @@ public class CassandraMailboxModule extends AbstractModule {
protected void configure() {
install(new DefaultEventModule());
+ bind(Integer.class)
+ .annotatedWith(com.google.inject.name.Names.named(CassandraMailboxDAO.MAX_ACL_RETRY))
+ .toInstance(CassandraMailboxSessionMapperFactory.DEFAULT_MAX_RETRY);
+
bind(CassandraMailboxSessionMapperFactory.class).in(Scopes.SINGLETON);
bind(CassandraMailboxManager.class).in(Scopes.SINGLETON);
bind(NoMailboxPathLocker.class).in(Scopes.SINGLETON);
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org
[02/20] james-project git commit: JAMES-1925 OptionalConverter should
handle convertion to streams
Posted by ad...@apache.org.
JAMES-1925 OptionalConverter should handle convertion to streams
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/28acf6f5
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/28acf6f5
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/28acf6f5
Branch: refs/heads/master
Commit: 28acf6f5d86e94ca7d0002b8d14569e21760cc99
Parents: a06a008
Author: Benoit Tellier <bt...@linagora.com>
Authored: Tue Feb 14 08:01:42 2017 +0700
Committer: Antoine Duprat <ad...@linagora.com>
Committed: Wed Feb 15 12:00:17 2017 +0100
----------------------------------------------------------------------
.../apache/james/util/OptionalConverter.java | 6 ++++++
.../james/util/OptionalConverterTest.java | 20 ++++++++++++++++++++
2 files changed, 26 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/james-project/blob/28acf6f5/server/container/util-java8/src/main/java/org/apache/james/util/OptionalConverter.java
----------------------------------------------------------------------
diff --git a/server/container/util-java8/src/main/java/org/apache/james/util/OptionalConverter.java b/server/container/util-java8/src/main/java/org/apache/james/util/OptionalConverter.java
index 86cf398..fafec7a 100644
--- a/server/container/util-java8/src/main/java/org/apache/james/util/OptionalConverter.java
+++ b/server/container/util-java8/src/main/java/org/apache/james/util/OptionalConverter.java
@@ -19,6 +19,7 @@
package org.apache.james.util;
import java.util.Optional;
+import java.util.stream.Stream;
public class OptionalConverter {
@@ -29,4 +30,9 @@ public class OptionalConverter {
public static <T> com.google.common.base.Optional<T> toGuava(Optional<T> java) {
return com.google.common.base.Optional.fromNullable(java.orElse(null));
}
+
+ public static <T> Stream<T> toStream(Optional<T> optional) {
+ return optional.map(Stream::of)
+ .orElse(Stream.of());
+ }
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/28acf6f5/server/container/util-java8/src/test/java/org/apache/james/util/OptionalConverterTest.java
----------------------------------------------------------------------
diff --git a/server/container/util-java8/src/test/java/org/apache/james/util/OptionalConverterTest.java b/server/container/util-java8/src/test/java/org/apache/james/util/OptionalConverterTest.java
index 6caee6a..5356f63 100644
--- a/server/container/util-java8/src/test/java/org/apache/james/util/OptionalConverterTest.java
+++ b/server/container/util-java8/src/test/java/org/apache/james/util/OptionalConverterTest.java
@@ -21,17 +21,37 @@ package org.apache.james.util;
import static org.assertj.core.api.Assertions.assertThat;
import java.util.Optional;
+import java.util.stream.Collectors;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
+import com.github.steveash.guavate.Guavate;
+
public class OptionalConverterTest {
@Rule
public ExpectedException expectedException = ExpectedException.none();
@Test
+ public void toStreamShouldConvertEmptyOptionalToEmptyStream() {
+ assertThat(
+ OptionalConverter.toStream(Optional.empty())
+ .collect(Guavate.toImmutableList()))
+ .isEmpty();
+ }
+
+ @Test
+ public void toStreamShouldConvertFullOptionalToStream() {
+ long value = 18L;
+ assertThat(
+ OptionalConverter.toStream(Optional.of(value))
+ .collect(Guavate.toImmutableList()))
+ .containsExactly(value);
+ }
+
+ @Test
public void fromGuavaShouldThrowWhenGuavaIsNull() {
expectedException.expect(NullPointerException.class);
OptionalConverter.fromGuava(null);
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org
[16/20] james-project git commit: JAMES-1925 IT testing for create
mailbox concurrency
Posted by ad...@apache.org.
JAMES-1925 IT testing for create mailbox concurrency
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/f653a1f2
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/f653a1f2
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/f653a1f2
Branch: refs/heads/master
Commit: f653a1f210e1455b7979964e2453148b3ad8df1f
Parents: 0063d30
Author: Quynh Nguyen <qn...@linagora.com>
Authored: Mon Feb 13 14:46:25 2017 +0700
Committer: Antoine Duprat <ad...@linagora.com>
Committed: Wed Feb 15 13:12:39 2017 +0100
----------------------------------------------------------------------
...ssandraUserProvisionningConcurrencyTest.java | 36 +++++++
.../jmap/UserProvisionningConcurrencyTest.java | 108 +++++++++++++++++++
.../MemoryUserProvisionningConcurrencyTest.java | 35 ++++++
3 files changed, 179 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/james-project/blob/f653a1f2/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraUserProvisionningConcurrencyTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraUserProvisionningConcurrencyTest.java b/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraUserProvisionningConcurrencyTest.java
new file mode 100644
index 0000000..efd5be7
--- /dev/null
+++ b/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraUserProvisionningConcurrencyTest.java
@@ -0,0 +1,36 @@
+/****************************************************************
+ * 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.jmap.cassandra;
+
+import org.apache.james.CassandraJmapTestRule;
+import org.apache.james.JmapJamesServer;
+import org.apache.james.jmap.UserProvisionningConcurrencyTest;
+import org.junit.Rule;
+
+public class CassandraUserProvisionningConcurrencyTest extends UserProvisionningConcurrencyTest {
+ @Rule
+ public CassandraJmapTestRule rule = CassandraJmapTestRule.defaultTestRule();
+
+ @Override
+ protected JmapJamesServer createJmapServer() {
+ return rule.jmapServer();
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/james-project/blob/f653a1f2/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/UserProvisionningConcurrencyTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/UserProvisionningConcurrencyTest.java b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/UserProvisionningConcurrencyTest.java
new file mode 100644
index 0000000..643500d
--- /dev/null
+++ b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/UserProvisionningConcurrencyTest.java
@@ -0,0 +1,108 @@
+/****************************************************************
+ * 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.jmap;
+
+import static com.jayway.restassured.RestAssured.given;
+import static com.jayway.restassured.RestAssured.with;
+import static com.jayway.restassured.config.EncoderConfig.encoderConfig;
+import static com.jayway.restassured.config.RestAssuredConfig.newConfig;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.hamcrest.Matchers.equalTo;
+import static org.hamcrest.Matchers.hasItems;
+import static org.hamcrest.Matchers.hasSize;
+
+import java.util.concurrent.TimeUnit;
+
+import org.apache.http.client.utils.URIBuilder;
+import org.apache.james.JmapJamesServer;
+import org.apache.james.util.concurrency.ConcurrentTestRunner;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.google.common.base.Charsets;
+import com.jayway.restassured.RestAssured;
+import com.jayway.restassured.builder.RequestSpecBuilder;
+
+public abstract class UserProvisionningConcurrencyTest {
+ private static final String NAME = "[0][0]";
+ private static final String ARGUMENTS = "[0][1]";
+ private static final String DOMAIN = "mydomain.tld";
+ private static final String USER = "myuser@" + DOMAIN;
+ private static final String PASSWORD = "secret";
+ protected abstract JmapJamesServer createJmapServer();
+
+ private JmapJamesServer jmapServer;
+
+ @Before
+ public void setup() throws Throwable {
+ jmapServer = createJmapServer();
+ jmapServer.start();
+ RestAssured.requestSpecification = new RequestSpecBuilder()
+ .setConfig(newConfig().encoderConfig(encoderConfig().defaultContentCharset(Charsets.UTF_8)))
+ .setPort(jmapServer.getJmapProbe()
+ .getJmapPort())
+ .build();
+
+ jmapServer.serverProbe().addDomain(DOMAIN);
+ jmapServer.serverProbe().addUser(USER, PASSWORD);
+ }
+
+ @After
+ public void teardown() {
+ jmapServer.stop();
+ }
+
+ @Test
+ public void provisionMailboxesShouldNotDuplicateMailboxByName() throws Exception {
+ String token = HttpJmapAuthentication.authenticateJamesUser(baseUri(), USER, PASSWORD).serialize();
+
+ boolean termination = new ConcurrentTestRunner(10, 1,
+ (a, b) -> with()
+ .header("Authorization", token)
+ .body("[[\"getMailboxes\", {}, \"#0\"]]")
+ .post("/jmap"))
+ .run()
+ .awaitTermination(1, TimeUnit.MINUTES);
+
+ assertThat(termination).isTrue();
+
+ given()
+ .header("Authorization", token)
+ .body("[[\"getMailboxes\", {}, \"#0\"]]")
+ .when()
+ .post("/jmap")
+ .then()
+ .statusCode(200)
+ .body(NAME, equalTo("mailboxes"))
+ .body(ARGUMENTS + ".list", hasSize(5))
+ .body(ARGUMENTS + ".list.name", hasItems(DefaultMailboxes.DEFAULT_MAILBOXES.toArray()));
+
+ }
+
+ private URIBuilder baseUri() {
+ return new URIBuilder()
+ .setScheme("http")
+ .setHost("localhost")
+ .setPort(jmapServer.getJmapProbe()
+ .getJmapPort())
+ .setCharset(Charsets.UTF_8);
+ }
+}
http://git-wip-us.apache.org/repos/asf/james-project/blob/f653a1f2/server/protocols/jmap-integration-testing/memory-jmap-integration-testing/src/test/java/org/apache/james/jmap/memory/MemoryUserProvisionningConcurrencyTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap-integration-testing/memory-jmap-integration-testing/src/test/java/org/apache/james/jmap/memory/MemoryUserProvisionningConcurrencyTest.java b/server/protocols/jmap-integration-testing/memory-jmap-integration-testing/src/test/java/org/apache/james/jmap/memory/MemoryUserProvisionningConcurrencyTest.java
new file mode 100644
index 0000000..056d4e7
--- /dev/null
+++ b/server/protocols/jmap-integration-testing/memory-jmap-integration-testing/src/test/java/org/apache/james/jmap/memory/MemoryUserProvisionningConcurrencyTest.java
@@ -0,0 +1,35 @@
+/****************************************************************
+ * 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.jmap.memory;
+
+import org.apache.james.JmapJamesServer;
+import org.apache.james.MemoryJmapTestRule;
+import org.apache.james.jmap.UserProvisionningConcurrencyTest;
+import org.junit.Rule;
+
+public class MemoryUserProvisionningConcurrencyTest extends UserProvisionningConcurrencyTest {
+ @Rule
+ public MemoryJmapTestRule memoryJmap = new MemoryJmapTestRule();
+
+ @Override
+ protected JmapJamesServer createJmapServer() {
+ return memoryJmap.jmapServer();
+ }
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org
[03/20] james-project git commit: JAMES-1925 Removing unneeded comment
Posted by ad...@apache.org.
JAMES-1925 Removing unneeded comment
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/a06a008c
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/a06a008c
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/a06a008c
Branch: refs/heads/master
Commit: a06a008c33cffca160b6769f803fa8609b3d93b3
Parents: adbec1a
Author: Benoit Tellier <bt...@linagora.com>
Authored: Tue Feb 14 09:12:10 2017 +0700
Committer: Antoine Duprat <ad...@linagora.com>
Committed: Wed Feb 15 12:00:17 2017 +0100
----------------------------------------------------------------------
.../cassandra/table/CassandraMailboxPathRegisterTable.java | 5 -----
1 file changed, 5 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/james-project/blob/a06a008c/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMailboxPathRegisterTable.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMailboxPathRegisterTable.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMailboxPathRegisterTable.java
index 48146cc..69e76eb 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMailboxPathRegisterTable.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMailboxPathRegisterTable.java
@@ -19,11 +19,6 @@
package org.apache.james.mailbox.cassandra.table;
-/**
- * Created by benwa on 05/10/15.
- * <p>
- * Project under the Apache v 2 license
- */
public interface CassandraMailboxPathRegisterTable {
String TABLE_NAME = "mailboxPathRegister";
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org
[14/20] james-project git commit: JAMES-1925 Correct MPT failure on
too long mailbox names
Posted by ad...@apache.org.
JAMES-1925 Correct MPT failure on too long mailbox names
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/f518297f
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/f518297f
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/f518297f
Branch: refs/heads/master
Commit: f518297f992411ba4a08913758ebf7c1337a5b7b
Parents: 09934b1
Author: Benoit Tellier <bt...@linagora.com>
Authored: Tue Feb 14 19:08:36 2017 +0700
Committer: Antoine Duprat <ad...@linagora.com>
Committed: Wed Feb 15 13:12:39 2017 +0100
----------------------------------------------------------------------
.../cassandra/mail/CassandraMailboxMapper.java | 54 ++++++++----
.../mail/CassandraMailboxMapperTest.java | 86 ++++++++++++++++++++
.../imap/scripts/CreateErrorWithLongName.test | 2 +-
3 files changed, 123 insertions(+), 19 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/james-project/blob/f518297f/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java
index 1f1e163..9ad665a 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java
@@ -24,6 +24,7 @@ import java.util.List;
import java.util.Optional;
import java.util.StringTokenizer;
import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.CompletionException;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
@@ -51,8 +52,8 @@ import com.google.common.base.Preconditions;
public class CassandraMailboxMapper implements MailboxMapper {
public static final String WILDCARD = "%";
-
public static final String VALUES_MAY_NOT_BE_LARGER_THAN_64_K = "Index expression values may not be larger than 64K";
+ public static final String CLUSTERING_COLUMNS_IS_TOO_LONG = "The sum of all clustering columns is too long";
private final int maxRetry;
private final CassandraAsyncExecutor cassandraAsyncExecutor;
@@ -87,11 +88,14 @@ public class CassandraMailboxMapper implements MailboxMapper {
.orElse(CompletableFuture.completedFuture(Optional.empty())))
.join()
.orElseThrow(() -> new MailboxNotFoundException(path));
- } catch (InvalidQueryException e) {
- if (StringUtils.containsIgnoreCase(e.getMessage(), VALUES_MAY_NOT_BE_LARGER_THAN_64_K)) {
- throw new TooLongMailboxNameException("too long mailbox name");
+ } catch (CompletionException e) {
+ if (e.getCause() instanceof InvalidQueryException) {
+ if (StringUtils.containsIgnoreCase(e.getCause().getMessage(), VALUES_MAY_NOT_BE_LARGER_THAN_64_K)) {
+ throw new TooLongMailboxNameException("too long mailbox name");
+ }
+ throw new MailboxException("It has error with cassandra storage", e.getCause());
}
- throw new MailboxException("It has error with cassandra storage", e);
+ throw e;
}
}
@@ -124,20 +128,34 @@ public class CassandraMailboxMapper implements MailboxMapper {
CassandraId cassandraId = retrieveId(cassandraMailbox);
cassandraMailbox.setMailboxId(cassandraId);
-
- boolean applied = mailboxDAO.retrieveMailbox(cassandraId)
- .thenCompose(optional -> optional
- .map(storedMailbox -> mailboxPathDAO.delete(storedMailbox.generateAssociatedPath()))
- .orElse(CompletableFuture.completedFuture(null)))
- .thenCompose(any -> mailboxPathDAO.save(mailbox.generateAssociatedPath(), cassandraId))
- .thenCompose(result -> {
- if (result) {
- return mailboxDAO.save(cassandraMailbox).thenApply(any -> result);
+ try {
+ boolean applied = mailboxPathDAO.save(mailbox.generateAssociatedPath(), cassandraId)
+ .thenCompose(result -> {
+ if (result) {
+ return mailboxDAO.retrieveMailbox(cassandraId)
+ .thenCompose(optional -> optional
+ .map(storedMailbox -> mailboxPathDAO.delete(storedMailbox.generateAssociatedPath()))
+ .orElse(CompletableFuture.completedFuture(null)))
+ .thenCompose(any -> mailboxDAO.save(cassandraMailbox).thenApply(_any -> result));
+ }
+
+ return CompletableFuture.completedFuture(result);
+ }
+ ).join();
+
+ if (!applied) {
+ throw new MailboxExistsException(mailbox.generateAssociatedPath().asString());
+ }
+ } catch (CompletionException e) {
+ if (e.getCause() instanceof InvalidQueryException) {
+ String errorMessage = e.getCause().getMessage();
+ if (StringUtils.containsIgnoreCase(errorMessage, VALUES_MAY_NOT_BE_LARGER_THAN_64_K) ||
+ StringUtils.containsIgnoreCase(errorMessage, CLUSTERING_COLUMNS_IS_TOO_LONG)) {
+ throw new TooLongMailboxNameException("too long mailbox name");
}
- return CompletableFuture.completedFuture(result);
- }).join();
- if (!applied) {
- throw new MailboxExistsException(mailbox.generateAssociatedPath().asString());
+ throw new MailboxException("It has error with cassandra storage", e.getCause());
+ }
+ throw e;
}
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/f518297f/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapperTest.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapperTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapperTest.java
new file mode 100644
index 0000000..f793298
--- /dev/null
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapperTest.java
@@ -0,0 +1,86 @@
+/****************************************************************
+ * 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 static org.assertj.core.api.Assertions.fail;
+
+import java.util.Optional;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.james.backends.cassandra.CassandraCluster;
+import org.apache.james.backends.cassandra.init.CassandraModuleComposite;
+import org.apache.james.mailbox.cassandra.mail.CassandraMailboxPathDAO.CassandraIdAndPath;
+import org.apache.james.mailbox.cassandra.modules.CassandraAclModule;
+import org.apache.james.mailbox.cassandra.modules.CassandraMailboxModule;
+import org.apache.james.mailbox.exception.TooLongMailboxNameException;
+import org.apache.james.mailbox.model.MailboxPath;
+import org.apache.james.mailbox.store.mail.model.Mailbox;
+import org.apache.james.mailbox.store.mail.model.impl.SimpleMailbox;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class CassandraMailboxMapperTest {
+
+ public static final int MAX_RETRY = 10;
+ public static final int UID_VALIDITY = 52;
+ public static final MailboxPath MAILBOX_PATH = new MailboxPath("#private", "user", "name");
+ public static final int THREAD_COUNT = 10;
+ public static final int OPERATION_COUNT = 10;
+ private CassandraCluster cassandra;
+ private CassandraMailboxPathDAO mailboxPathDAO;
+ private CassandraMailboxMapper testee;
+
+ @Before
+ public void setUp() {
+ cassandra = CassandraCluster.create(new CassandraModuleComposite(new CassandraMailboxModule(), new CassandraAclModule()));
+ cassandra.ensureAllTables();
+
+ CassandraMailboxDAO mailboxDAO = new CassandraMailboxDAO(cassandra.getConf(), cassandra.getTypesProvider(), MAX_RETRY);
+ mailboxPathDAO = new CassandraMailboxPathDAO(cassandra.getConf(), cassandra.getTypesProvider());
+ testee = new CassandraMailboxMapper(cassandra.getConf(), mailboxDAO, mailboxPathDAO, MAX_RETRY);
+ }
+
+ @After
+ public void tearDown() {
+ cassandra.clearAllTables();
+ }
+
+ @Test
+ public void saveShouldNotRemoveOldMailboxPathWhenCreatingTheNewMailboxPathFails() throws Exception {
+ testee.save(new SimpleMailbox(MAILBOX_PATH, UID_VALIDITY));
+ Mailbox mailbox = testee.findMailboxByPath(MAILBOX_PATH);
+
+ try {
+ SimpleMailbox newMailbox = new SimpleMailbox(tooLongMailboxPath(mailbox.generateAssociatedPath()), UID_VALIDITY, mailbox.getMailboxId());
+ testee.save(newMailbox);
+ fail("TooLongMailboxNameException expected");
+ } catch (TooLongMailboxNameException e) {
+ }
+
+ Optional<CassandraIdAndPath> cassandraIdAndPath = mailboxPathDAO.retrieveId(MAILBOX_PATH).get();
+ assertThat(cassandraIdAndPath.isPresent()).isTrue();
+ }
+
+ private MailboxPath tooLongMailboxPath(MailboxPath fromMailboxPath) {
+ return new MailboxPath(fromMailboxPath, StringUtils.repeat("b", 65537));
+ }
+}
http://git-wip-us.apache.org/repos/asf/james-project/blob/f518297f/mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/CreateErrorWithLongName.test
----------------------------------------------------------------------
diff --git a/mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/CreateErrorWithLongName.test b/mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/CreateErrorWithLongName.test
index 53b9af6..995fc8e 100644
--- a/mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/CreateErrorWithLongName.test
+++ b/mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/CreateErrorWithLongName.test
@@ -547,7 +547,7 @@ C: bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
C: bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
C: bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
C: bbbbbbbbbbbbbbbbbbbbbbbba
-S: A2 BAD DELETE too long mailbox name. Illegal arguments.
+S: A2 NO DELETE failed. No such mailbox.
C: A3 CREATE newmailbox
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org
[06/20] james-project git commit: JAMES-1925 MailboxPath should offer
asString instead of forcing toString use
Posted by ad...@apache.org.
JAMES-1925 MailboxPath should offer asString instead of forcing toString use
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/be933385
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/be933385
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/be933385
Branch: refs/heads/master
Commit: be933385b7f91e89d3672dedc1d845f98d97785c
Parents: 0ac2530
Author: Benoit Tellier <bt...@linagora.com>
Authored: Tue Feb 14 10:14:18 2017 +0700
Committer: Antoine Duprat <ad...@linagora.com>
Committed: Wed Feb 15 13:12:37 2017 +0100
----------------------------------------------------------------------
.../java/org/apache/james/mailbox/model/MailboxPath.java | 11 +++++------
1 file changed, 5 insertions(+), 6 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/james-project/blob/be933385/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxPath.java
----------------------------------------------------------------------
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxPath.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxPath.java
index 3654dfb..e4f132b 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxPath.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxPath.java
@@ -127,14 +127,13 @@ public class MailboxPath {
return levels;
}
- /*
- * (non-Javadoc)
- *
- * @see java.lang.Object#toString()
- */
+ public String asString() {
+ return namespace + ":" + user + ":" + name;
+ }
+
@Override
public String toString() {
- return namespace + ":" + user + ":" + name;
+ return asString();
}
/*
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org
[09/20] james-project git commit: JAMES-1925 Introduce
CassandraMailboxDAO and its tests
Posted by ad...@apache.org.
JAMES-1925 Introduce CassandraMailboxDAO and its tests
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/6cee1367
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/6cee1367
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/6cee1367
Branch: refs/heads/master
Commit: 6cee1367fc90eea000fd77013e91891feaf3d5c3
Parents: 3c2dc46
Author: Benoit Tellier <bt...@linagora.com>
Authored: Tue Feb 14 11:23:00 2017 +0700
Committer: Antoine Duprat <ad...@linagora.com>
Committed: Wed Feb 15 13:12:38 2017 +0100
----------------------------------------------------------------------
.../cassandra/mail/CassandraMailboxDAO.java | 186 +++++++++++++++++++
.../mail/utils/MailboxBaseTupleUtil.java | 40 ++++
.../cassandra/mail/CassandraMailboxDAOTest.java | 169 +++++++++++++++++
3 files changed, 395 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/james-project/blob/6cee1367/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxDAO.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxDAO.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxDAO.java
new file mode 100644
index 0000000..8b5868a
--- /dev/null
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxDAO.java
@@ -0,0 +1,186 @@
+/****************************************************************
+ * 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 com.datastax.driver.core.querybuilder.QueryBuilder.set;
+import static com.datastax.driver.core.querybuilder.QueryBuilder.update;
+import static org.apache.james.mailbox.cassandra.table.CassandraMailboxTable.FIELDS;
+import static org.apache.james.mailbox.cassandra.table.CassandraMailboxTable.ID;
+import static org.apache.james.mailbox.cassandra.table.CassandraMailboxTable.MAILBOX_BASE;
+import static org.apache.james.mailbox.cassandra.table.CassandraMailboxTable.NAME;
+import static org.apache.james.mailbox.cassandra.table.CassandraMailboxTable.PATH;
+import static org.apache.james.mailbox.cassandra.table.CassandraMailboxTable.TABLE_NAME;
+import static org.apache.james.mailbox.cassandra.table.CassandraMailboxTable.UIDVALIDITY;
+
+import java.util.Optional;
+import java.util.concurrent.CompletableFuture;
+import java.util.stream.Stream;
+
+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.CassandraId;
+import org.apache.james.mailbox.cassandra.mail.utils.MailboxBaseTupleUtil;
+import org.apache.james.mailbox.cassandra.table.CassandraMailboxTable;
+import org.apache.james.mailbox.model.MailboxACL;
+import org.apache.james.mailbox.model.MailboxPath;
+import org.apache.james.mailbox.store.mail.model.Mailbox;
+import org.apache.james.mailbox.store.mail.model.impl.SimpleMailbox;
+import org.apache.james.util.CompletableFutureUtil;
+
+import com.datastax.driver.core.PreparedStatement;
+import com.datastax.driver.core.Row;
+import com.datastax.driver.core.Session;
+import com.datastax.driver.core.querybuilder.QueryBuilder;
+
+public class CassandraMailboxDAO {
+
+ private final CassandraAsyncExecutor executor;
+ private final MailboxBaseTupleUtil mailboxBaseTupleUtil;
+ private final Session session;
+ private final int maxAclRetry;
+ private final PreparedStatement readStatement;
+ private final PreparedStatement listStatement;
+ private final PreparedStatement deleteStatement;
+ private final PreparedStatement insertStatement;
+ private final PreparedStatement updateStatement;
+
+ public CassandraMailboxDAO(Session session, CassandraTypesProvider typesProvider, int maxAclRetry) {
+ this.executor = new CassandraAsyncExecutor(session);
+ this.mailboxBaseTupleUtil = new MailboxBaseTupleUtil(typesProvider);
+ this.session = session;
+ this.insertStatement = prepareInsert(session);
+ this.updateStatement = prepareUpdate(session);
+ this.deleteStatement = prepareDelete(session);
+ this.listStatement = prepareList(session);
+ this.readStatement = prepareRead(session);
+ this.maxAclRetry = maxAclRetry;
+ }
+
+ private PreparedStatement prepareInsert(Session session) {
+ return session.prepare(insertInto(TABLE_NAME)
+ .value(ID, bindMarker(ID))
+ .value(NAME, bindMarker(NAME))
+ .value(UIDVALIDITY, bindMarker(UIDVALIDITY))
+ .value(MAILBOX_BASE, bindMarker(MAILBOX_BASE))
+ .value(PATH, bindMarker(PATH)));
+ }
+
+ private PreparedStatement prepareUpdate(Session session) {
+ return session.prepare(update(TABLE_NAME)
+ .with(set(MAILBOX_BASE, bindMarker(MAILBOX_BASE)))
+ .and(set(NAME, bindMarker(NAME)))
+ .and(set(PATH, bindMarker(PATH)))
+ .where(eq(ID, bindMarker(ID))));
+ }
+
+ private PreparedStatement prepareDelete(Session session) {
+ return session.prepare(QueryBuilder.delete()
+ .from(TABLE_NAME)
+ .where(eq(ID, bindMarker(ID))));
+ }
+
+ private PreparedStatement prepareList(Session session) {
+ return session.prepare(select(FIELDS).from(TABLE_NAME));
+ }
+
+ private PreparedStatement prepareRead(Session session) {
+ return session.prepare(select(FIELDS).from(TABLE_NAME)
+ .where(eq(ID, bindMarker(ID))));
+ }
+
+ public CompletableFuture<Void> save(Mailbox mailbox) {
+ CassandraId cassandraId = (CassandraId) mailbox.getMailboxId();
+ return executor.executeVoid(insertStatement.bind()
+ .setUUID(ID, cassandraId.asUuid())
+ .setString(NAME, mailbox.getName())
+ .setLong(UIDVALIDITY, mailbox.getUidValidity())
+ .setUDTValue(MAILBOX_BASE, mailboxBaseTupleUtil.createMailboxBaseUDT(mailbox.getNamespace(), mailbox.getUser()))
+ .setString(PATH, mailbox.generateAssociatedPath().asString()));
+ }
+
+ public CompletableFuture<Void> updatePath(CassandraId mailboxId, MailboxPath mailboxPath) {
+ return executor.executeVoid(updateStatement.bind()
+ .setUUID(ID, mailboxId.asUuid())
+ .setString(PATH, mailboxPath.asString())
+ .setString(NAME, mailboxPath.getName())
+ .setUDTValue(MAILBOX_BASE, mailboxBaseTupleUtil.createMailboxBaseUDT(mailboxPath.getNamespace(), mailboxPath.getUser())));
+ }
+
+ public CompletableFuture<Void> delete(CassandraId mailboxId) {
+ return executor.executeVoid(deleteStatement.bind()
+ .setUUID(ID, mailboxId.asUuid()));
+ }
+
+ public CompletableFuture<Optional<SimpleMailbox>> retrieveMailbox(CassandraId mailboxId) {
+ return mailbox(mailboxId,
+ executor.executeSingleRow(readStatement.bind()
+ .setUUID(ID, mailboxId.asUuid())));
+ }
+
+ private CompletableFuture<Optional<SimpleMailbox>> mailbox(CassandraId cassandraId, CompletableFuture<Optional<Row>> rowFuture) {
+ CompletableFuture<MailboxACL> aclCompletableFuture = new CassandraACLMapper(cassandraId, session, maxAclRetry).getACL();
+ return rowFuture.thenApply(rowOptional -> rowOptional.map(this::mailboxFromRow))
+ .thenApply(mailboxOptional -> {
+ mailboxOptional.ifPresent(mailbox -> mailbox.setMailboxId(cassandraId));
+ return mailboxOptional;
+ })
+ .thenCompose(mailboxOptional -> aclCompletableFuture.thenApply(acl -> {
+ mailboxOptional.ifPresent(mailbox -> mailbox.setACL(acl));
+ return mailboxOptional;
+ }));
+ }
+
+ private SimpleMailbox mailboxFromRow(Row row) {
+ return new SimpleMailbox(
+ new MailboxPath(
+ row.getUDTValue(MAILBOX_BASE).getString(CassandraMailboxTable.MailboxBase.NAMESPACE),
+ row.getUDTValue(MAILBOX_BASE).getString(CassandraMailboxTable.MailboxBase.USER),
+ row.getString(NAME)),
+ row.getLong(UIDVALIDITY));
+ }
+
+ public CompletableFuture<Stream<SimpleMailbox>> retrieveAllMailboxes() {
+ return executor.execute(listStatement.bind())
+ .thenApply(CassandraUtils::convertToStream)
+ .thenApply(stream -> stream.map(this::toMailboxWithId))
+ .thenCompose(stream -> CompletableFutureUtil.allOf(stream.map(this::toMailboxWithAclFuture)));
+ }
+
+ private SimpleMailbox toMailboxWithId(Row row) {
+ SimpleMailbox mailbox = mailboxFromRow(row);
+ mailbox.setMailboxId(CassandraId.of(row.getUUID(ID)));
+ return mailbox;
+ }
+
+ private CompletableFuture<SimpleMailbox> toMailboxWithAclFuture(SimpleMailbox mailbox) {
+ CassandraId cassandraId = (CassandraId) mailbox.getMailboxId();
+ return new CassandraACLMapper(cassandraId, session, maxAclRetry).getACL()
+ .thenApply(acl -> {
+ mailbox.setACL(acl);
+ return mailbox;
+ });
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/james-project/blob/6cee1367/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/utils/MailboxBaseTupleUtil.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/utils/MailboxBaseTupleUtil.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/utils/MailboxBaseTupleUtil.java
new file mode 100644
index 0000000..3e65457
--- /dev/null
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/utils/MailboxBaseTupleUtil.java
@@ -0,0 +1,40 @@
+/****************************************************************
+ * 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.utils;
+
+import org.apache.james.backends.cassandra.init.CassandraTypesProvider;
+import org.apache.james.mailbox.cassandra.table.CassandraMailboxTable;
+
+import com.datastax.driver.core.UDTValue;
+
+public class MailboxBaseTupleUtil {
+ private final CassandraTypesProvider typesProvider;
+
+ public MailboxBaseTupleUtil(CassandraTypesProvider typesProvider) {
+ this.typesProvider = typesProvider;
+ }
+
+ public UDTValue createMailboxBaseUDT(String namespace, String user) {
+ return typesProvider.getDefinedUserType(CassandraMailboxTable.MAILBOX_BASE)
+ .newValue()
+ .setString(CassandraMailboxTable.MailboxBase.NAMESPACE, namespace)
+ .setString(CassandraMailboxTable.MailboxBase.USER, user);
+ }
+}
http://git-wip-us.apache.org/repos/asf/james-project/blob/6cee1367/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxDAOTest.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxDAOTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxDAOTest.java
new file mode 100644
index 0000000..6cc79e9
--- /dev/null
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxDAOTest.java
@@ -0,0 +1,169 @@
+/****************************************************************
+ * 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.List;
+import java.util.Optional;
+
+import org.apache.james.backends.cassandra.CassandraCluster;
+import org.apache.james.backends.cassandra.init.CassandraModuleComposite;
+import org.apache.james.mailbox.cassandra.CassandraId;
+import org.apache.james.mailbox.cassandra.modules.CassandraAclModule;
+import org.apache.james.mailbox.cassandra.modules.CassandraMailboxModule;
+import org.apache.james.mailbox.model.MailboxConstants;
+import org.apache.james.mailbox.model.MailboxPath;
+import org.apache.james.mailbox.store.mail.model.impl.SimpleMailbox;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.github.steveash.guavate.Guavate;
+
+public class CassandraMailboxDAOTest {
+
+ public static final int MAX_ACL_RETRY = 10;
+ public static final int UID_VALIDITY_1 = 145;
+ public static final int UID_VALIDITY_2 = 147;
+ public static final MailboxPath NEW_MAILBOX_PATH = new MailboxPath(MailboxConstants.USER_NAMESPACE, "user", "xyz");
+ public static CassandraId CASSANDRA_ID_1 = CassandraId.timeBased();
+ public static CassandraId CASSANDRA_ID_2 = CassandraId.timeBased();
+ private CassandraCluster cassandra;
+ private CassandraMailboxDAO testee;
+ private SimpleMailbox mailbox1;
+ private SimpleMailbox mailbox2;
+
+ @Before
+ public void setUp() {
+ cassandra = CassandraCluster.create(new CassandraModuleComposite(new CassandraMailboxModule(), new CassandraAclModule()));
+ cassandra.ensureAllTables();
+
+ testee = new CassandraMailboxDAO(cassandra.getConf(), cassandra.getTypesProvider(), MAX_ACL_RETRY);
+ mailbox1 = new SimpleMailbox(new MailboxPath(MailboxConstants.USER_NAMESPACE, "user", "abcd"),
+ UID_VALIDITY_1,
+ CASSANDRA_ID_1);
+ mailbox2 = new SimpleMailbox(new MailboxPath(MailboxConstants.USER_NAMESPACE, "user", "defg"),
+ UID_VALIDITY_2,
+ CASSANDRA_ID_2);
+ }
+
+ @After
+ public void tearDown() {
+ cassandra.clearAllTables();
+ }
+
+ @Test
+ public void retrieveMailboxShouldReturnEmptyWhenNone() {
+ Optional<SimpleMailbox> mailboxOptional = testee.retrieveMailbox(CASSANDRA_ID_1).join();
+ assertThat(mailboxOptional.isPresent()).isFalse();
+ }
+
+ @Test
+ public void saveShouldAddAMailbox() {
+ testee.save(mailbox1).join();
+
+ Optional<SimpleMailbox> readMailbox = testee.retrieveMailbox(CASSANDRA_ID_1)
+ .join();
+ assertThat(readMailbox.isPresent()).isTrue();
+ assertThat(readMailbox.get()).isEqualToComparingFieldByField(mailbox1);
+ }
+
+ @Test
+ public void saveShouldOverride() {
+ testee.save(mailbox1).join();
+
+ mailbox2.setMailboxId(CASSANDRA_ID_1);
+ testee.save(mailbox2).join();
+
+
+ Optional<SimpleMailbox> readMailbox = testee.retrieveMailbox(CASSANDRA_ID_1)
+ .join();
+ assertThat(readMailbox.isPresent()).isTrue();
+ assertThat(readMailbox.get()).isEqualToComparingFieldByField(mailbox2);
+ }
+
+ @Test
+ public void retrieveAllMailboxesShouldBeEmptyByDefault() {
+ List<SimpleMailbox> mailboxes = testee.retrieveAllMailboxes()
+ .join()
+ .collect(Guavate.toImmutableList());
+
+ assertThat(mailboxes).isEmpty();
+ }
+
+ @Test
+ public void retrieveAllMailboxesShouldReturnSingleMailbox() {
+ testee.save(mailbox1).join();
+
+ List<SimpleMailbox> mailboxes = testee.retrieveAllMailboxes()
+ .join()
+ .collect(Guavate.toImmutableList());
+
+ assertThat(mailboxes).containsOnly(mailbox1);
+ }
+
+ @Test
+ public void retrieveAllMailboxesShouldReturnMultiMailboxes() {
+ testee.save(mailbox1).join();
+ testee.save(mailbox2).join();
+
+ List<SimpleMailbox> mailboxes = testee.retrieveAllMailboxes()
+ .join()
+ .collect(Guavate.toImmutableList());
+
+ assertThat(mailboxes).containsOnly(mailbox1, mailbox2);
+ }
+
+ @Test
+ public void deleteShouldNotFailWhenMailboxIsAbsent() {
+ testee.delete(CASSANDRA_ID_1).join();
+ }
+
+ @Test
+ public void deleteShouldRemoveExistingMailbox() {
+ testee.save(mailbox1).join();
+
+ testee.delete(CASSANDRA_ID_1).join();
+
+ Optional<SimpleMailbox> mailboxOptional = testee.retrieveMailbox(CASSANDRA_ID_1).join();
+ assertThat(mailboxOptional.isPresent()).isFalse();
+ }
+
+ @Test
+ public void updateShouldNotFailWhenMailboxIsAbsent() {
+ testee.updatePath(CASSANDRA_ID_1, NEW_MAILBOX_PATH).join();
+ }
+
+ @Test
+ public void updateShouldChangeMailboxPath() {
+ testee.save(mailbox1).join();
+
+ testee.updatePath(CASSANDRA_ID_1, NEW_MAILBOX_PATH).join();
+
+ mailbox1.setNamespace(NEW_MAILBOX_PATH.getNamespace());
+ mailbox1.setUser(NEW_MAILBOX_PATH.getUser());
+ mailbox1.setName(NEW_MAILBOX_PATH.getName());
+ Optional<SimpleMailbox> readMailbox = testee.retrieveMailbox(CASSANDRA_ID_1)
+ .join();
+ assertThat(readMailbox.isPresent()).isTrue();
+ assertThat(readMailbox.get()).isEqualToComparingFieldByField(mailbox1);
+ }
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org
[20/20] james-project git commit: JAMES-1925 Parallelize deleting old
path & saving mailbox
Posted by ad...@apache.org.
JAMES-1925 Parallelize deleting old path & saving mailbox
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/7f6f7082
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/7f6f7082
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/7f6f7082
Branch: refs/heads/master
Commit: 7f6f70823f8981c04baab7759327890b82aae71e
Parents: 8e9e40a
Author: Luc DUZAN <ld...@linagora.com>
Authored: Wed Feb 15 12:15:37 2017 +0100
Committer: Antoine Duprat <ad...@linagora.com>
Committed: Wed Feb 15 14:34:15 2017 +0100
----------------------------------------------------------------------
.../cassandra/mail/CassandraMailboxMapper.java | 15 +++++++++++----
1 file changed, 11 insertions(+), 4 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/james-project/blob/7f6f7082/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java
index 9ad665a..6662aef 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java
@@ -133,10 +133,17 @@ public class CassandraMailboxMapper implements MailboxMapper {
.thenCompose(result -> {
if (result) {
return mailboxDAO.retrieveMailbox(cassandraId)
- .thenCompose(optional -> optional
- .map(storedMailbox -> mailboxPathDAO.delete(storedMailbox.generateAssociatedPath()))
- .orElse(CompletableFuture.completedFuture(null)))
- .thenCompose(any -> mailboxDAO.save(cassandraMailbox).thenApply(_any -> result));
+ .thenCompose(optional -> {
+ CompletableFuture<Void> delete = optional
+ .map(storedMailbox -> mailboxPathDAO
+ .delete(storedMailbox.generateAssociatedPath())
+ )
+ .orElse(CompletableFuture.completedFuture(null));
+
+ CompletableFuture<Void> save = mailboxDAO.save(cassandraMailbox);
+
+ return CompletableFuture.allOf(delete, save).thenApply(any -> result);
+ });
}
return CompletableFuture.completedFuture(result);
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org
[12/20] james-project git commit: JAMES-1925 Avoid CassandraACLMapper
to instanciate CassandraAsyncExecutor on each request
Posted by ad...@apache.org.
JAMES-1925 Avoid CassandraACLMapper to instanciate CassandraAsyncExecutor on each request
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/b1dad43c
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/b1dad43c
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/b1dad43c
Branch: refs/heads/master
Commit: b1dad43c51255f27ae1edc2f9b248c67f6e3dac5
Parents: 422209e
Author: Benoit Tellier <bt...@linagora.com>
Authored: Tue Feb 14 13:27:01 2017 +0700
Committer: Antoine Duprat <ad...@linagora.com>
Committed: Wed Feb 15 13:12:38 2017 +0100
----------------------------------------------------------------------
.../cassandra/mail/CassandraACLMapper.java | 8 ++++----
.../cassandra/mail/CassandraMailboxDAO.java | 4 ++--
.../cassandra/mail/CassandraMailboxMapper.java | 7 +++++--
.../cassandra/mail/CassandraACLMapperTest.java | 19 ++++++++++++++-----
4 files changed, 25 insertions(+), 13 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/james-project/blob/b1dad43c/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraACLMapper.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraACLMapper.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraACLMapper.java
index 18b406a..68698ca 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraACLMapper.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraACLMapper.java
@@ -66,16 +66,16 @@ public class CassandraACLMapper {
private static final Logger LOG = LoggerFactory.getLogger(CassandraACLMapper.class);
- public CassandraACLMapper(CassandraId cassandraId, Session session, int maxRetry) {
- this(cassandraId, session, maxRetry, () -> {});
+ public CassandraACLMapper(CassandraId cassandraId, Session session, CassandraAsyncExecutor cassandraAsyncExecutor, int maxRetry) {
+ this(cassandraId, session, cassandraAsyncExecutor, maxRetry, () -> {});
}
- public CassandraACLMapper(CassandraId cassandraId, Session session, int maxRetry, CodeInjector codeInjector) {
+ public CassandraACLMapper(CassandraId cassandraId, Session session, CassandraAsyncExecutor cassandraAsyncExecutor, int maxRetry, CodeInjector codeInjector) {
Preconditions.checkArgument(maxRetry > 0);
Preconditions.checkArgument(cassandraId != null);
this.cassandraId = cassandraId;
this.session = session;
- this.executor = new CassandraAsyncExecutor(session);
+ this.executor = cassandraAsyncExecutor;
this.maxRetry = maxRetry;
this.codeInjector = codeInjector;
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/b1dad43c/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxDAO.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxDAO.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxDAO.java
index 8b5868a..2efce2a 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxDAO.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxDAO.java
@@ -140,7 +140,7 @@ public class CassandraMailboxDAO {
}
private CompletableFuture<Optional<SimpleMailbox>> mailbox(CassandraId cassandraId, CompletableFuture<Optional<Row>> rowFuture) {
- CompletableFuture<MailboxACL> aclCompletableFuture = new CassandraACLMapper(cassandraId, session, maxAclRetry).getACL();
+ CompletableFuture<MailboxACL> aclCompletableFuture = new CassandraACLMapper(cassandraId, session, executor, maxAclRetry).getACL();
return rowFuture.thenApply(rowOptional -> rowOptional.map(this::mailboxFromRow))
.thenApply(mailboxOptional -> {
mailboxOptional.ifPresent(mailbox -> mailbox.setMailboxId(cassandraId));
@@ -176,7 +176,7 @@ public class CassandraMailboxDAO {
private CompletableFuture<SimpleMailbox> toMailboxWithAclFuture(SimpleMailbox mailbox) {
CassandraId cassandraId = (CassandraId) mailbox.getMailboxId();
- return new CassandraACLMapper(cassandraId, session, maxAclRetry).getACL()
+ return new CassandraACLMapper(cassandraId, session, executor, maxAclRetry).getACL()
.thenApply(acl -> {
mailbox.setACL(acl);
return mailbox;
http://git-wip-us.apache.org/repos/asf/james-project/blob/b1dad43c/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java
index 4314148..d88a6e7 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java
@@ -39,6 +39,7 @@ import java.util.stream.Stream;
import org.apache.commons.lang3.StringUtils;
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.CassandraId;
import org.apache.james.mailbox.cassandra.table.CassandraMailboxTable;
@@ -72,11 +73,13 @@ public class CassandraMailboxMapper implements MailboxMapper {
private final Session session;
private final int maxRetry;
private final CassandraTypesProvider typesProvider;
+ private final CassandraAsyncExecutor cassandraAsyncExecutor;
public CassandraMailboxMapper(Session session, CassandraTypesProvider typesProvider, int maxRetry) {
this.session = session;
this.maxRetry = maxRetry;
this.typesProvider = typesProvider;
+ this.cassandraAsyncExecutor = new CassandraAsyncExecutor(session);
}
@Override
@@ -159,7 +162,7 @@ public class CassandraMailboxMapper implements MailboxMapper {
@Override
public void updateACL(Mailbox mailbox, MailboxACL.MailboxACLCommand mailboxACLCommand) throws MailboxException {
CassandraId cassandraId = (CassandraId) mailbox.getMailboxId();
- new CassandraACLMapper(cassandraId, session, maxRetry).updateACL(mailboxACLCommand);
+ new CassandraACLMapper(cassandraId, session, cassandraAsyncExecutor, maxRetry).updateACL(mailboxACLCommand);
}
@Override
@@ -176,7 +179,7 @@ public class CassandraMailboxMapper implements MailboxMapper {
row.getLong(UIDVALIDITY));
CassandraId mailboxId = CassandraId.of(row.getUUID(ID));
mailbox.setMailboxId(mailboxId);
- mailbox.setACL(new CassandraACLMapper(mailboxId, session, maxRetry).getACL().join());
+ mailbox.setACL(new CassandraACLMapper(mailboxId, session, cassandraAsyncExecutor, maxRetry).getACL().join());
return mailbox;
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/b1dad43c/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraACLMapperTest.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraACLMapperTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraACLMapperTest.java
index ebff807..5e1d5a4 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraACLMapperTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraACLMapperTest.java
@@ -31,6 +31,7 @@ import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import org.apache.james.backends.cassandra.CassandraCluster;
+import org.apache.james.backends.cassandra.utils.CassandraAsyncExecutor;
import org.apache.james.mailbox.cassandra.CassandraId;
import org.apache.james.mailbox.cassandra.modules.CassandraAclModule;
import org.apache.james.mailbox.cassandra.table.CassandraACLTable;
@@ -49,13 +50,15 @@ public class CassandraACLMapperTest {
public static final int MAX_RETRY = 100;
private CassandraACLMapper cassandraACLMapper;
private CassandraCluster cassandra;
+ private CassandraAsyncExecutor cassandraAsyncExecutor;
private ExecutorService executor;
@Before
public void setUp() {
cassandra = CassandraCluster.create(new CassandraAclModule());
cassandra.ensureAllTables();
- cassandraACLMapper = new CassandraACLMapper(MAILBOX_ID, cassandra.getConf(), MAX_RETRY);
+ cassandraAsyncExecutor = new CassandraAsyncExecutor(cassandra.getConf());
+ cassandraACLMapper = new CassandraACLMapper(MAILBOX_ID, cassandra.getConf(), cassandraAsyncExecutor, MAX_RETRY);
executor = Executors.newFixedThreadPool(2);
}
@@ -67,12 +70,14 @@ public class CassandraACLMapperTest {
@Test(expected = IllegalArgumentException.class)
public void creatingACLMapperWithNegativeMaxRetryShouldFail() {
- new CassandraACLMapper(MAILBOX_ID, cassandra.getConf(), -1);
+ int maxRetry = -1;
+ new CassandraACLMapper(MAILBOX_ID, cassandra.getConf(), cassandraAsyncExecutor, maxRetry);
}
@Test(expected = IllegalArgumentException.class)
public void creatingACLMapperWithNullMaxRetryShouldFail() {
- new CassandraACLMapper(MAILBOX_ID, cassandra.getConf(), 0);
+ int maxRetry = 0;
+ new CassandraACLMapper(MAILBOX_ID, cassandra.getConf(), cassandraAsyncExecutor, maxRetry);
}
@Test
@@ -194,13 +199,17 @@ public class CassandraACLMapperTest {
private void awaitAll(Future<?>... futures)
throws InterruptedException, ExecutionException, TimeoutException {
for (Future<?> future : futures) {
- future.get(10l, TimeUnit.SECONDS);
+ future.get(10L, TimeUnit.SECONDS);
}
}
private Future<Boolean> performACLUpdateInExecutor(ExecutorService executor, SimpleMailboxACL.SimpleMailboxACLEntryKey key, SimpleMailboxACL.Rfc4314Rights rights, CassandraACLMapper.CodeInjector runnable) {
return executor.submit(() -> {
- CassandraACLMapper aclMapper = new CassandraACLMapper(MAILBOX_ID, cassandra.getConf(), MAX_RETRY, runnable);
+ CassandraACLMapper aclMapper = new CassandraACLMapper(MAILBOX_ID,
+ cassandra.getConf(),
+ new CassandraAsyncExecutor(cassandra.getConf()),
+ MAX_RETRY,
+ runnable);
try {
aclMapper.updateACL(new SimpleMailboxACL.SimpleMailboxACLCommand(key, MailboxACL.EditMode.ADD, rights));
} catch (MailboxException exception) {
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org
[05/20] james-project git commit: JAMES-1925 Adapt slightly ACLs
Posted by ad...@apache.org.
JAMES-1925 Adapt slightly ACLs
- Read should use future
- Only rely on mailboxId
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/7b85c970
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/7b85c970
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/7b85c970
Branch: refs/heads/master
Commit: 7b85c97040ebda3301dc0ef5e38cdf7516a5966a
Parents: 7c223af
Author: Benoit Tellier <bt...@linagora.com>
Authored: Tue Feb 14 11:01:53 2017 +0700
Committer: Antoine Duprat <ad...@linagora.com>
Committed: Wed Feb 15 13:12:37 2017 +0100
----------------------------------------------------------------------
.../cassandra/mail/CassandraACLMapper.java | 55 ++++++++++----------
.../cassandra/mail/CassandraMailboxMapper.java | 8 +--
.../cassandra/mail/CassandraACLMapperTest.java | 52 +++++++-----------
3 files changed, 52 insertions(+), 63 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/james-project/blob/7b85c970/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraACLMapper.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraACLMapper.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraACLMapper.java
index 378b48b..18b406a 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraACLMapper.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraACLMapper.java
@@ -27,7 +27,9 @@ import static com.datastax.driver.core.querybuilder.QueryBuilder.update;
import java.io.IOException;
import java.util.Optional;
+import java.util.concurrent.CompletableFuture;
+import org.apache.james.backends.cassandra.utils.CassandraAsyncExecutor;
import org.apache.james.backends.cassandra.utils.CassandraConstants;
import org.apache.james.backends.cassandra.utils.FunctionRunnerWithRetry;
import org.apache.james.backends.cassandra.utils.LightweightTransactionException;
@@ -39,7 +41,6 @@ import org.apache.james.mailbox.exception.UnsupportedRightException;
import org.apache.james.mailbox.model.MailboxACL;
import org.apache.james.mailbox.model.SimpleMailboxACL;
import org.apache.james.mailbox.store.json.SimpleMailboxACLJsonConverter;
-import org.apache.james.mailbox.store.mail.model.Mailbox;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -57,33 +58,36 @@ public class CassandraACLMapper {
void inject();
}
- private final Mailbox mailbox;
+ private final CassandraId cassandraId;
+ private final CassandraAsyncExecutor executor;
private final Session session;
private final int maxRetry;
private final CodeInjector codeInjector;
private static final Logger LOG = LoggerFactory.getLogger(CassandraACLMapper.class);
- public CassandraACLMapper(Mailbox mailbox, Session session, int maxRetry) {
- this(mailbox, session, maxRetry, () -> {});
+ public CassandraACLMapper(CassandraId cassandraId, Session session, int maxRetry) {
+ this(cassandraId, session, maxRetry, () -> {});
}
- public CassandraACLMapper(Mailbox mailbox, Session session, int maxRetry, CodeInjector codeInjector) {
+ public CassandraACLMapper(CassandraId cassandraId, Session session, int maxRetry, CodeInjector codeInjector) {
Preconditions.checkArgument(maxRetry > 0);
- Preconditions.checkArgument(mailbox.getMailboxId() != null);
- this.mailbox = mailbox;
+ Preconditions.checkArgument(cassandraId != null);
+ this.cassandraId = cassandraId;
this.session = session;
+ this.executor = new CassandraAsyncExecutor(session);
this.maxRetry = maxRetry;
this.codeInjector = codeInjector;
}
- public MailboxACL getACL() {
- ResultSet resultSet = getStoredACLRow();
- if (resultSet.isExhausted()) {
- return SimpleMailboxACL.EMPTY;
- }
- String serializedACL = resultSet.one().getString(CassandraACLTable.ACL);
- return deserializeACL(serializedACL);
+ public CompletableFuture<MailboxACL> getACL() {
+ return getStoredACLRow().thenApply(resultSet -> {
+ if (resultSet.isExhausted()) {
+ return SimpleMailboxACL.EMPTY;
+ }
+ String serializedACL = resultSet.one().getString(CassandraACLTable.ACL);
+ return deserializeACL(serializedACL);
+ });
}
public void updateACL(MailboxACL.MailboxACLCommand command) throws MailboxException {
@@ -111,23 +115,19 @@ public class CassandraACLMapper {
}
}
- private ResultSet getStoredACLRow() {
- CassandraId mailboxId = (CassandraId) mailbox.getMailboxId();
- return session.execute(
- select(CassandraACLTable.ACL, CassandraACLTable.VERSION)
- .from(CassandraACLTable.TABLE_NAME)
- .where(eq(CassandraMailboxTable.ID, mailboxId.asUuid()))
- );
+ private CompletableFuture<ResultSet> getStoredACLRow() {
+ return executor.execute(select(CassandraACLTable.ACL, CassandraACLTable.VERSION)
+ .from(CassandraACLTable.TABLE_NAME)
+ .where(eq(CassandraMailboxTable.ID, cassandraId.asUuid())));
}
private ResultSet updateStoredACL(ACLWithVersion aclWithVersion) {
try {
- CassandraId mailboxId = (CassandraId) mailbox.getMailboxId();
return session.execute(
update(CassandraACLTable.TABLE_NAME)
.with(set(CassandraACLTable.ACL, SimpleMailboxACLJsonConverter.toJson(aclWithVersion.mailboxACL)))
.and(set(CassandraACLTable.VERSION, aclWithVersion.version + 1))
- .where(eq(CassandraACLTable.ID, mailboxId.asUuid()))
+ .where(eq(CassandraACLTable.ID, cassandraId.asUuid()))
.onlyIf(eq(CassandraACLTable.VERSION, aclWithVersion.version))
);
} catch (JsonProcessingException exception) {
@@ -137,10 +137,9 @@ public class CassandraACLMapper {
private ResultSet insertACL(MailboxACL acl) {
try {
- CassandraId mailboxId = (CassandraId) mailbox.getMailboxId();
return session.execute(
insertInto(CassandraACLTable.TABLE_NAME)
- .value(CassandraACLTable.ID, mailboxId.asUuid())
+ .value(CassandraACLTable.ID, cassandraId.asUuid())
.value(CassandraACLTable.ACL, SimpleMailboxACLJsonConverter.toJson(acl))
.value(CassandraACLTable.VERSION, 0)
.ifNotExists()
@@ -151,7 +150,7 @@ public class CassandraACLMapper {
}
private Optional<ACLWithVersion> getAclWithVersion() {
- ResultSet resultSet = getStoredACLRow();
+ ResultSet resultSet = getStoredACLRow().join();
if (resultSet.isExhausted()) {
return Optional.empty();
}
@@ -165,8 +164,8 @@ public class CassandraACLMapper {
} catch(IOException exception) {
LOG.error("Unable to read stored ACL. " +
"We will use empty ACL instead." +
- "Mailbox is {}:{}:{} ." +
- "ACL is {}", mailbox.getNamespace(), mailbox.getUser(), mailbox.getName(), serializedACL, exception);
+ "Mailbox is {} ." +
+ "ACL is {}", cassandraId, serializedACL, exception);
return SimpleMailboxACL.EMPTY;
}
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/7b85c970/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java
index c2f824e..4314148 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java
@@ -158,7 +158,8 @@ public class CassandraMailboxMapper implements MailboxMapper {
@Override
public void updateACL(Mailbox mailbox, MailboxACL.MailboxACLCommand mailboxACLCommand) throws MailboxException {
- new CassandraACLMapper(mailbox, session, maxRetry).updateACL(mailboxACLCommand);
+ CassandraId cassandraId = (CassandraId) mailbox.getMailboxId();
+ new CassandraACLMapper(cassandraId, session, maxRetry).updateACL(mailboxACLCommand);
}
@Override
@@ -173,8 +174,9 @@ public class CassandraMailboxMapper implements MailboxMapper {
row.getUDTValue(MAILBOX_BASE).getString(MailboxBase.USER),
row.getString(NAME)),
row.getLong(UIDVALIDITY));
- mailbox.setMailboxId(CassandraId.of(row.getUUID(ID)));
- mailbox.setACL(new CassandraACLMapper(mailbox, session, maxRetry).getACL());
+ CassandraId mailboxId = CassandraId.of(row.getUUID(ID));
+ mailbox.setMailboxId(mailboxId);
+ mailbox.setACL(new CassandraACLMapper(mailboxId, session, maxRetry).getACL().join());
return mailbox;
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/7b85c970/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraACLMapperTest.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraACLMapperTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraACLMapperTest.java
index 008bcdf..ebff807 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraACLMapperTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraACLMapperTest.java
@@ -36,9 +36,7 @@ import org.apache.james.mailbox.cassandra.modules.CassandraAclModule;
import org.apache.james.mailbox.cassandra.table.CassandraACLTable;
import org.apache.james.mailbox.exception.MailboxException;
import org.apache.james.mailbox.model.MailboxACL;
-import org.apache.james.mailbox.model.MailboxPath;
import org.apache.james.mailbox.model.SimpleMailboxACL;
-import org.apache.james.mailbox.store.mail.model.impl.SimpleMailbox;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
@@ -47,22 +45,17 @@ import com.google.common.base.Throwables;
public class CassandraACLMapperTest {
+ public static final CassandraId MAILBOX_ID = CassandraId.of(UUID.fromString("464765a0-e4e7-11e4-aba4-710c1de3782b"));
+ public static final int MAX_RETRY = 100;
private CassandraACLMapper cassandraACLMapper;
private CassandraCluster cassandra;
- private SimpleMailbox mailbox;
- private int uidValidity;
- private int maxRetry;
private ExecutorService executor;
@Before
public void setUp() {
cassandra = CassandraCluster.create(new CassandraAclModule());
cassandra.ensureAllTables();
- uidValidity = 10;
- mailbox = new SimpleMailbox(new MailboxPath("#private", "benwa@linagora.com", "INBOX"), uidValidity);
- mailbox.setMailboxId(CassandraId.of(UUID.fromString("464765a0-e4e7-11e4-aba4-710c1de3782b")));
- maxRetry = 100;
- cassandraACLMapper = new CassandraACLMapper(mailbox, cassandra.getConf(), maxRetry);
+ cassandraACLMapper = new CassandraACLMapper(MAILBOX_ID, cassandra.getConf(), MAX_RETRY);
executor = Executors.newFixedThreadPool(2);
}
@@ -74,28 +67,23 @@ public class CassandraACLMapperTest {
@Test(expected = IllegalArgumentException.class)
public void creatingACLMapperWithNegativeMaxRetryShouldFail() {
- new CassandraACLMapper(mailbox, cassandra.getConf(), -1);
+ new CassandraACLMapper(MAILBOX_ID, cassandra.getConf(), -1);
}
@Test(expected = IllegalArgumentException.class)
public void creatingACLMapperWithNullMaxRetryShouldFail() {
- new CassandraACLMapper(mailbox, cassandra.getConf(), 0);
- }
-
- @Test(expected = IllegalArgumentException.class)
- public void creatingACLMapperWithNoMailboxIdShouldFail() {
- new CassandraACLMapper(new SimpleMailbox(new MailboxPath("#private", "user", "name"), uidValidity), cassandra.getConf(), maxRetry);
+ new CassandraACLMapper(MAILBOX_ID, cassandra.getConf(), 0);
}
@Test
public void retrieveACLWhenPresentInBaseShouldReturnCorrespondingACL() throws Exception {
cassandra.getConf().execute(
insertInto(CassandraACLTable.TABLE_NAME)
- .value(CassandraACLTable.ID, ((CassandraId) mailbox.getMailboxId()).asUuid())
+ .value(CassandraACLTable.ID, MAILBOX_ID.asUuid())
.value(CassandraACLTable.ACL, "{\"entries\":{\"bob\":64}}")
.value(CassandraACLTable.VERSION, 1)
);
- assertThat(cassandraACLMapper.getACL())
+ assertThat(cassandraACLMapper.getACL().join())
.isEqualTo(
SimpleMailboxACL.EMPTY.union(
new SimpleMailboxACL.SimpleMailboxACLEntryKey("bob", MailboxACL.NameType.user, false),
@@ -107,16 +95,16 @@ public class CassandraACLMapperTest {
public void retrieveACLWhenInvalidInBaseShouldReturnEmptyACL() throws Exception {
cassandra.getConf().execute(
insertInto(CassandraACLTable.TABLE_NAME)
- .value(CassandraACLTable.ID, ((CassandraId) mailbox.getMailboxId()).asUuid())
+ .value(CassandraACLTable.ID, MAILBOX_ID.asUuid())
.value(CassandraACLTable.ACL, "{\"entries\":{\"bob\":invalid}}")
.value(CassandraACLTable.VERSION, 1)
);
- assertThat(cassandraACLMapper.getACL()).isEqualTo(SimpleMailboxACL.EMPTY);
+ assertThat(cassandraACLMapper.getACL().join()).isEqualTo(SimpleMailboxACL.EMPTY);
}
@Test
public void retrieveACLWhenNoACLStoredShouldReturnEmptyACL() {
- assertThat(cassandraACLMapper.getACL()).isEqualTo(SimpleMailboxACL.EMPTY);
+ assertThat(cassandraACLMapper.getACL().join()).isEqualTo(SimpleMailboxACL.EMPTY);
}
@Test
@@ -124,7 +112,7 @@ public class CassandraACLMapperTest {
SimpleMailboxACL.SimpleMailboxACLEntryKey key = new SimpleMailboxACL.SimpleMailboxACLEntryKey("bob", MailboxACL.NameType.user, false);
SimpleMailboxACL.Rfc4314Rights rights = new SimpleMailboxACL.Rfc4314Rights(new SimpleMailboxACL.SimpleMailboxACLRight('r'));
cassandraACLMapper.updateACL(new SimpleMailboxACL.SimpleMailboxACLCommand(key, MailboxACL.EditMode.ADD, rights));
- assertThat(cassandraACLMapper.getACL()).isEqualTo(new SimpleMailboxACL().union(key, rights));
+ assertThat(cassandraACLMapper.getACL().join()).isEqualTo(new SimpleMailboxACL().union(key, rights));
}
@Test
@@ -134,7 +122,7 @@ public class CassandraACLMapperTest {
cassandraACLMapper.updateACL(new SimpleMailboxACL.SimpleMailboxACLCommand(keyBob, MailboxACL.EditMode.ADD, rights));
SimpleMailboxACL.SimpleMailboxACLEntryKey keyAlice = new SimpleMailboxACL.SimpleMailboxACLEntryKey("alice", MailboxACL.NameType.user, false);
cassandraACLMapper.updateACL(new SimpleMailboxACL.SimpleMailboxACLCommand(keyAlice, MailboxACL.EditMode.ADD, rights));
- assertThat(cassandraACLMapper.getACL()).isEqualTo(new SimpleMailboxACL().union(keyBob, rights).union(keyAlice, rights));
+ assertThat(cassandraACLMapper.getACL().join()).isEqualTo(new SimpleMailboxACL().union(keyBob, rights).union(keyAlice, rights));
}
@Test
@@ -143,7 +131,7 @@ public class CassandraACLMapperTest {
SimpleMailboxACL.Rfc4314Rights rights = new SimpleMailboxACL.Rfc4314Rights(new SimpleMailboxACL.SimpleMailboxACLRight('r'));
cassandraACLMapper.updateACL(new SimpleMailboxACL.SimpleMailboxACLCommand(key, MailboxACL.EditMode.ADD, rights));
cassandraACLMapper.updateACL(new SimpleMailboxACL.SimpleMailboxACLCommand(key, MailboxACL.EditMode.REMOVE, rights));
- assertThat(cassandraACLMapper.getACL()).isEqualTo(SimpleMailboxACL.EMPTY);
+ assertThat(cassandraACLMapper.getACL().join()).isEqualTo(SimpleMailboxACL.EMPTY);
}
@Test
@@ -152,7 +140,7 @@ public class CassandraACLMapperTest {
SimpleMailboxACL.Rfc4314Rights rights = new SimpleMailboxACL.Rfc4314Rights(new SimpleMailboxACL.SimpleMailboxACLRight('r'));
cassandraACLMapper.updateACL(new SimpleMailboxACL.SimpleMailboxACLCommand(key, MailboxACL.EditMode.ADD, rights));
cassandraACLMapper.updateACL(new SimpleMailboxACL.SimpleMailboxACLCommand(key, MailboxACL.EditMode.REPLACE, null));
- assertThat(cassandraACLMapper.getACL()).isEqualTo(SimpleMailboxACL.EMPTY);
+ assertThat(cassandraACLMapper.getACL().join()).isEqualTo(SimpleMailboxACL.EMPTY);
}
@Test
@@ -160,21 +148,21 @@ public class CassandraACLMapperTest {
SimpleMailboxACL.SimpleMailboxACLEntryKey key = new SimpleMailboxACL.SimpleMailboxACLEntryKey("bob", MailboxACL.NameType.user, false);
SimpleMailboxACL.Rfc4314Rights rights = new SimpleMailboxACL.Rfc4314Rights(new SimpleMailboxACL.SimpleMailboxACLRight('r'));
cassandraACLMapper.updateACL(new SimpleMailboxACL.SimpleMailboxACLCommand(key, MailboxACL.EditMode.REPLACE, rights));
- assertThat(cassandraACLMapper.getACL()).isEqualTo(new SimpleMailboxACL().union(key, rights));
+ assertThat(cassandraACLMapper.getACL().join()).isEqualTo(new SimpleMailboxACL().union(key, rights));
}
@Test
public void updateInvalidACLShouldBeBasedOnEmptyACL() throws Exception {
cassandra.getConf().execute(
insertInto(CassandraACLTable.TABLE_NAME)
- .value(CassandraACLTable.ID, ((CassandraId) mailbox.getMailboxId()).asUuid())
+ .value(CassandraACLTable.ID, MAILBOX_ID.asUuid())
.value(CassandraACLTable.ACL, "{\"entries\":{\"bob\":invalid}}")
.value(CassandraACLTable.VERSION, 1)
);
SimpleMailboxACL.SimpleMailboxACLEntryKey key = new SimpleMailboxACL.SimpleMailboxACLEntryKey("bob", MailboxACL.NameType.user, false);
SimpleMailboxACL.Rfc4314Rights rights = new SimpleMailboxACL.Rfc4314Rights(new SimpleMailboxACL.SimpleMailboxACLRight('r'));
cassandraACLMapper.updateACL(new SimpleMailboxACL.SimpleMailboxACLCommand(key, MailboxACL.EditMode.ADD, rights));
- assertThat(cassandraACLMapper.getACL()).isEqualTo(new SimpleMailboxACL().union(key, rights));
+ assertThat(cassandraACLMapper.getACL().join()).isEqualTo(new SimpleMailboxACL().union(key, rights));
}
@Test
@@ -186,7 +174,7 @@ public class CassandraACLMapperTest {
Future<Boolean> future1 = performACLUpdateInExecutor(executor, keyBob, rights, countDownLatch::countDown);
Future<Boolean> future2 = performACLUpdateInExecutor(executor, keyAlice, rights, countDownLatch::countDown);
awaitAll(future1, future2);
- assertThat(cassandraACLMapper.getACL()).isEqualTo(new SimpleMailboxACL().union(keyBob, rights).union(keyAlice, rights));
+ assertThat(cassandraACLMapper.getACL().join()).isEqualTo(new SimpleMailboxACL().union(keyBob, rights).union(keyAlice, rights));
}
@Test
@@ -200,7 +188,7 @@ public class CassandraACLMapperTest {
Future<Boolean> future1 = performACLUpdateInExecutor(executor, keyBob, rights, countDownLatch::countDown);
Future<Boolean> future2 = performACLUpdateInExecutor(executor, keyAlice, rights, countDownLatch::countDown);
awaitAll(future1, future2);
- assertThat(cassandraACLMapper.getACL()).isEqualTo(new SimpleMailboxACL().union(keyBob, rights).union(keyAlice, rights).union(keyBenwa, rights));
+ assertThat(cassandraACLMapper.getACL().join()).isEqualTo(new SimpleMailboxACL().union(keyBob, rights).union(keyAlice, rights).union(keyBenwa, rights));
}
private void awaitAll(Future<?>... futures)
@@ -212,7 +200,7 @@ public class CassandraACLMapperTest {
private Future<Boolean> performACLUpdateInExecutor(ExecutorService executor, SimpleMailboxACL.SimpleMailboxACLEntryKey key, SimpleMailboxACL.Rfc4314Rights rights, CassandraACLMapper.CodeInjector runnable) {
return executor.submit(() -> {
- CassandraACLMapper aclMapper = new CassandraACLMapper(mailbox, cassandra.getConf(), maxRetry, runnable);
+ CassandraACLMapper aclMapper = new CassandraACLMapper(MAILBOX_ID, cassandra.getConf(), MAX_RETRY, runnable);
try {
aclMapper.updateACL(new SimpleMailboxACL.SimpleMailboxACLCommand(key, MailboxACL.EditMode.ADD, rights));
} catch (MailboxException exception) {
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org
[11/20] james-project git commit: JAMES-1925 Introduce
CassandraMailboxPathDAO and its tests
Posted by ad...@apache.org.
JAMES-1925 Introduce CassandraMailboxPathDAO and its tests
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/422209ea
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/422209ea
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/422209ea
Branch: refs/heads/master
Commit: 422209ea46ae7b48b933b8165f7ad5e66dfc5b0f
Parents: 6cee136
Author: Benoit Tellier <bt...@linagora.com>
Authored: Tue Feb 14 09:28:39 2017 +0700
Committer: Antoine Duprat <ad...@linagora.com>
Committed: Wed Feb 15 13:12:38 2017 +0100
----------------------------------------------------------------------
.../cassandra/mail/CassandraMailboxPathDAO.java | 172 +++++++++++++++++++
.../table/CassandraMailboxPathTable.java | 2 +
.../mail/CassandraMailboxPathDAOTest.java | 138 +++++++++++++++
3 files changed, 312 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/james-project/blob/422209ea/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathDAO.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathDAO.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathDAO.java
new file mode 100644
index 0000000..552e010
--- /dev/null
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathDAO.java
@@ -0,0 +1,172 @@
+/****************************************************************
+ * 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.CassandraMailboxPathTable.FIELDS;
+import static org.apache.james.mailbox.cassandra.table.CassandraMailboxPathTable.MAILBOX_ID;
+import static org.apache.james.mailbox.cassandra.table.CassandraMailboxPathTable.MAILBOX_NAME;
+import static org.apache.james.mailbox.cassandra.table.CassandraMailboxPathTable.NAMESPACE_AND_USER;
+import static org.apache.james.mailbox.cassandra.table.CassandraMailboxPathTable.TABLE_NAME;
+
+import java.util.Optional;
+import java.util.concurrent.CompletableFuture;
+import java.util.stream.Stream;
+
+import javax.inject.Inject;
+
+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.CassandraId;
+import org.apache.james.mailbox.cassandra.mail.utils.MailboxBaseTupleUtil;
+import org.apache.james.mailbox.cassandra.table.CassandraMailboxTable;
+import org.apache.james.mailbox.model.MailboxPath;
+
+import com.datastax.driver.core.PreparedStatement;
+import com.datastax.driver.core.Row;
+import com.datastax.driver.core.Session;
+import com.datastax.driver.core.querybuilder.QueryBuilder;
+import com.google.common.base.Objects;
+
+public class CassandraMailboxPathDAO {
+
+ public static class CassandraIdAndPath {
+ private final CassandraId cassandraId;
+ private final MailboxPath mailboxPath;
+
+ public CassandraIdAndPath(CassandraId cassandraId, MailboxPath mailboxPath) {
+ this.cassandraId = cassandraId;
+ this.mailboxPath = mailboxPath;
+ }
+
+ public CassandraId getCassandraId() {
+ return cassandraId;
+ }
+
+ public MailboxPath getMailboxPath() {
+ return mailboxPath;
+ }
+
+ @Override
+ public final boolean equals(Object o) {
+ if (o instanceof CassandraIdAndPath) {
+ CassandraIdAndPath that = (CassandraIdAndPath) o;
+
+ return Objects.equal(this.cassandraId, that.cassandraId)
+ && Objects.equal(this.mailboxPath, that.mailboxPath);
+ }
+ return false;
+ }
+
+ @Override
+ public final int hashCode() {
+ return Objects.hashCode(cassandraId, mailboxPath);
+ }
+ }
+
+ private final CassandraAsyncExecutor cassandraAsyncExecutor;
+ private final MailboxBaseTupleUtil mailboxBaseTupleUtil;
+ private final PreparedStatement delete;
+ private final PreparedStatement insert;
+ private final PreparedStatement select;
+ private final PreparedStatement selectAll;
+
+ @Inject
+ public CassandraMailboxPathDAO(Session session, CassandraTypesProvider typesProvider) {
+ this.cassandraAsyncExecutor = new CassandraAsyncExecutor(session);
+ this.mailboxBaseTupleUtil = new MailboxBaseTupleUtil(typesProvider);
+ this.insert = prepareInsert(session);
+ this.delete = prepareDelete(session);
+ this.select = prepareSelect(session);
+ this.selectAll = prepareSelectAll(session);
+ }
+
+ private PreparedStatement prepareDelete(Session session) {
+ return session.prepare(QueryBuilder.delete()
+ .from(TABLE_NAME)
+ .where(eq(NAMESPACE_AND_USER, bindMarker(NAMESPACE_AND_USER)))
+ .and(eq(MAILBOX_NAME, bindMarker(MAILBOX_NAME))));
+ }
+
+ private PreparedStatement prepareInsert(Session session) {
+ return session.prepare(insertInto(TABLE_NAME)
+ .value(NAMESPACE_AND_USER, bindMarker(NAMESPACE_AND_USER))
+ .value(MAILBOX_NAME, bindMarker(MAILBOX_NAME))
+ .value(MAILBOX_ID, bindMarker(MAILBOX_ID))
+ .ifNotExists());
+ }
+
+ private PreparedStatement prepareSelect(Session session) {
+ return session.prepare(select(FIELDS)
+ .from(TABLE_NAME)
+ .where(eq(NAMESPACE_AND_USER, bindMarker(NAMESPACE_AND_USER)))
+ .and(eq(MAILBOX_NAME, bindMarker(MAILBOX_NAME))));
+ }
+
+ private PreparedStatement prepareSelectAll(Session session) {
+ return session.prepare(select(FIELDS)
+ .from(TABLE_NAME)
+ .where(eq(NAMESPACE_AND_USER, bindMarker(NAMESPACE_AND_USER))));
+ }
+
+ public CompletableFuture<Optional<CassandraIdAndPath>> retrieveId(MailboxPath mailboxPath) {
+ return cassandraAsyncExecutor.executeSingleRow(
+ select.bind()
+ .setUDTValue(NAMESPACE_AND_USER, mailboxBaseTupleUtil.createMailboxBaseUDT(mailboxPath.getNamespace(), mailboxPath.getUser()))
+ .setString(MAILBOX_NAME, mailboxPath.getName()))
+ .thenApply(rowOptional ->
+ rowOptional.map(row -> new CassandraIdAndPath(
+ CassandraId.of(row.getUUID(MAILBOX_ID)),
+ mailboxPath)));
+ }
+
+ public CompletableFuture<Stream<CassandraIdAndPath>> listUserMailboxes(String namespace, String user) {
+ return cassandraAsyncExecutor.execute(
+ selectAll.bind()
+ .setUDTValue(NAMESPACE_AND_USER, mailboxBaseTupleUtil.createMailboxBaseUDT(namespace, user)))
+ .thenApply(resultSet -> CassandraUtils.convertToStream(resultSet).map(this::fromRowToCassandraIdAndPath));
+ }
+
+ private CassandraIdAndPath fromRowToCassandraIdAndPath(Row row) {
+ return new CassandraIdAndPath(
+ CassandraId.of(row.getUUID(MAILBOX_ID)),
+ new MailboxPath(row.getUDTValue(NAMESPACE_AND_USER).getString(CassandraMailboxTable.MailboxBase.NAMESPACE),
+ row.getUDTValue(NAMESPACE_AND_USER).getString(CassandraMailboxTable.MailboxBase.USER),
+ row.getString(MAILBOX_NAME)));
+ }
+
+ public CompletableFuture<Boolean> save(MailboxPath mailboxPath, CassandraId mailboxId) {
+ return cassandraAsyncExecutor.executeReturnApplied(insert.bind()
+ .setUDTValue(NAMESPACE_AND_USER, mailboxBaseTupleUtil.createMailboxBaseUDT(mailboxPath.getNamespace(), mailboxPath.getUser()))
+ .setString(MAILBOX_NAME, mailboxPath.getName())
+ .setUUID(MAILBOX_ID, mailboxId.asUuid()));
+ }
+
+ public CompletableFuture<Void> delete(MailboxPath mailboxPath) {
+ return cassandraAsyncExecutor.executeVoid(delete.bind()
+ .setUDTValue(NAMESPACE_AND_USER, mailboxBaseTupleUtil.createMailboxBaseUDT(mailboxPath.getNamespace(), mailboxPath.getUser()))
+ .setString(MAILBOX_NAME, mailboxPath.getName()));
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/james-project/blob/422209ea/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMailboxPathTable.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMailboxPathTable.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMailboxPathTable.java
index be9eb54..efc6168 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMailboxPathTable.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMailboxPathTable.java
@@ -29,4 +29,6 @@ public interface CassandraMailboxPathTable {
String MAILBOX_ID = "mailboxId";
+ String[] FIELDS = { NAMESPACE_AND_USER, MAILBOX_NAME, MAILBOX_ID};
+
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/422209ea/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathDAOTest.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathDAOTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathDAOTest.java
new file mode 100644
index 0000000..b6c1c10
--- /dev/null
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathDAOTest.java
@@ -0,0 +1,138 @@
+/****************************************************************
+ * 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.List;
+import java.util.Optional;
+
+import org.apache.james.backends.cassandra.CassandraCluster;
+import org.apache.james.mailbox.cassandra.CassandraId;
+import org.apache.james.mailbox.cassandra.mail.CassandraMailboxPathDAO.CassandraIdAndPath;
+import org.apache.james.mailbox.cassandra.modules.CassandraMailboxModule;
+import org.apache.james.mailbox.model.MailboxPath;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.github.steveash.guavate.Guavate;
+
+import nl.jqno.equalsverifier.EqualsVerifier;
+
+public class CassandraMailboxPathDAOTest {
+ private static final String PRIVATE_NAMESPACE = "#private";
+ private static final String USER = "user";
+ private static final String OTHER_USER = "other";
+ private static final CassandraId INBOX_ID = CassandraId.timeBased();
+ private static final CassandraId OUTBOX_ID = CassandraId.timeBased();
+ private static final CassandraId otherMailboxId = CassandraId.timeBased();
+
+ public static final MailboxPath USER_INBOX_MAILBOXPATH = new MailboxPath(PRIVATE_NAMESPACE, USER, "INBOX");
+ public static final CassandraIdAndPath INBOX_ID_AND_PATH = new CassandraIdAndPath(INBOX_ID, USER_INBOX_MAILBOXPATH);
+ public static final MailboxPath USER_OUTBOX_MAILBOXPATH = new MailboxPath(PRIVATE_NAMESPACE, USER, "OUTBOX");
+ public static final MailboxPath OTHER_USER_MAILBOXPATH = new MailboxPath(PRIVATE_NAMESPACE, OTHER_USER, "INBOX");
+
+ private CassandraCluster cassandra;
+
+ private CassandraMailboxPathDAO testee;
+
+ @Before
+ public void setUp() throws Exception {
+ cassandra = CassandraCluster.create(new CassandraMailboxModule());
+ cassandra.ensureAllTables();
+
+ testee = new CassandraMailboxPathDAO(cassandra.getConf(), cassandra.getTypesProvider());
+
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ cassandra.clearAllTables();
+ }
+
+ @Test
+ public void cassandraIdAndPathShouldRespectBeanContract() {
+ EqualsVerifier.forClass(CassandraMailboxPathDAO.CassandraIdAndPath.class).verify();
+ }
+
+ @Test
+ public void saveShouldInsertNewEntry() throws Exception {
+ assertThat(testee.save(USER_INBOX_MAILBOXPATH, INBOX_ID).join()).isTrue();
+
+ Optional<CassandraIdAndPath> cassandraIdAndPath = testee.retrieveId(USER_INBOX_MAILBOXPATH).join();
+ assertThat(cassandraIdAndPath.get())
+ .isEqualTo(INBOX_ID_AND_PATH);
+ }
+
+ @Test
+ public void saveOnSecondShouldBeFalse() throws Exception {
+ assertThat(testee.save(USER_INBOX_MAILBOXPATH, INBOX_ID).join()).isTrue();
+ assertThat(testee.save(USER_INBOX_MAILBOXPATH, INBOX_ID).join()).isFalse();
+ }
+
+ @Test
+ public void retrieveIdShouldReturnEmptyWhenEmptyData() throws Exception {
+ assertThat(testee.retrieveId(USER_INBOX_MAILBOXPATH).join()
+ .isPresent())
+ .isFalse();
+ }
+
+ @Test
+ public void retrieveIdShouldReturnStoredData() throws Exception {
+ testee.save(USER_INBOX_MAILBOXPATH, INBOX_ID).join();
+
+ Optional<CassandraIdAndPath> cassandraIdAndPath = testee.retrieveId(USER_INBOX_MAILBOXPATH).join();
+ assertThat(cassandraIdAndPath.get())
+ .isEqualTo(INBOX_ID_AND_PATH);
+ }
+
+ @Test
+ public void getUserMailboxesShouldReturnAllMailboxesOfUser() throws Exception {
+ testee.save(USER_INBOX_MAILBOXPATH, INBOX_ID).join();
+ testee.save(USER_OUTBOX_MAILBOXPATH, OUTBOX_ID).join();
+ testee.save(OTHER_USER_MAILBOXPATH, otherMailboxId).join();
+
+ List<CassandraIdAndPath> cassandraIds = testee
+ .listUserMailboxes(USER_INBOX_MAILBOXPATH.getNamespace(), USER_INBOX_MAILBOXPATH.getUser())
+ .join()
+ .collect(Guavate.toImmutableList());
+
+ assertThat(cassandraIds)
+ .hasSize(2)
+ .containsOnly(INBOX_ID_AND_PATH, new CassandraIdAndPath(OUTBOX_ID, USER_OUTBOX_MAILBOXPATH));
+ }
+
+ @Test
+ public void deleteShouldNotThrowWhenEmpty() throws Exception {
+ testee.delete(USER_INBOX_MAILBOXPATH).join();
+ }
+
+ @Test
+ public void deleteShouldDeleteTheExistingMailboxId() throws Exception {
+ testee.save(USER_INBOX_MAILBOXPATH, INBOX_ID).join();
+
+ testee.delete(USER_INBOX_MAILBOXPATH).join();
+
+ assertThat(testee.retrieveId(USER_INBOX_MAILBOXPATH).join()
+ .isPresent())
+ .isFalse();
+ }
+}
\ No newline at end of file
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org
[04/20] james-project git commit: JAMES-1925 Util for unboxing
CompletableFuture streams
Posted by ad...@apache.org.
JAMES-1925 Util for unboxing CompletableFuture streams
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/7c223af7
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/7c223af7
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/7c223af7
Branch: refs/heads/master
Commit: 7c223af725dd24ab8d4ab3a6915acfebb9777d19
Parents: be93338
Author: Benoit Tellier <bt...@linagora.com>
Authored: Tue Feb 14 10:55:39 2017 +0700
Committer: Antoine Duprat <ad...@linagora.com>
Committed: Wed Feb 15 13:12:37 2017 +0100
----------------------------------------------------------------------
.../james/util/CompletableFutureUtil.java | 40 ++++++++++++++
.../james/util/CompletableFutureUtilTest.java | 57 ++++++++++++++++++++
2 files changed, 97 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/james-project/blob/7c223af7/server/container/util-java8/src/main/java/org/apache/james/util/CompletableFutureUtil.java
----------------------------------------------------------------------
diff --git a/server/container/util-java8/src/main/java/org/apache/james/util/CompletableFutureUtil.java b/server/container/util-java8/src/main/java/org/apache/james/util/CompletableFutureUtil.java
new file mode 100644
index 0000000..2d114ab
--- /dev/null
+++ b/server/container/util-java8/src/main/java/org/apache/james/util/CompletableFutureUtil.java
@@ -0,0 +1,40 @@
+/****************************************************************
+ * 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.util;
+
+import java.util.concurrent.CompletableFuture;
+import java.util.stream.Stream;
+
+public class CompletableFutureUtil {
+
+ public static <T> CompletableFuture<Stream<T>> allOf(Stream<CompletableFuture<T>> futureStream) {
+ return futureStream
+ .map(future -> future.thenApply(Stream::of))
+ .reduce((future1, future2) ->
+ future1.thenCompose(
+ stream1 -> future2.thenCompose(
+ stream2 -> {
+ Stream<T> concatStream = Stream.concat(stream1, stream2);
+ return CompletableFuture.completedFuture(concatStream);
+ })))
+ .orElse(CompletableFuture.completedFuture(Stream.of()));
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/james-project/blob/7c223af7/server/container/util-java8/src/test/java/org/apache/james/util/CompletableFutureUtilTest.java
----------------------------------------------------------------------
diff --git a/server/container/util-java8/src/test/java/org/apache/james/util/CompletableFutureUtilTest.java b/server/container/util-java8/src/test/java/org/apache/james/util/CompletableFutureUtilTest.java
new file mode 100644
index 0000000..fa12233
--- /dev/null
+++ b/server/container/util-java8/src/test/java/org/apache/james/util/CompletableFutureUtilTest.java
@@ -0,0 +1,57 @@
+/****************************************************************
+ * 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.util;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.util.concurrent.CompletableFuture;
+import java.util.stream.Stream;
+
+import org.junit.Test;
+
+import com.github.steveash.guavate.Guavate;
+
+public class CompletableFutureUtilTest {
+
+ @Test
+ public void allOfShouldUnboxEmptyStream() {
+ assertThat(
+ CompletableFutureUtil.allOf(Stream.empty())
+ .join()
+ .collect(Guavate.toImmutableList()))
+ .isEmpty();
+ }
+
+ @Test
+ public void allOfShouldUnboxStream() {
+ long value1 = 18L;
+ long value2 = 19L;
+ long value3 = 20L;
+ assertThat(
+ CompletableFutureUtil.allOf(
+ Stream.of(
+ CompletableFuture.completedFuture(value1),
+ CompletableFuture.completedFuture(value2),
+ CompletableFuture.completedFuture(value3)))
+ .join()
+ .collect(Guavate.toImmutableList()))
+ .containsOnly(value1, value2, value3);
+ }
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org
[19/20] james-project git commit: JAMES-1925 Adding tests for
concurrency upon saving mailboxes
Posted by ad...@apache.org.
JAMES-1925 Adding tests for concurrency upon saving mailboxes
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/3a8d407f
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/3a8d407f
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/3a8d407f
Branch: refs/heads/master
Commit: 3a8d407fc7a45e91fff538010e49b0218f1797e6
Parents: f653a1f
Author: Benoit Tellier <bt...@linagora.com>
Authored: Tue Feb 14 16:34:15 2017 +0700
Committer: Antoine Duprat <ad...@linagora.com>
Committed: Wed Feb 15 13:12:39 2017 +0100
----------------------------------------------------------------------
.../CassandraMailboxMapperConcurrencyTest.java | 67 ++++++++++++++++++++
1 file changed, 67 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/james-project/blob/3a8d407f/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapperConcurrencyTest.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapperConcurrencyTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapperConcurrencyTest.java
new file mode 100644
index 0000000..b6612be
--- /dev/null
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapperConcurrencyTest.java
@@ -0,0 +1,67 @@
+/****************************************************************
+ * 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.concurrent.TimeUnit;
+
+import org.apache.james.backends.cassandra.CassandraCluster;
+import org.apache.james.backends.cassandra.init.CassandraModuleComposite;
+import org.apache.james.mailbox.cassandra.modules.CassandraAclModule;
+import org.apache.james.mailbox.cassandra.modules.CassandraMailboxModule;
+import org.apache.james.mailbox.model.MailboxPath;
+import org.apache.james.mailbox.store.mail.model.impl.SimpleMailbox;
+import org.apache.james.util.concurrency.ConcurrentTestRunner;
+import org.junit.Before;
+import org.junit.Test;
+
+
+public class CassandraMailboxMapperConcurrencyTest {
+
+ public static final int MAX_RETRY = 10;
+ public static final int UID_VALIDITY = 52;
+ public static final MailboxPath MAILBOX_PATH = new MailboxPath("#private", "user", "name");
+ public static final int THREAD_COUNT = 10;
+ public static final int OPERATION_COUNT = 10;
+ private CassandraCluster cassandra;
+ private CassandraMailboxMapper testee;
+
+ @Before
+ public void setUp() {
+ cassandra = CassandraCluster.create(new CassandraModuleComposite(new CassandraMailboxModule(), new CassandraAclModule()));
+ cassandra.ensureAllTables();
+
+ CassandraMailboxDAO mailboxDAO = new CassandraMailboxDAO(cassandra.getConf(), cassandra.getTypesProvider(), MAX_RETRY);
+ CassandraMailboxPathDAO mailboxPathDAO = new CassandraMailboxPathDAO(cassandra.getConf(), cassandra.getTypesProvider());
+ testee = new CassandraMailboxMapper(cassandra.getConf(), mailboxDAO, mailboxPathDAO, MAX_RETRY);
+ }
+
+ @Test
+ public void saveShouldBeThreadSafe() throws Exception {
+ boolean termination = new ConcurrentTestRunner(THREAD_COUNT, OPERATION_COUNT,
+ (a, b) -> testee.save(new SimpleMailbox(MAILBOX_PATH, UID_VALIDITY)))
+ .run()
+ .awaitTermination(1, TimeUnit.MINUTES);
+
+ assertThat(termination).isTrue();
+ assertThat(testee.list()).hasSize(1);
+ }
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org
[10/20] james-project git commit: JAMES-1925 Adding cassandra table
for MailboxPath mailbox indexing
Posted by ad...@apache.org.
JAMES-1925 Adding cassandra table for MailboxPath mailbox indexing
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/3c2dc467
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/3c2dc467
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/3c2dc467
Branch: refs/heads/master
Commit: 3c2dc467bde2c77cf28954b95f4f19cfd1ae4113
Parents: 7b85c97
Author: Benoit Tellier <bt...@linagora.com>
Authored: Tue Feb 14 09:21:18 2017 +0700
Committer: Antoine Duprat <ad...@linagora.com>
Committed: Wed Feb 15 13:12:38 2017 +0100
----------------------------------------------------------------------
.../modules/CassandraMailboxModule.java | 13 ++++++--
.../table/CassandraMailboxPathTable.java | 32 ++++++++++++++++++++
2 files changed, 43 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/james-project/blob/3c2dc467/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 b664098..8858504 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
@@ -20,10 +20,13 @@
package org.apache.james.mailbox.cassandra.modules;
import com.datastax.driver.core.schemabuilder.SchemaBuilder;
+import com.google.common.collect.ImmutableList;
+
import org.apache.james.backends.cassandra.components.CassandraIndex;
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.CassandraMailboxPathTable;
import org.apache.james.mailbox.cassandra.table.CassandraMailboxTable;
import java.util.Arrays;
@@ -41,7 +44,7 @@ public class CassandraMailboxModule implements CassandraModule {
private final List<CassandraType> types;
public CassandraMailboxModule() {
- tables = Collections.singletonList(
+ tables = ImmutableList.of(
new CassandraTable(CassandraMailboxTable.TABLE_NAME,
SchemaBuilder.createTable(CassandraMailboxTable.TABLE_NAME)
.ifNotExists()
@@ -49,7 +52,13 @@ public class CassandraMailboxModule implements CassandraModule {
.addUDTColumn(CassandraMailboxTable.MAILBOX_BASE, SchemaBuilder.frozen(CassandraMailboxTable.MAILBOX_BASE))
.addColumn(CassandraMailboxTable.NAME, text())
.addColumn(CassandraMailboxTable.PATH, text())
- .addColumn(CassandraMailboxTable.UIDVALIDITY, bigint())));
+ .addColumn(CassandraMailboxTable.UIDVALIDITY, bigint())),
+ new CassandraTable(CassandraMailboxPathTable.TABLE_NAME,
+ SchemaBuilder.createTable(CassandraMailboxPathTable.TABLE_NAME)
+ .ifNotExists()
+ .addUDTPartitionKey(CassandraMailboxPathTable.NAMESPACE_AND_USER, SchemaBuilder.frozen(CassandraMailboxTable.MAILBOX_BASE))
+ .addClusteringColumn(CassandraMailboxPathTable.MAILBOX_NAME, text())
+ .addColumn(CassandraMailboxPathTable.MAILBOX_ID, timeuuid())));
index = Arrays.asList(
new CassandraIndex(
SchemaBuilder.createIndex(CassandraIndex.INDEX_PREFIX + CassandraMailboxTable.TABLE_NAME)
http://git-wip-us.apache.org/repos/asf/james-project/blob/3c2dc467/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMailboxPathTable.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMailboxPathTable.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMailboxPathTable.java
new file mode 100644
index 0000000..be9eb54
--- /dev/null
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMailboxPathTable.java
@@ -0,0 +1,32 @@
+/****************************************************************
+ * 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;
+
+public interface CassandraMailboxPathTable {
+
+ String TABLE_NAME = "mailboxPath";
+
+ String NAMESPACE_AND_USER = "namespaceAndUser";
+
+ String MAILBOX_NAME = "mailboxName";
+
+ String MAILBOX_ID = "mailboxId";
+
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org
[15/20] james-project git commit: JAMES-1929 Remove useless column
and indexes
Posted by ad...@apache.org.
JAMES-1929 Remove useless column and indexes
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/3176d37b
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/3176d37b
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/3176d37b
Branch: refs/heads/master
Commit: 3176d37bdcca2846301fbe388a7955c13feaec7f
Parents: e007c1d
Author: Benoit Tellier <bt...@linagora.com>
Authored: Tue Feb 14 15:24:44 2017 +0700
Committer: Antoine Duprat <ad...@linagora.com>
Committed: Wed Feb 15 13:12:39 2017 +0100
----------------------------------------------------------------------
.../mailbox/cassandra/mail/CassandraMailboxDAO.java | 9 ++-------
.../cassandra/modules/CassandraMailboxModule.java | 15 ++-------------
.../cassandra/table/CassandraMailboxTable.java | 3 +--
3 files changed, 5 insertions(+), 22 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/james-project/blob/3176d37b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxDAO.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxDAO.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxDAO.java
index 9966151..3f6f86c 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxDAO.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxDAO.java
@@ -29,7 +29,6 @@ import static org.apache.james.mailbox.cassandra.table.CassandraMailboxTable.FIE
import static org.apache.james.mailbox.cassandra.table.CassandraMailboxTable.ID;
import static org.apache.james.mailbox.cassandra.table.CassandraMailboxTable.MAILBOX_BASE;
import static org.apache.james.mailbox.cassandra.table.CassandraMailboxTable.NAME;
-import static org.apache.james.mailbox.cassandra.table.CassandraMailboxTable.PATH;
import static org.apache.james.mailbox.cassandra.table.CassandraMailboxTable.TABLE_NAME;
import static org.apache.james.mailbox.cassandra.table.CassandraMailboxTable.UIDVALIDITY;
@@ -88,15 +87,13 @@ public class CassandraMailboxDAO {
.value(ID, bindMarker(ID))
.value(NAME, bindMarker(NAME))
.value(UIDVALIDITY, bindMarker(UIDVALIDITY))
- .value(MAILBOX_BASE, bindMarker(MAILBOX_BASE))
- .value(PATH, bindMarker(PATH)));
+ .value(MAILBOX_BASE, bindMarker(MAILBOX_BASE)));
}
private PreparedStatement prepareUpdate(Session session) {
return session.prepare(update(TABLE_NAME)
.with(set(MAILBOX_BASE, bindMarker(MAILBOX_BASE)))
.and(set(NAME, bindMarker(NAME)))
- .and(set(PATH, bindMarker(PATH)))
.where(eq(ID, bindMarker(ID))));
}
@@ -121,14 +118,12 @@ public class CassandraMailboxDAO {
.setUUID(ID, cassandraId.asUuid())
.setString(NAME, mailbox.getName())
.setLong(UIDVALIDITY, mailbox.getUidValidity())
- .setUDTValue(MAILBOX_BASE, mailboxBaseTupleUtil.createMailboxBaseUDT(mailbox.getNamespace(), mailbox.getUser()))
- .setString(PATH, mailbox.generateAssociatedPath().asString()));
+ .setUDTValue(MAILBOX_BASE, mailboxBaseTupleUtil.createMailboxBaseUDT(mailbox.getNamespace(), mailbox.getUser())));
}
public CompletableFuture<Void> updatePath(CassandraId mailboxId, MailboxPath mailboxPath) {
return executor.executeVoid(updateStatement.bind()
.setUUID(ID, mailboxId.asUuid())
- .setString(PATH, mailboxPath.asString())
.setString(NAME, mailboxPath.getName())
.setUDTValue(MAILBOX_BASE, mailboxBaseTupleUtil.createMailboxBaseUDT(mailboxPath.getNamespace(), mailboxPath.getUser())));
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/3176d37b/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 8858504..566992a 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
@@ -51,7 +51,6 @@ public class CassandraMailboxModule implements CassandraModule {
.addPartitionKey(CassandraMailboxTable.ID, timeuuid())
.addUDTColumn(CassandraMailboxTable.MAILBOX_BASE, SchemaBuilder.frozen(CassandraMailboxTable.MAILBOX_BASE))
.addColumn(CassandraMailboxTable.NAME, text())
- .addColumn(CassandraMailboxTable.PATH, text())
.addColumn(CassandraMailboxTable.UIDVALIDITY, bigint())),
new CassandraTable(CassandraMailboxPathTable.TABLE_NAME,
SchemaBuilder.createTable(CassandraMailboxPathTable.TABLE_NAME)
@@ -59,18 +58,8 @@ public class CassandraMailboxModule implements CassandraModule {
.addUDTPartitionKey(CassandraMailboxPathTable.NAMESPACE_AND_USER, SchemaBuilder.frozen(CassandraMailboxTable.MAILBOX_BASE))
.addClusteringColumn(CassandraMailboxPathTable.MAILBOX_NAME, text())
.addColumn(CassandraMailboxPathTable.MAILBOX_ID, timeuuid())));
- index = Arrays.asList(
- new CassandraIndex(
- SchemaBuilder.createIndex(CassandraIndex.INDEX_PREFIX + CassandraMailboxTable.TABLE_NAME)
- .ifNotExists()
- .onTable(CassandraMailboxTable.TABLE_NAME)
- .andColumn(CassandraMailboxTable.PATH)),
- new CassandraIndex(
- SchemaBuilder.createIndex(CassandraIndex.INDEX_PREFIX + CassandraMailboxTable.MAILBOX_BASE)
- .ifNotExists()
- .onTable(CassandraMailboxTable.TABLE_NAME)
- .andColumn(CassandraMailboxTable.MAILBOX_BASE)));
- types = Collections.singletonList(
+ index = ImmutableList.of();
+ types = ImmutableList.of(
new CassandraType(CassandraMailboxTable.MAILBOX_BASE,
SchemaBuilder.createType(CassandraMailboxTable.MAILBOX_BASE)
.ifNotExists()
http://git-wip-us.apache.org/repos/asf/james-project/blob/3176d37b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMailboxTable.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMailboxTable.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMailboxTable.java
index c9687ba..e301552 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMailboxTable.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMailboxTable.java
@@ -23,11 +23,10 @@ package org.apache.james.mailbox.cassandra.table;
public interface CassandraMailboxTable {
String TABLE_NAME = "mailbox";
String ID = "id";
- String PATH = "path";
String MAILBOX_BASE = "mailboxbase";
String UIDVALIDITY = "uidvalidity";
String NAME = "name";
- String[] FIELDS = { ID, MAILBOX_BASE, UIDVALIDITY, NAME, PATH };
+ String[] FIELDS = { ID, MAILBOX_BASE, UIDVALIDITY, NAME };
interface MailboxBase {
String USER = "user";
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org
[13/20] james-project git commit: JAMES-1925 Solve mailboxRenames by
reading oldPath first
Posted by ad...@apache.org.
JAMES-1925 Solve mailboxRenames by reading oldPath first
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/0063d303
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/0063d303
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/0063d303
Branch: refs/heads/master
Commit: 0063d303c12931fe62b64651fb3c96419790c619
Parents: 3176d37
Author: Benoit Tellier <bt...@linagora.com>
Authored: Tue Feb 14 16:19:52 2017 +0700
Committer: Antoine Duprat <ad...@linagora.com>
Committed: Wed Feb 15 13:12:39 2017 +0100
----------------------------------------------------------------------
.../cassandra/mail/CassandraMailboxMapper.java | 21 ++++++++++++++++----
1 file changed, 17 insertions(+), 4 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/james-project/blob/0063d303/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java
index 959bacf..1f1e163 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java
@@ -121,10 +121,15 @@ public class CassandraMailboxMapper implements MailboxMapper {
public void save(Mailbox mailbox) throws MailboxException {
Preconditions.checkArgument(mailbox instanceof SimpleMailbox);
SimpleMailbox cassandraMailbox = (SimpleMailbox) mailbox;
- if (cassandraMailbox.getMailboxId() == null) {
- cassandraMailbox.setMailboxId(CassandraId.timeBased());
- }
- boolean applied = mailboxPathDAO.save(mailbox.generateAssociatedPath(), (CassandraId) cassandraMailbox.getMailboxId())
+
+ CassandraId cassandraId = retrieveId(cassandraMailbox);
+ cassandraMailbox.setMailboxId(cassandraId);
+
+ boolean applied = mailboxDAO.retrieveMailbox(cassandraId)
+ .thenCompose(optional -> optional
+ .map(storedMailbox -> mailboxPathDAO.delete(storedMailbox.generateAssociatedPath()))
+ .orElse(CompletableFuture.completedFuture(null)))
+ .thenCompose(any -> mailboxPathDAO.save(mailbox.generateAssociatedPath(), cassandraId))
.thenCompose(result -> {
if (result) {
return mailboxDAO.save(cassandraMailbox).thenApply(any -> result);
@@ -136,6 +141,14 @@ public class CassandraMailboxMapper implements MailboxMapper {
}
}
+ private CassandraId retrieveId(SimpleMailbox cassandraMailbox) {
+ if (cassandraMailbox.getMailboxId() == null) {
+ return CassandraId.timeBased();
+ } else {
+ return (CassandraId) cassandraMailbox.getMailboxId();
+ }
+ }
+
@Override
public boolean hasChildren(Mailbox mailbox, char delimiter) {
return mailboxPathDAO.listUserMailboxes(mailbox.getNamespace(), mailbox.getUser())
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org