You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@james.apache.org by rc...@apache.org on 2024/03/26 02:59:37 UTC

(james-project) branch postgresql updated (d7a19ef054 -> a2d5bc41a0)

This is an automated email from the ASF dual-hosted git repository.

rcordier pushed a change to branch postgresql
in repository https://gitbox.apache.org/repos/asf/james-project.git


    from d7a19ef054 JAMES-2586 Postgres RewriteTablesTest should not fail unstable test phase
     new 1dd1b147ee JAMES-2586 Create AttachmentIdFactory
     new 156bf4a071 JAMES-2586 Add UuidBackedAttachmentIdFactory
     new a2d5bc41a0 JAMES-2586 Unbind AttachmentBlobResolver

The 3 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../apache/james/mailbox/AttachmentIdFactory.java  | 11 ++--
 .../mailbox/StringBackedAttachmentIdFactory.java   | 20 +++-----
 .../mailbox/UuidBackedAttachmentIdFactory.java     | 20 +++-----
 .../apache/james/mailbox/model/AttachmentId.java   | 59 ++--------------------
 ...chmentId.java => StringBackedAttachmentId.java} | 18 ++++---
 ...tachmentId.java => UuidBackedAttachmentId.java} | 35 ++++++-------
 .../mailbox/model/AttachmentMetadataTest.java      |  6 +--
 .../model/MessageAttachmentMetadataTest.java       | 12 ++---
 ...Test.java => StringBackedAttachmentIdTest.java} | 14 ++---
 .../CassandraMailboxSessionMapperFactory.java      |  3 +-
 .../cassandra/mail/CassandraAttachmentDAOV2.java   |  3 +-
 .../cassandra/mail/CassandraAttachmentMapper.java  |  7 ++-
 .../cassandra/mail/CassandraMessageDAOV3.java      |  4 +-
 .../mail/MessageAttachmentRepresentation.java      | 12 ++---
 .../cassandra/CassandraMailboxManagerTest.java     |  3 +-
 .../cassandra/mail/AttachmentLoaderTest.java       | 12 ++---
 .../mail/CassandraAttachmentDAOV2Test.java         |  8 ++-
 .../MessageAttachmentRepresentationByIdTest.java   | 10 ++--
 .../mailbox/cassandra/mail/utils/GuiceUtils.java   |  5 +-
 .../mailbox/jpa/mail/JPAAttachmentMapper.java      |  5 +-
 .../mailbox/jpa/mail/model/JPAAttachment.java      |  4 +-
 .../model/openjpa/AbstractJPAMailboxMessage.java   |  6 +--
 .../inmemory/mail/InMemoryAttachmentMapper.java    |  3 +-
 .../OpenSearchListeningMessageSearchIndexTest.java |  4 +-
 .../opensearch/json/IndexableMessageTest.java      |  5 +-
 .../james/vault/DeletedMessageConverterTest.java   |  4 +-
 .../postgres/mail/PostgresAttachmentMapper.java    |  3 +-
 .../postgres/mail/PostgresAttachmentModule.java    |  2 +-
 .../postgres/mail/dao/PostgresAttachmentDAO.java   |  7 +--
 .../mailbox/postgres/mail/dto/AttachmentsDTO.java  |  3 +-
 .../PostgresAttachmentBlobReferenceSourceTest.java |  5 +-
 .../mailbox/store/StoreAttachmentManagerTest.java  |  4 +-
 .../store/mail/model/AttachmentMapperTest.java     | 15 +++---
 .../mail/model/impl/SimpleMailboxMessageTest.java  |  4 +-
 .../modules/mailbox/CassandraMailboxModule.java    |  3 ++
 .../james/modules/mailbox/JPAMailboxModule.java    |  3 ++
 .../modules/mailbox/PostgresMailboxModule.java     |  3 ++
 .../james/modules/mailbox/MemoryMailboxModule.java |  3 ++
 .../james/jmap/rfc8621/RFC8621MethodsModule.java   |  2 -
 .../methods/integration/SetMessagesMethodTest.java |  6 +--
 .../james/jmap/draft/methods/BlobManagerImpl.java  | 10 ++--
 .../org/apache/james/jmap/draft/model/BlobId.java  |  4 --
 .../jmap/draft/methods/BlobManagerImplTest.java    |  7 +--
 .../draft/methods/MIMEMessageConverterTest.java    | 34 ++++++-------
 .../message/view/MessageFastViewFactoryTest.java   |  3 +-
 .../message/view/MessageFullViewFactoryTest.java   |  8 +--
 .../message/view/MessageHeaderViewFactoryTest.java |  4 +-
 .../view/MessageMetadataViewFactoryTest.java       |  4 +-
 ...mputeMessageFastViewProjectionListenerTest.java |  4 +-
 .../apache/james/jmap/routes/DownloadRoutes.scala  |  8 +--
 50 files changed, 202 insertions(+), 240 deletions(-)
 copy mailet/api/src/main/java/org/apache/mailet/Experimental.java => mailbox/api/src/main/java/org/apache/james/mailbox/AttachmentIdFactory.java (86%)
 copy mpt/core/src/main/java/org/apache/james/mpt/monitor/NullMonitor.java => mailbox/api/src/main/java/org/apache/james/mailbox/StringBackedAttachmentIdFactory.java (76%)
 copy mpt/core/src/main/java/org/apache/james/mpt/monitor/NullMonitor.java => mailbox/api/src/main/java/org/apache/james/mailbox/UuidBackedAttachmentIdFactory.java (77%)
 copy mailbox/api/src/main/java/org/apache/james/mailbox/model/{AttachmentId.java => StringBackedAttachmentId.java} (81%)
 copy mailbox/api/src/main/java/org/apache/james/mailbox/model/{AttachmentId.java => UuidBackedAttachmentId.java} (69%)
 rename mailbox/api/src/test/java/org/apache/james/mailbox/model/{AttachmentIdTest.java => StringBackedAttachmentIdTest.java} (77%)


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org


(james-project) 01/03: JAMES-2586 Create AttachmentIdFactory

Posted by rc...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

rcordier pushed a commit to branch postgresql
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 1dd1b147eef439a19f000c345be41c884d1e4882
Author: hung phan <hp...@linagora.com>
AuthorDate: Tue Mar 19 15:53:50 2024 +0700

    JAMES-2586 Create AttachmentIdFactory
---
 .../apache/james/mailbox/AttachmentIdFactory.java  | 28 ++++++++++
 .../mailbox/StringBackedAttachmentIdFactory.java   | 34 +++++++++++++
 .../apache/james/mailbox/model/AttachmentId.java   | 59 ++--------------------
 ...chmentId.java => StringBackedAttachmentId.java} | 18 ++++---
 .../mailbox/model/AttachmentMetadataTest.java      |  6 +--
 .../model/MessageAttachmentMetadataTest.java       | 12 ++---
 ...Test.java => StringBackedAttachmentIdTest.java} | 14 ++---
 .../CassandraMailboxSessionMapperFactory.java      |  3 +-
 .../cassandra/mail/CassandraAttachmentDAOV2.java   |  3 +-
 .../cassandra/mail/CassandraAttachmentMapper.java  |  7 ++-
 .../cassandra/mail/CassandraMessageDAOV3.java      |  4 +-
 .../mail/MessageAttachmentRepresentation.java      | 12 ++---
 .../cassandra/CassandraMailboxManagerTest.java     |  3 +-
 .../cassandra/mail/AttachmentLoaderTest.java       | 12 ++---
 .../mail/CassandraAttachmentDAOV2Test.java         |  8 ++-
 .../MessageAttachmentRepresentationByIdTest.java   | 10 ++--
 .../mailbox/cassandra/mail/utils/GuiceUtils.java   |  5 +-
 .../mailbox/jpa/mail/JPAAttachmentMapper.java      |  5 +-
 .../mailbox/jpa/mail/model/JPAAttachment.java      |  4 +-
 .../model/openjpa/AbstractJPAMailboxMessage.java   |  6 +--
 .../inmemory/mail/InMemoryAttachmentMapper.java    |  3 +-
 .../OpenSearchListeningMessageSearchIndexTest.java |  4 +-
 .../opensearch/json/IndexableMessageTest.java      |  5 +-
 .../james/vault/DeletedMessageConverterTest.java   |  4 +-
 .../mailbox/store/StoreAttachmentManagerTest.java  |  4 +-
 .../store/mail/model/AttachmentMapperTest.java     | 15 +++---
 .../mail/model/impl/SimpleMailboxMessageTest.java  |  4 +-
 .../modules/mailbox/CassandraMailboxModule.java    |  3 ++
 .../james/modules/mailbox/JPAMailboxModule.java    |  3 ++
 .../james/modules/mailbox/MemoryMailboxModule.java |  3 ++
 .../methods/integration/SetMessagesMethodTest.java |  6 +--
 .../james/jmap/draft/methods/BlobManagerImpl.java  | 10 ++--
 .../org/apache/james/jmap/draft/model/BlobId.java  |  4 --
 .../jmap/draft/methods/BlobManagerImplTest.java    |  7 +--
 .../draft/methods/MIMEMessageConverterTest.java    | 34 ++++++-------
 .../message/view/MessageFastViewFactoryTest.java   |  3 +-
 .../message/view/MessageFullViewFactoryTest.java   |  8 +--
 .../message/view/MessageHeaderViewFactoryTest.java |  4 +-
 .../view/MessageMetadataViewFactoryTest.java       |  4 +-
 ...mputeMessageFastViewProjectionListenerTest.java |  4 +-
 .../apache/james/jmap/routes/DownloadRoutes.scala  |  8 +--
 41 files changed, 214 insertions(+), 179 deletions(-)

diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/AttachmentIdFactory.java b/mailbox/api/src/main/java/org/apache/james/mailbox/AttachmentIdFactory.java
new file mode 100644
index 0000000000..97749e4663
--- /dev/null
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/AttachmentIdFactory.java
@@ -0,0 +1,28 @@
+/****************************************************************
+ * 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.mailbox;
+
+import org.apache.james.mailbox.model.AttachmentId;
+
+public interface AttachmentIdFactory {
+    AttachmentId random();
+
+    AttachmentId from(String id);
+}
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/StringBackedAttachmentIdFactory.java b/mailbox/api/src/main/java/org/apache/james/mailbox/StringBackedAttachmentIdFactory.java
new file mode 100644
index 0000000000..e7cff8ad48
--- /dev/null
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/StringBackedAttachmentIdFactory.java
@@ -0,0 +1,34 @@
+/****************************************************************
+ * 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.mailbox;
+
+import org.apache.james.mailbox.model.StringBackedAttachmentId;
+
+public class StringBackedAttachmentIdFactory implements AttachmentIdFactory {
+    @Override
+    public StringBackedAttachmentId random() {
+        return StringBackedAttachmentId.random();
+    }
+
+    @Override
+    public StringBackedAttachmentId from(String id) {
+        return StringBackedAttachmentId.from(id);
+    }
+}
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/AttachmentId.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/AttachmentId.java
index e7950a3120..4cf32d93d4 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/AttachmentId.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/AttachmentId.java
@@ -16,64 +16,13 @@
  * specific language governing permissions and limitations      *
  * under the License.                                           *
  ****************************************************************/
+
 package org.apache.james.mailbox.model;
 
-import java.nio.charset.StandardCharsets;
 import java.util.UUID;
 
-import org.apache.commons.text.RandomStringGenerator;
-
-import com.google.common.base.MoreObjects;
-import com.google.common.base.Objects;
-import com.google.common.base.Preconditions;
-
-public class AttachmentId {
-
-    public static final RandomStringGenerator RANDOM_STRING_GENERATOR = new RandomStringGenerator.Builder().withinRange('a', 'z').build();
-
-    public static AttachmentId random() {
-        return new AttachmentId(RANDOM_STRING_GENERATOR.generate(20));
-    }
-
-    public static AttachmentId from(String id) {
-        Preconditions.checkNotNull(id);
-        Preconditions.checkArgument(!id.isEmpty());
-        return new AttachmentId(id);
-    }
-
-    private final String id;
-
-    private AttachmentId(String id) {
-        this.id = id;
-    }
-
-    public String getId() {
-        return id;
-    }
-
-    public UUID asUUID() {
-        return UUID.nameUUIDFromBytes(id.getBytes(StandardCharsets.UTF_8));
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (obj instanceof AttachmentId) {
-            AttachmentId other = (AttachmentId) obj;
-            return Objects.equal(id, other.id);
-        }
-        return false;
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hashCode(id);
-    }
+public interface AttachmentId {
+    String getId();
 
-    @Override
-    public String toString() {
-        return MoreObjects
-                .toStringHelper(this)
-                .add("id", id)
-                .toString();
-    }
+    UUID asUUID();
 }
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/AttachmentId.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/StringBackedAttachmentId.java
similarity index 81%
copy from mailbox/api/src/main/java/org/apache/james/mailbox/model/AttachmentId.java
copy to mailbox/api/src/main/java/org/apache/james/mailbox/model/StringBackedAttachmentId.java
index e7950a3120..1b204253ff 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/AttachmentId.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/StringBackedAttachmentId.java
@@ -27,38 +27,40 @@ import com.google.common.base.MoreObjects;
 import com.google.common.base.Objects;
 import com.google.common.base.Preconditions;
 
-public class AttachmentId {
+public class StringBackedAttachmentId implements AttachmentId {
 
     public static final RandomStringGenerator RANDOM_STRING_GENERATOR = new RandomStringGenerator.Builder().withinRange('a', 'z').build();
 
-    public static AttachmentId random() {
-        return new AttachmentId(RANDOM_STRING_GENERATOR.generate(20));
+    public static StringBackedAttachmentId random() {
+        return new StringBackedAttachmentId(RANDOM_STRING_GENERATOR.generate(20));
     }
 
-    public static AttachmentId from(String id) {
+    public static StringBackedAttachmentId from(String id) {
         Preconditions.checkNotNull(id);
         Preconditions.checkArgument(!id.isEmpty());
-        return new AttachmentId(id);
+        return new StringBackedAttachmentId(id);
     }
 
     private final String id;
 
-    private AttachmentId(String id) {
+    protected StringBackedAttachmentId(String id) {
         this.id = id;
     }
 
+    @Override
     public String getId() {
         return id;
     }
 
+    @Override
     public UUID asUUID() {
         return UUID.nameUUIDFromBytes(id.getBytes(StandardCharsets.UTF_8));
     }
 
     @Override
     public boolean equals(Object obj) {
-        if (obj instanceof AttachmentId) {
-            AttachmentId other = (AttachmentId) obj;
+        if (obj instanceof StringBackedAttachmentId) {
+            StringBackedAttachmentId other = (StringBackedAttachmentId) obj;
             return Objects.equal(id, other.id);
         }
         return false;
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/model/AttachmentMetadataTest.java b/mailbox/api/src/test/java/org/apache/james/mailbox/model/AttachmentMetadataTest.java
index f75bc1bdb2..67911aced6 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/model/AttachmentMetadataTest.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/model/AttachmentMetadataTest.java
@@ -56,7 +56,7 @@ class AttachmentMetadataTest {
     @Test
     void buildShouldThrowWhenSizeIsNotProvided() {
         assertThatThrownBy(() -> AttachmentMetadata.builder()
-                .attachmentId(AttachmentId.random())
+                .attachmentId(StringBackedAttachmentId.random())
                 .type("TYPE")
                 .build())
             .isInstanceOf(IllegalStateException.class);
@@ -65,7 +65,7 @@ class AttachmentMetadataTest {
     @Test
     void buildShouldThrowWhenTypeIsNotProvided() {
         assertThatThrownBy(() -> AttachmentMetadata.builder()
-                .attachmentId(AttachmentId.random())
+                .attachmentId(StringBackedAttachmentId.random())
                 .size(36)
                 .build())
             .isInstanceOf(IllegalStateException.class);
@@ -74,7 +74,7 @@ class AttachmentMetadataTest {
     @Test
     void sizeShouldThrowOnNegativeValue() {
         assertThatThrownBy(() -> AttachmentMetadata.builder()
-                .attachmentId(AttachmentId.random())
+                .attachmentId(StringBackedAttachmentId.random())
                 .size(-3))
             .isInstanceOf(IllegalArgumentException.class);
     }
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/model/MessageAttachmentMetadataTest.java b/mailbox/api/src/test/java/org/apache/james/mailbox/model/MessageAttachmentMetadataTest.java
index a6790b5756..a01490b1ab 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/model/MessageAttachmentMetadataTest.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/model/MessageAttachmentMetadataTest.java
@@ -45,7 +45,7 @@ class MessageAttachmentMetadataTest {
     @Test
     void buildShouldWorkWhenMandatoryAttributesAreGiven() {
         AttachmentMetadata attachment = AttachmentMetadata.builder()
-            .attachmentId(AttachmentId.from("1"))
+            .attachmentId(StringBackedAttachmentId.from("1"))
             .size(36)
             .type("type")
             .messageId(TestMessageId.of(23))
@@ -62,7 +62,7 @@ class MessageAttachmentMetadataTest {
     @Test
     void buildShouldAcceptIsInlineAndNoCid() {
         AttachmentMetadata attachment = AttachmentMetadata.builder()
-            .attachmentId(AttachmentId.from("1"))
+            .attachmentId(StringBackedAttachmentId.from("1"))
             .size(36)
             .type("type")
             .messageId(TestMessageId.of(23))
@@ -79,7 +79,7 @@ class MessageAttachmentMetadataTest {
     @Test
     void buildShouldSetAttributesWhenAllAreGiven() {
         AttachmentMetadata attachment = AttachmentMetadata.builder()
-            .attachmentId(AttachmentId.from("1"))
+            .attachmentId(StringBackedAttachmentId.from("1"))
             .size(36)
             .type("type")
             .messageId(TestMessageId.of(23))
@@ -99,7 +99,7 @@ class MessageAttachmentMetadataTest {
     @Test
     void isInlinedWithCidShouldReturnTrueWhenIsInlineAndHasCid() throws Exception {
         AttachmentMetadata attachment = AttachmentMetadata.builder()
-            .attachmentId(AttachmentId.from("1"))
+            .attachmentId(StringBackedAttachmentId.from("1"))
             .size(36)
             .type("type")
             .messageId(TestMessageId.of(23))
@@ -118,7 +118,7 @@ class MessageAttachmentMetadataTest {
     @Test
     void isInlinedWithCidShouldReturnFalseWhenIsNotInline() throws Exception {
         AttachmentMetadata attachment = AttachmentMetadata.builder()
-            .attachmentId(AttachmentId.from("1"))
+            .attachmentId(StringBackedAttachmentId.from("1"))
             .size(36)
             .type("type")
             .messageId(TestMessageId.of(23))
@@ -137,7 +137,7 @@ class MessageAttachmentMetadataTest {
     @Test
     void isInlinedWithCidShouldReturnFalseWhenIsInlineButNoCid() throws Exception {
         AttachmentMetadata attachment = AttachmentMetadata.builder()
-            .attachmentId(AttachmentId.from("1"))
+            .attachmentId(StringBackedAttachmentId.from("1"))
             .size(36)
             .type("type")
             .messageId(TestMessageId.of(23))
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/model/AttachmentIdTest.java b/mailbox/api/src/test/java/org/apache/james/mailbox/model/StringBackedAttachmentIdTest.java
similarity index 77%
rename from mailbox/api/src/test/java/org/apache/james/mailbox/model/AttachmentIdTest.java
rename to mailbox/api/src/test/java/org/apache/james/mailbox/model/StringBackedAttachmentIdTest.java
index 2388447b2c..7b007613c5 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/model/AttachmentIdTest.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/model/StringBackedAttachmentIdTest.java
@@ -26,35 +26,35 @@ import java.util.UUID;
 
 import org.junit.jupiter.api.Test;
 
-class AttachmentIdTest {
+class StringBackedAttachmentIdTest {
     @Test
     void randomShouldGenerateDifferentIds() {
-        AttachmentId attachmentId = AttachmentId.random();
-        AttachmentId attachmentId2 = AttachmentId.random();
+        StringBackedAttachmentId attachmentId = StringBackedAttachmentId.random();
+        StringBackedAttachmentId attachmentId2 = StringBackedAttachmentId.random();
         assertThat(attachmentId.getId()).isNotEqualTo(attachmentId2.getId());
     }
 
     @Test
     void fromShouldThrowWhenIdIsNull() {
         String value = null;
-        assertThatThrownBy(() -> AttachmentId.from(value)).isInstanceOf(NullPointerException.class);
+        assertThatThrownBy(() -> StringBackedAttachmentId.from(value)).isInstanceOf(NullPointerException.class);
     }
 
     @Test
     void fromShouldThrowWhenIdIsEmpty() {
-        assertThatThrownBy(() -> AttachmentId.from("")).isInstanceOf(IllegalArgumentException.class);
+        assertThatThrownBy(() -> StringBackedAttachmentId.from("")).isInstanceOf(IllegalArgumentException.class);
     }
 
     @Test
     void fromStringShouldWork() {
         String expectedId = "f07e5a815613c5abeddc4b682247a4c42d8a95df";
-        AttachmentId attachmentId = AttachmentId.from(expectedId);
+        StringBackedAttachmentId attachmentId = StringBackedAttachmentId.from(expectedId);
         assertThat(attachmentId.getId()).isEqualTo(expectedId);
     }
 
     @Test
     void asUUIDShouldReturnAValidUUID() {
-        AttachmentId attachmentId = AttachmentId.from("magic");
+        StringBackedAttachmentId attachmentId = StringBackedAttachmentId.from("magic");
 
         assertThat(attachmentId.asUUID())
             .isEqualTo(UUID.fromString("2f3a4fcc-ca64-36e3-9bcf-33e92dd93135"));
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxSessionMapperFactory.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxSessionMapperFactory.java
index 585b640825..f2c3b7b85b 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxSessionMapperFactory.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxSessionMapperFactory.java
@@ -26,6 +26,7 @@ import javax.inject.Inject;
 import org.apache.james.backends.cassandra.init.configuration.CassandraConfiguration;
 import org.apache.james.blob.api.BlobStore;
 import org.apache.james.mailbox.MailboxSession;
+import org.apache.james.mailbox.StringBackedAttachmentIdFactory;
 import org.apache.james.mailbox.cassandra.mail.ACLMapper;
 import org.apache.james.mailbox.cassandra.mail.CassandraAnnotationMapper;
 import org.apache.james.mailbox.cassandra.mail.CassandraApplicableFlagDAO;
@@ -131,7 +132,7 @@ public class CassandraMailboxSessionMapperFactory extends MailboxSessionMapperFa
             deletedMessageDAO);
         this.cassandraMailboxMapper = new CassandraMailboxMapper(mailboxDAO, mailboxPathV3DAO, userMailboxRightsDAO, aclMapper, cassandraConfiguration);
         this.cassandraSubscriptionMapper = new CassandraSubscriptionMapper(session);
-        this.cassandraAttachmentMapper = new CassandraAttachmentMapper(attachmentDAOV2, blobStore);
+        this.cassandraAttachmentMapper = new CassandraAttachmentMapper(attachmentDAOV2, blobStore, new StringBackedAttachmentIdFactory());
         this.cassandraMessageMapper = new CassandraMessageMapper(
             uidProvider,
             modSeqProvider,
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentDAOV2.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentDAOV2.java
index c5e926e4a5..7adaa752db 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentDAOV2.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentDAOV2.java
@@ -44,6 +44,7 @@ import org.apache.james.mailbox.model.AttachmentId;
 import org.apache.james.mailbox.model.AttachmentMetadata;
 import org.apache.james.mailbox.model.ContentType;
 import org.apache.james.mailbox.model.MessageId;
+import org.apache.james.mailbox.model.StringBackedAttachmentId;
 
 import com.datastax.oss.driver.api.core.CqlSession;
 import com.datastax.oss.driver.api.core.cql.PreparedStatement;
@@ -132,7 +133,7 @@ public class CassandraAttachmentDAOV2 {
 
         return new DAOAttachment(
             messageId,
-            AttachmentId.from(row.getString(ID)),
+            StringBackedAttachmentId.from(row.getString(ID)),
             blobIfFactory.from(row.getString(BLOB_ID)),
             ContentType.of(row.getString(TYPE)),
             row.getLong(SIZE));
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentMapper.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentMapper.java
index c78947bf02..4e7c99d5f1 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentMapper.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentMapper.java
@@ -31,6 +31,7 @@ import java.util.List;
 import javax.inject.Inject;
 
 import org.apache.james.blob.api.BlobStore;
+import org.apache.james.mailbox.AttachmentIdFactory;
 import org.apache.james.mailbox.cassandra.mail.CassandraAttachmentDAOV2.DAOAttachment;
 import org.apache.james.mailbox.exception.AttachmentNotFoundException;
 import org.apache.james.mailbox.model.AttachmentId;
@@ -55,11 +56,13 @@ public class CassandraAttachmentMapper implements AttachmentMapper {
 
     private final CassandraAttachmentDAOV2 attachmentDAOV2;
     private final BlobStore blobStore;
+    private final AttachmentIdFactory attachmentIdFactory;
 
     @Inject
-    public CassandraAttachmentMapper(CassandraAttachmentDAOV2 attachmentDAOV2, BlobStore blobStore) {
+    public CassandraAttachmentMapper(CassandraAttachmentDAOV2 attachmentDAOV2, BlobStore blobStore, AttachmentIdFactory attachmentIdFactory) {
         this.attachmentDAOV2 = attachmentDAOV2;
         this.blobStore = blobStore;
+        this.attachmentIdFactory = attachmentIdFactory;
     }
 
     @Override
@@ -127,7 +130,7 @@ public class CassandraAttachmentMapper implements AttachmentMapper {
 
     private Mono<MessageAttachmentMetadata> storeAttachmentAsync(ParsedAttachment parsedAttachment, MessageId ownerMessageId) {
         try {
-            AttachmentId attachmentId = AttachmentId.random();
+            AttachmentId attachmentId = attachmentIdFactory.random();
             ByteSource content = parsedAttachment.getContent();
             long size = content.size();
             return Mono.from(blobStore.save(blobStore.getDefaultBucketName(), content, LOW_COST))
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOV3.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOV3.java
index fe45b058e8..91f38b9fc7 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOV3.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOV3.java
@@ -70,13 +70,13 @@ import org.apache.james.blob.api.BlobId;
 import org.apache.james.blob.api.BlobStore;
 import org.apache.james.mailbox.cassandra.ids.CassandraMessageId;
 import org.apache.james.mailbox.cassandra.table.CassandraMessageV3Table.Attachments;
-import org.apache.james.mailbox.model.AttachmentId;
 import org.apache.james.mailbox.model.ByteContent;
 import org.apache.james.mailbox.model.Cid;
 import org.apache.james.mailbox.model.ComposedMessageIdWithMetaData;
 import org.apache.james.mailbox.model.Content;
 import org.apache.james.mailbox.model.HeaderAndBodyByteContent;
 import org.apache.james.mailbox.model.MessageAttachmentMetadata;
+import org.apache.james.mailbox.model.StringBackedAttachmentId;
 import org.apache.james.mailbox.store.mail.MessageMapper.FetchType;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 import org.apache.james.mailbox.store.mail.model.impl.Properties;
@@ -380,7 +380,7 @@ public class CassandraMessageDAOV3 {
 
     private MessageAttachmentRepresentation messageAttachmentByIdFrom(UdtValue udtValue) {
         return MessageAttachmentRepresentation.builder()
-            .attachmentId(AttachmentId.from(udtValue.get(Attachments.ID, TypeCodecs.TEXT)))
+            .attachmentId(StringBackedAttachmentId.from(udtValue.get(Attachments.ID, TypeCodecs.TEXT)))
             .name(udtValue.get(Attachments.NAME, TypeCodecs.TEXT))
             .cid(cidParser.parse(udtValue.get(Attachments.CID, TypeCodecs.TEXT)))
             .isInline(udtValue.getBoolean(Attachments.IS_INLINE))
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/MessageAttachmentRepresentation.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/MessageAttachmentRepresentation.java
index 838ac5609b..b06703d40d 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/MessageAttachmentRepresentation.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/MessageAttachmentRepresentation.java
@@ -21,8 +21,8 @@ package org.apache.james.mailbox.cassandra.mail;
 
 import java.util.Optional;
 
-import org.apache.james.mailbox.model.AttachmentId;
 import org.apache.james.mailbox.model.Cid;
+import org.apache.james.mailbox.model.StringBackedAttachmentId;
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.MoreObjects;
@@ -37,7 +37,7 @@ public class MessageAttachmentRepresentation {
 
     public static class Builder {
 
-        private AttachmentId attachmentId;
+        private StringBackedAttachmentId attachmentId;
         private Optional<String> name;
         private Optional<Cid> cid;
         private Optional<Boolean> isInline;
@@ -48,7 +48,7 @@ public class MessageAttachmentRepresentation {
             isInline = Optional.empty();
         }
 
-        public Builder attachmentId(AttachmentId attachmentId) {
+        public Builder attachmentId(StringBackedAttachmentId attachmentId) {
             Preconditions.checkArgument(attachmentId != null);
             this.attachmentId = attachmentId;
             return this;
@@ -83,20 +83,20 @@ public class MessageAttachmentRepresentation {
         }
     }
 
-    private final AttachmentId attachmentId;
+    private final StringBackedAttachmentId attachmentId;
     private final Optional<String> name;
     private final Optional<Cid> cid;
     private final boolean isInline;
 
     @VisibleForTesting
-    MessageAttachmentRepresentation(AttachmentId attachmentId, Optional<String> name, Optional<Cid> cid, boolean isInline) {
+    MessageAttachmentRepresentation(StringBackedAttachmentId attachmentId, Optional<String> name, Optional<Cid> cid, boolean isInline) {
         this.attachmentId = attachmentId;
         this.name = name;
         this.cid = cid;
         this.isInline = isInline;
     }
 
-    public AttachmentId getAttachmentId() {
+    public StringBackedAttachmentId getAttachmentId() {
         return attachmentId;
     }
 
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerTest.java
index a9279c4489..81d18b7ad9 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerTest.java
@@ -33,8 +33,6 @@ import java.util.Optional;
 import java.util.Set;
 import java.util.stream.IntStream;
 
-import jakarta.mail.Flags;
-
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
@@ -103,6 +101,7 @@ import org.junit.jupiter.api.extension.RegisterExtension;
 import com.github.fge.lambdas.Throwing;
 import com.google.common.collect.ImmutableList;
 
+import jakarta.mail.Flags;
 import reactor.core.publisher.Flux;
 import reactor.core.publisher.Mono;
 
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/AttachmentLoaderTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/AttachmentLoaderTest.java
index b122a0df85..7d15c11ac8 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/AttachmentLoaderTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/AttachmentLoaderTest.java
@@ -26,10 +26,10 @@ import java.util.Collection;
 import java.util.Optional;
 
 import org.apache.james.mailbox.cassandra.ids.CassandraMessageId;
-import org.apache.james.mailbox.model.AttachmentId;
 import org.apache.james.mailbox.model.AttachmentMetadata;
 import org.apache.james.mailbox.model.Cid;
 import org.apache.james.mailbox.model.MessageAttachmentMetadata;
+import org.apache.james.mailbox.model.StringBackedAttachmentId;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
@@ -51,7 +51,7 @@ class AttachmentLoaderTest {
 
     @Test
     void getAttachmentsShouldWorkWithDuplicatedAttachments() {
-        AttachmentId attachmentId = AttachmentId.from("1");
+        StringBackedAttachmentId attachmentId = StringBackedAttachmentId.from("1");
 
         AttachmentMetadata attachment = AttachmentMetadata.builder()
             .attachmentId(attachmentId)
@@ -78,7 +78,7 @@ class AttachmentLoaderTest {
 
     @Test
     void getAttachmentsShouldWorkWithDuplicatedIds() {
-        AttachmentId attachmentId = AttachmentId.from("1");
+        StringBackedAttachmentId attachmentId = StringBackedAttachmentId.from("1");
 
         AttachmentMetadata attachment = AttachmentMetadata.builder()
             .attachmentId(attachmentId)
@@ -107,8 +107,8 @@ class AttachmentLoaderTest {
 
     @Test
     void getAttachmentsShouldReturnMultipleAttachmentWhenSeveralAttachmentsRepresentation() {
-        AttachmentId attachmentId1 = AttachmentId.from("1");
-        AttachmentId attachmentId2 = AttachmentId.from("2");
+        StringBackedAttachmentId attachmentId1 = StringBackedAttachmentId.from("1");
+        StringBackedAttachmentId attachmentId2 = StringBackedAttachmentId.from("2");
 
         AttachmentMetadata attachment1 = AttachmentMetadata.builder()
             .attachmentId(attachmentId1)
@@ -145,7 +145,7 @@ class AttachmentLoaderTest {
 
     @Test
     void getAttachmentsShouldReturnEmptyByDefault() {
-        AttachmentId attachmentId = AttachmentId.from("1");
+        StringBackedAttachmentId attachmentId = StringBackedAttachmentId.from("1");
 
         AttachmentMetadata attachment = AttachmentMetadata.builder()
             .attachmentId(attachmentId)
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 4833582bb0..f5e9d6cb8f 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
@@ -31,19 +31,17 @@ import org.apache.james.blob.api.HashBlobId;
 import org.apache.james.mailbox.cassandra.ids.CassandraMessageId;
 import org.apache.james.mailbox.cassandra.mail.CassandraAttachmentDAOV2.DAOAttachment;
 import org.apache.james.mailbox.cassandra.modules.CassandraAttachmentModule;
-import org.apache.james.mailbox.model.AttachmentId;
 import org.apache.james.mailbox.model.AttachmentMetadata;
+import org.apache.james.mailbox.model.StringBackedAttachmentId;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
 import com.datastax.oss.driver.api.core.uuid.Uuids;
 
-import reactor.core.publisher.Mono;
-
 class CassandraAttachmentDAOV2Test {
-    private static final AttachmentId ATTACHMENT_ID = AttachmentId.from("id1");
-    private static final AttachmentId ATTACHMENT_ID_2 = AttachmentId.from("id2");
+    private static final StringBackedAttachmentId ATTACHMENT_ID = StringBackedAttachmentId.from("id1");
+    private static final StringBackedAttachmentId ATTACHMENT_ID_2 = StringBackedAttachmentId.from("id2");
     private static final HashBlobId.Factory BLOB_ID_FACTORY = new HashBlobId.Factory();
 
     @RegisterExtension
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/MessageAttachmentRepresentationByIdTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/MessageAttachmentRepresentationByIdTest.java
index 254fc84ad4..d2c7a35c0f 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/MessageAttachmentRepresentationByIdTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/MessageAttachmentRepresentationByIdTest.java
@@ -24,9 +24,9 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
 import java.util.Optional;
 
-import org.apache.james.mailbox.model.AttachmentId;
 import org.apache.james.mailbox.model.Cid;
 import org.apache.james.mailbox.model.MessageAttachmentMetadata;
+import org.apache.james.mailbox.model.StringBackedAttachmentId;
 import org.junit.jupiter.api.Test;
 
 
@@ -46,7 +46,7 @@ class MessageAttachmentRepresentationByIdTest {
 
     @Test
     void buildShouldWorkWhenMandatoryAttributesAreGiven() {
-        AttachmentId attachmentId = AttachmentId.from("1");
+        StringBackedAttachmentId attachmentId = StringBackedAttachmentId.from("1");
         MessageAttachmentRepresentation expectedMessageAttachmentRepresentation = new MessageAttachmentRepresentation(attachmentId, Optional.empty(), Optional.empty(), false);
 
         MessageAttachmentRepresentation messageAttachmentRepresentation = MessageAttachmentRepresentation.builder()
@@ -58,7 +58,7 @@ class MessageAttachmentRepresentationByIdTest {
 
     @Test
     void buildShouldSetIsInlineDefaultValueWhenNotGiven() {
-        AttachmentId attachmentId = AttachmentId.from("1");
+        StringBackedAttachmentId attachmentId = StringBackedAttachmentId.from("1");
 
         MessageAttachmentRepresentation messageAttachmentRepresentation = MessageAttachmentRepresentation.builder()
             .attachmentId(attachmentId)
@@ -69,7 +69,7 @@ class MessageAttachmentRepresentationByIdTest {
 
     @Test
     void buildShouldAcceptInlineAndWithoutCid() {
-        AttachmentId attachmentId = AttachmentId.from("1");
+        StringBackedAttachmentId attachmentId = StringBackedAttachmentId.from("1");
         MessageAttachmentRepresentation expectedMessageAttachmentRepresentation = new MessageAttachmentRepresentation(attachmentId, Optional.empty(), Optional.empty(), true);
 
         MessageAttachmentRepresentation messageAttachmentRepresentation = MessageAttachmentRepresentation.builder()
@@ -82,7 +82,7 @@ class MessageAttachmentRepresentationByIdTest {
 
     @Test
     void buildShouldSetAttributesWhenAllAreGiven() {
-        AttachmentId attachmentId = AttachmentId.from("1");
+        StringBackedAttachmentId attachmentId = StringBackedAttachmentId.from("1");
         MessageAttachmentRepresentation expectedMessageAttachmentRepresentation = new MessageAttachmentRepresentation(attachmentId, Optional.of("name"), Optional.of(Cid.from("cid")), true);
 
         MessageAttachmentRepresentation messageAttachmentRepresentation = MessageAttachmentRepresentation.builder()
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 4d4a09b192..b26d0ebdf0 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
@@ -37,6 +37,8 @@ import org.apache.james.eventsourcing.eventstore.dto.EventDTO;
 import org.apache.james.eventsourcing.eventstore.dto.EventDTOModule;
 import org.apache.james.json.DTO;
 import org.apache.james.json.DTOModule;
+import org.apache.james.mailbox.AttachmentIdFactory;
+import org.apache.james.mailbox.StringBackedAttachmentIdFactory;
 import org.apache.james.mailbox.cassandra.ids.CassandraMessageId;
 import org.apache.james.mailbox.cassandra.mail.ACLMapper;
 import org.apache.james.mailbox.cassandra.mail.CassandraACLMapper;
@@ -96,6 +98,7 @@ public class GuiceUtils {
             binder -> binder.bind(EventStore.class).to(CassandraEventStore.class),
             binder -> binder.bind(CassandraTypesProvider.class).toInstance(typesProvider),
             binder -> binder.bind(CassandraConfiguration.class).toInstance(configuration),
-            binder -> binder.bind(Clock.class).toInstance(Clock.systemUTC()));
+            binder -> binder.bind(Clock.class).toInstance(Clock.systemUTC()),
+            binder -> binder.bind(AttachmentIdFactory.class).to(StringBackedAttachmentIdFactory.class));
     }
 }
diff --git a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAAttachmentMapper.java b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAAttachmentMapper.java
index a2bff6a77e..41d4f84e4b 100644
--- a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAAttachmentMapper.java
+++ b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAAttachmentMapper.java
@@ -37,6 +37,7 @@ import org.apache.james.mailbox.model.AttachmentMetadata;
 import org.apache.james.mailbox.model.MessageAttachmentMetadata;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.model.ParsedAttachment;
+import org.apache.james.mailbox.model.StringBackedAttachmentId;
 import org.apache.james.mailbox.store.mail.AttachmentMapper;
 
 import com.github.fge.lambdas.Throwing;
@@ -108,9 +109,9 @@ public class JPAAttachmentMapper extends JPATransactionalMapper implements Attac
         try {
             try (InputStream stream = parsedAttachment.getContent().openStream()) {
                 byte[] bytes = IOUtils.toByteArray(stream);
-                JPAAttachment persistedAttachment = new JPAAttachment(parsedAttachment.asMessageAttachment(AttachmentId.random(), ownerMessageId), bytes);
+                JPAAttachment persistedAttachment = new JPAAttachment(parsedAttachment.asMessageAttachment(StringBackedAttachmentId.random(), ownerMessageId), bytes);
                 getEntityManager().persist(persistedAttachment);
-                AttachmentId attachmentId = AttachmentId.from(persistedAttachment.getAttachmentId());
+                AttachmentId attachmentId = StringBackedAttachmentId.from(persistedAttachment.getAttachmentId());
                 return parsedAttachment.asMessageAttachment(attachmentId, bytes.length, ownerMessageId);
             }
         } catch (IOException e) {
diff --git a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/JPAAttachment.java b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/JPAAttachment.java
index 60e3e9ad4b..272f386bac 100644
--- a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/JPAAttachment.java
+++ b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/JPAAttachment.java
@@ -35,10 +35,10 @@ import javax.persistence.Lob;
 import javax.persistence.NamedQuery;
 import javax.persistence.Table;
 
-import org.apache.james.mailbox.model.AttachmentId;
 import org.apache.james.mailbox.model.AttachmentMetadata;
 import org.apache.james.mailbox.model.Cid;
 import org.apache.james.mailbox.model.MessageAttachmentMetadata;
+import org.apache.james.mailbox.model.StringBackedAttachmentId;
 import org.apache.james.mailbox.store.mail.model.DefaultMessageId;
 
 @Entity(name = "Attachment")
@@ -102,7 +102,7 @@ public class JPAAttachment {
 
     public AttachmentMetadata toAttachmentMetadata() {
         return AttachmentMetadata.builder()
-            .attachmentId(AttachmentId.from(attachmentId))
+            .attachmentId(StringBackedAttachmentId.from(attachmentId))
             .messageId(new DefaultMessageId())
             .type(type)
             .size(size)
diff --git a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/AbstractJPAMailboxMessage.java b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/AbstractJPAMailboxMessage.java
index fac5ffc4b3..933ad1c998 100644
--- a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/AbstractJPAMailboxMessage.java
+++ b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/AbstractJPAMailboxMessage.java
@@ -50,12 +50,12 @@ import org.apache.james.mailbox.jpa.JPAId;
 import org.apache.james.mailbox.jpa.mail.model.JPAMailbox;
 import org.apache.james.mailbox.jpa.mail.model.JPAProperty;
 import org.apache.james.mailbox.jpa.mail.model.JPAUserFlag;
-import org.apache.james.mailbox.model.AttachmentId;
 import org.apache.james.mailbox.model.ComposedMessageId;
 import org.apache.james.mailbox.model.ComposedMessageIdWithMetaData;
 import org.apache.james.mailbox.model.MessageAttachmentMetadata;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.model.ParsedAttachment;
+import org.apache.james.mailbox.model.StringBackedAttachmentId;
 import org.apache.james.mailbox.model.ThreadId;
 import org.apache.james.mailbox.store.mail.model.DefaultMessageId;
 import org.apache.james.mailbox.store.mail.model.DelegatingMailboxMessage;
@@ -574,7 +574,7 @@ public abstract class AbstractJPAMailboxMessage implements MailboxMessage {
         }
     }
 
-    private AttachmentId generateFixedAttachmentId(int position) {
-        return AttachmentId.from(getMailboxId().serialize() + "-" + getUid().asLong() + "-" + position);
+    private StringBackedAttachmentId generateFixedAttachmentId(int position) {
+        return StringBackedAttachmentId.from(getMailboxId().serialize() + "-" + getUid().asLong() + "-" + position);
     }
 }
diff --git a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryAttachmentMapper.java b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryAttachmentMapper.java
index a8e77f000c..433b5324dd 100644
--- a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryAttachmentMapper.java
+++ b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryAttachmentMapper.java
@@ -34,6 +34,7 @@ import org.apache.james.mailbox.model.AttachmentMetadata;
 import org.apache.james.mailbox.model.MessageAttachmentMetadata;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.model.ParsedAttachment;
+import org.apache.james.mailbox.model.StringBackedAttachmentId;
 import org.apache.james.mailbox.store.mail.AttachmentMapper;
 
 import com.github.fge.lambdas.Throwing;
@@ -88,7 +89,7 @@ public class InMemoryAttachmentMapper implements AttachmentMapper {
     }
 
     private MessageAttachmentMetadata storeAttachmentForMessage(MessageId ownerMessageId, ParsedAttachment parsedAttachment) throws MailboxException {
-        AttachmentId attachmentId = AttachmentId.random();
+        AttachmentId attachmentId = StringBackedAttachmentId.random();
         try {
             try (InputStream stream = parsedAttachment.getContent().openStream()) {
                 byte[] bytes = IOUtils.toByteArray(stream);
diff --git a/mailbox/opensearch/src/test/java/org/apache/james/mailbox/opensearch/events/OpenSearchListeningMessageSearchIndexTest.java b/mailbox/opensearch/src/test/java/org/apache/james/mailbox/opensearch/events/OpenSearchListeningMessageSearchIndexTest.java
index 0bdd95383b..497fc158d6 100644
--- a/mailbox/opensearch/src/test/java/org/apache/james/mailbox/opensearch/events/OpenSearchListeningMessageSearchIndexTest.java
+++ b/mailbox/opensearch/src/test/java/org/apache/james/mailbox/opensearch/events/OpenSearchListeningMessageSearchIndexTest.java
@@ -55,7 +55,6 @@ import org.apache.james.mailbox.extractor.TextExtractor;
 import org.apache.james.mailbox.inmemory.InMemoryMailboxSessionMapperFactory;
 import org.apache.james.mailbox.inmemory.InMemoryMessageId;
 import org.apache.james.mailbox.manager.ManagerTestProvisionner;
-import org.apache.james.mailbox.model.AttachmentId;
 import org.apache.james.mailbox.model.AttachmentMetadata;
 import org.apache.james.mailbox.model.ByteContent;
 import org.apache.james.mailbox.model.ContentType;
@@ -65,6 +64,7 @@ import org.apache.james.mailbox.model.MessageAttachmentMetadata;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.model.MessageMetaData;
 import org.apache.james.mailbox.model.SearchQuery;
+import org.apache.james.mailbox.model.StringBackedAttachmentId;
 import org.apache.james.mailbox.model.TestId;
 import org.apache.james.mailbox.model.TestMessageId;
 import org.apache.james.mailbox.model.ThreadId;
@@ -153,7 +153,7 @@ class OpenSearchListeningMessageSearchIndexTest {
     static final MessageAttachmentMetadata MESSAGE_ATTACHMENT = MessageAttachmentMetadata.builder()
         .attachment(AttachmentMetadata.builder()
             .messageId(MESSAGE_ID_3)
-            .attachmentId(AttachmentId.from("1"))
+            .attachmentId(StringBackedAttachmentId.from("1"))
             .type("type")
             .size(523)
             .build())
diff --git a/mailbox/opensearch/src/test/java/org/apache/james/mailbox/opensearch/json/IndexableMessageTest.java b/mailbox/opensearch/src/test/java/org/apache/james/mailbox/opensearch/json/IndexableMessageTest.java
index 08e6258aff..a04f181073 100644
--- a/mailbox/opensearch/src/test/java/org/apache/james/mailbox/opensearch/json/IndexableMessageTest.java
+++ b/mailbox/opensearch/src/test/java/org/apache/james/mailbox/opensearch/json/IndexableMessageTest.java
@@ -37,10 +37,10 @@ import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.extractor.ParsedContent;
 import org.apache.james.mailbox.extractor.TextExtractor;
 import org.apache.james.mailbox.inmemory.InMemoryMessageId;
-import org.apache.james.mailbox.model.AttachmentId;
 import org.apache.james.mailbox.model.AttachmentMetadata;
 import org.apache.james.mailbox.model.MessageAttachmentMetadata;
 import org.apache.james.mailbox.model.MessageId;
+import org.apache.james.mailbox.model.StringBackedAttachmentId;
 import org.apache.james.mailbox.model.TestId;
 import org.apache.james.mailbox.model.ThreadId;
 import org.apache.james.mailbox.opensearch.IndexAttachments;
@@ -57,7 +57,6 @@ import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
 import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
 
 import reactor.core.publisher.Mono;
 
@@ -100,7 +99,7 @@ class IndexableMessageTest {
             .thenReturn(ImmutableList.of(MessageAttachmentMetadata.builder()
                 .attachment(AttachmentMetadata.builder()
                     .messageId(messageId)
-                    .attachmentId(AttachmentId.from("1"))
+                    .attachmentId(StringBackedAttachmentId.from("1"))
                     .type("text/plain")
                     .size(36)
                     .build())
diff --git a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageConverterTest.java b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageConverterTest.java
index 3274de962f..41af292c2e 100644
--- a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageConverterTest.java
+++ b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageConverterTest.java
@@ -41,10 +41,10 @@ import java.util.List;
 
 import org.apache.james.core.MaybeSender;
 import org.apache.james.core.Username;
-import org.apache.james.mailbox.model.AttachmentId;
 import org.apache.james.mailbox.model.AttachmentMetadata;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MessageAttachmentMetadata;
+import org.apache.james.mailbox.model.StringBackedAttachmentId;
 import org.apache.james.mailbox.store.MessageBuilder;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 import org.apache.james.mailbox.store.mail.model.impl.SimpleMailboxMessage;
@@ -73,7 +73,7 @@ class DeletedMessageConverterTest {
     private static final Collection<MessageAttachmentMetadata> NO_ATTACHMENT = ImmutableList.of();
     private static final Collection<MessageAttachmentMetadata> ATTACHMENTS = ImmutableList.of(MessageAttachmentMetadata.builder()
         .attachment(AttachmentMetadata.builder()
-            .attachmentId(AttachmentId.from("1"))
+            .attachmentId(StringBackedAttachmentId.from("1"))
             .messageId(DeletedMessageFixture.MESSAGE_ID)
             .type("type")
             .size(48)
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreAttachmentManagerTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreAttachmentManagerTest.java
index 8677f9cf34..45f14f5742 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreAttachmentManagerTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreAttachmentManagerTest.java
@@ -27,9 +27,9 @@ import static org.mockito.Mockito.when;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageIdManager;
 import org.apache.james.mailbox.exception.AttachmentNotFoundException;
-import org.apache.james.mailbox.model.AttachmentId;
 import org.apache.james.mailbox.model.AttachmentMetadata;
 import org.apache.james.mailbox.model.MessageId;
+import org.apache.james.mailbox.model.StringBackedAttachmentId;
 import org.apache.james.mailbox.model.TestMessageId;
 import org.apache.james.mailbox.store.mail.AttachmentMapper;
 import org.apache.james.mailbox.store.mail.AttachmentMapperFactory;
@@ -42,7 +42,7 @@ import com.google.common.collect.ImmutableSet;
 class StoreAttachmentManagerTest {
     static final TestMessageId MESSAGE_ID = TestMessageId.of(1L);
     static final ImmutableList<MessageId> MESSAGE_IDS = ImmutableList.of(MESSAGE_ID);
-    static final AttachmentId ATTACHMENT_ID = AttachmentId.from("1");
+    static final StringBackedAttachmentId ATTACHMENT_ID = StringBackedAttachmentId.from("1");
     static final AttachmentMetadata ATTACHMENT = AttachmentMetadata.builder()
         .attachmentId(ATTACHMENT_ID)
         .messageId(MESSAGE_ID)
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AttachmentMapperTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AttachmentMapperTest.java
index a866a2e516..4adafca733 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AttachmentMapperTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AttachmentMapperTest.java
@@ -19,31 +19,30 @@
 
 package org.apache.james.mailbox.store.mail.model;
 
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+
 import java.io.ByteArrayInputStream;
 import java.nio.charset.StandardCharsets;
 import java.util.List;
 
 import org.apache.james.core.Username;
 import org.apache.james.mailbox.exception.AttachmentNotFoundException;
-import org.apache.james.mailbox.model.AttachmentId;
 import org.apache.james.mailbox.model.AttachmentMetadata;
 import org.apache.james.mailbox.model.ContentType;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.model.ParsedAttachment;
+import org.apache.james.mailbox.model.StringBackedAttachmentId;
 import org.apache.james.mailbox.store.mail.AttachmentMapper;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.io.ByteSource;
-
 import org.assertj.core.api.SoftAssertions;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import com.google.common.collect.ImmutableList;
+import com.google.common.io.ByteSource;
 
 public abstract class AttachmentMapperTest {
-    private static final AttachmentId UNKNOWN_ATTACHMENT_ID = AttachmentId.from("unknown");
+    private static final StringBackedAttachmentId UNKNOWN_ATTACHMENT_ID = StringBackedAttachmentId.from("unknown");
     private static final Username OWNER = Username.of("owner");
     private static final Username ADDITIONAL_OWNER = Username.of("additionalOwner");
 
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMailboxMessageTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMailboxMessageTest.java
index d6518c14f0..eb57fbb69b 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMailboxMessageTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMailboxMessageTest.java
@@ -37,11 +37,11 @@ import org.apache.commons.io.output.ByteArrayOutputStream;
 import org.apache.james.mailbox.FlagsBuilder;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.ModSeq;
-import org.apache.james.mailbox.model.AttachmentId;
 import org.apache.james.mailbox.model.AttachmentMetadata;
 import org.apache.james.mailbox.model.ByteContent;
 import org.apache.james.mailbox.model.MessageAttachmentMetadata;
 import org.apache.james.mailbox.model.MessageId;
+import org.apache.james.mailbox.model.StringBackedAttachmentId;
 import org.apache.james.mailbox.model.TestId;
 import org.apache.james.mailbox.model.TestMessageId;
 import org.apache.james.mailbox.model.ThreadId;
@@ -190,7 +190,7 @@ class SimpleMailboxMessageTest {
         MessageUid uid = MessageUid.of(45);
         MessageAttachmentMetadata messageAttachment = MessageAttachmentMetadata.builder()
             .attachment(AttachmentMetadata.builder()
-                .attachmentId(AttachmentId.from("1"))
+                .attachmentId(StringBackedAttachmentId.from("1"))
                 .messageId(MESSAGE_ID)
                 .type("type")
                 .size(485)
diff --git a/server/container/guice/cassandra/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxModule.java b/server/container/guice/cassandra/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxModule.java
index ef018149f7..6a04edc670 100644
--- a/server/container/guice/cassandra/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxModule.java
+++ b/server/container/guice/cassandra/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxModule.java
@@ -52,6 +52,7 @@ import org.apache.james.jmap.cassandra.change.CassandraStateFactory;
 import org.apache.james.jmap.cassandra.change.EmailChangeRepositoryDAO;
 import org.apache.james.jmap.cassandra.change.MailboxChangeRepositoryDAO;
 import org.apache.james.mailbox.AttachmentContentLoader;
+import org.apache.james.mailbox.AttachmentIdFactory;
 import org.apache.james.mailbox.AttachmentManager;
 import org.apache.james.mailbox.Authenticator;
 import org.apache.james.mailbox.MailboxManager;
@@ -59,6 +60,7 @@ import org.apache.james.mailbox.MailboxPathLocker;
 import org.apache.james.mailbox.MessageIdManager;
 import org.apache.james.mailbox.RightManager;
 import org.apache.james.mailbox.SessionProvider;
+import org.apache.james.mailbox.StringBackedAttachmentIdFactory;
 import org.apache.james.mailbox.SubscriptionManager;
 import org.apache.james.mailbox.cassandra.CassandraMailboxManager;
 import org.apache.james.mailbox.cassandra.CassandraMailboxSessionMapperFactory;
@@ -184,6 +186,7 @@ public class CassandraMailboxModule extends AbstractModule {
 
         bind(MessageMapperFactory.class).to(CassandraMailboxSessionMapperFactory.class);
         bind(MailboxMapperFactory.class).to(CassandraMailboxSessionMapperFactory.class);
+        bind(AttachmentIdFactory.class).to(StringBackedAttachmentIdFactory.class);
         bind(AttachmentMapperFactory.class).to(CassandraMailboxSessionMapperFactory.class);
         bind(MailboxSessionMapperFactory.class).to(CassandraMailboxSessionMapperFactory.class);
         bind(SubscriptionMapperFactory.class).to(CassandraMailboxSessionMapperFactory.class);
diff --git a/server/container/guice/mailbox-jpa/src/main/java/org/apache/james/modules/mailbox/JPAMailboxModule.java b/server/container/guice/mailbox-jpa/src/main/java/org/apache/james/modules/mailbox/JPAMailboxModule.java
index 230c13e4a3..594d15e4cf 100644
--- a/server/container/guice/mailbox-jpa/src/main/java/org/apache/james/modules/mailbox/JPAMailboxModule.java
+++ b/server/container/guice/mailbox-jpa/src/main/java/org/apache/james/modules/mailbox/JPAMailboxModule.java
@@ -30,11 +30,13 @@ import org.apache.james.adapter.mailbox.UserRepositoryAuthenticator;
 import org.apache.james.adapter.mailbox.UserRepositoryAuthorizator;
 import org.apache.james.events.EventListener;
 import org.apache.james.mailbox.AttachmentContentLoader;
+import org.apache.james.mailbox.AttachmentIdFactory;
 import org.apache.james.mailbox.Authenticator;
 import org.apache.james.mailbox.Authorizator;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxPathLocker;
 import org.apache.james.mailbox.SessionProvider;
+import org.apache.james.mailbox.StringBackedAttachmentIdFactory;
 import org.apache.james.mailbox.SubscriptionManager;
 import org.apache.james.mailbox.acl.MailboxACLResolver;
 import org.apache.james.mailbox.acl.UnionMailboxACLResolver;
@@ -116,6 +118,7 @@ public class JPAMailboxModule extends AbstractModule {
         bind(Authorizator.class).to(UserRepositoryAuthorizator.class);
         bind(MailboxId.Factory.class).to(JPAId.Factory.class);
         bind(MailboxACLResolver.class).to(UnionMailboxACLResolver.class);
+        bind(AttachmentIdFactory.class).to(StringBackedAttachmentIdFactory.class);
         bind(AttachmentContentLoader.class).to(JPAAttachmentContentLoader.class);
 
         bind(ReIndexer.class).to(ReIndexerImpl.class);
diff --git a/server/container/guice/memory/src/main/java/org/apache/james/modules/mailbox/MemoryMailboxModule.java b/server/container/guice/memory/src/main/java/org/apache/james/modules/mailbox/MemoryMailboxModule.java
index 922f1a8454..6278e704fe 100644
--- a/server/container/guice/memory/src/main/java/org/apache/james/modules/mailbox/MemoryMailboxModule.java
+++ b/server/container/guice/memory/src/main/java/org/apache/james/modules/mailbox/MemoryMailboxModule.java
@@ -37,6 +37,7 @@ import org.apache.james.jmap.api.change.State;
 import org.apache.james.jmap.memory.change.MemoryEmailChangeRepository;
 import org.apache.james.jmap.memory.change.MemoryMailboxChangeRepository;
 import org.apache.james.mailbox.AttachmentContentLoader;
+import org.apache.james.mailbox.AttachmentIdFactory;
 import org.apache.james.mailbox.AttachmentManager;
 import org.apache.james.mailbox.Authenticator;
 import org.apache.james.mailbox.Authorizator;
@@ -45,6 +46,7 @@ import org.apache.james.mailbox.MailboxPathLocker;
 import org.apache.james.mailbox.MessageIdManager;
 import org.apache.james.mailbox.RightManager;
 import org.apache.james.mailbox.SessionProvider;
+import org.apache.james.mailbox.StringBackedAttachmentIdFactory;
 import org.apache.james.mailbox.SubscriptionManager;
 import org.apache.james.mailbox.extractor.TextExtractor;
 import org.apache.james.mailbox.inmemory.InMemoryId;
@@ -100,6 +102,7 @@ public class MemoryMailboxModule extends AbstractModule {
 
         bind(MessageMapperFactory.class).to(InMemoryMailboxSessionMapperFactory.class);
         bind(MailboxMapperFactory.class).to(InMemoryMailboxSessionMapperFactory.class);
+        bind(AttachmentIdFactory.class).to(StringBackedAttachmentIdFactory.class);
         bind(AttachmentMapperFactory.class).to(InMemoryMailboxSessionMapperFactory.class);
         bind(MailboxSessionMapperFactory.class).to(InMemoryMailboxSessionMapperFactory.class);
         bind(ModSeqProvider.class).to(InMemoryModSeqProvider.class);
diff --git a/server/protocols/jmap-draft-integration-testing/jmap-draft-integration-testing-common/src/test/java/org/apache/james/jmap/draft/methods/integration/SetMessagesMethodTest.java b/server/protocols/jmap-draft-integration-testing/jmap-draft-integration-testing-common/src/test/java/org/apache/james/jmap/draft/methods/integration/SetMessagesMethodTest.java
index fd2cf26d7f..1411b61f38 100644
--- a/server/protocols/jmap-draft-integration-testing/jmap-draft-integration-testing-common/src/test/java/org/apache/james/jmap/draft/methods/integration/SetMessagesMethodTest.java
+++ b/server/protocols/jmap-draft-integration-testing/jmap-draft-integration-testing-common/src/test/java/org/apache/james/jmap/draft/methods/integration/SetMessagesMethodTest.java
@@ -93,7 +93,6 @@ import org.apache.james.mailbox.FlagsBuilder;
 import org.apache.james.mailbox.Role;
 import org.apache.james.mailbox.events.MailboxEvents.Added;
 import org.apache.james.mailbox.exception.MailboxException;
-import org.apache.james.mailbox.model.AttachmentId;
 import org.apache.james.mailbox.model.AttachmentMetadata;
 import org.apache.james.mailbox.model.ComposedMessageId;
 import org.apache.james.mailbox.model.MailboxACL;
@@ -103,6 +102,7 @@ import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.model.MessageResult;
 import org.apache.james.mailbox.model.QuotaRoot;
+import org.apache.james.mailbox.model.StringBackedAttachmentId;
 import org.apache.james.mailbox.probe.ACLProbe;
 import org.apache.james.mailbox.probe.MailboxProbe;
 import org.apache.james.mailbox.probe.QuotaProbe;
@@ -4419,7 +4419,7 @@ public abstract class SetMessagesMethodTest {
 
         return AttachmentMetadata.builder()
             .messageId(new DefaultMessageId())
-            .attachmentId(AttachmentId.from(json.getString("blobId")))
+            .attachmentId(StringBackedAttachmentId.from(json.getString("blobId")))
             .size(json.getLong("size"))
             .type(json.getString("type"))
             .build();
@@ -4438,7 +4438,7 @@ public abstract class SetMessagesMethodTest {
 
         return AttachmentMetadata.builder()
             .messageId(new DefaultMessageId())
-            .attachmentId(AttachmentId.from(json.getString("blobId")))
+            .attachmentId(StringBackedAttachmentId.from(json.getString("blobId")))
             .size(json.getLong("size"))
             .type(json.getString("type"))
             .build();
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/BlobManagerImpl.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/BlobManagerImpl.java
index 5d7211d4b5..7f714d1fe5 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/BlobManagerImpl.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/BlobManagerImpl.java
@@ -34,6 +34,7 @@ import org.apache.james.jmap.api.upload.UploadRepository;
 import org.apache.james.jmap.draft.exceptions.BlobNotFoundException;
 import org.apache.james.jmap.draft.model.Blob;
 import org.apache.james.jmap.draft.model.BlobId;
+import org.apache.james.mailbox.AttachmentIdFactory;
 import org.apache.james.mailbox.AttachmentManager;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageIdManager;
@@ -65,14 +66,17 @@ public class BlobManagerImpl implements BlobManager {
     private final MessageIdManager messageIdManager;
     private final MessageId.Factory messageIdFactory;
     private final UploadRepository uploadRepository;
+    private final AttachmentIdFactory attachmentIdFactory;
 
     @Inject
     public BlobManagerImpl(AttachmentManager attachmentManager, MessageIdManager messageIdManager,
-                           MessageId.Factory messageIdFactory, UploadRepository uploadRepository) {
+                           MessageId.Factory messageIdFactory, UploadRepository uploadRepository,
+                           AttachmentIdFactory attachmentIdFactory) {
         this.attachmentManager = attachmentManager;
         this.messageIdManager = messageIdManager;
         this.messageIdFactory = messageIdFactory;
         this.uploadRepository = uploadRepository;
+        this.attachmentIdFactory = attachmentIdFactory;
     }
 
     @Override
@@ -88,7 +92,7 @@ public class BlobManagerImpl implements BlobManager {
 
 
         List<AttachmentId> notEncodingUploadsAsAttachmentIds = notEncodingUploads.stream()
-            .map(BlobId::asAttachmentId)
+            .map(blobId -> attachmentIdFactory.from(blobId.getRawValue()))
             .collect(ImmutableList.toImmutableList());
 
         Flux<Blob> attachmentOrMessage = Mono.fromCallable(() -> attachmentManager.getAttachments(notEncodingUploadsAsAttachmentIds, session))
@@ -145,7 +149,7 @@ public class BlobManagerImpl implements BlobManager {
 
     private Optional<Blob> getBlobFromAttachment(BlobId blobId, MailboxSession mailboxSession) throws MailboxException {
         try {
-            AttachmentId attachmentId = blobId.asAttachmentId();
+            AttachmentId attachmentId = attachmentIdFactory.from(blobId.getRawValue());
             AttachmentMetadata attachment = attachmentManager.getAttachment(attachmentId, mailboxSession);
 
             return Optional.of(loadAttachmentContent(attachment, mailboxSession));
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/BlobId.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/BlobId.java
index 6ab75e3357..030e2b3ab9 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/BlobId.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/BlobId.java
@@ -60,10 +60,6 @@ public class BlobId {
         return rawValue;
     }
 
-    public AttachmentId asAttachmentId() {
-        return AttachmentId.from(rawValue);
-    }
-
     public Optional<UploadId> asUploadId() {
         if (rawValue.startsWith(UPLOAD_PREFIX)) {
             UploadId uploadId = UploadId.from(rawValue.substring(UPLOAD_PREFIX.length()));
diff --git a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/BlobManagerImplTest.java b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/BlobManagerImplTest.java
index 1877c91b46..3d06570ac5 100644
--- a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/BlobManagerImplTest.java
+++ b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/BlobManagerImplTest.java
@@ -44,10 +44,11 @@ import org.apache.james.mailbox.AttachmentManager;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MailboxSessionUtil;
 import org.apache.james.mailbox.MessageIdManager;
+import org.apache.james.mailbox.StringBackedAttachmentIdFactory;
 import org.apache.james.mailbox.exception.AttachmentNotFoundException;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.inmemory.InMemoryMessageId;
-import org.apache.james.mailbox.model.AttachmentId;
+import org.apache.james.mailbox.model.StringBackedAttachmentId;
 import org.apache.james.mailbox.model.AttachmentMetadata;
 import org.apache.james.mailbox.model.ByteContent;
 import org.apache.james.mailbox.model.Content;
@@ -68,7 +69,7 @@ import reactor.core.publisher.Mono;
 
 class BlobManagerImplTest {
     static final String ID = "abc";
-    static final AttachmentId ATTACHMENT_ID = AttachmentId.from(ID);
+    static final StringBackedAttachmentId ATTACHMENT_ID = StringBackedAttachmentId.from(ID);
     static final ContentType CONTENT_TYPE = ContentType.of("text/plain");
     static final byte[] BYTES = "abc".getBytes(StandardCharsets.UTF_8);
     static final TestMessageId MESSAGE_ID = TestMessageId.of(125);
@@ -88,7 +89,7 @@ class BlobManagerImplTest {
 
         blobManager = new BlobManagerImpl(attachmentManager, messageIdManager, new TestMessageId.Factory(),
             new InMemoryUploadRepository(new DeDuplicationBlobStore(new MemoryBlobStoreDAO(), BucketName.of("default"), new HashBlobId.Factory()),
-                Clock.systemUTC()));
+                Clock.systemUTC()), new StringBackedAttachmentIdFactory());
     }
 
     @Test
diff --git a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/MIMEMessageConverterTest.java b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/MIMEMessageConverterTest.java
index 00e81b6b52..12911b30a6 100644
--- a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/MIMEMessageConverterTest.java
+++ b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/MIMEMessageConverterTest.java
@@ -40,9 +40,7 @@ import org.apache.james.jmap.draft.model.CreationMessage.DraftEmailer;
 import org.apache.james.jmap.draft.model.CreationMessageId;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MailboxSessionUtil;
-import org.apache.james.mailbox.model.AttachmentId;
-import org.apache.james.mime4j.codec.EncoderUtil;
-import org.apache.james.mime4j.codec.EncoderUtil.Usage;
+import org.apache.james.mailbox.model.StringBackedAttachmentId;
 import org.apache.james.mime4j.dom.Entity;
 import org.apache.james.mime4j.dom.Message;
 import org.apache.james.mime4j.dom.Multipart;
@@ -612,7 +610,7 @@ class MIMEMessageConverterTest {
             String expectedMimeType = "image/png";
             String text = "123456";
             TextBody expectedBody = new BasicBodyFactory().textBody(text.getBytes(), StandardCharsets.UTF_8);
-            AttachmentId blodId = AttachmentId.from("blodId");
+            StringBackedAttachmentId blodId = StringBackedAttachmentId.from("blodId");
             Attachment.WithBlob attachment = new Attachment.WithBlob(
                 Attachment.builder()
                     .blobId(BlobId.of(blodId.getId()))
@@ -662,7 +660,7 @@ class MIMEMessageConverterTest {
             String expectedMimeType = "text/calendar; charset=\"iso-8859-1\"";
             String text = "123456";
             TextBody expectedBody = new BasicBodyFactory().textBody(text.getBytes(), StandardCharsets.UTF_8);
-            AttachmentId blodId = AttachmentId.from("blodId");
+            StringBackedAttachmentId blodId = StringBackedAttachmentId.from("blodId");
 
             Attachment.WithBlob attachment = new Attachment.WithBlob(
                 Attachment.builder()
@@ -718,7 +716,7 @@ class MIMEMessageConverterTest {
             String text = "123456";
             TextBody expectedAttachmentBody = new BasicBodyFactory().textBody(text.getBytes(), StandardCharsets.UTF_8);
 
-            AttachmentId blodId = AttachmentId.from("blodId");
+            StringBackedAttachmentId blodId = StringBackedAttachmentId.from("blodId");
             Attachment.WithBlob attachment = new Attachment.WithBlob(
                 Attachment.builder()
                     .blobId(BlobId.of(blodId.getId()))
@@ -801,7 +799,7 @@ class MIMEMessageConverterTest {
             String expectedMimeType = "image/png";
             String text = "123456";
             String name = "ديناصور.png";
-            AttachmentId blodId = AttachmentId.from("blodId");
+            StringBackedAttachmentId blodId = StringBackedAttachmentId.from("blodId");
 
             Attachment.WithBlob attachment = new Attachment.WithBlob(
                 Attachment.builder()
@@ -845,7 +843,7 @@ class MIMEMessageConverterTest {
 
             String text = "123456";
             String type = "image/png";
-            AttachmentId blodId = AttachmentId.from("blodId");
+            StringBackedAttachmentId blodId = StringBackedAttachmentId.from("blodId");
 
             Attachment.WithBlob attachment = new Attachment.WithBlob(
                 Attachment.builder()
@@ -884,7 +882,7 @@ class MIMEMessageConverterTest {
 
             String text = "123456";
             String type = "image/png";
-            AttachmentId blodId = AttachmentId.from("blodId");
+            StringBackedAttachmentId blodId = StringBackedAttachmentId.from("blodId");
 
             Attachment.WithBlob attachment = new Attachment.WithBlob(
                 Attachment.builder()
@@ -922,7 +920,7 @@ class MIMEMessageConverterTest {
                 .build();
 
             String text = "123456";
-            AttachmentId blodId = AttachmentId.from("blodId");
+            StringBackedAttachmentId blodId = StringBackedAttachmentId.from("blodId");
             String type = "image/png";
 
             Attachment.WithBlob attachment = new Attachment.WithBlob(
@@ -963,7 +961,7 @@ class MIMEMessageConverterTest {
 
             String text = "123456";
             String type = "image/png; name=abc.png";
-            AttachmentId blodId = AttachmentId.from("blodId");
+            StringBackedAttachmentId blodId = StringBackedAttachmentId.from("blodId");
 
             Attachment.WithBlob attachment = new Attachment.WithBlob(
                 Attachment.builder()
@@ -991,7 +989,7 @@ class MIMEMessageConverterTest {
             MIMEMessageConverter sut = new MIMEMessageConverter();
 
             String text = "123456";
-            AttachmentId blodId = AttachmentId.from("blodId");
+            StringBackedAttachmentId blodId = StringBackedAttachmentId.from("blodId");
             String type = "image/png; name=abc.png; charset=\"iso-8859-1\"";
 
             Attachment attachment = Attachment.builder()
@@ -1013,7 +1011,7 @@ class MIMEMessageConverterTest {
 
             String text = "123456";
             String type = "image/png";
-            AttachmentId blodId = AttachmentId.from("blodId");
+            StringBackedAttachmentId blodId = StringBackedAttachmentId.from("blodId");
             Attachment attachment = Attachment.builder()
                 .blobId(BlobId.of(blodId.getId()))
                 .cid("cid")
@@ -1032,7 +1030,7 @@ class MIMEMessageConverterTest {
             MIMEMessageConverter sut = new MIMEMessageConverter();
 
             String text = "123456";
-            AttachmentId blodId = AttachmentId.from("blodId");
+            StringBackedAttachmentId blodId = StringBackedAttachmentId.from("blodId");
             String type = "image/png; name=abc.png";
 
             Attachment attachment = Attachment.builder()
@@ -1052,7 +1050,7 @@ class MIMEMessageConverterTest {
             MIMEMessageConverter sut = new MIMEMessageConverter();
 
             String text = "123456";
-            AttachmentId blodId = AttachmentId.from("blodId");
+            StringBackedAttachmentId blodId = StringBackedAttachmentId.from("blodId");
             String type = "image/png";
             Attachment attachment = Attachment.builder()
                 .blobId(BlobId.of(blodId.getId()))
@@ -1079,7 +1077,7 @@ class MIMEMessageConverterTest {
 
             String name = "ديناصور.png";
             String text = "123456";
-            AttachmentId blodId = AttachmentId.from("blodId");
+            StringBackedAttachmentId blodId = StringBackedAttachmentId.from("blodId");
             String type = "image/png";
 
             Attachment.WithBlob attachment = new Attachment.WithBlob(
@@ -1123,7 +1121,7 @@ class MIMEMessageConverterTest {
 
             String text = "inline data";
             String type = "image/png";
-            AttachmentId blodId = AttachmentId.from("blodId");
+            StringBackedAttachmentId blodId = StringBackedAttachmentId.from("blodId");
 
             Attachment.WithBlob inline = new Attachment.WithBlob(
                 Attachment.builder()
@@ -1142,7 +1140,7 @@ class MIMEMessageConverterTest {
                     .build());
 
             String text2 = "attachment data";
-            final AttachmentId blodId2 = AttachmentId.from("blodId2");
+            final StringBackedAttachmentId blodId2 = StringBackedAttachmentId.from("blodId2");
             Attachment.WithBlob attachment = new Attachment.WithBlob(
                 Attachment.builder()
                     .blobId(BlobId.of(blodId.getId()))
diff --git a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageFastViewFactoryTest.java b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageFastViewFactoryTest.java
index 313488e7a4..ffac500a2f 100644
--- a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageFastViewFactoryTest.java
+++ b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageFastViewFactoryTest.java
@@ -53,6 +53,7 @@ import org.apache.james.jmap.memory.upload.InMemoryUploadRepository;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageIdManager;
 import org.apache.james.mailbox.MessageManager;
+import org.apache.james.mailbox.StringBackedAttachmentIdFactory;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.inmemory.InMemoryMailboxManager;
 import org.apache.james.mailbox.inmemory.manager.InMemoryIntegrationResources;
@@ -153,7 +154,7 @@ class MessageFastViewFactoryTest {
 
         blobManager = new BlobManagerImpl(resources.getAttachmentManager(), resources.getMessageIdManager(), resources.getMessageIdFactory(),
             new InMemoryUploadRepository(new DeDuplicationBlobStore(new MemoryBlobStoreDAO(), BucketName.of("default"), new HashBlobId.Factory()),
-                Clock.systemUTC()));
+                Clock.systemUTC()), new StringBackedAttachmentIdFactory());
         messageFullViewFactory = new MessageFullViewFactory(blobManager, messageContentExtractor, htmlTextExtractor, messageIdManager,
             new MemoryMessageFastViewProjection(new RecordingMetricFactory()));
         messageFastViewFactory = new MessageFastViewFactory(blobManager, messageIdManager, fastViewProjection, messageFullViewFactory);
diff --git a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageFullViewFactoryTest.java b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageFullViewFactoryTest.java
index dcd52d971f..dbe2c2fcb1 100644
--- a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageFullViewFactoryTest.java
+++ b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageFullViewFactoryTest.java
@@ -62,11 +62,11 @@ import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageIdManager;
 import org.apache.james.mailbox.MessageManager;
 import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.StringBackedAttachmentIdFactory;
 import org.apache.james.mailbox.inmemory.InMemoryId;
 import org.apache.james.mailbox.inmemory.InMemoryMailboxManager;
 import org.apache.james.mailbox.inmemory.InMemoryMessageId;
 import org.apache.james.mailbox.inmemory.manager.InMemoryIntegrationResources;
-import org.apache.james.mailbox.model.AttachmentId;
 import org.apache.james.mailbox.model.AttachmentMetadata;
 import org.apache.james.mailbox.model.Cid;
 import org.apache.james.mailbox.model.ComposedMessageId;
@@ -77,6 +77,7 @@ import org.apache.james.mailbox.model.MessageAttachmentMetadata;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.model.MessageRange;
 import org.apache.james.mailbox.model.MessageResult;
+import org.apache.james.mailbox.model.StringBackedAttachmentId;
 import org.apache.james.mailbox.model.TestMessageId;
 import org.apache.james.metrics.tests.RecordingMetricFactory;
 import org.apache.james.server.blob.deduplication.DeDuplicationBlobStore;
@@ -135,7 +136,8 @@ class MessageFullViewFactoryTest {
         fastViewProjection = spy(new MemoryMessageFastViewProjection(new RecordingMetricFactory()));
         BlobManagerImpl blobManager = new BlobManagerImpl(resources.getAttachmentManager(), resources.getMessageIdManager(), resources.getMessageIdFactory(),
             new InMemoryUploadRepository(new DeDuplicationBlobStore(new MemoryBlobStoreDAO(),
-                BucketName.of("default"), new HashBlobId.Factory()), Clock.systemUTC()));
+                BucketName.of("default"), new HashBlobId.Factory()), Clock.systemUTC()),
+            new StringBackedAttachmentIdFactory());
         messageFullViewFactory = new MessageFullViewFactory(blobManager, messageContentExtractor, htmlTextExtractor,
             messageIdManager,
             fastViewProjection);
@@ -505,7 +507,7 @@ class MessageFullViewFactoryTest {
                 .attachments(ImmutableList.of(MessageAttachmentMetadata.builder()
                         .attachment(AttachmentMetadata.builder()
                                 .messageId(InMemoryMessageId.of(46))
-                                .attachmentId(AttachmentId.from(blodId.getRawValue()))
+                                .attachmentId(StringBackedAttachmentId.from(blodId.getRawValue()))
                                 .size(payload.length())
                                 .type(type)
                                 .build())
diff --git a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageHeaderViewFactoryTest.java b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageHeaderViewFactoryTest.java
index 7ded4ed2de..5b72e2b8a4 100644
--- a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageHeaderViewFactoryTest.java
+++ b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageHeaderViewFactoryTest.java
@@ -43,6 +43,7 @@ import org.apache.james.jmap.memory.upload.InMemoryUploadRepository;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageIdManager;
 import org.apache.james.mailbox.MessageManager;
+import org.apache.james.mailbox.StringBackedAttachmentIdFactory;
 import org.apache.james.mailbox.inmemory.InMemoryMailboxManager;
 import org.apache.james.mailbox.inmemory.manager.InMemoryIntegrationResources;
 import org.apache.james.mailbox.model.ComposedMessageId;
@@ -84,7 +85,8 @@ class MessageHeaderViewFactoryTest {
             session).getId();
         BlobManagerImpl blobManager = new BlobManagerImpl(resources.getAttachmentManager(), resources.getMessageIdManager(), resources.getMessageIdFactory(),
             new InMemoryUploadRepository(new DeDuplicationBlobStore(new MemoryBlobStoreDAO(), BucketName.of("default"), new HashBlobId.Factory()),
-                Clock.systemUTC()));
+                Clock.systemUTC()),
+            new StringBackedAttachmentIdFactory());
 
         testee = new MessageHeaderViewFactory(blobManager, messageIdManager);
     }
diff --git a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageMetadataViewFactoryTest.java b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageMetadataViewFactoryTest.java
index 6311090239..25370a5c4f 100644
--- a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageMetadataViewFactoryTest.java
+++ b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageMetadataViewFactoryTest.java
@@ -38,6 +38,7 @@ import org.apache.james.jmap.memory.upload.InMemoryUploadRepository;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageIdManager;
 import org.apache.james.mailbox.MessageManager;
+import org.apache.james.mailbox.StringBackedAttachmentIdFactory;
 import org.apache.james.mailbox.inmemory.InMemoryMailboxManager;
 import org.apache.james.mailbox.inmemory.manager.InMemoryIntegrationResources;
 import org.apache.james.mailbox.model.ComposedMessageId;
@@ -79,7 +80,8 @@ class MessageMetadataViewFactoryTest {
 
         BlobManagerImpl blobManager = new BlobManagerImpl(resources.getAttachmentManager(), resources.getMessageIdManager(), resources.getMessageIdFactory(),
             new InMemoryUploadRepository(new DeDuplicationBlobStore(new MemoryBlobStoreDAO(), BucketName.of("default"), new HashBlobId.Factory()),
-                Clock.systemUTC()));
+                Clock.systemUTC()),
+            new StringBackedAttachmentIdFactory());
         testee = new MessageMetadataViewFactory(blobManager, messageIdManager);
     }
 
diff --git a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/event/ComputeMessageFastViewProjectionListenerTest.java b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/event/ComputeMessageFastViewProjectionListenerTest.java
index ab16217b97..0c36705640 100644
--- a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/event/ComputeMessageFastViewProjectionListenerTest.java
+++ b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/event/ComputeMessageFastViewProjectionListenerTest.java
@@ -54,6 +54,7 @@ import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MailboxSessionUtil;
 import org.apache.james.mailbox.MessageIdManager;
 import org.apache.james.mailbox.MessageManager;
+import org.apache.james.mailbox.StringBackedAttachmentIdFactory;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.inmemory.manager.InMemoryIntegrationResources;
 import org.apache.james.mailbox.model.ComposedMessageId;
@@ -145,7 +146,8 @@ class ComputeMessageFastViewProjectionListenerTest {
 
         BlobManagerImpl blobManager = new BlobManagerImpl(resources.getAttachmentManager(), resources.getMessageIdManager(), resources.getMessageIdFactory(),
             new InMemoryUploadRepository(new DeDuplicationBlobStore(new MemoryBlobStoreDAO(), BucketName.of("default"),
-                new HashBlobId.Factory()), Clock.systemUTC()));
+                new HashBlobId.Factory()), Clock.systemUTC()),
+            new StringBackedAttachmentIdFactory());
         messageFullViewFactory = new MessageFullViewFactory(blobManager, messageContentExtractor, htmlTextExtractor, messageIdManager, messageFastViewProjection);
 
         FakeAuthenticator authenticator = new FakeAuthenticator();
diff --git a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/routes/DownloadRoutes.scala b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/routes/DownloadRoutes.scala
index a445c43ea4..b5c2439397 100644
--- a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/routes/DownloadRoutes.scala
+++ b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/routes/DownloadRoutes.scala
@@ -48,7 +48,7 @@ import org.apache.james.jmap.routes.DownloadRoutes.{BUFFER_SIZE, LOGGER}
 import org.apache.james.jmap.{Endpoint, JMAPRoute, JMAPRoutes}
 import org.apache.james.mailbox.model.ContentType.{MediaType, MimeType, SubType}
 import org.apache.james.mailbox.model._
-import org.apache.james.mailbox.{AttachmentManager, MailboxSession, MessageIdManager}
+import org.apache.james.mailbox.{AttachmentIdFactory, AttachmentManager, MailboxSession, MessageIdManager}
 import org.apache.james.mime4j.codec.EncoderUtil
 import org.apache.james.mime4j.codec.EncoderUtil.Usage
 import org.apache.james.mime4j.dom.SingleBody
@@ -173,10 +173,10 @@ class UploadResolver @Inject()(val uploadService: UploadService) extends BlobRes
   }
 }
 
-class AttachmentBlobResolver @Inject()(val attachmentManager: AttachmentManager) extends BlobResolver {
+class AttachmentBlobResolver @Inject()(val attachmentManager: AttachmentManager, val attachmentIdFactory: AttachmentIdFactory) extends BlobResolver {
   override def resolve(blobId: BlobId, mailboxSession: MailboxSession): BlobResolutionResult =
-    AttachmentId.from(blobId.value.value) match {
-      case attachmentId: AttachmentId =>
+    attachmentIdFactory.from(blobId.value.value) match {
+      case attachmentId: StringBackedAttachmentId =>
         Try(attachmentManager.getAttachment(attachmentId, mailboxSession)) match {
           case Success(attachmentMetadata) =>
             Applicable(SMono(attachmentManager.loadReactive(attachmentMetadata, mailboxSession))


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org


(james-project) 02/03: JAMES-2586 Add UuidBackedAttachmentIdFactory

Posted by rc...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

rcordier pushed a commit to branch postgresql
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 156bf4a07163c25aeb0c991c2d95bffa15c0b946
Author: hung phan <hp...@linagora.com>
AuthorDate: Thu Mar 21 10:19:58 2024 +0700

    JAMES-2586 Add UuidBackedAttachmentIdFactory
---
 .../mailbox/UuidBackedAttachmentIdFactory.java     | 34 ++++++++++
 .../mailbox/model/UuidBackedAttachmentId.java      | 76 ++++++++++++++++++++++
 .../postgres/mail/PostgresAttachmentMapper.java    |  3 +-
 .../postgres/mail/PostgresAttachmentModule.java    |  2 +-
 .../postgres/mail/dao/PostgresAttachmentDAO.java   |  7 +-
 .../mailbox/postgres/mail/dto/AttachmentsDTO.java  |  3 +-
 .../PostgresAttachmentBlobReferenceSourceTest.java |  5 +-
 .../modules/mailbox/PostgresMailboxModule.java     |  3 +
 8 files changed, 125 insertions(+), 8 deletions(-)

diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/UuidBackedAttachmentIdFactory.java b/mailbox/api/src/main/java/org/apache/james/mailbox/UuidBackedAttachmentIdFactory.java
new file mode 100644
index 0000000000..3cebb5ab36
--- /dev/null
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/UuidBackedAttachmentIdFactory.java
@@ -0,0 +1,34 @@
+/****************************************************************
+ * 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.mailbox;
+
+import org.apache.james.mailbox.model.UuidBackedAttachmentId;
+
+public class UuidBackedAttachmentIdFactory implements AttachmentIdFactory {
+    @Override
+    public UuidBackedAttachmentId random() {
+        return UuidBackedAttachmentId.random();
+    }
+
+    @Override
+    public UuidBackedAttachmentId from(String id) {
+        return UuidBackedAttachmentId.from(id);
+    }
+}
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/UuidBackedAttachmentId.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/UuidBackedAttachmentId.java
new file mode 100644
index 0000000000..12186a2882
--- /dev/null
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/UuidBackedAttachmentId.java
@@ -0,0 +1,76 @@
+/****************************************************************
+ * 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.mailbox.model;
+
+import java.util.UUID;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Objects;
+
+public class UuidBackedAttachmentId implements AttachmentId {
+    public static UuidBackedAttachmentId random() {
+        return new UuidBackedAttachmentId(UUID.randomUUID());
+    }
+
+    public static UuidBackedAttachmentId from(String id) {
+        return new UuidBackedAttachmentId(UUID.fromString(id));
+    }
+
+    public static UuidBackedAttachmentId from(UUID id) {
+        return new UuidBackedAttachmentId(id);
+    }
+
+    private final UUID id;
+
+    private UuidBackedAttachmentId(UUID id) {
+        this.id = id;
+    }
+
+    @Override
+    public String getId() {
+        return id.toString();
+    }
+
+    @Override
+    public UUID asUUID() {
+        return id;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (obj instanceof UuidBackedAttachmentId) {
+            UuidBackedAttachmentId other = (UuidBackedAttachmentId) obj;
+            return Objects.equal(id, other.id);
+        }
+        return false;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hashCode(id);
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects
+                .toStringHelper(this)
+                .add("id", id)
+                .toString();
+    }
+}
diff --git a/mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/mail/PostgresAttachmentMapper.java b/mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/mail/PostgresAttachmentMapper.java
index f1d00421c2..1be53fa3a6 100644
--- a/mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/mail/PostgresAttachmentMapper.java
+++ b/mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/mail/PostgresAttachmentMapper.java
@@ -33,6 +33,7 @@ import org.apache.james.mailbox.model.AttachmentMetadata;
 import org.apache.james.mailbox.model.MessageAttachmentMetadata;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.model.ParsedAttachment;
+import org.apache.james.mailbox.model.UuidBackedAttachmentId;
 import org.apache.james.mailbox.postgres.mail.dao.PostgresAttachmentDAO;
 import org.apache.james.mailbox.store.mail.AttachmentMapper;
 
@@ -111,7 +112,7 @@ public class PostgresAttachmentMapper implements AttachmentMapper {
         return Mono.fromCallable(parsedAttachment::getContent)
             .flatMap(content -> Mono.from(blobStore.save(blobStore.getDefaultBucketName(), parsedAttachment.getContent(), BlobStore.StoragePolicy.LOW_COST))
                 .flatMap(blobId -> {
-                    AttachmentId attachmentId = AttachmentId.random();
+                    AttachmentId attachmentId = UuidBackedAttachmentId.random();
                     return postgresAttachmentDAO.storeAttachment(AttachmentMetadata.builder()
                             .attachmentId(attachmentId)
                             .type(parsedAttachment.getContentType())
diff --git a/mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/mail/PostgresAttachmentModule.java b/mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/mail/PostgresAttachmentModule.java
index 4b3fb59510..2bc4e0b16b 100644
--- a/mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/mail/PostgresAttachmentModule.java
+++ b/mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/mail/PostgresAttachmentModule.java
@@ -35,7 +35,7 @@ public interface PostgresAttachmentModule {
     interface PostgresAttachmentTable {
 
         Table<Record> TABLE_NAME = DSL.table("attachment");
-        Field<String> ID = DSL.field("id", SQLDataType.VARCHAR.notNull());
+        Field<UUID> ID = DSL.field("id", SQLDataType.UUID.notNull());
         Field<String> BLOB_ID = DSL.field("blob_id", SQLDataType.VARCHAR);
         Field<String> TYPE = DSL.field("type", SQLDataType.VARCHAR);
         Field<UUID> MESSAGE_ID = DSL.field("message_id", SQLDataType.UUID);
diff --git a/mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/mail/dao/PostgresAttachmentDAO.java b/mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/mail/dao/PostgresAttachmentDAO.java
index 8649a1329c..9f89de648e 100644
--- a/mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/mail/dao/PostgresAttachmentDAO.java
+++ b/mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/mail/dao/PostgresAttachmentDAO.java
@@ -31,6 +31,7 @@ import org.apache.james.blob.api.BlobId;
 import org.apache.james.core.Domain;
 import org.apache.james.mailbox.model.AttachmentId;
 import org.apache.james.mailbox.model.AttachmentMetadata;
+import org.apache.james.mailbox.model.UuidBackedAttachmentId;
 import org.apache.james.mailbox.postgres.PostgresMessageId;
 import org.apache.james.mailbox.postgres.mail.PostgresAttachmentModule.PostgresAttachmentTable;
 
@@ -72,7 +73,7 @@ public class PostgresAttachmentDAO {
                     PostgresAttachmentTable.MESSAGE_ID,
                     PostgresAttachmentTable.SIZE)
                 .from(PostgresAttachmentTable.TABLE_NAME)
-                .where(PostgresAttachmentTable.ID.eq(attachmentId.getId()))))
+                .where(PostgresAttachmentTable.ID.eq(attachmentId.asUUID()))))
             .map(row -> Pair.of(
                 AttachmentMetadata.builder()
                     .attachmentId(attachmentId)
@@ -90,7 +91,7 @@ public class PostgresAttachmentDAO {
         return postgresExecutor.executeRows(dslContext -> Flux.from(dslContext.selectFrom(PostgresAttachmentTable.TABLE_NAME)
                 .where(PostgresAttachmentTable.ID.in(attachmentIds.stream().map(AttachmentId::getId).collect(ImmutableList.toImmutableList())))))
             .map(row -> AttachmentMetadata.builder()
-                .attachmentId(AttachmentId.from(row.get(PostgresAttachmentTable.ID)))
+                .attachmentId(UuidBackedAttachmentId.from(row.get(PostgresAttachmentTable.ID)))
                 .type(row.get(PostgresAttachmentTable.TYPE))
                 .messageId(PostgresMessageId.Factory.of(row.get(PostgresAttachmentTable.MESSAGE_ID)))
                 .size(row.get(PostgresAttachmentTable.SIZE))
@@ -99,7 +100,7 @@ public class PostgresAttachmentDAO {
 
     public Mono<Void> storeAttachment(AttachmentMetadata attachment, BlobId blobId) {
         return postgresExecutor.executeVoid(dslContext -> Mono.from(dslContext.insertInto(PostgresAttachmentTable.TABLE_NAME)
-            .set(PostgresAttachmentTable.ID, attachment.getAttachmentId().getId())
+            .set(PostgresAttachmentTable.ID, attachment.getAttachmentId().asUUID())
             .set(PostgresAttachmentTable.BLOB_ID, blobId.asString())
             .set(PostgresAttachmentTable.TYPE, attachment.getType().asString())
             .set(PostgresAttachmentTable.MESSAGE_ID, ((PostgresMessageId) attachment.getMessageId()).asUuid())
diff --git a/mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/mail/dto/AttachmentsDTO.java b/mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/mail/dto/AttachmentsDTO.java
index 10c1d8eebc..a54f0e0972 100644
--- a/mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/mail/dto/AttachmentsDTO.java
+++ b/mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/mail/dto/AttachmentsDTO.java
@@ -32,6 +32,7 @@ import java.util.stream.StreamSupport;
 import org.apache.james.mailbox.model.AttachmentId;
 import org.apache.james.mailbox.model.Cid;
 import org.apache.james.mailbox.model.MessageAttachmentMetadata;
+import org.apache.james.mailbox.model.UuidBackedAttachmentId;
 import org.apache.james.mailbox.postgres.mail.MessageRepresentation;
 import org.jooq.BindingGetResultSetContext;
 import org.jooq.BindingSetStatementContext;
@@ -94,7 +95,7 @@ public class AttachmentsDTO extends ArrayList<MessageRepresentation.AttachmentRe
         }
 
         private MessageRepresentation.AttachmentRepresentation fromJsonNode(JsonNode jsonNode) {
-            AttachmentId attachmentId = AttachmentId.from(jsonNode.get(ATTACHMENT_ID_PROPERTY).asText());
+            AttachmentId attachmentId = UuidBackedAttachmentId.from(jsonNode.get(ATTACHMENT_ID_PROPERTY).asText());
             Optional<String> name = Optional.ofNullable(jsonNode.get(NAME_PROPERTY)).map(JsonNode::asText);
             Optional<Cid> cid = Optional.ofNullable(jsonNode.get(CID_PROPERTY)).map(JsonNode::asText).map(Cid::from);
             boolean isInline = jsonNode.get(IN_LINE_PROPERTY).asBoolean();
diff --git a/mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/mail/PostgresAttachmentBlobReferenceSourceTest.java b/mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/mail/PostgresAttachmentBlobReferenceSourceTest.java
index cfe0be5600..b48d76ffa4 100644
--- a/mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/mail/PostgresAttachmentBlobReferenceSourceTest.java
+++ b/mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/mail/PostgresAttachmentBlobReferenceSourceTest.java
@@ -26,6 +26,7 @@ import org.apache.james.blob.api.BlobId;
 import org.apache.james.blob.api.HashBlobId;
 import org.apache.james.mailbox.model.AttachmentId;
 import org.apache.james.mailbox.model.AttachmentMetadata;
+import org.apache.james.mailbox.model.UuidBackedAttachmentId;
 import org.apache.james.mailbox.postgres.PostgresMailboxAggregateModule;
 import org.apache.james.mailbox.postgres.PostgresMessageId;
 import org.apache.james.mailbox.postgres.mail.dao.PostgresAttachmentDAO;
@@ -35,8 +36,8 @@ import org.junit.jupiter.api.extension.RegisterExtension;
 
 class PostgresAttachmentBlobReferenceSourceTest {
 
-    private static final AttachmentId ATTACHMENT_ID = AttachmentId.from("id1");
-    private static final AttachmentId ATTACHMENT_ID_2 = AttachmentId.from("id2");
+    private static final AttachmentId ATTACHMENT_ID = UuidBackedAttachmentId.random();
+    private static final AttachmentId ATTACHMENT_ID_2 = UuidBackedAttachmentId.random();
     private static final HashBlobId.Factory BLOB_ID_FACTORY = new HashBlobId.Factory();
 
     @RegisterExtension
diff --git a/server/container/guice/mailbox-postgres/src/main/java/org/apache/james/modules/mailbox/PostgresMailboxModule.java b/server/container/guice/mailbox-postgres/src/main/java/org/apache/james/modules/mailbox/PostgresMailboxModule.java
index bde8e18b3b..c0c050e03b 100644
--- a/server/container/guice/mailbox-postgres/src/main/java/org/apache/james/modules/mailbox/PostgresMailboxModule.java
+++ b/server/container/guice/mailbox-postgres/src/main/java/org/apache/james/modules/mailbox/PostgresMailboxModule.java
@@ -33,6 +33,7 @@ import org.apache.james.backends.postgres.PostgresModule;
 import org.apache.james.blob.api.BlobReferenceSource;
 import org.apache.james.events.EventListener;
 import org.apache.james.mailbox.AttachmentContentLoader;
+import org.apache.james.mailbox.AttachmentIdFactory;
 import org.apache.james.mailbox.AttachmentManager;
 import org.apache.james.mailbox.Authenticator;
 import org.apache.james.mailbox.Authorizator;
@@ -42,6 +43,7 @@ import org.apache.james.mailbox.MessageIdManager;
 import org.apache.james.mailbox.RightManager;
 import org.apache.james.mailbox.SessionProvider;
 import org.apache.james.mailbox.SubscriptionManager;
+import org.apache.james.mailbox.UuidBackedAttachmentIdFactory;
 import org.apache.james.mailbox.acl.MailboxACLResolver;
 import org.apache.james.mailbox.acl.UnionMailboxACLResolver;
 import org.apache.james.mailbox.indexer.ReIndexer;
@@ -128,6 +130,7 @@ public class PostgresMailboxModule extends AbstractModule {
         bind(MailboxACLResolver.class).to(UnionMailboxACLResolver.class);
         bind(MessageIdManager.class).to(StoreMessageIdManager.class);
         bind(RightManager.class).to(StoreRightManager.class);
+        bind(AttachmentIdFactory.class).to(UuidBackedAttachmentIdFactory.class);
         bind(AttachmentManager.class).to(StoreAttachmentManager.class);
         bind(AttachmentContentLoader.class).to(AttachmentManager.class);
         bind(AttachmentMapperFactory.class).to(PostgresMailboxSessionMapperFactory.class);


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org


(james-project) 03/03: JAMES-2586 Unbind AttachmentBlobResolver

Posted by rc...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

rcordier pushed a commit to branch postgresql
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit a2d5bc41a014dfb0a80d41e4973bff0b6deef4bc
Author: hung phan <hp...@linagora.com>
AuthorDate: Sat Mar 23 16:49:28 2024 +0700

    JAMES-2586 Unbind AttachmentBlobResolver
---
 .../main/java/org/apache/james/jmap/rfc8621/RFC8621MethodsModule.java   | 2 --
 1 file changed, 2 deletions(-)

diff --git a/server/container/guice/protocols/jmap/src/main/java/org/apache/james/jmap/rfc8621/RFC8621MethodsModule.java b/server/container/guice/protocols/jmap/src/main/java/org/apache/james/jmap/rfc8621/RFC8621MethodsModule.java
index 68a7c6a958..e3ce03f73d 100644
--- a/server/container/guice/protocols/jmap/src/main/java/org/apache/james/jmap/rfc8621/RFC8621MethodsModule.java
+++ b/server/container/guice/protocols/jmap/src/main/java/org/apache/james/jmap/rfc8621/RFC8621MethodsModule.java
@@ -86,7 +86,6 @@ import org.apache.james.jmap.method.ZoneIdProvider;
 import org.apache.james.jmap.pushsubscription.DefaultWebPushClient;
 import org.apache.james.jmap.pushsubscription.PushClientConfiguration;
 import org.apache.james.jmap.pushsubscription.WebPushClient;
-import org.apache.james.jmap.routes.AttachmentBlobResolver;
 import org.apache.james.jmap.routes.BlobResolver;
 import org.apache.james.jmap.routes.DownloadRoutes;
 import org.apache.james.jmap.routes.EventSourceRoutes;
@@ -198,7 +197,6 @@ public class RFC8621MethodsModule extends AbstractModule {
         blobResolverMultibinder.addBinding().to(MessageBlobResolver.class);
         blobResolverMultibinder.addBinding().to(UploadResolver.class);
         blobResolverMultibinder.addBinding().to(MessagePartBlobResolver.class);
-        blobResolverMultibinder.addBinding().to(AttachmentBlobResolver.class);
     }
 
     @ProvidesIntoSet


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org