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