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