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 <[email protected]>
Authored: Tue Feb 14 16:46:33 2017 +0700
Committer: Antoine Duprat <[email protected]>
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: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to