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 98e37199594fdce9b12b679231c4647f99ccfec0 Author: Benoit Tellier <btell...@linagora.com> AuthorDate: Mon Jan 20 11:26:47 2020 +0700 [REFACTORING] Favor composition over inheritance in order to instantiate messages This was what OpenJPA mailbox implementation was actively relying on. I also took this opportunity to merge OpenJPA & JPA mailbox/message managers together. --- .../mailbox/cassandra/CassandraMessageManager.java | 3 +- .../james/mailbox/jpa/JPAMailboxManager.java | 67 ----------------- .../james/mailbox/jpa/JPAMessageManager.java | 87 ---------------------- .../mailbox/jpa/openjpa/OpenJPAMailboxManager.java | 31 +++++--- .../mailbox/jpa/openjpa/OpenJPAMessageFactory.java | 66 ++++++++++++++++ .../mailbox/jpa/openjpa/OpenJPAMessageManager.java | 55 ++++---------- .../mailbox/inmemory/InMemoryMessageManager.java | 3 +- .../apache/james/mailbox/store/MessageFactory.java | 50 +++++++++++++ .../james/mailbox/store/StoreMailboxManager.java | 2 +- .../james/mailbox/store/StoreMessageManager.java | 18 ++--- 10 files changed, 163 insertions(+), 219 deletions(-) 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 d3cbdde..50159cd 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 @@ -35,6 +35,7 @@ import org.apache.james.mailbox.model.ParsedAttachment; 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.PreDeletionHooks; import org.apache.james.mailbox.store.StoreMessageManager; import org.apache.james.mailbox.store.StoreRightManager; @@ -57,7 +58,7 @@ public class CassandraMessageManager extends StoreMessageManager { PreDeletionHooks preDeletionHooks) { super(CassandraMailboxManager.MESSAGE_CAPABILITIES, mapperFactory, index, eventBus, locker, mailbox, quotaManager, quotaRootResolver, messageParser, messageIdFactory, batchSizes, storeRightManager, - preDeletionHooks); + preDeletionHooks, new MessageFactory.StoreMessageFactory()); this.mapperFactory = mapperFactory; } diff --git a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/JPAMailboxManager.java b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/JPAMailboxManager.java deleted file mode 100644 index 1c606c4..0000000 --- a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/JPAMailboxManager.java +++ /dev/null @@ -1,67 +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.jpa; - -import java.util.EnumSet; - -import org.apache.james.mailbox.MailboxPathLocker; -import org.apache.james.mailbox.SessionProvider; -import org.apache.james.mailbox.events.EventBus; -import org.apache.james.mailbox.model.MessageId; -import org.apache.james.mailbox.store.MailboxManagerConfiguration; -import org.apache.james.mailbox.store.PreDeletionHooks; -import org.apache.james.mailbox.store.StoreMailboxAnnotationManager; -import org.apache.james.mailbox.store.StoreMailboxManager; -import org.apache.james.mailbox.store.StoreRightManager; -import org.apache.james.mailbox.store.mail.model.impl.MessageParser; -import org.apache.james.mailbox.store.quota.QuotaComponents; -import org.apache.james.mailbox.store.search.MessageSearchIndex; - -/** - * JPA implementation of {@link StoreMailboxManager} - */ -public abstract class JPAMailboxManager extends StoreMailboxManager { - - public static final EnumSet<MailboxCapabilities> MAILBOX_CAPABILITIES = EnumSet.of(MailboxCapabilities.UserFlag, - MailboxCapabilities.Namespace, - MailboxCapabilities.Move, - MailboxCapabilities.Annotation); - - public JPAMailboxManager(JPAMailboxSessionMapperFactory mailboxSessionMapperFactory, - SessionProvider sessionProvider, - MailboxPathLocker locker, - MessageParser messageParser, - MessageId.Factory messageIdFactory, - EventBus eventBus, - StoreMailboxAnnotationManager annotationManager, - StoreRightManager storeRightManager, - QuotaComponents quotaComponents, - MessageSearchIndex index) { - super(mailboxSessionMapperFactory, sessionProvider, locker, - messageParser, messageIdFactory, annotationManager, - eventBus, storeRightManager, quotaComponents, - index, MailboxManagerConfiguration.DEFAULT, PreDeletionHooks.NO_PRE_DELETION_HOOK); - } - - @Override - public EnumSet<MailboxCapabilities> getSupportedMailboxCapabilities() { - return MAILBOX_CAPABILITIES; - } - -} diff --git a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/JPAMessageManager.java b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/JPAMessageManager.java deleted file mode 100644 index 4dc500b..0000000 --- a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/JPAMessageManager.java +++ /dev/null @@ -1,87 +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.jpa; - -import java.util.Date; -import java.util.List; - -import javax.mail.Flags; -import javax.mail.internet.SharedInputStream; - -import org.apache.james.mailbox.MailboxPathLocker; -import org.apache.james.mailbox.MailboxSession; -import org.apache.james.mailbox.events.EventBus; -import org.apache.james.mailbox.exception.MailboxException; -import org.apache.james.mailbox.jpa.mail.model.JPAMailbox; -import org.apache.james.mailbox.jpa.mail.model.openjpa.JPAMailboxMessage; -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.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.PreDeletionHooks; -import org.apache.james.mailbox.store.StoreMessageManager; -import org.apache.james.mailbox.store.StoreRightManager; -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.apache.james.mailbox.store.search.MessageSearchIndex; - -/** - * Abstract base class which should be used from JPA implementations. - */ -public class JPAMessageManager extends StoreMessageManager { - - public JPAMessageManager(MailboxSessionMapperFactory mapperFactory, - MessageSearchIndex index, - EventBus eventBus, - MailboxPathLocker locker, - Mailbox mailbox, - QuotaManager quotaManager, - QuotaRootResolver quotaRootResolver, - MessageParser messageParser, - MessageId.Factory messageIdFactory, - BatchSizes batchSizes, - StoreRightManager storeRightManager) { - - super(JPAMailboxManager.DEFAULT_NO_MESSAGE_CAPABILITIES, mapperFactory, index, eventBus, locker, mailbox, - quotaManager, quotaRootResolver, messageParser, messageIdFactory, batchSizes, storeRightManager, PreDeletionHooks.NO_PRE_DELETION_HOOK); - } - - @Override - protected MailboxMessage createMessage(Date internalDate, int size, int bodyStartOctet, SharedInputStream content, - final Flags flags, PropertyBuilder propertyBuilder, List<MessageAttachment> attachments) throws MailboxException { - - return new JPAMailboxMessage(JPAMailbox.from(getMailboxEntity()), internalDate, size, flags, content, bodyStartOctet, propertyBuilder); - } - - - /** - * Support user flags - */ - @Override - protected Flags getPermanentFlags(MailboxSession session) { - Flags flags = super.getPermanentFlags(session); - flags.add(Flags.Flag.USER); - return flags; - } - -} diff --git a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMailboxManager.java b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMailboxManager.java index 5db577c..3fec6d5 100644 --- a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMailboxManager.java +++ b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMailboxManager.java @@ -19,18 +19,21 @@ package org.apache.james.mailbox.jpa.openjpa; +import java.util.EnumSet; + import javax.inject.Inject; import org.apache.james.mailbox.MailboxSession; import org.apache.james.mailbox.SessionProvider; import org.apache.james.mailbox.events.EventBus; -import org.apache.james.mailbox.jpa.JPAMailboxManager; import org.apache.james.mailbox.jpa.JPAMailboxSessionMapperFactory; -import org.apache.james.mailbox.jpa.openjpa.OpenJPAMessageManager.AdvancedFeature; import org.apache.james.mailbox.model.Mailbox; import org.apache.james.mailbox.model.MessageId; import org.apache.james.mailbox.store.JVMMailboxPathLocker; +import org.apache.james.mailbox.store.MailboxManagerConfiguration; +import org.apache.james.mailbox.store.PreDeletionHooks; import org.apache.james.mailbox.store.StoreMailboxAnnotationManager; +import org.apache.james.mailbox.store.StoreMailboxManager; import org.apache.james.mailbox.store.StoreMessageManager; import org.apache.james.mailbox.store.StoreRightManager; import org.apache.james.mailbox.store.mail.model.impl.MessageParser; @@ -41,7 +44,11 @@ import org.apache.james.mailbox.store.search.MessageSearchIndex; * OpenJPA implementation of MailboxManager * */ -public class OpenJPAMailboxManager extends JPAMailboxManager { +public class OpenJPAMailboxManager extends StoreMailboxManager { + public static final EnumSet<MailboxCapabilities> MAILBOX_CAPABILITIES = EnumSet.of(MailboxCapabilities.UserFlag, + MailboxCapabilities.Namespace, + MailboxCapabilities.Move, + MailboxCapabilities.Annotation); @Inject public OpenJPAMailboxManager(JPAMailboxSessionMapperFactory mapperFactory, @@ -53,13 +60,10 @@ public class OpenJPAMailboxManager extends JPAMailboxManager { StoreRightManager storeRightManager, QuotaComponents quotaComponents, MessageSearchIndex index) { - super(mapperFactory, sessionProvider, new JVMMailboxPathLocker(), messageParser, - messageIdFactory, eventBus, annotationManager, storeRightManager, - quotaComponents, index); - } - - protected AdvancedFeature getAdvancedFeature() { - return AdvancedFeature.None; + super(mapperFactory, sessionProvider, new JVMMailboxPathLocker(), + messageParser, messageIdFactory, annotationManager, + eventBus, storeRightManager, quotaComponents, + index, MailboxManagerConfiguration.DEFAULT, PreDeletionHooks.NO_PRE_DELETION_HOOK); } @Override @@ -69,7 +73,6 @@ public class OpenJPAMailboxManager extends JPAMailboxManager { getEventBus(), getLocker(), mailboxRow, - getAdvancedFeature(), getQuotaComponents().getQuotaManager(), getQuotaComponents().getQuotaRootResolver(), getMessageParser(), @@ -77,4 +80,10 @@ public class OpenJPAMailboxManager extends JPAMailboxManager { configuration.getBatchSizes(), getStoreRightManager()); } + + @Override + public EnumSet<MailboxCapabilities> getSupportedMailboxCapabilities() { + return MAILBOX_CAPABILITIES; + } + } diff --git a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMessageFactory.java b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMessageFactory.java new file mode 100644 index 0000000..2135a76 --- /dev/null +++ b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMessageFactory.java @@ -0,0 +1,66 @@ +/**************************************************************** + * 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.jpa.openjpa; + +import java.util.Date; +import java.util.List; + +import javax.mail.Flags; +import javax.mail.internet.SharedInputStream; + +import org.apache.james.mailbox.exception.MailboxException; +import org.apache.james.mailbox.jpa.mail.model.JPAMailbox; +import org.apache.james.mailbox.jpa.mail.model.openjpa.AbstractJPAMailboxMessage; +import org.apache.james.mailbox.jpa.mail.model.openjpa.JPAEncryptedMailboxMessage; +import org.apache.james.mailbox.jpa.mail.model.openjpa.JPAMailboxMessage; +import org.apache.james.mailbox.jpa.mail.model.openjpa.JPAStreamingMailboxMessage; +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.store.MessageFactory; +import org.apache.james.mailbox.store.mail.model.impl.PropertyBuilder; + +public class OpenJPAMessageFactory implements MessageFactory<AbstractJPAMailboxMessage> { + private final AdvancedFeature feature; + + public OpenJPAMessageFactory(AdvancedFeature feature) { + this.feature = feature; + } + + public enum AdvancedFeature { + None, + Streaming, + Encryption + } + + @Override + public AbstractJPAMailboxMessage createMessage(MessageId messageId, Mailbox mailbox, Date internalDate, int size, int bodyStartOctet, SharedInputStream content, Flags flags, PropertyBuilder propertyBuilder, List<MessageAttachment> attachments) throws MailboxException { + switch (feature) { + case Streaming: + return new JPAStreamingMailboxMessage(JPAMailbox.from(mailbox), internalDate, size, flags, content, + bodyStartOctet, propertyBuilder); + case Encryption: + return new JPAEncryptedMailboxMessage(JPAMailbox.from(mailbox), internalDate, size, flags, content, + bodyStartOctet, propertyBuilder); + default: + return new JPAMailboxMessage(JPAMailbox.from(mailbox), internalDate, size, flags, content, bodyStartOctet, propertyBuilder); + } + } +} 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 7494fb8..6db978a 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 @@ -19,70 +19,47 @@ package org.apache.james.mailbox.jpa.openjpa; -import java.util.Date; -import java.util.List; - import javax.mail.Flags; -import javax.mail.internet.SharedInputStream; import org.apache.james.mailbox.MailboxPathLocker; +import org.apache.james.mailbox.MailboxSession; import org.apache.james.mailbox.events.EventBus; -import org.apache.james.mailbox.exception.MailboxException; -import org.apache.james.mailbox.jpa.JPAMessageManager; -import org.apache.james.mailbox.jpa.mail.model.JPAMailbox; -import org.apache.james.mailbox.jpa.mail.model.openjpa.JPAEncryptedMailboxMessage; -import org.apache.james.mailbox.jpa.mail.model.openjpa.JPAStreamingMailboxMessage; 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.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.PreDeletionHooks; +import org.apache.james.mailbox.store.StoreMailboxManager; +import org.apache.james.mailbox.store.StoreMessageManager; import org.apache.james.mailbox.store.StoreRightManager; -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.apache.james.mailbox.store.search.MessageSearchIndex; /** * OpenJPA implementation of Mailbox */ -public class OpenJPAMessageManager extends JPAMessageManager { - - private final AdvancedFeature feature; - - public enum AdvancedFeature { - None, - Streaming, - Encryption - } +public class OpenJPAMessageManager extends StoreMessageManager { public OpenJPAMessageManager(MailboxSessionMapperFactory mapperFactory, MessageSearchIndex index, EventBus eventBus, - MailboxPathLocker locker, Mailbox mailbox, AdvancedFeature f, + MailboxPathLocker locker, Mailbox mailbox, QuotaManager quotaManager, QuotaRootResolver quotaRootResolver, MessageParser messageParser, MessageId.Factory messageIdFactory, BatchSizes batchSizes, StoreRightManager storeRightManager) { - - super(mapperFactory, index, eventBus, locker, mailbox, quotaManager, quotaRootResolver, - messageParser, messageIdFactory, batchSizes, storeRightManager); - this.feature = f; + super(StoreMailboxManager.DEFAULT_NO_MESSAGE_CAPABILITIES, mapperFactory, index, eventBus, locker, mailbox, + quotaManager, quotaRootResolver, messageParser, messageIdFactory, batchSizes, storeRightManager, PreDeletionHooks.NO_PRE_DELETION_HOOK, + new OpenJPAMessageFactory(OpenJPAMessageFactory.AdvancedFeature.None)); } + /** + * Support user flags + */ @Override - protected MailboxMessage createMessage(Date internalDate, int size, int bodyStartOctet, SharedInputStream content, Flags flags, PropertyBuilder propertyBuilder, List<MessageAttachment> attachments) throws MailboxException { - switch (feature) { - case Streaming: - return new JPAStreamingMailboxMessage(JPAMailbox.from(getMailboxEntity()), internalDate, size, flags, content, bodyStartOctet, propertyBuilder); - case Encryption: - return new JPAEncryptedMailboxMessage(JPAMailbox.from(getMailboxEntity()), internalDate, size, flags, content, bodyStartOctet, propertyBuilder); - default: - return super.createMessage(internalDate, size, bodyStartOctet, content, flags, propertyBuilder, attachments); - } - + protected Flags getPermanentFlags(MailboxSession session) { + Flags flags = super.getPermanentFlags(session); + flags.add(Flags.Flag.USER); + return flags; } - - - } 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 ef84c37..d8d1a96 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 @@ -17,6 +17,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.MessageFactory; import org.apache.james.mailbox.store.PreDeletionHooks; import org.apache.james.mailbox.store.StoreMessageManager; import org.apache.james.mailbox.store.StoreRightManager; @@ -41,7 +42,7 @@ public class InMemoryMessageManager extends StoreMessageManager { PreDeletionHooks preDeletionHooks) { super(InMemoryMailboxManager.MESSAGE_CAPABILITIES, mapperFactory, index, eventBus, locker, mailbox, quotaManager, quotaRootResolver, - messageParser, messageIdFactory, batchSizes, storeRightManager, preDeletionHooks); + messageParser, messageIdFactory, batchSizes, storeRightManager, preDeletionHooks, new MessageFactory.StoreMessageFactory()); this.mapperFactory = (InMemoryMailboxSessionMapperFactory) mapperFactory; } diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/MessageFactory.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/MessageFactory.java new file mode 100644 index 0000000..c2b3b2e --- /dev/null +++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/MessageFactory.java @@ -0,0 +1,50 @@ +/**************************************************************** + * 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 javax.mail.Flags; +import javax.mail.internet.SharedInputStream; + +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.store.mail.model.MailboxMessage; +import org.apache.james.mailbox.store.mail.model.impl.PropertyBuilder; +import org.apache.james.mailbox.store.mail.model.impl.SimpleMailboxMessage; + +public interface MessageFactory<T extends MailboxMessage> { + T createMessage(MessageId messageId, Mailbox mailbox, Date internalDate, int size, int bodyStartOctet, + SharedInputStream content, Flags flags, PropertyBuilder propertyBuilder, + List<MessageAttachment> attachments) throws MailboxException; + + class StoreMessageFactory implements MessageFactory<SimpleMailboxMessage> { + @Override + public SimpleMailboxMessage createMessage(MessageId messageId, Mailbox mailbox, Date internalDate, int size, + int bodyStartOctet, SharedInputStream content, Flags flags, + PropertyBuilder propertyBuilder, List<MessageAttachment> attachments) { + return new SimpleMailboxMessage(messageId, internalDate, size, bodyStartOctet, content, flags, propertyBuilder, + mailbox.getMailboxId(), attachments); + } + } +} 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 4534422..aad8189 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 @@ -249,7 +249,7 @@ public class StoreMailboxManager implements MailboxManager { return new StoreMessageManager(DEFAULT_NO_MESSAGE_CAPABILITIES, getMapperFactory(), getMessageSearchIndex(), getEventBus(), getLocker(), mailbox, quotaManager, getQuotaComponents().getQuotaRootResolver(), getMessageParser(), getMessageIdFactory(), configuration.getBatchSizes(), - getStoreRightManager(), preDeletionHooks); + getStoreRightManager(), preDeletionHooks, 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 19d2106..f37279a 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 @@ -85,7 +85,6 @@ 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.MessageParser; import org.apache.james.mailbox.store.mail.model.impl.PropertyBuilder; -import org.apache.james.mailbox.store.mail.model.impl.SimpleMailboxMessage; import org.apache.james.mailbox.store.quota.QuotaChecker; import org.apache.james.mailbox.store.search.MessageSearchIndex; import org.apache.james.mailbox.store.streaming.CountingInputStream; @@ -164,12 +163,13 @@ public class StoreMessageManager implements MessageManager { private final Factory messageIdFactory; private final BatchSizes batchSizes; private final PreDeletionHooks preDeletionHooks; + private final MessageFactory messageFactory; - public StoreMessageManager(EnumSet<MailboxManager.MessageCapabilities> messageCapabilities, MailboxSessionMapperFactory mapperFactory, + public StoreMessageManager(EnumSet<MessageCapabilities> messageCapabilities, MailboxSessionMapperFactory mapperFactory, MessageSearchIndex index, EventBus eventBus, MailboxPathLocker locker, Mailbox mailbox, - QuotaManager quotaManager, QuotaRootResolver quotaRootResolver, MessageParser messageParser, MessageId.Factory messageIdFactory, BatchSizes batchSizes, - StoreRightManager storeRightManager, PreDeletionHooks preDeletionHooks) { + QuotaManager quotaManager, QuotaRootResolver quotaRootResolver, MessageParser messageParser, Factory messageIdFactory, BatchSizes batchSizes, + StoreRightManager storeRightManager, PreDeletionHooks preDeletionHooks, MessageFactory messageFactory) { this.messageCapabilities = messageCapabilities; this.eventBus = eventBus; this.mailbox = mailbox; @@ -183,6 +183,7 @@ public class StoreMessageManager implements MessageManager { this.batchSizes = batchSizes; this.storeRightManager = storeRightManager; this.preDeletionHooks = preDeletionHooks; + this.messageFactory = messageFactory; } /** @@ -500,13 +501,6 @@ public class StoreMessageManager implements MessageManager { } } - /** - * Create a new {@link MailboxMessage} for the given data - */ - protected MailboxMessage createMessage(Date internalDate, int size, int bodyStartOctet, SharedInputStream content, Flags flags, PropertyBuilder propertyBuilder, List<MessageAttachment> attachments) throws MailboxException { - return new SimpleMailboxMessage(messageIdFactory.generate(), internalDate, size, bodyStartOctet, content, flags, propertyBuilder, getMailboxEntity().getMailboxId(), attachments); - } - @Override public boolean isWriteable(MailboxSession session) throws MailboxException { return storeRightManager.isReadWrite(session, mailbox, getSharedPermanentFlags(session)); @@ -669,7 +663,7 @@ public class StoreMessageManager implements MessageManager { return mapperFactory.getMessageMapper(session).execute(() -> { List<MessageAttachment> attachments = storeAttachments(messageId, content, session); - MailboxMessage message = createMessage(internalDate, size, bodyStartOctet, content, flags, propertyBuilder, attachments); + MailboxMessage message = messageFactory.createMessage(messageId, getMailboxEntity(), internalDate, size, bodyStartOctet, content, flags, propertyBuilder, attachments); MessageMetaData metadata = messageMapper.add(getMailboxEntity(), message); return Pair.of(metadata, attachments); }); --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org