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 <[email protected]> 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: [email protected] For additional commands, e-mail: [email protected]
