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

Reply via email to