JAMES-2525 adds ObjectStore#save(InputStream) Since this signature doesn't conflict with the original `save(byte[])` the name is kept as is.
The implementatoin of the new method in the CassandraBlobDAO delegates to the original save. Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/e906b04e Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/e906b04e Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/e906b04e Branch: refs/heads/master Commit: e906b04ee4bddc498547123291946b9a5797e260 Parents: 8697970 Author: Jean Helou <[email protected]> Authored: Mon Aug 20 17:31:15 2018 +0200 Committer: Jean Helou <[email protected]> Committed: Thu Aug 23 14:19:24 2018 +0200 ---------------------------------------------------------------------- .../migration/AttachmentV2MigrationTest.java | 2 +- .../org/apache/james/blob/api/ObjectStore.java | 2 ++ .../james/blob/api/ObjectStoreContract.java | 26 +++++++++++++++++++- .../james/blob/cassandra/CassandraBlobsDAO.java | 9 +++++++ 4 files changed, 37 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/e906b04e/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 8a45267..738045a 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 @@ -171,7 +171,7 @@ public class AttachmentV2MigrationTest { when(attachmentDAO.retrieveAll()).thenReturn(Stream.of( attachment1, attachment2)); - when(blobsDAO.save(any())).thenThrow(new RuntimeException()); + when(blobsDAO.save(any(byte[].class))).thenThrow(new RuntimeException()); assertThat(migration.run()).isEqualTo(Migration.Result.PARTIAL); } http://git-wip-us.apache.org/repos/asf/james-project/blob/e906b04e/server/blob/blob-api/src/main/java/org/apache/james/blob/api/ObjectStore.java ---------------------------------------------------------------------- diff --git a/server/blob/blob-api/src/main/java/org/apache/james/blob/api/ObjectStore.java b/server/blob/blob-api/src/main/java/org/apache/james/blob/api/ObjectStore.java index 7582a2c..8b22d55 100644 --- a/server/blob/blob-api/src/main/java/org/apache/james/blob/api/ObjectStore.java +++ b/server/blob/blob-api/src/main/java/org/apache/james/blob/api/ObjectStore.java @@ -25,6 +25,8 @@ public interface ObjectStore { CompletableFuture<BlobId> save(byte[] data); + CompletableFuture<BlobId> save(InputStream data); + CompletableFuture<byte[]> readBytes(BlobId blobId); InputStream read(BlobId blobId); http://git-wip-us.apache.org/repos/asf/james-project/blob/e906b04e/server/blob/blob-api/src/test/java/org/apache/james/blob/api/ObjectStoreContract.java ---------------------------------------------------------------------- diff --git a/server/blob/blob-api/src/test/java/org/apache/james/blob/api/ObjectStoreContract.java b/server/blob/blob-api/src/test/java/org/apache/james/blob/api/ObjectStoreContract.java index bb51e14..dfd7038 100644 --- a/server/blob/blob-api/src/test/java/org/apache/james/blob/api/ObjectStoreContract.java +++ b/server/blob/blob-api/src/test/java/org/apache/james/blob/api/ObjectStoreContract.java @@ -16,6 +16,7 @@ * specific language governing permissions and limitations * * under the License. * ****************************************************************/ + package org.apache.james.blob.api; import static org.assertj.core.api.Assertions.assertThat; @@ -39,7 +40,13 @@ public interface ObjectStoreContract { @Test default void saveShouldReturnEmptyWhenNullData() throws Exception { - assertThatThrownBy(() -> testee().save(null)) + assertThatThrownBy(() -> testee().save((byte[]) null)) + .isInstanceOf(NullPointerException.class); + } + + @Test + default void saveShouldReturnEmptyWhenNullInputStream() throws Exception { + assertThatThrownBy(() -> testee().save((InputStream) null)) .isInstanceOf(NullPointerException.class); } @@ -53,6 +60,15 @@ public interface ObjectStoreContract { } @Test + default void saveShouldSaveEmptyInputStream() throws Exception { + BlobId blobId = testee().save(new ByteArrayInputStream(new byte[]{})).join(); + + byte[] bytes = testee().readBytes(blobId).join(); + + assertThat(new String(bytes, StandardCharsets.UTF_8)).isEmpty(); + } + + @Test default void saveShouldReturnBlobId() throws Exception { BlobId blobId = testee().save("toto".getBytes(StandardCharsets.UTF_8)).join(); @@ -60,6 +76,14 @@ public interface ObjectStoreContract { } @Test + default void saveShouldReturnBlobIdOfInputStream() throws Exception { + BlobId blobId = + testee().save(new ByteArrayInputStream("toto".getBytes(StandardCharsets.UTF_8))).join(); + + assertThat(blobId).isEqualTo(blobIdFactory().from("31f7a65e315586ac198bd798b6629ce4903d0899476d5741a9f32e2e521b6a66")); + } + + @Test default void readBytesShouldBeEmptyWhenNoExisting() throws IOException { byte[] bytes = testee().readBytes(blobIdFactory().from("unknown")).join(); http://git-wip-us.apache.org/repos/asf/james-project/blob/e906b04e/server/blob/blob-cassandra/src/main/java/org/apache/james/blob/cassandra/CassandraBlobsDAO.java ---------------------------------------------------------------------- diff --git a/server/blob/blob-cassandra/src/main/java/org/apache/james/blob/cassandra/CassandraBlobsDAO.java b/server/blob/blob-cassandra/src/main/java/org/apache/james/blob/cassandra/CassandraBlobsDAO.java index 3436d73..d37bf4f 100644 --- a/server/blob/blob-cassandra/src/main/java/org/apache/james/blob/cassandra/CassandraBlobsDAO.java +++ b/server/blob/blob-cassandra/src/main/java/org/apache/james/blob/cassandra/CassandraBlobsDAO.java @@ -36,6 +36,7 @@ import java.util.stream.Stream; import javax.inject.Inject; +import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.tuple.Pair; import org.apache.james.backends.cassandra.init.configuration.CassandraConfiguration; import org.apache.james.backends.cassandra.utils.CassandraAsyncExecutor; @@ -238,4 +239,12 @@ public class CassandraBlobsDAO implements ObjectStore { cause); } } + + @Override + public CompletableFuture<BlobId> save(InputStream data) { + Preconditions.checkNotNull(data); + return CompletableFuture + .supplyAsync(Throwing.supplier(() -> IOUtils.toByteArray(data)).sneakyThrow()) + .thenCompose(this::save); + } } --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
