You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by bt...@apache.org on 2020/04/22 02:32:09 UTC

[james-project] 29/37: JAMES-2997 step #14 Abstract message storage

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

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

commit e72c2cdad22387b8f86e03fc4e475b49be67f1d4
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Tue Feb 4 13:26:15 2020 +0700

    JAMES-2997 step #14 Abstract message storage
    
    This avoids pretending "no attachment was stored" when attachment storage is
    not supported by the backend.
---
 .../org/apache/james/mailbox/AttachmentStorer.java |  44 -------
 .../org/apache/james/mailbox/MessageManager.java   |   9 +-
 .../mailbox/cassandra/CassandraMessageManager.java |   6 +-
 .../mailbox/jpa/openjpa/OpenJPAMessageManager.java |   6 +-
 .../mailbox/inmemory/InMemoryMessageManager.java   |   6 +-
 .../apache/james/mailbox/store/MessageStorer.java  | 137 +++++++++++++++++++++
 .../james/mailbox/store/StoreAttachmentStorer.java |  65 ----------
 .../james/mailbox/store/StoreMailboxManager.java   |   6 +-
 .../james/mailbox/store/StoreMessageManager.java   |  30 +----
 .../methods/SetMessagesCreationProcessorTest.java  |   2 +-
 10 files changed, 161 insertions(+), 150 deletions(-)

diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/AttachmentStorer.java b/mailbox/api/src/main/java/org/apache/james/mailbox/AttachmentStorer.java
deleted file mode 100644
index 2a3e22b..0000000
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/AttachmentStorer.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one   *
- * or more contributor license agreements.  See the NOTICE file *
- * distributed with this work for additional information        *
- * regarding copyright ownership.  The ASF licenses this file   *
- * to you under the Apache License, Version 2.0 (the            *
- * "License"); you may not use this file except in compliance   *
- * with the License.  You may obtain a copy of the License at   *
- *                                                              *
- *   http://www.apache.org/licenses/LICENSE-2.0                 *
- *                                                              *
- * Unless required by applicable law or agreed to in writing,   *
- * software distributed under the License is distributed on an  *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
- * KIND, either express or implied.  See the License for the    *
- * specific language governing permissions and limitations      *
- * under the License.                                           *
- ****************************************************************/
-
-package org.apache.james.mailbox;
-
-import java.util.List;
-
-import javax.mail.internet.SharedInputStream;
-
-import org.apache.james.mailbox.exception.MailboxException;
-import org.apache.james.mailbox.model.MessageAttachment;
-import org.apache.james.mailbox.model.MessageId;
-
-import com.google.common.collect.ImmutableList;
-
-public interface AttachmentStorer {
-    /**
-     * If applicable, this method will parse the messageContent to retrieve associated attachments and will store them.
-     */
-    List<MessageAttachment> storeAttachments(MessageId messageId, SharedInputStream messageContent, MailboxSession session) throws MailboxException;
-
-    class NoopAttachmentStorer implements AttachmentStorer {
-        @Override
-        public List<MessageAttachment> storeAttachments(MessageId messageId, SharedInputStream messageContent, MailboxSession session) {
-            return ImmutableList.of();
-        }
-    }
-}
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/MessageManager.java b/mailbox/api/src/main/java/org/apache/james/mailbox/MessageManager.java
index 2c67375..53f3b67 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/MessageManager.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/MessageManager.java
@@ -54,6 +54,8 @@ import org.apache.james.mailbox.model.UidValidity;
 import org.apache.james.mime4j.dom.Message;
 import org.apache.james.mime4j.message.DefaultMessageWriter;
 
+import com.google.common.base.Preconditions;
+
 /**
  * Interface which represent a Mailbox
  * 
@@ -142,9 +144,9 @@ public interface MessageManager {
 
     class AppendResult {
         private final ComposedMessageId ids;
-        private final List<MessageAttachment> messageAttachments;
+        private final Optional<List<MessageAttachment>> messageAttachments;
 
-        public AppendResult(ComposedMessageId ids, List<MessageAttachment> messageAttachments) {
+        public AppendResult(ComposedMessageId ids, Optional<List<MessageAttachment>> messageAttachments) {
             this.ids = ids;
             this.messageAttachments = messageAttachments;
         }
@@ -154,7 +156,8 @@ public interface MessageManager {
         }
 
         public List<MessageAttachment> getMessageAttachments() {
-            return messageAttachments;
+            Preconditions.checkState(messageAttachments.isPresent(), "'attachment storage' not supported by the implementation");
+            return messageAttachments.get();
         }
 
         @Override
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMessageManager.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMessageManager.java
index c22aba9..928e627 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMessageManager.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMessageManager.java
@@ -30,8 +30,8 @@ import org.apache.james.mailbox.quota.QuotaManager;
 import org.apache.james.mailbox.quota.QuotaRootResolver;
 import org.apache.james.mailbox.store.BatchSizes;
 import org.apache.james.mailbox.store.MessageFactory;
+import org.apache.james.mailbox.store.MessageStorer;
 import org.apache.james.mailbox.store.PreDeletionHooks;
-import org.apache.james.mailbox.store.StoreAttachmentStorer;
 import org.apache.james.mailbox.store.StoreMessageManager;
 import org.apache.james.mailbox.store.StoreRightManager;
 import org.apache.james.mailbox.store.mail.model.impl.MessageParser;
@@ -49,8 +49,8 @@ public class CassandraMessageManager extends StoreMessageManager {
                             StoreRightManager storeRightManager,
                             PreDeletionHooks preDeletionHooks) {
         super(CassandraMailboxManager.MESSAGE_CAPABILITIES, mapperFactory, index, eventBus, locker, mailbox,
-            quotaManager, quotaRootResolver, messageIdFactory, batchSizes, storeRightManager,
-            preDeletionHooks, new MessageFactory.StoreMessageFactory(), new StoreAttachmentStorer(mapperFactory, messageParser));
+            quotaManager, quotaRootResolver, batchSizes, storeRightManager,
+            preDeletionHooks, new MessageStorer.WithAttachment(mapperFactory, messageIdFactory, new MessageFactory.StoreMessageFactory(), mapperFactory, messageParser));
     }
 
     /**
diff --git a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMessageManager.java b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMessageManager.java
index d982497..b11c70b 100644
--- a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMessageManager.java
+++ b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMessageManager.java
@@ -21,7 +21,6 @@ package org.apache.james.mailbox.jpa.openjpa;
 
 import javax.mail.Flags;
 
-import org.apache.james.mailbox.AttachmentStorer;
 import org.apache.james.mailbox.MailboxPathLocker;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.events.EventBus;
@@ -31,6 +30,7 @@ import org.apache.james.mailbox.quota.QuotaManager;
 import org.apache.james.mailbox.quota.QuotaRootResolver;
 import org.apache.james.mailbox.store.BatchSizes;
 import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
+import org.apache.james.mailbox.store.MessageStorer;
 import org.apache.james.mailbox.store.PreDeletionHooks;
 import org.apache.james.mailbox.store.StoreMailboxManager;
 import org.apache.james.mailbox.store.StoreMessageManager;
@@ -49,8 +49,8 @@ public class OpenJPAMessageManager extends StoreMessageManager {
                                  MessageId.Factory messageIdFactory, BatchSizes batchSizes,
                                  StoreRightManager storeRightManager) {
         super(StoreMailboxManager.DEFAULT_NO_MESSAGE_CAPABILITIES, mapperFactory, index, eventBus, locker, mailbox,
-            quotaManager, quotaRootResolver, messageIdFactory, batchSizes, storeRightManager, PreDeletionHooks.NO_PRE_DELETION_HOOK,
-            new OpenJPAMessageFactory(OpenJPAMessageFactory.AdvancedFeature.None), new AttachmentStorer.NoopAttachmentStorer());
+            quotaManager, quotaRootResolver, batchSizes, storeRightManager, PreDeletionHooks.NO_PRE_DELETION_HOOK,
+            new MessageStorer.WithoutAttachment(mapperFactory, messageIdFactory, new OpenJPAMessageFactory(OpenJPAMessageFactory.AdvancedFeature.None)));
     }
 
     /**
diff --git a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMessageManager.java b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMessageManager.java
index 5d51bb7..59567b9 100644
--- a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMessageManager.java
+++ b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMessageManager.java
@@ -12,8 +12,8 @@ import org.apache.james.mailbox.quota.QuotaRootResolver;
 import org.apache.james.mailbox.store.BatchSizes;
 import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
 import org.apache.james.mailbox.store.MessageFactory;
+import org.apache.james.mailbox.store.MessageStorer;
 import org.apache.james.mailbox.store.PreDeletionHooks;
-import org.apache.james.mailbox.store.StoreAttachmentStorer;
 import org.apache.james.mailbox.store.StoreMessageManager;
 import org.apache.james.mailbox.store.StoreRightManager;
 import org.apache.james.mailbox.store.mail.model.impl.MessageParser;
@@ -34,8 +34,8 @@ public class InMemoryMessageManager extends StoreMessageManager {
                                   PreDeletionHooks preDeletionHooks) {
 
         super(InMemoryMailboxManager.MESSAGE_CAPABILITIES, mapperFactory, index, eventBus, locker, mailbox, quotaManager, quotaRootResolver,
-            messageIdFactory, batchSizes, storeRightManager, preDeletionHooks, new MessageFactory.StoreMessageFactory(),
-            new StoreAttachmentStorer((InMemoryMailboxSessionMapperFactory) mapperFactory, messageParser));
+            batchSizes, storeRightManager, preDeletionHooks,
+            new MessageStorer.WithAttachment(mapperFactory, messageIdFactory, new MessageFactory.StoreMessageFactory(), (InMemoryMailboxSessionMapperFactory) mapperFactory, messageParser));
     }
 
     @Override
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/MessageStorer.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/MessageStorer.java
new file mode 100644
index 0000000..7b1df1d
--- /dev/null
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/MessageStorer.java
@@ -0,0 +1,137 @@
+/****************************************************************
+ * 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.store;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Optional;
+
+import javax.mail.Flags;
+import javax.mail.internet.SharedInputStream;
+
+import org.apache.commons.lang3.tuple.Pair;
+import org.apache.james.mailbox.MailboxSession;
+import org.apache.james.mailbox.exception.MailboxException;
+import org.apache.james.mailbox.model.Mailbox;
+import org.apache.james.mailbox.model.MessageAttachment;
+import org.apache.james.mailbox.model.MessageId;
+import org.apache.james.mailbox.model.MessageMetaData;
+import org.apache.james.mailbox.model.ParsedAttachment;
+import org.apache.james.mailbox.store.mail.AttachmentMapperFactory;
+import org.apache.james.mailbox.store.mail.MessageMapper;
+import org.apache.james.mailbox.store.mail.model.MailboxMessage;
+import org.apache.james.mailbox.store.mail.model.impl.MessageParser;
+import org.apache.james.mailbox.store.mail.model.impl.PropertyBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.collect.ImmutableList;
+
+public interface MessageStorer {
+    /**
+     * If supported by the underlying implementation, this method will parse the messageContent to retrieve associated
+     * attachments and will store them.
+     *
+     * Otherwize an empty optional will be returned on the right side of the pair.
+     */
+    Pair<MessageMetaData, Optional<List<MessageAttachment>>> appendMessageToStore(Mailbox mailbox, Date internalDate, int size, int bodyStartOctet, SharedInputStream content, Flags flags, PropertyBuilder propertyBuilder, MailboxSession session) throws MailboxException;
+
+    /**
+     * MessageStorer parsing, storing and returning AttachmentMetadata
+     *
+     * To be used with implementation that supports attachment content storage
+     */
+    class WithAttachment implements MessageStorer {
+        private static final Logger LOGGER = LoggerFactory.getLogger(WithAttachment.class);
+
+        private final MailboxSessionMapperFactory mapperFactory;
+        private final MessageId.Factory messageIdFactory;
+        private final MessageFactory messageFactory;
+        private final AttachmentMapperFactory attachmentMapperFactory;
+        private final MessageParser messageParser;
+
+        public WithAttachment(MailboxSessionMapperFactory mapperFactory, MessageId.Factory messageIdFactory,
+                              MessageFactory messageFactory, AttachmentMapperFactory attachmentMapperFactory,
+                              MessageParser messageParser) {
+            this.mapperFactory = mapperFactory;
+            this.messageIdFactory = messageIdFactory;
+            this.messageFactory = messageFactory;
+            this.attachmentMapperFactory = attachmentMapperFactory;
+            this.messageParser = messageParser;
+        }
+
+        @Override
+        public Pair<MessageMetaData, Optional<List<MessageAttachment>>> appendMessageToStore(Mailbox mailbox, Date internalDate, int size, int bodyStartOctet, SharedInputStream content, Flags flags, PropertyBuilder propertyBuilder, MailboxSession session) throws MailboxException {
+            MessageMapper messageMapper = mapperFactory.getMessageMapper(session);
+            MessageId messageId = messageIdFactory.generate();
+
+            return mapperFactory.getMessageMapper(session).execute(() -> {
+                List<MessageAttachment> attachments = storeAttachments(messageId, content, session);
+                MailboxMessage message = messageFactory.createMessage(messageId, mailbox, internalDate, size, bodyStartOctet, content, flags, propertyBuilder, attachments);
+                MessageMetaData metadata = messageMapper.add(mailbox, message);
+                return Pair.of(metadata, Optional.of(attachments));
+            });
+        }
+
+        private List<MessageAttachment> storeAttachments(MessageId messageId, SharedInputStream messageContent, MailboxSession session) throws MailboxException {
+            List<ParsedAttachment> attachments = extractAttachments(messageContent);
+            return attachmentMapperFactory.getAttachmentMapper(session)
+                .storeAttachmentsForMessage(attachments, messageId);
+        }
+
+        private List<ParsedAttachment> extractAttachments(SharedInputStream contentIn) {
+            try {
+                return messageParser.retrieveAttachments(contentIn.newStream(0, -1));
+            } catch (Exception e) {
+                LOGGER.warn("Error while parsing mail's attachments: {}", e.getMessage(), e);
+                return ImmutableList.of();
+            }
+        }
+    }
+
+    /**
+     * MessageStorer that does not parse, store, nor return Attachment metadata
+     *
+     * To be used when the underlying implementation does not support attachment storage.
+     */
+    class WithoutAttachment implements MessageStorer {
+        private final MailboxSessionMapperFactory mapperFactory;
+        private final MessageId.Factory messageIdFactory;
+        private final MessageFactory messageFactory;
+
+        public WithoutAttachment(MailboxSessionMapperFactory mapperFactory, MessageId.Factory messageIdFactory, MessageFactory messageFactory) {
+            this.mapperFactory = mapperFactory;
+            this.messageIdFactory = messageIdFactory;
+            this.messageFactory = messageFactory;
+        }
+
+        @Override
+        public Pair<MessageMetaData, Optional<List<MessageAttachment>>> appendMessageToStore(Mailbox mailbox, Date internalDate, int size, int bodyStartOctet, SharedInputStream content, Flags flags, PropertyBuilder propertyBuilder, MailboxSession session) throws MailboxException {
+            MessageMapper messageMapper = mapperFactory.getMessageMapper(session);
+            MessageId messageId = messageIdFactory.generate();
+
+            return mapperFactory.getMessageMapper(session).execute(() -> {
+                MailboxMessage message = messageFactory.createMessage(messageId, mailbox, internalDate, size, bodyStartOctet, content, flags, propertyBuilder, ImmutableList.of());
+                MessageMetaData metadata = messageMapper.add(mailbox, message);
+                return Pair.of(metadata, Optional.empty());
+            });
+        }
+    }
+}
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreAttachmentStorer.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreAttachmentStorer.java
deleted file mode 100644
index 5ff314b..0000000
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreAttachmentStorer.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one   *
- * or more contributor license agreements.  See the NOTICE file *
- * distributed with this work for additional information        *
- * regarding copyright ownership.  The ASF licenses this file   *
- * to you under the Apache License, Version 2.0 (the            *
- * "License"); you may not use this file except in compliance   *
- * with the License.  You may obtain a copy of the License at   *
- *                                                              *
- *   http://www.apache.org/licenses/LICENSE-2.0                 *
- *                                                              *
- * Unless required by applicable law or agreed to in writing,   *
- * software distributed under the License is distributed on an  *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
- * KIND, either express or implied.  See the License for the    *
- * specific language governing permissions and limitations      *
- * under the License.                                           *
- ****************************************************************/
-
-package org.apache.james.mailbox.store;
-
-import java.util.List;
-
-import javax.mail.internet.SharedInputStream;
-
-import org.apache.james.mailbox.AttachmentStorer;
-import org.apache.james.mailbox.MailboxSession;
-import org.apache.james.mailbox.exception.MailboxException;
-import org.apache.james.mailbox.model.MessageAttachment;
-import org.apache.james.mailbox.model.MessageId;
-import org.apache.james.mailbox.model.ParsedAttachment;
-import org.apache.james.mailbox.store.mail.AttachmentMapperFactory;
-import org.apache.james.mailbox.store.mail.model.impl.MessageParser;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.google.common.collect.ImmutableList;
-
-public class StoreAttachmentStorer implements AttachmentStorer {
-    private static final Logger LOGGER = LoggerFactory.getLogger(StoreAttachmentStorer.class);
-
-    private final AttachmentMapperFactory mapperFactory;
-    private final MessageParser messageParser;
-
-    public StoreAttachmentStorer(AttachmentMapperFactory mapperFactory, MessageParser messageParser) {
-        this.mapperFactory = mapperFactory;
-        this.messageParser = messageParser;
-    }
-
-    @Override
-    public List<MessageAttachment> storeAttachments(MessageId messageId, SharedInputStream messageContent, MailboxSession session) throws MailboxException {
-        List<ParsedAttachment> attachments = extractAttachments(messageContent);
-        return mapperFactory.getAttachmentMapper(session)
-            .storeAttachmentsForMessage(attachments, messageId);
-    }
-
-    private List<ParsedAttachment> extractAttachments(SharedInputStream contentIn) {
-        try {
-            return messageParser.retrieveAttachments(contentIn.newStream(0, -1));
-        } catch (Exception e) {
-            LOGGER.warn("Error while parsing mail's attachments: {}", e.getMessage(), e);
-            return ImmutableList.of();
-        }
-    }
-}
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
index 96cc2a5..165cda0 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
@@ -33,7 +33,6 @@ import javax.inject.Inject;
 import org.apache.james.core.Username;
 import org.apache.james.core.quota.QuotaCountUsage;
 import org.apache.james.core.quota.QuotaSizeUsage;
-import org.apache.james.mailbox.AttachmentStorer.NoopAttachmentStorer;
 import org.apache.james.mailbox.MailboxAnnotationManager;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxPathLocker;
@@ -249,9 +248,8 @@ public class StoreMailboxManager implements MailboxManager {
     protected StoreMessageManager createMessageManager(Mailbox mailbox, MailboxSession session) throws MailboxException {
         return new StoreMessageManager(DEFAULT_NO_MESSAGE_CAPABILITIES, getMapperFactory(), getMessageSearchIndex(), getEventBus(),
                 getLocker(), mailbox, quotaManager,
-            getQuotaComponents().getQuotaRootResolver(), getMessageIdFactory(), configuration.getBatchSizes(),
-            getStoreRightManager(), preDeletionHooks, new MessageFactory.StoreMessageFactory(),
-            new NoopAttachmentStorer());
+            getQuotaComponents().getQuotaRootResolver(), configuration.getBatchSizes(),
+            getStoreRightManager(), preDeletionHooks, new MessageStorer.WithoutAttachment(mailboxSessionMapperFactory, messageIdFactory, new MessageFactory.StoreMessageFactory()));
     }
 
     @Override
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
index 0006c6f..b09725c 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
@@ -34,18 +34,17 @@ import java.util.EnumSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 import java.util.SortedMap;
 import java.util.TreeMap;
 import java.util.stream.Stream;
 
 import javax.mail.Flags;
 import javax.mail.Flags.Flag;
-import javax.mail.internet.SharedInputStream;
 import javax.mail.util.SharedFileInputStream;
 
 import org.apache.commons.io.input.TeeInputStream;
 import org.apache.commons.lang3.tuple.Pair;
-import org.apache.james.mailbox.AttachmentStorer;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxManager.MessageCapabilities;
 import org.apache.james.mailbox.MailboxPathLocker;
@@ -69,7 +68,6 @@ import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.MessageAttachment;
 import org.apache.james.mailbox.model.MessageId;
-import org.apache.james.mailbox.model.MessageId.Factory;
 import org.apache.james.mailbox.model.MessageMetaData;
 import org.apache.james.mailbox.model.MessageMoves;
 import org.apache.james.mailbox.model.MessageRange;
@@ -154,17 +152,15 @@ public class StoreMessageManager implements MessageManager {
     private final QuotaManager quotaManager;
     private final QuotaRootResolver quotaRootResolver;
     private final MailboxPathLocker locker;
-    private final Factory messageIdFactory;
     private final BatchSizes batchSizes;
     private final PreDeletionHooks preDeletionHooks;
-    private final MessageFactory messageFactory;
-    private final AttachmentStorer attachmentStorer;
+    private final MessageStorer messageStorer;
 
     public StoreMessageManager(EnumSet<MessageCapabilities> messageCapabilities, MailboxSessionMapperFactory mapperFactory,
                                MessageSearchIndex index, EventBus eventBus,
                                MailboxPathLocker locker, Mailbox mailbox,
-                               QuotaManager quotaManager, QuotaRootResolver quotaRootResolver, Factory messageIdFactory, BatchSizes batchSizes,
-                               StoreRightManager storeRightManager, PreDeletionHooks preDeletionHooks, MessageFactory messageFactory, AttachmentStorer attachmentStorer) {
+                               QuotaManager quotaManager, QuotaRootResolver quotaRootResolver, BatchSizes batchSizes,
+                               StoreRightManager storeRightManager, PreDeletionHooks preDeletionHooks, MessageStorer messageStorer) {
         this.messageCapabilities = messageCapabilities;
         this.eventBus = eventBus;
         this.mailbox = mailbox;
@@ -173,12 +169,10 @@ public class StoreMessageManager implements MessageManager {
         this.locker = locker;
         this.quotaManager = quotaManager;
         this.quotaRootResolver = quotaRootResolver;
-        this.messageIdFactory = messageIdFactory;
         this.batchSizes = batchSizes;
         this.storeRightManager = storeRightManager;
         this.preDeletionHooks = preDeletionHooks;
-        this.messageFactory = messageFactory;
-        this.attachmentStorer = attachmentStorer;
+        this.messageStorer = messageStorer;
     }
 
     /**
@@ -438,7 +432,7 @@ public class StoreMessageManager implements MessageManager {
             new QuotaChecker(quotaManager, quotaRootResolver, mailbox).tryAddition(1, size);
 
             return locker.executeWithLock(getMailboxPath(), () -> {
-                Pair<MessageMetaData, List<MessageAttachment>> data = appendMessageToStore(internalDate, size, bodyStartOctet, contentIn, flags, propertyBuilder, mailboxSession);
+                Pair<MessageMetaData, Optional<List<MessageAttachment>>> data = messageStorer.appendMessageToStore(mailbox, internalDate, size, bodyStartOctet, contentIn, flags, propertyBuilder, mailboxSession);
 
                 Mailbox mailbox = getMailboxEntity();
 
@@ -643,18 +637,6 @@ public class StoreMessageManager implements MessageManager {
         }, MailboxPathLocker.LockType.Write);
     }
 
-    private Pair<MessageMetaData, List<MessageAttachment>> appendMessageToStore(Date internalDate, int size, int bodyStartOctet, SharedInputStream content, Flags flags, PropertyBuilder propertyBuilder, MailboxSession session) throws MailboxException {
-        MessageMapper messageMapper = mapperFactory.getMessageMapper(session);
-        MessageId messageId = messageIdFactory.generate();
-
-        return mapperFactory.getMessageMapper(session).execute(() -> {
-            List<MessageAttachment> attachments = attachmentStorer.storeAttachments(messageId, content, session);
-            MailboxMessage message = messageFactory.createMessage(messageId, getMailboxEntity(), internalDate, size, bodyStartOctet, content, flags, propertyBuilder, attachments);
-            MessageMetaData metadata = messageMapper.add(getMailboxEntity(), message);
-            return Pair.of(metadata, attachments);
-        });
-    }
-
     @Override
     public long getMessageCount(MailboxSession mailboxSession) throws MailboxException {
         return mapperFactory.getMessageMapper(mailboxSession).countMessagesInMailbox(getMailboxEntity());
diff --git a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/SetMessagesCreationProcessorTest.java b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/SetMessagesCreationProcessorTest.java
index 5e869ff..4824d92 100644
--- a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/SetMessagesCreationProcessorTest.java
+++ b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/SetMessagesCreationProcessorTest.java
@@ -197,7 +197,7 @@ public class SetMessagesCreationProcessorTest {
         
         when(outbox.appendMessage(any(MessageManager.AppendCommand.class), any(MailboxSession.class)))
             .thenReturn(new MessageManager.AppendResult(new ComposedMessageId(OUTBOX_ID, TestMessageId.of(23), MessageUid.of(1)),
-                ImmutableList.of()));
+                Optional.of(ImmutableList.of())));
 
         drafts = mock(MessageManager.class);
         when(drafts.getId()).thenReturn(DRAFTS_ID);


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