You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by ad...@apache.org on 2018/08/29 14:24:09 UTC
[4/5] james-project git commit: JAMES-2525 extracts HashBlobId from
cassandra module to api
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 <jh...@codamens.fr>
Authored: Thu Aug 23 10:09:57 2018 +0200
Committer: Jean Helou <jh...@codamens.fr>
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: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org