JAMES-2287 BlobId.Factory for creating BlobIds
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/c4c370ee Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/c4c370ee Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/c4c370ee Branch: refs/heads/master Commit: c4c370ee946d7589f83acf0e944ca189a1363863 Parents: 4db46a8 Author: benwa <[email protected]> Authored: Wed Jan 17 11:51:25 2018 +0700 Committer: benwa <[email protected]> Committed: Fri Jan 19 09:07:28 2018 +0700 ---------------------------------------------------------------------- .../java/org/apache/james/blob/api/BlobId.java | 6 ++++++ .../james/blob/api/ObjectStoreContract.java | 7 ++++--- .../james/blob/cassandra/CassandraBlobId.java | 18 +++++++++++------- .../james/blob/cassandra/CassandraBlobsDAO.java | 8 +++++--- .../blob/cassandra/CassandraBlobIdTest.java | 19 +++++++++++-------- .../blob/cassandra/CassandraBlobsDAOTest.java | 7 ++++--- 6 files changed, 41 insertions(+), 24 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/c4c370ee/server/blob/blob-api/src/main/java/org/apache/james/blob/api/BlobId.java ---------------------------------------------------------------------- diff --git a/server/blob/blob-api/src/main/java/org/apache/james/blob/api/BlobId.java b/server/blob/blob-api/src/main/java/org/apache/james/blob/api/BlobId.java index 647c153..dbfd204 100644 --- a/server/blob/blob-api/src/main/java/org/apache/james/blob/api/BlobId.java +++ b/server/blob/blob-api/src/main/java/org/apache/james/blob/api/BlobId.java @@ -21,5 +21,11 @@ package org.apache.james.blob.api; public interface BlobId { + interface Factory { + BlobId forPayload(byte[] payload); + + BlobId from(String id); + } + String asString(); } http://git-wip-us.apache.org/repos/asf/james-project/blob/c4c370ee/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 2cbab37..bd4bd8e 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 @@ -31,7 +31,8 @@ import com.google.common.base.Strings; public interface ObjectStoreContract { ObjectStore testee(); - BlobId from(String blodIdAsString); + + BlobId.Factory blobIdFactory(); @Test default void saveShouldReturnEmptyWhenNullData() throws Exception { @@ -52,12 +53,12 @@ public interface ObjectStoreContract { default void saveShouldReturnBlobId() throws Exception { BlobId blobId = testee().save("toto".getBytes(StandardCharsets.UTF_8)).join(); - assertThat(blobId).isEqualTo(from("31f7a65e315586ac198bd798b6629ce4903d0899476d5741a9f32e2e521b6a66")); + assertThat(blobId).isEqualTo(blobIdFactory().from("31f7a65e315586ac198bd798b6629ce4903d0899476d5741a9f32e2e521b6a66")); } @Test default void readShouldBeEmptyWhenNoExisting() throws IOException { - byte[] bytes = testee().read(from("unknown")).join(); + byte[] bytes = testee().read(blobIdFactory().from("unknown")).join(); assertThat(bytes).isEmpty(); } http://git-wip-us.apache.org/repos/asf/james-project/blob/c4c370ee/server/blob/blob-cassandra/src/main/java/org/apache/james/blob/cassandra/CassandraBlobId.java ---------------------------------------------------------------------- diff --git a/server/blob/blob-cassandra/src/main/java/org/apache/james/blob/cassandra/CassandraBlobId.java b/server/blob/blob-cassandra/src/main/java/org/apache/james/blob/cassandra/CassandraBlobId.java index 5dba57e..fedd734 100644 --- a/server/blob/blob-cassandra/src/main/java/org/apache/james/blob/cassandra/CassandraBlobId.java +++ b/server/blob/blob-cassandra/src/main/java/org/apache/james/blob/cassandra/CassandraBlobId.java @@ -30,14 +30,18 @@ import com.google.common.base.Strings; public class CassandraBlobId implements BlobId { - public static CassandraBlobId forPayload(byte[] payload) { - Preconditions.checkArgument(payload != null); - return new CassandraBlobId(DigestUtils.sha256Hex(payload)); - } + public static class Factory implements BlobId.Factory { + @Override + public CassandraBlobId forPayload(byte[] payload) { + Preconditions.checkArgument(payload != null); + return new CassandraBlobId(DigestUtils.sha256Hex(payload)); + } - public static CassandraBlobId from(String id) { - Preconditions.checkArgument(!Strings.isNullOrEmpty(id)); - return new CassandraBlobId(id); + @Override + public CassandraBlobId from(String id) { + Preconditions.checkArgument(!Strings.isNullOrEmpty(id)); + return new CassandraBlobId(id); + } } private final String id; http://git-wip-us.apache.org/repos/asf/james-project/blob/c4c370ee/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 97965ec..0c47757 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 @@ -62,11 +62,13 @@ public class CassandraBlobsDAO implements ObjectStore { private final PreparedStatement selectPart; private final DataChunker dataChunker; private final CassandraConfiguration configuration; + private final CassandraBlobId.Factory blobIdFactory; @Inject - public CassandraBlobsDAO(Session session, CassandraConfiguration cassandraConfiguration) { + public CassandraBlobsDAO(Session session, CassandraConfiguration cassandraConfiguration, CassandraBlobId.Factory blobIdFactory) { this.cassandraAsyncExecutor = new CassandraAsyncExecutor(session); this.configuration = cassandraConfiguration; + this.blobIdFactory = blobIdFactory; this.dataChunker = new DataChunker(); this.insert = prepareInsert(session); this.select = prepareSelect(session); @@ -77,7 +79,7 @@ public class CassandraBlobsDAO implements ObjectStore { @VisibleForTesting public CassandraBlobsDAO(Session session) { - this(session, CassandraConfiguration.DEFAULT_CONFIGURATION); + this(session, CassandraConfiguration.DEFAULT_CONFIGURATION, new CassandraBlobId.Factory()); } private PreparedStatement prepareSelect(Session session) { @@ -110,7 +112,7 @@ public class CassandraBlobsDAO implements ObjectStore { public CompletableFuture<BlobId> save(byte[] data) { Preconditions.checkNotNull(data); - CassandraBlobId blobId = CassandraBlobId.forPayload(data); + CassandraBlobId blobId = blobIdFactory.forPayload(data); return saveBlobParts(data, blobId) .thenCompose(numberOfChunk -> saveBlobPartsReferences(blobId, numberOfChunk)) .thenApply(any -> blobId); http://git-wip-us.apache.org/repos/asf/james-project/blob/c4c370ee/server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/CassandraBlobIdTest.java ---------------------------------------------------------------------- diff --git a/server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/CassandraBlobIdTest.java b/server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/CassandraBlobIdTest.java index 2fe0db2..70c7e7c 100644 --- a/server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/CassandraBlobIdTest.java +++ b/server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/CassandraBlobIdTest.java @@ -24,6 +24,7 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import java.nio.charset.StandardCharsets; +import org.apache.james.blob.api.BlobId; import org.apache.james.util.ClassLoaderUtils; import org.junit.jupiter.api.Test; @@ -31,6 +32,8 @@ import nl.jqno.equalsverifier.EqualsVerifier; public class CassandraBlobIdTest { + private static final CassandraBlobId.Factory BLOB_ID_FACTORY = new CassandraBlobId.Factory(); + @Test public void shouldRespectBeanContract() { EqualsVerifier.forClass(CassandraBlobId.class).verify(); @@ -39,38 +42,38 @@ public class CassandraBlobIdTest { @Test public void fromShouldConstructBlobId() { String id = "111"; - assertThat(CassandraBlobId.from(id)) + assertThat(BLOB_ID_FACTORY.from(id)) .isEqualTo(new CassandraBlobId(id)); } @Test public void fromShouldThrowOnNull() { - assertThatThrownBy(() -> CassandraBlobId.from(null)) + assertThatThrownBy(() -> BLOB_ID_FACTORY.from(null)) .isInstanceOf(IllegalArgumentException.class); } @Test public void fromShouldThrowOnEmpty() { - assertThatThrownBy(() -> CassandraBlobId.from("")) + assertThatThrownBy(() -> BLOB_ID_FACTORY.from("")) .isInstanceOf(IllegalArgumentException.class); } @Test public void forPayloadShouldThrowOnNull() { - assertThatThrownBy(() -> CassandraBlobId.forPayload(null)) + assertThatThrownBy(() -> BLOB_ID_FACTORY.forPayload(null)) .isInstanceOf(IllegalArgumentException.class); } @Test public void forPayloadShouldHashEmptyArray() { - CassandraBlobId blobId = CassandraBlobId.forPayload(new byte[0]); + BlobId blobId = BLOB_ID_FACTORY.forPayload(new byte[0]); assertThat(blobId.asString()).isEqualTo("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"); } @Test public void forPayloadShouldHashArray() { - CassandraBlobId blobId = CassandraBlobId.forPayload("content".getBytes(StandardCharsets.UTF_8)); + BlobId blobId = BLOB_ID_FACTORY.forPayload("content".getBytes(StandardCharsets.UTF_8)); assertThat(blobId.asString()).isEqualTo("ed7002b439e9ac845f22357d822bac1444730fbdb6016d3ec9432297b9ec9f73"); } @@ -79,8 +82,8 @@ public class CassandraBlobIdTest { public void forPayloadShouldCalculateDifferentHashesWhenCraftedSha1Collision() throws Exception { byte[] payload1 = ClassLoaderUtils.getSystemResourceAsByteArray("shattered-1.pdf"); byte[] payload2 = ClassLoaderUtils.getSystemResourceAsByteArray("shattered-2.pdf"); - CassandraBlobId blobId1 = CassandraBlobId.forPayload(payload1); - CassandraBlobId blobId2 = CassandraBlobId.forPayload(payload2); + BlobId blobId1 = BLOB_ID_FACTORY.forPayload(payload1); + BlobId blobId2 = BLOB_ID_FACTORY.forPayload(payload2); assertThat(blobId1).isNotEqualTo(blobId2); } } http://git-wip-us.apache.org/repos/asf/james-project/blob/c4c370ee/server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/CassandraBlobsDAOTest.java ---------------------------------------------------------------------- diff --git a/server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/CassandraBlobsDAOTest.java b/server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/CassandraBlobsDAOTest.java index 62e73cd..918730a 100644 --- a/server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/CassandraBlobsDAOTest.java +++ b/server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/CassandraBlobsDAOTest.java @@ -55,7 +55,8 @@ public class CassandraBlobsDAOTest implements ObjectStoreContract { testee = new CassandraBlobsDAO(cassandra.getConf(), CassandraConfiguration.builder() .blobPartSize(CHUNK_SIZE) - .build()); + .build(), + new CassandraBlobId.Factory()); } @AfterEach @@ -69,8 +70,8 @@ public class CassandraBlobsDAOTest implements ObjectStoreContract { } @Override - public BlobId from(String blodIdAsString) { - return CassandraBlobId.from(blodIdAsString); + public BlobId.Factory blobIdFactory() { + return new CassandraBlobId.Factory(); } @Test --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
