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