MAILBOX-304 Relies Attachment DAO - Separation of concern between DAO and business code - Prepared statements - Will make upgrading storage easier - Also this commit allow not propagating CassandraMailboxSessionMapperFactory internal DAOs to test implementers (limit code spread upon Cassandra coding) - Adding unit tests for attachment 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/b8303bef Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/b8303bef Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/b8303bef Branch: refs/heads/master Commit: b8303bef410f3a0eafc599d1626ed61ca7b3ae7d Parents: 6ad3c7e Author: benwa <btell...@linagora.com> Authored: Wed Sep 6 16:51:00 2017 +0700 Committer: benwa <btell...@linagora.com> Committed: Wed Sep 6 17:55:52 2017 +0700 ---------------------------------------------------------------------- .../CassandraMailboxSessionMapperFactory.java | 49 ++++---- .../cassandra/mail/CassandraAttachmentDAO.java | 119 +++++++++++++++++++ .../mail/CassandraAttachmentMapper.java | 68 ++--------- .../CassandraMailboxManagerProvider.java | 41 +------ .../CassandraSubscriptionManagerTest.java | 9 +- .../cassandra/CassandraTestSystemFixture.java | 42 +------ .../mail/CassandraAttachmentDAOTest.java | 79 ++++++++++++ .../CassandraMailboxManagerAttachmentTest.java | 23 +--- .../cassandra/mail/CassandraMapperProvider.java | 23 +--- .../cassandra/host/CassandraHostSystem.java | 45 +------ 10 files changed, 258 insertions(+), 240 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/b8303bef/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 3d6ee37..2db0e01 100644 --- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxSessionMapperFactory.java +++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxSessionMapperFactory.java @@ -22,11 +22,15 @@ package org.apache.james.mailbox.cassandra; 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.CassandraUtils; import org.apache.james.mailbox.MailboxSession; +import org.apache.james.mailbox.cassandra.ids.CassandraMessageId; import org.apache.james.mailbox.cassandra.mail.CassandraAnnotationMapper; import org.apache.james.mailbox.cassandra.mail.CassandraApplicableFlagDAO; +import org.apache.james.mailbox.cassandra.mail.CassandraAttachmentDAO; import org.apache.james.mailbox.cassandra.mail.CassandraAttachmentMapper; +import org.apache.james.mailbox.cassandra.mail.CassandraBlobsDAO; import org.apache.james.mailbox.cassandra.mail.CassandraDeletedMessageDAO; import org.apache.james.mailbox.cassandra.mail.CassandraFirstUnseenDAO; import org.apache.james.mailbox.cassandra.mail.CassandraIndexTableHandler; @@ -73,6 +77,7 @@ public class CassandraMailboxSessionMapperFactory extends MailboxSessionMapperFa private final CassandraMailboxPathDAO mailboxPathDAO; private final CassandraFirstUnseenDAO firstUnseenDAO; private final CassandraApplicableFlagDAO applicableFlagDAO; + private final CassandraAttachmentDAO attachmentDAO; private CassandraUtils cassandraUtils; private CassandraConfiguration cassandraConfiguration; private final CassandraDeletedMessageDAO deletedMessageDAO; @@ -83,7 +88,8 @@ public class CassandraMailboxSessionMapperFactory extends MailboxSessionMapperFa CassandraMessageIdDAO messageIdDAO, CassandraMessageIdToImapUidDAO imapUidDAO, CassandraMailboxCounterDAO mailboxCounterDAO, CassandraMailboxRecentsDAO mailboxRecentsDAO, CassandraMailboxDAO mailboxDAO, CassandraMailboxPathDAO mailboxPathDAO, CassandraFirstUnseenDAO firstUnseenDAO, CassandraApplicableFlagDAO applicableFlagDAO, - CassandraDeletedMessageDAO deletedMessageDAO, CassandraUtils cassandraUtils, CassandraConfiguration cassandraConfiguration) { + CassandraAttachmentDAO attachmentDAO, CassandraDeletedMessageDAO deletedMessageDAO, CassandraUtils cassandraUtils, + CassandraConfiguration cassandraConfiguration) { this.uidProvider = uidProvider; this.modSeqProvider = modSeqProvider; this.session = session; @@ -95,6 +101,7 @@ public class CassandraMailboxSessionMapperFactory extends MailboxSessionMapperFa this.mailboxDAO = mailboxDAO; this.mailboxPathDAO = mailboxPathDAO; this.firstUnseenDAO = firstUnseenDAO; + this.attachmentDAO = attachmentDAO; this.deletedMessageDAO = deletedMessageDAO; this.applicableFlagDAO = applicableFlagDAO; this.cassandraUtils = cassandraUtils; @@ -107,24 +114,24 @@ public class CassandraMailboxSessionMapperFactory extends MailboxSessionMapperFa deletedMessageDAO); } - public CassandraMailboxSessionMapperFactory( - CassandraUidProvider uidProvider, - CassandraModSeqProvider modSeqProvider, - Session session, - CassandraMessageDAO messageDAO, - CassandraMessageIdDAO messageIdDAO, - CassandraMessageIdToImapUidDAO imapUidDAO, - CassandraMailboxCounterDAO mailboxCounterDAO, - CassandraMailboxRecentsDAO mailboxRecentsDAO, - CassandraMailboxDAO mailboxDAO, - CassandraMailboxPathDAO mailboxPathDAO, - CassandraFirstUnseenDAO firstUnseenDAO, - CassandraApplicableFlagDAO applicableFlagDAO, - CassandraDeletedMessageDAO deletedMesageDAO) { - - this(uidProvider, modSeqProvider, session, messageDAO, messageIdDAO, imapUidDAO, mailboxCounterDAO, - mailboxRecentsDAO, mailboxDAO, mailboxPathDAO, firstUnseenDAO, applicableFlagDAO, deletedMesageDAO, - CassandraUtils.WITH_DEFAULT_CONFIGURATION, CassandraConfiguration.DEFAULT_CONFIGURATION); + public CassandraMailboxSessionMapperFactory(Session session, CassandraTypesProvider typesProvider, + CassandraMessageId.Factory factory) { + this(new CassandraUidProvider(session), + new CassandraModSeqProvider(session), + session, + new CassandraMessageDAO(session, typesProvider, new CassandraBlobsDAO(session)), + new CassandraMessageIdDAO(session, factory), + new CassandraMessageIdToImapUidDAO(session, factory), + new CassandraMailboxCounterDAO(session), + new CassandraMailboxRecentsDAO(session), + new CassandraMailboxDAO(session, typesProvider), + new CassandraMailboxPathDAO(session, typesProvider), + new CassandraFirstUnseenDAO(session), + new CassandraApplicableFlagDAO(session), + new CassandraAttachmentDAO(session), + new CassandraDeletedMessageDAO(session), + CassandraUtils.WITH_DEFAULT_CONFIGURATION, + CassandraConfiguration.DEFAULT_CONFIGURATION); } @Override @@ -134,7 +141,7 @@ public class CassandraMailboxSessionMapperFactory extends MailboxSessionMapperFa modSeqProvider, null, (CassandraAttachmentMapper) createAttachmentMapper(mailboxSession), - messageDAO, + messageDAO, messageIdDAO, imapUidDAO, mailboxCounterDAO, @@ -161,7 +168,7 @@ public class CassandraMailboxSessionMapperFactory extends MailboxSessionMapperFa @Override public AttachmentMapper createAttachmentMapper(MailboxSession mailboxSession) { - return new CassandraAttachmentMapper(session); + return new CassandraAttachmentMapper(attachmentDAO); } @Override http://git-wip-us.apache.org/repos/asf/james-project/blob/b8303bef/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentDAO.java ---------------------------------------------------------------------- diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentDAO.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentDAO.java new file mode 100644 index 0000000..386d8df --- /dev/null +++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentDAO.java @@ -0,0 +1,119 @@ +/**************************************************************** + * Licensed to the Apache Software Foundation (ASF) under one * + * or more contributor license agreements. See the NOTICE file * + * distributed with this work for additional information * + * regarding copyright ownership. The ASF licenses this file * + * to you under the Apache License, Version 2.0 (the * + * "License"); you may not use this file except in compliance * + * with the License. You may obtain a copy of the License at * + * * + * http://www.apache.org/licenses/LICENSE-2.0 * + * * + * Unless required by applicable law or agreed to in writing, * + * software distributed under the License is distributed on an * + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * + * KIND, either express or implied. See the License for the * + * specific language governing permissions and limitations * + * under the License. * + ****************************************************************/ + +package org.apache.james.mailbox.cassandra.mail; + +import static com.datastax.driver.core.querybuilder.QueryBuilder.bindMarker; +import static com.datastax.driver.core.querybuilder.QueryBuilder.eq; +import static com.datastax.driver.core.querybuilder.QueryBuilder.insertInto; +import static com.datastax.driver.core.querybuilder.QueryBuilder.select; +import static org.apache.james.mailbox.cassandra.table.CassandraAttachmentTable.FIELDS; +import static org.apache.james.mailbox.cassandra.table.CassandraAttachmentTable.ID; +import static org.apache.james.mailbox.cassandra.table.CassandraAttachmentTable.PAYLOAD; +import static org.apache.james.mailbox.cassandra.table.CassandraAttachmentTable.SIZE; +import static org.apache.james.mailbox.cassandra.table.CassandraAttachmentTable.TABLE_NAME; +import static org.apache.james.mailbox.cassandra.table.CassandraAttachmentTable.TYPE; + +import java.io.IOException; +import java.nio.ByteBuffer; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; + +import javax.inject.Inject; + +import org.apache.james.backends.cassandra.utils.CassandraAsyncExecutor; +import org.apache.james.mailbox.model.Attachment; +import org.apache.james.mailbox.model.AttachmentId; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.datastax.driver.core.PreparedStatement; +import com.datastax.driver.core.Row; +import com.datastax.driver.core.Session; +import com.google.common.base.Preconditions; + +public class CassandraAttachmentDAO { + + private static final Logger LOGGER = LoggerFactory.getLogger(CassandraAttachmentMapper.class); + private static final boolean NO_LOG_IF_EMPTY = false; + + private final CassandraAsyncExecutor cassandraAsyncExecutor; + private final PreparedStatement insertStatement; + private final PreparedStatement selectStatement; + + @Inject + public CassandraAttachmentDAO(Session session) { + this.cassandraAsyncExecutor = new CassandraAsyncExecutor(session); + + this.selectStatement = prepareSelect(session); + this.insertStatement = prepareInsert(session); + } + + private PreparedStatement prepareInsert(Session session) { + return session.prepare( + insertInto(TABLE_NAME) + .value(ID, bindMarker(ID)) + .value(PAYLOAD, bindMarker(PAYLOAD)) + .value(TYPE, bindMarker(TYPE)) + .value(SIZE, bindMarker(SIZE))); + } + + private PreparedStatement prepareSelect(Session session) { + return session.prepare(select(FIELDS) + .from(TABLE_NAME) + .where(eq(ID, bindMarker(ID)))); + } + + public CompletableFuture<Optional<Attachment>> getAttachment(AttachmentId attachmentId) { + return getAttachment(attachmentId, NO_LOG_IF_EMPTY); + } + + public CompletableFuture<Optional<Attachment>> getAttachment(AttachmentId attachmentId, boolean logIfEmpty) { + Preconditions.checkArgument(attachmentId != null); + return cassandraAsyncExecutor.executeSingleRow( + selectStatement.bind() + .setString(ID, attachmentId.getId())) + .thenApply(optional -> optional.map(this::attachment)) + .thenApply(optional -> logNotFound(attachmentId, logIfEmpty, optional)); + } + + private Optional<Attachment> logNotFound(AttachmentId attachmentId, boolean logIfEmpty, Optional<Attachment> optional) { + if (!optional.isPresent() && logIfEmpty) { + LOGGER.warn("Failed retrieving attachment {}", attachmentId); + } + return optional; + } + + public CompletableFuture<Void> storeAttachment(Attachment attachment) throws IOException { + return cassandraAsyncExecutor.executeVoid( + insertStatement.bind() + .setString(ID, attachment.getAttachmentId().getId()) + .setLong(SIZE, attachment.getSize()) + .setString(TYPE, attachment.getType()) + .setBytes(PAYLOAD, ByteBuffer.wrap(attachment.getBytes()))); + } + + private Attachment attachment(Row row) { + return Attachment.builder() + .attachmentId(AttachmentId.from(row.getString(ID))) + .bytes(row.getBytes(PAYLOAD).array()) + .type(row.getString(TYPE)) + .build(); + } +} http://git-wip-us.apache.org/repos/asf/james-project/blob/b8303bef/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentMapper.java ---------------------------------------------------------------------- diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentMapper.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentMapper.java index a385751..0a346e8 100644 --- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentMapper.java +++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentMapper.java @@ -19,18 +19,7 @@ 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.CassandraAttachmentTable.FIELDS; -import static org.apache.james.mailbox.cassandra.table.CassandraAttachmentTable.ID; -import static org.apache.james.mailbox.cassandra.table.CassandraAttachmentTable.PAYLOAD; -import static org.apache.james.mailbox.cassandra.table.CassandraAttachmentTable.SIZE; -import static org.apache.james.mailbox.cassandra.table.CassandraAttachmentTable.TABLE_NAME; -import static org.apache.james.mailbox.cassandra.table.CassandraAttachmentTable.TYPE; - import java.io.IOException; -import java.nio.ByteBuffer; import java.util.Collection; import java.util.List; import java.util.Optional; @@ -39,7 +28,6 @@ import java.util.stream.Stream; import javax.inject.Inject; -import org.apache.james.backends.cassandra.utils.CassandraAsyncExecutor; import org.apache.james.mailbox.exception.AttachmentNotFoundException; import org.apache.james.mailbox.exception.MailboxException; import org.apache.james.mailbox.model.Attachment; @@ -47,11 +35,7 @@ import org.apache.james.mailbox.model.AttachmentId; import org.apache.james.mailbox.store.mail.AttachmentMapper; import org.apache.james.util.FluentFutureStream; import org.apache.james.util.OptionalUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import com.datastax.driver.core.Row; -import com.datastax.driver.core.Session; import com.github.fge.lambdas.Throwing; import com.github.fge.lambdas.ThrownByLambdaException; import com.github.steveash.guavate.Guavate; @@ -60,12 +44,13 @@ import com.google.common.collect.ImmutableList; public class CassandraAttachmentMapper implements AttachmentMapper { - private static final Logger LOGGER = LoggerFactory.getLogger(CassandraAttachmentMapper.class); - private final CassandraAsyncExecutor cassandraAsyncExecutor; + private static final boolean LOG_IF_EMPTY = true; + + private final CassandraAttachmentDAO attachmentDAO; @Inject - public CassandraAttachmentMapper(Session session) { - this.cassandraAsyncExecutor = new CassandraAsyncExecutor(session); + public CassandraAttachmentMapper(CassandraAttachmentDAO attachmentDAO) { + this.attachmentDAO = attachmentDAO; } @Override @@ -80,23 +65,11 @@ public class CassandraAttachmentMapper implements AttachmentMapper { @Override public Attachment getAttachment(AttachmentId attachmentId) throws AttachmentNotFoundException { Preconditions.checkArgument(attachmentId != null); - return cassandraAsyncExecutor.executeSingleRow( - select(FIELDS) - .from(TABLE_NAME) - .where(eq(ID, attachmentId.getId()))) - .thenApply(optional -> optional.map(this::attachment)) + return attachmentDAO.getAttachment(attachmentId) .join() .orElseThrow(() -> new AttachmentNotFoundException(attachmentId.getId())); } - private Attachment attachment(Row row) { - return Attachment.builder() - .attachmentId(AttachmentId.from(row.getString(ID))) - .bytes(row.getBytes(PAYLOAD).array()) - .type(row.getString(TYPE)) - .build(); - } - @Override public List<Attachment> getAttachments(Collection<AttachmentId> attachmentIds) { return getAttachmentsAsFuture(attachmentIds).join(); @@ -108,7 +81,7 @@ public class CassandraAttachmentMapper implements AttachmentMapper { Stream<CompletableFuture<Optional<Attachment>>> attachments = attachmentIds .stream() .distinct() - .map(this::getAttachmentAsFuture); + .map(id -> attachmentDAO.getAttachment(id, LOG_IF_EMPTY)); return FluentFutureStream .of(attachments) @@ -116,44 +89,21 @@ public class CassandraAttachmentMapper implements AttachmentMapper { .collect(Guavate.toImmutableList()); } - private CompletableFuture<Optional<Attachment>> getAttachmentAsFuture(AttachmentId attachmentId) { - String id = attachmentId.getId(); - - return cassandraAsyncExecutor.executeSingleRow( - select(FIELDS) - .from(TABLE_NAME) - .where(eq(ID, id))) - .thenApply(optional -> - OptionalUtils.ifEmpty( - optional.map(this::attachment), - () -> LOGGER.warn("Failed retrieving attachment {}", attachmentId))); - } - @Override public void storeAttachment(Attachment attachment) throws MailboxException { try { - asyncStoreAttachment(attachment).join(); + attachmentDAO.storeAttachment(attachment).join(); } catch (IOException e) { throw new MailboxException(e.getMessage(), e); } } - private CompletableFuture<Void> asyncStoreAttachment(Attachment attachment) throws IOException { - return cassandraAsyncExecutor.executeVoid( - insertInto(TABLE_NAME) - .value(ID, attachment.getAttachmentId().getId()) - .value(PAYLOAD, ByteBuffer.wrap(attachment.getBytes())) - .value(TYPE, attachment.getType()) - .value(SIZE, attachment.getSize()) - ); - } - @Override public void storeAttachments(Collection<Attachment> attachments) throws MailboxException { try { FluentFutureStream.of( attachments.stream() - .map(Throwing.function(this::asyncStoreAttachment))) + .map(Throwing.function(attachmentDAO::storeAttachment))) .join(); } catch (ThrownByLambdaException e) { throw new MailboxException(e.getCause().getMessage(), e.getCause()); http://git-wip-us.apache.org/repos/asf/james-project/blob/b8303bef/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerProvider.java ---------------------------------------------------------------------- diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerProvider.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerProvider.java index 0589cc6..9baf216 100644 --- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerProvider.java +++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerProvider.java @@ -25,19 +25,6 @@ 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.ids.CassandraMessageId; -import org.apache.james.mailbox.cassandra.mail.CassandraApplicableFlagDAO; -import org.apache.james.mailbox.cassandra.mail.CassandraBlobsDAO; -import org.apache.james.mailbox.cassandra.mail.CassandraDeletedMessageDAO; -import org.apache.james.mailbox.cassandra.mail.CassandraFirstUnseenDAO; -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; -import org.apache.james.mailbox.cassandra.mail.CassandraMessageIdToImapUidDAO; -import org.apache.james.mailbox.cassandra.mail.CassandraModSeqProvider; -import org.apache.james.mailbox.cassandra.mail.CassandraUidProvider; import org.apache.james.mailbox.exception.MailboxException; import org.apache.james.mailbox.store.Authenticator; import org.apache.james.mailbox.store.Authorizator; @@ -52,34 +39,12 @@ public class CassandraMailboxManagerProvider { private static final int LIMIT_ANNOTATION_SIZE = 30; public static CassandraMailboxManager provideMailboxManager(Session session, CassandraTypesProvider cassandraTypesProvider) { - CassandraUidProvider uidProvider = new CassandraUidProvider(session); - CassandraModSeqProvider modSeqProvider = new CassandraModSeqProvider(session); CassandraMessageId.Factory messageIdFactory = new CassandraMessageId.Factory(); - CassandraMessageIdDAO messageIdDAO = new CassandraMessageIdDAO(session, messageIdFactory); - CassandraMessageIdToImapUidDAO imapUidDAO = new CassandraMessageIdToImapUidDAO(session, messageIdFactory); - CassandraBlobsDAO blobsDAO = new CassandraBlobsDAO(session); - CassandraMessageDAO messageDAO = new CassandraMessageDAO(session, cassandraTypesProvider, blobsDAO); - CassandraMailboxCounterDAO mailboxCounterDAO = new CassandraMailboxCounterDAO(session); - CassandraMailboxRecentsDAO mailboxRecentsDAO = new CassandraMailboxRecentsDAO(session); - CassandraMailboxDAO mailboxDAO = new CassandraMailboxDAO(session, cassandraTypesProvider); - CassandraMailboxPathDAO mailboxPathDAO = new CassandraMailboxPathDAO(session, cassandraTypesProvider); - CassandraFirstUnseenDAO firstUnseenDAO = new CassandraFirstUnseenDAO(session); - CassandraApplicableFlagDAO applicableFlagDAO = new CassandraApplicableFlagDAO(session); - CassandraDeletedMessageDAO deletedMessageDAO = new CassandraDeletedMessageDAO(session); - CassandraMailboxSessionMapperFactory mapperFactory = new CassandraMailboxSessionMapperFactory(uidProvider, - modSeqProvider, + CassandraMailboxSessionMapperFactory mapperFactory = new CassandraMailboxSessionMapperFactory( session, - messageDAO, - messageIdDAO, - imapUidDAO, - mailboxCounterDAO, - mailboxRecentsDAO, - mailboxDAO, - mailboxPathDAO, - firstUnseenDAO, - applicableFlagDAO, - deletedMessageDAO); + cassandraTypesProvider, + messageIdFactory); MailboxACLResolver aclResolver = new UnionMailboxACLResolver(); GroupMembershipResolver groupMembershipResolver = new SimpleGroupMembershipResolver(); http://git-wip-us.apache.org/repos/asf/james-project/blob/b8303bef/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 bd3a31e..8f8139c 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 @@ -21,10 +21,13 @@ package org.apache.james.mailbox.cassandra; import org.apache.james.backends.cassandra.CassandraCluster; import org.apache.james.backends.cassandra.DockerCassandraRule; +import org.apache.james.backends.cassandra.init.CassandraConfiguration; import org.apache.james.backends.cassandra.init.CassandraModuleComposite; +import org.apache.james.backends.cassandra.utils.CassandraUtils; import org.apache.james.mailbox.AbstractSubscriptionManagerTest; import org.apache.james.mailbox.SubscriptionManager; import org.apache.james.mailbox.cassandra.mail.CassandraApplicableFlagDAO; +import org.apache.james.mailbox.cassandra.mail.CassandraAttachmentDAO; import org.apache.james.mailbox.cassandra.mail.CassandraDeletedMessageDAO; import org.apache.james.mailbox.cassandra.mail.CassandraFirstUnseenDAO; import org.apache.james.mailbox.cassandra.mail.CassandraMailboxCounterDAO; @@ -82,6 +85,7 @@ public class CassandraSubscriptionManagerTest extends AbstractSubscriptionManage CassandraMailboxPathDAO mailboxPathDAO = null; CassandraFirstUnseenDAO firstUnseenDAO = null; CassandraApplicableFlagDAO applicableFlagDAO = null; + CassandraAttachmentDAO attachmentDAO = null; CassandraDeletedMessageDAO deletedMessageDAO = null; return new CassandraSubscriptionManager( new CassandraMailboxSessionMapperFactory( @@ -97,6 +101,9 @@ public class CassandraSubscriptionManagerTest extends AbstractSubscriptionManage mailboxPathDAO, firstUnseenDAO, applicableFlagDAO, - deletedMessageDAO)); + attachmentDAO, + deletedMessageDAO, + CassandraUtils.WITH_DEFAULT_CONFIGURATION, + CassandraConfiguration.DEFAULT_CONFIGURATION)); } } http://git-wip-us.apache.org/repos/asf/james-project/blob/b8303bef/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 6450073..3606d81 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 @@ -23,19 +23,6 @@ import static org.mockito.Mockito.mock; import org.apache.james.backends.cassandra.CassandraCluster; import org.apache.james.mailbox.cassandra.ids.CassandraMessageId; -import org.apache.james.mailbox.cassandra.mail.CassandraApplicableFlagDAO; -import org.apache.james.mailbox.cassandra.mail.CassandraBlobsDAO; -import org.apache.james.mailbox.cassandra.mail.CassandraDeletedMessageDAO; -import org.apache.james.mailbox.cassandra.mail.CassandraFirstUnseenDAO; -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; -import org.apache.james.mailbox.cassandra.mail.CassandraMessageIdToImapUidDAO; -import org.apache.james.mailbox.cassandra.mail.CassandraModSeqProvider; -import org.apache.james.mailbox.cassandra.mail.CassandraUidProvider; import org.apache.james.mailbox.cassandra.quota.CassandraCurrentQuotaManager; import org.apache.james.mailbox.cassandra.quota.CassandraPerUserMaxQuotaManager; import org.apache.james.mailbox.quota.CurrentQuotaManager; @@ -55,35 +42,12 @@ public class CassandraTestSystemFixture { public static final int MOD_SEQ = 452; public static CassandraMailboxSessionMapperFactory createMapperFactory(CassandraCluster cassandra) { - CassandraUidProvider uidProvider = new CassandraUidProvider(cassandra.getConf()); - CassandraModSeqProvider modSeqProvider = new CassandraModSeqProvider(cassandra.getConf()); CassandraMessageId.Factory messageIdFactory = new CassandraMessageId.Factory(); - CassandraMessageIdDAO messageIdDAO = new CassandraMessageIdDAO(cassandra.getConf(), messageIdFactory); - CassandraMessageIdToImapUidDAO imapUidDAO = new CassandraMessageIdToImapUidDAO(cassandra.getConf(), messageIdFactory); - CassandraBlobsDAO blobsDAO = new CassandraBlobsDAO(cassandra.getConf()); - CassandraMessageDAO messageDAO = new CassandraMessageDAO(cassandra.getConf(), cassandra.getTypesProvider(), blobsDAO); - CassandraMailboxCounterDAO mailboxCounterDAO = new CassandraMailboxCounterDAO(cassandra.getConf()); - CassandraMailboxRecentsDAO mailboxRecentsDAO = new CassandraMailboxRecentsDAO(cassandra.getConf()); - CassandraApplicableFlagDAO applicableFlagDAO = new CassandraApplicableFlagDAO(cassandra.getConf()); - CassandraMailboxDAO mailboxDAO = new CassandraMailboxDAO(cassandra.getConf(), cassandra.getTypesProvider()); - CassandraMailboxPathDAO mailboxPathDAO = new CassandraMailboxPathDAO(cassandra.getConf(), cassandra.getTypesProvider()); - CassandraFirstUnseenDAO firstUnseenDAO = new CassandraFirstUnseenDAO(cassandra.getConf()); - CassandraDeletedMessageDAO deletedMessageDAO = new CassandraDeletedMessageDAO(cassandra.getConf()); - - return new CassandraMailboxSessionMapperFactory(uidProvider, - modSeqProvider, + return new CassandraMailboxSessionMapperFactory( cassandra.getConf(), - messageDAO, - messageIdDAO, - imapUidDAO, - mailboxCounterDAO, - mailboxRecentsDAO, - mailboxDAO, - mailboxPathDAO, - firstUnseenDAO, - applicableFlagDAO, - deletedMessageDAO); + cassandra.getTypesProvider(), + messageIdFactory); } public static CassandraMailboxManager createMailboxManager(CassandraMailboxSessionMapperFactory mapperFactory) throws Exception{ http://git-wip-us.apache.org/repos/asf/james-project/blob/b8303bef/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentDAOTest.java ---------------------------------------------------------------------- diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentDAOTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentDAOTest.java new file mode 100644 index 0000000..c44bde8 --- /dev/null +++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentDAOTest.java @@ -0,0 +1,79 @@ +/**************************************************************** + * Licensed to the Apache Software Foundation (ASF) under one * + * or more contributor license agreements. See the NOTICE file * + * distributed with this work for additional information * + * regarding copyright ownership. The ASF licenses this file * + * to you under the Apache License, Version 2.0 (the * + * "License"); you may not use this file except in compliance * + * with the License. You may obtain a copy of the License at * + * * + * http://www.apache.org/licenses/LICENSE-2.0 * + * * + * Unless required by applicable law or agreed to in writing, * + * software distributed under the License is distributed on an * + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * + * KIND, either express or implied. See the License for the * + * specific language governing permissions and limitations * + * under the License. * + ****************************************************************/ + +package org.apache.james.mailbox.cassandra.mail; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.nio.charset.StandardCharsets; +import java.util.Optional; + +import org.apache.james.backends.cassandra.CassandraCluster; +import org.apache.james.backends.cassandra.DockerCassandraRule; +import org.apache.james.mailbox.cassandra.modules.CassandraAttachmentModule; +import org.apache.james.mailbox.model.Attachment; +import org.apache.james.mailbox.model.AttachmentId; +import org.junit.After; +import org.junit.Before; +import org.junit.ClassRule; +import org.junit.Test; + +public class CassandraAttachmentDAOTest { + public static final AttachmentId ATTACHMENT_ID = AttachmentId.from("id1"); + + @ClassRule + public static DockerCassandraRule cassandraServer = new DockerCassandraRule(); + + private CassandraCluster cassandra; + + private CassandraAttachmentDAO testee; + + @Before + public void setUp() throws Exception { + cassandra = CassandraCluster.create(new CassandraAttachmentModule(), + cassandraServer.getIp(), cassandraServer.getBindingPort()); + testee = new CassandraAttachmentDAO(cassandra.getConf()); + } + + @After + public void tearDown() throws Exception { + cassandra.close(); + } + + @Test + public void getAttachmentShouldReturnEmptyWhenAbsent() { + Optional<Attachment> attachment = testee.getAttachment(ATTACHMENT_ID).join(); + + assertThat(attachment).isEmpty(); + } + + @Test + public void getAttachmentShouldReturnAttachmentWhenStored() throws Exception { + Attachment attachment = Attachment.builder() + .attachmentId(ATTACHMENT_ID) + .type("application/json") + .bytes("{\"property\":`\"value\"}".getBytes(StandardCharsets.UTF_8)) + .build(); + testee.storeAttachment(attachment).join(); + + Optional<Attachment> actual = testee.getAttachment(ATTACHMENT_ID).join(); + + assertThat(actual).contains(attachment); + } +} http://git-wip-us.apache.org/repos/asf/james-project/blob/b8303bef/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 ccafa4a..c196a0f 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 @@ -91,27 +91,10 @@ public class CassandraMailboxManagerAttachmentTest extends AbstractMailboxManage private void initSystemUnderTest() throws Exception { CassandraMessageId.Factory messageIdFactory = new CassandraMessageId.Factory(); - CassandraMailboxDAO mailboxDAO = new CassandraMailboxDAO(cassandra.getConf(), cassandra.getTypesProvider()); - CassandraMailboxPathDAO mailboxPathDAO = new CassandraMailboxPathDAO(cassandra.getConf(), cassandra.getTypesProvider()); - CassandraFirstUnseenDAO firstUnseenDAO = new CassandraFirstUnseenDAO(cassandra.getConf()); - CassandraDeletedMessageDAO deletedMessageDAO = new CassandraDeletedMessageDAO(cassandra.getConf()); - - CassandraBlobsDAO blobsDAO = new CassandraBlobsDAO(cassandra.getConf()); - CassandraMessageDAO messageDAO = new CassandraMessageDAO(cassandra.getConf(), cassandra.getTypesProvider(), blobsDAO); mailboxSessionMapperFactory = new CassandraMailboxSessionMapperFactory( - new CassandraUidProvider(cassandra.getConf()), - new CassandraModSeqProvider(cassandra.getConf()), - cassandra.getConf(), - messageDAO, - new CassandraMessageIdDAO(cassandra.getConf(), messageIdFactory), - new CassandraMessageIdToImapUidDAO(cassandra.getConf(), messageIdFactory), - new CassandraMailboxCounterDAO(cassandra.getConf()), - new CassandraMailboxRecentsDAO(cassandra.getConf()), - mailboxDAO, - mailboxPathDAO, - firstUnseenDAO, - new CassandraApplicableFlagDAO(cassandra.getConf()), - deletedMessageDAO); + cassandra.getConf(), + cassandra.getTypesProvider(), + messageIdFactory); 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/b8303bef/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 d29f520..245acbf 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 @@ -78,26 +78,9 @@ public class CassandraMapperProvider implements MapperProvider { } private CassandraMailboxSessionMapperFactory createMapperFactory() { - CassandraMailboxDAO mailboxDAO = new CassandraMailboxDAO(cassandra.getConf(), cassandra.getTypesProvider()); - CassandraMailboxPathDAO mailboxPathDAO = new CassandraMailboxPathDAO(cassandra.getConf(), cassandra.getTypesProvider()); - CassandraFirstUnseenDAO firstUnseenDAO = new CassandraFirstUnseenDAO(cassandra.getConf()); - CassandraDeletedMessageDAO deletedMessageDAO = new CassandraDeletedMessageDAO(cassandra.getConf()); - CassandraBlobsDAO blobsDAO = new CassandraBlobsDAO(cassandra.getConf()); - CassandraMessageDAO messageDAO = new CassandraMessageDAO(cassandra.getConf(), cassandra.getTypesProvider(), blobsDAO); - return new CassandraMailboxSessionMapperFactory( - new CassandraUidProvider(cassandra.getConf()), - cassandraModSeqProvider, - cassandra.getConf(), - messageDAO, - new CassandraMessageIdDAO(cassandra.getConf(), MESSAGE_ID_FACTORY), - new CassandraMessageIdToImapUidDAO(cassandra.getConf(), MESSAGE_ID_FACTORY), - new CassandraMailboxCounterDAO(cassandra.getConf()), - new CassandraMailboxRecentsDAO(cassandra.getConf()), - mailboxDAO, - mailboxPathDAO, - firstUnseenDAO, - new CassandraApplicableFlagDAO(cassandra.getConf()), - deletedMessageDAO); + return new CassandraMailboxSessionMapperFactory(cassandra.getConf(), + cassandra.getTypesProvider(), + new CassandraMessageId.Factory()); } @Override http://git-wip-us.apache.org/repos/asf/james-project/blob/b8303bef/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 2f47b9c..e0c2468 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 @@ -21,7 +21,6 @@ package org.apache.james.mpt.imapmailbox.cassandra.host; import org.apache.james.backends.cassandra.CassandraCluster; import org.apache.james.backends.cassandra.components.CassandraModule; import org.apache.james.backends.cassandra.init.CassandraModuleComposite; -import org.apache.james.backends.cassandra.init.CassandraTypesProvider; import org.apache.james.imap.encode.main.DefaultImapEncoderFactory; import org.apache.james.imap.main.DefaultImapDecoderFactory; import org.apache.james.imap.processor.main.DefaultImapProcessorFactory; @@ -29,19 +28,6 @@ import org.apache.james.mailbox.SubscriptionManager; import org.apache.james.mailbox.cassandra.CassandraMailboxManager; import org.apache.james.mailbox.cassandra.CassandraMailboxSessionMapperFactory; import org.apache.james.mailbox.cassandra.ids.CassandraMessageId; -import org.apache.james.mailbox.cassandra.mail.CassandraApplicableFlagDAO; -import org.apache.james.mailbox.cassandra.mail.CassandraBlobsDAO; -import org.apache.james.mailbox.cassandra.mail.CassandraDeletedMessageDAO; -import org.apache.james.mailbox.cassandra.mail.CassandraFirstUnseenDAO; -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; -import org.apache.james.mailbox.cassandra.mail.CassandraMessageIdToImapUidDAO; -import org.apache.james.mailbox.cassandra.mail.CassandraModSeqProvider; -import org.apache.james.mailbox.cassandra.mail.CassandraUidProvider; import org.apache.james.mailbox.cassandra.modules.CassandraAclModule; import org.apache.james.mailbox.cassandra.modules.CassandraAnnotationModule; import org.apache.james.mailbox.cassandra.modules.CassandraApplicableFlagsModule; @@ -115,36 +101,11 @@ public class CassandraHostSystem extends JamesImapHostSystem { super.beforeTest(); cassandra = CassandraCluster.create(mailboxModule, cassandraHost, cassandraPort); com.datastax.driver.core.Session session = cassandra.getConf(); - CassandraModSeqProvider modSeqProvider = new CassandraModSeqProvider(session); - CassandraUidProvider uidProvider = new CassandraUidProvider(session); - CassandraTypesProvider typesProvider = new CassandraTypesProvider(mailboxModule, session); CassandraMessageId.Factory messageIdFactory = new CassandraMessageId.Factory(); - CassandraBlobsDAO cassandraBlobsDAO = new CassandraBlobsDAO(session); - CassandraMessageDAO messageDAO = new CassandraMessageDAO(session, typesProvider, cassandraBlobsDAO); - CassandraMessageIdDAO messageIdDAO = new CassandraMessageIdDAO(session, messageIdFactory); - CassandraMessageIdToImapUidDAO imapUidDAO = new CassandraMessageIdToImapUidDAO(session, messageIdFactory); - CassandraMailboxCounterDAO mailboxCounterDAO = new CassandraMailboxCounterDAO(session); - CassandraMailboxRecentsDAO mailboxRecentsDAO = new CassandraMailboxRecentsDAO(session); - CassandraMailboxDAO mailboxDAO = new CassandraMailboxDAO(session, typesProvider); - CassandraMailboxPathDAO mailboxPathDAO = new CassandraMailboxPathDAO(session, typesProvider); - CassandraFirstUnseenDAO firstUnseenDAO = new CassandraFirstUnseenDAO(session); - CassandraApplicableFlagDAO applicableFlagDAO = new CassandraApplicableFlagDAO(session); - CassandraDeletedMessageDAO deletedMessageDAO = new CassandraDeletedMessageDAO(session); - CassandraMailboxSessionMapperFactory mapperFactory = new CassandraMailboxSessionMapperFactory( - uidProvider, - modSeqProvider, - session, - messageDAO, - messageIdDAO, - imapUidDAO, - mailboxCounterDAO, - mailboxRecentsDAO, - mailboxDAO, - mailboxPathDAO, - firstUnseenDAO, - applicableFlagDAO, - deletedMessageDAO); + cassandra.getConf(), + cassandra.getTypesProvider(), + messageIdFactory); mailboxManager = new CassandraMailboxManager(mapperFactory, authenticator, authorizator, new JVMMailboxPathLocker(), new MessageParser(), messageIdFactory); QuotaRootResolver quotaRootResolver = new DefaultQuotaRootResolver(mapperFactory); --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org