You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@james.apache.org by rc...@apache.org on 2021/07/08 08:47:20 UTC
[james-project] 01/04: JAMES-3516 Plug ThreadIdGuessingAlgorithm
into MessageManager
This is an automated email from the ASF dual-hosted git repository.
rcordier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git
commit 4acb31806998da369de53e88588b0a931e90982b
Author: quanth <hq...@linagora.com>
AuthorDate: Tue Jun 29 15:59:16 2021 +0700
JAMES-3516 Plug ThreadIdGuessingAlgorithm into MessageManager
---
.../mailbox/cassandra/CassandraMailboxManager.java | 9 +++++---
.../mailbox/cassandra/CassandraMessageManager.java | 6 +++--
.../cassandra/CassandraMailboxManagerProvider.java | 16 ++++++++-----
.../cassandra/CassandraTestSystemFixture.java | 4 +++-
.../CassandraMailboxManagerAttachmentTest.java | 7 ++++--
.../mailbox/jpa/openjpa/OpenJPAMailboxManager.java | 9 +++++---
.../mailbox/jpa/openjpa/OpenJPAMessageManager.java | 5 +++--
.../main/resources/META-INF/spring/mailbox-jpa.xml | 6 +++--
.../mailbox/jpa/JpaMailboxManagerProvider.java | 3 ++-
.../resources/META-INF/spring/mailbox-maildir.xml | 4 +++-
.../maildir/MaildirMailboxManagerProvider.java | 3 ++-
.../mailbox/inmemory/InMemoryMailboxManager.java | 9 +++++---
.../mailbox/inmemory/InMemoryMessageManager.java | 7 ++++--
.../resources/META-INF/spring/mailbox-memory.xml | 2 ++
.../manager/InMemoryIntegrationResources.java | 6 ++++-
.../apache/james/mailbox/store/MessageStorer.java | 22 ++++++++++++------
.../james/mailbox/store/StoreMailboxManager.java | 11 +++++++--
.../james/mailbox/store/StoreMessageManager.java | 26 +++++++++++++---------
.../mailbox/store/StoreMailboxManagerTest.java | 4 +++-
.../cassandra/host/CassandraHostSystem.java | 5 ++++-
.../mpt/imapmailbox/jpa/host/JPAHostSystem.java | 3 ++-
.../maildir/host/MaildirHostSystem.java | 3 ++-
.../modules/mailbox/CassandraMailboxModule.java | 4 ++++
.../james/modules/mailbox/JPAMailboxModule.java | 4 ++++
.../james/modules/mailbox/MemoryMailboxModule.java | 3 +++
25 files changed, 128 insertions(+), 53 deletions(-)
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxManager.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxManager.java
index 35d9f40..967ebbf 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxManager.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxManager.java
@@ -36,6 +36,7 @@ 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.ThreadIdGuessingAlgorithm;
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;
@@ -63,7 +64,7 @@ public class CassandraMailboxManager extends StoreMailboxManager {
StoreMailboxAnnotationManager annotationManager, StoreRightManager storeRightManager,
QuotaComponents quotaComponents, MessageSearchIndex index,
MailboxManagerConfiguration configuration,
- PreDeletionHooks preDeletionHooks) {
+ PreDeletionHooks preDeletionHooks, ThreadIdGuessingAlgorithm threadIdGuessingAlgorithm) {
super(mapperFactory,
sessionProvider,
locker,
@@ -75,7 +76,8 @@ public class CassandraMailboxManager extends StoreMailboxManager {
quotaComponents,
index,
configuration,
- preDeletionHooks);
+ preDeletionHooks,
+ threadIdGuessingAlgorithm);
this.locker = locker;
this.mapperFactory = mapperFactory;
}
@@ -103,7 +105,8 @@ public class CassandraMailboxManager extends StoreMailboxManager {
getMessageIdFactory(),
configuration.getBatchSizes(),
getStoreRightManager(),
- getPreDeletionHooks());
+ getPreDeletionHooks(),
+ getThreadIdGuessingAlgorithm());
}
}
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 e40d175..47498c1 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
@@ -34,6 +34,7 @@ import org.apache.james.mailbox.store.MessageStorer;
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.ThreadIdGuessingAlgorithm;
import org.apache.james.mailbox.store.mail.model.impl.MessageParser;
import org.apache.james.mailbox.store.search.MessageSearchIndex;
@@ -47,10 +48,11 @@ public class CassandraMessageManager extends StoreMessageManager {
QuotaRootResolver quotaRootResolver, MessageParser messageParser, MessageId.Factory messageIdFactory,
BatchSizes batchSizes,
StoreRightManager storeRightManager,
- PreDeletionHooks preDeletionHooks) {
+ PreDeletionHooks preDeletionHooks,
+ ThreadIdGuessingAlgorithm threadIdGuessingAlgorithm) {
super(CassandraMailboxManager.MESSAGE_CAPABILITIES, mapperFactory, index, eventBus, locker, mailbox,
quotaManager, quotaRootResolver, batchSizes, storeRightManager,
- preDeletionHooks, new MessageStorer.WithAttachment(mapperFactory, messageIdFactory, new MessageFactory.StoreMessageFactory(), mapperFactory, messageParser));
+ preDeletionHooks, new MessageStorer.WithAttachment(mapperFactory, messageIdFactory, new MessageFactory.StoreMessageFactory(), mapperFactory, messageParser, threadIdGuessingAlgorithm));
}
/**
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerProvider.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerProvider.java
index 3d2226c..dc52f59 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerProvider.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerProvider.java
@@ -48,6 +48,8 @@ import org.apache.james.mailbox.store.StoreMailboxAnnotationManager;
import org.apache.james.mailbox.store.StoreRightManager;
import org.apache.james.mailbox.store.event.MailboxAnnotationListener;
import org.apache.james.mailbox.store.extractor.DefaultTextExtractor;
+import org.apache.james.mailbox.store.mail.NaiveThreadIdGuessingAlgorithmImpl;
+import org.apache.james.mailbox.store.mail.ThreadIdGuessingAlgorithm;
import org.apache.james.mailbox.store.mail.model.impl.MessageParser;
import org.apache.james.mailbox.store.quota.DefaultUserQuotaRootResolver;
import org.apache.james.mailbox.store.quota.ListeningCurrentQuotaUpdater;
@@ -80,6 +82,7 @@ public class CassandraMailboxManagerProvider {
CassandraConfiguration cassandraConfiguration,
MailboxManagerConfiguration mailboxManagerConfiguration) {
CassandraMessageId.Factory messageIdFactory = new CassandraMessageId.Factory();
+ ThreadIdGuessingAlgorithm threadIdGuessingAlgorithm = new NaiveThreadIdGuessingAlgorithmImpl();
CassandraMailboxSessionMapperFactory mapperFactory = TestCassandraMailboxSessionMapperFactory.forTests(
cassandra,
@@ -87,14 +90,15 @@ public class CassandraMailboxManagerProvider {
cassandraConfiguration);
return provideMailboxManager(cassandra.getConf(), preDeletionHooks, mapperFactory,
- mailboxManagerConfiguration, messageIdFactory);
+ mailboxManagerConfiguration, messageIdFactory, threadIdGuessingAlgorithm);
}
private static CassandraMailboxManager provideMailboxManager(Session session,
- PreDeletionHooks preDeletionHooks,
- CassandraMailboxSessionMapperFactory mapperFactory,
- MailboxManagerConfiguration mailboxManagerConfiguration,
- MessageId.Factory messageIdFactory) {
+ PreDeletionHooks preDeletionHooks,
+ CassandraMailboxSessionMapperFactory mapperFactory,
+ MailboxManagerConfiguration mailboxManagerConfiguration,
+ MessageId.Factory messageIdFactory,
+ ThreadIdGuessingAlgorithm threadIdGuessingAlgorithm) {
MailboxACLResolver aclResolver = new UnionMailboxACLResolver();
GroupMembershipResolver groupMembershipResolver = new SimpleGroupMembershipResolver();
MessageParser messageParser = new MessageParser();
@@ -121,7 +125,7 @@ public class CassandraMailboxManagerProvider {
CassandraMailboxManager manager = new CassandraMailboxManager(mapperFactory, sessionProvider, new NoMailboxPathLocker(),
messageParser, messageIdFactory, eventBus, annotationManager, storeRightManager,
- quotaComponents, index, mailboxManagerConfiguration, preDeletionHooks);
+ quotaComponents, index, mailboxManagerConfiguration, preDeletionHooks, threadIdGuessingAlgorithm);
eventBus.register(quotaUpdater);
eventBus.register(new MailboxAnnotationListener(mapperFactory, sessionProvider));
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraTestSystemFixture.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraTestSystemFixture.java
index 12c1553..b6532dc 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraTestSystemFixture.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraTestSystemFixture.java
@@ -50,6 +50,7 @@ import org.apache.james.mailbox.store.StoreMessageIdManager;
import org.apache.james.mailbox.store.StoreRightManager;
import org.apache.james.mailbox.store.event.MailboxAnnotationListener;
import org.apache.james.mailbox.store.extractor.DefaultTextExtractor;
+import org.apache.james.mailbox.store.mail.NaiveThreadIdGuessingAlgorithmImpl;
import org.apache.james.mailbox.store.mail.model.impl.MessageParser;
import org.apache.james.mailbox.store.quota.DefaultUserQuotaRootResolver;
import org.apache.james.mailbox.store.quota.QuotaComponents;
@@ -77,7 +78,8 @@ public class CassandraTestSystemFixture {
MessageSearchIndex index = new SimpleMessageSearchIndex(mapperFactory, mapperFactory, new DefaultTextExtractor(), attachmentContentLoader);
CassandraMailboxManager cassandraMailboxManager = new CassandraMailboxManager(mapperFactory, sessionProvider,
new NoMailboxPathLocker(), new MessageParser(), new CassandraMessageId.Factory(),
- eventBus, annotationManager, storeRightManager, quotaComponents, index, MailboxManagerConfiguration.DEFAULT, PreDeletionHooks.NO_PRE_DELETION_HOOK);
+ eventBus, annotationManager, storeRightManager, quotaComponents, index, MailboxManagerConfiguration.DEFAULT, PreDeletionHooks.NO_PRE_DELETION_HOOK,
+ new NaiveThreadIdGuessingAlgorithmImpl());
eventBus.register(new MailboxAnnotationListener(mapperFactory, sessionProvider));
eventBus.register(mapperFactory.deleteMessageListener());
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxManagerAttachmentTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxManagerAttachmentTest.java
index b432dc9..73b8130 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxManagerAttachmentTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxManagerAttachmentTest.java
@@ -49,6 +49,8 @@ import org.apache.james.mailbox.store.StoreMailboxAnnotationManager;
import org.apache.james.mailbox.store.StoreRightManager;
import org.apache.james.mailbox.store.extractor.DefaultTextExtractor;
import org.apache.james.mailbox.store.mail.AttachmentMapperFactory;
+import org.apache.james.mailbox.store.mail.NaiveThreadIdGuessingAlgorithmImpl;
+import org.apache.james.mailbox.store.mail.ThreadIdGuessingAlgorithm;
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;
@@ -73,6 +75,7 @@ class CassandraMailboxManagerAttachmentTest extends AbstractMailboxManagerAttach
private void initSystemUnderTest() throws Exception {
CassandraMessageId.Factory messageIdFactory = new CassandraMessageId.Factory();
+ ThreadIdGuessingAlgorithm threadIdGuessingAlgorithm = new NaiveThreadIdGuessingAlgorithmImpl();
mailboxSessionMapperFactory = TestCassandraMailboxSessionMapperFactory.forTests(
cassandraCluster.getCassandraCluster(),
@@ -90,13 +93,13 @@ class CassandraMailboxManagerAttachmentTest extends AbstractMailboxManagerAttach
mailboxManager = new CassandraMailboxManager(mailboxSessionMapperFactory, sessionProvider, new NoMailboxPathLocker(), new MessageParser(),
messageIdFactory, eventBus, annotationManager, storeRightManager, quotaComponents,
- index, MailboxManagerConfiguration.DEFAULT, PreDeletionHooks.NO_PRE_DELETION_HOOK);
+ index, MailboxManagerConfiguration.DEFAULT, PreDeletionHooks.NO_PRE_DELETION_HOOK, threadIdGuessingAlgorithm);
MessageParser failingMessageParser = mock(MessageParser.class);
when(failingMessageParser.retrieveAttachments(any(InputStream.class)))
.thenThrow(new RuntimeException("Message parser set to fail"));
parseFailingMailboxManager = new CassandraMailboxManager(mailboxSessionMapperFactory, sessionProvider,
new NoMailboxPathLocker(), failingMessageParser, messageIdFactory,
- eventBus, annotationManager, storeRightManager, quotaComponents, index, MailboxManagerConfiguration.DEFAULT, PreDeletionHooks.NO_PRE_DELETION_HOOK);
+ eventBus, annotationManager, storeRightManager, quotaComponents, index, MailboxManagerConfiguration.DEFAULT, PreDeletionHooks.NO_PRE_DELETION_HOOK, threadIdGuessingAlgorithm);
}
@Override
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 5259366..606d8a7 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
@@ -36,6 +36,7 @@ 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.ThreadIdGuessingAlgorithm;
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;
@@ -59,11 +60,12 @@ public class OpenJPAMailboxManager extends StoreMailboxManager {
StoreMailboxAnnotationManager annotationManager,
StoreRightManager storeRightManager,
QuotaComponents quotaComponents,
- MessageSearchIndex index) {
+ MessageSearchIndex index,
+ ThreadIdGuessingAlgorithm threadIdGuessingAlgorithm) {
super(mapperFactory, sessionProvider, new JVMMailboxPathLocker(),
messageParser, messageIdFactory, annotationManager,
eventBus, storeRightManager, quotaComponents,
- index, MailboxManagerConfiguration.DEFAULT, PreDeletionHooks.NO_PRE_DELETION_HOOK);
+ index, MailboxManagerConfiguration.DEFAULT, PreDeletionHooks.NO_PRE_DELETION_HOOK, threadIdGuessingAlgorithm);
}
@Override
@@ -77,7 +79,8 @@ public class OpenJPAMailboxManager extends StoreMailboxManager {
getQuotaComponents().getQuotaRootResolver(),
getMessageIdFactory(),
configuration.getBatchSizes(),
- getStoreRightManager());
+ getStoreRightManager(),
+ getThreadIdGuessingAlgorithm());
}
@Override
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 a43ae7c..bd7a0a6 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
@@ -35,6 +35,7 @@ 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.ThreadIdGuessingAlgorithm;
import org.apache.james.mailbox.store.search.MessageSearchIndex;
/**
@@ -47,10 +48,10 @@ public class OpenJPAMessageManager extends StoreMessageManager {
MailboxPathLocker locker, Mailbox mailbox,
QuotaManager quotaManager, QuotaRootResolver quotaRootResolver,
MessageId.Factory messageIdFactory, BatchSizes batchSizes,
- StoreRightManager storeRightManager) {
+ StoreRightManager storeRightManager, ThreadIdGuessingAlgorithm threadIdGuessingAlgorithm) {
super(StoreMailboxManager.DEFAULT_NO_MESSAGE_CAPABILITIES, mapperFactory, index, eventBus, locker, mailbox,
quotaManager, quotaRootResolver, batchSizes, storeRightManager, PreDeletionHooks.NO_PRE_DELETION_HOOK,
- new MessageStorer.WithoutAttachment(mapperFactory, messageIdFactory, new OpenJPAMessageFactory(OpenJPAMessageFactory.AdvancedFeature.None)));
+ new MessageStorer.WithoutAttachment(mapperFactory, messageIdFactory, new OpenJPAMessageFactory(OpenJPAMessageFactory.AdvancedFeature.None), threadIdGuessingAlgorithm));
}
/**
diff --git a/mailbox/jpa/src/main/resources/META-INF/spring/mailbox-jpa.xml b/mailbox/jpa/src/main/resources/META-INF/spring/mailbox-jpa.xml
index fb646fc..ea8e896 100644
--- a/mailbox/jpa/src/main/resources/META-INF/spring/mailbox-jpa.xml
+++ b/mailbox/jpa/src/main/resources/META-INF/spring/mailbox-jpa.xml
@@ -31,7 +31,6 @@
<bean id="jpa-mailboxIdFactory" class="org.apache.james.mailbox.jpa.JPAId.Factory" />
-
<bean id="jpa-mailboxmanager" class="org.apache.james.mailbox.jpa.openjpa.OpenJPAMailboxManager">
<constructor-arg index="0" ref="jpa-sessionMapperFactory"/>
<constructor-arg index="1" ref="sessionProvider"/>
@@ -42,8 +41,11 @@
<constructor-arg index="6" ref="storeRightManager" />
<constructor-arg index="7" ref="quotaComponents" />
<constructor-arg index="8" ref="indexer" />
+ <constructor-arg index="9" ref="threadIdGuessingAlgorithm" />
</bean>
-
+
+ <bean id="threadIdGuessingAlgorithm" class="org.apache.james.mailbox.store.mail.NaiveThreadIdGuessingAlgorithmImpl" />
+
<bean id ="jpa-subscriptionManager" class="org.apache.james.mailbox.store.StoreSubscriptionManager">
<constructor-arg index="0" ref="jpa-sessionMapperFactory"/>
</bean>
diff --git a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/JpaMailboxManagerProvider.java b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/JpaMailboxManagerProvider.java
index c7f5738..e7582f3 100644
--- a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/JpaMailboxManagerProvider.java
+++ b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/JpaMailboxManagerProvider.java
@@ -39,6 +39,7 @@ import org.apache.james.mailbox.store.SessionProviderImpl;
import org.apache.james.mailbox.store.StoreMailboxAnnotationManager;
import org.apache.james.mailbox.store.StoreRightManager;
import org.apache.james.mailbox.store.extractor.DefaultTextExtractor;
+import org.apache.james.mailbox.store.mail.NaiveThreadIdGuessingAlgorithmImpl;
import org.apache.james.mailbox.store.mail.model.DefaultMessageId;
import org.apache.james.mailbox.store.mail.model.impl.MessageParser;
import org.apache.james.mailbox.store.quota.QuotaComponents;
@@ -73,6 +74,6 @@ public class JpaMailboxManagerProvider {
return new OpenJPAMailboxManager(mf, sessionProvider,
messageParser, new DefaultMessageId.Factory(),
eventBus, annotationManager,
- storeRightManager, quotaComponents, index);
+ storeRightManager, quotaComponents, index, new NaiveThreadIdGuessingAlgorithmImpl());
}
}
diff --git a/mailbox/maildir/src/main/resources/META-INF/spring/mailbox-maildir.xml b/mailbox/maildir/src/main/resources/META-INF/spring/mailbox-maildir.xml
index 50adf609..baf4dfd 100644
--- a/mailbox/maildir/src/main/resources/META-INF/spring/mailbox-maildir.xml
+++ b/mailbox/maildir/src/main/resources/META-INF/spring/mailbox-maildir.xml
@@ -47,10 +47,12 @@
<constructor-arg index="9" ref="indexer" />
<constructor-arg index="10" ref="no-mailbox-configuration" />
<constructor-arg index="11" ref="preDeletionHooks" />
+ <constructor-arg index="12" ref="threadIdGuessingAlgorithm" />
</bean>
<bean id ="no-mailbox-configuration" class="org.apache.james.mailbox.store.MailboxManagerConfiguration.NoMailboxConfiguration"/>
-
+ <bean id ="threadIdGuessingAlgorithm" class="org.apache.james.mailbox.store.mail.NaiveThreadIdGuessingAlgorithmImpl"/>
+
<bean id ="maildir-subscriptionManager" class="org.apache.james.mailbox.store.StoreSubscriptionManager">
<constructor-arg index="0" ref="maildir-sessionMapperFactory"/>
</bean>
diff --git a/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/MaildirMailboxManagerProvider.java b/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/MaildirMailboxManagerProvider.java
index 2c7d16b..388d7fc 100644
--- a/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/MaildirMailboxManagerProvider.java
+++ b/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/MaildirMailboxManagerProvider.java
@@ -39,6 +39,7 @@ 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.extractor.DefaultTextExtractor;
+import org.apache.james.mailbox.store.mail.NaiveThreadIdGuessingAlgorithmImpl;
import org.apache.james.mailbox.store.mail.model.DefaultMessageId;
import org.apache.james.mailbox.store.mail.model.impl.MessageParser;
import org.apache.james.mailbox.store.quota.QuotaComponents;
@@ -69,7 +70,7 @@ public class MaildirMailboxManagerProvider {
StoreMailboxManager manager = new StoreMailboxManager(mf, sessionProvider, new JVMMailboxPathLocker(),
messageParser, new DefaultMessageId.Factory(), annotationManager, eventBus, storeRightManager,
- quotaComponents, index, MailboxManagerConfiguration.DEFAULT, PreDeletionHooks.NO_PRE_DELETION_HOOK);
+ quotaComponents, index, MailboxManagerConfiguration.DEFAULT, PreDeletionHooks.NO_PRE_DELETION_HOOK, new NaiveThreadIdGuessingAlgorithmImpl());
return manager;
}
diff --git a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMailboxManager.java b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMailboxManager.java
index a71a2b8..bf27e77 100644
--- a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMailboxManager.java
+++ b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMailboxManager.java
@@ -36,6 +36,7 @@ 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.ThreadIdGuessingAlgorithm;
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;
@@ -58,10 +59,11 @@ public class InMemoryMailboxManager extends StoreMailboxManager {
StoreRightManager storeRightManager,
QuotaComponents quotaComponents,
MessageSearchIndex searchIndex,
- PreDeletionHooks preDeletionHooks) {
+ PreDeletionHooks preDeletionHooks,
+ ThreadIdGuessingAlgorithm threadIdGuessingAlgorithm) {
super(mailboxSessionMapperFactory, sessionProvider, locker, messageParser, messageIdFactory,
annotationManager, eventBus, storeRightManager, quotaComponents, searchIndex, MailboxManagerConfiguration.DEFAULT,
- preDeletionHooks);
+ preDeletionHooks, threadIdGuessingAlgorithm);
}
@Override
@@ -87,6 +89,7 @@ public class InMemoryMailboxManager extends StoreMailboxManager {
getMessageIdFactory(),
configuration.getBatchSizes(),
getStoreRightManager(),
- getPreDeletionHooks());
+ getPreDeletionHooks(),
+ getThreadIdGuessingAlgorithm());
}
}
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 7b56397..3e4298c 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
@@ -16,6 +16,7 @@ import org.apache.james.mailbox.store.MessageStorer;
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.ThreadIdGuessingAlgorithm;
import org.apache.james.mailbox.store.mail.model.impl.MessageParser;
import org.apache.james.mailbox.store.search.MessageSearchIndex;
@@ -31,11 +32,13 @@ public class InMemoryMessageManager extends StoreMessageManager {
MessageId.Factory messageIdFactory,
BatchSizes batchSizes,
StoreRightManager storeRightManager,
- PreDeletionHooks preDeletionHooks) {
+ PreDeletionHooks preDeletionHooks,
+ ThreadIdGuessingAlgorithm threadIdGuessingAlgorithm) {
super(InMemoryMailboxManager.MESSAGE_CAPABILITIES, mapperFactory, index, eventBus, locker, mailbox, quotaManager, quotaRootResolver,
batchSizes, storeRightManager, preDeletionHooks,
- new MessageStorer.WithAttachment(mapperFactory, messageIdFactory, new MessageFactory.StoreMessageFactory(), (InMemoryMailboxSessionMapperFactory) mapperFactory, messageParser));
+ new MessageStorer.WithAttachment(mapperFactory, messageIdFactory, new MessageFactory.StoreMessageFactory(), (InMemoryMailboxSessionMapperFactory) mapperFactory, messageParser,
+ threadIdGuessingAlgorithm));
}
@Override
diff --git a/mailbox/memory/src/main/resources/META-INF/spring/mailbox-memory.xml b/mailbox/memory/src/main/resources/META-INF/spring/mailbox-memory.xml
index c701d67..3ef6ec1 100644
--- a/mailbox/memory/src/main/resources/META-INF/spring/mailbox-memory.xml
+++ b/mailbox/memory/src/main/resources/META-INF/spring/mailbox-memory.xml
@@ -43,6 +43,7 @@
<constructor-arg index="8" ref="quotaComponents" />
<constructor-arg index="9" ref="indexer" />
<constructor-arg index="10" ref="preDeletionHooks" />
+ <constructor-arg index="11" ref="threadIdGuessingAlgorithm" />
</bean>
<bean id ="memory-subscriptionManager" class="org.apache.james.mailbox.store.StoreSubscriptionManager">
@@ -50,6 +51,7 @@
</bean>
<bean id="memory-sessionMapperFactory" class="org.apache.james.mailbox.inmemory.InMemoryMailboxSessionMapperFactory" />
+ <bean id="threadIdGuessingAlgorithm" class="org.apache.james.mailbox.store.mail.NaiveThreadIdGuessingAlgorithmImpl"/>
<alias name="jvm-locker" alias="memory-locker"/>
diff --git a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryIntegrationResources.java b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryIntegrationResources.java
index 10cf638..9446b1c 100644
--- a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryIntegrationResources.java
+++ b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryIntegrationResources.java
@@ -62,6 +62,8 @@ import org.apache.james.mailbox.store.StoreMessageIdManager;
import org.apache.james.mailbox.store.StoreRightManager;
import org.apache.james.mailbox.store.event.MailboxAnnotationListener;
import org.apache.james.mailbox.store.extractor.DefaultTextExtractor;
+import org.apache.james.mailbox.store.mail.NaiveThreadIdGuessingAlgorithmImpl;
+import org.apache.james.mailbox.store.mail.ThreadIdGuessingAlgorithm;
import org.apache.james.mailbox.store.mail.model.impl.MessageParser;
import org.apache.james.mailbox.store.quota.CurrentQuotaCalculator;
import org.apache.james.mailbox.store.quota.DefaultUserQuotaRootResolver;
@@ -313,6 +315,7 @@ public class InMemoryIntegrationResources implements IntegrationResources<StoreM
QuotaComponents quotaComponents = new QuotaComponents(maxQuotaManager, quotaManager, quotaRootResolver);
InMemoryMessageId.Factory messageIdFactory = new InMemoryMessageId.Factory();
+ ThreadIdGuessingAlgorithm threadIdGuessingAlgorithm = new NaiveThreadIdGuessingAlgorithmImpl();
MailboxManagerPreInstanciationStage preInstanciationStage = new MailboxManagerPreInstanciationStage(mailboxSessionMapperFactory, sessionProvider);
PreDeletionHooks hooks = createHooks(preInstanciationStage);
@@ -334,7 +337,8 @@ public class InMemoryIntegrationResources implements IntegrationResources<StoreM
storeRightManager,
quotaComponents,
index,
- hooks);
+ hooks,
+ threadIdGuessingAlgorithm);
eventBus.register(listeningCurrentQuotaUpdater);
eventBus.register(new MailboxAnnotationListener(mailboxSessionMapperFactory, sessionProvider));
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
index 4c1bb88..7a4c726 100644
--- 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
@@ -38,10 +38,12 @@ import org.apache.james.mailbox.model.ParsedAttachment;
import org.apache.james.mailbox.model.ThreadId;
import org.apache.james.mailbox.store.mail.AttachmentMapperFactory;
import org.apache.james.mailbox.store.mail.MessageMapper;
+import org.apache.james.mailbox.store.mail.ThreadIdGuessingAlgorithm;
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.mime4j.dom.Message;
+import org.apache.james.mime4j.message.HeaderImpl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -57,7 +59,7 @@ public interface MessageStorer {
*
* Otherwize an empty optional will be returned on the right side of the pair.
*/
- Mono<Pair<MessageMetaData, Optional<List<MessageAttachmentMetadata>>>> appendMessageToStore(Mailbox mailbox, Date internalDate, int size, int bodyStartOctet, Content content, Flags flags, PropertyBuilder propertyBuilder, Optional<Message> maybeMessage, MailboxSession session) throws MailboxException;
+ Mono<Pair<MessageMetaData, Optional<List<MessageAttachmentMetadata>>>> appendMessageToStore(Mailbox mailbox, Date internalDate, int size, int bodyStartOctet, Content content, Flags flags, PropertyBuilder propertyBuilder, Optional<Message> maybeMessage, MailboxSession session, HeaderImpl headers) throws MailboxException;
/**
* MessageStorer parsing, storing and returning AttachmentMetadata
@@ -72,22 +74,25 @@ public interface MessageStorer {
private final MessageFactory messageFactory;
private final AttachmentMapperFactory attachmentMapperFactory;
private final MessageParser messageParser;
+ private final ThreadIdGuessingAlgorithm threadIdGuessingAlgorithm;
public WithAttachment(MailboxSessionMapperFactory mapperFactory, MessageId.Factory messageIdFactory,
MessageFactory messageFactory, AttachmentMapperFactory attachmentMapperFactory,
- MessageParser messageParser) {
+ MessageParser messageParser, ThreadIdGuessingAlgorithm threadIdGuessingAlgorithm) {
this.mapperFactory = mapperFactory;
this.messageIdFactory = messageIdFactory;
this.messageFactory = messageFactory;
this.attachmentMapperFactory = attachmentMapperFactory;
this.messageParser = messageParser;
+ this.threadIdGuessingAlgorithm = threadIdGuessingAlgorithm;
}
@Override
- public Mono<Pair<MessageMetaData, Optional<List<MessageAttachmentMetadata>>>> appendMessageToStore(Mailbox mailbox, Date internalDate, int size, int bodyStartOctet, Content content, Flags flags, PropertyBuilder propertyBuilder, Optional<Message> maybeMessage, MailboxSession session) throws MailboxException {
+ public Mono<Pair<MessageMetaData, Optional<List<MessageAttachmentMetadata>>>> appendMessageToStore(Mailbox mailbox, Date internalDate, int size, int bodyStartOctet, Content content, Flags flags, PropertyBuilder propertyBuilder, Optional<Message> maybeMessage, MailboxSession session, HeaderImpl headers) throws MailboxException {
MessageMapper messageMapper = mapperFactory.getMessageMapper(session);
MessageId messageId = messageIdFactory.generate();
- ThreadId threadId = ThreadId.fromBaseMessageId(messageId);
+ // TODO get mime message header fields
+ ThreadId threadId = threadIdGuessingAlgorithm.guessThreadId(session.getUser(), messageId, null, null, null, null);
return mapperFactory.getMessageMapper(session)
.executeReactive(
@@ -133,18 +138,21 @@ public interface MessageStorer {
private final MailboxSessionMapperFactory mapperFactory;
private final MessageId.Factory messageIdFactory;
private final MessageFactory messageFactory;
+ private final ThreadIdGuessingAlgorithm threadIdGuessingAlgorithm;
- public WithoutAttachment(MailboxSessionMapperFactory mapperFactory, MessageId.Factory messageIdFactory, MessageFactory messageFactory) {
+ public WithoutAttachment(MailboxSessionMapperFactory mapperFactory, MessageId.Factory messageIdFactory, MessageFactory messageFactory, ThreadIdGuessingAlgorithm threadIdGuessingAlgorithm) {
this.mapperFactory = mapperFactory;
this.messageIdFactory = messageIdFactory;
this.messageFactory = messageFactory;
+ this.threadIdGuessingAlgorithm = threadIdGuessingAlgorithm;
}
@Override
- public Mono<Pair<MessageMetaData, Optional<List<MessageAttachmentMetadata>>>> appendMessageToStore(Mailbox mailbox, Date internalDate, int size, int bodyStartOctet, Content content, Flags flags, PropertyBuilder propertyBuilder, Optional<Message> maybeMessage, MailboxSession session) throws MailboxException {
+ public Mono<Pair<MessageMetaData, Optional<List<MessageAttachmentMetadata>>>> appendMessageToStore(Mailbox mailbox, Date internalDate, int size, int bodyStartOctet, Content content, Flags flags, PropertyBuilder propertyBuilder, Optional<Message> maybeMessage, MailboxSession session, HeaderImpl headers) throws MailboxException {
MessageMapper messageMapper = mapperFactory.getMessageMapper(session);
MessageId messageId = messageIdFactory.generate();
- ThreadId threadId = ThreadId.fromBaseMessageId(messageId);
+ // TODO get mime message header fields
+ ThreadId threadId = threadIdGuessingAlgorithm.guessThreadId(session.getUser(), messageId, null, null, null, null);
MailboxMessage message = messageFactory.createMessage(messageId, threadId, mailbox, internalDate, size, bodyStartOctet, content, flags, propertyBuilder, ImmutableList.of());
return mapperFactory.getMessageMapper(session)
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 64ff6da..e228e7e 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
@@ -82,6 +82,7 @@ import org.apache.james.mailbox.quota.QuotaRootResolver;
import org.apache.james.mailbox.store.event.EventFactory;
import org.apache.james.mailbox.store.mail.MailboxMapper;
import org.apache.james.mailbox.store.mail.MessageMapper;
+import org.apache.james.mailbox.store.mail.ThreadIdGuessingAlgorithm;
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;
@@ -135,6 +136,7 @@ public class StoreMailboxManager implements MailboxManager {
private final MessageSearchIndex index;
private final PreDeletionHooks preDeletionHooks;
protected final MailboxManagerConfiguration configuration;
+ private final ThreadIdGuessingAlgorithm threadIdGuessingAlgorithm;
@Inject
public StoreMailboxManager(MailboxSessionMapperFactory mailboxSessionMapperFactory, SessionProvider sessionProvider,
@@ -142,7 +144,7 @@ public class StoreMailboxManager implements MailboxManager {
MessageId.Factory messageIdFactory, MailboxAnnotationManager annotationManager,
EventBus eventBus, StoreRightManager storeRightManager,
QuotaComponents quotaComponents, MessageSearchIndex searchIndex, MailboxManagerConfiguration configuration,
- PreDeletionHooks preDeletionHooks) {
+ PreDeletionHooks preDeletionHooks, ThreadIdGuessingAlgorithm threadIdGuessingAlgorithm) {
Preconditions.checkNotNull(eventBus);
Preconditions.checkNotNull(mailboxSessionMapperFactory);
@@ -160,6 +162,7 @@ public class StoreMailboxManager implements MailboxManager {
this.index = searchIndex;
this.configuration = configuration;
this.preDeletionHooks = preDeletionHooks;
+ this.threadIdGuessingAlgorithm = threadIdGuessingAlgorithm;
}
public QuotaComponents getQuotaComponents() {
@@ -228,6 +231,10 @@ public class StoreMailboxManager implements MailboxManager {
return preDeletionHooks;
}
+ public ThreadIdGuessingAlgorithm getThreadIdGuessingAlgorithm() {
+ return threadIdGuessingAlgorithm;
+ }
+
@Override
public MailboxSession createSystemSession(Username userName) {
return sessionProvider.createSystemSession(userName);
@@ -263,7 +270,7 @@ public class StoreMailboxManager implements MailboxManager {
return new StoreMessageManager(DEFAULT_NO_MESSAGE_CAPABILITIES, getMapperFactory(), getMessageSearchIndex(), getEventBus(),
getLocker(), mailbox, quotaManager,
getQuotaComponents().getQuotaRootResolver(), configuration.getBatchSizes(),
- getStoreRightManager(), preDeletionHooks, new MessageStorer.WithoutAttachment(mailboxSessionMapperFactory, messageIdFactory, new MessageFactory.StoreMessageFactory()));
+ getStoreRightManager(), preDeletionHooks, new MessageStorer.WithoutAttachment(mailboxSessionMapperFactory, messageIdFactory, new MessageFactory.StoreMessageFactory(), threadIdGuessingAlgorithm));
}
@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 f22323d..7897f45 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
@@ -45,6 +45,7 @@ import javax.mail.Flags;
import javax.mail.Flags.Flag;
import org.apache.commons.io.input.TeeInputStream;
+import org.apache.commons.lang3.tuple.ImmutablePair;
import org.apache.commons.lang3.tuple.Pair;
import org.apache.james.events.EventBus;
import org.apache.james.events.EventListener;
@@ -354,7 +355,9 @@ public class StoreMessageManager implements MessageManager {
BufferedOutputStream bufferedOut = new BufferedOutputStream(out);
BufferedInputStream tmpMsgIn = new BufferedInputStream(new TeeInputStream(msgIn, bufferedOut));
BodyOffsetInputStream bIn = new BodyOffsetInputStream(tmpMsgIn)) {
- PropertyBuilder propertyBuilder = parseProperties(bIn);
+ Pair<PropertyBuilder, HeaderImpl> pair = parseProperties(bIn);
+ PropertyBuilder propertyBuilder = pair.getLeft();
+ HeaderImpl headers = pair.getRight();
InputStreamConsummer.consume(tmpMsgIn);
bufferedOut.flush();
@@ -373,7 +376,7 @@ public class StoreMessageManager implements MessageManager {
return finalFile.length();
}
}, propertyBuilder,
- getFlags(mailboxSession, isRecent, flagsToBeSet), bodyStartOctet, unparsedMimeMessqage));
+ getFlags(mailboxSession, isRecent, flagsToBeSet), bodyStartOctet, unparsedMimeMessqage, headers));
}
} catch (IOException | MimeException e) {
throw new MailboxException("Unable to parse message", e);
@@ -398,12 +401,14 @@ public class StoreMessageManager implements MessageManager {
try (InputStream contentStream = msgIn.getInputStream();
BufferedInputStream bufferedContentStream = new BufferedInputStream(contentStream);
BodyOffsetInputStream bIn = new BodyOffsetInputStream(bufferedContentStream)) {
- PropertyBuilder propertyBuilder = parseProperties(bIn);
+ Pair<PropertyBuilder, HeaderImpl> pair = parseProperties(bIn);
+ PropertyBuilder propertyBuilder = pair.getLeft();
+ HeaderImpl headers = pair.getRight();
int bodyStartOctet = getBodyStartOctet(bIn);
return createAndDispatchMessage(computeInternalDate(internalDate),
mailboxSession, msgIn, propertyBuilder,
- getFlags(mailboxSession, isRecent, flagsToBeSet), bodyStartOctet, maybeMessage);
+ getFlags(mailboxSession, isRecent, flagsToBeSet), bodyStartOctet, maybeMessage, headers);
} catch (IOException | MimeException e) {
throw new MailboxException("Unable to parse message", e);
}
@@ -411,17 +416,18 @@ public class StoreMessageManager implements MessageManager {
.subscribeOn(Schedulers.elastic());
}
- private PropertyBuilder parseProperties(BodyOffsetInputStream bIn) throws IOException, MimeException {
+ private Pair<PropertyBuilder, HeaderImpl> parseProperties(BodyOffsetInputStream bIn) throws IOException, MimeException {
// Disable line length... This should be handled by the smtp server
// component and not the parser itself
// https://issues.apache.org/jira/browse/IMAP-122
- final MimeTokenStream parser = getParser(bIn);
- readHeader(parser);
+ MimeTokenStream parser = getParser(bIn);
+ final HeaderImpl headers = readHeader(parser);
+
final MaximalBodyDescriptor descriptor = (MaximalBodyDescriptor) parser.getBodyDescriptor();
final MediaType mediaType = getMediaType(descriptor);
final PropertyBuilder propertyBuilder = getPropertyBuilder(descriptor, mediaType.mediaType, mediaType.subType);
setTextualLinesCount(parser, mediaType.mediaType, propertyBuilder);
- return propertyBuilder;
+ return new ImmutablePair<>(propertyBuilder, headers);
}
private Date computeInternalDate(Date internalDate) {
@@ -503,14 +509,14 @@ public class StoreMessageManager implements MessageManager {
return bodyStartOctet;
}
- private Mono<AppendResult> createAndDispatchMessage(Date internalDate, MailboxSession mailboxSession, Content content, PropertyBuilder propertyBuilder, Flags flags, int bodyStartOctet, Optional<Message> maybeMessage) throws MailboxException {
+ private Mono<AppendResult> createAndDispatchMessage(Date internalDate, MailboxSession mailboxSession, Content content, PropertyBuilder propertyBuilder, Flags flags, int bodyStartOctet, Optional<Message> maybeMessage, HeaderImpl headers) throws MailboxException {
int size = (int) content.size();
QuotaRoot quotaRoot = quotaRootResolver.getQuotaRoot(mailbox);
return Mono.from(quotaManager.getQuotasReactive(quotaRoot))
.map(quotas -> new QuotaChecker(quotas, quotaRoot))
.doOnNext(Throwing.consumer((QuotaChecker quotaChecker) -> quotaChecker.tryAddition(1, size)).sneakyThrow())
.then(Mono.from(locker.executeReactiveWithLockReactive(getMailboxPath(),
- messageStorer.appendMessageToStore(mailbox, internalDate, size, bodyStartOctet, content, flags, propertyBuilder, maybeMessage, mailboxSession)
+ messageStorer.appendMessageToStore(mailbox, internalDate, size, bodyStartOctet, content, flags, propertyBuilder, maybeMessage, mailboxSession, headers)
.flatMap(data -> eventBus.dispatch(EventFactory.added()
.randomEventId()
.mailboxSession(mailboxSession)
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxManagerTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxManagerTest.java
index 2eec7fc..6753101 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxManagerTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxManagerTest.java
@@ -53,6 +53,7 @@ import org.apache.james.mailbox.model.search.MailboxQuery;
import org.apache.james.mailbox.model.search.PrefixedRegex;
import org.apache.james.mailbox.store.extractor.DefaultTextExtractor;
import org.apache.james.mailbox.store.mail.MailboxMapper;
+import org.apache.james.mailbox.store.mail.ThreadIdGuessingAlgorithm;
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;
@@ -92,6 +93,7 @@ class StoreMailboxManagerTest {
when(mockedMapperFactory.getMailboxMapper(mockedMailboxSession))
.thenReturn(mockedMailboxMapper);
Factory messageIdFactory = mock(MessageId.Factory.class);
+ ThreadIdGuessingAlgorithm threadIdGuessingAlgorithm = mock(ThreadIdGuessingAlgorithm.class);
FakeAuthenticator authenticator = new FakeAuthenticator();
authenticator.addUser(CURRENT_USER, CURRENT_USER_PASSWORD);
authenticator.addUser(ADMIN, ADMIN_PASSWORD);
@@ -110,7 +112,7 @@ class StoreMailboxManagerTest {
storeMailboxManager = new StoreMailboxManager(mockedMapperFactory, sessionProvider,
new JVMMailboxPathLocker(), new MessageParser(), messageIdFactory,
annotationManager, eventBus, storeRightManager, quotaComponents, index, MailboxManagerConfiguration.DEFAULT,
- PreDeletionHooks.NO_PRE_DELETION_HOOK);
+ PreDeletionHooks.NO_PRE_DELETION_HOOK, threadIdGuessingAlgorithm);
}
@Test
diff --git a/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/host/CassandraHostSystem.java b/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/host/CassandraHostSystem.java
index 43dd58b..b859cb0 100644
--- a/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/host/CassandraHostSystem.java
+++ b/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/host/CassandraHostSystem.java
@@ -53,6 +53,8 @@ import org.apache.james.mailbox.store.StoreMessageIdManager;
import org.apache.james.mailbox.store.StoreRightManager;
import org.apache.james.mailbox.store.StoreSubscriptionManager;
import org.apache.james.mailbox.store.extractor.DefaultTextExtractor;
+import org.apache.james.mailbox.store.mail.NaiveThreadIdGuessingAlgorithmImpl;
+import org.apache.james.mailbox.store.mail.ThreadIdGuessingAlgorithm;
import org.apache.james.mailbox.store.mail.model.impl.MessageParser;
import org.apache.james.mailbox.store.quota.DefaultUserQuotaRootResolver;
import org.apache.james.mailbox.store.quota.ListeningCurrentQuotaUpdater;
@@ -95,6 +97,7 @@ public class CassandraHostSystem extends JamesImapHostSystem {
cassandra = CassandraCluster.create(MailboxAggregateModule.MODULE_WITH_QUOTA, cassandraHost);
com.datastax.driver.core.Session session = cassandra.getConf();
CassandraMessageId.Factory messageIdFactory = new CassandraMessageId.Factory();
+ ThreadIdGuessingAlgorithm threadIdGuessingAlgorithm = new NaiveThreadIdGuessingAlgorithmImpl();
CassandraMailboxSessionMapperFactory mapperFactory = TestCassandraMailboxSessionMapperFactory.forTests(
cassandra, messageIdFactory);
@@ -123,7 +126,7 @@ public class CassandraHostSystem extends JamesImapHostSystem {
mailboxManager = new CassandraMailboxManager(mapperFactory, sessionProvider,
new JVMMailboxPathLocker(), new MessageParser(), messageIdFactory,
eventBus, annotationManager, storeRightManager, quotaComponents, index, MailboxManagerConfiguration.DEFAULT,
- PreDeletionHooks.NO_PRE_DELETION_HOOK);
+ PreDeletionHooks.NO_PRE_DELETION_HOOK, threadIdGuessingAlgorithm);
eventBus.register(quotaUpdater);
diff --git a/mpt/impl/imap-mailbox/jpa/src/test/java/org/apache/james/mpt/imapmailbox/jpa/host/JPAHostSystem.java b/mpt/impl/imap-mailbox/jpa/src/test/java/org/apache/james/mpt/imapmailbox/jpa/host/JPAHostSystem.java
index e488655..442ad46 100644
--- a/mpt/impl/imap-mailbox/jpa/src/test/java/org/apache/james/mpt/imapmailbox/jpa/host/JPAHostSystem.java
+++ b/mpt/impl/imap-mailbox/jpa/src/test/java/org/apache/james/mpt/imapmailbox/jpa/host/JPAHostSystem.java
@@ -53,6 +53,7 @@ import org.apache.james.mailbox.store.StoreRightManager;
import org.apache.james.mailbox.store.StoreSubscriptionManager;
import org.apache.james.mailbox.store.event.MailboxAnnotationListener;
import org.apache.james.mailbox.store.extractor.DefaultTextExtractor;
+import org.apache.james.mailbox.store.mail.NaiveThreadIdGuessingAlgorithmImpl;
import org.apache.james.mailbox.store.mail.model.DefaultMessageId;
import org.apache.james.mailbox.store.mail.model.impl.MessageParser;
import org.apache.james.mailbox.store.quota.DefaultUserQuotaRootResolver;
@@ -118,7 +119,7 @@ public class JPAHostSystem extends JamesImapHostSystem {
MessageSearchIndex index = new SimpleMessageSearchIndex(mapperFactory, mapperFactory, new DefaultTextExtractor(), attachmentContentLoader);
mailboxManager = new OpenJPAMailboxManager(mapperFactory, sessionProvider, messageParser, new DefaultMessageId.Factory(),
- eventBus, annotationManager, storeRightManager, quotaComponents, index);
+ eventBus, annotationManager, storeRightManager, quotaComponents, index, new NaiveThreadIdGuessingAlgorithmImpl());
eventBus.register(quotaUpdater);
eventBus.register(new MailboxAnnotationListener(mapperFactory, sessionProvider));
diff --git a/mpt/impl/imap-mailbox/maildir/src/test/java/org/apache/james/mpt/imapmailbox/maildir/host/MaildirHostSystem.java b/mpt/impl/imap-mailbox/maildir/src/test/java/org/apache/james/mpt/imapmailbox/maildir/host/MaildirHostSystem.java
index eb9dcbe..05cce99 100644
--- a/mpt/impl/imap-mailbox/maildir/src/test/java/org/apache/james/mpt/imapmailbox/maildir/host/MaildirHostSystem.java
+++ b/mpt/impl/imap-mailbox/maildir/src/test/java/org/apache/james/mpt/imapmailbox/maildir/host/MaildirHostSystem.java
@@ -48,6 +48,7 @@ import org.apache.james.mailbox.store.StoreMailboxManager;
import org.apache.james.mailbox.store.StoreRightManager;
import org.apache.james.mailbox.store.StoreSubscriptionManager;
import org.apache.james.mailbox.store.extractor.DefaultTextExtractor;
+import org.apache.james.mailbox.store.mail.NaiveThreadIdGuessingAlgorithmImpl;
import org.apache.james.mailbox.store.mail.model.DefaultMessageId;
import org.apache.james.mailbox.store.mail.model.impl.MessageParser;
import org.apache.james.mailbox.store.quota.QuotaComponents;
@@ -88,7 +89,7 @@ public class MaildirHostSystem extends JamesImapHostSystem {
mailboxManager = new StoreMailboxManager(mailboxSessionMapperFactory, sessionProvider, locker,
messageParser, new DefaultMessageId.Factory(), annotationManager, eventBus, storeRightManager, quotaComponents,
- index, MailboxManagerConfiguration.DEFAULT, PreDeletionHooks.NO_PRE_DELETION_HOOK);
+ index, MailboxManagerConfiguration.DEFAULT, PreDeletionHooks.NO_PRE_DELETION_HOOK, new NaiveThreadIdGuessingAlgorithmImpl());
ImapProcessor defaultImapProcessorFactory =
DefaultImapProcessorFactory.createDefaultProcessor(
diff --git a/server/container/guice/cassandra/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxModule.java b/server/container/guice/cassandra/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxModule.java
index 93b68a7..0425534 100644
--- a/server/container/guice/cassandra/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxModule.java
+++ b/server/container/guice/cassandra/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxModule.java
@@ -107,6 +107,8 @@ import org.apache.james.mailbox.store.mail.AttachmentMapperFactory;
import org.apache.james.mailbox.store.mail.MailboxMapperFactory;
import org.apache.james.mailbox.store.mail.MessageMapperFactory;
import org.apache.james.mailbox.store.mail.ModSeqProvider;
+import org.apache.james.mailbox.store.mail.NaiveThreadIdGuessingAlgorithmImpl;
+import org.apache.james.mailbox.store.mail.ThreadIdGuessingAlgorithm;
import org.apache.james.mailbox.store.mail.UidProvider;
import org.apache.james.mailbox.store.user.SubscriptionMapperFactory;
import org.apache.james.utils.MailboxManagerDefinition;
@@ -160,6 +162,7 @@ public class CassandraMailboxModule extends AbstractModule {
bind(CassandraId.Factory.class).in(Scopes.SINGLETON);
bind(CassandraMailboxSessionMapperFactory.class).in(Scopes.SINGLETON);
bind(CassandraMessageId.Factory.class).in(Scopes.SINGLETON);
+ bind(NaiveThreadIdGuessingAlgorithmImpl.class).in(Scopes.SINGLETON);
bind(CassandraModSeqProvider.class).in(Scopes.SINGLETON);
bind(CassandraUidProvider.class).in(Scopes.SINGLETON);
bind(NoMailboxPathLocker.class).in(Scopes.SINGLETON);
@@ -193,6 +196,7 @@ public class CassandraMailboxModule extends AbstractModule {
bind(MailboxId.Factory.class).to(CassandraId.Factory.class);
bind(State.Factory.class).to(CassandraStateFactory.class);
bind(MessageId.Factory.class).to(CassandraMessageId.Factory.class);
+ bind(ThreadIdGuessingAlgorithm.class).to(NaiveThreadIdGuessingAlgorithmImpl.class);
bind(MessageIdManager.class).to(StoreMessageIdManager.class);
bind(AttachmentManager.class).to(StoreAttachmentManager.class);
bind(RightManager.class).to(StoreRightManager.class);
diff --git a/server/container/guice/mailbox-jpa/src/main/java/org/apache/james/modules/mailbox/JPAMailboxModule.java b/server/container/guice/mailbox-jpa/src/main/java/org/apache/james/modules/mailbox/JPAMailboxModule.java
index 6a9318e..e6eb6b2 100644
--- a/server/container/guice/mailbox-jpa/src/main/java/org/apache/james/modules/mailbox/JPAMailboxModule.java
+++ b/server/container/guice/mailbox-jpa/src/main/java/org/apache/james/modules/mailbox/JPAMailboxModule.java
@@ -55,6 +55,8 @@ import org.apache.james.mailbox.store.event.MailboxAnnotationListener;
import org.apache.james.mailbox.store.mail.MailboxMapperFactory;
import org.apache.james.mailbox.store.mail.MessageMapperFactory;
import org.apache.james.mailbox.store.mail.ModSeqProvider;
+import org.apache.james.mailbox.store.mail.NaiveThreadIdGuessingAlgorithmImpl;
+import org.apache.james.mailbox.store.mail.ThreadIdGuessingAlgorithm;
import org.apache.james.mailbox.store.mail.UidProvider;
import org.apache.james.mailbox.store.mail.model.DefaultMessageId;
import org.apache.james.mailbox.store.user.SubscriptionMapperFactory;
@@ -88,6 +90,7 @@ public class JPAMailboxModule extends AbstractModule {
bind(SimpleGroupMembershipResolver.class).in(Scopes.SINGLETON);
bind(UnionMailboxACLResolver.class).in(Scopes.SINGLETON);
bind(DefaultMessageId.Factory.class).in(Scopes.SINGLETON);
+ bind(NaiveThreadIdGuessingAlgorithmImpl.class).in(Scopes.SINGLETON);
bind(ReIndexerImpl.class).in(Scopes.SINGLETON);
bind(SessionProviderImpl.class).in(Scopes.SINGLETON);
@@ -96,6 +99,7 @@ public class JPAMailboxModule extends AbstractModule {
bind(MailboxMapperFactory.class).to(JPAMailboxSessionMapperFactory.class);
bind(MailboxSessionMapperFactory.class).to(JPAMailboxSessionMapperFactory.class);
bind(MessageId.Factory.class).to(DefaultMessageId.Factory.class);
+ bind(ThreadIdGuessingAlgorithm.class).to(NaiveThreadIdGuessingAlgorithmImpl.class);
bind(ModSeqProvider.class).to(JPAModSeqProvider.class);
bind(UidProvider.class).to(JPAUidProvider.class);
diff --git a/server/container/guice/memory/src/main/java/org/apache/james/modules/mailbox/MemoryMailboxModule.java b/server/container/guice/memory/src/main/java/org/apache/james/modules/mailbox/MemoryMailboxModule.java
index 90c0e2a..0eaa025 100644
--- a/server/container/guice/memory/src/main/java/org/apache/james/modules/mailbox/MemoryMailboxModule.java
+++ b/server/container/guice/memory/src/main/java/org/apache/james/modules/mailbox/MemoryMailboxModule.java
@@ -68,6 +68,8 @@ import org.apache.james.mailbox.store.mail.AttachmentMapperFactory;
import org.apache.james.mailbox.store.mail.MailboxMapperFactory;
import org.apache.james.mailbox.store.mail.MessageMapperFactory;
import org.apache.james.mailbox.store.mail.ModSeqProvider;
+import org.apache.james.mailbox.store.mail.NaiveThreadIdGuessingAlgorithmImpl;
+import org.apache.james.mailbox.store.mail.ThreadIdGuessingAlgorithm;
import org.apache.james.mailbox.store.mail.UidProvider;
import org.apache.james.mailbox.store.search.MessageSearchIndex;
import org.apache.james.mailbox.store.search.SimpleMessageSearchIndex;
@@ -99,6 +101,7 @@ public class MemoryMailboxModule extends AbstractModule {
bind(UidProvider.class).to(InMemoryUidProvider.class);
bind(MailboxId.Factory.class).to(InMemoryId.Factory.class);
bind(MessageId.Factory.class).to(InMemoryMessageId.Factory.class);
+ bind(ThreadIdGuessingAlgorithm.class).to(NaiveThreadIdGuessingAlgorithmImpl.class);
bind(State.Factory.class).to(State.DefaultFactory.class);
bind(BlobManager.class).to(StoreBlobManager.class);
---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org