You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@james.apache.org by bt...@apache.org on 2022/12/06 01:51:59 UTC

[james-project] branch master updated: [REFACTORING] More flexible fetch groups for Mailbox metadata (#1347)

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


The following commit(s) were added to refs/heads/master by this push:
     new d8e6e092c8 [REFACTORING] More flexible fetch groups for Mailbox metadata (#1347)
d8e6e092c8 is described below

commit d8e6e092c8f185f6eb7d4a49b37848c57ea291ed
Author: Benoit TELLIER <bt...@linagora.com>
AuthorDate: Tue Dec 6 08:51:53 2022 +0700

    [REFACTORING] More flexible fetch groups for Mailbox metadata (#1347)
---
 .../org/apache/james/mailbox/MessageManager.java   | 35 ++++++--
 .../james/mailbox/store/StoreMessageManager.java   | 98 ++++++++--------------
 .../imap/processor/AbstractSelectionProcessor.java |  6 +-
 .../james/imap/processor/ExpungeProcessor.java     |  4 +-
 .../james/imap/processor/GetACLProcessor.java      |  5 +-
 .../james/imap/processor/SearchProcessor.java      |  3 +-
 .../james/imap/processor/StatusProcessor.java      | 19 +++--
 .../james/imap/processor/StoreProcessor.java       |  3 +-
 .../james/imap/processor/fetch/FetchProcessor.java |  3 +-
 .../james/imap/processor/GetACLProcessorTest.java  |  4 +-
 .../imap/processor/ListRightsProcessorTest.java    |  3 +-
 11 files changed, 96 insertions(+), 87 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 5a787665c0..e2d666df6e 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
@@ -473,10 +473,14 @@ public interface MessageManager {
      *            describes which optional data should be returned
      * @return metadata view filtered for the session's user, not null
      */
-    MailboxMetaData getMetaData(RecentMode recentMode, MailboxSession mailboxSession, MailboxMetaData.FetchGroup fetchGroup) throws MailboxException;
+    default MailboxMetaData getMetaData(RecentMode recentMode, MailboxSession mailboxSession, MailboxMetaData.FetchGroup fetchGroup) throws MailboxException {
+        return getMetaData(recentMode, mailboxSession, fetchGroup.getItems());
+    }
+
+    MailboxMetaData getMetaData(RecentMode recentMode, MailboxSession mailboxSession, EnumSet<MailboxMetaData.Item> items) throws MailboxException;
 
-    default Mono<MailboxMetaData> getMetaDataReactive(RecentMode recentMode, MailboxSession mailboxSession, MailboxMetaData.FetchGroup fetchGroup) throws MailboxException {
-        return Mono.fromCallable(() -> getMetaData(recentMode, mailboxSession, fetchGroup));
+    default Mono<MailboxMetaData> getMetaDataReactive(RecentMode recentMode, MailboxSession mailboxSession, EnumSet<MailboxMetaData.Item> items) throws MailboxException {
+        return Mono.fromCallable(() -> getMetaData(recentMode, mailboxSession, items));
     }
 
     /**
@@ -490,6 +494,13 @@ public interface MessageManager {
             IGNORE
         }
 
+        public enum Item {
+            MailboxCounters,
+            FirstUnseen,
+            HighestModSeq,
+            NextUid
+        }
+
         /**
          * Describes the optional data types which will get set in the
          * {@link MailboxMetaData}.
@@ -502,22 +513,32 @@ public interface MessageManager {
             /**
              * Only include the message and recent count
              */
-            NO_UNSEEN,
+            NO_UNSEEN(EnumSet.of(Item.MailboxCounters, Item.NextUid, Item.HighestModSeq)),
 
             /**
              * Only include the unseen message and recent count
              */
-            UNSEEN_COUNT,
+            UNSEEN_COUNT(EnumSet.of(Item.MailboxCounters, Item.NextUid, Item.HighestModSeq)),
 
             /**
              * Only include the first unseen and the recent count
              */
-            FIRST_UNSEEN,
+            FIRST_UNSEEN(EnumSet.of(Item.MailboxCounters, Item.NextUid, Item.HighestModSeq, Item.FirstUnseen)),
 
             /**
              * Only return the "always set" metadata as documented above
              */
-            NO_COUNT
+            NO_COUNT(EnumSet.of(Item.NextUid, Item.HighestModSeq));
+
+            private final EnumSet<Item> items;
+
+            FetchGroup(EnumSet<Item> items) {
+                this.items = items;
+            }
+
+            public EnumSet<Item> getItems() {
+                return items;
+            }
         }
 
         /**
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 4967109955..5d3fb854bf 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
@@ -575,85 +575,59 @@ public class StoreMessageManager implements MessageManager {
     }
 
     @Override
-    public Mono<MailboxMetaData> getMetaDataReactive(RecentMode recentMode, MailboxSession mailboxSession, MailboxMetaData.FetchGroup fetchGroup) throws MailboxException {
+    public Mono<MailboxMetaData> getMetaDataReactive(RecentMode recentMode, MailboxSession mailboxSession, EnumSet<MailboxMetaData.Item> items) throws MailboxException {
         MailboxACL resolvedAcl = getResolvedAcl(mailboxSession);
-        boolean hasReadRight = storeRightManager.hasRight(mailbox, MailboxACL.Right.Read, mailboxSession);
-        if (!hasReadRight) {
+        if (!storeRightManager.hasRight(mailbox, MailboxACL.Right.Read, mailboxSession)) {
             return Mono.just(MailboxMetaData.sensibleInformationFree(resolvedAcl, getMailboxEntity().getUidValidity(), isWriteable(mailboxSession)));
         }
         Flags permanentFlags = getPermanentFlags(mailboxSession);
         UidValidity uidValidity = getMailboxEntity().getUidValidity();
         MessageMapper messageMapper = mapperFactory.getMessageMapper(mailboxSession);
 
-        return messageMapper.executeReactive(Mono.zip(messageMapper.getLastUidReactive(mailbox)
-                .map(optional -> optional
-                    .map(MessageUid::next)
-                    .orElse(MessageUid.MIN_VALUE)),
-            messageMapper.getHighestModSeqReactive(mailbox))
-            .flatMap(t2 -> toMetadata(messageMapper, recentMode, mailboxSession, fetchGroup, resolvedAcl, permanentFlags, uidValidity, t2.getT1(), t2.getT2())));
-    }
-
-    @Override
-    public MailboxMetaData getMetaData(RecentMode resetRecent, MailboxSession mailboxSession, MailboxMetaData.FetchGroup fetchGroup) throws MailboxException {
-        return MailboxReactorUtils.block(getMetaDataReactive(resetRecent, mailboxSession, fetchGroup));
-    }
-
-    private Mono<MailboxMetaData> toMetadata(MessageMapper messageMapper, RecentMode resetRecent, MailboxSession mailboxSession, MailboxMetaData.FetchGroup fetchGroup, MailboxACL resolvedAcl, Flags permanentFlags, UidValidity uidValidity, MessageUid uidNext, ModSeq highestModSeq) {
-        try {
-            switch (fetchGroup) {
-                case UNSEEN_COUNT:
-                    return metadataUnseenCount(messageMapper, resetRecent, mailboxSession, resolvedAcl, permanentFlags, uidValidity, uidNext, highestModSeq);
-                case FIRST_UNSEEN:
-                    return metadataFirstUnseen(messageMapper, resetRecent, mailboxSession, resolvedAcl, permanentFlags, uidValidity, uidNext, highestModSeq);
-                case NO_UNSEEN:
-                    return metadataNoUnseen(messageMapper, resetRecent, mailboxSession, resolvedAcl, permanentFlags, uidValidity, uidNext, highestModSeq);
-                default:
-                    return metadataDefault(resetRecent, mailboxSession, resolvedAcl, permanentFlags, uidValidity, uidNext, highestModSeq);
-            }
-        } catch (MailboxException e) {
-            return Mono.error(e);
+        return messageMapper.executeReactive(
+                Mono.zip(nextUid(messageMapper, items),
+                highestModSeq(messageMapper, items),
+                firstUnseen(messageMapper, items),
+                mailboxCounters(messageMapper, items),
+                recent(recentMode, mailboxSession))
+            .map(t5 -> new MailboxMetaData(t5.getT5(), permanentFlags, uidValidity, t5.getT1(), t5.getT2(), t5.getT4().getCount(),
+                t5.getT4().getUnseen(), t5.getT3().orElse(null), isWriteable(mailboxSession), resolvedAcl)));
+    }
+
+    private Mono<ModSeq> highestModSeq(MessageMapper messageMapper, EnumSet<MailboxMetaData.Item> items) {
+        if (items.contains(MailboxMetaData.Item.HighestModSeq)) {
+            return messageMapper.getHighestModSeqReactive(mailbox);
         }
+        return Mono.just(ModSeq.first());
     }
 
-    private Mono<MailboxMetaData> metadataDefault(RecentMode recentMode, MailboxSession mailboxSession, MailboxACL resolvedAcl, Flags permanentFlags, UidValidity uidValidity, MessageUid uidNext, ModSeq highestModSeq) throws MailboxException {
-        MessageUid firstUnseen = null;
-        long unseenCount = 0;
-        long messageCount = -1;
-        List<MessageUid> recent = new ArrayList<>();
-        final MailboxMetaData metaData = new MailboxMetaData(recent, permanentFlags, uidValidity, uidNext, highestModSeq, messageCount, unseenCount, firstUnseen, isWriteable(mailboxSession), resolvedAcl);
-
-        // just reset the recent but not include them in the metadata
-        if (recentMode == RecentMode.RESET) {
-            return recent(recentMode, mailboxSession)
-                .thenReturn(metaData);
+    private Mono<MessageUid> nextUid(MessageMapper messageMapper, EnumSet<MailboxMetaData.Item> items) {
+        if (items.contains(MailboxMetaData.Item.NextUid)) {
+            return messageMapper.getLastUidReactive(mailbox)
+                .map(optional -> optional
+                    .map(MessageUid::next)
+                    .orElse(MessageUid.MIN_VALUE));
         }
-        return Mono.just(metaData);
+        return Mono.just(MessageUid.MIN_VALUE);
     }
 
-    private Mono<MailboxMetaData> metadataNoUnseen(MessageMapper messageMapper, RecentMode recentMode, MailboxSession mailboxSession, MailboxACL resolvedAcl, Flags permanentFlags, UidValidity uidValidity, MessageUid uidNext, ModSeq highestModSeq) throws MailboxException {
-        MessageUid firstUnseen = null;
-        long unseenCount = 0;
-        return Mono.zip(
-            messageMapper.getMailboxCountersReactive(mailbox).map(MailboxCounters::getUnseen),
-            recent(recentMode, mailboxSession))
-            .map(Throwing.function(t2 -> new MailboxMetaData(t2.getT2(), permanentFlags, uidValidity, uidNext, highestModSeq, t2.getT1(), unseenCount, firstUnseen, isWriteable(mailboxSession), resolvedAcl)));
+    private Mono<Optional<MessageUid>> firstUnseen(MessageMapper messageMapper, EnumSet<MailboxMetaData.Item> items) {
+        if (items.contains(MailboxMetaData.Item.FirstUnseen)) {
+            return messageMapper.findFirstUnseenMessageUidReactive(getMailboxEntity());
+        }
+        return Mono.just(Optional.empty());
     }
 
-    private Mono<MailboxMetaData> metadataFirstUnseen(MessageMapper messageMapper, RecentMode recentMode, MailboxSession mailboxSession, MailboxACL resolvedAcl, Flags permanentFlags, UidValidity uidValidity, MessageUid uidNext, ModSeq highestModSeq) throws MailboxException {
-        long unseenCount = 0;
-        return Mono.zip(
-            messageMapper.getMailboxCountersReactive(mailbox).map(MailboxCounters::getCount),
-            recent(recentMode, mailboxSession),
-            messageMapper.findFirstUnseenMessageUidReactive(getMailboxEntity()))
-            .map(Throwing.function(t3 -> new MailboxMetaData(t3.getT2(), permanentFlags, uidValidity, uidNext, highestModSeq, t3.getT1(), unseenCount, t3.getT3().orElse(null), isWriteable(mailboxSession), resolvedAcl)));
+    private Mono<MailboxCounters> mailboxCounters(MessageMapper messageMapper, EnumSet<MailboxMetaData.Item> items) {
+        if (items.contains(MailboxMetaData.Item.MailboxCounters)) {
+            return messageMapper.getMailboxCountersReactive(getMailboxEntity());
+        }
+        return Mono.just(MailboxCounters.empty(getId()));
     }
 
-    private Mono<MailboxMetaData> metadataUnseenCount(MessageMapper messageMapper, RecentMode recentMode, MailboxSession mailboxSession, MailboxACL resolvedAcl, Flags permanentFlags, UidValidity uidValidity, MessageUid uidNext, ModSeq highestModSeq) throws MailboxException {
-        MessageUid firstUnseen = null;
-        return Mono.zip(
-            messageMapper.getMailboxCountersReactive(mailbox),
-            recent(recentMode, mailboxSession))
-            .map(Throwing.function(t2 -> new MailboxMetaData(t2.getT2(), permanentFlags, uidValidity, uidNext, highestModSeq, t2.getT1().getCount(), t2.getT1().getUnseen(), firstUnseen, isWriteable(mailboxSession), resolvedAcl)));
+    @Override
+    public MailboxMetaData getMetaData(RecentMode resetRecent, MailboxSession mailboxSession, EnumSet<MailboxMetaData.Item> items) throws MailboxException {
+        return MailboxReactorUtils.block(getMetaDataReactive(resetRecent, mailboxSession, items));
     }
 
     @Override
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 93b3515655..38b66816ee 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
@@ -25,6 +25,7 @@ import static org.apache.james.mailbox.MessageManager.MailboxMetaData.RecentMode
 
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.EnumSet;
 import java.util.List;
 import java.util.Optional;
 import java.util.stream.IntStream;
@@ -55,7 +56,6 @@ import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageManager;
 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.exception.MailboxException;
@@ -398,7 +398,7 @@ abstract class AbstractSelectionProcessor<R extends AbstractMailboxSelectionRequ
         return Mono.from(mailboxManager.getMailboxReactive(mailboxPath, mailboxSession))
             .flatMap(Throwing.function(mailbox -> selectMailbox(session, responder, mailbox, currentMailbox)
                 .flatMap(Throwing.function(sessionMailbox ->
-                    mailbox.getMetaDataReactive(recentMode(!openReadOnly), mailboxSession, FetchGroup.FIRST_UNSEEN)
+                    mailbox.getMetaDataReactive(recentMode(!openReadOnly), mailboxSession, EnumSet.of(MailboxMetaData.Item.FirstUnseen, MailboxMetaData.Item.HighestModSeq, MailboxMetaData.Item.NextUid, MailboxMetaData.Item.MailboxCounters))
                         .doOnNext(next -> addRecent(next, sessionMailbox))))));
     }
 
@@ -460,7 +460,7 @@ abstract class AbstractSelectionProcessor<R extends AbstractMailboxSelectionRequ
                     boolean send = true;
                     return getSelectedMailboxReactive(session,
                             Mono.error(() -> new EnableException("Unable to enable " + capability.asString(), new MailboxException("Session not in SELECTED state"))))
-                        .flatMap(Throwing.function(mailbox -> mailbox.getMetaDataReactive(IGNORE, session.getMailboxSession(), FetchGroup.NO_COUNT)))
+                        .flatMap(Throwing.function(mailbox -> mailbox.getMetaDataReactive(IGNORE, session.getMailboxSession(), EnumSet.of(MailboxMetaData.Item.HighestModSeq))))
                         .doOnNext(metaData -> condstoreEnablingCommand(session, responder, metaData, send))
                         .then();
                 }
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 10bdd87840..e6d95a1fea 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
@@ -22,6 +22,7 @@ package org.apache.james.imap.processor;
 import static org.apache.james.imap.api.ImapConstants.SUPPORTS_UIDPLUS;
 import static org.apache.james.mailbox.MessageManager.MailboxMetaData.RecentMode.IGNORE;
 
+import java.util.EnumSet;
 import java.util.List;
 
 import org.apache.james.imap.api.ImapConstants;
@@ -36,7 +37,6 @@ 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.MailboxMetaData.FetchGroup;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.exception.MessageRangeException;
 import org.apache.james.mailbox.model.MailboxACL;
@@ -106,7 +106,7 @@ public class ExpungeProcessor extends AbstractMailboxProcessor<ExpungeRequest> i
         //
         // See RFC5162 3.3 EXPUNGE Command 3.5. UID EXPUNGE Command
         if (EnableProcessor.getEnabledCapabilities(session).contains(ImapConstants.SUPPORTS_QRESYNC)  && expunged > 0) {
-            return mailbox.getMetaDataReactive(IGNORE, mailboxSession, FetchGroup.NO_COUNT)
+            return mailbox.getMetaDataReactive(IGNORE, mailboxSession, EnumSet.of(MessageManager.MailboxMetaData.Item.HighestModSeq))
                 .doOnNext(metaData -> okComplete(request, ResponseCode.highestModSeq(metaData.getHighestModSeq()), responder))
                 .then();
         } else {
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 8008f15b31..345d1a5d42 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
@@ -21,6 +21,7 @@ package org.apache.james.imap.processor;
 
 import static org.apache.james.mailbox.MessageManager.MailboxMetaData.RecentMode.IGNORE;
 
+import java.util.EnumSet;
 import java.util.List;
 
 import org.apache.james.imap.api.ImapConstants;
@@ -33,7 +34,7 @@ import org.apache.james.imap.message.request.GetACLRequest;
 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.MailboxMetaData.FetchGroup;
+import org.apache.james.mailbox.MessageManager;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.exception.MailboxNotFoundException;
 import org.apache.james.mailbox.model.MailboxACL;
@@ -97,7 +98,7 @@ public class GetACLProcessor extends AbstractMailboxProcessor<GetACLRequest> imp
                     no(request, responder, text);
                     return Mono.empty();
                 } else {
-                    return mailbox.getMetaDataReactive(IGNORE, mailboxSession, FetchGroup.NO_COUNT)
+                    return mailbox.getMetaDataReactive(IGNORE, mailboxSession, EnumSet.noneOf(MessageManager.MailboxMetaData.Item.class))
                         .doOnNext(metaData -> {
                             ACLResponse aclResponse = new ACLResponse(mailboxName, metaData.getACL());
                             responder.respond(aclResponse);
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 786a8915ed..fa1b9afb48 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
@@ -25,6 +25,7 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Date;
+import java.util.EnumSet;
 import java.util.List;
 import java.util.Optional;
 
@@ -133,7 +134,7 @@ public class SearchProcessor extends AbstractMailboxProcessor<SearchRequest> imp
         // See RFC4551: 3.4. MODSEQ Search Criterion in SEARCH
         if (session.getAttribute(SEARCH_MODSEQ) != null) {
             try {
-                return mailbox.getMetaDataReactive(IGNORE, msession, MailboxMetaData.FetchGroup.NO_COUNT)
+                return mailbox.getMetaDataReactive(IGNORE, msession, EnumSet.of(MailboxMetaData.Item.HighestModSeq))
                     .flatMap(metaData -> {
                         // Enable CONDSTORE as this is a CONDSTORE enabling command
                         condstoreEnablingCommand(session, responder,  metaData, true);
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 495004e721..7feeb4afbc 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
@@ -22,6 +22,7 @@ package org.apache.james.imap.processor;
 import static org.apache.james.mailbox.MessageManager.MailboxMetaData.RecentMode.IGNORE;
 import static org.apache.james.mailbox.MessageManager.MailboxMetaData.RecentMode.RETRIEVE;
 
+import java.util.EnumSet;
 import java.util.List;
 import java.util.Optional;
 
@@ -123,7 +124,7 @@ public class StatusProcessor extends AbstractMailboxProcessor<StatusRequest> imp
     }
 
     private Mono<MessageManager.MailboxMetaData> retrieveMetadata(MessageManager mailbox, StatusDataItems statusDataItems, MailboxSession mailboxSession) {
-        MessageManager.MailboxMetaData.FetchGroup fetchGroup = computeFetchGroup(statusDataItems);
+        EnumSet<MessageManager.MailboxMetaData.Item> fetchGroup = computeFetchGroup(statusDataItems);
         RecentMode recentMode = computeRecentMode(statusDataItems);
 
         try {
@@ -164,12 +165,18 @@ public class StatusProcessor extends AbstractMailboxProcessor<StatusRequest> imp
             });
     }
 
-    private MessageManager.MailboxMetaData.FetchGroup computeFetchGroup(StatusDataItems statusDataItems) {
-        if (statusDataItems.isUnseen()) {
-            return MessageManager.MailboxMetaData.FetchGroup.UNSEEN_COUNT;
-        } else {
-            return MessageManager.MailboxMetaData.FetchGroup.NO_UNSEEN;
+    private EnumSet<MessageManager.MailboxMetaData.Item> computeFetchGroup(StatusDataItems statusDataItems) {
+        EnumSet<MessageManager.MailboxMetaData.Item> result = EnumSet.noneOf(MessageManager.MailboxMetaData.Item.class);
+        if (statusDataItems.isUnseen() || statusDataItems.isMessages()) {
+            result.add(MessageManager.MailboxMetaData.Item.MailboxCounters);
+        }
+        if (statusDataItems.isHighestModSeq()) {
+            result.add(MessageManager.MailboxMetaData.Item.HighestModSeq);
+        }
+        if (statusDataItems.isUidNext()) {
+            result.add(MessageManager.MailboxMetaData.Item.NextUid);
         }
+        return result;
     }
 
     private Long unseen(StatusDataItems statusDataItems, MessageManager.MailboxMetaData metaData) {
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 00cb177af5..d8e625845f 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
@@ -23,6 +23,7 @@ import static org.apache.james.mailbox.MessageManager.MailboxMetaData.RecentMode
 
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.EnumSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
@@ -233,7 +234,7 @@ public class StoreProcessor extends AbstractMailboxProcessor<StoreRequest> {
 
                     if (unchangedSince != -1) {
                         // Enable CONDSTORE as this is a CONDSTORE enabling command
-                        return mailbox.getMetaDataReactive(IGNORE, mailboxSession, MailboxMetaData.FetchGroup.NO_COUNT)
+                        return mailbox.getMetaDataReactive(IGNORE, mailboxSession, EnumSet.of(MailboxMetaData.Item.HighestModSeq))
                             .doOnNext(metaData -> condstoreEnablingCommand(session, responder,  metaData, true));
                     }
                     return Mono.empty();
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 15131dd815..23f6327ce5 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
@@ -23,6 +23,7 @@ import static org.apache.james.mailbox.MessageManager.MailboxMetaData.RecentMode
 import static org.apache.james.util.ReactorUtils.logOnError;
 
 import java.util.ArrayList;
+import java.util.EnumSet;
 import java.util.List;
 import java.util.Optional;
 import java.util.Set;
@@ -95,7 +96,7 @@ public class FetchProcessor extends AbstractMailboxProcessor<FetchRequest> {
                 Set<Capability> enabled = EnableProcessor.getEnabledCapabilities(session);
                 if (constoreCommand && !enabled.contains(ImapConstants.SUPPORTS_CONDSTORE)) {
                     // Enable CONDSTORE as this is a CONDSTORE enabling command
-                    return mailbox.getMetaDataReactive(IGNORE, mailboxSession, MailboxMetaData.FetchGroup.NO_COUNT)
+                    return mailbox.getMetaDataReactive(IGNORE, mailboxSession, EnumSet.of(MailboxMetaData.Item.HighestModSeq))
                         .doOnNext(metaData -> condstoreEnablingCommand(session, responder, metaData, true))
                         .flatMap(Throwing.<MailboxMetaData, Mono<Void>>function(
                             any -> doFetch(selected, request, responder, fetch, mailboxSession, mailbox, session))
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 616042b1e3..4b4cec6600 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
@@ -29,6 +29,8 @@ import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.verifyNoMoreInteractions;
 import static org.mockito.Mockito.when;
 
+import java.util.EnumSet;
+
 import org.apache.james.core.Username;
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.message.response.ImapResponseMessage;
@@ -91,7 +93,7 @@ class GetACLProcessorTest {
 
         imapSession.authenticated();
         imapSession.setMailboxSession(mailboxSession);
-        when(messageManager.getMetaDataReactive(any(MailboxMetaData.RecentMode.class), any(MailboxSession.class), any(MailboxMetaData.FetchGroup.class)))
+        when(messageManager.getMetaDataReactive(any(MailboxMetaData.RecentMode.class), any(MailboxSession.class), any(EnumSet.class)))
             .thenReturn(Mono.just(metaData));
         when(mailboxManager.getMailboxReactive(any(MailboxPath.class), any(MailboxSession.class)))
             .thenReturn(Mono.just(messageManager));
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 07f9b69d83..5f2ac5fafc 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
@@ -29,6 +29,7 @@ import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.verifyNoMoreInteractions;
 import static org.mockito.Mockito.when;
 
+import java.util.EnumSet;
 import java.util.List;
 
 import org.apache.james.core.Username;
@@ -99,7 +100,7 @@ class ListRightsProcessorTest {
 
         imapSession.authenticated();
         imapSession.setMailboxSession(mailboxSession);
-        when(messageManager.getMetaDataReactive(any(MailboxMetaData.RecentMode.class), any(MailboxSession.class), any(MailboxMetaData.FetchGroup.class)))
+        when(messageManager.getMetaDataReactive(any(MailboxMetaData.RecentMode.class), any(MailboxSession.class), any(EnumSet.class)))
             .thenReturn(Mono.just(metaData));
         when(mailboxManager.getMailboxReactive(any(MailboxPath.class), any(MailboxSession.class)))
             .thenReturn(Mono.just(messageManager));


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