JAMES-2287 Cassandra ObjectStore implementation

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

Branch: refs/heads/master
Commit: 4e8bcc66db98fa52328efbc4d5e070140702f1d5
Parents: 12074ca
Author: Antoine Duprat <[email protected]>
Authored: Tue Jan 16 13:09:53 2018 +0100
Committer: benwa <[email protected]>
Committed: Fri Jan 19 09:07:27 2018 +0700

----------------------------------------------------------------------
 mailbox/cassandra/pom.xml                       |  26 ++-
 .../CassandraMailboxSessionMapperFactory.java   |   2 +-
 .../mail/CassandraAttachmentDAOV2.java          |   9 +-
 .../mail/CassandraAttachmentMapper.java         |   1 +
 .../cassandra/mail/CassandraBlobsDAO.java       | 208 ------------------
 .../cassandra/mail/CassandraMessageDAO.java     |   6 +-
 .../mail/migration/AttachmentV2Migration.java   |   2 +-
 .../cassandra/mail/utils/DataChunker.java       |  52 -----
 .../cassandra/modules/CassandraBlobModule.java  |  69 ------
 .../mailbox/cassandra/table/BlobTable.java      |  32 ---
 .../CassandraCombinationManagerTest.java        |   2 +-
 .../CassandraMailboxManagerStressTest.java      |   2 +-
 .../cassandra/CassandraMailboxManagerTest.java  |   2 +-
 .../CassandraMessageIdManagerQuotaTest.java     |   2 +-
 ...CassandraMessageIdManagerSideEffectTest.java |   2 +-
 .../CassandraMessageIdManagerStorageTest.java   |   2 +-
 .../CassandraSubscriptionManagerTest.java       |   2 +-
 ...estCassandraMailboxSessionMapperFactory.java |   2 +-
 .../mail/CassandraAnnotationMapperTest.java     |   2 +-
 .../mail/CassandraAttachmentFallbackTest.java   |  11 +-
 .../mail/CassandraAttachmentMapperTest.java     |   2 +-
 .../cassandra/mail/CassandraBlobsDAOTest.java   | 132 ------------
 .../mail/CassandraGenericMailboxMapperTest.java |   2 +-
 .../CassandraMailboxManagerAttachmentTest.java  |   2 +-
 .../mail/CassandraMailboxMapperAclTest.java     |   2 +-
 .../cassandra/mail/CassandraMessageDAOTest.java |   3 +-
 .../mail/CassandraMessageIdMapperTest.java      |   2 +-
 .../mail/CassandraMessageMapperTest.java        |   2 +-
 .../mail/CassandraMessageMoveTest.java          |   2 +-
 ...assandraMessageWithAttachmentMapperTest.java |   2 +-
 .../AttachmentMessageIdCreationTest.java        |   4 +-
 .../migration/AttachmentV2MigrationTest.java    |   4 +-
 .../cassandra/mail/utils/DataChunkerTest.java   | 117 -----------
 .../cassandra/host/CassandraHostSystem.java     |   2 +-
 server/blob/blob-cassandra/pom.xml              |  20 ++
 .../apache/james/blob/cassandra/BlobTable.java  |  32 +++
 .../blob/cassandra/CassandraBlobModule.java     |  68 ++++++
 .../james/blob/cassandra/CassandraBlobsDAO.java | 210 +++++++++++++++++++
 .../james/blob/cassandra/utils/DataChunker.java |  52 +++++
 .../blob/cassandra/CassandraBlobsDAOTest.java   |  86 ++++++++
 .../blob/cassandra/utils/DataChunkerTest.java   | 110 ++++++++++
 .../modules/mailbox/CassandraMailboxModule.java |   4 +-
 42 files changed, 643 insertions(+), 653 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/4e8bcc66/mailbox/cassandra/pom.xml
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/pom.xml b/mailbox/cassandra/pom.xml
index 4377f83..0826db3 100644
--- a/mailbox/cassandra/pom.xml
+++ b/mailbox/cassandra/pom.xml
@@ -68,6 +68,12 @@
         </dependency>
         <dependency>
             <groupId>${project.groupId}</groupId>
+            <artifactId>james-server-data-api</artifactId>
+            <type>test-jar</type>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
             <artifactId>james-server-task</artifactId>
         </dependency>
         <dependency>
@@ -106,11 +112,6 @@
             <artifactId>javax.inject</artifactId>
         </dependency>
         <dependency>
-            <groupId>junit</groupId>
-            <artifactId>junit</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
             <groupId>net.javacrumbs.json-unit</groupId>
             <artifactId>json-unit</artifactId>
             <version>1.5.5</version>
@@ -142,6 +143,21 @@
             <scope>test</scope>
         </dependency>
         <dependency>
+            <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter-engine</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.junit.platform</groupId>
+            <artifactId>junit-platform-launcher</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.junit.vintage</groupId>
+            <artifactId>junit-vintage-engine</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
             <groupId>org.mockito</groupId>
             <artifactId>mockito-core</artifactId>
             <scope>test</scope>

http://git-wip-us.apache.org/repos/asf/james-project/blob/4e8bcc66/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 47b8bf1..3969700 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
@@ -23,6 +23,7 @@ import javax.inject.Inject;
 
 import org.apache.james.backends.cassandra.init.CassandraConfiguration;
 import org.apache.james.backends.cassandra.utils.CassandraUtils;
+import org.apache.james.blob.cassandra.CassandraBlobsDAO;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.cassandra.mail.CassandraACLMapper;
 import org.apache.james.mailbox.cassandra.mail.CassandraAnnotationMapper;
@@ -32,7 +33,6 @@ import 
org.apache.james.mailbox.cassandra.mail.CassandraAttachmentDAOV2;
 import org.apache.james.mailbox.cassandra.mail.CassandraAttachmentMapper;
 import org.apache.james.mailbox.cassandra.mail.CassandraAttachmentMessageIdDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraAttachmentOwnerDAO;
-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;

http://git-wip-us.apache.org/repos/asf/james-project/blob/4e8bcc66/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 5a9727a..8a40ef8 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
@@ -38,6 +38,7 @@ import java.util.concurrent.CompletableFuture;
 import javax.inject.Inject;
 
 import org.apache.james.backends.cassandra.utils.CassandraAsyncExecutor;
+import org.apache.james.blob.api.BlobId;
 import org.apache.james.blob.cassandra.CassandraBlobId;
 import org.apache.james.mailbox.model.Attachment;
 import org.apache.james.mailbox.model.AttachmentId;
@@ -50,11 +51,11 @@ import com.google.common.base.Preconditions;
 public class CassandraAttachmentDAOV2 {
     public static class DAOAttachment {
         private final AttachmentId attachmentId;
-        private final CassandraBlobId blobId;
+        private final BlobId blobId;
         private final String type;
         private final long size;
 
-        private DAOAttachment(AttachmentId attachmentId, CassandraBlobId 
blobId, String type, long size) {
+        private DAOAttachment(AttachmentId attachmentId, BlobId blobId, String 
type, long size) {
             this.attachmentId = attachmentId;
             this.blobId = blobId;
             this.type = type;
@@ -65,7 +66,7 @@ public class CassandraAttachmentDAOV2 {
             return attachmentId;
         }
 
-        public CassandraBlobId getBlobId() {
+        public BlobId getBlobId() {
             return blobId;
         }
 
@@ -104,7 +105,7 @@ public class CassandraAttachmentDAOV2 {
         }
     }
 
-    public static DAOAttachment from(Attachment attachment, CassandraBlobId 
blobId) {
+    public static DAOAttachment from(Attachment attachment, BlobId blobId) {
         return new DAOAttachment(
             attachment.getAttachmentId(),
             blobId,

http://git-wip-us.apache.org/repos/asf/james-project/blob/4e8bcc66/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 1eccb88..d9a282f 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,6 +28,7 @@ import java.util.stream.Stream;
 
 import javax.inject.Inject;
 
+import org.apache.james.blob.cassandra.CassandraBlobsDAO;
 import 
org.apache.james.mailbox.cassandra.mail.CassandraAttachmentDAOV2.DAOAttachment;
 import org.apache.james.mailbox.exception.AttachmentNotFoundException;
 import org.apache.james.mailbox.exception.MailboxException;

http://git-wip-us.apache.org/repos/asf/james-project/blob/4e8bcc66/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraBlobsDAO.java
----------------------------------------------------------------------
diff --git 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraBlobsDAO.java
 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraBlobsDAO.java
deleted file mode 100644
index 5fc09aa..0000000
--- 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraBlobsDAO.java
+++ /dev/null
@@ -1,208 +0,0 @@
-/****************************************************************
- * 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 java.nio.ByteBuffer;
-import java.util.Optional;
-import java.util.concurrent.CompletableFuture;
-import java.util.stream.IntStream;
-import java.util.stream.Stream;
-
-import javax.inject.Inject;
-
-import org.apache.commons.lang3.tuple.Pair;
-import org.apache.james.backends.cassandra.init.CassandraConfiguration;
-import org.apache.james.backends.cassandra.utils.CassandraAsyncExecutor;
-import org.apache.james.blob.cassandra.CassandraBlobId;
-import org.apache.james.mailbox.cassandra.mail.utils.DataChunker;
-import org.apache.james.mailbox.cassandra.table.BlobTable;
-import org.apache.james.mailbox.cassandra.table.BlobTable.BlobParts;
-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.PreparedStatement;
-import com.datastax.driver.core.Row;
-import com.datastax.driver.core.Session;
-import com.github.steveash.guavate.Guavate;
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Preconditions;
-import com.google.common.collect.ImmutableList;
-import com.google.common.primitives.Bytes;
-
-public class CassandraBlobsDAO {
-    private static final Logger LOGGER = 
LoggerFactory.getLogger(CassandraBlobsDAO.class);
-    private final CassandraAsyncExecutor cassandraAsyncExecutor;
-    private final PreparedStatement insert;
-    private final PreparedStatement insertPart;
-    private final PreparedStatement select;
-    private final PreparedStatement selectPart;
-    private final DataChunker dataChunker;
-    private final CassandraConfiguration configuration;
-
-    @Inject
-    public CassandraBlobsDAO(Session session, CassandraConfiguration 
cassandraConfiguration) {
-        this.cassandraAsyncExecutor = new CassandraAsyncExecutor(session);
-        this.configuration = cassandraConfiguration;
-        this.dataChunker = new DataChunker();
-        this.insert = prepareInsert(session);
-        this.select = prepareSelect(session);
-
-        this.insertPart = prepareInsertPart(session);
-        this.selectPart = prepareSelectPart(session);
-    }
-
-    @VisibleForTesting
-    public CassandraBlobsDAO(Session session) {
-        this(session, CassandraConfiguration.DEFAULT_CONFIGURATION);
-    }
-
-    private PreparedStatement prepareSelect(Session session) {
-        return session.prepare(select()
-            .from(BlobTable.TABLE_NAME)
-            .where(eq(BlobTable.ID, bindMarker(BlobTable.ID))));
-    }
-
-    private PreparedStatement prepareSelectPart(Session session) {
-        return session.prepare(select()
-            .from(BlobParts.TABLE_NAME)
-            .where(eq(BlobTable.ID, bindMarker(BlobTable.ID)))
-            .and(eq(BlobParts.CHUNK_NUMBER, 
bindMarker(BlobParts.CHUNK_NUMBER))));
-    }
-
-    private PreparedStatement prepareInsert(Session session) {
-        return session.prepare(insertInto(BlobTable.TABLE_NAME)
-            .value(BlobTable.ID, bindMarker(BlobTable.ID))
-            .value(BlobTable.NUMBER_OF_CHUNK, 
bindMarker(BlobTable.NUMBER_OF_CHUNK)));
-    }
-
-    private PreparedStatement prepareInsertPart(Session session) {
-        return session.prepare(insertInto(BlobParts.TABLE_NAME)
-            .value(BlobTable.ID, bindMarker(BlobTable.ID))
-            .value(BlobParts.CHUNK_NUMBER, bindMarker(BlobParts.CHUNK_NUMBER))
-            .value(BlobParts.DATA, bindMarker(BlobParts.DATA)));
-    }
-
-    public CompletableFuture<CassandraBlobId> save(byte[] data) {
-        Preconditions.checkNotNull(data);
-
-        CassandraBlobId blobId = CassandraBlobId.forPayload(data);
-        return saveBlobParts(data, blobId)
-            .thenCompose(numberOfChunk -> saveBlobPartsReferences(blobId, 
numberOfChunk))
-            .thenApply(any -> blobId);
-    }
-
-    private CompletableFuture<Integer> saveBlobParts(byte[] data, 
CassandraBlobId blobId) {
-        return FluentFutureStream.of(
-            dataChunker.chunk(data, configuration.getBlobPartSize())
-                .map(pair -> writePart(pair.getRight(), blobId, pair.getKey())
-                    .thenApply(partId -> Pair.of(pair.getKey(), partId))))
-            .completableFuture()
-            .thenApply(stream ->
-                getLastOfStream(stream)
-                    .map(numOfChunkAndPartId -> numOfChunkAndPartId.getLeft() 
+ 1)
-                    .orElse(0));
-    }
-
-    private static <T> Optional<T> getLastOfStream(Stream<T> stream) {
-        return stream.reduce((first, second) -> second);
-    }
-
-    private CompletableFuture<Void> writePart(ByteBuffer data, CassandraBlobId 
blobId, int position) {
-        return cassandraAsyncExecutor.executeVoid(
-            insertPart.bind()
-                .setString(BlobTable.ID, blobId.asString())
-                .setInt(BlobParts.CHUNK_NUMBER, position)
-                .setBytes(BlobParts.DATA, data));
-    }
-
-    private CompletableFuture<Void> saveBlobPartsReferences(CassandraBlobId 
blobId, int numberOfChunk) {
-        return cassandraAsyncExecutor.executeVoid(insert.bind()
-            .setString(BlobTable.ID, blobId.asString())
-            .setInt(BlobTable.NUMBER_OF_CHUNK, numberOfChunk));
-    }
-
-    public CompletableFuture<byte[]> read(CassandraBlobId blobId) {
-        return cassandraAsyncExecutor.executeSingleRow(
-            select.bind()
-                .setString(BlobTable.ID, blobId.asString()))
-            .thenCompose(row -> toDataParts(row, blobId))
-            .thenApply(this::concatenateDataParts);
-    }
-
-    private CompletableFuture<Stream<BlobPart>> toDataParts(Optional<Row> 
blobRowOptional, CassandraBlobId blobId) {
-        return blobRowOptional.map(blobRow -> {
-            int numOfChunk = blobRow.getInt(BlobTable.NUMBER_OF_CHUNK);
-            return FluentFutureStream.of(
-                IntStream.range(0, numOfChunk)
-                    .mapToObj(position -> readPart(blobId, position)))
-                .completableFuture();
-        }).orElseGet(() -> {
-            LOGGER.warn("Could not retrieve blob metadata for {}", blobId);
-            return CompletableFuture.completedFuture(Stream.empty());
-        });
-    }
-
-    private byte[] concatenateDataParts(Stream<BlobPart> blobParts) {
-        ImmutableList<byte[]> parts = blobParts
-            .map(blobPart -> OptionalUtils.executeIfEmpty(
-                blobPart.row,
-                () -> LOGGER.warn("Missing blob part for blobId {} and 
position {}", blobPart.blobId, blobPart.position)))
-            .flatMap(OptionalUtils::toStream)
-            .map(this::rowToData)
-            .collect(Guavate.toImmutableList());
-
-        return Bytes.concat(parts.toArray(new byte[parts.size()][]));
-    }
-
-    private byte[] rowToData(Row row) {
-        byte[] data = new byte[row.getBytes(BlobParts.DATA).remaining()];
-        row.getBytes(BlobParts.DATA).get(data);
-        return data;
-    }
-
-    private CompletableFuture<BlobPart> readPart(CassandraBlobId blobId, int 
position) {
-        return cassandraAsyncExecutor.executeSingleRow(
-            selectPart.bind()
-                .setString(BlobTable.ID, blobId.asString())
-                .setInt(BlobParts.CHUNK_NUMBER, position))
-            .thenApply(row -> new BlobPart(blobId, position, row));
-    }
-
-    private static class BlobPart {
-        private final CassandraBlobId blobId;
-        private final int position;
-        private final Optional<Row> row;
-
-        public BlobPart(CassandraBlobId blobId, int position, Optional<Row> 
row) {
-            Preconditions.checkNotNull(blobId);
-            Preconditions.checkArgument(position >= 0, "position need to be 
positive");
-            this.blobId = blobId;
-            this.position = position;
-            this.row = row;
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/james-project/blob/4e8bcc66/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAO.java
----------------------------------------------------------------------
diff --git 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAO.java
 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAO.java
index c80f982..72fe82e 100644
--- 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAO.java
+++ 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAO.java
@@ -59,7 +59,9 @@ 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.blob.api.BlobId;
 import org.apache.james.blob.cassandra.CassandraBlobId;
+import org.apache.james.blob.cassandra.CassandraBlobsDAO;
 import org.apache.james.mailbox.cassandra.ids.CassandraMessageId;
 import org.apache.james.mailbox.cassandra.mail.utils.Limit;
 import org.apache.james.mailbox.cassandra.table.CassandraMessageV2Table;
@@ -176,7 +178,7 @@ public class CassandraMessageDAO {
             cassandraAsyncExecutor.executeVoid(boundWriteStatement(message, 
pair)));
     }
 
-    private CompletableFuture<Pair<CassandraBlobId, CassandraBlobId>> 
saveContent(MailboxMessage message) throws MailboxException {
+    private CompletableFuture<Pair<BlobId, BlobId>> saveContent(MailboxMessage 
message) throws MailboxException {
         try {
             return CompletableFutureUtil.combine(
                 blobsDAO.save(
@@ -191,7 +193,7 @@ public class CassandraMessageDAO {
         }
     }
 
-    private BoundStatement boundWriteStatement(MailboxMessage message, 
Pair<CassandraBlobId, CassandraBlobId> pair) {
+    private BoundStatement boundWriteStatement(MailboxMessage message, 
Pair<BlobId, BlobId> pair) {
         CassandraMessageId messageId = (CassandraMessageId) 
message.getMessageId();
         return insert.bind()
             .setUUID(MESSAGE_ID, messageId.get())

http://git-wip-us.apache.org/repos/asf/james-project/blob/4e8bcc66/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/migration/AttachmentV2Migration.java
----------------------------------------------------------------------
diff --git 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/migration/AttachmentV2Migration.java
 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/migration/AttachmentV2Migration.java
index 0d33e36..651b381 100644
--- 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/migration/AttachmentV2Migration.java
+++ 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/migration/AttachmentV2Migration.java
@@ -22,9 +22,9 @@ package org.apache.james.mailbox.cassandra.mail.migration;
 import javax.inject.Inject;
 
 import org.apache.james.backends.cassandra.migration.Migration;
+import org.apache.james.blob.cassandra.CassandraBlobsDAO;
 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.model.Attachment;
 import org.apache.james.task.Task;
 import org.slf4j.Logger;

http://git-wip-us.apache.org/repos/asf/james-project/blob/4e8bcc66/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/utils/DataChunker.java
----------------------------------------------------------------------
diff --git 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/utils/DataChunker.java
 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/utils/DataChunker.java
deleted file mode 100644
index 57e0bfc..0000000
--- 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/utils/DataChunker.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/****************************************************************
- * 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.utils;
-
-import java.nio.ByteBuffer;
-import java.util.stream.IntStream;
-import java.util.stream.Stream;
-
-import org.apache.commons.lang3.tuple.Pair;
-
-import com.google.common.base.Preconditions;
-
-public class DataChunker {
-
-    public Stream<Pair<Integer, ByteBuffer>> chunk(byte[] data, int chunkSize) 
{
-        Preconditions.checkNotNull(data);
-        Preconditions.checkArgument(chunkSize > 0, "ChunkSize can not be 
negative");
-
-        int size = data.length;
-        int fullChunkCount = size / chunkSize;
-
-        return Stream.concat(
-            IntStream.range(0, fullChunkCount)
-                .mapToObj(i -> Pair.of(i, ByteBuffer.wrap(data, i * chunkSize, 
chunkSize))),
-            lastChunk(data, chunkSize * fullChunkCount, fullChunkCount));
-    }
-
-    private Stream<Pair<Integer, ByteBuffer>> lastChunk(byte[] data, int 
offset, int index) {
-        if (offset == data.length && index > 0) {
-            return Stream.empty();
-        }
-        return Stream.of(Pair.of(index, ByteBuffer.wrap(data, offset, 
data.length - offset)));
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/james-project/blob/4e8bcc66/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraBlobModule.java
----------------------------------------------------------------------
diff --git 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraBlobModule.java
 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraBlobModule.java
deleted file mode 100644
index b672e34..0000000
--- 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraBlobModule.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/****************************************************************
- * 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.modules;
-
-import java.util.List;
-
-import org.apache.james.backends.cassandra.components.CassandraModule;
-import org.apache.james.backends.cassandra.components.CassandraTable;
-import org.apache.james.backends.cassandra.components.CassandraType;
-import org.apache.james.mailbox.cassandra.table.BlobTable;
-
-import com.datastax.driver.core.DataType;
-import com.datastax.driver.core.schemabuilder.SchemaBuilder;
-import com.google.common.collect.ImmutableList;
-
-public class CassandraBlobModule implements CassandraModule {
-
-    private final List<CassandraTable> tables;
-    private final List<CassandraType> types;
-
-    public CassandraBlobModule() {
-        tables = ImmutableList.of(
-            new CassandraTable(BlobTable.TABLE_NAME,
-                SchemaBuilder.createTable(BlobTable.TABLE_NAME)
-                    .ifNotExists()
-                    .addPartitionKey(BlobTable.ID, DataType.text())
-                    .addClusteringColumn(BlobTable.NUMBER_OF_CHUNK, 
DataType.cint())
-                    .withOptions()
-                    .comment("Holds information for retrieving all blob parts 
composing this blob. " +
-                        "Messages` headers and bodies are stored as 
blobparts.")),
-            new CassandraTable(BlobTable.BlobParts.TABLE_NAME,
-                SchemaBuilder.createTable(BlobTable.BlobParts.TABLE_NAME)
-                    .ifNotExists()
-                    .addPartitionKey(BlobTable.ID, DataType.text())
-                    .addClusteringColumn(BlobTable.BlobParts.CHUNK_NUMBER, 
DataType.cint())
-                    .addColumn(BlobTable.BlobParts.DATA, DataType.blob())
-                    .withOptions()
-                    .comment("Holds blob parts composing blobs ." +
-                        "Messages` headers and bodies are stored, chunked in 
blobparts.")));
-        types = ImmutableList.of();
-    }
-
-    @Override
-    public List<CassandraTable> moduleTables() {
-        return tables;
-    }
-
-    @Override
-    public List<CassandraType> moduleTypes() {
-        return types;
-    }
-}

http://git-wip-us.apache.org/repos/asf/james-project/blob/4e8bcc66/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/BlobTable.java
----------------------------------------------------------------------
diff --git 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/BlobTable.java
 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/BlobTable.java
deleted file mode 100644
index 1c0b0e9..0000000
--- 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/BlobTable.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/****************************************************************
- * 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.table;
-
-public interface BlobTable {
-    String TABLE_NAME = "blobs";
-    String ID = "id";
-    String NUMBER_OF_CHUNK = "position";
-
-    interface BlobParts {
-        String TABLE_NAME = "blobParts";
-        String CHUNK_NUMBER = "chunkNumber";
-        String DATA = "data";
-    }
-}

http://git-wip-us.apache.org/repos/asf/james-project/blob/4e8bcc66/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraCombinationManagerTest.java
----------------------------------------------------------------------
diff --git 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraCombinationManagerTest.java
 
b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraCombinationManagerTest.java
index bf341fe..7ac4e73 100644
--- 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraCombinationManagerTest.java
+++ 
b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraCombinationManagerTest.java
@@ -24,12 +24,12 @@ import static org.mockito.Mockito.mock;
 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.blob.cassandra.CassandraBlobModule;
 import org.apache.james.mailbox.MailboxListener;
 import org.apache.james.mailbox.cassandra.modules.CassandraAclModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraAnnotationModule;
 import 
org.apache.james.mailbox.cassandra.modules.CassandraApplicableFlagsModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraAttachmentModule;
-import org.apache.james.mailbox.cassandra.modules.CassandraBlobModule;
 import 
org.apache.james.mailbox.cassandra.modules.CassandraDeletedMessageModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraFirstUnseenModule;
 import 
org.apache.james.mailbox.cassandra.modules.CassandraMailboxCounterModule;

http://git-wip-us.apache.org/repos/asf/james-project/blob/4e8bcc66/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerStressTest.java
----------------------------------------------------------------------
diff --git 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerStressTest.java
 
b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerStressTest.java
index c8f0092..b460538 100644
--- 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerStressTest.java
+++ 
b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerStressTest.java
@@ -22,13 +22,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.CassandraModuleComposite;
+import org.apache.james.blob.cassandra.CassandraBlobModule;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxManagerStressTest;
 import org.apache.james.mailbox.cassandra.modules.CassandraAclModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraAnnotationModule;
 import 
org.apache.james.mailbox.cassandra.modules.CassandraApplicableFlagsModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraAttachmentModule;
-import org.apache.james.mailbox.cassandra.modules.CassandraBlobModule;
 import 
org.apache.james.mailbox.cassandra.modules.CassandraDeletedMessageModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraFirstUnseenModule;
 import 
org.apache.james.mailbox.cassandra.modules.CassandraMailboxCounterModule;

http://git-wip-us.apache.org/repos/asf/james-project/blob/4e8bcc66/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 13da244..cba1f6e 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
@@ -21,13 +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.CassandraModuleComposite;
+import org.apache.james.blob.cassandra.CassandraBlobModule;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxManagerTest;
 import org.apache.james.mailbox.cassandra.modules.CassandraAclModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraAnnotationModule;
 import 
org.apache.james.mailbox.cassandra.modules.CassandraApplicableFlagsModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraAttachmentModule;
-import org.apache.james.mailbox.cassandra.modules.CassandraBlobModule;
 import 
org.apache.james.mailbox.cassandra.modules.CassandraDeletedMessageModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraFirstUnseenModule;
 import 
org.apache.james.mailbox.cassandra.modules.CassandraMailboxCounterModule;

http://git-wip-us.apache.org/repos/asf/james-project/blob/4e8bcc66/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerQuotaTest.java
----------------------------------------------------------------------
diff --git 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerQuotaTest.java
 
b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerQuotaTest.java
index 15384f5..9d18c8e 100644
--- 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerQuotaTest.java
+++ 
b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerQuotaTest.java
@@ -22,11 +22,11 @@ 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.CassandraModuleComposite;
+import org.apache.james.blob.cassandra.CassandraBlobModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraAclModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraAnnotationModule;
 import 
org.apache.james.mailbox.cassandra.modules.CassandraApplicableFlagsModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraAttachmentModule;
-import org.apache.james.mailbox.cassandra.modules.CassandraBlobModule;
 import 
org.apache.james.mailbox.cassandra.modules.CassandraDeletedMessageModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraFirstUnseenModule;
 import 
org.apache.james.mailbox.cassandra.modules.CassandraMailboxCounterModule;

http://git-wip-us.apache.org/repos/asf/james-project/blob/4e8bcc66/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerSideEffectTest.java
----------------------------------------------------------------------
diff --git 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerSideEffectTest.java
 
b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerSideEffectTest.java
index 14877ed..24e64c2 100644
--- 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerSideEffectTest.java
+++ 
b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerSideEffectTest.java
@@ -22,11 +22,11 @@ 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.CassandraModuleComposite;
+import org.apache.james.blob.cassandra.CassandraBlobModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraAclModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraAnnotationModule;
 import 
org.apache.james.mailbox.cassandra.modules.CassandraApplicableFlagsModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraAttachmentModule;
-import org.apache.james.mailbox.cassandra.modules.CassandraBlobModule;
 import 
org.apache.james.mailbox.cassandra.modules.CassandraDeletedMessageModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraFirstUnseenModule;
 import 
org.apache.james.mailbox.cassandra.modules.CassandraMailboxCounterModule;

http://git-wip-us.apache.org/repos/asf/james-project/blob/4e8bcc66/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerStorageTest.java
----------------------------------------------------------------------
diff --git 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerStorageTest.java
 
b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerStorageTest.java
index 2132688..bd83a42 100644
--- 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerStorageTest.java
+++ 
b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerStorageTest.java
@@ -25,12 +25,12 @@ import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.ContainerLifecycleConfiguration;
 import org.apache.james.backends.cassandra.DockerCassandraRule;
 import org.apache.james.backends.cassandra.init.CassandraModuleComposite;
+import org.apache.james.blob.cassandra.CassandraBlobModule;
 import org.apache.james.mailbox.MailboxListener;
 import org.apache.james.mailbox.cassandra.modules.CassandraAclModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraAnnotationModule;
 import 
org.apache.james.mailbox.cassandra.modules.CassandraApplicableFlagsModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraAttachmentModule;
-import org.apache.james.mailbox.cassandra.modules.CassandraBlobModule;
 import 
org.apache.james.mailbox.cassandra.modules.CassandraDeletedMessageModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraFirstUnseenModule;
 import 
org.apache.james.mailbox.cassandra.modules.CassandraMailboxCounterModule;

http://git-wip-us.apache.org/repos/asf/james-project/blob/4e8bcc66/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 3736666..c55cc11 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,7 @@ 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.blob.cassandra.CassandraBlobsDAO;
 import org.apache.james.mailbox.AbstractSubscriptionManagerTest;
 import org.apache.james.mailbox.SubscriptionManager;
 import org.apache.james.mailbox.cassandra.mail.CassandraACLMapper;
@@ -32,7 +33,6 @@ import 
org.apache.james.mailbox.cassandra.mail.CassandraAttachmentDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraAttachmentDAOV2;
 import org.apache.james.mailbox.cassandra.mail.CassandraAttachmentMessageIdDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraAttachmentOwnerDAO;
-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;

http://git-wip-us.apache.org/repos/asf/james-project/blob/4e8bcc66/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 cbf4d0f..a6d854c 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
@@ -22,6 +22,7 @@ package org.apache.james.mailbox.cassandra;
 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.blob.cassandra.CassandraBlobsDAO;
 import org.apache.james.mailbox.cassandra.ids.CassandraMessageId;
 import org.apache.james.mailbox.cassandra.mail.CassandraACLMapper;
 import org.apache.james.mailbox.cassandra.mail.CassandraApplicableFlagDAO;
@@ -29,7 +30,6 @@ import 
org.apache.james.mailbox.cassandra.mail.CassandraAttachmentDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraAttachmentDAOV2;
 import org.apache.james.mailbox.cassandra.mail.CassandraAttachmentMessageIdDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraAttachmentOwnerDAO;
-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;

http://git-wip-us.apache.org/repos/asf/james-project/blob/4e8bcc66/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAnnotationMapperTest.java
----------------------------------------------------------------------
diff --git 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAnnotationMapperTest.java
 
b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAnnotationMapperTest.java
index 7e4e320..ec23ad8 100644
--- 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAnnotationMapperTest.java
+++ 
b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAnnotationMapperTest.java
@@ -22,11 +22,11 @@ package org.apache.james.mailbox.cassandra.mail;
 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.blob.cassandra.CassandraBlobModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraAclModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraAnnotationModule;
 import 
org.apache.james.mailbox.cassandra.modules.CassandraApplicableFlagsModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraAttachmentModule;
-import org.apache.james.mailbox.cassandra.modules.CassandraBlobModule;
 import 
org.apache.james.mailbox.cassandra.modules.CassandraDeletedMessageModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraFirstUnseenModule;
 import 
org.apache.james.mailbox.cassandra.modules.CassandraMailboxCounterModule;

http://git-wip-us.apache.org/repos/asf/james-project/blob/4e8bcc66/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentFallbackTest.java
----------------------------------------------------------------------
diff --git 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentFallbackTest.java
 
b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentFallbackTest.java
index 4c42a2d..0658b1a 100644
--- 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentFallbackTest.java
+++ 
b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentFallbackTest.java
@@ -29,10 +29,11 @@ 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.blob.cassandra.CassandraBlobId;
+import org.apache.james.blob.api.BlobId;
+import org.apache.james.blob.cassandra.CassandraBlobModule;
+import org.apache.james.blob.cassandra.CassandraBlobsDAO;
 import org.apache.james.mailbox.cassandra.ids.CassandraMessageId;
 import org.apache.james.mailbox.cassandra.modules.CassandraAttachmentModule;
-import org.apache.james.mailbox.cassandra.modules.CassandraBlobModule;
 import org.apache.james.mailbox.exception.AttachmentNotFoundException;
 import org.apache.james.mailbox.model.Attachment;
 import org.apache.james.mailbox.model.AttachmentId;
@@ -108,7 +109,7 @@ public class CassandraAttachmentFallbackTest {
             
.bytes("{\"property\":`\"different\"}".getBytes(StandardCharsets.UTF_8))
             .build();
 
-        CassandraBlobId blobId = blobsDAO.save(attachment.getBytes()).join();
+        BlobId blobId = blobsDAO.save(attachment.getBytes()).join();
         
attachmentDAOV2.storeAttachment(CassandraAttachmentDAOV2.from(attachment, 
blobId)).join();
         attachmentDAO.storeAttachment(otherAttachment).join();
 
@@ -143,7 +144,7 @@ public class CassandraAttachmentFallbackTest {
             
.bytes("{\"property\":`\"different\"}".getBytes(StandardCharsets.UTF_8))
             .build();
 
-        CassandraBlobId blobId = blobsDAO.save(attachment.getBytes()).join();
+        BlobId blobId = blobsDAO.save(attachment.getBytes()).join();
         
attachmentDAOV2.storeAttachment(CassandraAttachmentDAOV2.from(attachment, 
blobId)).join();
         attachmentDAO.storeAttachment(otherAttachment).join();
 
@@ -178,7 +179,7 @@ public class CassandraAttachmentFallbackTest {
             
.bytes("{\"property\":`\"different\"}".getBytes(StandardCharsets.UTF_8))
             .build();
 
-        CassandraBlobId blobId = blobsDAO.save(attachment.getBytes()).join();
+        BlobId blobId = blobsDAO.save(attachment.getBytes()).join();
         
attachmentDAOV2.storeAttachment(CassandraAttachmentDAOV2.from(attachment, 
blobId)).join();
         attachmentDAO.storeAttachment(otherAttachment).join();
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/4e8bcc66/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentMapperTest.java
----------------------------------------------------------------------
diff --git 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentMapperTest.java
 
b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentMapperTest.java
index 85acca5..9325241 100644
--- 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentMapperTest.java
+++ 
b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentMapperTest.java
@@ -22,12 +22,12 @@ package org.apache.james.mailbox.cassandra.mail;
 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.blob.cassandra.CassandraBlobModule;
 import org.apache.james.mailbox.cassandra.ids.CassandraMessageId;
 import org.apache.james.mailbox.cassandra.modules.CassandraAclModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraAnnotationModule;
 import 
org.apache.james.mailbox.cassandra.modules.CassandraApplicableFlagsModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraAttachmentModule;
-import org.apache.james.mailbox.cassandra.modules.CassandraBlobModule;
 import 
org.apache.james.mailbox.cassandra.modules.CassandraDeletedMessageModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraFirstUnseenModule;
 import 
org.apache.james.mailbox.cassandra.modules.CassandraMailboxCounterModule;

http://git-wip-us.apache.org/repos/asf/james-project/blob/4e8bcc66/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraBlobsDAOTest.java
----------------------------------------------------------------------
diff --git 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraBlobsDAOTest.java
 
b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraBlobsDAOTest.java
deleted file mode 100644
index e92316a..0000000
--- 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraBlobsDAOTest.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/****************************************************************
- * 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 static org.assertj.core.api.Assertions.assertThatThrownBy;
-
-import java.io.IOException;
-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.CassandraConfiguration;
-import org.apache.james.blob.cassandra.CassandraBlobId;
-import org.apache.james.mailbox.cassandra.modules.CassandraBlobModule;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.ClassRule;
-import org.junit.Test;
-
-import com.google.common.base.Strings;
-
-public class CassandraBlobsDAOTest {
-    private static final int CHUNK_SIZE = 1024;
-    private static final int MULTIPLE_CHUNK_SIZE = 3;
-
-    @ClassRule public static DockerCassandraRule cassandraServer = new 
DockerCassandraRule();
-    
-    private CassandraCluster cassandra;
-    private CassandraBlobsDAO testee;
-
-    @Before
-    public void setUp() {
-        cassandra = CassandraCluster.create(
-                new CassandraBlobModule(), cassandraServer.getIp(), 
cassandraServer.getBindingPort());
-        
-        testee = new CassandraBlobsDAO(cassandra.getConf(),
-            CassandraConfiguration.builder()
-                .blobPartSize(CHUNK_SIZE)
-                .build());
-    }
-
-    @After
-    public void tearDown() {
-        cassandra.close();
-    }
-
-    @Test
-    public void saveShouldReturnEmptyWhenNullData() throws Exception {
-        assertThatThrownBy(() -> testee.save(null))
-            .isInstanceOf(NullPointerException.class);
-    }
-
-    @Test
-    public void saveShouldSaveEmptyData() throws Exception {
-        CassandraBlobId blobId = testee.save(new byte[]{}).join();
-
-        byte[] bytes = testee.read(blobId).join();
-
-        assertThat(new String(bytes, StandardCharsets.UTF_8)).isEmpty();
-    }
-
-    @Test
-    public void saveShouldSaveBlankData() throws Exception {
-        CassandraBlobId blobId = 
testee.save("".getBytes(StandardCharsets.UTF_8)).join();
-
-        byte[] bytes = testee.read(blobId).join();
-
-        assertThat(new String(bytes, StandardCharsets.UTF_8)).isEmpty();
-    }
-
-    @Test
-    public void saveShouldReturnBlobId() throws Exception {
-        CassandraBlobId blobId = 
testee.save("toto".getBytes(StandardCharsets.UTF_8)).join();
-
-        
assertThat(blobId).isEqualTo(CassandraBlobId.from("31f7a65e315586ac198bd798b6629ce4903d0899476d5741a9f32e2e521b6a66"));
-    }
-
-    @Test
-    public void readShouldBeEmptyWhenNoExisting() throws IOException {
-        byte[] bytes = testee.read(CassandraBlobId.from("unknown")).join();
-
-        assertThat(bytes).isEmpty();
-    }
-
-    @Test
-    public void readShouldReturnSavedData() throws IOException {
-        CassandraBlobId blobId = 
testee.save("toto".getBytes(StandardCharsets.UTF_8)).join();
-
-        byte[] bytes = testee.read(blobId).join();
-
-        assertThat(new String(bytes, 
StandardCharsets.UTF_8)).isEqualTo("toto");
-    }
-
-    @Test
-    public void readShouldReturnLongSavedData() throws IOException {
-        String longString = Strings.repeat("0123456789\n", 1000);
-        CassandraBlobId blobId = 
testee.save(longString.getBytes(StandardCharsets.UTF_8)).join();
-
-        byte[] bytes = testee.read(blobId).join();
-
-        assertThat(new String(bytes, 
StandardCharsets.UTF_8)).isEqualTo(longString);
-    }
-
-    @Test
-    public void readShouldReturnSplitSavedDataByChunk() throws IOException {
-        String longString = Strings.repeat("0123456789\n", 
MULTIPLE_CHUNK_SIZE);
-        CassandraBlobId blobId = 
testee.save(longString.getBytes(StandardCharsets.UTF_8)).join();
-
-        byte[] bytes = testee.read(blobId).join();
-
-        assertThat(new String(bytes, 
StandardCharsets.UTF_8)).isEqualTo(longString);
-    }
-
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/james-project/blob/4e8bcc66/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraGenericMailboxMapperTest.java
----------------------------------------------------------------------
diff --git 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraGenericMailboxMapperTest.java
 
b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraGenericMailboxMapperTest.java
index 24eaff9..836768b 100644
--- 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraGenericMailboxMapperTest.java
+++ 
b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraGenericMailboxMapperTest.java
@@ -22,11 +22,11 @@ package org.apache.james.mailbox.cassandra.mail;
 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.blob.cassandra.CassandraBlobModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraAclModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraAnnotationModule;
 import 
org.apache.james.mailbox.cassandra.modules.CassandraApplicableFlagsModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraAttachmentModule;
-import org.apache.james.mailbox.cassandra.modules.CassandraBlobModule;
 import 
org.apache.james.mailbox.cassandra.modules.CassandraDeletedMessageModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraFirstUnseenModule;
 import 
org.apache.james.mailbox.cassandra.modules.CassandraMailboxCounterModule;

http://git-wip-us.apache.org/repos/asf/james-project/blob/4e8bcc66/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 40f7cd2..d7f1a41 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
@@ -25,6 +25,7 @@ import static org.mockito.Mockito.when;
 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.blob.cassandra.CassandraBlobModule;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.acl.SimpleGroupMembershipResolver;
 import org.apache.james.mailbox.acl.UnionMailboxACLResolver;
@@ -35,7 +36,6 @@ import 
org.apache.james.mailbox.cassandra.ids.CassandraMessageId;
 import org.apache.james.mailbox.cassandra.modules.CassandraAclModule;
 import 
org.apache.james.mailbox.cassandra.modules.CassandraApplicableFlagsModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraAttachmentModule;
-import org.apache.james.mailbox.cassandra.modules.CassandraBlobModule;
 import 
org.apache.james.mailbox.cassandra.modules.CassandraDeletedMessageModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraFirstUnseenModule;
 import 
org.apache.james.mailbox.cassandra.modules.CassandraMailboxCounterModule;

http://git-wip-us.apache.org/repos/asf/james-project/blob/4e8bcc66/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapperAclTest.java
----------------------------------------------------------------------
diff --git 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapperAclTest.java
 
b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapperAclTest.java
index 9490386..286d90e 100644
--- 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapperAclTest.java
+++ 
b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapperAclTest.java
@@ -22,11 +22,11 @@ package org.apache.james.mailbox.cassandra.mail;
 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.blob.cassandra.CassandraBlobModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraAclModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraAnnotationModule;
 import 
org.apache.james.mailbox.cassandra.modules.CassandraApplicableFlagsModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraAttachmentModule;
-import org.apache.james.mailbox.cassandra.modules.CassandraBlobModule;
 import 
org.apache.james.mailbox.cassandra.modules.CassandraDeletedMessageModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraFirstUnseenModule;
 import 
org.apache.james.mailbox.cassandra.modules.CassandraMailboxCounterModule;

http://git-wip-us.apache.org/repos/asf/james-project/blob/4e8bcc66/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOTest.java
----------------------------------------------------------------------
diff --git 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOTest.java
 
b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOTest.java
index 2fa731d..eee499f 100644
--- 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOTest.java
+++ 
b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOTest.java
@@ -38,12 +38,13 @@ 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.backends.cassandra.utils.CassandraUtils;
+import org.apache.james.blob.cassandra.CassandraBlobModule;
+import org.apache.james.blob.cassandra.CassandraBlobsDAO;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.cassandra.ids.CassandraId;
 import org.apache.james.mailbox.cassandra.ids.CassandraMessageId;
 import 
org.apache.james.mailbox.cassandra.mail.CassandraMessageDAO.MessageIdAttachmentIds;
 import org.apache.james.mailbox.cassandra.mail.utils.Limit;
-import org.apache.james.mailbox.cassandra.modules.CassandraBlobModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraMessageModule;
 import org.apache.james.mailbox.model.Attachment;
 import org.apache.james.mailbox.model.ComposedMessageId;

http://git-wip-us.apache.org/repos/asf/james-project/blob/4e8bcc66/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapperTest.java
----------------------------------------------------------------------
diff --git 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapperTest.java
 
b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapperTest.java
index 72c4544..b7499bb 100644
--- 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapperTest.java
+++ 
b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapperTest.java
@@ -22,11 +22,11 @@ package org.apache.james.mailbox.cassandra.mail;
 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.blob.cassandra.CassandraBlobModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraAclModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraAnnotationModule;
 import 
org.apache.james.mailbox.cassandra.modules.CassandraApplicableFlagsModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraAttachmentModule;
-import org.apache.james.mailbox.cassandra.modules.CassandraBlobModule;
 import 
org.apache.james.mailbox.cassandra.modules.CassandraDeletedMessageModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraFirstUnseenModule;
 import 
org.apache.james.mailbox.cassandra.modules.CassandraMailboxCounterModule;

http://git-wip-us.apache.org/repos/asf/james-project/blob/4e8bcc66/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapperTest.java
----------------------------------------------------------------------
diff --git 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapperTest.java
 
b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapperTest.java
index 0fdde79..e5f472f 100644
--- 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapperTest.java
+++ 
b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapperTest.java
@@ -23,11 +23,11 @@ import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.ContainerLifecycleConfiguration;
 import org.apache.james.backends.cassandra.DockerCassandraRule;
 import org.apache.james.backends.cassandra.init.CassandraModuleComposite;
+import org.apache.james.blob.cassandra.CassandraBlobModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraAclModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraAnnotationModule;
 import 
org.apache.james.mailbox.cassandra.modules.CassandraApplicableFlagsModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraAttachmentModule;
-import org.apache.james.mailbox.cassandra.modules.CassandraBlobModule;
 import 
org.apache.james.mailbox.cassandra.modules.CassandraDeletedMessageModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraFirstUnseenModule;
 import 
org.apache.james.mailbox.cassandra.modules.CassandraMailboxCounterModule;

http://git-wip-us.apache.org/repos/asf/james-project/blob/4e8bcc66/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMoveTest.java
----------------------------------------------------------------------
diff --git 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMoveTest.java
 
b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMoveTest.java
index 8f62042..0f41fa3 100644
--- 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMoveTest.java
+++ 
b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMoveTest.java
@@ -22,11 +22,11 @@ package org.apache.james.mailbox.cassandra.mail;
 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.blob.cassandra.CassandraBlobModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraAclModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraAnnotationModule;
 import 
org.apache.james.mailbox.cassandra.modules.CassandraApplicableFlagsModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraAttachmentModule;
-import org.apache.james.mailbox.cassandra.modules.CassandraBlobModule;
 import 
org.apache.james.mailbox.cassandra.modules.CassandraDeletedMessageModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraFirstUnseenModule;
 import 
org.apache.james.mailbox.cassandra.modules.CassandraMailboxCounterModule;

http://git-wip-us.apache.org/repos/asf/james-project/blob/4e8bcc66/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageWithAttachmentMapperTest.java
----------------------------------------------------------------------
diff --git 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageWithAttachmentMapperTest.java
 
b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageWithAttachmentMapperTest.java
index 2d35c39..9efe448 100644
--- 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageWithAttachmentMapperTest.java
+++ 
b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageWithAttachmentMapperTest.java
@@ -22,11 +22,11 @@ package org.apache.james.mailbox.cassandra.mail;
 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.blob.cassandra.CassandraBlobModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraAclModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraAnnotationModule;
 import 
org.apache.james.mailbox.cassandra.modules.CassandraApplicableFlagsModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraAttachmentModule;
-import org.apache.james.mailbox.cassandra.modules.CassandraBlobModule;
 import 
org.apache.james.mailbox.cassandra.modules.CassandraDeletedMessageModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraFirstUnseenModule;
 import 
org.apache.james.mailbox.cassandra.modules.CassandraMailboxCounterModule;

http://git-wip-us.apache.org/repos/asf/james-project/blob/4e8bcc66/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/migration/AttachmentMessageIdCreationTest.java
----------------------------------------------------------------------
diff --git 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/migration/AttachmentMessageIdCreationTest.java
 
b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/migration/AttachmentMessageIdCreationTest.java
index da4c0bf..67d5b1e 100644
--- 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/migration/AttachmentMessageIdCreationTest.java
+++ 
b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/migration/AttachmentMessageIdCreationTest.java
@@ -39,14 +39,14 @@ import 
org.apache.james.backends.cassandra.DockerCassandraRule;
 import org.apache.james.backends.cassandra.init.CassandraModuleComposite;
 import org.apache.james.backends.cassandra.migration.Migration;
 import org.apache.james.backends.cassandra.utils.CassandraUtils;
+import org.apache.james.blob.cassandra.CassandraBlobModule;
+import org.apache.james.blob.cassandra.CassandraBlobsDAO;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.cassandra.ids.CassandraId;
 import org.apache.james.mailbox.cassandra.ids.CassandraMessageId;
 import org.apache.james.mailbox.cassandra.mail.CassandraAttachmentMessageIdDAO;
-import org.apache.james.mailbox.cassandra.mail.CassandraBlobsDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMessageDAO;
 import org.apache.james.mailbox.cassandra.modules.CassandraAttachmentModule;
-import org.apache.james.mailbox.cassandra.modules.CassandraBlobModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraMessageModule;
 import org.apache.james.mailbox.model.Attachment;
 import org.apache.james.mailbox.model.AttachmentId;

http://git-wip-us.apache.org/repos/asf/james-project/blob/4e8bcc66/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/migration/AttachmentV2MigrationTest.java
----------------------------------------------------------------------
diff --git 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/migration/AttachmentV2MigrationTest.java
 
b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/migration/AttachmentV2MigrationTest.java
index b53205e..70792a8 100644
--- 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/migration/AttachmentV2MigrationTest.java
+++ 
b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/migration/AttachmentV2MigrationTest.java
@@ -35,11 +35,11 @@ import 
org.apache.james.backends.cassandra.init.CassandraModuleComposite;
 import org.apache.james.backends.cassandra.migration.Migration;
 import org.apache.james.backends.cassandra.utils.CassandraUtils;
 import org.apache.james.blob.cassandra.CassandraBlobId;
+import org.apache.james.blob.cassandra.CassandraBlobModule;
+import org.apache.james.blob.cassandra.CassandraBlobsDAO;
 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.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.Before;

http://git-wip-us.apache.org/repos/asf/james-project/blob/4e8bcc66/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/utils/DataChunkerTest.java
----------------------------------------------------------------------
diff --git 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/utils/DataChunkerTest.java
 
b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/utils/DataChunkerTest.java
deleted file mode 100644
index 9f3d369..0000000
--- 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/utils/DataChunkerTest.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/****************************************************************
- * 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.utils;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
-import java.nio.ByteBuffer;
-import java.nio.charset.StandardCharsets;
-import java.util.stream.Stream;
-
-import org.apache.commons.lang3.tuple.Pair;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.ExpectedException;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.primitives.Bytes;
-
-public class DataChunkerTest {
-
-    public static final int CHUNK_SIZE = 10;
-
-    @Rule
-    public ExpectedException expectedException = ExpectedException.none();
-
-    private DataChunker testee;
-
-    @Before
-    public void setUp() {
-        testee = new DataChunker();
-    }
-
-    @Test
-    public void chunkShouldThrowOnNullData() {
-        expectedException.expect(NullPointerException.class);
-
-        testee.chunk(null, CHUNK_SIZE);
-    }
-
-    @Test
-    public void chunkShouldThrowOnNegativeChunkSize() {
-        expectedException.expect(IllegalArgumentException.class);
-
-        int chunkSize = -1;
-        testee.chunk(new byte[0], chunkSize);
-    }
-
-    @Test
-    public void chunkShouldThrowOnZeroChunkSize() {
-        expectedException.expect(IllegalArgumentException.class);
-
-        int chunkSize = 0;
-        testee.chunk(new byte[0], chunkSize);
-    }
-
-    @Test
-    public void chunkShouldReturnOneEmptyArrayWhenInputEmpty() {
-        Stream<Pair<Integer, ByteBuffer>> chunks = testee.chunk(new byte[0], 
CHUNK_SIZE);
-        ByteBuffer emptyBuffer = ByteBuffer.wrap(new byte[0]);
-        assertThat(chunks)
-            .containsOnlyElementsOf(ImmutableList.of(Pair.of(0, emptyBuffer)));
-    }
-
-    @Test
-    public void chunkShouldReturnOneArrayWhenInputLessThanChunkSize() {
-        byte[] data = "12345".getBytes(StandardCharsets.UTF_8);
-
-        Stream<Pair<Integer, ByteBuffer>> chunks = testee.chunk(data, 
CHUNK_SIZE);
-
-        assertThat(chunks)
-            .containsOnlyElementsOf(ImmutableList.of(Pair.of(0, 
ByteBuffer.wrap(data))));
-    }
-
-    @Test
-    public void chunkShouldReturnOneArrayWhenInputEqualsChunkSize() {
-        byte[] data = "1234567890".getBytes(StandardCharsets.UTF_8);
-        assertThat(data.length).isEqualTo(CHUNK_SIZE);
-
-        Stream<Pair<Integer, ByteBuffer>> chunks = testee.chunk(data, 
CHUNK_SIZE);
-
-        assertThat(chunks)
-            .containsOnlyElementsOf(ImmutableList.of(Pair.of(0, 
ByteBuffer.wrap(data))));
-    }
-
-    @Test
-    public void chunkShouldReturnSeveralArrayWhenInputBiggerThanChunkSize() {
-        byte[] part1 = "1234567890".getBytes(StandardCharsets.UTF_8);
-        byte[] part2 = "12345".getBytes(StandardCharsets.UTF_8);
-        byte[] data = Bytes.concat(part1, part2);
-
-        Stream<Pair<Integer, ByteBuffer>> chunks = testee.chunk(data, 
CHUNK_SIZE);
-
-        assertThat(chunks)
-        .containsOnlyElementsOf(ImmutableList.of(
-                Pair.of(0, ByteBuffer.wrap(part1)),
-                Pair.of(1, ByteBuffer.wrap(part2))));
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/james-project/blob/4e8bcc66/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 0f758da..ff42a5a 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,6 +21,7 @@ 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.blob.cassandra.CassandraBlobModule;
 import org.apache.james.imap.encode.main.DefaultImapEncoderFactory;
 import org.apache.james.imap.main.DefaultImapDecoderFactory;
 import org.apache.james.imap.processor.main.DefaultImapProcessorFactory;
@@ -36,7 +37,6 @@ import 
org.apache.james.mailbox.cassandra.modules.CassandraAclModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraAnnotationModule;
 import 
org.apache.james.mailbox.cassandra.modules.CassandraApplicableFlagsModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraAttachmentModule;
-import org.apache.james.mailbox.cassandra.modules.CassandraBlobModule;
 import 
org.apache.james.mailbox.cassandra.modules.CassandraDeletedMessageModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraFirstUnseenModule;
 import 
org.apache.james.mailbox.cassandra.modules.CassandraMailboxCounterModule;

http://git-wip-us.apache.org/repos/asf/james-project/blob/4e8bcc66/server/blob/blob-cassandra/pom.xml
----------------------------------------------------------------------
diff --git a/server/blob/blob-cassandra/pom.xml 
b/server/blob/blob-cassandra/pom.xml
index 387d222..22e6985 100644
--- a/server/blob/blob-cassandra/pom.xml
+++ b/server/blob/blob-cassandra/pom.xml
@@ -35,10 +35,26 @@
     <dependencies>
         <dependency>
             <groupId>${project.groupId}</groupId>
+            <artifactId>apache-james-backends-cassandra</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>apache-james-backends-cassandra</artifactId>
+            <type>test-jar</type>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
             <artifactId>blob-api</artifactId>
         </dependency>
         <dependency>
             <groupId>${project.groupId}</groupId>
+            <artifactId>blob-api</artifactId>
+            <type>test-jar</type>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
             <artifactId>james-server-util-java8</artifactId>
         </dependency>
         <dependency>
@@ -69,6 +85,10 @@
             <artifactId>junit-platform-launcher</artifactId>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.testcontainers</groupId>
+            <artifactId>testcontainers</artifactId>
+        </dependency>
     </dependencies>
     
 </project>

http://git-wip-us.apache.org/repos/asf/james-project/blob/4e8bcc66/server/blob/blob-cassandra/src/main/java/org/apache/james/blob/cassandra/BlobTable.java
----------------------------------------------------------------------
diff --git 
a/server/blob/blob-cassandra/src/main/java/org/apache/james/blob/cassandra/BlobTable.java
 
b/server/blob/blob-cassandra/src/main/java/org/apache/james/blob/cassandra/BlobTable.java
new file mode 100644
index 0000000..bfbe742
--- /dev/null
+++ 
b/server/blob/blob-cassandra/src/main/java/org/apache/james/blob/cassandra/BlobTable.java
@@ -0,0 +1,32 @@
+/****************************************************************
+ * 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.blob.cassandra;
+
+public interface BlobTable {
+    String TABLE_NAME = "blobs";
+    String ID = "id";
+    String NUMBER_OF_CHUNK = "position";
+
+    interface BlobParts {
+        String TABLE_NAME = "blobParts";
+        String CHUNK_NUMBER = "chunkNumber";
+        String DATA = "data";
+    }
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to