You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by bt...@apache.org on 2020/05/13 12:07:09 UTC

[james-project] branch master updated (22999e9 -> af54749)

This is an automated email from the ASF dual-hosted git repository.

btellier pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git.


    from 22999e9  JAMES-3174 Fix dependency analyze on java 11
     new d90ace7  JAMES-3149 Reactify MailboxMapper::list
     new 94c5faf  JAMES-3149 Reactify ReIndexing
     new 1bb233b  JAMES-3149 Reactify PreDeletion hooks running
     new b716576  JAMES-3149 Improve ListeningMessageSearchIndex reactive code
     new 810dca4  [Refactoring] Slightly enhance MaildirMailboxMapper::visitUsersForMailboxList
     new fa9136c  JAMES-3143 Add concurrency tests for message projection corrections
     new af594f2  JAMES-3143 SolveMessageInconsistenciesService: Delay confirmation read
     new dc46a44  JAMES-3172 We cannot cancel computation started by Reactor
     new ba939ee  JAMES-3172 DistributedTaskManagerTest: Event serializer need to handle nested types
     new 930a2e3  JAMES-3172 Rely on Reactor for task execution
     new e717efd  JAMES-3172 Mocked tasks should not return null value
     new 712ebbd  [Refactoring] POJOify MailboxMetadata
     new 0b77f72  [Refactoring] JavaDoc for sensibleInformationFree
     new 1ef139a  [Refactoring] MailboxContentMetaData recent field should be immutable
     new af54749  JAMES-3178 AutomaticSentMail detector should bypass javax.mail parsing

The 15 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../org/apache/james/mailbox/MessageManager.java   | 164 ++++++++++++-----
 .../apache/james/mailbox/MailboxManagerTest.java   |  16 +-
 .../manager/QuotaMessageManagerContract.java       |   4 +-
 .../cassandra/mail/CassandraMailboxMapper.java     |   7 +-
 .../cassandra/mail/CassandraMessageMapper.java     |  20 ++-
 .../task/SolveMessageInconsistenciesService.java   |  58 ++++--
 .../CassandraMailboxMapperConcurrencyTest.java     |   4 +-
 .../SolveMessageInconsistenciesServiceTest.java    |  95 ++++++++++
 .../james/mailbox/jpa/mail/JPAMailboxMapper.java   |  15 +-
 .../james/mailbox/jpa/mail/JPAMessageMapper.java   |   8 +-
 .../jpa/mail/TransactionalMailboxMapper.java       |   4 +-
 .../jpa/mail/TransactionalMessageMapper.java       |   4 +-
 .../mailbox/maildir/mail/MaildirMailboxMapper.java |  62 +++----
 .../inmemory/mail/InMemoryMailboxMapper.java       |   6 +-
 .../inmemory/mail/InMemoryMessageIdMapper.java     |  23 ++-
 .../james/mailbox/store/MailboxMetaData.java       | 151 ----------------
 .../james/mailbox/store/StoreMailboxManager.java   |   4 +-
 .../james/mailbox/store/StoreMessageManager.java   |  16 +-
 .../mailbox/store/mail/AbstractMessageMapper.java  |   9 +-
 .../james/mailbox/store/mail/MailboxMapper.java    |   2 +-
 .../james/mailbox/store/mail/MessageMapper.java    |  12 +-
 .../store/search/ListeningMessageSearchIndex.java  |   9 +-
 .../store/search/SimpleMessageSearchIndex.java     |   8 +-
 .../store/AbstractCombinationManagerTest.java      |  20 +--
 .../mailbox/store/AbstractMessageManagerTest.java  |   4 +-
 .../StoreMailboxMessageResultIteratorTest.java     |   6 +-
 .../store/mail/model/MailboxMapperTest.java        |   5 +-
 .../store/mail/model/MessageMapperTest.java        |   9 +-
 .../mailbox/tools/copier/MailboxCopierTest.java    |   2 +-
 .../tools/indexer/ErrorRecoveryIndexationTask.java |   2 +-
 .../mailbox/tools/indexer/FullReindexingTask.java  |  11 +-
 .../tools/indexer/MessageIdReIndexingTask.java     |   2 +-
 .../mailbox/tools/indexer/ReIndexerPerformer.java  | 195 +++++++++------------
 .../tools/indexer/SingleMailboxReindexingTask.java |   3 +-
 .../tools/indexer/SingleMessageReindexingTask.java |  15 +-
 .../mailbox/tools/indexer/UserReindexingTask.java  |  11 +-
 .../imap/processor/AbstractMailboxProcessor.java   |  14 +-
 .../imap/processor/AbstractSelectionProcessor.java |  24 +--
 .../james/imap/processor/CloseProcessor.java       |   2 +-
 .../james/imap/processor/ExpungeProcessor.java     |   6 +-
 .../james/imap/processor/GetACLProcessor.java      |   6 +-
 .../james/imap/processor/SearchProcessor.java      |   4 +-
 .../james/imap/processor/StatusProcessor.java      |  26 +--
 .../james/imap/processor/StoreProcessor.java       |   8 +-
 .../james/imap/processor/fetch/FetchProcessor.java |   4 +-
 .../imap/processor/DeleteACLProcessorTest.java     |   8 +-
 .../james/imap/processor/GetACLProcessorTest.java  |   8 +-
 .../imap/processor/ListRightsProcessorTest.java    |   8 +-
 .../james/imap/processor/SetACLProcessorTest.java  |   6 +-
 .../org/apache/james/modules/ACLProbeImpl.java     |   2 +-
 .../modules/server/CamelMailetContainerModule.java |   5 +
 .../apache/james/jmap/draft/JMAPCommonModule.java  |   4 -
 .../adapter/mailbox/MailboxManagementTest.java     |  26 +--
 .../adapter/mailbox/ReIndexerManagementTest.java   |   7 +-
 .../AutomaticallySentMailDetectorImpl.java         |   6 +-
 .../AutomaticallySentMailDetectorImplTest.java     |   3 +-
 .../event/PropagateLookupRightListenerTest.java    |  28 +--
 .../distributed/DistributedTaskManagerTest.java    |  11 +-
 .../apache/james/task/SerialTaskManagerWorker.java |  60 ++++---
 .../james/task/SerialTaskManagerWorkerTest.java    |  40 ++++-
 60 files changed, 697 insertions(+), 605 deletions(-)
 delete mode 100644 mailbox/store/src/main/java/org/apache/james/mailbox/store/MailboxMetaData.java
 rename {mailet/base/src/main/java/org/apache/mailet/base => server/mailet/mailetcontainer-camel/src/main/java/org/apache/james/mailetcontainer}/AutomaticallySentMailDetectorImpl.java (95%)
 rename {mailet/base/src/test/java/org/apache/mailet/base => server/mailet/mailetcontainer-camel/src/test/java/org/apache/james/mailetcontainer}/AutomaticallySentMailDetectorImplTest.java (99%)


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[james-project] 09/15: JAMES-3172 DistributedTaskManagerTest: Event serializer need to handle nested types

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit ba939ee204f82e8ce516122ced65827cca4ddd0a
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Fri May 8 05:59:13 2020 +0200

    JAMES-3172 DistributedTaskManagerTest: Event serializer need to handle nested types
---
 .../eventsourcing/distributed/DistributedTaskManagerTest.java | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/server/task/task-distributed/src/test/java/org/apache/james/task/eventsourcing/distributed/DistributedTaskManagerTest.java b/server/task/task-distributed/src/test/java/org/apache/james/task/eventsourcing/distributed/DistributedTaskManagerTest.java
index 0b1ab59..db84283 100644
--- a/server/task/task-distributed/src/test/java/org/apache/james/task/eventsourcing/distributed/DistributedTaskManagerTest.java
+++ b/server/task/task-distributed/src/test/java/org/apache/james/task/eventsourcing/distributed/DistributedTaskManagerTest.java
@@ -80,6 +80,7 @@ import org.junit.jupiter.api.extension.RegisterExtension;
 import com.google.common.collect.ImmutableBiMap;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Sets;
+
 import reactor.rabbitmq.Sender;
 
 class DistributedTaskManagerTest implements TaskManagerContract {
@@ -169,7 +170,11 @@ class DistributedTaskManagerTest implements TaskManagerContract {
         this.workQueueSupplier = new TrackedRabbitMQWorkQueueSupplier(rabbitMQExtension.getSender(), rabbitMQExtension.getReceiverProvider(), taskSerializer);
         this.eventStore = eventStore;
         this.terminationSubscribers = new ArrayList<>();
-        this.eventSerializer = JsonEventSerializer.forModules(eventDtoModule).withoutNestedType();
+        this.eventSerializer = JsonEventSerializer.forModules(eventDtoModule)
+            .withNestedTypeModules(
+                Sets.union(
+                    ImmutableSet.of(ADDITIONAL_INFORMATION_MODULE),
+                    taskDTOModules));
     }
 
     @AfterEach
@@ -183,7 +188,9 @@ class DistributedTaskManagerTest implements TaskManagerContract {
     }
 
     EventSourcingTaskManager taskManager(Hostname hostname) {
-        RabbitMQTerminationSubscriber terminationSubscriber = new RabbitMQTerminationSubscriber(rabbitMQExtension.getSender(), rabbitMQExtension.getReceiverProvider(), eventSerializer);
+        RabbitMQTerminationSubscriber terminationSubscriber = new RabbitMQTerminationSubscriber(rabbitMQExtension.getSender(),
+            rabbitMQExtension.getReceiverProvider(),
+            eventSerializer);
         terminationSubscribers.add(terminationSubscriber);
         terminationSubscriber.start();
         return new EventSourcingTaskManager(workQueueSupplier, eventStore, executionDetailsProjection, hostname, terminationSubscriber);


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[james-project] 05/15: [Refactoring] Slightly enhance MaildirMailboxMapper::visitUsersForMailboxList

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 810dca40cddb0cb59622e82dd6b9e5ad52fa6a36
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Wed May 6 13:55:48 2020 +0700

    [Refactoring] Slightly enhance MaildirMailboxMapper::visitUsersForMailboxList
    
     - Method extraction
     - Use of MailboxPath::forUser
---
 .../mailbox/maildir/mail/MaildirMailboxMapper.java | 23 +++++++++++-----------
 1 file changed, 12 insertions(+), 11 deletions(-)

diff --git a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMailboxMapper.java b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMailboxMapper.java
index f5af09c..b0f2238 100644
--- a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMailboxMapper.java
+++ b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMailboxMapper.java
@@ -280,15 +280,10 @@ public class MaildirMailboxMapper extends NonTransactionalMapper implements Mail
 
     private List<Mailbox> visitUsersForMailboxList(File domain, File[] users) throws MailboxException {
         ImmutableList.Builder<Mailbox> mailboxList = ImmutableList.builder();
-        String userName = null;
         
         for (File user: users) {
-            if (domain == null) {
-                userName = user.getName();
-            } else {
-                userName = user.getName() + "@" + domain.getName();
-            }
-            
+            String userName = retrieveUsername(domain, user);
+
             // Special case for INBOX: Let's use the user's folder.
             MailboxPath inboxMailboxPath = MailboxPath.forUser(Username.of(userName), MailboxConstants.INBOX);
 
@@ -297,21 +292,27 @@ public class MaildirMailboxMapper extends NonTransactionalMapper implements Mail
             } catch (MailboxException e) {
                 //do nothing, we should still be able to list the mailboxes even if INBOX does not exist
             }
-
             
             // List all INBOX sub folders.
             File[] mailboxes = user.listFiles(pathname -> pathname.getName().startsWith("."));
             
             for (File mailbox: mailboxes) {
-                MailboxPath mailboxPath = new MailboxPath(MailboxConstants.USER_NAMESPACE, 
-                        Username.of(userName),
-                        mailbox.getName().substring(1));
+                MailboxPath mailboxPath = MailboxPath.forUser(Username.of(userName),
+                    mailbox.getName().substring(1));
                 mailboxList.add(maildirStore.loadMailbox(session, mailboxPath));
             }
         }
         return mailboxList.build();
     }
 
+    private String retrieveUsername(File domain, File user) {
+        if (domain == null) {
+            return user.getName();
+        } else {
+            return user.getName() + "@" + domain.getName();
+        }
+    }
+
     @Override
     public ACLDiff updateACL(Mailbox mailbox, MailboxACL.ACLCommand mailboxACLCommand) throws MailboxException {
         MaildirFolder folder = maildirStore.createMaildirFolder(mailbox);


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[james-project] 03/15: JAMES-3149 Reactify PreDeletion hooks running

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 1bb233be776e4f047108d3336bab738662ebdea0
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Tue May 5 09:09:24 2020 +0700

    JAMES-3149 Reactify PreDeletion hooks running
---
 .../apache/james/mailbox/store/StoreMessageManager.java    | 14 ++++++--------
 1 file changed, 6 insertions(+), 8 deletions(-)

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 8708344..090f488 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
@@ -679,19 +679,17 @@ public class StoreMessageManager implements MessageManager {
 
     }
 
-    private void runPredeletionHooks(List<MessageUid> uids, MailboxSession session) throws MailboxException {
+    private void runPredeletionHooks(List<MessageUid> uids, MailboxSession session) {
         MessageMapper messageMapper = mapperFactory.getMessageMapper(session);
 
-        DeleteOperation deleteOperation = Flux.fromIterable(MessageRange.toRanges(uids))
+        Mono<DeleteOperation> deleteOperation = Flux.fromIterable(MessageRange.toRanges(uids))
             .publishOn(Schedulers.elastic())
-            .flatMap(range -> Mono.fromCallable(() -> messageMapper.findInMailbox(mailbox, range, FetchType.Metadata, UNLIMITED))
-                .flatMapMany(iterator -> Flux.fromStream(Iterators.toStream(iterator))))
+            .flatMap(range -> messageMapper.findInMailboxReactive(mailbox, range, FetchType.Metadata, UNLIMITED))
             .map(mailboxMessage -> MetadataWithMailboxId.from(mailboxMessage.metaData(), mailboxMessage.getMailboxId()))
             .collect(Guavate.toImmutableList())
-            .map(DeleteOperation::from)
-            .block();
+            .map(DeleteOperation::from);
 
-        preDeletionHooks.runHooks(deleteOperation).block();
+        deleteOperation.flatMap(preDeletionHooks::runHooks).block();
     }
 
     @Override
@@ -851,7 +849,7 @@ public class StoreMessageManager implements MessageManager {
         final MessageMapper messageMapper = mapperFactory.getMessageMapper(session);
 
         return messageMapper.execute(
-            () -> Iterators.toStream(messageMapper.listAllMessageUids(mailbox)));
+            () -> messageMapper.listAllMessageUids(mailbox).toStream());
     }
 
     @Override


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[james-project] 15/15: JAMES-3178 AutomaticSentMail detector should bypass javax.mail parsing

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit af547499537ed3089d2e990e1b4a3abab7fb22e0
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Mon May 11 13:51:18 2020 +0700

    JAMES-3178 AutomaticSentMail detector should bypass javax.mail parsing
    
    We rely on `mime4j` for mail content parsing, we should bypass the implicit parsing and sanitizing performed in `MimeMessage::getInputStream`.
    
    As the JavaX.mail javadoc says:
    
    ```
    Return a decoded input stream for this Message's "content".
    ```
    
    To do so, we can use MimeMessageInputStream in james-server-core, wich also implies relocating `AutomaticallySentMailDetectorImpl`.
    
    Note that javax parsing is less robust than mime4j one, leading to the following exception:
    
    ```
    javax.mail.MessagingException: Can not read content
    	at org.apache.mailet.base.AutomaticallySentMailDetectorImpl.isMdnSentAutomatically(AutomaticallySentMailDetectorImpl.java:107)
    	at org.apache.mailet.base.AutomaticallySentMailDetectorImpl.isAutomaticallySent(AutomaticallySentMailDetectorImpl.java:54)
    	at org.apache.james.jmap.mailet.VacationMailet.service(VacationMailet.java:72)
    	at org.apache.james.mailetcontainer.impl.camel.CamelProcessor.process(CamelProcessor.java:77)
    [...]
    Caused by: java.io.IOException: Unknown encoding: 8bitMIME-version
    	at javax.mail.internet.MimePartDataSource.getInputStream(MimePartDataSource.java:116)
    	at javax.activation.DataHandler.getInputStream(DataHandler.java:238)
    	at javax.mail.internet.MimeMessage.getInputStream(MimeMessage.java:1395)
    	at org.apache.james.server.core.MimeMessageCopyOnWriteProxy.getInputStream(MimeMessageCopyOnWriteProxy.java:265)
    	at org.apache.mailet.base.AutomaticallySentMailDetectorImpl.isMdnSentAutomatically(AutomaticallySentMailDetectorImpl.java:103)
    	... 92 common frames omitted
    Caused by: javax.mail.MessagingException: Unknown encoding: 8bitMIME-version
    	at javax.mail.internet.MimeUtility.decode(MimeUtility.java:405)
    	at javax.mail.internet.MimePartDataSource.getInputStream(MimePartDataSource.java:109)
    ```
---
 .../org/apache/james/modules/server/CamelMailetContainerModule.java | 5 +++++
 .../src/main/java/org/apache/james/jmap/draft/JMAPCommonModule.java | 4 ----
 .../james/mailetcontainer}/AutomaticallySentMailDetectorImpl.java   | 6 ++++--
 .../mailetcontainer}/AutomaticallySentMailDetectorImplTest.java     | 3 ++-
 4 files changed, 11 insertions(+), 7 deletions(-)

diff --git a/server/container/guice/mailet/src/main/java/org/apache/james/modules/server/CamelMailetContainerModule.java b/server/container/guice/mailet/src/main/java/org/apache/james/modules/server/CamelMailetContainerModule.java
index f9f4412..532c1cd 100644
--- a/server/container/guice/mailet/src/main/java/org/apache/james/modules/server/CamelMailetContainerModule.java
+++ b/server/container/guice/mailet/src/main/java/org/apache/james/modules/server/CamelMailetContainerModule.java
@@ -32,6 +32,7 @@ import org.apache.commons.configuration2.ex.ConfigurationException;
 import org.apache.commons.configuration2.ex.ConfigurationRuntimeException;
 import org.apache.commons.configuration2.tree.ImmutableNode;
 import org.apache.james.lifecycle.api.Startable;
+import org.apache.james.mailetcontainer.AutomaticallySentMailDetectorImpl;
 import org.apache.james.mailetcontainer.api.MailProcessor;
 import org.apache.james.mailetcontainer.api.MailetLoader;
 import org.apache.james.mailetcontainer.api.MatcherLoader;
@@ -54,6 +55,7 @@ import org.apache.james.utils.SpoolerProbe;
 import org.apache.mailet.Mailet;
 import org.apache.mailet.MailetContext;
 import org.apache.mailet.Matcher;
+import org.apache.mailet.base.AutomaticallySentMailDetector;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -88,6 +90,9 @@ public class CamelMailetContainerModule extends AbstractModule {
         bind(JamesMailetContext.class).in(Scopes.SINGLETON);
         bind(MailetContext.class).to(JamesMailetContext.class);
 
+        bind(AutomaticallySentMailDetectorImpl.class).in(Scopes.SINGLETON);
+        bind(AutomaticallySentMailDetector.class).to(AutomaticallySentMailDetectorImpl.class);
+
         bind(MailetLoader.class).to(GuiceMailetLoader.class);
         bind(MatcherLoader.class).to(GuiceMatcherLoader.class);
 
diff --git a/server/container/guice/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/JMAPCommonModule.java b/server/container/guice/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/JMAPCommonModule.java
index fdc42cc..242ae57 100644
--- a/server/container/guice/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/JMAPCommonModule.java
+++ b/server/container/guice/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/JMAPCommonModule.java
@@ -51,8 +51,6 @@ import org.apache.james.util.date.ZonedDateTimeProvider;
 import org.apache.james.util.mime.MessageContentExtractor;
 import org.apache.james.utils.InitializationOperation;
 import org.apache.james.utils.InitilizationOperationBuilder;
-import org.apache.mailet.base.AutomaticallySentMailDetector;
-import org.apache.mailet.base.AutomaticallySentMailDetectorImpl;
 
 import com.google.common.collect.ImmutableList;
 import com.google.inject.AbstractModule;
@@ -73,7 +71,6 @@ public class JMAPCommonModule extends AbstractModule {
         bind(SignedTokenManager.class).in(Scopes.SINGLETON);
         bind(AccessTokenManagerImpl.class).in(Scopes.SINGLETON);
         bind(MailSpool.class).in(Scopes.SINGLETON);
-        bind(AutomaticallySentMailDetectorImpl.class).in(Scopes.SINGLETON);
         bind(MailboxFactory.class).in(Scopes.SINGLETON);
 
         bind(MessageFullViewFactory.class).in(Scopes.SINGLETON);
@@ -88,7 +85,6 @@ public class JMAPCommonModule extends AbstractModule {
         bind(ZonedDateTimeProvider.class).to(DefaultZonedDateTimeProvider.class);
         bind(SimpleTokenManager.class).to(SignedTokenManager.class);
         bind(SimpleTokenFactory.class).to(SignedTokenFactory.class);
-        bind(AutomaticallySentMailDetector.class).to(AutomaticallySentMailDetectorImpl.class);
 
         bindConstant().annotatedWith(Names.named(AccessTokenRepository.TOKEN_EXPIRATION_IN_MS)).to(DEFAULT_TOKEN_EXPIRATION_IN_MS);
         bind(AccessTokenManager.class).to(AccessTokenManagerImpl.class);
diff --git a/mailet/base/src/main/java/org/apache/mailet/base/AutomaticallySentMailDetectorImpl.java b/server/mailet/mailetcontainer-camel/src/main/java/org/apache/james/mailetcontainer/AutomaticallySentMailDetectorImpl.java
similarity index 95%
rename from mailet/base/src/main/java/org/apache/mailet/base/AutomaticallySentMailDetectorImpl.java
rename to server/mailet/mailetcontainer-camel/src/main/java/org/apache/james/mailetcontainer/AutomaticallySentMailDetectorImpl.java
index 8953599..40e1cfa 100644
--- a/mailet/base/src/main/java/org/apache/mailet/base/AutomaticallySentMailDetectorImpl.java
+++ b/server/mailet/mailetcontainer-camel/src/main/java/org/apache/james/mailetcontainer/AutomaticallySentMailDetectorImpl.java
@@ -17,7 +17,7 @@
  * under the License.                                           *
  ****************************************************************/
 
-package org.apache.mailet.base;
+package org.apache.james.mailetcontainer;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -33,7 +33,9 @@ import org.apache.james.mime4j.parser.AbstractContentHandler;
 import org.apache.james.mime4j.parser.MimeStreamParser;
 import org.apache.james.mime4j.stream.BodyDescriptor;
 import org.apache.james.mime4j.stream.MimeConfig;
+import org.apache.james.server.core.MimeMessageInputStream;
 import org.apache.mailet.Mail;
+import org.apache.mailet.base.AutomaticallySentMailDetector;
 
 public class AutomaticallySentMailDetectorImpl implements AutomaticallySentMailDetector {
 
@@ -100,7 +102,7 @@ public class AutomaticallySentMailDetectorImpl implements AutomaticallySentMailD
             .build());
         parser.setContentHandler(createMdnContentHandler(resultCollector));
         try {
-            parser.parse(mail.getMessage().getInputStream());
+            parser.parse(new MimeMessageInputStream(mail.getMessage()));
         } catch (MimeException e) {
             throw new MessagingException("Can not parse Mime", e);
         } catch (IOException e) {
diff --git a/mailet/base/src/test/java/org/apache/mailet/base/AutomaticallySentMailDetectorImplTest.java b/server/mailet/mailetcontainer-camel/src/test/java/org/apache/james/mailetcontainer/AutomaticallySentMailDetectorImplTest.java
similarity index 99%
rename from mailet/base/src/test/java/org/apache/mailet/base/AutomaticallySentMailDetectorImplTest.java
rename to server/mailet/mailetcontainer-camel/src/test/java/org/apache/james/mailetcontainer/AutomaticallySentMailDetectorImplTest.java
index d65422b..b827b57 100644
--- a/mailet/base/src/test/java/org/apache/mailet/base/AutomaticallySentMailDetectorImplTest.java
+++ b/server/mailet/mailetcontainer-camel/src/test/java/org/apache/james/mailetcontainer/AutomaticallySentMailDetectorImplTest.java
@@ -17,7 +17,7 @@
  * under the License.                                           *
  ****************************************************************/
 
-package org.apache.mailet.base;
+package org.apache.james.mailetcontainer;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
@@ -34,6 +34,7 @@ import javax.mail.util.ByteArrayDataSource;
 
 import org.apache.james.core.builder.MimeMessageBuilder;
 import org.apache.james.util.MimeMessageUtil;
+import org.apache.mailet.base.MailAddressFixture;
 import org.apache.mailet.base.test.FakeMail;
 import org.junit.Test;
 


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[james-project] 12/15: [Refactoring] POJOify MailboxMetadata

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 712ebbd1dd270cb64af98e7cb303963f3e3efa4c
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Fri May 8 17:22:10 2020 +0700

    [Refactoring] POJOify MailboxMetadata
---
 .../org/apache/james/mailbox/MessageManager.java   | 164 +++++++++++++++------
 .../apache/james/mailbox/MailboxManagerTest.java   |  16 +-
 .../manager/QuotaMessageManagerContract.java       |   4 +-
 .../james/mailbox/store/MailboxMetaData.java       | 151 -------------------
 .../james/mailbox/store/StoreMessageManager.java   |   2 +-
 .../store/AbstractCombinationManagerTest.java      |  20 +--
 .../mailbox/store/AbstractMessageManagerTest.java  |   4 +-
 .../mailbox/tools/copier/MailboxCopierTest.java    |   2 +-
 .../imap/processor/AbstractMailboxProcessor.java   |  14 +-
 .../imap/processor/AbstractSelectionProcessor.java |  24 +--
 .../james/imap/processor/CloseProcessor.java       |   2 +-
 .../james/imap/processor/ExpungeProcessor.java     |   6 +-
 .../james/imap/processor/GetACLProcessor.java      |   6 +-
 .../james/imap/processor/SearchProcessor.java      |   4 +-
 .../james/imap/processor/StatusProcessor.java      |  26 ++--
 .../james/imap/processor/StoreProcessor.java       |   8 +-
 .../james/imap/processor/fetch/FetchProcessor.java |   4 +-
 .../imap/processor/DeleteACLProcessorTest.java     |   8 +-
 .../james/imap/processor/GetACLProcessorTest.java  |   8 +-
 .../imap/processor/ListRightsProcessorTest.java    |   8 +-
 .../james/imap/processor/SetACLProcessorTest.java  |   6 +-
 .../org/apache/james/modules/ACLProbeImpl.java     |   2 +-
 .../event/PropagateLookupRightListenerTest.java    |  28 ++--
 23 files changed, 222 insertions(+), 295 deletions(-)

diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/MessageManager.java b/mailbox/api/src/main/java/org/apache/james/mailbox/MessageManager.java
index 2f675c1..975c777 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/MessageManager.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/MessageManager.java
@@ -23,6 +23,7 @@ import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.EnumSet;
 import java.util.Iterator;
@@ -55,6 +56,7 @@ import org.apache.james.mime4j.dom.Message;
 import org.apache.james.mime4j.message.DefaultMessageWriter;
 
 import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableList;
 
 /**
  * Interface which represent a Mailbox
@@ -82,7 +84,7 @@ public interface MessageManager {
     /**
      * Return if the Mailbox is writable
      * @deprecated use
-     *             {@link #getMetaData(boolean, MailboxSession, org.apache.james.mailbox.MessageManager.MetaData.FetchGroup)}
+     *             {@link #getMetaData(boolean, MailboxSession, MailboxMetaData.FetchGroup)}
      */
     @Deprecated
     boolean isWriteable(MailboxSession session) throws MailboxException;
@@ -92,7 +94,7 @@ public interface MessageManager {
      * way.
      *
      * @deprecated use
-     *             {@link #getMetaData(boolean, MailboxSession, org.apache.james.mailbox.MessageManager.MetaData.FetchGroup)}
+     *             {@link #getMetaData(boolean, MailboxSession, MailboxMetaData.FetchGroup)}
      */
     boolean isModSeqPermanent(MailboxSession session);
 
@@ -353,21 +355,21 @@ public interface MessageManager {
      *            describes which optional data should be returned
      * @return metadata view filtered for the session's user, not null
      */
-    MetaData getMetaData(boolean resetRecent, MailboxSession mailboxSession, MessageManager.MetaData.FetchGroup fetchGroup) throws MailboxException;
+    MailboxMetaData getMetaData(boolean resetRecent, MailboxSession mailboxSession, MailboxMetaData.FetchGroup fetchGroup) throws MailboxException;
 
     /**
      * Meta data about the current state of the mailbox.
      */
-    interface MetaData {
+    class MailboxMetaData {
 
         /**
          * Describes the optional data types which will get set in the
-         * {@link MetaData}.
+         * {@link MailboxMetaData}.
          * 
          * These are always set: - HIGHESTMODSEQ - PERMANENTFLAGS - UIDNEXT -
          * UIDVALIDITY - MODSEQPERMANET - WRITABLE
          */
-        enum FetchGroup {
+        public enum FetchGroup {
 
             /**
              * Only include the message and recent count
@@ -390,104 +392,180 @@ public interface MessageManager {
             NO_COUNT
         }
 
-        /**
-         * Gets the UIDs of recent messages if requested or an empty
-         * {@link List} otherwise.
-         * 
-         * @return the uids flagged RECENT in this mailbox,
-         */
-        List<MessageUid> getRecent();
+        public static MailboxMetaData sensibleInformationFree(MailboxACL resolvedAcl, UidValidity uidValidity, boolean writeable, boolean modSeqPermanent) throws MailboxException {
+            ImmutableList<MessageUid> recents = ImmutableList.of();
+            MessageUid uidNext = MessageUid.MIN_VALUE;
+            ModSeq highestModSeq = ModSeq.first();
+            long messageCount = 0L;
+            long unseenCount = 0L;
+            MessageUid firstUnseen = null;
+            return new MailboxMetaData(
+                recents,
+                new Flags(),
+                uidValidity,
+                uidNext,
+                highestModSeq,
+                messageCount,
+                unseenCount,
+                firstUnseen,
+                writeable,
+                modSeqPermanent,
+                resolvedAcl);
+        }
+
+        private final long recentCount;
+        private final List<MessageUid> recent;
+        private final Flags permanentFlags;
+        private final UidValidity uidValidity;
+        private final MessageUid nextUid;
+        private final long messageCount;
+        private final long unseenCount;
+        private final MessageUid firstUnseen;
+        private final boolean writeable;
+        private final ModSeq highestModSeq;
+        private final boolean modSeqPermanent;
+        private final MailboxACL acl;
+
+        public MailboxMetaData(List<MessageUid> recent, Flags permanentFlags, UidValidity uidValidity, MessageUid uidNext, ModSeq highestModSeq, long messageCount, long unseenCount, MessageUid firstUnseen, boolean writeable, boolean modSeqPermanent, MailboxACL acl) {
+            this.recent = Optional.ofNullable(recent).orElseGet(ArrayList::new);
+            this.highestModSeq = highestModSeq;
+            this.recentCount = this.recent.size();
+
+            this.permanentFlags = permanentFlags;
+            this.uidValidity = uidValidity;
+            this.nextUid = uidNext;
+            this.messageCount = messageCount;
+            this.unseenCount = unseenCount;
+            this.firstUnseen = firstUnseen;
+            this.writeable = writeable;
+            this.modSeqPermanent = modSeqPermanent;
+            this.acl = acl;
+        }
 
         /**
          * Gets the number of recent messages.
-         * 
+         *
          * @return the number of messages flagged RECENT in this mailbox
          */
-        long countRecent();
+        public long countRecent() {
+            return recentCount;
+        }
 
         /**
          * Gets the flags which can be stored by this mailbox.
-         * 
+         *
          * @return Flags that can be stored
          */
-        Flags getPermanentFlags();
+        public Flags getPermanentFlags() {
+            return permanentFlags;
+        }
+
+
+        /**
+         * Gets the UIDs of recent messages if requested or an empty
+         * {@link List} otherwise.
+         *
+         * @return the uids flagged RECENT in this mailbox,
+         */
+        public List<MessageUid> getRecent() {
+            return recent;
+        }
 
         /**
          * Gets the UIDVALIDITY.
-         * 
+         *
          * @return UIDVALIDITY
          */
-        UidValidity getUidValidity();
+        public UidValidity getUidValidity() {
+            return uidValidity;
+        }
 
         /**
          * Gets the next UID predicted. The returned UID is not guaranteed to be
          * the one that is assigned to the next message. Its only guaranteed
          * that it will be at least equals or bigger then the value
-         * 
+         *
          * @return the uid that will be assigned to the next appended message
          */
-        MessageUid getUidNext();
-
-        /**
-         * Return the highest mod-sequence for the mailbox. If this value has
-         * changed till the last check you can be sure that some changes where
-         * happen on the mailbox
-         * 
-         * @return higestModSeq
-         */
-        ModSeq getHighestModSeq();
+        public MessageUid getUidNext() {
+            return nextUid;
+        }
 
         /**
          * Gets the number of messages that this mailbox contains. This is an
          * optional property.<br>
-         * 
+         *
          * @return number of messages contained or -1 when this optional data
          *         has not be requested
-         * 
+         *
          */
-        long getMessageCount();
+        public long getMessageCount() {
+            return messageCount;
+        }
 
         /**
          * Gets the number of unseen messages contained in this mailbox. This is
          * an optional property.<br>
-         * 
+         *
          * @return number of unseen messages contained or zero when this
          *         optional data has not been requested
          * @see FetchGroup#UNSEEN_COUNT
          */
-        long getUnseenCount();
+        public long getUnseenCount() {
+            return unseenCount;
+        }
 
         /**
          * Gets the UID of the first unseen message. This is an optional
          * property.<br>
-         * 
+         *
          * @return uid of the first unseen message, or null when there are no
          *         unseen messages
          * @see FetchGroup#FIRST_UNSEEN
          */
-        MessageUid getFirstUnseen();
+        public MessageUid getFirstUnseen() {
+            return firstUnseen;
+        }
 
         /**
          * Is this mailbox writable?
-         * 
+         *
          * @return true if read-write, false if read only
          */
-        boolean isWriteable();
+        public boolean isWriteable() {
+            return writeable;
+        }
+
+        /**
+         * Return the highest mod-sequence for the mailbox. If this value has
+         * changed till the last check you can be sure that some changes where
+         * happen on the mailbox
+         *
+         * @return higestModSeq
+         */
+        public ModSeq getHighestModSeq() {
+            return highestModSeq;
+        }
 
         /**
          * Return true if the mailbox does store the mod-sequences in a
          * permanent way
-         * 
+         *
          * @return permanent
          */
-        boolean isModSeqPermanent();
+        public boolean isModSeqPermanent() {
+            return modSeqPermanent;
+        }
+
 
         /**
          * Returns the ACL concerning this mailbox.
-         * 
+         *
          * @return acl
          */
-        MailboxACL getACL();
+        public MailboxACL getACL() {
+            return acl;
+        }
 
     }
 
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java b/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java
index 28f5f94..15ab35d 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java
@@ -1498,28 +1498,28 @@ public abstract class MailboxManagerTest<T extends MailboxManager> {
                     .build(message), session1);
 
             boolean resetRecent = false;
-            MessageManager.MetaData metaData = mailboxManager.getMailbox(inbox1, session2)
-                .getMetaData(resetRecent, session2, MessageManager.MetaData.FetchGroup.UNSEEN_COUNT);
+            MessageManager.MailboxMetaData metaData = mailboxManager.getMailbox(inbox1, session2)
+                .getMetaData(resetRecent, session2, MessageManager.MailboxMetaData.FetchGroup.UNSEEN_COUNT);
 
             assertSoftly(
                 softly -> {
                     softly.assertThat(metaData)
-                        .extracting(MessageManager.MetaData::getHighestModSeq)
+                        .extracting(MessageManager.MailboxMetaData::getHighestModSeq)
                         .isEqualTo(ModSeq.first());
                     softly.assertThat(metaData)
-                        .extracting(MessageManager.MetaData::getUidNext)
+                        .extracting(MessageManager.MailboxMetaData::getUidNext)
                         .isEqualTo(MessageUid.MIN_VALUE);
                     softly.assertThat(metaData)
-                        .extracting(MessageManager.MetaData::getMessageCount)
+                        .extracting(MessageManager.MailboxMetaData::getMessageCount)
                         .isEqualTo(0L);
                     softly.assertThat(metaData)
-                        .extracting(MessageManager.MetaData::getUnseenCount)
+                        .extracting(MessageManager.MailboxMetaData::getUnseenCount)
                         .isEqualTo(0L);
                     softly.assertThat(metaData)
-                        .extracting(MessageManager.MetaData::getRecent)
+                        .extracting(MessageManager.MailboxMetaData::getRecent)
                         .isEqualTo(ImmutableList.of());
                     softly.assertThat(metaData)
-                        .extracting(MessageManager.MetaData::getPermanentFlags)
+                        .extracting(MessageManager.MailboxMetaData::getPermanentFlags)
                         .isEqualTo(new Flags());
                 });
         }
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/manager/QuotaMessageManagerContract.java b/mailbox/api/src/test/java/org/apache/james/mailbox/manager/QuotaMessageManagerContract.java
index 5e5fdf9..94d6662 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/manager/QuotaMessageManagerContract.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/manager/QuotaMessageManagerContract.java
@@ -168,7 +168,7 @@ public interface QuotaMessageManagerContract<T extends MailboxManager> {
         }
 
         List<MessageUid> uids = provisionner.getMessageManager()
-            .getMetaData(true, provisionner.getSession(), MessageManager.MetaData.FetchGroup.UNSEEN_COUNT)
+            .getMetaData(true, provisionner.getSession(), MessageManager.MailboxMetaData.FetchGroup.UNSEEN_COUNT)
             .getRecent();
         provisionner.getMessageManager().delete(uids, provisionner.getSession());
         // We have suppressed at list one message. Ensure we can add an other message. If is impossible, an exception will be thrown.
@@ -191,7 +191,7 @@ public interface QuotaMessageManagerContract<T extends MailboxManager> {
         }
 
         List<MessageUid> uids = provisionner.getMessageManager()
-            .getMetaData(true, provisionner.getSession(), MessageManager.MetaData.FetchGroup.UNSEEN_COUNT)
+            .getMetaData(true, provisionner.getSession(), MessageManager.MailboxMetaData.FetchGroup.UNSEEN_COUNT)
             .getRecent();
         provisionner.getMessageManager().delete(uids, provisionner.getSession());
         // We have suppressed at list one message. Ensure we can add an other message. If is impossible, an exception will be thrown.
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/MailboxMetaData.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/MailboxMetaData.java
deleted file mode 100644
index 36410c6..0000000
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/MailboxMetaData.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one   *
- * or more contributor license agreements.  See the NOTICE file *
- * distributed with this work for additional information        *
- * regarding copyright ownership.  The ASF licenses this file   *
- * to you under the Apache License, Version 2.0 (the            *
- * "License"); you may not use this file except in compliance   *
- * with the License.  You may obtain a copy of the License at   *
- *                                                              *
- *   http://www.apache.org/licenses/LICENSE-2.0                 *
- *                                                              *
- * Unless required by applicable law or agreed to in writing,   *
- * software distributed under the License is distributed on an  *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
- * KIND, either express or implied.  See the License for the    *
- * specific language governing permissions and limitations      *
- * under the License.                                           *
- ****************************************************************/
-
-package org.apache.james.mailbox.store;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Optional;
-
-import javax.mail.Flags;
-
-import org.apache.james.mailbox.MessageManager;
-import org.apache.james.mailbox.MessageUid;
-import org.apache.james.mailbox.ModSeq;
-import org.apache.james.mailbox.exception.MailboxException;
-import org.apache.james.mailbox.model.MailboxACL;
-import org.apache.james.mailbox.model.UidValidity;
-
-import com.google.common.collect.ImmutableList;
-
-/**
- * Describes the current state of a mailbox.
- */
-public class MailboxMetaData implements MessageManager.MetaData {
-
-    public static MailboxMetaData sensibleInformationFree(MailboxACL resolvedAcl, UidValidity uidValidity, boolean writeable, boolean modSeqPermanent) throws MailboxException {
-        ImmutableList<MessageUid> recents = ImmutableList.of();
-        MessageUid uidNext = MessageUid.MIN_VALUE;
-        ModSeq highestModSeq = ModSeq.first();
-        long messageCount = 0L;
-        long unseenCount = 0L;
-        MessageUid firstUnseen = null;
-        return new MailboxMetaData(
-            recents,
-            new Flags(),
-            uidValidity,
-            uidNext,
-            highestModSeq,
-            messageCount,
-            unseenCount,
-            firstUnseen,
-            writeable,
-            modSeqPermanent,
-            resolvedAcl);
-    }
-
-    private final long recentCount;
-    private final List<MessageUid> recent;
-    private final Flags permanentFlags;
-    private final UidValidity uidValidity;
-    private final MessageUid nextUid;
-    private final long messageCount;
-    private final long unseenCount;
-    private final MessageUid firstUnseen;
-    private final boolean writeable;
-    private final ModSeq highestModSeq;
-    private final boolean modSeqPermanent;
-    private final MailboxACL acl;
-
-    public MailboxMetaData(List<MessageUid> recent, Flags permanentFlags, UidValidity uidValidity, MessageUid uidNext, ModSeq highestModSeq, long messageCount, long unseenCount, MessageUid firstUnseen, boolean writeable, boolean modSeqPermanent, MailboxACL acl) {
-        this.recent = Optional.ofNullable(recent).orElseGet(ArrayList::new);
-        this.highestModSeq = highestModSeq;
-        this.recentCount = this.recent.size();
-
-        this.permanentFlags = permanentFlags;
-        this.uidValidity = uidValidity;
-        this.nextUid = uidNext;
-        this.messageCount = messageCount;
-        this.unseenCount = unseenCount;
-        this.firstUnseen = firstUnseen;
-        this.writeable = writeable;
-        this.modSeqPermanent = modSeqPermanent;
-        this.acl = acl;
-    }
-
-    @Override
-    public long countRecent() {
-        return recentCount;
-    }
-
-    @Override
-    public Flags getPermanentFlags() {
-        return permanentFlags;
-    }
-
-    @Override
-    public List<MessageUid> getRecent() {
-        return recent;
-    }
-
-    @Override
-    public UidValidity getUidValidity() {
-        return uidValidity;
-    }
-
-    @Override
-    public MessageUid getUidNext() {
-        return nextUid;
-    }
-
-    @Override
-    public long getMessageCount() {
-        return messageCount;
-    }
-
-    @Override
-    public long getUnseenCount() {
-        return unseenCount;
-    }
-
-    @Override
-    public MessageUid getFirstUnseen() {
-        return firstUnseen;
-    }
-
-    @Override
-    public boolean isWriteable() {
-        return writeable;
-    }
-
-    @Override
-    public ModSeq getHighestModSeq() {
-        return highestModSeq;
-    }
-
-    @Override
-    public boolean isModSeqPermanent() {
-        return modSeqPermanent;
-    }
-
-    @Override
-    public MailboxACL getACL() {
-        return acl;
-    }
-}
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 090f488..c2d76d8 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
@@ -488,7 +488,7 @@ public class StoreMessageManager implements MessageManager {
     }
 
     @Override
-    public MetaData getMetaData(boolean resetRecent, MailboxSession mailboxSession, MetaData.FetchGroup fetchGroup) throws MailboxException {
+    public MailboxMetaData getMetaData(boolean resetRecent, MailboxSession mailboxSession, MailboxMetaData.FetchGroup fetchGroup) throws MailboxException {
         MailboxACL resolvedAcl = getResolvedAcl(mailboxSession);
         boolean hasReadRight = storeRightManager.hasRight(mailbox, MailboxACL.Right.Read, mailboxSession);
         if (!hasReadRight) {
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractCombinationManagerTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractCombinationManagerTest.java
index f106aa7..97dcf42 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractCombinationManagerTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractCombinationManagerTest.java
@@ -278,10 +278,10 @@ public abstract class AbstractCombinationManagerTest {
                 .withFlags(recent)
                 .build(mailContent), session).getId();
 
-        long mailbox2NextUid = messageManager2.getMetaData(true, session, MessageManager.MetaData.FetchGroup.UNSEEN_COUNT).getUidNext().asLong();
+        long mailbox2NextUid = messageManager2.getMetaData(true, session, MessageManager.MailboxMetaData.FetchGroup.UNSEEN_COUNT).getUidNext().asLong();
         messageIdManager.setInMailboxes(messageId.getMessageId(), ImmutableList.of(mailbox1.getMailboxId(), mailbox2.getMailboxId()), session);
 
-        List<MessageUid> messageUids = messageManager2.getMetaData(true, session, MessageManager.MetaData.FetchGroup.UNSEEN_COUNT).getRecent();
+        List<MessageUid> messageUids = messageManager2.getMetaData(true, session, MessageManager.MailboxMetaData.FetchGroup.UNSEEN_COUNT).getRecent();
 
         assertThat(messageUids).hasSize(1);
         assertThat(messageUids.get(0).asLong()).isGreaterThanOrEqualTo(mailbox2NextUid);
@@ -298,7 +298,7 @@ public abstract class AbstractCombinationManagerTest {
 
         messageIdManager.setInMailboxes(messageId, ImmutableList.of(mailbox1.getMailboxId(), mailbox2.getMailboxId()), session);
 
-        assertThat(messageManager2.getMetaData(true, session, MessageManager.MetaData.FetchGroup.FIRST_UNSEEN).countRecent()).isEqualTo(1);
+        assertThat(messageManager2.getMetaData(true, session, MessageManager.MailboxMetaData.FetchGroup.FIRST_UNSEEN).countRecent()).isEqualTo(1);
     }
 
     @Test
@@ -320,7 +320,7 @@ public abstract class AbstractCombinationManagerTest {
             .getUid()
             .asLong();
 
-        assertThat(messageManager2.getMetaData(true, session, MessageManager.MetaData.FetchGroup.FIRST_UNSEEN).getUidNext().asLong())
+        assertThat(messageManager2.getMetaData(true, session, MessageManager.MailboxMetaData.FetchGroup.FIRST_UNSEEN).getUidNext().asLong())
             .isGreaterThan(uid2);
     }
 
@@ -331,7 +331,7 @@ public abstract class AbstractCombinationManagerTest {
 
         messageIdManager.setInMailboxes(messageId, ImmutableList.of(mailbox1.getMailboxId(), mailbox2.getMailboxId()), session);
 
-        assertThat(messageManager2.getMetaData(true, session, MessageManager.MetaData.FetchGroup.FIRST_UNSEEN).getHighestModSeq().asLong()).isNotNegative();
+        assertThat(messageManager2.getMetaData(true, session, MessageManager.MailboxMetaData.FetchGroup.FIRST_UNSEEN).getHighestModSeq().asLong()).isNotNegative();
     }
 
     @Test
@@ -341,7 +341,7 @@ public abstract class AbstractCombinationManagerTest {
 
         messageIdManager.setInMailboxes(messageId, ImmutableList.of(mailbox1.getMailboxId(), mailbox2.getMailboxId()), session);
 
-        assertThat(messageManager2.getMetaData(true, session, MessageManager.MetaData.FetchGroup.FIRST_UNSEEN).getMessageCount()).isEqualTo(1);
+        assertThat(messageManager2.getMetaData(true, session, MessageManager.MailboxMetaData.FetchGroup.FIRST_UNSEEN).getMessageCount()).isEqualTo(1);
     }
 
     @Test
@@ -351,7 +351,7 @@ public abstract class AbstractCombinationManagerTest {
 
         messageIdManager.setInMailboxes(messageId, ImmutableList.of(mailbox1.getMailboxId(), mailbox2.getMailboxId()), session);
 
-        assertThat(messageManager2.getMetaData(true, session, MessageManager.MetaData.FetchGroup.UNSEEN_COUNT).getUnseenCount()).isEqualTo(1);
+        assertThat(messageManager2.getMetaData(true, session, MessageManager.MailboxMetaData.FetchGroup.UNSEEN_COUNT).getUnseenCount()).isEqualTo(1);
     }
 
     @Test
@@ -360,7 +360,7 @@ public abstract class AbstractCombinationManagerTest {
 
         messageIdManager.setInMailboxes(messageId.getMessageId(), ImmutableList.of(mailbox1.getMailboxId(), mailbox2.getMailboxId()), session);
 
-        assertThat(messageManager2.getMetaData(true, session, MessageManager.MetaData.FetchGroup.FIRST_UNSEEN).getFirstUnseen()).isEqualTo(messageId.getUid());
+        assertThat(messageManager2.getMetaData(true, session, MessageManager.MailboxMetaData.FetchGroup.FIRST_UNSEEN).getFirstUnseen()).isEqualTo(messageId.getUid());
     }
 
     @Test
@@ -371,7 +371,7 @@ public abstract class AbstractCombinationManagerTest {
 
         messageIdManager.setFlags(newFlag, FlagsUpdateMode.ADD, messageId, ImmutableList.of(mailbox1.getMailboxId(), mailbox2.getMailboxId()), session);
 
-        assertThat(messageManager1.getMetaData(true, session, MessageManager.MetaData.FetchGroup.UNSEEN_COUNT).getUnseenCount()).isEqualTo(1);
+        assertThat(messageManager1.getMetaData(true, session, MessageManager.MailboxMetaData.FetchGroup.UNSEEN_COUNT).getUnseenCount()).isEqualTo(1);
     }
 
     @Test
@@ -381,7 +381,7 @@ public abstract class AbstractCombinationManagerTest {
 
         messageIdManager.setFlags(newFlag, FlagsUpdateMode.ADD, messageId.getMessageId(), ImmutableList.of(mailbox1.getMailboxId(), mailbox2.getMailboxId()), session);
 
-        assertThat(messageManager1.getMetaData(true, session, MessageManager.MetaData.FetchGroup.FIRST_UNSEEN).getFirstUnseen()).isEqualTo(messageId.getUid());
+        assertThat(messageManager1.getMetaData(true, session, MessageManager.MailboxMetaData.FetchGroup.FIRST_UNSEEN).getFirstUnseen()).isEqualTo(messageId.getUid());
     }
 
     @Test
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageManagerTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageManagerTest.java
index 3c23ef3..c952ac7 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageManagerTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageManagerTest.java
@@ -58,7 +58,7 @@ public abstract class AbstractMessageManagerTest {
         mailboxManager.applyRightsCommand(INBOX_ALICE, MailboxACL.command().forUser(CEDRIC).rights(MailboxACL.Right.Read).asAddition(), aliceSession);
         MessageManager messageManager = mailboxManager.getMailbox(INBOX_ALICE, aliceSession);
 
-        MessageManager.MetaData actual = messageManager.getMetaData(NO_RESET_RECENT, aliceSession, MessageManager.MetaData.FetchGroup.NO_COUNT);
+        MessageManager.MailboxMetaData actual = messageManager.getMetaData(NO_RESET_RECENT, aliceSession, MessageManager.MailboxMetaData.FetchGroup.NO_COUNT);
         assertThat(actual.getACL().getEntries()).containsKeys(MailboxACL.EntryKey.createUserEntryKey(BOB), MailboxACL.EntryKey.createUserEntryKey(CEDRIC));
     }
 
@@ -68,7 +68,7 @@ public abstract class AbstractMessageManagerTest {
         mailboxManager.applyRightsCommand(INBOX_ALICE, MailboxACL.command().forUser(CEDRIC).rights(MailboxACL.Right.Read).asAddition(), aliceSession);
         MessageManager messageManager = mailboxManager.getMailbox(INBOX_ALICE, aliceSession);
 
-        MessageManager.MetaData actual = messageManager.getMetaData(NO_RESET_RECENT, bobSession, MessageManager.MetaData.FetchGroup.NO_COUNT);
+        MessageManager.MailboxMetaData actual = messageManager.getMetaData(NO_RESET_RECENT, bobSession, MessageManager.MailboxMetaData.FetchGroup.NO_COUNT);
         assertThat(actual.getACL().getEntries()).containsOnlyKeys(MailboxACL.EntryKey.createUserEntryKey(BOB));
     }
 
diff --git a/mailbox/tools/copier/src/test/java/org/apache/james/mailbox/tools/copier/MailboxCopierTest.java b/mailbox/tools/copier/src/test/java/org/apache/james/mailbox/tools/copier/MailboxCopierTest.java
index 06dc53e..5efb540 100644
--- a/mailbox/tools/copier/src/test/java/org/apache/james/mailbox/tools/copier/MailboxCopierTest.java
+++ b/mailbox/tools/copier/src/test/java/org/apache/james/mailbox/tools/copier/MailboxCopierTest.java
@@ -27,7 +27,7 @@ import org.apache.james.core.Username;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageManager;
-import org.apache.james.mailbox.MessageManager.MetaData.FetchGroup;
+import org.apache.james.mailbox.MessageManager.MailboxMetaData.FetchGroup;
 import org.apache.james.mailbox.exception.BadCredentialsException;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.inmemory.manager.InMemoryIntegrationResources;
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java
index 8377e05..a5f2b4a 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java
@@ -54,7 +54,7 @@ import org.apache.james.imap.processor.base.AbstractChainedProcessor;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageManager;
-import org.apache.james.mailbox.MessageManager.MetaData;
+import org.apache.james.mailbox.MessageManager.MailboxMetaData;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.NullableMessageSequenceNumber;
@@ -115,7 +115,7 @@ public abstract class AbstractMailboxProcessor<R extends ImapRequest> extends Ab
         responder.respond(new FlagsResponse(selected.getApplicableFlags()));
     }
 
-    protected void permanentFlags(Responder responder, MessageManager.MetaData metaData, SelectedMailbox selected) {
+    protected void permanentFlags(Responder responder, MailboxMetaData metaData, SelectedMailbox selected) {
         final Flags permanentFlags = metaData.getPermanentFlags();
         if (permanentFlags.contains(Flags.Flag.USER)) {
             permanentFlags.add(selected.getApplicableFlags());
@@ -197,7 +197,7 @@ public abstract class AbstractMailboxProcessor<R extends ImapRequest> extends Ab
         try {
             // To be lazily initialized only if needed, which is in minority of cases.
             MessageManager messageManager = null;
-            MetaData metaData = null;
+            MailboxMetaData metaData = null;
             final MailboxSession mailboxSession = session.getMailboxSession();
 
             // Check if we need to send a FLAGS and PERMANENTFLAGS response before the FETCH response
@@ -206,7 +206,7 @@ public abstract class AbstractMailboxProcessor<R extends ImapRequest> extends Ab
             if (selected.hasNewApplicableFlags()) {
                 messageManager = getMailbox(session, selected);
                 flags(responder, selected);
-                metaData = messageManager.getMetaData(false, mailboxSession, MessageManager.MetaData.FetchGroup.NO_COUNT);
+                metaData = messageManager.getMetaData(false, mailboxSession, MailboxMetaData.FetchGroup.NO_COUNT);
 
                 permanentFlags(responder, metaData, selected);
                 selected.resetNewApplicableFlags();
@@ -219,7 +219,7 @@ public abstract class AbstractMailboxProcessor<R extends ImapRequest> extends Ab
                     messageManager = getMailbox(session, selected);
                 }
                 if (metaData == null) {
-                    metaData = messageManager.getMetaData(false, mailboxSession, MessageManager.MetaData.FetchGroup.NO_COUNT);
+                    metaData = messageManager.getMetaData(false, mailboxSession, MailboxMetaData.FetchGroup.NO_COUNT);
                 }
                 boolean isModSeqPermanent = metaData.isModSeqPermanent();
                 while (ranges.hasNext()) {
@@ -281,7 +281,7 @@ public abstract class AbstractMailboxProcessor<R extends ImapRequest> extends Ab
         }
     }
 
-    protected void condstoreEnablingCommand(ImapSession session, Responder responder, MetaData metaData, boolean sendHighestModSeq) {
+    protected void condstoreEnablingCommand(ImapSession session, Responder responder, MailboxMetaData metaData, boolean sendHighestModSeq) {
         Set<Capability> enabled = EnableProcessor.getEnabledCapabilities(session);
         if (!enabled.contains(ImapConstants.SUPPORTS_CONDSTORE)) {
             if (sendHighestModSeq) {
@@ -537,7 +537,7 @@ public abstract class AbstractMailboxProcessor<R extends ImapRequest> extends Ab
     /**
      * Send VANISHED responses if needed. 
      */
-    protected void respondVanished(MailboxSession session, MessageManager mailbox, List<MessageRange> ranges, long changedSince, MetaData metaData, Responder responder) throws MailboxException {
+    protected void respondVanished(MailboxSession session, MessageManager mailbox, List<MessageRange> ranges, long changedSince, MailboxMetaData metaData, Responder responder) throws MailboxException {
         // RFC5162 4.2. Server Implementations Storing Minimal State
         //  
         //      A server that stores the HIGHESTMODSEQ value at the time of the last
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractSelectionProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractSelectionProcessor.java
index 97d9055..3905387 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractSelectionProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractSelectionProcessor.java
@@ -45,8 +45,8 @@ import org.apache.james.imap.processor.base.SelectedMailboxImpl;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageManager;
-import org.apache.james.mailbox.MessageManager.MetaData;
-import org.apache.james.mailbox.MessageManager.MetaData.FetchGroup;
+import org.apache.james.mailbox.MessageManager.MailboxMetaData;
+import org.apache.james.mailbox.MessageManager.MailboxMetaData.FetchGroup;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.events.EventBus;
@@ -118,7 +118,7 @@ abstract class AbstractSelectionProcessor<R extends AbstractMailboxSelectionRequ
             return;
         }
 
-        final MessageManager.MetaData metaData = selectMailbox(fullMailboxPath, session);
+        final MailboxMetaData metaData = selectMailbox(fullMailboxPath, session);
         final SelectedMailbox selected = session.getSelected();
         MessageUid firstUnseen = metaData.getFirstUnseen();
         
@@ -317,7 +317,7 @@ abstract class AbstractSelectionProcessor<R extends AbstractMailboxSelectionRequ
 
 
 
-    private void highestModSeq(Responder responder, MetaData metaData, SelectedMailbox selected) {
+    private void highestModSeq(Responder responder, MailboxMetaData metaData, SelectedMailbox selected) {
         final StatusResponse untaggedOk;
         if (metaData.isModSeqPermanent()) {
             final ModSeq highestModSeq = metaData.getHighestModSeq();
@@ -328,13 +328,13 @@ abstract class AbstractSelectionProcessor<R extends AbstractMailboxSelectionRequ
         responder.respond(untaggedOk);        
     }
 
-    private void uidNext(Responder responder, MessageManager.MetaData metaData) throws MailboxException {
+    private void uidNext(Responder responder, MailboxMetaData metaData) throws MailboxException {
         final MessageUid uid = metaData.getUidNext();
         final StatusResponse untaggedOk = statusResponseFactory.untaggedOk(HumanReadableText.UIDNEXT, ResponseCode.uidNext(uid));
         responder.respond(untaggedOk);
     }
 
-    private void taggedOk(Responder responder, ImapRequest request, MetaData metaData, HumanReadableText text) {
+    private void taggedOk(Responder responder, ImapRequest request, MailboxMetaData metaData, HumanReadableText text) {
         final boolean writeable = metaData.isWriteable() && !openReadOnly;
         final ResponseCode code;
         if (writeable) {
@@ -364,7 +364,7 @@ abstract class AbstractSelectionProcessor<R extends AbstractMailboxSelectionRequ
 
     }
 
-    private void uidValidity(Responder responder, MessageManager.MetaData metaData) throws MailboxException {
+    private void uidValidity(Responder responder, MailboxMetaData metaData) throws MailboxException {
         final UidValidity uidValidity = metaData.getUidValidity();
         final StatusResponse untaggedOk = statusResponseFactory.untaggedOk(HumanReadableText.UID_VALIDITY, ResponseCode.uidValidity(uidValidity));
         responder.respond(untaggedOk);
@@ -376,13 +376,13 @@ abstract class AbstractSelectionProcessor<R extends AbstractMailboxSelectionRequ
         responder.respond(recentResponse);
     }
 
-    private void exists(Responder responder, MessageManager.MetaData metaData) throws MailboxException {
+    private void exists(Responder responder, MailboxMetaData metaData) throws MailboxException {
         final long messageCount = metaData.getMessageCount();
         final ExistsResponse existsResponse = new ExistsResponse(messageCount);
         responder.respond(existsResponse);
     }
 
-    private MessageManager.MetaData selectMailbox(MailboxPath mailboxPath, ImapSession session) throws MailboxException {
+    private MailboxMetaData selectMailbox(MailboxPath mailboxPath, ImapSession session) throws MailboxException {
         final MailboxManager mailboxManager = getMailboxManager();
         final MailboxSession mailboxSession = session.getMailboxSession();
         final MessageManager mailbox = mailboxManager.getMailbox(mailboxPath, mailboxSession);
@@ -407,13 +407,13 @@ abstract class AbstractSelectionProcessor<R extends AbstractMailboxSelectionRequ
             // TODO: Check if we need to handle CONDSTORE there too 
             sessionMailbox = currentMailbox;
         }
-        final MessageManager.MetaData metaData = mailbox.getMetaData(!openReadOnly, mailboxSession, MessageManager.MetaData.FetchGroup.FIRST_UNSEEN);
+        final MailboxMetaData metaData = mailbox.getMetaData(!openReadOnly, mailboxSession, MailboxMetaData.FetchGroup.FIRST_UNSEEN);
         addRecent(metaData, sessionMailbox);
         return metaData;
     }
 
 
-    private void addRecent(MessageManager.MetaData metaData, SelectedMailbox sessionMailbox) throws MailboxException {
+    private void addRecent(MailboxMetaData metaData, SelectedMailbox sessionMailbox) throws MailboxException {
         final List<MessageUid> recentUids = metaData.getRecent();
         for (MessageUid uid : recentUids) {
             sessionMailbox.addRecent(uid);
@@ -441,7 +441,7 @@ abstract class AbstractSelectionProcessor<R extends AbstractMailboxSelectionRequ
             // See http://www.dovecot.org/list/dovecot/2008-March/029561.html
             if (capability.equals(ImapConstants.SUPPORTS_CONDSTORE) || capability.equals(ImapConstants.SUPPORTS_QRESYNC)) {
                 try {
-                    MetaData metaData  = null;
+                    MailboxMetaData metaData  = null;
                     boolean send = false;
                     if (sm != null) {
                         MessageManager mailbox = getSelectedMailbox(session);
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/CloseProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/CloseProcessor.java
index 61436ca..e92891d 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/CloseProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/CloseProcessor.java
@@ -29,7 +29,7 @@ import org.apache.james.imap.message.request.CloseRequest;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageManager;
-import org.apache.james.mailbox.MessageManager.MetaData.FetchGroup;
+import org.apache.james.mailbox.MessageManager.MailboxMetaData.FetchGroup;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.MessageRange;
 import org.apache.james.metrics.api.MetricFactory;
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/ExpungeProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/ExpungeProcessor.java
index fd45881..c72b385 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/ExpungeProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/ExpungeProcessor.java
@@ -38,8 +38,8 @@ import org.apache.james.imap.message.request.ExpungeRequest;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageManager;
-import org.apache.james.mailbox.MessageManager.MetaData;
-import org.apache.james.mailbox.MessageManager.MetaData.FetchGroup;
+import org.apache.james.mailbox.MessageManager.MailboxMetaData;
+import org.apache.james.mailbox.MessageManager.MailboxMetaData.FetchGroup;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.exception.MessageRangeException;
@@ -68,7 +68,7 @@ public class ExpungeProcessor extends AbstractMailboxProcessor<ExpungeRequest> i
             final MailboxSession mailboxSession = session.getMailboxSession();
 
             int expunged = 0;
-            MetaData mdata = mailbox.getMetaData(false, mailboxSession, FetchGroup.NO_COUNT);
+            MailboxMetaData mdata = mailbox.getMetaData(false, mailboxSession, FetchGroup.NO_COUNT);
 
             if (!mdata.isWriteable()) {
                 no(request, responder, HumanReadableText.MAILBOX_IS_READ_ONLY);
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/GetACLProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/GetACLProcessor.java
index b17250b..ba7729d 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/GetACLProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/GetACLProcessor.java
@@ -34,8 +34,8 @@ import org.apache.james.imap.message.response.ACLResponse;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageManager;
-import org.apache.james.mailbox.MessageManager.MetaData;
-import org.apache.james.mailbox.MessageManager.MetaData.FetchGroup;
+import org.apache.james.mailbox.MessageManager.MailboxMetaData;
+import org.apache.james.mailbox.MessageManager.MailboxMetaData.FetchGroup;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.exception.MailboxNotFoundException;
 import org.apache.james.mailbox.model.MailboxACL;
@@ -93,7 +93,7 @@ public class GetACLProcessor extends AbstractMailboxProcessor<GetACLRequest> imp
                 HumanReadableText text = new HumanReadableText(HumanReadableText.UNSUFFICIENT_RIGHTS_KEY, HumanReadableText.UNSUFFICIENT_RIGHTS_DEFAULT_VALUE, params);
                 no(request, responder, text);
             } else {
-                MetaData metaData = messageManager.getMetaData(false, mailboxSession, FetchGroup.NO_COUNT);
+                MailboxMetaData metaData = messageManager.getMetaData(false, mailboxSession, FetchGroup.NO_COUNT);
                 ACLResponse aclResponse = new ACLResponse(mailboxName, metaData.getACL());
                 responder.respond(aclResponse);
                 okComplete(request, responder);
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/SearchProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/SearchProcessor.java
index 91d4ee4..9ed93cf 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/SearchProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/SearchProcessor.java
@@ -50,7 +50,7 @@ import org.apache.james.imap.message.response.SearchResponse;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageManager;
-import org.apache.james.mailbox.MessageManager.MetaData;
+import org.apache.james.mailbox.MessageManager.MailboxMetaData;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.exception.MailboxException;
@@ -104,7 +104,7 @@ public class SearchProcessor extends AbstractMailboxProcessor<SearchRequest> imp
             // See RFC4551: 3.4. MODSEQ Search Criterion in SEARCH
             final ModSeq highestModSeq;
             if (session.getAttribute(SEARCH_MODSEQ) != null) {
-                MetaData metaData = mailbox.getMetaData(false, msession, MessageManager.MetaData.FetchGroup.NO_COUNT);
+                MailboxMetaData metaData = mailbox.getMetaData(false, msession, MailboxMetaData.FetchGroup.NO_COUNT);
                 highestModSeq = findHighestModSeq(msession, mailbox, MessageRange.toRanges(uids), metaData.getHighestModSeq());
                 
                 // Enable CONDSTORE as this is a CONDSTORE enabling command
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/StatusProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/StatusProcessor.java
index 292269a..b96d38a 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/StatusProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/StatusProcessor.java
@@ -59,7 +59,7 @@ public class StatusProcessor extends AbstractMailboxProcessor<StatusRequest> {
         try {
             LOGGER.debug("Status called on mailbox named {}", mailboxPath);
 
-            MessageManager.MetaData metaData = retrieveMetadata(mailboxPath, statusDataItems, mailboxSession);
+            MessageManager.MailboxMetaData metaData = retrieveMetadata(mailboxPath, statusDataItems, mailboxSession);
             MailboxStatusResponse response = computeStatusResponse(request, statusDataItems, metaData);
 
             // Enable CONDSTORE as this is a CONDSTORE enabling command
@@ -76,13 +76,13 @@ public class StatusProcessor extends AbstractMailboxProcessor<StatusRequest> {
         }
     }
 
-    private MessageManager.MetaData retrieveMetadata(MailboxPath mailboxPath, StatusDataItems statusDataItems, MailboxSession mailboxSession) throws MailboxException {
+    private MessageManager.MailboxMetaData retrieveMetadata(MailboxPath mailboxPath, StatusDataItems statusDataItems, MailboxSession mailboxSession) throws MailboxException {
         MessageManager mailbox = getMailboxManager().getMailbox(mailboxPath, mailboxSession);
-        MessageManager.MetaData.FetchGroup fetchGroup = computeFetchGroup(statusDataItems);
+        MessageManager.MailboxMetaData.FetchGroup fetchGroup = computeFetchGroup(statusDataItems);
         return mailbox.getMetaData(false, mailboxSession, fetchGroup);
     }
 
-    private MailboxStatusResponse computeStatusResponse(StatusRequest request, StatusDataItems statusDataItems, MessageManager.MetaData metaData) {
+    private MailboxStatusResponse computeStatusResponse(StatusRequest request, StatusDataItems statusDataItems, MessageManager.MailboxMetaData metaData) {
         Long messages = messages(statusDataItems, metaData);
         Long recent = recent(statusDataItems, metaData);
         MessageUid uidNext = uidNext(statusDataItems, metaData);
@@ -92,15 +92,15 @@ public class StatusProcessor extends AbstractMailboxProcessor<StatusRequest> {
         return new MailboxStatusResponse(messages, recent, uidNext, highestModSeq, uidValidity, unseen, request.getMailboxName());
     }
 
-    private MessageManager.MetaData.FetchGroup computeFetchGroup(StatusDataItems statusDataItems) {
+    private MessageManager.MailboxMetaData.FetchGroup computeFetchGroup(StatusDataItems statusDataItems) {
         if (statusDataItems.isUnseen()) {
-            return MessageManager.MetaData.FetchGroup.UNSEEN_COUNT;
+            return MessageManager.MailboxMetaData.FetchGroup.UNSEEN_COUNT;
         } else {
-            return MessageManager.MetaData.FetchGroup.NO_UNSEEN;
+            return MessageManager.MailboxMetaData.FetchGroup.NO_UNSEEN;
         }
     }
 
-    private Long unseen(StatusDataItems statusDataItems, MessageManager.MetaData metaData) {
+    private Long unseen(StatusDataItems statusDataItems, MessageManager.MailboxMetaData metaData) {
         if (statusDataItems.isUnseen()) {
             return metaData.getUnseenCount();
         } else {
@@ -108,7 +108,7 @@ public class StatusProcessor extends AbstractMailboxProcessor<StatusRequest> {
         }
     }
 
-    private UidValidity uidValidity(StatusDataItems statusDataItems, MessageManager.MetaData metaData) {
+    private UidValidity uidValidity(StatusDataItems statusDataItems, MessageManager.MailboxMetaData metaData) {
         if (statusDataItems.isUidValidity()) {
             return metaData.getUidValidity();
         } else {
@@ -116,7 +116,7 @@ public class StatusProcessor extends AbstractMailboxProcessor<StatusRequest> {
         }
     }
 
-    private ModSeq highestModSeq(StatusDataItems statusDataItems, MessageManager.MetaData metaData) {
+    private ModSeq highestModSeq(StatusDataItems statusDataItems, MessageManager.MailboxMetaData metaData) {
         if (statusDataItems.isHighestModSeq()) {
             return metaData.getHighestModSeq();
         } else {
@@ -124,7 +124,7 @@ public class StatusProcessor extends AbstractMailboxProcessor<StatusRequest> {
         }
     }
     
-    private MessageUid uidNext(StatusDataItems statusDataItems, MessageManager.MetaData metaData) {
+    private MessageUid uidNext(StatusDataItems statusDataItems, MessageManager.MailboxMetaData metaData) {
         if (statusDataItems.isUidNext()) {
             return metaData.getUidNext();
         } else {
@@ -132,7 +132,7 @@ public class StatusProcessor extends AbstractMailboxProcessor<StatusRequest> {
         }
     }
 
-    private Long recent(StatusDataItems statusDataItems, MessageManager.MetaData metaData) {
+    private Long recent(StatusDataItems statusDataItems, MessageManager.MailboxMetaData metaData) {
         if (statusDataItems.isRecent()) {
             return metaData.countRecent();
         } else {
@@ -140,7 +140,7 @@ public class StatusProcessor extends AbstractMailboxProcessor<StatusRequest> {
         }
     }
 
-    private Long messages(StatusDataItems statusDataItems, MessageManager.MetaData metaData) {
+    private Long messages(StatusDataItems statusDataItems, MessageManager.MailboxMetaData metaData) {
         if (statusDataItems.isMessages()) {
            return metaData.getMessageCount();
         } else {
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/StoreProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/StoreProcessor.java
index 8c34775..cbc579f 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/StoreProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/StoreProcessor.java
@@ -46,7 +46,7 @@ import org.apache.james.imap.message.response.FetchResponse;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageManager;
-import org.apache.james.mailbox.MessageManager.MetaData;
+import org.apache.james.mailbox.MessageManager.MailboxMetaData;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.NullableMessageSequenceNumber;
@@ -88,7 +88,7 @@ public class StoreProcessor extends AbstractMailboxProcessor<StoreRequest> {
             final Flags flags = request.getFlags();
             
             if (unchangedSince != -1) {
-                MetaData metaData = mailbox.getMetaData(false, mailboxSession, MetaData.FetchGroup.NO_COUNT);
+                MailboxMetaData metaData = mailbox.getMetaData(false, mailboxSession, MailboxMetaData.FetchGroup.NO_COUNT);
                 if (metaData.isModSeqPermanent() == false) {
                     // Check if the mailbox did not support modsequences. If so return a tagged bad response.
                     // See RFC4551 3.1.2. NOMODSEQ Response Code 
@@ -236,7 +236,7 @@ public class StoreProcessor extends AbstractMailboxProcessor<StoreRequest> {
         // See IMAP-303
         if (selected.hasNewApplicableFlags()) {
             flags(responder, selected);
-            permanentFlags(responder, mailbox.getMetaData(false, mailboxSession, MetaData.FetchGroup.NO_COUNT), selected);
+            permanentFlags(responder, mailbox.getMetaData(false, mailboxSession, MailboxMetaData.FetchGroup.NO_COUNT), selected);
             selected.resetNewApplicableFlags();
         }
         
@@ -314,7 +314,7 @@ public class StoreProcessor extends AbstractMailboxProcessor<StoreRequest> {
 
             if (unchangedSince != -1) {
                 // Enable CONDSTORE as this is a CONDSTORE enabling command
-                condstoreEnablingCommand(session, responder,  mailbox.getMetaData(false, mailboxSession, MetaData.FetchGroup.NO_COUNT), true);
+                condstoreEnablingCommand(session, responder,  mailbox.getMetaData(false, mailboxSession, MailboxMetaData.FetchGroup.NO_COUNT), true);
                                   
             }
         }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/fetch/FetchProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/fetch/FetchProcessor.java
index a9677a3..b1ef8f8 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/fetch/FetchProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/fetch/FetchProcessor.java
@@ -38,7 +38,7 @@ import org.apache.james.imap.processor.EnableProcessor;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageManager;
-import org.apache.james.mailbox.MessageManager.MetaData;
+import org.apache.james.mailbox.MessageManager.MailboxMetaData;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.exception.MessageRangeException;
 import org.apache.james.mailbox.model.FetchGroup;
@@ -85,7 +85,7 @@ public class FetchProcessor extends AbstractMailboxProcessor<FetchRequest> {
             }
             final MailboxSession mailboxSession = session.getMailboxSession();
 
-            MetaData metaData = mailbox.getMetaData(false, mailboxSession, org.apache.james.mailbox.MessageManager.MetaData.FetchGroup.NO_COUNT);
+            MailboxMetaData metaData = mailbox.getMetaData(false, mailboxSession, MailboxMetaData.FetchGroup.NO_COUNT);
             if (fetch.getChangedSince() != -1 || fetch.contains(Item.MODSEQ)) {
                 // Enable CONDSTORE as this is a CONDSTORE enabling command
                 condstoreEnablingCommand(session, responder,  metaData, true);
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/processor/DeleteACLProcessorTest.java b/protocols/imap/src/test/java/org/apache/james/imap/processor/DeleteACLProcessorTest.java
index 69a1ada..34d9d86 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/processor/DeleteACLProcessorTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/processor/DeleteACLProcessorTest.java
@@ -41,8 +41,8 @@ import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MailboxSessionUtil;
 import org.apache.james.mailbox.MessageManager;
-import org.apache.james.mailbox.MessageManager.MetaData;
-import org.apache.james.mailbox.MessageManager.MetaData.FetchGroup;
+import org.apache.james.mailbox.MessageManager.MailboxMetaData;
+import org.apache.james.mailbox.MessageManager.MailboxMetaData.FetchGroup;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.exception.MailboxNotFoundException;
 import org.apache.james.mailbox.model.MailboxACL;
@@ -64,7 +64,7 @@ public class DeleteACLProcessorTest {
     private FakeImapSession imapSession;
     private MailboxManager mailboxManager;
     private MailboxSession mailboxSession;
-    private MetaData metaData;
+    private MailboxMetaData metaData;
     private DeleteACLRequest deleteACLRequest;
     private DeleteACLProcessor subject;
     private EntryKey user1Key;
@@ -82,7 +82,7 @@ public class DeleteACLProcessorTest {
         mailboxSession = MailboxSessionUtil.create(USER_1);
 
         MessageManager messageManager = mock(MessageManager.class);
-        metaData = mock(MetaData.class);
+        metaData = mock(MailboxMetaData.class);
         responder = mock(Responder.class);
 
         imapSession.authenticated();
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/processor/GetACLProcessorTest.java b/protocols/imap/src/test/java/org/apache/james/imap/processor/GetACLProcessorTest.java
index 45a889b..3cb320c 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/processor/GetACLProcessorTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/processor/GetACLProcessorTest.java
@@ -42,8 +42,8 @@ import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MailboxSessionUtil;
 import org.apache.james.mailbox.MessageManager;
-import org.apache.james.mailbox.MessageManager.MetaData;
-import org.apache.james.mailbox.MessageManager.MetaData.FetchGroup;
+import org.apache.james.mailbox.MessageManager.MailboxMetaData;
+import org.apache.james.mailbox.MessageManager.MailboxMetaData.FetchGroup;
 import org.apache.james.mailbox.exception.MailboxNotFoundException;
 import org.apache.james.mailbox.model.MailboxACL;
 import org.apache.james.mailbox.model.MailboxPath;
@@ -64,7 +64,7 @@ public class GetACLProcessorTest {
     private FakeImapSession imapSession;
     private MailboxManager mailboxManager;
     private MailboxSession mailboxSession;
-    private MetaData metaData;
+    private MailboxMetaData metaData;
     private GetACLRequest getACLRequest;
     private GetACLProcessor subject;
     private MailboxPath path;
@@ -80,7 +80,7 @@ public class GetACLProcessorTest {
         imapSession = new FakeImapSession();
         mailboxSession = MailboxSessionUtil.create(USER_1);
         MessageManager messageManager = mock(MessageManager.class);
-        metaData = mock(MetaData.class);
+        metaData = mock(MailboxMetaData.class);
         responder = mock(Responder.class);
 
         getACLRequest = new GetACLRequest(TAG, MAILBOX_NAME);
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/processor/ListRightsProcessorTest.java b/protocols/imap/src/test/java/org/apache/james/imap/processor/ListRightsProcessorTest.java
index 6bbbd04..2104d9b 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/processor/ListRightsProcessorTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/processor/ListRightsProcessorTest.java
@@ -42,7 +42,7 @@ import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MailboxSessionUtil;
 import org.apache.james.mailbox.MessageManager;
-import org.apache.james.mailbox.MessageManager.MetaData;
+import org.apache.james.mailbox.MessageManager.MailboxMetaData;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.exception.MailboxNotFoundException;
 import org.apache.james.mailbox.model.MailboxACL;
@@ -65,7 +65,7 @@ public class ListRightsProcessorTest {
     private FakeImapSession imapSession;
     private MailboxManager mailboxManager;
     private MailboxSession mailboxSession;
-    private MetaData metaData;
+    private MailboxMetaData metaData;
     private ListRightsRequest listRightsRequest;
     private ListRightsProcessor subject;
     private EntryKey user1Key;
@@ -83,14 +83,14 @@ public class ListRightsProcessorTest {
         imapSession = new FakeImapSession();
         mailboxSession = MailboxSessionUtil.create(USER_1);
         MessageManager messageManager = mock(MessageManager.class);
-        metaData = mock(MetaData.class);
+        metaData = mock(MailboxMetaData.class);
         responder = mock(Responder.class);
 
         argumentCaptor = ArgumentCaptor.forClass(ImapResponseMessage.class);
 
         imapSession.authenticated();
         imapSession.setMailboxSession(mailboxSession);
-        when(messageManager.getMetaData(anyBoolean(), any(MailboxSession.class), any(MetaData.FetchGroup.class)))
+        when(messageManager.getMetaData(anyBoolean(), any(MailboxSession.class), any(MailboxMetaData.FetchGroup.class)))
             .thenReturn(metaData);
         when(mailboxManager.getMailbox(any(MailboxPath.class), any(MailboxSession.class)))
             .thenReturn(messageManager);
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/processor/SetACLProcessorTest.java b/protocols/imap/src/test/java/org/apache/james/imap/processor/SetACLProcessorTest.java
index 8aa91f1..2da308d 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/processor/SetACLProcessorTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/processor/SetACLProcessorTest.java
@@ -41,8 +41,8 @@ import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MailboxSessionUtil;
 import org.apache.james.mailbox.MessageManager;
-import org.apache.james.mailbox.MessageManager.MetaData;
-import org.apache.james.mailbox.MessageManager.MetaData.FetchGroup;
+import org.apache.james.mailbox.MessageManager.MailboxMetaData;
+import org.apache.james.mailbox.MessageManager.MailboxMetaData.FetchGroup;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.exception.MailboxNotFoundException;
 import org.apache.james.mailbox.model.MailboxACL;
@@ -85,7 +85,7 @@ public class SetACLProcessorTest {
         imapSession = new FakeImapSession();
         mailboxSession = MailboxSessionUtil.create(USER_1);
         MessageManager messageManager = mock(MessageManager.class);
-        MetaData metaData = mock(MetaData.class);
+        MailboxMetaData metaData = mock(MailboxMetaData.class);
         responder = mock(Responder.class);
 
         argumentCaptor = ArgumentCaptor.forClass(ImapResponseMessage.class);
diff --git a/server/container/guice/mailbox/src/main/java/org/apache/james/modules/ACLProbeImpl.java b/server/container/guice/mailbox/src/main/java/org/apache/james/modules/ACLProbeImpl.java
index 02362dd..b46c41e 100644
--- a/server/container/guice/mailbox/src/main/java/org/apache/james/modules/ACLProbeImpl.java
+++ b/server/container/guice/mailbox/src/main/java/org/apache/james/modules/ACLProbeImpl.java
@@ -63,7 +63,7 @@ public class ACLProbeImpl implements GuiceProbe, ACLProbe {
         MailboxSession mailboxSession = mailboxManager.createSystemSession(mailboxPath.getUser());
 
         return mailboxManager.getMailbox(mailboxPath, mailboxSession)
-            .getMetaData(RESET_RECENT, mailboxSession, MessageManager.MetaData.FetchGroup.NO_COUNT)
+            .getMetaData(RESET_RECENT, mailboxSession, MessageManager.MailboxMetaData.FetchGroup.NO_COUNT)
             .getACL();
     }
 }
\ No newline at end of file
diff --git a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/event/PropagateLookupRightListenerTest.java b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/event/PropagateLookupRightListenerTest.java
index 4547f11..8f9ad5f 100644
--- a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/event/PropagateLookupRightListenerTest.java
+++ b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/event/PropagateLookupRightListenerTest.java
@@ -112,7 +112,7 @@ public class PropagateLookupRightListenerTest {
             mailboxSession);
 
         MailboxACL actualACL = storeMailboxManager.getMailbox(parentMailboxId, mailboxSession)
-            .getMetaData(RESET_RECENT, mailboxSession, MessageManager.MetaData.FetchGroup.NO_COUNT)
+            .getMetaData(RESET_RECENT, mailboxSession, MessageManager.MailboxMetaData.FetchGroup.NO_COUNT)
             .getACL();
 
         assertThat(actualACL.getEntries())
@@ -134,7 +134,7 @@ public class PropagateLookupRightListenerTest {
             mailboxSession);
 
         MailboxACL actualACL = storeMailboxManager.getMailbox(parentMailboxId, mailboxSession)
-            .getMetaData(RESET_RECENT, mailboxSession, MessageManager.MetaData.FetchGroup.NO_COUNT)
+            .getMetaData(RESET_RECENT, mailboxSession, MessageManager.MailboxMetaData.FetchGroup.NO_COUNT)
             .getACL();
 
         assertThat(actualACL.getEntries())
@@ -152,7 +152,7 @@ public class PropagateLookupRightListenerTest {
             mailboxSession);
 
         MailboxACL actualACL = storeMailboxManager.getMailbox(parentMailboxId, mailboxSession)
-            .getMetaData(RESET_RECENT, mailboxSession, MessageManager.MetaData.FetchGroup.NO_COUNT)
+            .getMetaData(RESET_RECENT, mailboxSession, MessageManager.MailboxMetaData.FetchGroup.NO_COUNT)
             .getACL();
 
         assertThat(actualACL.getEntries())
@@ -173,7 +173,7 @@ public class PropagateLookupRightListenerTest {
             mailboxSession);
 
         MailboxACL actualACL = storeMailboxManager.getMailbox(parentMailboxId, mailboxSession)
-            .getMetaData(RESET_RECENT, mailboxSession, MessageManager.MetaData.FetchGroup.NO_COUNT)
+            .getMetaData(RESET_RECENT, mailboxSession, MessageManager.MailboxMetaData.FetchGroup.NO_COUNT)
             .getACL();
 
         assertThat(actualACL.getEntries())
@@ -194,11 +194,11 @@ public class PropagateLookupRightListenerTest {
             mailboxSession);
 
         MailboxACL actualParentACL = storeMailboxManager.getMailbox(parentMailboxId, mailboxSession)
-            .getMetaData(RESET_RECENT, mailboxSession, MessageManager.MetaData.FetchGroup.NO_COUNT)
+            .getMetaData(RESET_RECENT, mailboxSession, MessageManager.MailboxMetaData.FetchGroup.NO_COUNT)
             .getACL();
 
         MailboxACL actualChildACL = storeMailboxManager.getMailbox(parentMailboxId, mailboxSession)
-            .getMetaData(RESET_RECENT, mailboxSession, MessageManager.MetaData.FetchGroup.NO_COUNT)
+            .getMetaData(RESET_RECENT, mailboxSession, MessageManager.MailboxMetaData.FetchGroup.NO_COUNT)
             .getACL();
 
         assertThat(actualParentACL.getEntries())
@@ -222,7 +222,7 @@ public class PropagateLookupRightListenerTest {
             mailboxSession);
 
         MailboxACL actualACL = storeMailboxManager.getMailbox(parentMailboxId, mailboxSession)
-            .getMetaData(RESET_RECENT, mailboxSession, MessageManager.MetaData.FetchGroup.NO_COUNT)
+            .getMetaData(RESET_RECENT, mailboxSession, MessageManager.MailboxMetaData.FetchGroup.NO_COUNT)
             .getACL();
 
         assertThat(actualACL.getEntries())
@@ -240,7 +240,7 @@ public class PropagateLookupRightListenerTest {
             mailboxSession);
 
         MailboxACL actualACL = storeMailboxManager.getMailbox(parentMailboxId, mailboxSession)
-            .getMetaData(RESET_RECENT, mailboxSession, MessageManager.MetaData.FetchGroup.NO_COUNT)
+            .getMetaData(RESET_RECENT, mailboxSession, MessageManager.MailboxMetaData.FetchGroup.NO_COUNT)
             .getACL();
 
         assertThat(actualACL.getEntries())
@@ -258,7 +258,7 @@ public class PropagateLookupRightListenerTest {
             mailboxSession);
 
         MailboxACL actualACL = storeMailboxManager.getMailbox(parentMailboxId, mailboxSession)
-            .getMetaData(RESET_RECENT, mailboxSession, MessageManager.MetaData.FetchGroup.NO_COUNT)
+            .getMetaData(RESET_RECENT, mailboxSession, MessageManager.MailboxMetaData.FetchGroup.NO_COUNT)
             .getACL();
 
         assertThat(actualACL.getEntries())
@@ -274,7 +274,7 @@ public class PropagateLookupRightListenerTest {
         storeMailboxManager.renameMailbox(CHILD_MAILBOX, MailboxPath.forUser(OWNER_USER, "shared1.sub1New"), mailboxSession);
 
         MailboxACL actualACL = storeMailboxManager.getMailbox(parentMailboxId1, mailboxSession)
-            .getMetaData(RESET_RECENT, mailboxSession, MessageManager.MetaData.FetchGroup.NO_COUNT)
+            .getMetaData(RESET_RECENT, mailboxSession, MessageManager.MailboxMetaData.FetchGroup.NO_COUNT)
             .getACL();
 
         assertThat(actualACL.getEntries())
@@ -290,7 +290,7 @@ public class PropagateLookupRightListenerTest {
         storeMailboxManager.renameMailbox(CHILD_MAILBOX, MailboxPath.forUser(OWNER_USER, "shared1.sub1New"), mailboxSession);
 
         MailboxACL actualACL = storeMailboxManager.getMailbox(parentMailboxId1, mailboxSession)
-            .getMetaData(RESET_RECENT, mailboxSession, MessageManager.MetaData.FetchGroup.NO_COUNT)
+            .getMetaData(RESET_RECENT, mailboxSession, MessageManager.MailboxMetaData.FetchGroup.NO_COUNT)
             .getACL();
 
         assertThat(actualACL.getEntries())
@@ -306,10 +306,10 @@ public class PropagateLookupRightListenerTest {
         storeMailboxManager.renameMailbox(GRAND_CHILD_MAILBOX, MailboxPath.forUser(OWNER_USER, "shared1.sub1.sub2"), mailboxSession);
 
         MailboxACL parentActualACL = storeMailboxManager.getMailbox(parentMailboxId1, mailboxSession)
-            .getMetaData(RESET_RECENT, mailboxSession, MessageManager.MetaData.FetchGroup.NO_COUNT)
+            .getMetaData(RESET_RECENT, mailboxSession, MessageManager.MailboxMetaData.FetchGroup.NO_COUNT)
             .getACL();
         MailboxACL childActualACL = storeMailboxManager.getMailbox(childMailboxId1, mailboxSession)
-            .getMetaData(RESET_RECENT, mailboxSession, MessageManager.MetaData.FetchGroup.NO_COUNT)
+            .getMetaData(RESET_RECENT, mailboxSession, MessageManager.MailboxMetaData.FetchGroup.NO_COUNT)
             .getACL();
 
         assertThat(parentActualACL.getEntries())
@@ -330,7 +330,7 @@ public class PropagateLookupRightListenerTest {
             mailboxSession);
 
         MailboxACL actualACL = storeMailboxManager.getMailbox(parentMailboxId, mailboxSession)
-            .getMetaData(RESET_RECENT, mailboxSession, MessageManager.MetaData.FetchGroup.NO_COUNT)
+            .getMetaData(RESET_RECENT, mailboxSession, MessageManager.MailboxMetaData.FetchGroup.NO_COUNT)
             .getACL();
 
         assertThat(actualACL.getEntries())


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[james-project] 14/15: [Refactoring] MailboxContentMetaData recent field should be immutable

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 1ef139ab619f0755a11540249bc7c4543a75c765
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Mon May 11 10:53:10 2020 +0700

    [Refactoring] MailboxContentMetaData recent field should be immutable
---
 .../api/src/main/java/org/apache/james/mailbox/MessageManager.java   | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/MessageManager.java b/mailbox/api/src/main/java/org/apache/james/mailbox/MessageManager.java
index 1ddd74b..6c21579 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/MessageManager.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/MessageManager.java
@@ -23,7 +23,6 @@ import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
 import java.util.Date;
 import java.util.EnumSet;
 import java.util.Iterator;
@@ -419,7 +418,7 @@ public interface MessageManager {
         }
 
         private final long recentCount;
-        private final List<MessageUid> recent;
+        private final ImmutableList<MessageUid> recent;
         private final Flags permanentFlags;
         private final UidValidity uidValidity;
         private final MessageUid nextUid;
@@ -432,7 +431,7 @@ public interface MessageManager {
         private final MailboxACL acl;
 
         public MailboxMetaData(List<MessageUid> recent, Flags permanentFlags, UidValidity uidValidity, MessageUid uidNext, ModSeq highestModSeq, long messageCount, long unseenCount, MessageUid firstUnseen, boolean writeable, boolean modSeqPermanent, MailboxACL acl) {
-            this.recent = Optional.ofNullable(recent).orElseGet(ArrayList::new);
+            this.recent = Optional.ofNullable(recent).map(ImmutableList::copyOf).orElseGet(ImmutableList::of);
             this.highestModSeq = highestModSeq;
             this.recentCount = this.recent.size();
 


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[james-project] 04/15: JAMES-3149 Improve ListeningMessageSearchIndex reactive code

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit b716576fa0a3573e0099ab0d6427d6dbfa52c028
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Wed May 6 11:25:52 2020 +0700

    JAMES-3149 Improve ListeningMessageSearchIndex reactive code
---
 .../james/mailbox/store/search/ListeningMessageSearchIndex.java  | 9 ++-------
 1 file changed, 2 insertions(+), 7 deletions(-)

diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/ListeningMessageSearchIndex.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/ListeningMessageSearchIndex.java
index 6ce170b..d9ebfe9 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/ListeningMessageSearchIndex.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/ListeningMessageSearchIndex.java
@@ -33,7 +33,6 @@ import org.apache.james.mailbox.model.UpdatedFlags;
 import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
 import org.apache.james.mailbox.store.mail.MessageMapper.FetchType;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
-import org.apache.james.util.streams.Iterators;
 
 import com.google.common.collect.ImmutableList;
 
@@ -105,12 +104,8 @@ public abstract class ListeningMessageSearchIndex implements MessageSearchIndex,
     }
 
     private Flux<MailboxMessage> retrieveMailboxMessages(MailboxSession session, Mailbox mailbox, MessageRange range) {
-        try {
-            return Iterators.toFlux(factory.getMessageMapper(session)
-                .findInMailbox(mailbox, range, FetchType.Full, UNLIMITED));
-        } catch (Exception e) {
-            return Flux.error(e);
-        }
+        return factory.getMessageMapper(session)
+            .findInMailboxReactive(mailbox, range, FetchType.Full, UNLIMITED);
     }
 
     /**


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[james-project] 13/15: [Refactoring] JavaDoc for sensibleInformationFree

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 0b77f72cb02821866a91347de06af1f797d3e69f
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Mon May 11 10:50:14 2020 +0700

    [Refactoring] JavaDoc for sensibleInformationFree
---
 .../api/src/main/java/org/apache/james/mailbox/MessageManager.java   | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/MessageManager.java b/mailbox/api/src/main/java/org/apache/james/mailbox/MessageManager.java
index 975c777..1ddd74b 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/MessageManager.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/MessageManager.java
@@ -392,6 +392,11 @@ public interface MessageManager {
             NO_COUNT
         }
 
+        /**
+         * Neutral MailboxMetaData to be safely displayed for mailboxes a user can Lookup without Read write.
+         *
+         * @return MailboxMetaData with default values for all fields
+         */
         public static MailboxMetaData sensibleInformationFree(MailboxACL resolvedAcl, UidValidity uidValidity, boolean writeable, boolean modSeqPermanent) throws MailboxException {
             ImmutableList<MessageUid> recents = ImmutableList.of();
             MessageUid uidNext = MessageUid.MIN_VALUE;


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[james-project] 01/15: JAMES-3149 Reactify MailboxMapper::list

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit d90ace71201584a59718128d27101a4198cf28d6
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Tue May 5 08:40:58 2020 +0700

    JAMES-3149 Reactify MailboxMapper::list
---
 .../cassandra/mail/CassandraMailboxMapper.java     |  7 ++--
 .../CassandraMailboxMapperConcurrencyTest.java     |  4 +--
 .../james/mailbox/jpa/mail/JPAMailboxMapper.java   | 15 ++++-----
 .../jpa/mail/TransactionalMailboxMapper.java       |  4 +--
 .../mailbox/maildir/mail/MaildirMailboxMapper.java | 39 +++++++++++-----------
 .../inmemory/mail/InMemoryMailboxMapper.java       |  6 ++--
 .../inmemory/mail/InMemoryMessageIdMapper.java     | 21 +++++-------
 .../james/mailbox/store/StoreMailboxManager.java   |  4 +--
 .../james/mailbox/store/mail/MailboxMapper.java    |  2 +-
 .../store/mail/model/MailboxMapperTest.java        |  5 +--
 .../mailbox/tools/indexer/ReIndexerPerformer.java  |  5 ++-
 .../adapter/mailbox/MailboxManagementTest.java     | 26 +++++++--------
 12 files changed, 60 insertions(+), 78 deletions(-)

diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java
index a0b4fd4..e84978f 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java
@@ -20,7 +20,6 @@
 package org.apache.james.mailbox.cassandra.mail;
 
 import java.time.Duration;
-import java.util.List;
 
 import javax.inject.Inject;
 
@@ -276,11 +275,9 @@ public class CassandraMailboxMapper implements MailboxMapper {
     }
 
     @Override
-    public List<Mailbox> list() {
+    public Flux<Mailbox> list() {
         return mailboxDAO.retrieveAllMailboxes()
-            .flatMap(this::toMailboxWithAcl)
-            .collectList()
-            .block();
+            .flatMap(this::toMailboxWithAcl);
     }
 
     @Override
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapperConcurrencyTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapperConcurrencyTest.java
index 54e7290..35400d8 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapperConcurrencyTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapperConcurrencyTest.java
@@ -70,7 +70,7 @@ class CassandraMailboxMapperConcurrencyTest {
             .operationCount(OPERATION_COUNT)
             .runAcceptingErrorsWithin(Duration.ofMinutes(1));
 
-        assertThat(testee.list()).hasSize(1);
+        assertThat(testee.list().collectList().block()).hasSize(1);
     }
 
     @Test
@@ -85,7 +85,7 @@ class CassandraMailboxMapperConcurrencyTest {
             .operationCount(OPERATION_COUNT)
             .runAcceptingErrorsWithin(Duration.ofMinutes(1));
 
-        List<Mailbox> list = testee.list();
+        List<Mailbox> list = testee.list().collectList().block();
         assertThat(list).hasSize(1);
         assertThat(list.get(0)).isEqualToComparingFieldByField(mailbox);
     }
diff --git a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMailboxMapper.java b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMailboxMapper.java
index c2d4514..d5bfe96 100644
--- a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMailboxMapper.java
+++ b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMailboxMapper.java
@@ -19,8 +19,6 @@
 
 package org.apache.james.mailbox.jpa.mail;
 
-import java.util.List;
-
 import javax.persistence.EntityExistsException;
 import javax.persistence.EntityManagerFactory;
 import javax.persistence.NoResultException;
@@ -46,7 +44,6 @@ import org.apache.james.mailbox.model.search.MailboxQuery;
 import org.apache.james.mailbox.store.MailboxExpressionBackwardCompatibility;
 import org.apache.james.mailbox.store.mail.MailboxMapper;
 
-import com.github.steveash.guavate.Guavate;
 import com.google.common.base.Preconditions;
 
 import reactor.core.publisher.Flux;
@@ -221,14 +218,14 @@ public class JPAMailboxMapper extends JPATransactionalMapper implements MailboxM
     }
 
     @Override
-    public List<Mailbox> list() throws MailboxException {
+    public Flux<Mailbox> list() {
         try {
-            return getEntityManager().createNamedQuery("listMailboxes", JPAMailbox.class).getResultList()
-                .stream()
-                .map(JPAMailbox::toMailbox)
-                .collect(Guavate.toImmutableList());
+            return Flux.fromIterable(getEntityManager()
+                    .createNamedQuery("listMailboxes", JPAMailbox.class)
+                    .getResultList())
+                .map(JPAMailbox::toMailbox);
         } catch (PersistenceException e) {
-            throw new MailboxException("Delete of mailboxes failed", e);
+            return Flux.error(new MailboxException("Delete of mailboxes failed", e));
         } 
     }
 
diff --git a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/TransactionalMailboxMapper.java b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/TransactionalMailboxMapper.java
index 787db5b..f876158 100644
--- a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/TransactionalMailboxMapper.java
+++ b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/TransactionalMailboxMapper.java
@@ -19,8 +19,6 @@
 
 package org.apache.james.mailbox.jpa.mail;
 
-import java.util.List;
-
 import org.apache.commons.lang3.NotImplementedException;
 import org.apache.james.core.Username;
 import org.apache.james.mailbox.acl.ACLDiff;
@@ -102,7 +100,7 @@ public class TransactionalMailboxMapper implements MailboxMapper {
     }
 
     @Override
-    public List<Mailbox> list() throws MailboxException {
+    public Flux<Mailbox> list() {
         return wrapped.list();
     }
 
diff --git a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMailboxMapper.java b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMailboxMapper.java
index 05d9799..f5af09c 100644
--- a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMailboxMapper.java
+++ b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMailboxMapper.java
@@ -22,8 +22,10 @@ import java.io.File;
 import java.io.FilenameFilter;
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 import java.util.regex.Pattern;
+import java.util.stream.Stream;
 
 import org.apache.commons.io.FileUtils;
 import org.apache.james.core.Username;
@@ -51,6 +53,10 @@ import org.apache.james.mailbox.store.transaction.NonTransactionalMapper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.github.fge.lambdas.Throwing;
+import com.github.steveash.guavate.Guavate;
+import com.google.common.collect.ImmutableList;
+
 import reactor.core.publisher.Flux;
 import reactor.core.publisher.Mono;
 
@@ -119,9 +125,10 @@ public class MaildirMailboxMapper extends NonTransactionalMapper implements Mail
         if (id == null) {
             throw new MailboxNotFoundException("null");
         }
-        return list().stream()
+        return list()
             .filter(mailbox -> mailbox.getMailboxId().equals(id))
-            .findAny()
+            .next()
+            .blockOptional()
             .orElseThrow(() -> new MailboxNotFoundException(id));
     }
     
@@ -256,22 +263,14 @@ public class MaildirMailboxMapper extends NonTransactionalMapper implements Mail
     }
 
     @Override
-    public List<Mailbox> list() throws MailboxException {
-       File maildirRoot = maildirStore.getMaildirRoot();
-       List<Mailbox> mailboxList = new ArrayList<>();
-
-       if (maildirStore.getMaildirLocation().endsWith("/" + MaildirStore.PATH_DOMAIN + "/" + MaildirStore.PATH_USER)) {
-           File[] domains = maildirRoot.listFiles();
-           for (File domain : domains) {
-               File[] users = domain.listFiles();
-               visitUsersForMailboxList(domain, users, mailboxList);
-           }
-           return mailboxList;
-       }
-
-        File[] users = maildirRoot.listFiles();
-        visitUsersForMailboxList(null, users, mailboxList);
-        return mailboxList;
+    public Flux<Mailbox> list() {
+        File maildirRoot = maildirStore.getMaildirRoot();
+        return Mono.fromCallable(maildirStore::getMaildirLocation)
+            .filter(dir -> dir.endsWith("/" + MaildirStore.PATH_DOMAIN + "/" + MaildirStore.PATH_USER))
+            .map(ignored -> Arrays.stream(maildirRoot.listFiles())
+                .flatMap(Throwing.<File, Stream<Mailbox>>function(domain -> visitUsersForMailboxList(domain, domain.listFiles()).stream()).sneakyThrow()))
+            .switchIfEmpty(Mono.fromCallable(() -> visitUsersForMailboxList(null, maildirRoot.listFiles()).stream()))
+            .flatMapIterable(mailboxes -> mailboxes.collect(Guavate.toImmutableList()));
     }
 
     @Override
@@ -279,7 +278,8 @@ public class MaildirMailboxMapper extends NonTransactionalMapper implements Mail
 
     }
 
-    private void visitUsersForMailboxList(File domain, File[] users, List<Mailbox> mailboxList) throws MailboxException {
+    private List<Mailbox> visitUsersForMailboxList(File domain, File[] users) throws MailboxException {
+        ImmutableList.Builder<Mailbox> mailboxList = ImmutableList.builder();
         String userName = null;
         
         for (File user: users) {
@@ -309,6 +309,7 @@ public class MaildirMailboxMapper extends NonTransactionalMapper implements Mail
                 mailboxList.add(maildirStore.loadMailbox(session, mailboxPath));
             }
         }
+        return mailboxList.build();
     }
 
     @Override
diff --git a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMailboxMapper.java b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMailboxMapper.java
index 77db71d..1606798 100644
--- a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMailboxMapper.java
+++ b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMailboxMapper.java
@@ -18,8 +18,6 @@
  ****************************************************************/
 package org.apache.james.mailbox.inmemory.mail;
 
-import java.util.ArrayList;
-import java.util.List;
 import java.util.Optional;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.atomic.AtomicLong;
@@ -139,8 +137,8 @@ public class InMemoryMailboxMapper implements MailboxMapper {
     }
 
     @Override
-    public List<Mailbox> list() throws MailboxException {
-        return new ArrayList<>(mailboxesByPath.values());
+    public Flux<Mailbox> list() {
+        return Flux.fromIterable(mailboxesByPath.values());
     }
 
     @Override
diff --git a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageIdMapper.java b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageIdMapper.java
index bc34599..5e18dad 100644
--- a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageIdMapper.java
+++ b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageIdMapper.java
@@ -40,6 +40,7 @@ import org.apache.james.mailbox.store.mail.MailboxMapper;
 import org.apache.james.mailbox.store.mail.MessageIdMapper;
 import org.apache.james.mailbox.store.mail.MessageMapper;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
+import org.apache.james.util.streams.Iterators;
 
 import com.github.fge.lambdas.Throwing;
 import com.github.steveash.guavate.Guavate;
@@ -57,19 +58,13 @@ public class InMemoryMessageIdMapper implements MessageIdMapper {
 
     @Override
     public List<MailboxMessage> find(Collection<MessageId> messageIds, MessageMapper.FetchType fetchType) {
-        try {
-            return mailboxMapper.list()
-                .stream()
-                .flatMap(Throwing.function(mailbox ->
-                    ImmutableList.copyOf(
-                        messageMapper.findInMailbox(mailbox, MessageRange.all(), fetchType, UNLIMITED))
-                        .stream()))
-                .filter(message -> messageIds.contains(message.getMessageId()))
-                .collect(Guavate.toImmutableList());
-        } catch (MailboxException e) {
-            throw new RuntimeException(e);
-        }
-
+        return mailboxMapper.list()
+            .flatMap(Throwing.function(mailbox ->
+                Iterators.toFlux(
+                    messageMapper.findInMailbox(mailbox, MessageRange.all(), fetchType, UNLIMITED))))
+            .filter(message -> messageIds.contains(message.getMessageId()))
+            .collect(Guavate.toImmutableList())
+            .block();
     }
 
     @Override
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 bb68c0d..901bda5 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
@@ -751,10 +751,10 @@ public class StoreMailboxManager implements MailboxManager {
     public List<MailboxPath> list(MailboxSession session) throws MailboxException {
         return mailboxSessionMapperFactory.getMailboxMapper(session)
             .list()
-            .stream()
             .map(Mailbox::generateAssociatedPath)
             .distinct()
-            .collect(Guavate.toImmutableList());
+            .collect(Guavate.toImmutableList())
+            .block();
     }
 
     @Override
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MailboxMapper.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MailboxMapper.java
index cbf5d03..c5aaf7e 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MailboxMapper.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MailboxMapper.java
@@ -138,5 +138,5 @@ public interface MailboxMapper extends Mapper {
     /**
      * Return a unmodifable {@link List} of all {@link Mailbox}
      */
-    List<Mailbox> list() throws MailboxException;
+    Flux<Mailbox> list() throws MailboxException;
 }
\ No newline at end of file
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MailboxMapperTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MailboxMapperTest.java
index 998a862..749dbf3 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MailboxMapperTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MailboxMapperTest.java
@@ -25,7 +25,6 @@ import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
 import java.util.List;
-import java.util.stream.Stream;
 
 import org.apache.james.core.Username;
 import org.apache.james.mailbox.exception.MailboxException;
@@ -42,8 +41,6 @@ import org.apache.james.mailbox.store.mail.MailboxMapper;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
-import com.google.common.collect.ImmutableList;
-
 /**
  * Generic purpose tests for your implementation MailboxMapper.
  * 
@@ -159,7 +156,7 @@ public abstract class MailboxMapperTest {
     @Test
     void listShouldRetrieveAllMailbox() throws MailboxException {
         createAll();
-        List<Mailbox> mailboxes = mailboxMapper.list();
+        List<Mailbox> mailboxes = mailboxMapper.list().collectList().block();
 
         assertMailboxes(mailboxes)
             .containOnly(benwaInboxMailbox, benwaWorkMailbox, benwaWorkTodoMailbox, benwaPersoMailbox, benwaWorkDoneMailbox, 
diff --git a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ReIndexerPerformer.java b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ReIndexerPerformer.java
index 8e06511..e5640b5 100644
--- a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ReIndexerPerformer.java
+++ b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ReIndexerPerformer.java
@@ -52,7 +52,6 @@ import com.google.common.collect.ImmutableList;
 public class ReIndexerPerformer {
     private static final Logger LOGGER = LoggerFactory.getLogger(ReIndexerPerformer.class);
 
-    private static final int NO_LIMIT = 0;
     private static final int SINGLE_MESSAGE = 1;
     private static final String RE_INDEXING = "re-indexing";
     private static final Username RE_INDEXER_PERFORMER_USER = Username.of(RE_INDEXING);
@@ -111,8 +110,8 @@ public class ReIndexerPerformer {
         MailboxSession mailboxSession = mailboxManager.createSystemSession(RE_INDEXER_PERFORMER_USER);
         LOGGER.info("Starting a full reindex");
         Stream<MailboxId> mailboxIds = mailboxSessionMapperFactory.getMailboxMapper(mailboxSession).list()
-            .stream()
-            .map(Mailbox::getMailboxId);
+            .map(Mailbox::getMailboxId)
+            .toStream();
 
         try {
             return reIndex(mailboxIds, reprocessingContext);
diff --git a/server/container/mailbox-jmx/src/test/java/org/apache/james/adapter/mailbox/MailboxManagementTest.java b/server/container/mailbox-jmx/src/test/java/org/apache/james/adapter/mailbox/MailboxManagementTest.java
index 9cf51e8..d38bbc7 100644
--- a/server/container/mailbox-jmx/src/test/java/org/apache/james/adapter/mailbox/MailboxManagementTest.java
+++ b/server/container/mailbox-jmx/src/test/java/org/apache/james/adapter/mailbox/MailboxManagementTest.java
@@ -69,42 +69,42 @@ public class MailboxManagementTest {
     void deleteMailboxesShouldDeleteMailboxes() throws Exception {
         mapperFactory.createMailboxMapper(session).create(MailboxPath.forUser(USER, "name"), UID_VALIDITY);
         mailboxManagerManagement.deleteMailboxes(USER.asString());
-        assertThat(mapperFactory.createMailboxMapper(session).list()).isEmpty();
+        assertThat(mapperFactory.createMailboxMapper(session).list().collectList().block()).isEmpty();
     }
 
     @Test
     void deleteMailboxesShouldDeleteInbox() throws Exception {
         mapperFactory.createMailboxMapper(session).create(MailboxPath.inbox(USER), UID_VALIDITY);
         mailboxManagerManagement.deleteMailboxes(USER.asString());
-        assertThat(mapperFactory.createMailboxMapper(session).list()).isEmpty();
+        assertThat(mapperFactory.createMailboxMapper(session).list().collectList().block()).isEmpty();
     }
 
     @Test
     void deleteMailboxesShouldDeleteMailboxesChildren() throws Exception {
         mapperFactory.createMailboxMapper(session).create(MailboxPath.forUser(USER, "INBOX.test"), UID_VALIDITY);
         mailboxManagerManagement.deleteMailboxes(USER.asString());
-        assertThat(mapperFactory.createMailboxMapper(session).list()).isEmpty();
+        assertThat(mapperFactory.createMailboxMapper(session).list().collectList().block()).isEmpty();
     }
 
     @Test
     void deleteMailboxesShouldNotDeleteMailboxesBelongingToNotPrivateNamespace() throws Exception {
         Mailbox mailbox = mapperFactory.createMailboxMapper(session).create(new MailboxPath("#top", USER, "name"), UID_VALIDITY);
         mailboxManagerManagement.deleteMailboxes(USER.asString());
-        assertThat(mapperFactory.createMailboxMapper(session).list()).containsExactly(mailbox);
+        assertThat(mapperFactory.createMailboxMapper(session).list().collectList().block()).containsExactly(mailbox);
     }
 
     @Test
     void deleteMailboxesShouldNotDeleteMailboxesBelongingToOtherUsers() throws Exception {
         Mailbox mailbox = mapperFactory.createMailboxMapper(session).create(MailboxPath.forUser(Username.of("userbis"), "name"), UID_VALIDITY);
         mailboxManagerManagement.deleteMailboxes(USER.asString());
-        assertThat(mapperFactory.createMailboxMapper(session).list()).containsExactly(mailbox);
+        assertThat(mapperFactory.createMailboxMapper(session).list().collectList().block()).containsExactly(mailbox);
     }
 
     @Test
     void deleteMailboxesShouldDeleteMailboxesWithEmptyNames() throws Exception {
         mapperFactory.createMailboxMapper(session).create(MailboxPath.forUser(USER, ""), UID_VALIDITY);
         mailboxManagerManagement.deleteMailboxes(USER.asString());
-        assertThat(mapperFactory.createMailboxMapper(session).list()).isEmpty();
+        assertThat(mapperFactory.createMailboxMapper(session).list().collectList().block()).isEmpty();
     }
 
     @Test
@@ -125,13 +125,13 @@ public class MailboxManagementTest {
         mapperFactory.createMailboxMapper(session).create(MailboxPath.forUser(USER, "INBOX"), UID_VALIDITY);
         mapperFactory.createMailboxMapper(session).create(MailboxPath.forUser(USER, "INBOX.test"), UID_VALIDITY);
         mailboxManagerManagement.deleteMailboxes(USER.asString());
-        assertThat(mapperFactory.createMailboxMapper(session).list()).isEmpty();
+        assertThat(mapperFactory.createMailboxMapper(session).list().collectList().block()).isEmpty();
     }
 
     @Test
     void createMailboxShouldCreateAMailbox() throws Exception {
         mailboxManagerManagement.createMailbox(MailboxConstants.USER_NAMESPACE, USER.asString(), "name");
-        assertThat(mapperFactory.createMailboxMapper(session).list()).hasSize(1);
+        assertThat(mapperFactory.createMailboxMapper(session).list().collectList().block()).hasSize(1);
         assertThat(mapperFactory.createMailboxMapper(session)
                 .findMailboxByPath(MailboxPath.forUser(USER, "name"))
                 .blockOptional())
@@ -153,7 +153,7 @@ public class MailboxManagementTest {
         MailboxPath path = MailboxPath.forUser(USER, "name");
         Mailbox mailbox = mapperFactory.createMailboxMapper(session).create(path, UID_VALIDITY);
 
-        assertThat(mapperFactory.createMailboxMapper(session).list()).containsExactly(mailbox);
+        assertThat(mapperFactory.createMailboxMapper(session).list().collectList().block()).containsExactly(mailbox);
     }
 
     @Test
@@ -220,28 +220,28 @@ public class MailboxManagementTest {
     void deleteMailboxShouldDeleteGivenMailbox() throws Exception {
         mapperFactory.createMailboxMapper(session).create(MailboxPath.forUser(USER, "name"), UID_VALIDITY);
         mailboxManagerManagement.deleteMailbox(MailboxConstants.USER_NAMESPACE, USER.asString(), "name");
-        assertThat(mapperFactory.createMailboxMapper(session).list()).isEmpty();
+        assertThat(mapperFactory.createMailboxMapper(session).list().collectList().block()).isEmpty();
     }
 
     @Test
     void deleteMailboxShouldNotDeleteGivenMailboxIfWrongNamespace() throws Exception {
         Mailbox mailbox = mapperFactory.createMailboxMapper(session).create(new MailboxPath("#top", USER, "name"), UID_VALIDITY);
         mailboxManagerManagement.deleteMailbox(MailboxConstants.USER_NAMESPACE, USER.asString(), "name");
-        assertThat(mapperFactory.createMailboxMapper(session).list()).containsOnly(mailbox);
+        assertThat(mapperFactory.createMailboxMapper(session).list().collectList().block()).containsOnly(mailbox);
     }
 
     @Test
     void deleteMailboxShouldNotDeleteGivenMailboxIfWrongUser() throws Exception {
         Mailbox mailbox = mapperFactory.createMailboxMapper(session).create(MailboxPath.forUser(Username.of("userbis"), "name"), UID_VALIDITY);
         mailboxManagerManagement.deleteMailbox(MailboxConstants.USER_NAMESPACE, USER.asString(), "name");
-        assertThat(mapperFactory.createMailboxMapper(session).list()).containsOnly(mailbox);
+        assertThat(mapperFactory.createMailboxMapper(session).list().collectList().block()).containsOnly(mailbox);
     }
 
     @Test
     void deleteMailboxShouldNotDeleteGivenMailboxIfWrongName() throws Exception {
         Mailbox mailbox = mapperFactory.createMailboxMapper(session).create(MailboxPath.forUser(USER, "wrong_name"), UID_VALIDITY);
         mailboxManagerManagement.deleteMailbox(MailboxConstants.USER_NAMESPACE, USER.asString(), "name");
-        assertThat(mapperFactory.createMailboxMapper(session).list()).containsOnly(mailbox);
+        assertThat(mapperFactory.createMailboxMapper(session).list().collectList().block()).containsOnly(mailbox);
     }
 
     @Test


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[james-project] 10/15: JAMES-3172 Rely on Reactor for task execution

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 930a2e3bdd321b889b91e49a37e937f3a5827a21
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Thu May 7 13:42:44 2020 +0700

    JAMES-3172 Rely on Reactor for task execution
---
 .../apache/james/task/SerialTaskManagerWorker.java | 60 ++++++++++++++--------
 .../james/task/SerialTaskManagerWorkerTest.java    |  7 +--
 2 files changed, 41 insertions(+), 26 deletions(-)

diff --git a/server/task/task-memory/src/main/java/org/apache/james/task/SerialTaskManagerWorker.java b/server/task/task-memory/src/main/java/org/apache/james/task/SerialTaskManagerWorker.java
index 8341a16..5438eff 100644
--- a/server/task/task-memory/src/main/java/org/apache/james/task/SerialTaskManagerWorker.java
+++ b/server/task/task-memory/src/main/java/org/apache/james/task/SerialTaskManagerWorker.java
@@ -20,16 +20,14 @@ package org.apache.james.task;
 
 import static org.apache.james.util.ReactorUtils.publishIfPresent;
 
-import java.io.IOException;
 import java.time.Duration;
 import java.util.Optional;
 import java.util.Set;
 import java.util.concurrent.CancellationException;
 import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
 import java.util.concurrent.atomic.AtomicReference;
+import java.util.stream.Stream;
 
 import org.apache.james.util.MDCBuilder;
 import org.apache.james.util.concurrent.NamedThreadFactory;
@@ -42,22 +40,25 @@ import com.google.common.collect.Sets;
 import reactor.core.Disposable;
 import reactor.core.publisher.Flux;
 import reactor.core.publisher.Mono;
+import reactor.core.scheduler.Scheduler;
 import reactor.core.scheduler.Schedulers;
 import reactor.util.function.Tuple2;
 import reactor.util.function.Tuples;
 
 public class SerialTaskManagerWorker implements TaskManagerWorker {
-
     private static final Logger LOGGER = LoggerFactory.getLogger(SerialTaskManagerWorker.class);
-    private final ExecutorService taskExecutor;
+    public static final boolean MAY_INTERRUPT_IF_RUNNING = true;
+
+    private final Scheduler taskExecutor;
     private final Listener listener;
-    private final AtomicReference<Tuple2<TaskId, Future<?>>> runningTask;
+    private final AtomicReference<Tuple2<TaskId, CompletableFuture>> runningTask;
     private final Set<TaskId> cancelledTasks;
     private final Duration pollingInterval;
 
     public SerialTaskManagerWorker(Listener listener, Duration pollingInterval) {
         this.pollingInterval = pollingInterval;
-        this.taskExecutor = Executors.newSingleThreadExecutor(NamedThreadFactory.withName("task executor"));
+        this.taskExecutor = Schedulers.fromExecutor(
+            Executors.newSingleThreadExecutor(NamedThreadFactory.withName("task executor")));
         this.listener = listener;
         this.cancelledTasks = Sets.newConcurrentHashSet();
         this.runningTask = new AtomicReference<>();
@@ -66,7 +67,8 @@ public class SerialTaskManagerWorker implements TaskManagerWorker {
     @Override
     public Mono<Task.Result> executeTask(TaskWithId taskWithId) {
         if (!cancelledTasks.remove(taskWithId.getId())) {
-            CompletableFuture<Task.Result> future = CompletableFuture.supplyAsync(() -> runWithMdc(taskWithId, listener), taskExecutor);
+            Mono<Task.Result> taskMono = Mono.fromCallable(() -> runWithMdc(taskWithId, listener)).subscribeOn(taskExecutor);
+            CompletableFuture<Task.Result> future = taskMono.toFuture();
             runningTask.set(Tuples.of(taskWithId.getId(), future));
 
             return Mono.using(
@@ -109,22 +111,38 @@ public class SerialTaskManagerWorker implements TaskManagerWorker {
 
     private Mono<Task.Result> run(TaskWithId taskWithId, Listener listener) {
         return Mono.from(listener.started(taskWithId.getId()))
-            .then(Mono.fromCallable(() -> runTask(taskWithId, listener)))
-            .onErrorResume(InterruptedException.class, e -> Mono.from(listener.cancelled(taskWithId.getId(), taskWithId.getTask().details())).thenReturn(Task.Result.PARTIAL))
+            .then(runTask(taskWithId, listener))
+            .onErrorResume(this::isCausedByInterruptedException, e -> cancelled(taskWithId, listener))
             .onErrorResume(Exception.class, e -> {
                 LOGGER.error("Error while running task {}", taskWithId.getId(), e);
                 return Mono.from(listener.failed(taskWithId.getId(), taskWithId.getTask().details(), e)).thenReturn(Task.Result.PARTIAL);
             });
     }
 
-    private Task.Result runTask(TaskWithId taskWithId, Listener listener) throws InterruptedException {
-        return taskWithId.getTask()
-            .run()
-            .onComplete(result -> Mono.from(listener.completed(taskWithId.getId(), result, taskWithId.getTask().details())).block())
-            .onFailure(() -> {
-                LOGGER.error("Task was partially performed. Check logs for more details. Taskid : " + taskWithId.getId());
-                Mono.from(listener.failed(taskWithId.getId(), taskWithId.getTask().details())).block();
-            });
+    private boolean isCausedByInterruptedException(Throwable e) {
+        if (e instanceof InterruptedException) {
+            return true;
+        }
+        return Stream.iterate(e, t -> t.getCause() != null, Throwable::getCause)
+            .anyMatch(t -> t instanceof InterruptedException);
+    }
+
+    private Mono<Task.Result> cancelled(TaskWithId taskWithId, Listener listener) {
+        TaskId id = taskWithId.getId();
+        Optional<TaskExecutionDetails.AdditionalInformation> details = taskWithId.getTask().details();
+
+        return Mono.from(listener.cancelled(id, details))
+            .thenReturn(Task.Result.PARTIAL);
+    }
+
+    private Mono<Task.Result> runTask(TaskWithId taskWithId, Listener listener) {
+        return Mono.fromCallable(() -> taskWithId.getTask().run())
+            .doOnNext(result -> result
+                .onComplete(any -> Mono.from(listener.completed(taskWithId.getId(), result, taskWithId.getTask().details())).block())
+                .onFailure(() -> {
+                    LOGGER.error("Task was partially performed. Check logs for more details. Taskid : " + taskWithId.getId());
+                    Mono.from(listener.failed(taskWithId.getId(), taskWithId.getTask().details())).block();
+                }));
     }
 
     @Override
@@ -132,7 +150,7 @@ public class SerialTaskManagerWorker implements TaskManagerWorker {
         cancelledTasks.add(taskId);
         Optional.ofNullable(runningTask.get())
             .filter(task -> task.getT1().equals(taskId))
-            .ifPresent(task -> task.getT2().cancel(true));
+            .ifPresent(task -> task.getT2().cancel(MAY_INTERRUPT_IF_RUNNING));
     }
 
     @Override
@@ -141,7 +159,7 @@ public class SerialTaskManagerWorker implements TaskManagerWorker {
     }
 
     @Override
-    public void close() throws IOException {
-        taskExecutor.shutdownNow();
+    public void close() {
+        taskExecutor.dispose();
     }
 }
diff --git a/server/task/task-memory/src/test/java/org/apache/james/task/SerialTaskManagerWorkerTest.java b/server/task/task-memory/src/test/java/org/apache/james/task/SerialTaskManagerWorkerTest.java
index 0065546..ed17928 100644
--- a/server/task/task-memory/src/test/java/org/apache/james/task/SerialTaskManagerWorkerTest.java
+++ b/server/task/task-memory/src/test/java/org/apache/james/task/SerialTaskManagerWorkerTest.java
@@ -29,7 +29,6 @@ import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.verifyNoMoreInteractions;
 import static org.mockito.Mockito.when;
 
-import java.io.IOException;
 import java.time.Duration;
 import java.util.Optional;
 import java.util.concurrent.CountDownLatch;
@@ -39,7 +38,6 @@ import java.util.concurrent.atomic.AtomicInteger;
 import org.awaitility.Awaitility;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
 
 import reactor.core.publisher.Flux;
@@ -69,7 +67,7 @@ class SerialTaskManagerWorkerTest {
     }
 
     @AfterEach
-    void tearDown() throws IOException {
+    void tearDown() {
         worker.close();
     }
 
@@ -101,7 +99,7 @@ class SerialTaskManagerWorkerTest {
     }
 
     @Test
-    void aRunningTaskShouldHaveAFiniteNumberOfInformation() throws InterruptedException {
+    void aRunningTaskShouldHaveAFiniteNumberOfInformation() {
         TaskWithId taskWithId = new TaskWithId(TaskId.generateTaskId(), new MemoryReferenceWithCounterTask((counter) ->
             Mono.fromCallable(counter::incrementAndGet)
                 .delayElement(Duration.ofSeconds(1))
@@ -170,7 +168,6 @@ class SerialTaskManagerWorkerTest {
         latch.countDown();
     }
 
-    @Disabled("JAMES-3172 We cannot cancel computation started by Reactor")
     @Test
     void taskExecutingReactivelyShouldStopExecutionUponCancel() throws InterruptedException {
         // Provide a task ticking every 100ms in a separate reactor thread


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[james-project] 11/15: JAMES-3172 Mocked tasks should not return null value

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit e717efd5fc3f86e27f1a73d04c9ec6cd698202ac
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Fri May 8 15:18:20 2020 +0700

    JAMES-3172 Mocked tasks should not return null value
---
 .../org/apache/james/adapter/mailbox/ReIndexerManagementTest.java  | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/server/container/mailbox-jmx/src/test/java/org/apache/james/adapter/mailbox/ReIndexerManagementTest.java b/server/container/mailbox-jmx/src/test/java/org/apache/james/adapter/mailbox/ReIndexerManagementTest.java
index 946d6a3..815d33f 100644
--- a/server/container/mailbox-jmx/src/test/java/org/apache/james/adapter/mailbox/ReIndexerManagementTest.java
+++ b/server/container/mailbox-jmx/src/test/java/org/apache/james/adapter/mailbox/ReIndexerManagementTest.java
@@ -21,6 +21,7 @@ package org.apache.james.adapter.mailbox;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
@@ -49,8 +50,9 @@ public class ReIndexerManagementTest {
     }
 
     @Test
-    void reIndexMailboxShouldWaitsForExecution() throws MailboxException {
+    void reIndexMailboxShouldWaitsForExecution() throws Exception {
         Task task = mock(Task.class);
+        doReturn(Task.Result.COMPLETED).when(task).run();
         String namespace = "namespace";
         String user = "user";
         String name = "name";
@@ -63,8 +65,9 @@ public class ReIndexerManagementTest {
     }
 
     @Test
-    void reIndexShouldWaitsForExecution() throws MailboxException {
+    void reIndexShouldWaitsForExecution() throws Exception {
         Task task = mock(Task.class);
+        doReturn(Task.Result.COMPLETED).when(task).run();
         when(reIndexer.reIndex()).thenReturn(task);
 
         assertThat(taskManager.list()).isEmpty();


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[james-project] 07/15: JAMES-3143 SolveMessageInconsistenciesService: Delay confirmation read

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit af594f294a6ed1167d91817177a43605dac24810
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Thu May 7 11:26:35 2020 +0700

    JAMES-3143 SolveMessageInconsistenciesService: Delay confirmation read
    
    We don't need to perform the confirmation if there is no inconsistencies,
    enhencing run performances
---
 .../task/SolveMessageInconsistenciesService.java   | 58 +++++++++++++++-------
 1 file changed, 41 insertions(+), 17 deletions(-)

diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/SolveMessageInconsistenciesService.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/SolveMessageInconsistenciesService.java
index f0ec09b..a052681 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/SolveMessageInconsistenciesService.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/SolveMessageInconsistenciesService.java
@@ -29,6 +29,7 @@ import java.util.concurrent.atomic.AtomicLong;
 
 import javax.inject.Inject;
 
+import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.cassandra.ids.CassandraId;
 import org.apache.james.mailbox.cassandra.ids.CassandraMessageId;
 import org.apache.james.mailbox.cassandra.mail.CassandraMessageIdDAO;
@@ -395,8 +396,8 @@ public class SolveMessageInconsistenciesService {
 
     Mono<Task.Result> fixMessageInconsistencies(Context context) {
         return Flux.concat(
-            fixInconsistenciesInMessageId(context),
-            fixInconsistenciesInImapUid(context))
+                fixInconsistenciesInMessageId(context),
+                fixInconsistenciesInImapUid(context))
             .reduce(Task.Result.COMPLETED, Task::combine);
     }
 
@@ -408,22 +409,40 @@ public class SolveMessageInconsistenciesService {
     }
 
     private Mono<Inconsistency> detectInconsistencyInImapUid(ComposedMessageIdWithMetaData message) {
-        return messageIdToImapUidDAO.retrieve((CassandraMessageId) message.getComposedMessageId().getMessageId(), Optional.of((CassandraId) message.getComposedMessageId().getMailboxId()))
-            .next()
-            .flatMap(this::compareWithMessageIdRecord)
+        return compareWithMessageIdRecord(message)
             .onErrorResume(error -> Mono.just(new FailedToRetrieveRecord(message)));
     }
 
-    private Mono<Inconsistency> compareWithMessageIdRecord(ComposedMessageIdWithMetaData upToDateMessageFromImapUid) {
-        return messageIdDAO.retrieve((CassandraId) upToDateMessageFromImapUid.getComposedMessageId().getMailboxId(), upToDateMessageFromImapUid.getComposedMessageId().getUid())
+    private Mono<Inconsistency> compareWithMessageIdRecord(ComposedMessageIdWithMetaData messageFromImapUid) {
+        CassandraId mailboxId = (CassandraId) messageFromImapUid.getComposedMessageId().getMailboxId();
+        MessageUid uid = messageFromImapUid.getComposedMessageId().getUid();
+        CassandraMessageId messageId = (CassandraMessageId) messageFromImapUid.getComposedMessageId().getMessageId();
+
+        return messageIdDAO.retrieve(mailboxId, uid)
             .handle(publishIfPresent())
-            .map(messageIdRecord -> {
-                if (messageIdRecord.equals(upToDateMessageFromImapUid)) {
-                    return NO_INCONSISTENCY;
+            .flatMap(messageIdRecord -> {
+                if (messageIdRecord.equals(messageFromImapUid)) {
+                    return Mono.just(NO_INCONSISTENCY);
                 }
-                return new OutdatedMessageIdEntry(messageIdRecord, upToDateMessageFromImapUid);
+                return detectOutdatedMessageIdEntry(mailboxId, messageId, messageIdRecord);
             })
-            .switchIfEmpty(Mono.just(new OrphanImapUidEntry(upToDateMessageFromImapUid)));
+            .switchIfEmpty(
+                detectOrphanImapUidEntry(messageFromImapUid, mailboxId, messageId));
+    }
+
+    private Mono<Inconsistency> detectOutdatedMessageIdEntry(CassandraId mailboxId, CassandraMessageId messageId, ComposedMessageIdWithMetaData messageIdRecord) {
+        return messageIdToImapUidDAO.retrieve(messageId, Optional.of(mailboxId))
+            .filter(upToDateMessageFromImapUid -> !upToDateMessageFromImapUid.equals(messageIdRecord))
+            .<Inconsistency>map(upToDateMessageFromImapUid -> new OutdatedMessageIdEntry(messageIdRecord, upToDateMessageFromImapUid))
+            .next()
+            .switchIfEmpty(Mono.just(NO_INCONSISTENCY));
+    }
+
+    private Mono<Inconsistency> detectOrphanImapUidEntry(ComposedMessageIdWithMetaData messageFromImapUid, CassandraId mailboxId, CassandraMessageId messageId) {
+        return messageIdToImapUidDAO.retrieve(messageId, Optional.of(mailboxId))
+            .next()
+            .<Inconsistency>map(OrphanImapUidEntry::new)
+            .switchIfEmpty(Mono.just(NO_INCONSISTENCY));
     }
 
     private Flux<Task.Result> fixInconsistenciesInMessageId(Context context) {
@@ -434,12 +453,17 @@ public class SolveMessageInconsistenciesService {
     }
 
     private Mono<Inconsistency> detectInconsistencyInMessageId(ComposedMessageIdWithMetaData message) {
+        return messageIdToImapUidDAO.retrieve((CassandraMessageId) message.getComposedMessageId().getMessageId(), Optional.of((CassandraId) message.getComposedMessageId().getMailboxId()))
+            .map(uidRecord -> NO_INCONSISTENCY)
+            .next()
+            .switchIfEmpty(detectOrphanMessageIdEntry(message))
+            .onErrorResume(error -> Mono.just(new FailedToRetrieveRecord(message)));
+    }
+
+    private Mono<Inconsistency> detectOrphanMessageIdEntry(ComposedMessageIdWithMetaData message) {
         return messageIdDAO.retrieve((CassandraId) message.getComposedMessageId().getMailboxId(), message.getComposedMessageId().getUid())
             .handle(publishIfPresent())
-            .flatMap(upToDateMessage -> messageIdToImapUidDAO.retrieve((CassandraMessageId) message.getComposedMessageId().getMessageId(), Optional.of((CassandraId) message.getComposedMessageId().getMailboxId()))
-                .map(uidRecord -> NO_INCONSISTENCY)
-                .switchIfEmpty(Mono.just(new OrphanMessageIdEntry(message)))
-                .next())
-            .onErrorResume(error -> Mono.just(new FailedToRetrieveRecord(message)));
+            .<Inconsistency>map(OrphanMessageIdEntry::new)
+            .switchIfEmpty(Mono.just(NO_INCONSISTENCY));
     }
 }
\ No newline at end of file


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[james-project] 02/15: JAMES-3149 Reactify ReIndexing

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 94c5faf60a7ede4c7d26e77039a3c6b45ff8687d
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Tue May 5 09:06:27 2020 +0700

    JAMES-3149 Reactify ReIndexing
    
    Concurrency model:
     - Sequential processing of mailboxes by using `concatMap`
     - Use `flatMap` to control messages concurrency (constant: 50)
---
 .../cassandra/mail/CassandraMessageMapper.java     |  20 ++-
 .../james/mailbox/jpa/mail/JPAMessageMapper.java   |   8 +-
 .../jpa/mail/TransactionalMessageMapper.java       |   4 +-
 .../inmemory/mail/InMemoryMessageIdMapper.java     |  16 +-
 .../mailbox/store/mail/AbstractMessageMapper.java  |   9 +-
 .../james/mailbox/store/mail/MailboxMapper.java    |   2 +-
 .../james/mailbox/store/mail/MessageMapper.java    |  12 +-
 .../store/search/SimpleMessageSearchIndex.java     |   8 +-
 .../StoreMailboxMessageResultIteratorTest.java     |   6 +-
 .../store/mail/model/MessageMapperTest.java        |   9 +-
 .../tools/indexer/ErrorRecoveryIndexationTask.java |   2 +-
 .../mailbox/tools/indexer/FullReindexingTask.java  |  11 +-
 .../tools/indexer/MessageIdReIndexingTask.java     |   2 +-
 .../mailbox/tools/indexer/ReIndexerPerformer.java  | 194 +++++++++------------
 .../tools/indexer/SingleMailboxReindexingTask.java |   3 +-
 .../tools/indexer/SingleMessageReindexingTask.java |  15 +-
 .../mailbox/tools/indexer/UserReindexingTask.java  |  11 +-
 17 files changed, 167 insertions(+), 165 deletions(-)

diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java
index cb31434..2e41530 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java
@@ -109,12 +109,10 @@ public class CassandraMessageMapper implements MessageMapper {
     }
 
     @Override
-    public Iterator<MessageUid> listAllMessageUids(Mailbox mailbox) {
+    public Flux<MessageUid> listAllMessageUids(Mailbox mailbox) {
         CassandraId cassandraId = (CassandraId) mailbox.getMailboxId();
         return messageIdDAO.retrieveMessages(cassandraId, MessageRange.all())
-            .map(metaData -> metaData.getComposedMessageId().getUid())
-            .toIterable()
-            .iterator();
+            .map(metaData -> metaData.getComposedMessageId().getUid());
     }
 
     @Override
@@ -163,14 +161,20 @@ public class CassandraMessageMapper implements MessageMapper {
 
     @Override
     public Iterator<MailboxMessage> findInMailbox(Mailbox mailbox, MessageRange messageRange, FetchType ftype, int max) {
+        return findInMailboxReactive(mailbox, messageRange, ftype, max)
+            .toIterable()
+            .iterator();
+    }
+
+    @Override
+    public Flux<MailboxMessage> findInMailboxReactive(Mailbox mailbox, MessageRange messageRange, FetchType ftype, int limit) {
         CassandraId mailboxId = (CassandraId) mailbox.getMailboxId();
-        return Limit.from(max).applyOnFlux(
+
+        return Limit.from(limit).applyOnFlux(
             messageIdDAO.retrieveMessages(mailboxId, messageRange)
                 .flatMap(id -> retrieveMessage(id, ftype), cassandraConfiguration.getMessageReadChunkSize()))
             .map(MailboxMessage.class::cast)
-            .sort(Comparator.comparing(MailboxMessage::getUid))
-            .toIterable()
-            .iterator();
+            .sort(Comparator.comparing(MailboxMessage::getUid));
     }
 
     private Mono<MailboxMessage> retrieveMessage(ComposedMessageIdWithMetaData messageId, FetchType fetchType) {
diff --git a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMessageMapper.java b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMessageMapper.java
index 9ef0bbc..c853b03 100644
--- a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMessageMapper.java
+++ b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMessageMapper.java
@@ -58,7 +58,8 @@ import org.apache.openjpa.persistence.ArgumentException;
 import com.github.fge.lambdas.Throwing;
 import com.github.steveash.guavate.Guavate;
 import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Iterators;
+
+import reactor.core.publisher.Flux;
 
 /**
  * JPA implementation of a {@link MessageMapper}. This class is not thread-safe!
@@ -88,8 +89,9 @@ public class JPAMessageMapper extends JPATransactionalMapper implements MessageM
     }
 
     @Override
-    public Iterator<MessageUid> listAllMessageUids(final Mailbox mailbox) throws MailboxException {
-        return Iterators.transform(findInMailbox(mailbox, MessageRange.all(), FetchType.Full, UNLIMITED), MailboxMessage::getUid);
+    public Flux<MessageUid> listAllMessageUids(Mailbox mailbox) {
+        return findInMailboxReactive(mailbox, MessageRange.all(), FetchType.Metadata, UNLIMITED)
+            .map(MailboxMessage::getUid);
     }
 
     @Override
diff --git a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/TransactionalMessageMapper.java b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/TransactionalMessageMapper.java
index c6f8f6d..1e7d09b 100644
--- a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/TransactionalMessageMapper.java
+++ b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/TransactionalMessageMapper.java
@@ -40,6 +40,8 @@ import org.apache.james.mailbox.store.mail.MessageMapper;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 import org.apache.james.mailbox.store.transaction.Mapper;
 
+import reactor.core.publisher.Flux;
+
 public class TransactionalMessageMapper implements MessageMapper {
     private final JPAMessageMapper messageMapper;
 
@@ -62,7 +64,7 @@ public class TransactionalMessageMapper implements MessageMapper {
     }
 
     @Override
-    public Iterator<MessageUid> listAllMessageUids(Mailbox mailbox) throws MailboxException {
+    public Flux<MessageUid> listAllMessageUids(Mailbox mailbox) {
         return messageMapper.listAllMessageUids(mailbox);
     }
 
diff --git a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageIdMapper.java b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageIdMapper.java
index 5e18dad..4c8e0af 100644
--- a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageIdMapper.java
+++ b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageIdMapper.java
@@ -40,13 +40,14 @@ import org.apache.james.mailbox.store.mail.MailboxMapper;
 import org.apache.james.mailbox.store.mail.MessageIdMapper;
 import org.apache.james.mailbox.store.mail.MessageMapper;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
-import org.apache.james.util.streams.Iterators;
 
 import com.github.fge.lambdas.Throwing;
 import com.github.steveash.guavate.Guavate;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Multimap;
 
+import reactor.core.publisher.Flux;
+
 public class InMemoryMessageIdMapper implements MessageIdMapper {
     private final MailboxMapper mailboxMapper;
     private final InMemoryMessageMapper messageMapper;
@@ -58,16 +59,19 @@ public class InMemoryMessageIdMapper implements MessageIdMapper {
 
     @Override
     public List<MailboxMessage> find(Collection<MessageId> messageIds, MessageMapper.FetchType fetchType) {
-        return mailboxMapper.list()
-            .flatMap(Throwing.function(mailbox ->
-                Iterators.toFlux(
-                    messageMapper.findInMailbox(mailbox, MessageRange.all(), fetchType, UNLIMITED))))
-            .filter(message -> messageIds.contains(message.getMessageId()))
+        return findReactive(messageIds, fetchType)
             .collect(Guavate.toImmutableList())
             .block();
     }
 
     @Override
+    public Flux<MailboxMessage> findReactive(Collection<MessageId> messageIds, MessageMapper.FetchType fetchType) {
+        return mailboxMapper.list()
+            .flatMap(mailbox -> messageMapper.findInMailboxReactive(mailbox, MessageRange.all(), fetchType, UNLIMITED))
+            .filter(message -> messageIds.contains(message.getMessageId()));
+    }
+
+    @Override
     public List<MailboxId> findMailboxes(MessageId messageId) {
         return find(ImmutableList.of(messageId), MessageMapper.FetchType.Metadata)
             .stream()
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/AbstractMessageMapper.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/AbstractMessageMapper.java
index 5a993d4..9fd5cf3 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/AbstractMessageMapper.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/AbstractMessageMapper.java
@@ -39,7 +39,8 @@ import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 import org.apache.james.mailbox.store.transaction.TransactionalMapper;
 
 import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Iterators;
+
+import reactor.core.publisher.Flux;
 
 /**
  * Abstract base class for {@link MessageMapper} implementation
@@ -149,8 +150,8 @@ public abstract class AbstractMessageMapper extends TransactionalMapper implemen
     protected abstract MessageMetaData copy(Mailbox mailbox, MessageUid uid, ModSeq modSeq, MailboxMessage original) throws MailboxException;
 
     @Override
-    public Iterator<MessageUid> listAllMessageUids(Mailbox mailbox) throws MailboxException {
-        return Iterators.transform(findInMailbox(mailbox, MessageRange.all(), FetchType.Metadata, UNLIMITED),
-            MailboxMessage::getUid);
+    public Flux<MessageUid> listAllMessageUids(Mailbox mailbox) {
+        return findInMailboxReactive(mailbox, MessageRange.all(), FetchType.Metadata, UNLIMITED)
+            .map(MailboxMessage::getUid);
     }
 }
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MailboxMapper.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MailboxMapper.java
index c5aaf7e..059356e 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MailboxMapper.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MailboxMapper.java
@@ -138,5 +138,5 @@ public interface MailboxMapper extends Mapper {
     /**
      * Return a unmodifable {@link List} of all {@link Mailbox}
      */
-    Flux<Mailbox> list() throws MailboxException;
+    Flux<Mailbox> list();
 }
\ No newline at end of file
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MessageMapper.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MessageMapper.java
index d7c8428..2c79390 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MessageMapper.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MessageMapper.java
@@ -37,7 +37,9 @@ import org.apache.james.mailbox.store.FlagsUpdateCalculator;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 import org.apache.james.mailbox.store.mail.model.Property;
 import org.apache.james.mailbox.store.transaction.Mapper;
+import org.apache.james.util.streams.Iterators;
 
+import reactor.core.publisher.Flux;
 import reactor.core.publisher.Mono;
 
 /**
@@ -58,6 +60,14 @@ public interface MessageMapper extends Mapper {
     Iterator<MailboxMessage> findInMailbox(Mailbox mailbox, MessageRange set, FetchType type, int limit)
             throws MailboxException;
 
+    default Flux<MailboxMessage> findInMailboxReactive(Mailbox mailbox, MessageRange set, FetchType type, int limit) {
+        try {
+            return Iterators.toFlux(findInMailbox(mailbox, set, type, limit));
+        } catch (MailboxException e) {
+            return Flux.error(e);
+        }
+    }
+
     /**
      * Returns a list of {@link MessageUid} which are marked as deleted
      */
@@ -147,7 +157,7 @@ public interface MessageMapper extends Mapper {
     /**
      * Return a list containing all MessageUid of Messages that belongs to given {@link Mailbox}
      */
-    Iterator<MessageUid> listAllMessageUids(Mailbox mailbox) throws MailboxException;
+    Flux<MessageUid> listAllMessageUids(Mailbox mailbox);
 
     /**
      * Specify what data needs to get filled in a {@link MailboxMessage} before returning it
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/SimpleMessageSearchIndex.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/SimpleMessageSearchIndex.java
index b33f980..3560b96 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/SimpleMessageSearchIndex.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/SimpleMessageSearchIndex.java
@@ -58,6 +58,7 @@ import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
 
 import reactor.core.publisher.Flux;
+import reactor.core.scheduler.Schedulers;
 
 /**
  * {@link MessageSearchIndex} which just fetch {@link MailboxMessage}'s from the {@link MessageMapper} and use {@link MessageSearcher}
@@ -155,8 +156,9 @@ public class SimpleMessageSearchIndex implements MessageSearchIndex {
         return getAsMessageIds(searchResults(session, filteredMailboxes, searchQuery), limit);
     }
 
-    private Flux<SearchResult> searchResults(MailboxSession session, Flux<Mailbox> mailboxes, SearchQuery query) throws MailboxException {
-        return mailboxes.concatMap(mailbox -> Flux.fromStream(getSearchResultStream(session, query, mailbox)));
+    private Flux<? extends SearchResult> searchResults(MailboxSession session, Flux<Mailbox> mailboxes, SearchQuery query) throws MailboxException {
+        return mailboxes.concatMap(mailbox -> Flux.fromStream(getSearchResultStream(session, query, mailbox)))
+            .subscribeOn(Schedulers.elastic());
     }
 
     private Stream<? extends SearchResult> getSearchResultStream(MailboxSession session, SearchQuery query, Mailbox mailbox) {
@@ -167,7 +169,7 @@ public class SimpleMessageSearchIndex implements MessageSearchIndex {
         }
     }
 
-    private Flux<MessageId> getAsMessageIds(Flux<SearchResult> temp, long limit) {
+    private Flux<MessageId> getAsMessageIds(Flux<? extends SearchResult> temp, long limit) {
         return temp.map(searchResult -> searchResult.getMessageId().get())
             .filter(SearchUtil.distinct())
             .take(Long.valueOf(limit).intValue());
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxMessageResultIteratorTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxMessageResultIteratorTest.java
index 9f56121..c20c807 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxMessageResultIteratorTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxMessageResultIteratorTest.java
@@ -51,6 +51,8 @@ import org.junit.jupiter.api.Test;
 
 import com.google.common.collect.Iterables;
 
+import reactor.core.publisher.Flux;
+
 class StoreMailboxMessageResultIteratorTest {
 
     private final class TestMessageMapper implements MessageMapper {
@@ -61,8 +63,8 @@ class StoreMailboxMessageResultIteratorTest {
         }
 
         @Override
-        public Iterator<MessageUid> listAllMessageUids(Mailbox mailbox) throws MailboxException {
-            return messageRange.iterator();
+        public Flux<MessageUid> listAllMessageUids(Mailbox mailbox) {
+            return Flux.fromIterable(messageRange);
         }
 
         @Override
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageMapperTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageMapperTest.java
index 66ee7bf..99c7186 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageMapperTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageMapperTest.java
@@ -1134,8 +1134,7 @@ public abstract class MessageMapperTest {
     void getUidsShouldReturnUidsOfMessagesInTheMailbox() throws Exception {
         saveMessages();
 
-        assertThat(messageMapper.listAllMessageUids(benwaInboxMailbox))
-            .toIterable()
+        assertThat(messageMapper.listAllMessageUids(benwaInboxMailbox).collectList().block())
             .containsOnly(message1.getUid(),
                 message2.getUid(),
                 message3.getUid(),
@@ -1149,8 +1148,7 @@ public abstract class MessageMapperTest {
 
         messageMapper.deleteMessages(benwaInboxMailbox, ImmutableList.of(message2.getUid(), message3.getUid()));
 
-        assertThat(messageMapper.listAllMessageUids(benwaInboxMailbox))
-            .toIterable()
+        assertThat(messageMapper.listAllMessageUids(benwaInboxMailbox).collectList().block())
             .containsOnly(message1.getUid(),
                 message4.getUid(),
                 message5.getUid());
@@ -1166,8 +1164,7 @@ public abstract class MessageMapperTest {
         List<MessageUid> uids = messageMapper.retrieveMessagesMarkedForDeletion(benwaInboxMailbox, MessageRange.all());
         messageMapper.deleteMessages(benwaInboxMailbox, uids);
 
-        assertThat(messageMapper.listAllMessageUids(benwaInboxMailbox))
-            .toIterable()
+        assertThat(messageMapper.listAllMessageUids(benwaInboxMailbox).collectList().block())
             .containsOnly(message1.getUid(), message5.getUid());
     }
 
diff --git a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ErrorRecoveryIndexationTask.java b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ErrorRecoveryIndexationTask.java
index 73259cb..716f578 100644
--- a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ErrorRecoveryIndexationTask.java
+++ b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ErrorRecoveryIndexationTask.java
@@ -73,7 +73,7 @@ public class ErrorRecoveryIndexationTask implements Task {
 
     @Override
     public Result run() {
-        return reIndexerPerformer.reIndex(reprocessingContext, previousFailures);
+        return reIndexerPerformer.reIndex(reprocessingContext, previousFailures).block();
     }
 
     @Override
diff --git a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/FullReindexingTask.java b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/FullReindexingTask.java
index 39aa268..0e99cdb 100644
--- a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/FullReindexingTask.java
+++ b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/FullReindexingTask.java
@@ -24,7 +24,6 @@ import java.util.Optional;
 import javax.inject.Inject;
 
 import org.apache.james.json.DTOModule;
-import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.server.task.json.dto.TaskDTO;
 import org.apache.james.server.task.json.dto.TaskDTOModule;
 import org.apache.james.task.Task;
@@ -33,6 +32,8 @@ import org.apache.james.task.TaskType;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 
+import reactor.core.publisher.Mono;
+
 public class FullReindexingTask implements Task {
 
     public static final TaskType FULL_RE_INDEXING = TaskType.of("full-reindexing");
@@ -73,11 +74,9 @@ public class FullReindexingTask implements Task {
 
     @Override
     public Result run() {
-        try {
-            return reIndexerPerformer.reIndex(reprocessingContext);
-        } catch (MailboxException e) {
-            return Result.PARTIAL;
-        }
+        return reIndexerPerformer.reIndex(reprocessingContext)
+            .onErrorResume(e -> Mono.just(Result.PARTIAL))
+            .block();
     }
 
     @Override
diff --git a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/MessageIdReIndexingTask.java b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/MessageIdReIndexingTask.java
index 369b7c4..191d0ab 100644
--- a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/MessageIdReIndexingTask.java
+++ b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/MessageIdReIndexingTask.java
@@ -78,7 +78,7 @@ public class MessageIdReIndexingTask implements Task {
 
     @Override
     public Result run() {
-        return reIndexerPerformer.handleMessageIdReindexing(messageId);
+        return reIndexerPerformer.handleMessageIdReindexing(messageId).block();
     }
 
     @Override
diff --git a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ReIndexerPerformer.java b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ReIndexerPerformer.java
index e5640b5..8efcb38 100644
--- a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ReIndexerPerformer.java
+++ b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ReIndexerPerformer.java
@@ -19,16 +19,12 @@
 
 package org.apache.mailbox.tools.indexer;
 
-import java.util.Optional;
-import java.util.stream.Stream;
-
 import javax.inject.Inject;
 
 import org.apache.james.core.Username;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageUid;
-import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.indexer.ReIndexingExecutionFailures;
 import org.apache.james.mailbox.model.Mailbox;
 import org.apache.james.mailbox.model.MailboxId;
@@ -37,24 +33,28 @@ import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.model.MessageRange;
 import org.apache.james.mailbox.model.search.MailboxQuery;
 import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
-import org.apache.james.mailbox.store.mail.MailboxMapper;
 import org.apache.james.mailbox.store.mail.MessageMapper;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 import org.apache.james.mailbox.store.search.ListeningMessageSearchIndex;
 import org.apache.james.task.Task;
-import org.apache.james.util.streams.Iterators;
+import org.apache.james.task.Task.Result;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.github.fge.lambdas.Throwing;
 import com.google.common.collect.ImmutableList;
 
+import reactor.core.publisher.Flux;
+import reactor.core.publisher.Mono;
+
 public class ReIndexerPerformer {
     private static final Logger LOGGER = LoggerFactory.getLogger(ReIndexerPerformer.class);
 
     private static final int SINGLE_MESSAGE = 1;
+    private static final int MESSAGE_CONCURRENCY = 50;
     private static final String RE_INDEXING = "re-indexing";
     private static final Username RE_INDEXER_PERFORMER_USER = Username.of(RE_INDEXING);
+    public static final int NO_CONCURRENCY = 1;
+    public static final int NO_PREFETCH = 1;
 
     private final MailboxManager mailboxManager;
     private final ListeningMessageSearchIndex messageSearchIndex;
@@ -69,138 +69,116 @@ public class ReIndexerPerformer {
         this.mailboxSessionMapperFactory = mailboxSessionMapperFactory;
     }
 
-    Task.Result reIndex(MailboxId mailboxId, ReprocessingContext reprocessingContext) throws Exception {
-        LOGGER.info("Intend to reindex mailbox with mailboxId {}", mailboxId.serialize());
+    Mono<Result> reIndex(MailboxId mailboxId, ReprocessingContext reprocessingContext) {
         MailboxSession mailboxSession = mailboxManager.createSystemSession(RE_INDEXER_PERFORMER_USER);
-        Mailbox mailbox = mailboxSessionMapperFactory.getMailboxMapper(mailboxSession).findMailboxById(mailboxId);
-        messageSearchIndex.deleteAll(mailboxSession, mailboxId).block();
-        try {
-            return Iterators.toStream(
-                mailboxSessionMapperFactory.getMessageMapper(mailboxSession)
-                    .listAllMessageUids(mailbox))
-                .map(uid -> handleMessageReIndexing(mailboxSession, mailbox, uid, reprocessingContext))
+
+        return mailboxSessionMapperFactory.getMailboxMapper(mailboxSession)
+            .findMailboxByIdReactive(mailboxId)
+            .flatMap(mailbox -> reIndex(reprocessingContext, mailboxSession, mailbox));
+    }
+
+    private Mono<Result> reIndex(ReprocessingContext reprocessingContext, MailboxSession mailboxSession, Mailbox mailbox) {
+        LOGGER.info("Attempt to reindex mailbox with mailboxId {}", mailbox.getMailboxId().serialize());
+        return messageSearchIndex.deleteAll(mailboxSession, mailbox.getMailboxId())
+            .then(mailboxSessionMapperFactory.getMessageMapper(mailboxSession)
+                .listAllMessageUids(mailbox)
+                .flatMap(uid -> handleMessageReIndexing(mailboxSession, mailbox, uid, reprocessingContext), MESSAGE_CONCURRENCY)
                 .reduce(Task::combine)
-                .orElse(Task.Result.COMPLETED);
-        } finally {
-            LOGGER.info("Finish to reindex mailbox with mailboxId {}", mailboxId.serialize());
-        }
+                .switchIfEmpty(Mono.just(Result.COMPLETED))
+                .doFinally(any -> LOGGER.info("Finish to reindex mailbox with mailboxId {}", mailbox.getMailboxId().serialize())));
     }
 
-    Task.Result reIndex(ReprocessingContext reprocessingContext, ReIndexingExecutionFailures previousReIndexingFailures) {
-        return previousReIndexingFailures.failures()
-            .stream()
-            .map(previousFailure -> reIndex(reprocessingContext, previousFailure))
+    Mono<Result> reIndex(ReprocessingContext reprocessingContext, ReIndexingExecutionFailures previousReIndexingFailures) {
+        return Flux.fromIterable(previousReIndexingFailures.failures())
+            .flatMap(previousFailure -> reIndex(reprocessingContext, previousFailure), MESSAGE_CONCURRENCY)
             .reduce(Task::combine)
-            .orElse(Task.Result.COMPLETED);
+            .switchIfEmpty(Mono.just(Result.COMPLETED));
     }
 
-    private Task.Result reIndex(ReprocessingContext reprocessingContext, ReIndexingExecutionFailures.ReIndexingFailure previousReIndexingFailure) {
+    private Mono<Result> reIndex(ReprocessingContext reprocessingContext, ReIndexingExecutionFailures.ReIndexingFailure previousReIndexingFailure) {
         MailboxId mailboxId = previousReIndexingFailure.getMailboxId();
         MessageUid uid = previousReIndexingFailure.getUid();
-        try {
-            return handleMessageReIndexing(mailboxId, uid, reprocessingContext);
-        } catch (MailboxException e) {
-            LOGGER.warn("ReIndexing failed for {} {}", mailboxId, uid, e);
-            reprocessingContext.recordFailureDetailsForMessage(mailboxId, uid);
-            return Task.Result.PARTIAL;
-        }
+
+        return handleMessageReIndexing(mailboxId, uid, reprocessingContext)
+            .onErrorResume(e -> {
+                LOGGER.warn("ReIndexing failed for {} {}", mailboxId, uid, e);
+                reprocessingContext.recordFailureDetailsForMessage(mailboxId, uid);
+                return Mono.just(Result.PARTIAL);
+            });
     }
 
-    Task.Result reIndex(ReprocessingContext reprocessingContext) throws MailboxException {
+    Mono<Result> reIndex(ReprocessingContext reprocessingContext) {
         MailboxSession mailboxSession = mailboxManager.createSystemSession(RE_INDEXER_PERFORMER_USER);
         LOGGER.info("Starting a full reindex");
-        Stream<MailboxId> mailboxIds = mailboxSessionMapperFactory.getMailboxMapper(mailboxSession).list()
-            .map(Mailbox::getMailboxId)
-            .toStream();
-
-        try {
-            return reIndex(mailboxIds, reprocessingContext);
-        } finally {
-            LOGGER.info("Full reindex finished");
-        }
+        return mailboxSessionMapperFactory.getMailboxMapper(mailboxSession).list()
+            .flatMap(mailbox -> reIndex(reprocessingContext, mailboxSession, mailbox), NO_CONCURRENCY, NO_PREFETCH)
+            .reduce(Task::combine)
+            .switchIfEmpty(Mono.just(Result.COMPLETED))
+            .doFinally(any -> LOGGER.info("Full reindex finished"));
     }
 
-    Task.Result reIndex(Username username, ReprocessingContext reprocessingContext) throws MailboxException {
+    Mono<Result> reIndex(Username username, ReprocessingContext reprocessingContext) {
         MailboxSession mailboxSession = mailboxManager.createSystemSession(username);
         LOGGER.info("Starting a reindex for user {}", username.asString());
 
-        Stream<MailboxId> mailboxIds = mailboxManager.search(MailboxQuery.privateMailboxesBuilder(mailboxSession).build(), mailboxSession)
-            .stream()
-            .map(MailboxMetaData::getId);
+        MailboxQuery mailboxQuery = MailboxQuery.privateMailboxesBuilder(mailboxSession).build();
 
-        try {
-            return reIndex(mailboxIds, reprocessingContext);
-        } finally {
-            LOGGER.info("User {} reindex finished", username.asString());
-        }
+        return mailboxManager.searchReactive(mailboxQuery, mailboxSession)
+            .map(MailboxMetaData::getId)
+            .flatMap(id -> reIndex(id, reprocessingContext), NO_CONCURRENCY, NO_PREFETCH)
+            .reduce(Task::combine)
+            .switchIfEmpty(Mono.just(Result.COMPLETED))
+            .doFinally(any -> LOGGER.info("User {} reindex finished", username.asString()));
     }
 
-    Task.Result handleMessageReIndexing(MailboxId mailboxId, MessageUid uid, ReprocessingContext reprocessingContext) throws MailboxException {
+    Mono<Result> handleMessageReIndexing(MailboxId mailboxId, MessageUid uid, ReprocessingContext reprocessingContext) {
         MailboxSession mailboxSession = mailboxManager.createSystemSession(RE_INDEXER_PERFORMER_USER);
 
-        Mailbox mailbox = mailboxSessionMapperFactory.getMailboxMapper(mailboxSession).findMailboxById(mailboxId);
-        return handleMessageReIndexing(mailboxSession, mailbox, uid, reprocessingContext);
+        return mailboxSessionMapperFactory.getMailboxMapper(mailboxSession)
+            .findMailboxByIdReactive(mailboxId)
+            .flatMap(mailbox -> handleMessageReIndexing(mailboxSession, mailbox, uid, reprocessingContext));
     }
 
-    Task.Result handleMessageIdReindexing(MessageId messageId) {
-        try {
-            MailboxSession session = mailboxManager.createSystemSession(RE_INDEXER_PERFORMER_USER);
-
-            return mailboxSessionMapperFactory.getMessageIdMapper(session)
-                .find(ImmutableList.of(messageId), MessageMapper.FetchType.Full)
-                .stream()
-                .map(mailboxMessage -> reIndex(mailboxMessage, session))
-                .reduce(Task::combine)
-                .orElse(Task.Result.COMPLETED);
-        } catch (Exception e) {
-            LOGGER.warn("Failed to re-index {}", messageId, e);
-            return Task.Result.PARTIAL;
-        }
-    }
+    Mono<Result> handleMessageIdReindexing(MessageId messageId) {
+        MailboxSession session = mailboxManager.createSystemSession(RE_INDEXER_PERFORMER_USER);
 
-    private Task.Result reIndex(MailboxMessage mailboxMessage, MailboxSession session) {
-        try {
-            MailboxMapper mailboxMapper = mailboxSessionMapperFactory.getMailboxMapper(session);
-            Mailbox mailbox = mailboxMapper.findMailboxById(mailboxMessage.getMailboxId());
-            messageSearchIndex.add(session, mailbox, mailboxMessage).block();
-            return Task.Result.COMPLETED;
-        } catch (Exception e) {
-            LOGGER.warn("Failed to re-index {} in {}", mailboxMessage.getUid(), mailboxMessage.getMailboxId(), e);
-            return Task.Result.PARTIAL;
-        }
+        return mailboxSessionMapperFactory.getMessageIdMapper(session)
+            .findReactive(ImmutableList.of(messageId), MessageMapper.FetchType.Full)
+            .flatMap(mailboxMessage -> reIndex(mailboxMessage, session))
+            .reduce(Task::combine)
+            .switchIfEmpty(Mono.just(Result.COMPLETED))
+            .onErrorResume(e -> {
+                LOGGER.warn("Failed to re-index {}", messageId, e);
+                return Mono.just(Result.PARTIAL);
+            });
     }
 
-    private Task.Result reIndex(Stream<MailboxId> mailboxIds, ReprocessingContext reprocessingContext) {
-        return mailboxIds
-            .map(mailboxId -> {
-                try {
-                    return reIndex(mailboxId, reprocessingContext);
-                } catch (Throwable e) {
-                    LOGGER.error("Error while proceeding to full reindexing on mailbox with mailboxId {}", mailboxId.serialize(), e);
-                    return Task.Result.PARTIAL;
-                }
-            })
-            .reduce(Task::combine)
-            .orElse(Task.Result.COMPLETED);
+    private Mono<Result> reIndex(MailboxMessage mailboxMessage, MailboxSession session) {
+        return mailboxSessionMapperFactory.getMailboxMapper(session)
+            .findMailboxByIdReactive(mailboxMessage.getMailboxId())
+            .flatMap(mailbox -> messageSearchIndex.add(session, mailbox, mailboxMessage))
+            .thenReturn(Result.COMPLETED)
+            .onErrorResume(e -> {
+                LOGGER.warn("Failed to re-index {} in {}", mailboxMessage.getUid(), mailboxMessage.getMailboxId(), e);
+                return Mono.just(Result.PARTIAL);
+            });
     }
 
-    private Task.Result handleMessageReIndexing(MailboxSession mailboxSession, Mailbox mailbox, MessageUid uid, ReprocessingContext reprocessingContext) {
-        try {
-            Optional.of(uid)
-                .flatMap(Throwing.function(mUid -> fullyReadMessage(mailboxSession, mailbox, mUid)))
-                .ifPresent(message -> messageSearchIndex.add(mailboxSession, mailbox, message).block());
-            reprocessingContext.recordSuccess();
-            return Task.Result.COMPLETED;
-        } catch (Exception e) {
-            LOGGER.warn("ReIndexing failed for {} {}", mailbox.generateAssociatedPath(), uid, e);
-            reprocessingContext.recordFailureDetailsForMessage(mailbox.getMailboxId(), uid);
-            return Task.Result.PARTIAL;
-        }
+    private Mono<Result> handleMessageReIndexing(MailboxSession mailboxSession, Mailbox mailbox, MessageUid uid, ReprocessingContext reprocessingContext) {
+        return fullyReadMessage(mailboxSession, mailbox, uid)
+            .flatMap(message -> messageSearchIndex.add(mailboxSession, mailbox, message))
+            .thenReturn(Result.COMPLETED)
+            .doOnNext(any -> reprocessingContext.recordSuccess())
+            .onErrorResume(e -> {
+                LOGGER.warn("ReIndexing failed for {} {}", mailbox.generateAssociatedPath(), uid, e);
+                reprocessingContext.recordFailureDetailsForMessage(mailbox.getMailboxId(), uid);
+                return Mono.just(Result.PARTIAL);
+            });
     }
 
-    private Optional<MailboxMessage> fullyReadMessage(MailboxSession mailboxSession, Mailbox mailbox, MessageUid mUid) throws MailboxException {
-        return Iterators.toStream(mailboxSessionMapperFactory.getMessageMapper(mailboxSession)
-            .findInMailbox(mailbox, MessageRange.one(mUid), MessageMapper.FetchType.Full, SINGLE_MESSAGE))
-            .findFirst();
+    private Mono<MailboxMessage> fullyReadMessage(MailboxSession mailboxSession, Mailbox mailbox, MessageUid mUid) {
+        return mailboxSessionMapperFactory.getMessageMapper(mailboxSession)
+            .findInMailboxReactive(mailbox, MessageRange.one(mUid), MessageMapper.FetchType.Full, SINGLE_MESSAGE)
+            .next();
     }
 }
diff --git a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/SingleMailboxReindexingTask.java b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/SingleMailboxReindexingTask.java
index 737be90..0e9580d 100644
--- a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/SingleMailboxReindexingTask.java
+++ b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/SingleMailboxReindexingTask.java
@@ -79,7 +79,8 @@ public class SingleMailboxReindexingTask implements Task {
     @Override
     public Result run() {
         try {
-            return reIndexerPerformer.reIndex(mailboxId, reprocessingContext);
+            return reIndexerPerformer.reIndex(mailboxId, reprocessingContext)
+                .block();
         } catch (Exception e) {
             return Result.PARTIAL;
         }
diff --git a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/SingleMessageReindexingTask.java b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/SingleMessageReindexingTask.java
index 77ea683..08c014b 100644
--- a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/SingleMessageReindexingTask.java
+++ b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/SingleMessageReindexingTask.java
@@ -26,7 +26,6 @@ import java.util.Optional;
 import javax.inject.Inject;
 
 import org.apache.james.mailbox.MessageUid;
-import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.task.Task;
 import org.apache.james.task.TaskExecutionDetails;
@@ -34,6 +33,8 @@ import org.apache.james.task.TaskType;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import reactor.core.publisher.Mono;
+
 public class SingleMessageReindexingTask implements Task {
     private static final Logger LOGGER = LoggerFactory.getLogger(SingleMessageReindexingTask.class);
 
@@ -95,12 +96,12 @@ public class SingleMessageReindexingTask implements Task {
 
     @Override
     public Result run() {
-        try {
-            return reIndexerPerformer.handleMessageReIndexing(mailboxId, uid, new ReprocessingContext());
-        } catch (MailboxException e) {
-            LOGGER.warn("Error encounteres while reindexing {} : {}", mailboxId, uid, e);
-            return Result.PARTIAL;
-        }
+        return reIndexerPerformer.handleMessageReIndexing(mailboxId, uid, new ReprocessingContext())
+            .onErrorResume(e -> {
+                LOGGER.warn("Error encountered while reindexing {} : {}", mailboxId, uid, e);
+                return Mono.just(Result.PARTIAL);
+            })
+            .block();
     }
 
     MailboxId getMailboxId() {
diff --git a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/UserReindexingTask.java b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/UserReindexingTask.java
index 9a7a863..d1ff42b 100644
--- a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/UserReindexingTask.java
+++ b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/UserReindexingTask.java
@@ -26,12 +26,13 @@ import java.util.Optional;
 import javax.inject.Inject;
 
 import org.apache.james.core.Username;
-import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.indexer.ReIndexingExecutionFailures;
 import org.apache.james.task.Task;
 import org.apache.james.task.TaskExecutionDetails;
 import org.apache.james.task.TaskType;
 
+import reactor.core.publisher.Mono;
+
 public class UserReindexingTask implements Task {
 
     public static final TaskType USER_RE_INDEXING = TaskType.of("user-reindexing");
@@ -78,11 +79,9 @@ public class UserReindexingTask implements Task {
 
     @Override
     public Result run() {
-        try {
-            return reIndexerPerformer.reIndex(username, reprocessingContext);
-        } catch (MailboxException e) {
-            return Result.PARTIAL;
-        }
+        return reIndexerPerformer.reIndex(username, reprocessingContext)
+            .onErrorResume(e -> Mono.just(Result.PARTIAL))
+            .block();
     }
 
     public Username getUsername() {


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[james-project] 08/15: JAMES-3172 We cannot cancel computation started by Reactor

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit dc46a4497d0b9b7c1be16b476dafa347c921ff40
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Thu May 7 13:31:06 2020 +0700

    JAMES-3172 We cannot cancel computation started by Reactor
---
 .../james/task/SerialTaskManagerWorkerTest.java    | 37 +++++++++++++++++++++-
 1 file changed, 36 insertions(+), 1 deletion(-)

diff --git a/server/task/task-memory/src/test/java/org/apache/james/task/SerialTaskManagerWorkerTest.java b/server/task/task-memory/src/test/java/org/apache/james/task/SerialTaskManagerWorkerTest.java
index 5c4f23d..0065546 100644
--- a/server/task/task-memory/src/test/java/org/apache/james/task/SerialTaskManagerWorkerTest.java
+++ b/server/task/task-memory/src/test/java/org/apache/james/task/SerialTaskManagerWorkerTest.java
@@ -25,7 +25,6 @@ import static org.mockito.ArgumentMatchers.notNull;
 import static org.mockito.Mockito.atLeastOnce;
 import static org.mockito.Mockito.atMost;
 import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.verifyNoMoreInteractions;
 import static org.mockito.Mockito.when;
@@ -40,8 +39,10 @@ import java.util.concurrent.atomic.AtomicInteger;
 import org.awaitility.Awaitility;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
 
+import reactor.core.publisher.Flux;
 import reactor.core.publisher.Mono;
 
 class SerialTaskManagerWorkerTest {
@@ -169,6 +170,40 @@ class SerialTaskManagerWorkerTest {
         latch.countDown();
     }
 
+    @Disabled("JAMES-3172 We cannot cancel computation started by Reactor")
+    @Test
+    void taskExecutingReactivelyShouldStopExecutionUponCancel() throws InterruptedException {
+        // Provide a task ticking every 100ms in a separate reactor thread
+        AtomicInteger tickCount = new AtomicInteger();
+        int tikIntervalInMs = 100;
+        MemoryReferenceTask tickTask = new MemoryReferenceTask(() -> Flux.interval(Duration.ofMillis(tikIntervalInMs))
+            .flatMap(any -> Mono.fromCallable(() -> {
+                tickCount.incrementAndGet();
+                return Task.Result.COMPLETED;
+            }))
+            .reduce(Task::combine)
+            .thenReturn(Task.Result.COMPLETED)
+            .block());
+
+        // Execute the task
+        TaskId id = TaskId.generateTaskId();
+        TaskWithId taskWithId = new TaskWithId(id, tickTask);
+        Mono<Task.Result> resultMono = worker.executeTask(taskWithId).cache();
+        resultMono.subscribe();
+        Awaitility.waitAtMost(org.awaitility.Duration.TEN_SECONDS)
+            .untilAsserted(() -> verify(listener, atLeastOnce()).started(id));
+
+        worker.cancelTask(id);
+
+        Thread.sleep(tikIntervalInMs);
+
+        int tikCountSnapshot1 = tickCount.get();
+        Thread.sleep(2 * tikIntervalInMs);
+        int tikCountSnapshot2 = tickCount.get();
+        // If the task had effectively been canceled tikCount should no longer be incremented
+        assertThat(tikCountSnapshot1).isEqualTo(tikCountSnapshot2);
+    }
+
     @Test
     void theWorkerShouldCancelAnInProgressTask() throws InterruptedException {
         TaskId id = TaskId.generateTaskId();


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[james-project] 06/15: JAMES-3143 Add concurrency tests for message projection corrections

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit fa9136cdc3ad53ee564ce629324b399e4f7f761f
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Thu May 7 11:25:19 2020 +0700

    JAMES-3143 Add concurrency tests for message projection corrections
---
 .../SolveMessageInconsistenciesServiceTest.java    | 95 ++++++++++++++++++++++
 1 file changed, 95 insertions(+)

diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/SolveMessageInconsistenciesServiceTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/SolveMessageInconsistenciesServiceTest.java
index 06b7054..9b60935 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/SolveMessageInconsistenciesServiceTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/SolveMessageInconsistenciesServiceTest.java
@@ -19,6 +19,7 @@
 
 package org.apache.james.mailbox.cassandra.mail.task;
 
+import static org.apache.james.backends.cassandra.Scenario.Builder.awaitOn;
 import static org.apache.james.backends.cassandra.Scenario.Builder.fail;
 import static org.assertj.core.api.Assertions.assertThat;
 
@@ -28,6 +29,7 @@ import javax.mail.Flags;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
+import org.apache.james.backends.cassandra.Scenario;
 import org.apache.james.backends.cassandra.components.CassandraModule;
 import org.apache.james.backends.cassandra.versions.CassandraSchemaVersionModule;
 import org.apache.james.mailbox.MessageUid;
@@ -47,6 +49,9 @@ import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
+import reactor.core.publisher.Mono;
+import reactor.core.scheduler.Schedulers;
+
 public class SolveMessageInconsistenciesServiceTest {
 
     private static final CassandraId MAILBOX_ID = CassandraId.timeBased();
@@ -150,6 +155,65 @@ public class SolveMessageInconsistenciesServiceTest {
         }
 
         @Test
+        void shouldNotConsiderPendingMessageUpdatesAsInconsistency(CassandraCluster cassandra) throws Exception {
+            imapUidDAO.insert(MESSAGE_1_WITH_SEEN_FLAG).block();
+            messageIdDAO.insert(MESSAGE_1).block();
+
+            Scenario.Barrier barrier = new Scenario.Barrier(1);
+            cassandra.getConf()
+                .registerScenario(awaitOn(barrier)
+                    .thenExecuteNormally()
+                    .times(1)
+                    .whenQueryStartsWith("SELECT messageId,mailboxId,uid,modSeq,flagAnswered,flagDeleted,flagDraft,flagFlagged,flagRecent,flagSeen,flagUser,userFlags FROM messageIdTable WHERE mailboxId=:mailboxId AND uid=:uid;"));
+
+            Context context = new Context();
+            Mono<Task.Result> task = testee.fixMessageInconsistencies(context).subscribeOn(Schedulers.elastic()).cache();
+            task.subscribe();
+
+            barrier.awaitCaller();
+            messageIdDAO.insert(MESSAGE_1_WITH_SEEN_FLAG).block();
+            barrier.releaseCaller();
+
+            task.block();
+
+            // Verify that no inconsistency is fixed
+            assertThat(context.snapshot())
+                .isEqualTo(Context.Snapshot.builder()
+                    .processedImapUidEntries(1)
+                    .processedMessageIdEntries(1)
+                    .build());
+        }
+
+        @Test
+        void shouldNotConsiderPendingMessageInsertsAsInconsistency(CassandraCluster cassandra) throws Exception {
+            imapUidDAO.insert(MESSAGE_1).block();
+
+            Scenario.Barrier barrier = new Scenario.Barrier(1);
+            cassandra.getConf()
+                .registerScenario(awaitOn(barrier)
+                    .thenExecuteNormally()
+                    .times(1)
+                    .whenQueryStartsWith("SELECT messageId,mailboxId,uid,modSeq,flagAnswered,flagDeleted,flagDraft,flagFlagged,flagRecent,flagSeen,flagUser,userFlags FROM messageIdTable WHERE mailboxId=:mailboxId AND uid=:uid;"));
+
+            Context context = new Context();
+            Mono<Task.Result> task = testee.fixMessageInconsistencies(context).subscribeOn(Schedulers.elastic()).cache();
+            task.subscribe();
+
+            barrier.awaitCaller();
+            messageIdDAO.insert(MESSAGE_1).block();
+            barrier.releaseCaller();
+
+            task.block();
+
+            // Verify that no inconsistency is fixed
+            assertThat(context.snapshot())
+                .isEqualTo(Context.Snapshot.builder()
+                    .processedImapUidEntries(1)
+                    .processedMessageIdEntries(0)
+                    .build());
+        }
+
+        @Test
         void fixMessageInconsistenciesShouldResolveInconsistentData() {
             imapUidDAO.insert(MESSAGE_1).block();
 
@@ -314,6 +378,37 @@ public class SolveMessageInconsistenciesServiceTest {
         }
 
         @Test
+        void shouldNotConsiderPendingMessageDeleteAsInconsistency(CassandraCluster cassandra) throws Exception {
+            messageIdDAO.insert(MESSAGE_1).block();
+
+            Scenario.Barrier barrier = new Scenario.Barrier(1);
+            cassandra.getConf()
+                .registerScenario(awaitOn(barrier)
+                    .thenExecuteNormally()
+                    .times(1)
+                    .whenQueryStartsWith("SELECT messageId,mailboxId,uid,modSeq,flagAnswered,flagDeleted," +
+                        "flagDraft,flagFlagged,flagRecent,flagSeen,flagUser,userFlags FROM messageIdTable " +
+                        "WHERE mailboxId=:mailboxId AND uid=:uid;"));
+
+            Context context = new Context();
+            Mono<Task.Result> task = testee.fixMessageInconsistencies(context).subscribeOn(Schedulers.elastic()).cache();
+            task.subscribe();
+
+            barrier.awaitCaller();
+            messageIdDAO.delete(MAILBOX_ID, MESSAGE_UID_1).block();
+            barrier.releaseCaller();
+
+            task.block();
+
+            // Verify that no inconsistency is fixed
+            assertThat(context.snapshot())
+                .isEqualTo(Context.Snapshot.builder()
+                    .processedImapUidEntries(0)
+                    .processedMessageIdEntries(1)
+                    .build());
+        }
+
+        @Test
         void fixMessageInconsistenciesShouldResolveInconsistentData() {
             messageIdDAO.insert(MESSAGE_1).block();
 


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org