You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by ma...@apache.org on 2017/09/11 08:56:32 UTC

[09/18] james-project git commit: MAILBOX-304 Piloting blobDAO should be a responsibility of AttachmentMapper

MAILBOX-304 Piloting blobDAO should be a responsibility of AttachmentMapper


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/588e164a
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/588e164a
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/588e164a

Branch: refs/heads/master
Commit: 588e164a1b1730fc7eab76fbefc621e2fcf9fb64
Parents: 43e21af
Author: benwa <bt...@linagora.com>
Authored: Thu Sep 7 11:02:49 2017 +0700
Committer: benwa <bt...@linagora.com>
Committed: Thu Sep 7 11:02:49 2017 +0700

----------------------------------------------------------------------
 .../CassandraMailboxSessionMapperFactory.java   |  11 +-
 .../mail/CassandraAttachmentDAOV2.java          | 117 +++++++++++++------
 .../mail/CassandraAttachmentMapper.java         |  40 +++++--
 .../CassandraSubscriptionManagerTest.java       |   3 +
 ...estCassandraMailboxSessionMapperFactory.java |   4 +-
 .../mail/CassandraAttachmentDAOV2Test.java      |  22 ++--
 .../CassandraAttachmentFallbackTestTest.java    |  16 ++-
 7 files changed, 150 insertions(+), 63 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/588e164a/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 aa7d765..1c1539d 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
@@ -29,6 +29,7 @@ import org.apache.james.mailbox.cassandra.mail.CassandraApplicableFlagDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraAttachmentDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraAttachmentDAOV2;
 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;
@@ -76,9 +77,10 @@ public class CassandraMailboxSessionMapperFactory extends MailboxSessionMapperFa
     private final CassandraApplicableFlagDAO applicableFlagDAO;
     private final CassandraAttachmentDAO attachmentDAO;
     private final CassandraAttachmentDAOV2 attachmentDAOV2;
+    private final CassandraDeletedMessageDAO deletedMessageDAO;
+    private final CassandraBlobsDAO blobsDAO;
     private CassandraUtils cassandraUtils;
     private CassandraConfiguration cassandraConfiguration;
-    private final CassandraDeletedMessageDAO deletedMessageDAO;
 
     @Inject
     public CassandraMailboxSessionMapperFactory(CassandraUidProvider uidProvider, CassandraModSeqProvider modSeqProvider, Session session,
@@ -86,8 +88,8 @@ public class CassandraMailboxSessionMapperFactory extends MailboxSessionMapperFa
                                                 CassandraMessageIdDAO messageIdDAO, CassandraMessageIdToImapUidDAO imapUidDAO,
                                                 CassandraMailboxCounterDAO mailboxCounterDAO, CassandraMailboxRecentsDAO mailboxRecentsDAO, CassandraMailboxDAO mailboxDAO,
                                                 CassandraMailboxPathDAO mailboxPathDAO, CassandraFirstUnseenDAO firstUnseenDAO, CassandraApplicableFlagDAO applicableFlagDAO,
-                                                CassandraAttachmentDAO attachmentDAO, CassandraAttachmentDAOV2 attachmentDAOV2, CassandraDeletedMessageDAO deletedMessageDAO, CassandraUtils cassandraUtils,
-                                                CassandraConfiguration cassandraConfiguration) {
+                                                CassandraAttachmentDAO attachmentDAO, CassandraAttachmentDAOV2 attachmentDAOV2, CassandraDeletedMessageDAO deletedMessageDAO,
+                                                CassandraBlobsDAO blobsDAO, CassandraUtils cassandraUtils, CassandraConfiguration cassandraConfiguration) {
         this.uidProvider = uidProvider;
         this.modSeqProvider = modSeqProvider;
         this.session = session;
@@ -103,6 +105,7 @@ public class CassandraMailboxSessionMapperFactory extends MailboxSessionMapperFa
         this.attachmentDAOV2 = attachmentDAOV2;
         this.deletedMessageDAO = deletedMessageDAO;
         this.applicableFlagDAO = applicableFlagDAO;
+        this.blobsDAO = blobsDAO;
         this.cassandraUtils = cassandraUtils;
         this.cassandraConfiguration = cassandraConfiguration;
         this.indexTableHandler = new CassandraIndexTableHandler(
@@ -147,7 +150,7 @@ public class CassandraMailboxSessionMapperFactory extends MailboxSessionMapperFa
 
     @Override
     public AttachmentMapper createAttachmentMapper(MailboxSession mailboxSession) {
-        return new CassandraAttachmentMapper(attachmentDAO, attachmentDAOV2);
+        return new CassandraAttachmentMapper(attachmentDAO, attachmentDAOV2, blobsDAO);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/james-project/blob/588e164a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentDAOV2.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentDAOV2.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentDAOV2.java
index 4a6037e..98cd0e5 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentDAOV2.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentDAOV2.java
@@ -31,6 +31,7 @@ import static org.apache.james.mailbox.cassandra.table.CassandraAttachmentV2Tabl
 import static org.apache.james.mailbox.cassandra.table.CassandraAttachmentV2Table.TABLE_NAME;
 import static org.apache.james.mailbox.cassandra.table.CassandraAttachmentV2Table.TYPE;
 
+import java.util.Objects;
 import java.util.Optional;
 import java.util.concurrent.CompletableFuture;
 
@@ -47,15 +48,85 @@ import com.datastax.driver.core.Session;
 import com.google.common.base.Preconditions;
 
 public class CassandraAttachmentDAOV2 {
+    public static class DAOAttachmentModel {
+        private final AttachmentId attachmentId;
+        private final BlobId blobId;
+        private final String type;
+        private final long size;
+
+        private DAOAttachmentModel(AttachmentId attachmentId, BlobId blobId, String type, long size) {
+            this.attachmentId = attachmentId;
+            this.blobId = blobId;
+            this.type = type;
+            this.size = size;
+        }
+
+        public AttachmentId getAttachmentId() {
+            return attachmentId;
+        }
+
+        public org.apache.james.mailbox.cassandra.ids.BlobId getBlobId() {
+            return blobId;
+        }
+
+        public String getType() {
+            return type;
+        }
+
+        public long getSize() {
+            return size;
+        }
+
+        public Attachment toAttachment(byte[] data) {
+            return Attachment.builder()
+                .attachmentId(attachmentId)
+                .type(type)
+                .bytes(data)
+                .build();
+        }
+
+        @Override
+        public final boolean equals(Object o) {
+            if (o instanceof DAOAttachmentModel) {
+                DAOAttachmentModel that = (DAOAttachmentModel) o;
+
+                return Objects.equals(this.size, that.size)
+                    && Objects.equals(this.attachmentId, that.attachmentId)
+                    && Objects.equals(this.blobId, that.blobId)
+                    && Objects.equals(this.type, that.type);
+            }
+            return false;
+        }
+
+        @Override
+        public final int hashCode() {
+            return Objects.hash(attachmentId, blobId, type, size);
+        }
+    }
+
+    public static DAOAttachmentModel from(Attachment attachment, BlobId blobId) {
+        return new DAOAttachmentModel(
+            attachment.getAttachmentId(),
+            blobId,
+            attachment.getType(),
+            attachment.getSize());
+    }
+
+    private static DAOAttachmentModel fromRow(Row row) {
+        return new DAOAttachmentModel(
+            AttachmentId.from(row.getString(ID)),
+            BlobId.from(row.getString(BLOB_ID)),
+            row.getString(TYPE),
+            row.getLong(SIZE));
+    }
+
     private final CassandraAsyncExecutor cassandraAsyncExecutor;
     private final PreparedStatement insertStatement;
-    private final CassandraBlobsDAO blobsDAO;
     private final PreparedStatement selectStatement;
 
     @Inject
-    public CassandraAttachmentDAOV2(Session session, CassandraBlobsDAO blobsDAO) {
+    public CassandraAttachmentDAOV2(Session session) {
         this.cassandraAsyncExecutor = new CassandraAsyncExecutor(session);
-        this.blobsDAO = blobsDAO;
 
         this.selectStatement = prepareSelect(session);
         this.insertStatement = prepareInsert(session);
@@ -77,42 +148,22 @@ public class CassandraAttachmentDAOV2 {
             .where(eq(ID_AS_UUID, bindMarker(ID_AS_UUID))));
     }
 
-    public CompletableFuture<Optional<Attachment>> getAttachment(AttachmentId attachmentId) {
+    public CompletableFuture<Optional<DAOAttachmentModel>> getAttachment(AttachmentId attachmentId) {
         Preconditions.checkArgument(attachmentId != null);
         return cassandraAsyncExecutor.executeSingleRow(
             selectStatement.bind()
                 .setUUID(ID_AS_UUID, attachmentId.asUUID()))
-            .thenCompose(this::attachment);
-    }
-
-    public CompletableFuture<Void> storeAttachment(Attachment attachment) {
-        return blobsDAO.save(attachment.getBytes())
-            // BlobDAO supports saving null blobs. But attachments ensure there blobs are never null. Hence optional unboxing is safe here.
-            .thenApply(Optional::get)
-            .thenApply(blobId ->
-                insertStatement.bind()
-                    .setUUID(ID_AS_UUID, attachment.getAttachmentId().asUUID())
-                    .setString(ID, attachment.getAttachmentId().getId())
-                    .setLong(SIZE, attachment.getSize())
-                    .setString(TYPE, attachment.getType())
-                    .setString(BLOB_ID, blobId.getId()))
-            .thenCompose(cassandraAsyncExecutor::executeVoid);
+            .thenApply(row -> row.map(CassandraAttachmentDAOV2::fromRow));
     }
 
-    private CompletableFuture<Optional<Attachment>> attachment(Optional<Row> rowOptional) {
-        if (rowOptional.isPresent()) {
-            return attachment(rowOptional.get())
-                .thenApply(Optional::of);
-        }
-        return CompletableFuture.completedFuture(Optional.empty());
+    public CompletableFuture<Void> storeAttachment(DAOAttachmentModel attachment) {
+        return cassandraAsyncExecutor.executeVoid(
+            insertStatement.bind()
+                .setUUID(ID_AS_UUID, attachment.getAttachmentId().asUUID())
+                .setString(ID, attachment.getAttachmentId().getId())
+                .setLong(SIZE, attachment.getSize())
+                .setString(TYPE, attachment.getType())
+                .setString(BLOB_ID, attachment.getBlobId().getId()));
     }
 
-    private CompletableFuture<Attachment> attachment(Row row) {
-        return blobsDAO.read(BlobId.from(row.getString(BLOB_ID)))
-            .thenApply(bytes -> Attachment.builder()
-                .attachmentId(AttachmentId.from(row.getString(ID)))
-                .bytes(bytes)
-                .type(row.getString(TYPE))
-                .build());
-    }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/588e164a/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 8c2b970..3d5e256 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
@@ -28,12 +28,14 @@ import java.util.stream.Stream;
 
 import javax.inject.Inject;
 
+import org.apache.james.mailbox.cassandra.mail.CassandraAttachmentDAOV2.DAOAttachmentModel;
 import org.apache.james.mailbox.exception.AttachmentNotFoundException;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.Attachment;
 import org.apache.james.mailbox.model.AttachmentId;
 import org.apache.james.mailbox.store.mail.AttachmentMapper;
 import org.apache.james.util.FluentFutureStream;
+import org.jetbrains.annotations.Nullable;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -46,11 +48,13 @@ public class CassandraAttachmentMapper implements AttachmentMapper {
 
     private final CassandraAttachmentDAO attachmentDAO;
     private final CassandraAttachmentDAOV2 attachmentDAOV2;
+    private final CassandraBlobsDAO blobsDAO;
 
     @Inject
-    public CassandraAttachmentMapper(CassandraAttachmentDAO attachmentDAO, CassandraAttachmentDAOV2 attachmentDAOV2) {
+    public CassandraAttachmentMapper(CassandraAttachmentDAO attachmentDAO, CassandraAttachmentDAOV2 attachmentDAOV2, CassandraBlobsDAO blobsDAO) {
         this.attachmentDAO = attachmentDAO;
         this.attachmentDAOV2 = attachmentDAOV2;
+        this.blobsDAO = blobsDAO;
     }
 
     @Override
@@ -65,12 +69,21 @@ public class CassandraAttachmentMapper implements AttachmentMapper {
     @Override
     public Attachment getAttachment(AttachmentId attachmentId) throws AttachmentNotFoundException {
         Preconditions.checkArgument(attachmentId != null);
-        return attachmentDAOV2.getAttachment(attachmentId)
-            .thenCompose(v2Value -> fallbackToV1(attachmentId, v2Value))
+        return getAttachmentInternal(attachmentId)
             .join()
             .orElseThrow(() -> new AttachmentNotFoundException(attachmentId.getId()));
     }
 
+    @Nullable
+    private CompletionStage<Optional<Attachment>> retrievePayload(Optional<DAOAttachmentModel> input) {
+        if (!input.isPresent()) {
+            return CompletableFuture.completedFuture(Optional.empty());
+        }
+        DAOAttachmentModel model = input.get();
+        return blobsDAO.read(model.getBlobId())
+            .thenApply(bytes -> Optional.of(model.toAttachment(bytes)));
+    }
+
     @Override
     public List<Attachment> getAttachments(Collection<AttachmentId> attachmentIds) {
         return getAttachmentsAsFuture(attachmentIds).join();
@@ -82,8 +95,7 @@ public class CassandraAttachmentMapper implements AttachmentMapper {
         Stream<CompletableFuture<Optional<Attachment>>> attachments = attachmentIds
                 .stream()
                 .distinct()
-                .map(id -> attachmentDAOV2.getAttachment(id)
-                    .thenCompose(v2Value -> fallbackToV1(id, v2Value))
+                .map(id -> getAttachmentInternal(id)
                     .thenApply(finalValue -> logNotFound(id, finalValue)));
 
         return FluentFutureStream
@@ -91,6 +103,12 @@ public class CassandraAttachmentMapper implements AttachmentMapper {
             .collect(Guavate.toImmutableList());
     }
 
+    private CompletableFuture<Optional<Attachment>> getAttachmentInternal(AttachmentId id) {
+        return attachmentDAOV2.getAttachment(id)
+            .thenCompose(this::retrievePayload)
+            .thenCompose(v2Value -> fallbackToV1(id, v2Value));
+    }
+
     private CompletionStage<Optional<Attachment>> fallbackToV1(AttachmentId attachmentId, Optional<Attachment> v2Value) {
         if (v2Value.isPresent()) {
             return CompletableFuture.completedFuture(v2Value);
@@ -100,17 +118,25 @@ public class CassandraAttachmentMapper implements AttachmentMapper {
 
     @Override
     public void storeAttachment(Attachment attachment) throws MailboxException {
-        attachmentDAOV2.storeAttachment(attachment).join();
+        storeAttachmentAsync(attachment).join();
     }
 
     @Override
     public void storeAttachments(Collection<Attachment> attachments) throws MailboxException {
         FluentFutureStream.of(
             attachments.stream()
-                .map(attachmentDAOV2::storeAttachment))
+                .map(this::storeAttachmentAsync))
             .join();
     }
 
+    public CompletableFuture<Void> storeAttachmentAsync(Attachment attachment) {
+        return blobsDAO.save(attachment.getBytes())
+            // BlobDAO supports saving null blobs. But attachments ensure there blobs are never null. Hence optional unboxing is safe here.
+            .thenApply(Optional::get)
+            .thenApply(blobId -> CassandraAttachmentDAOV2.from(attachment, blobId))
+            .thenCompose(attachmentDAOV2::storeAttachment);
+    }
+
     private Optional<Attachment> logNotFound(AttachmentId attachmentId, Optional<Attachment> optional) {
         if (!optional.isPresent()) {
             LOGGER.warn("Failed retrieving attachment {}", attachmentId);

http://git-wip-us.apache.org/repos/asf/james-project/blob/588e164a/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 c9c02ef..7e94b3c 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
@@ -29,6 +29,7 @@ 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.CassandraAttachmentDAOV2;
+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;
@@ -89,6 +90,7 @@ public class CassandraSubscriptionManagerTest extends AbstractSubscriptionManage
         CassandraAttachmentDAO attachmentDAO = null;
         CassandraDeletedMessageDAO deletedMessageDAO = null;
         CassandraAttachmentDAOV2 attachmentDAOV2 = null;
+        CassandraBlobsDAO cassandraBlobsDAO = null;
         return new CassandraSubscriptionManager(
             new CassandraMailboxSessionMapperFactory(
                 new CassandraUidProvider(cassandra.getConf()),
@@ -106,6 +108,7 @@ public class CassandraSubscriptionManagerTest extends AbstractSubscriptionManage
                 attachmentDAO,
                 attachmentDAOV2,
                 deletedMessageDAO,
+                cassandraBlobsDAO,
                 CassandraUtils.WITH_DEFAULT_CONFIGURATION,
                 CassandraConfiguration.DEFAULT_CONFIGURATION));
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/588e164a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/TestCassandraMailboxSessionMapperFactory.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/TestCassandraMailboxSessionMapperFactory.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/TestCassandraMailboxSessionMapperFactory.java
index a22d06e..78667ce 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/TestCassandraMailboxSessionMapperFactory.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/TestCassandraMailboxSessionMapperFactory.java
@@ -59,9 +59,9 @@ public class TestCassandraMailboxSessionMapperFactory {
             new CassandraFirstUnseenDAO(session),
             new CassandraApplicableFlagDAO(session),
             new CassandraAttachmentDAO(session),
-            new CassandraAttachmentDAOV2(session, cassandraBlobsDAO),
+            new CassandraAttachmentDAOV2(session),
             new CassandraDeletedMessageDAO(session),
-            CassandraUtils.WITH_DEFAULT_CONFIGURATION,
+            cassandraBlobsDAO, CassandraUtils.WITH_DEFAULT_CONFIGURATION,
             CassandraConfiguration.DEFAULT_CONFIGURATION);
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/588e164a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentDAOV2Test.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentDAOV2Test.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentDAOV2Test.java
index 130ef19..82b66e0 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentDAOV2Test.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentDAOV2Test.java
@@ -26,9 +26,9 @@ import java.util.Optional;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.DockerCassandraRule;
-import org.apache.james.backends.cassandra.init.CassandraModuleComposite;
+import org.apache.james.mailbox.cassandra.ids.BlobId;
+import org.apache.james.mailbox.cassandra.mail.CassandraAttachmentDAOV2.DAOAttachmentModel;
 import org.apache.james.mailbox.cassandra.modules.CassandraAttachmentModule;
-import org.apache.james.mailbox.cassandra.modules.CassandraBlobModule;
 import org.apache.james.mailbox.model.Attachment;
 import org.apache.james.mailbox.model.AttachmentId;
 import org.junit.After;
@@ -48,16 +48,12 @@ public class CassandraAttachmentDAOV2Test {
 
     @Before
     public void setUp() throws Exception {
-        CassandraModuleComposite compositeModule = new CassandraModuleComposite(
-            new CassandraAttachmentModule(),
-            new CassandraBlobModule());
-
         cassandra = CassandraCluster.create(
-            compositeModule,
+            new CassandraAttachmentModule(),
             cassandraServer.getIp(),
             cassandraServer.getBindingPort());
 
-        testee = new CassandraAttachmentDAOV2(cassandra.getConf(), new CassandraBlobsDAO(cassandra.getConf()));
+        testee = new CassandraAttachmentDAOV2(cassandra.getConf());
     }
 
     @After
@@ -67,7 +63,7 @@ public class CassandraAttachmentDAOV2Test {
 
     @Test
     public void getAttachmentShouldReturnEmptyWhenAbsent() {
-        Optional<Attachment> attachment = testee.getAttachment(ATTACHMENT_ID).join();
+        Optional<DAOAttachmentModel> attachment = testee.getAttachment(ATTACHMENT_ID).join();
 
         assertThat(attachment).isEmpty();
     }
@@ -79,10 +75,12 @@ public class CassandraAttachmentDAOV2Test {
             .type("application/json")
             .bytes("{\"property\":`\"value\"}".getBytes(StandardCharsets.UTF_8))
             .build();
-        testee.storeAttachment(attachment).join();
+        BlobId blobId = BlobId.from("blobId");
+        DAOAttachmentModel model = CassandraAttachmentDAOV2.from(attachment, blobId);
+        testee.storeAttachment(model).join();
 
-        Optional<Attachment> actual = testee.getAttachment(ATTACHMENT_ID).join();
+        Optional<DAOAttachmentModel> actual = testee.getAttachment(ATTACHMENT_ID).join();
 
-        assertThat(actual).contains(attachment);
+        assertThat(actual).contains(model);
     }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/588e164a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentFallbackTestTest.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentFallbackTestTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentFallbackTestTest.java
index 45f03e2..5626d6a 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentFallbackTestTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentFallbackTestTest.java
@@ -27,6 +27,7 @@ import java.nio.charset.StandardCharsets;
 import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.DockerCassandraRule;
 import org.apache.james.backends.cassandra.init.CassandraModuleComposite;
+import org.apache.james.mailbox.cassandra.ids.BlobId;
 import org.apache.james.mailbox.cassandra.modules.CassandraAttachmentModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraBlobModule;
 import org.apache.james.mailbox.exception.AttachmentNotFoundException;
@@ -50,6 +51,7 @@ public class CassandraAttachmentFallbackTestTest {
     private CassandraAttachmentDAOV2 attachmentDAOV2;
     private CassandraAttachmentDAO attachmentDAO;
     private CassandraAttachmentMapper attachmentMapper;
+    private CassandraBlobsDAO blobsDAO;
 
     @Before
     public void setUp() throws Exception {
@@ -62,9 +64,10 @@ public class CassandraAttachmentFallbackTestTest {
             cassandraServer.getIp(),
             cassandraServer.getBindingPort());
 
-        attachmentDAOV2 = new CassandraAttachmentDAOV2(cassandra.getConf(), new CassandraBlobsDAO(cassandra.getConf()));
+        attachmentDAOV2 = new CassandraAttachmentDAOV2(cassandra.getConf());
         attachmentDAO = new CassandraAttachmentDAO(cassandra.getConf());
-        attachmentMapper = new CassandraAttachmentMapper(attachmentDAO, attachmentDAOV2);
+        blobsDAO = new CassandraBlobsDAO(cassandra.getConf());
+        attachmentMapper = new CassandraAttachmentMapper(attachmentDAO, attachmentDAOV2, blobsDAO);
     }
 
     @After
@@ -97,7 +100,8 @@ public class CassandraAttachmentFallbackTestTest {
             .bytes("{\"property\":`\"different\"}".getBytes(StandardCharsets.UTF_8))
             .build();
 
-        attachmentDAOV2.storeAttachment(attachment).join();
+        BlobId blobId = blobsDAO.save(attachment.getBytes()).join().get();
+        attachmentDAOV2.storeAttachment(CassandraAttachmentDAOV2.from(attachment, blobId)).join();
         attachmentDAO.storeAttachment(otherAttachment).join();
 
         assertThat(attachmentMapper.getAttachment(ATTACHMENT_ID_1))
@@ -131,7 +135,8 @@ public class CassandraAttachmentFallbackTestTest {
             .bytes("{\"property\":`\"different\"}".getBytes(StandardCharsets.UTF_8))
             .build();
 
-        attachmentDAOV2.storeAttachment(attachment).join();
+        BlobId blobId = blobsDAO.save(attachment.getBytes()).join().get();
+        attachmentDAOV2.storeAttachment(CassandraAttachmentDAOV2.from(attachment, blobId)).join();
         attachmentDAO.storeAttachment(otherAttachment).join();
 
         assertThat(attachmentMapper.getAttachments(ImmutableList.of(ATTACHMENT_ID_1)))
@@ -165,7 +170,8 @@ public class CassandraAttachmentFallbackTestTest {
             .bytes("{\"property\":`\"different\"}".getBytes(StandardCharsets.UTF_8))
             .build();
 
-        attachmentDAOV2.storeAttachment(attachment).join();
+        BlobId blobId = blobsDAO.save(attachment.getBytes()).join().get();
+        attachmentDAOV2.storeAttachment(CassandraAttachmentDAOV2.from(attachment, blobId)).join();
         attachmentDAO.storeAttachment(otherAttachment).join();
 
         assertThat(attachmentMapper.getAttachments(ImmutableList.of(ATTACHMENT_ID_1, ATTACHMENT_ID_2)))


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org