JAMES-2525 extracts HashBlobId from cassandra module to api There is nothing cassandra specific to the `CassandraBlobId` implementation and it is useful for the cloud object store.
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/8443ade4 Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/8443ade4 Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/8443ade4 Branch: refs/heads/master Commit: 8443ade42f7594f2aaee93de3f5823cf5bab8260 Parents: 9401123 Author: Jean Helou <[email protected]> Authored: Thu Aug 23 10:09:57 2018 +0200 Committer: Jean Helou <[email protected]> Committed: Wed Aug 29 15:41:52 2018 +0200 ---------------------------------------------------------------------- .../mail/CassandraAttachmentDAOV2Test.java | 4 +- .../mail/CassandraAttachmentFallbackTest.java | 4 +- .../cassandra/mail/CassandraMessageDAOTest.java | 4 +- .../AttachmentMessageIdCreationTest.java | 4 +- .../migration/AttachmentV2MigrationTest.java | 4 +- .../cassandra/mail/utils/GuiceUtils.java | 4 +- .../org/apache/james/blob/api/HashBlobId.java | 78 ++++++++++++++++ .../apache/james/blob/api/HashBlobIdTest.java | 90 +++++++++++++++++++ .../blob-api/src/test/resources/shattered-1.pdf | Bin 0 -> 422435 bytes .../blob-api/src/test/resources/shattered-2.pdf | Bin 0 -> 422435 bytes .../james/blob/cassandra/CassandraBlobId.java | 80 ----------------- .../james/blob/cassandra/CassandraBlobsDAO.java | 15 ++-- .../blob/cassandra/CassandraBlobIdTest.java | 89 ------------------ .../blob/cassandra/CassandraBlobsDAOTest.java | 5 +- .../src/test/resources/shattered-1.pdf | Bin 422435 -> 0 bytes .../src/test/resources/shattered-2.pdf | Bin 422435 -> 0 bytes .../mailbox/CassandraObjectStoreModule.java | 6 +- .../cassandra/CassandraMailRepositoryTest.java | 4 +- 18 files changed, 196 insertions(+), 195 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/8443ade4/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentDAOV2Test.java ---------------------------------------------------------------------- diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentDAOV2Test.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentDAOV2Test.java index e7874d1..7471609 100644 --- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentDAOV2Test.java +++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentDAOV2Test.java @@ -27,7 +27,7 @@ import java.util.Optional; import org.apache.james.backends.cassandra.CassandraCluster; import org.apache.james.backends.cassandra.DockerCassandraRule; import org.apache.james.blob.api.BlobId; -import org.apache.james.blob.cassandra.CassandraBlobId; +import org.apache.james.blob.api.HashBlobId; import org.apache.james.mailbox.cassandra.mail.CassandraAttachmentDAOV2.DAOAttachment; import org.apache.james.mailbox.cassandra.modules.CassandraAttachmentModule; import org.apache.james.mailbox.model.Attachment; @@ -41,7 +41,7 @@ import org.junit.Test; public class CassandraAttachmentDAOV2Test { public static final AttachmentId ATTACHMENT_ID = AttachmentId.from("id1"); - private static final CassandraBlobId.Factory BLOB_ID_FACTORY = new CassandraBlobId.Factory(); + private static final HashBlobId.Factory BLOB_ID_FACTORY = new HashBlobId.Factory(); @ClassRule public static DockerCassandraRule cassandraServer = new DockerCassandraRule(); http://git-wip-us.apache.org/repos/asf/james-project/blob/8443ade4/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 17257b6..0f8a85a 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 @@ -30,7 +30,7 @@ import org.apache.james.backends.cassandra.components.CassandraModule; import org.apache.james.backends.cassandra.init.configuration.CassandraConfiguration; 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.api.HashBlobId; import org.apache.james.blob.cassandra.CassandraBlobModule; import org.apache.james.blob.cassandra.CassandraBlobsDAO; import org.apache.james.mailbox.cassandra.ids.CassandraMessageId; @@ -50,7 +50,7 @@ import com.google.common.collect.ImmutableList; public class CassandraAttachmentFallbackTest { public static final AttachmentId ATTACHMENT_ID_1 = AttachmentId.from("id1"); public static final AttachmentId ATTACHMENT_ID_2 = AttachmentId.from("id2"); - private static final CassandraBlobId.Factory BLOB_ID_FACTORY = new CassandraBlobId.Factory(); + private static final HashBlobId.Factory BLOB_ID_FACTORY = new HashBlobId.Factory(); @ClassRule public static DockerCassandraRule cassandraServer = new DockerCassandraRule(); http://git-wip-us.apache.org/repos/asf/james-project/blob/8443ade4/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 e49f317..2c89621 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,7 +38,7 @@ import org.apache.james.backends.cassandra.CassandraCluster; import org.apache.james.backends.cassandra.DockerCassandraRule; import org.apache.james.backends.cassandra.components.CassandraModule; import org.apache.james.backends.cassandra.utils.CassandraUtils; -import org.apache.james.blob.cassandra.CassandraBlobId; +import org.apache.james.blob.api.HashBlobId; import org.apache.james.blob.cassandra.CassandraBlobModule; import org.apache.james.blob.cassandra.CassandraBlobsDAO; import org.apache.james.mailbox.MessageUid; @@ -96,7 +96,7 @@ public class CassandraMessageDAOTest { messageIdFactory = new CassandraMessageId.Factory(); messageId = messageIdFactory.generate(); CassandraBlobsDAO blobsDAO = new CassandraBlobsDAO(cassandra.getConf()); - CassandraBlobId.Factory blobIdFactory = new CassandraBlobId.Factory(); + HashBlobId.Factory blobIdFactory = new HashBlobId.Factory(); testee = new CassandraMessageDAO(cassandra.getConf(), cassandra.getTypesProvider(), blobsDAO, blobIdFactory, CassandraUtils.WITH_DEFAULT_CONFIGURATION, new CassandraMessageId.Factory()); http://git-wip-us.apache.org/repos/asf/james-project/blob/8443ade4/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 ad9b9b7..e1651f2 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,7 +39,7 @@ import org.apache.james.backends.cassandra.DockerCassandraRule; import org.apache.james.backends.cassandra.components.CassandraModule; 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.api.HashBlobId; import org.apache.james.blob.cassandra.CassandraBlobModule; import org.apache.james.blob.cassandra.CassandraBlobsDAO; import org.apache.james.mailbox.MessageUid; @@ -94,7 +94,7 @@ public class AttachmentMessageIdCreationTest { blobsDAO = new CassandraBlobsDAO(cassandra.getConf()); cassandraMessageDAO = new CassandraMessageDAO(cassandra.getConf(), cassandra.getTypesProvider(), - blobsDAO, new CassandraBlobId.Factory(), CassandraUtils.WITH_DEFAULT_CONFIGURATION, messageIdFactory); + blobsDAO, new HashBlobId.Factory(), CassandraUtils.WITH_DEFAULT_CONFIGURATION, messageIdFactory); attachmentMessageIdDAO = new CassandraAttachmentMessageIdDAO(cassandra.getConf(), new CassandraMessageId.Factory(), CassandraUtils.WITH_DEFAULT_CONFIGURATION); http://git-wip-us.apache.org/repos/asf/james-project/blob/8443ade4/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 738045a..131eca0 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 @@ -34,7 +34,7 @@ import org.apache.james.backends.cassandra.components.CassandraModule; import org.apache.james.backends.cassandra.init.configuration.CassandraConfiguration; 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.api.HashBlobId; import org.apache.james.blob.cassandra.CassandraBlobModule; import org.apache.james.blob.cassandra.CassandraBlobsDAO; import org.apache.james.mailbox.cassandra.mail.CassandraAttachmentDAO; @@ -52,7 +52,7 @@ import org.junit.Test; public class AttachmentV2MigrationTest { public static final AttachmentId ATTACHMENT_ID = AttachmentId.from("id1"); public static final AttachmentId ATTACHMENT_ID_2 = AttachmentId.from("id2"); - private static final CassandraBlobId.Factory BLOB_ID_FACTORY = new CassandraBlobId.Factory(); + private static final HashBlobId.Factory BLOB_ID_FACTORY = new HashBlobId.Factory(); @ClassRule public static DockerCassandraRule cassandraServer = new DockerCassandraRule(); http://git-wip-us.apache.org/repos/asf/james-project/blob/8443ade4/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/utils/GuiceUtils.java ---------------------------------------------------------------------- diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/utils/GuiceUtils.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/utils/GuiceUtils.java index 8a1ee7a..8da3d92 100644 --- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/utils/GuiceUtils.java +++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/utils/GuiceUtils.java @@ -24,7 +24,7 @@ import org.apache.james.backends.cassandra.init.CassandraTypesProvider; import org.apache.james.backends.cassandra.init.configuration.CassandraConfiguration; import org.apache.james.blob.api.BlobId; import org.apache.james.blob.api.ObjectStore; -import org.apache.james.blob.cassandra.CassandraBlobId; +import org.apache.james.blob.api.HashBlobId; import org.apache.james.blob.cassandra.CassandraBlobsDAO; import org.apache.james.mailbox.cassandra.ids.CassandraMessageId; import org.apache.james.mailbox.model.MessageId; @@ -48,7 +48,7 @@ public class GuiceUtils { return Guice.createInjector( Modules.combine( binder -> binder.bind(MessageId.Factory.class).toInstance(messageIdFactory), - binder -> binder.bind(BlobId.Factory.class).toInstance(new CassandraBlobId.Factory()), + binder -> binder.bind(BlobId.Factory.class).toInstance(new HashBlobId.Factory()), binder -> binder.bind(ObjectStore.class).to(CassandraBlobsDAO.class), binder -> binder.bind(Session.class).toInstance(session), binder -> binder.bind(CassandraTypesProvider.class).toInstance(typesProvider), http://git-wip-us.apache.org/repos/asf/james-project/blob/8443ade4/server/blob/blob-api/src/main/java/org/apache/james/blob/api/HashBlobId.java ---------------------------------------------------------------------- diff --git a/server/blob/blob-api/src/main/java/org/apache/james/blob/api/HashBlobId.java b/server/blob/blob-api/src/main/java/org/apache/james/blob/api/HashBlobId.java new file mode 100644 index 0000000..d145040 --- /dev/null +++ b/server/blob/blob-api/src/main/java/org/apache/james/blob/api/HashBlobId.java @@ -0,0 +1,78 @@ +/**************************************************************** + * 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.api; + +import com.google.common.annotations.VisibleForTesting; +import com.google.common.base.MoreObjects; +import com.google.common.base.Objects; +import com.google.common.base.Preconditions; +import com.google.common.base.Strings; +import com.google.common.hash.Hashing; + +public class HashBlobId implements BlobId { + + public static class Factory implements BlobId.Factory { + @Override + public HashBlobId forPayload(byte[] payload) { + Preconditions.checkArgument(payload != null); + return new HashBlobId(Hashing.sha256().hashBytes(payload).toString()); + } + + @Override + public HashBlobId from(String id) { + Preconditions.checkArgument(!Strings.isNullOrEmpty(id)); + return new HashBlobId(id); + } + } + + private final String id; + + @VisibleForTesting + HashBlobId(String id) { + this.id = id; + } + + @Override + public String asString() { + return id; + } + + @Override + public final boolean equals(Object obj) { + if (obj instanceof HashBlobId) { + HashBlobId other = (HashBlobId) obj; + return Objects.equal(id, other.id); + } + return false; + } + + @Override + public final int hashCode() { + return Objects.hashCode(id); + } + + @Override + public String toString() { + return MoreObjects + .toStringHelper(this) + .add("id", id) + .toString(); + } +} http://git-wip-us.apache.org/repos/asf/james-project/blob/8443ade4/server/blob/blob-api/src/test/java/org/apache/james/blob/api/HashBlobIdTest.java ---------------------------------------------------------------------- diff --git a/server/blob/blob-api/src/test/java/org/apache/james/blob/api/HashBlobIdTest.java b/server/blob/blob-api/src/test/java/org/apache/james/blob/api/HashBlobIdTest.java new file mode 100644 index 0000000..5b4359e --- /dev/null +++ b/server/blob/blob-api/src/test/java/org/apache/james/blob/api/HashBlobIdTest.java @@ -0,0 +1,90 @@ +/**************************************************************** + * 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.api; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import java.nio.charset.StandardCharsets; + +import org.apache.james.blob.api.BlobId; +import org.apache.james.blob.api.HashBlobId; +import org.apache.james.util.ClassLoaderUtils; +import org.junit.jupiter.api.Test; + +import nl.jqno.equalsverifier.EqualsVerifier; + +public class HashBlobIdTest { + + private static final HashBlobId.Factory BLOB_ID_FACTORY = new HashBlobId.Factory(); + + @Test + public void shouldRespectBeanContract() { + EqualsVerifier.forClass(HashBlobId.class).verify(); + } + + @Test + public void fromShouldConstructBlobId() { + String id = "111"; + assertThat(BLOB_ID_FACTORY.from(id)) + .isEqualTo(new HashBlobId(id)); + } + + @Test + public void fromShouldThrowOnNull() { + assertThatThrownBy(() -> BLOB_ID_FACTORY.from(null)) + .isInstanceOf(IllegalArgumentException.class); + } + + @Test + public void fromShouldThrowOnEmpty() { + assertThatThrownBy(() -> BLOB_ID_FACTORY.from("")) + .isInstanceOf(IllegalArgumentException.class); + } + + @Test + public void forPayloadShouldThrowOnNull() { + assertThatThrownBy(() -> BLOB_ID_FACTORY.forPayload(null)) + .isInstanceOf(IllegalArgumentException.class); + } + + @Test + public void forPayloadShouldHashEmptyArray() { + BlobId blobId = BLOB_ID_FACTORY.forPayload(new byte[0]); + + assertThat(blobId.asString()).isEqualTo("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"); + } + + @Test + public void forPayloadShouldHashArray() { + BlobId blobId = BLOB_ID_FACTORY.forPayload("content".getBytes(StandardCharsets.UTF_8)); + + assertThat(blobId.asString()).isEqualTo("ed7002b439e9ac845f22357d822bac1444730fbdb6016d3ec9432297b9ec9f73"); + } + + @Test + public void forPayloadShouldCalculateDifferentHashesWhenCraftedSha1Collision() throws Exception { + byte[] payload1 = ClassLoaderUtils.getSystemResourceAsByteArray("shattered-1.pdf"); + byte[] payload2 = ClassLoaderUtils.getSystemResourceAsByteArray("shattered-2.pdf"); + 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/8443ade4/server/blob/blob-api/src/test/resources/shattered-1.pdf ---------------------------------------------------------------------- diff --git a/server/blob/blob-api/src/test/resources/shattered-1.pdf b/server/blob/blob-api/src/test/resources/shattered-1.pdf new file mode 100644 index 0000000..ba9aaa1 Binary files /dev/null and b/server/blob/blob-api/src/test/resources/shattered-1.pdf differ http://git-wip-us.apache.org/repos/asf/james-project/blob/8443ade4/server/blob/blob-api/src/test/resources/shattered-2.pdf ---------------------------------------------------------------------- diff --git a/server/blob/blob-api/src/test/resources/shattered-2.pdf b/server/blob/blob-api/src/test/resources/shattered-2.pdf new file mode 100644 index 0000000..b621eec Binary files /dev/null and b/server/blob/blob-api/src/test/resources/shattered-2.pdf differ http://git-wip-us.apache.org/repos/asf/james-project/blob/8443ade4/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 deleted file mode 100644 index d349b53..0000000 --- a/server/blob/blob-cassandra/src/main/java/org/apache/james/blob/cassandra/CassandraBlobId.java +++ /dev/null @@ -1,80 +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.blob.cassandra; - -import org.apache.james.blob.api.BlobId; - -import com.google.common.annotations.VisibleForTesting; -import com.google.common.base.MoreObjects; -import com.google.common.base.Objects; -import com.google.common.base.Preconditions; -import com.google.common.base.Strings; -import com.google.common.hash.Hashing; - -public class CassandraBlobId implements BlobId { - - public static class Factory implements BlobId.Factory { - @Override - public CassandraBlobId forPayload(byte[] payload) { - Preconditions.checkArgument(payload != null); - return new CassandraBlobId(Hashing.sha256().hashBytes(payload).toString()); - } - - @Override - public CassandraBlobId from(String id) { - Preconditions.checkArgument(!Strings.isNullOrEmpty(id)); - return new CassandraBlobId(id); - } - } - - private final String id; - - @VisibleForTesting - CassandraBlobId(String id) { - this.id = id; - } - - @Override - public String asString() { - return id; - } - - @Override - public final boolean equals(Object obj) { - if (obj instanceof CassandraBlobId) { - CassandraBlobId other = (CassandraBlobId) obj; - return Objects.equal(id, other.id); - } - return false; - } - - @Override - public final int hashCode() { - return Objects.hashCode(id); - } - - @Override - public String toString() { - return MoreObjects - .toStringHelper(this) - .add("id", id) - .toString(); - } -} http://git-wip-us.apache.org/repos/asf/james-project/blob/8443ade4/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 d37bf4f..ec47e4a 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 @@ -41,6 +41,7 @@ import org.apache.commons.lang3.tuple.Pair; import org.apache.james.backends.cassandra.init.configuration.CassandraConfiguration; import org.apache.james.backends.cassandra.utils.CassandraAsyncExecutor; import org.apache.james.blob.api.BlobId; +import org.apache.james.blob.api.HashBlobId; import org.apache.james.blob.api.ObjectStore; import org.apache.james.blob.api.ObjectStoreException; import org.apache.james.blob.cassandra.BlobTable.BlobParts; @@ -70,10 +71,10 @@ public class CassandraBlobsDAO implements ObjectStore { private final PreparedStatement selectPart; private final DataChunker dataChunker; private final CassandraConfiguration configuration; - private final CassandraBlobId.Factory blobIdFactory; + private final HashBlobId.Factory blobIdFactory; @Inject - public CassandraBlobsDAO(Session session, CassandraConfiguration cassandraConfiguration, CassandraBlobId.Factory blobIdFactory) { + public CassandraBlobsDAO(Session session, CassandraConfiguration cassandraConfiguration, HashBlobId.Factory blobIdFactory) { this.cassandraAsyncExecutor = new CassandraAsyncExecutor(session); this.configuration = cassandraConfiguration; this.blobIdFactory = blobIdFactory; @@ -87,7 +88,7 @@ public class CassandraBlobsDAO implements ObjectStore { @VisibleForTesting public CassandraBlobsDAO(Session session) { - this(session, CassandraConfiguration.DEFAULT_CONFIGURATION, new CassandraBlobId.Factory()); + this(session, CassandraConfiguration.DEFAULT_CONFIGURATION, new HashBlobId.Factory()); } private PreparedStatement prepareSelect(Session session) { @@ -120,13 +121,13 @@ public class CassandraBlobsDAO implements ObjectStore { public CompletableFuture<BlobId> save(byte[] data) { Preconditions.checkNotNull(data); - CassandraBlobId blobId = blobIdFactory.forPayload(data); + HashBlobId blobId = blobIdFactory.forPayload(data); return saveBlobParts(data, blobId) .thenCompose(numberOfChunk -> saveBlobPartsReferences(blobId, numberOfChunk)) .thenApply(any -> blobId); } - private CompletableFuture<Integer> saveBlobParts(byte[] data, CassandraBlobId blobId) { + private CompletableFuture<Integer> saveBlobParts(byte[] data, HashBlobId blobId) { return FluentFutureStream.of( dataChunker.chunk(data, configuration.getBlobPartSize()) .map(pair -> writePart(pair.getRight(), blobId, pair.getKey()) @@ -142,7 +143,7 @@ public class CassandraBlobsDAO implements ObjectStore { return stream.reduce((first, second) -> second); } - private CompletableFuture<Void> writePart(ByteBuffer data, CassandraBlobId blobId, int position) { + private CompletableFuture<Void> writePart(ByteBuffer data, HashBlobId blobId, int position) { return cassandraAsyncExecutor.executeVoid( insertPart.bind() .setString(BlobTable.ID, blobId.asString()) @@ -150,7 +151,7 @@ public class CassandraBlobsDAO implements ObjectStore { .setBytes(BlobParts.DATA, data)); } - private CompletableFuture<Void> saveBlobPartsReferences(CassandraBlobId blobId, int numberOfChunk) { + private CompletableFuture<Void> saveBlobPartsReferences(HashBlobId blobId, int numberOfChunk) { return cassandraAsyncExecutor.executeVoid(insert.bind() .setString(BlobTable.ID, blobId.asString()) .setInt(BlobTable.NUMBER_OF_CHUNK, numberOfChunk)); http://git-wip-us.apache.org/repos/asf/james-project/blob/8443ade4/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 deleted file mode 100644 index 70c7e7c..0000000 --- a/server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/CassandraBlobIdTest.java +++ /dev/null @@ -1,89 +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.blob.cassandra; - -import static org.assertj.core.api.Assertions.assertThat; -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; - -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(); - } - - @Test - public void fromShouldConstructBlobId() { - String id = "111"; - assertThat(BLOB_ID_FACTORY.from(id)) - .isEqualTo(new CassandraBlobId(id)); - } - - @Test - public void fromShouldThrowOnNull() { - assertThatThrownBy(() -> BLOB_ID_FACTORY.from(null)) - .isInstanceOf(IllegalArgumentException.class); - } - - @Test - public void fromShouldThrowOnEmpty() { - assertThatThrownBy(() -> BLOB_ID_FACTORY.from("")) - .isInstanceOf(IllegalArgumentException.class); - } - - @Test - public void forPayloadShouldThrowOnNull() { - assertThatThrownBy(() -> BLOB_ID_FACTORY.forPayload(null)) - .isInstanceOf(IllegalArgumentException.class); - } - - @Test - public void forPayloadShouldHashEmptyArray() { - BlobId blobId = BLOB_ID_FACTORY.forPayload(new byte[0]); - - assertThat(blobId.asString()).isEqualTo("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"); - } - - @Test - public void forPayloadShouldHashArray() { - BlobId blobId = BLOB_ID_FACTORY.forPayload("content".getBytes(StandardCharsets.UTF_8)); - - assertThat(blobId.asString()).isEqualTo("ed7002b439e9ac845f22357d822bac1444730fbdb6016d3ec9432297b9ec9f73"); - } - - @Test - public void forPayloadShouldCalculateDifferentHashesWhenCraftedSha1Collision() throws Exception { - byte[] payload1 = ClassLoaderUtils.getSystemResourceAsByteArray("shattered-1.pdf"); - byte[] payload2 = ClassLoaderUtils.getSystemResourceAsByteArray("shattered-2.pdf"); - 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/8443ade4/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 cb7db4d..98e4e6e 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 @@ -29,6 +29,7 @@ import org.apache.james.backends.cassandra.DockerCassandraExtension; import org.apache.james.backends.cassandra.DockerCassandraExtension.DockerCassandra; import org.apache.james.backends.cassandra.init.configuration.CassandraConfiguration; import org.apache.james.blob.api.BlobId; +import org.apache.james.blob.api.HashBlobId; import org.apache.james.blob.api.ObjectStore; import org.apache.james.blob.api.ObjectStoreContract; import org.junit.jupiter.api.AfterAll; @@ -60,7 +61,7 @@ public class CassandraBlobsDAOTest implements ObjectStoreContract { CassandraConfiguration.builder() .blobPartSize(CHUNK_SIZE) .build(), - new CassandraBlobId.Factory()); + new HashBlobId.Factory()); } @AfterEach @@ -80,7 +81,7 @@ public class CassandraBlobsDAOTest implements ObjectStoreContract { @Override public BlobId.Factory blobIdFactory() { - return new CassandraBlobId.Factory(); + return new HashBlobId.Factory(); } @Test http://git-wip-us.apache.org/repos/asf/james-project/blob/8443ade4/server/blob/blob-cassandra/src/test/resources/shattered-1.pdf ---------------------------------------------------------------------- diff --git a/server/blob/blob-cassandra/src/test/resources/shattered-1.pdf b/server/blob/blob-cassandra/src/test/resources/shattered-1.pdf deleted file mode 100644 index ba9aaa1..0000000 Binary files a/server/blob/blob-cassandra/src/test/resources/shattered-1.pdf and /dev/null differ http://git-wip-us.apache.org/repos/asf/james-project/blob/8443ade4/server/blob/blob-cassandra/src/test/resources/shattered-2.pdf ---------------------------------------------------------------------- diff --git a/server/blob/blob-cassandra/src/test/resources/shattered-2.pdf b/server/blob/blob-cassandra/src/test/resources/shattered-2.pdf deleted file mode 100644 index b621eec..0000000 Binary files a/server/blob/blob-cassandra/src/test/resources/shattered-2.pdf and /dev/null differ http://git-wip-us.apache.org/repos/asf/james-project/blob/8443ade4/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraObjectStoreModule.java ---------------------------------------------------------------------- diff --git a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraObjectStoreModule.java b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraObjectStoreModule.java index b1f33cd..ea715f8 100644 --- a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraObjectStoreModule.java +++ b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraObjectStoreModule.java @@ -21,8 +21,8 @@ package org.apache.james.modules.mailbox; import org.apache.james.backends.cassandra.components.CassandraModule; import org.apache.james.blob.api.BlobId; +import org.apache.james.blob.api.HashBlobId; import org.apache.james.blob.api.ObjectStore; -import org.apache.james.blob.cassandra.CassandraBlobId; import org.apache.james.blob.cassandra.CassandraBlobModule; import org.apache.james.blob.cassandra.CassandraBlobsDAO; @@ -34,10 +34,10 @@ public class CassandraObjectStoreModule extends AbstractModule { @Override protected void configure() { bind(CassandraBlobsDAO.class).in(Scopes.SINGLETON); - bind(CassandraBlobId.Factory.class).in(Scopes.SINGLETON); + bind(HashBlobId.Factory.class).in(Scopes.SINGLETON); bind(ObjectStore.class).to(CassandraBlobsDAO.class); - bind(BlobId.Factory.class).to(CassandraBlobId.Factory.class); + bind(BlobId.Factory.class).to(HashBlobId.Factory.class); Multibinder<CassandraModule> cassandraDataDefinitions = Multibinder.newSetBinder(binder(), CassandraModule.class); cassandraDataDefinitions.addBinding().toInstance(CassandraBlobModule.MODULE); http://git-wip-us.apache.org/repos/asf/james-project/blob/8443ade4/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryTest.java ---------------------------------------------------------------------- diff --git a/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryTest.java b/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryTest.java index 84cf4c0..7101376 100644 --- a/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryTest.java +++ b/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryTest.java @@ -23,7 +23,7 @@ import org.apache.james.backends.cassandra.CassandraCluster; import org.apache.james.backends.cassandra.DockerCassandraExtension; import org.apache.james.backends.cassandra.components.CassandraModule; import org.apache.james.backends.cassandra.utils.CassandraUtils; -import org.apache.james.blob.cassandra.CassandraBlobId; +import org.apache.james.blob.api.HashBlobId; import org.apache.james.blob.cassandra.CassandraBlobModule; import org.apache.james.blob.cassandra.CassandraBlobsDAO; import org.apache.james.mailrepository.MailRepositoryContract; @@ -40,7 +40,7 @@ import org.junit.jupiter.api.extension.ExtendWith; @ExtendWith(DockerCassandraExtension.class) class CassandraMailRepositoryTest implements MailRepositoryContract { static final MailRepositoryUrl URL = MailRepositoryUrl.from("proto://url"); - static final CassandraBlobId.Factory BLOB_ID_FACTORY = new CassandraBlobId.Factory(); + static final HashBlobId.Factory BLOB_ID_FACTORY = new HashBlobId.Factory(); CassandraMailRepository cassandraMailRepository; static CassandraCluster cassandra; --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
