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