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 <btell...@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-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org