MAILBOX-307 Dealing with CassandraACLMapper is the job of CassandraMailboxMapper, not of its DAO
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/ee68d17c Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/ee68d17c Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/ee68d17c Branch: refs/heads/master Commit: ee68d17cba1d10e14d2cb6de2e605dc7c10bddb9 Parents: edf8a9a Author: benwa <btell...@linagora.com> Authored: Mon Sep 25 16:59:46 2017 +0700 Committer: Matthieu Baechler <matth...@apache.org> Committed: Fri Sep 29 09:20:40 2017 +0200 ---------------------------------------------------------------------- .../cassandra/mail/CassandraMailboxDAO.java | 39 +++----------------- .../cassandra/mail/CassandraMailboxMapper.java | 32 ++++++++++++++-- 2 files changed, 34 insertions(+), 37 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/ee68d17c/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 7d0dead..96075a4 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 @@ -34,22 +34,18 @@ import static org.apache.james.mailbox.cassandra.table.CassandraMailboxTable.UID 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.CassandraConfiguration; import org.apache.james.backends.cassandra.init.CassandraTypesProvider; import org.apache.james.backends.cassandra.utils.CassandraAsyncExecutor; import org.apache.james.backends.cassandra.utils.CassandraUtils; import org.apache.james.mailbox.cassandra.ids.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 org.apache.james.util.FluentFutureStream; import com.datastax.driver.core.PreparedStatement; @@ -68,10 +64,9 @@ public class CassandraMailboxDAO { private final PreparedStatement deleteStatement; private final PreparedStatement insertStatement; private final PreparedStatement updateStatement; - private CassandraACLMapper cassandraACLMapper; @Inject - public CassandraMailboxDAO(Session session, CassandraTypesProvider typesProvider, CassandraUtils cassandraUtils, CassandraConfiguration cassandraConfiguration) { + public CassandraMailboxDAO(Session session, CassandraTypesProvider typesProvider, CassandraUtils cassandraUtils) { this.executor = new CassandraAsyncExecutor(session); this.mailboxBaseTupleUtil = new MailboxBaseTupleUtil(typesProvider); this.insertStatement = prepareInsert(session); @@ -80,12 +75,11 @@ public class CassandraMailboxDAO { this.listStatement = prepareList(session); this.readStatement = prepareRead(session); this.cassandraUtils = cassandraUtils; - this.cassandraACLMapper = new CassandraACLMapper(session, cassandraConfiguration); } @VisibleForTesting public CassandraMailboxDAO(Session session, CassandraTypesProvider typesProvider) { - this(session, typesProvider, CassandraUtils.WITH_DEFAULT_CONFIGURATION, CassandraConfiguration.DEFAULT_CONFIGURATION); + this(session, typesProvider, CassandraUtils.WITH_DEFAULT_CONFIGURATION); } private PreparedStatement prepareInsert(Session session) { @@ -140,17 +134,10 @@ public class CassandraMailboxDAO { } public CompletableFuture<Optional<SimpleMailbox>> retrieveMailbox(CassandraId mailboxId) { - CompletableFuture<MailboxACL> aclCompletableFuture = cassandraACLMapper.getACL(mailboxId); - - CompletableFuture<Optional<SimpleMailbox>> simpleMailboxFuture = executor.executeSingleRow(readStatement.bind() + return executor.executeSingleRow(readStatement.bind() .setUUID(ID, mailboxId.asUuid())) .thenApply(rowOptional -> rowOptional.map(this::mailboxFromRow)) .thenApply(mailbox -> addMailboxId(mailboxId, mailbox)); - - return CompletableFutureUtil.combine( - aclCompletableFuture, - simpleMailboxFuture, - this::addAcl); } private Optional<SimpleMailbox> addMailboxId(CassandraId cassandraId, Optional<SimpleMailbox> mailboxOptional) { @@ -158,11 +145,6 @@ public class CassandraMailboxDAO { return mailboxOptional; } - private Optional<SimpleMailbox> addAcl(MailboxACL acl, Optional<SimpleMailbox> mailboxOptional) { - mailboxOptional.ifPresent(mailbox -> mailbox.setACL(acl)); - return mailboxOptional; - } - private SimpleMailbox mailboxFromRow(Row row) { return new SimpleMailbox( new MailboxPath( @@ -172,12 +154,10 @@ public class CassandraMailboxDAO { row.getLong(UIDVALIDITY)); } - public CompletableFuture<Stream<SimpleMailbox>> retrieveAllMailboxes() { + public FluentFutureStream<SimpleMailbox> retrieveAllMailboxes() { return FluentFutureStream.of(executor.execute(listStatement.bind()) .thenApply(cassandraUtils::convertToStream)) - .map(this::toMailboxWithId) - .thenComposeOnAll(this::toMailboxWithAclFuture) - .completableFuture(); + .map(this::toMailboxWithId); } private SimpleMailbox toMailboxWithId(Row row) { @@ -186,13 +166,4 @@ public class CassandraMailboxDAO { return mailbox; } - private CompletableFuture<SimpleMailbox> toMailboxWithAclFuture(SimpleMailbox mailbox) { - CassandraId cassandraId = (CassandraId) mailbox.getMailboxId(); - return cassandraACLMapper.getACL(cassandraId) - .thenApply(acl -> { - mailbox.setACL(acl); - return mailbox; - }); - } - } http://git-wip-us.apache.org/repos/asf/james-project/blob/ee68d17c/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 a997152..a9a31d8 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 @@ -107,11 +107,27 @@ public class CassandraMailboxMapper implements MailboxMapper { @Override public Mailbox findMailboxById(MailboxId id) throws MailboxException { CassandraId mailboxId = (CassandraId) id; - return mailboxDAO.retrieveMailbox(mailboxId) + return retrieveMailbox(mailboxId) .join() .orElseThrow(() -> new MailboxNotFoundException(id.serialize())); } + private CompletableFuture<Optional<SimpleMailbox>> retrieveMailbox(CassandraId mailboxId) { + CompletableFuture<MailboxACL> aclCompletableFuture = cassandraACLMapper.getACL(mailboxId); + + CompletableFuture<Optional<SimpleMailbox>> simpleMailboxFuture = mailboxDAO.retrieveMailbox(mailboxId); + + return CompletableFutureUtil.combine( + aclCompletableFuture, + simpleMailboxFuture, + this::addAcl); + } + + private Optional<SimpleMailbox> addAcl(MailboxACL acl, Optional<SimpleMailbox> mailboxOptional) { + mailboxOptional.ifPresent(mailbox -> mailbox.setACL(acl)); + return mailboxOptional; + } + @Override public List<Mailbox> findMailboxWithPathLike(MailboxPath path) throws MailboxException { Pattern regex = Pattern.compile(constructEscapedRegexForMailboxNameMatching(path)); @@ -124,7 +140,7 @@ public class CassandraMailboxMapper implements MailboxMapper { } private CompletableFuture<Optional<SimpleMailbox>> retrieveMailbox(CassandraMailboxPathDAO.CassandraIdAndPath idAndPath) { - return mailboxDAO.retrieveMailbox(idAndPath.getCassandraId()) + return retrieveMailbox(idAndPath.getCassandraId()) .thenApply(optional -> OptionalUtils.ifEmpty(optional, () -> LOGGER.warn("Could not retrieve mailbox {} with path {} in mailbox table.", idAndPath.getCassandraId(), idAndPath.getMailboxPath()))); } @@ -150,7 +166,7 @@ public class CassandraMailboxMapper implements MailboxMapper { private CompletableFuture<Boolean> trySave(SimpleMailbox cassandraMailbox, CassandraId cassandraId) { return mailboxPathDAO.save(cassandraMailbox.generateAssociatedPath(), cassandraId) .thenCompose(CompletableFutureUtil.composeIfTrue( - () -> mailboxDAO.retrieveMailbox(cassandraId) + () -> retrieveMailbox(cassandraId) .thenCompose(optional -> CompletableFuture .allOf(optional .map(storedMailbox -> mailboxPathDAO.delete(storedMailbox.generateAssociatedPath())) @@ -189,6 +205,7 @@ public class CassandraMailboxMapper implements MailboxMapper { @Override public List<Mailbox> list() throws MailboxException { return mailboxDAO.retrieveAllMailboxes() + .thenComposeOnAll(this::toMailboxWithAclFuture) .join() .collect(Guavate.toImmutableList()); } @@ -231,4 +248,13 @@ public class CassandraMailboxMapper implements MailboxMapper { } } + private CompletableFuture<SimpleMailbox> toMailboxWithAclFuture(SimpleMailbox mailbox) { + CassandraId cassandraId = (CassandraId) mailbox.getMailboxId(); + return cassandraACLMapper.getACL(cassandraId) + .thenApply(acl -> { + mailbox.setACL(acl); + return mailbox; + }); + } + } --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org