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]
