This is an automated email from the ASF dual-hosted git repository. rcordier pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git
commit 85ab0e3de59e6c1109495a1adf4b02fc5f912af4 Author: Benoit Tellier <[email protected]> AuthorDate: Sun Jul 12 21:25:52 2020 +0700 JAMES-3295 Use MessageManager::listMessagesMetadata more widely --- .../imap/processor/AbstractMailboxProcessor.java | 15 +++++++------ .../james/imap/processor/SearchProcessor.java | 11 +++++++--- .../james/imap/processor/StoreProcessor.java | 25 ++++++++++++++-------- .../jmap/MessageFastViewProjectionCorrector.java | 7 +++--- 4 files changed, 37 insertions(+), 21 deletions(-) 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 0936cc6..4f23ebc 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 @@ -60,12 +60,10 @@ import org.apache.james.mailbox.ModSeq; import org.apache.james.mailbox.NullableMessageSequenceNumber; import org.apache.james.mailbox.exception.MailboxException; import org.apache.james.mailbox.exception.MessageRangeException; -import org.apache.james.mailbox.model.FetchGroup; +import org.apache.james.mailbox.model.ComposedMessageIdWithMetaData; import org.apache.james.mailbox.model.MailboxPath; import org.apache.james.mailbox.model.MessageRange; import org.apache.james.mailbox.model.MessageRange.Type; -import org.apache.james.mailbox.model.MessageResult; -import org.apache.james.mailbox.model.MessageResultIterator; import org.apache.james.mailbox.model.SearchQuery; import org.apache.james.metrics.api.MetricFactory; import org.apache.james.metrics.api.TimeMetric; @@ -74,6 +72,8 @@ import org.slf4j.LoggerFactory; import com.github.fge.lambdas.Throwing; +import reactor.core.publisher.Flux; + public abstract class AbstractMailboxProcessor<R extends ImapRequest> extends AbstractChainedProcessor<R> { private static final Logger LOGGER = LoggerFactory.getLogger(AbstractMailboxProcessor.class); @@ -242,12 +242,15 @@ public abstract class AbstractMailboxProcessor<R extends ImapRequest> extends Ab MessageRange messageSet, MessageManager mailbox, boolean isModSeqPermanent, MailboxSession mailboxSession) throws MailboxException { - final MessageResultIterator it = mailbox.getMessages(messageSet, FetchGroup.MINIMAL, mailboxSession); + Iterator<ComposedMessageIdWithMetaData> it = Flux.from( + mailbox.listMessagesMetadata(messageSet, mailboxSession)) + .toStream() + .iterator(); final boolean qresyncEnabled = EnableProcessor.getEnabledCapabilities(session).contains(ImapConstants.SUPPORTS_QRESYNC); final boolean condstoreEnabled = EnableProcessor.getEnabledCapabilities(session).contains(ImapConstants.SUPPORTS_CONDSTORE); while (it.hasNext()) { - MessageResult mr = it.next(); - final MessageUid uid = mr.getUid(); + ComposedMessageIdWithMetaData mr = it.next(); + final MessageUid uid = mr.getComposedMessageId().getUid(); selected.msn(uid).fold(() -> { LOGGER.debug("No message found with uid {} in the uid<->msn mapping for mailbox {}. This may be because it was deleted by a concurrent session. So skip it..", uid, selected.getMailboxId().serialize()); // skip this as it was not found in the mapping 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 58e6889..e86e850 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 @@ -23,6 +23,7 @@ import java.io.Closeable; import java.util.ArrayList; import java.util.Collection; import java.util.Date; +import java.util.Iterator; import java.util.List; import java.util.Optional; import java.util.stream.Stream; @@ -55,9 +56,8 @@ import org.apache.james.mailbox.MessageUid; import org.apache.james.mailbox.ModSeq; import org.apache.james.mailbox.exception.MailboxException; import org.apache.james.mailbox.exception.MessageRangeException; -import org.apache.james.mailbox.model.FetchGroup; +import org.apache.james.mailbox.model.ComposedMessageIdWithMetaData; import org.apache.james.mailbox.model.MessageRange; -import org.apache.james.mailbox.model.MessageResultIterator; import org.apache.james.mailbox.model.SearchQuery; import org.apache.james.mailbox.model.SearchQuery.AddressType; import org.apache.james.mailbox.model.SearchQuery.Criterion; @@ -71,6 +71,8 @@ import com.github.fge.lambdas.Throwing; import com.github.steveash.guavate.Guavate; import com.google.common.collect.ImmutableList; +import reactor.core.publisher.Flux; + public class SearchProcessor extends AbstractMailboxProcessor<SearchRequest> implements CapabilityImplementingProcessor { private static final Logger LOGGER = LoggerFactory.getLogger(SearchProcessor.class); @@ -248,7 +250,10 @@ public class SearchProcessor extends AbstractMailboxProcessor<SearchRequest> imp // Reverse loop over the ranges as its more likely that we find a match at the end int size = ranges.size(); for (int i = size - 1; i > 0; i--) { - MessageResultIterator results = mailbox.getMessages(ranges.get(i), FetchGroup.MINIMAL, session); + Iterator<ComposedMessageIdWithMetaData> results = Flux.from( + mailbox.listMessagesMetadata(ranges.get(i), session)) + .toStream() + .iterator(); while (results.hasNext()) { ModSeq modSeq = results.next().getModSeq(); if (highestModSeq == null || modSeq.asLong() > highestModSeq.asLong()) { 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 f14fac2..0ec5697 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 java.io.Closeable; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; +import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; @@ -52,16 +53,16 @@ import org.apache.james.mailbox.ModSeq; import org.apache.james.mailbox.NullableMessageSequenceNumber; import org.apache.james.mailbox.exception.MailboxException; import org.apache.james.mailbox.exception.MessageRangeException; -import org.apache.james.mailbox.model.FetchGroup; +import org.apache.james.mailbox.model.ComposedMessageIdWithMetaData; import org.apache.james.mailbox.model.MessageRange; import org.apache.james.mailbox.model.MessageRange.Type; -import org.apache.james.mailbox.model.MessageResult; -import org.apache.james.mailbox.model.MessageResultIterator; import org.apache.james.metrics.api.MetricFactory; import org.apache.james.util.MDCBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import reactor.core.publisher.Flux; + public class StoreProcessor extends AbstractMailboxProcessor<StoreRequest> { private static final Logger LOGGER = LoggerFactory.getLogger(StoreProcessor.class); @@ -122,10 +123,13 @@ public class StoreProcessor extends AbstractMailboxProcessor<StoreRequest> { if (unchangedSince != -1) { List<MessageUid> uids = new ArrayList<>(); - MessageResultIterator results = mailbox.getMessages(messageSet, FetchGroup.MINIMAL, mailboxSession); + Iterator<ComposedMessageIdWithMetaData> results = Flux.from( + mailbox.listMessagesMetadata(messageSet, mailboxSession)) + .toStream() + .iterator(); while (results.hasNext()) { - MessageResult r = results.next(); - MessageUid uid = r.getUid(); + ComposedMessageIdWithMetaData r = results.next(); + MessageUid uid = r.getComposedMessageId().getUid(); boolean fail = false; @@ -252,11 +256,14 @@ public class StoreProcessor extends AbstractMailboxProcessor<StoreRequest> { // - QRESYNC was enabled via ENABLE QRESYNC // if (unchangedSince != -1 || qresyncEnabled || condstoreEnabled) { - MessageResultIterator results = mailbox.getMessages(messageSet, FetchGroup.MINIMAL, mailboxSession); + Iterator<ComposedMessageIdWithMetaData> results = Flux.from( + mailbox.listMessagesMetadata(messageSet, mailboxSession)) + .toStream() + .iterator(); while (results.hasNext()) { - MessageResult r = results.next(); + ComposedMessageIdWithMetaData r = results.next(); // Store the modseq for the uid for later usage in the response - modSeqs.put(r.getUid(),r.getModSeq()); + modSeqs.put(r.getComposedMessageId().getUid(),r.getModSeq()); } } diff --git a/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/MessageFastViewProjectionCorrector.java b/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/MessageFastViewProjectionCorrector.java index b54aaaf..7d37d04 100644 --- a/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/MessageFastViewProjectionCorrector.java +++ b/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/MessageFastViewProjectionCorrector.java @@ -34,6 +34,7 @@ import org.apache.james.mailbox.MailboxSession; import org.apache.james.mailbox.MessageManager; import org.apache.james.mailbox.MessageUid; import org.apache.james.mailbox.exception.MailboxException; +import org.apache.james.mailbox.model.ComposedMessageIdWithMetaData; import org.apache.james.mailbox.model.FetchGroup; import org.apache.james.mailbox.model.MailboxMetaData; import org.apache.james.mailbox.model.MessageId; @@ -190,7 +191,7 @@ public class MessageFastViewProjectionCorrector { return listUsersMailboxes(session) .flatMap(mailboxMetadata -> retrieveMailbox(session, mailboxMetadata), MAILBOX_CONCURRENCY) .flatMap(Throwing.function(messageManager -> listAllMailboxMessages(messageManager, session) - .map(message -> new ProjectionEntry(messageManager, message.getUid(), session))), MAILBOX_CONCURRENCY) + .map(message -> new ProjectionEntry(messageManager, message.getComposedMessageId().getUid(), session))), MAILBOX_CONCURRENCY) .onErrorResume(MailboxException.class, e -> { LOGGER.error("JMAP fastview re-computation aborted for {} as we failed listing user mailboxes", session.getUser(), e); progress.incrementFailedUserCount(); @@ -231,8 +232,8 @@ public class MessageFastViewProjectionCorrector { return Mono.fromCallable(() -> mailboxManager.getMailbox(mailboxMetadata.getId(), session)); } - private Flux<MessageResult> listAllMailboxMessages(MessageManager messageManager, MailboxSession session) throws MailboxException { - return Iterators.toFlux(messageManager.getMessages(MessageRange.all(), FetchGroup.MINIMAL, session)); + private Flux<ComposedMessageIdWithMetaData> listAllMailboxMessages(MessageManager messageManager, MailboxSession session) { + return Flux.from(messageManager.listMessagesMetadata(MessageRange.all(), session)); } private Mono<MessageResult> retrieveContent(MessageManager messageManager, MailboxSession session, MessageUid uid) { --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
