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 2024/11/18 07:48:49 UTC

(james-project) 04/09: [FIX] FetchProcessor: get selected mailbox as part of the reactive chain

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 c081867d60e5810b21804481ce5297a2a042aa43
Author: Benoit TELLIER <bt...@linagora.com>
AuthorDate: Wed Nov 6 13:16:43 2024 +0100

    [FIX] FetchProcessor: get selected mailbox as part of the reactive chain
---
 .../james/imap/processor/fetch/FetchProcessor.java | 35 ++++++++++++----------
 1 file changed, 20 insertions(+), 15 deletions(-)

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 ca5baf9183..5a19054e0b 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
@@ -153,12 +153,27 @@ public class FetchProcessor extends AbstractMailboxProcessor<FetchRequest> {
         IdRange[] idSet = request.getIdSet();
         FetchData fetch = computeFetchData(request, session);
         long changedSince = fetch.getChangedSince();
-        MailboxSession mailboxSession = session.getMailboxSession();
-        SelectedMailbox selected = session.getSelected();
 
-        return Optional.ofNullable(selected)
-            .map(s -> Mono.from(getMailboxManager().getMailboxReactive(s.getMailboxId(), mailboxSession)))
-            .orElseGet(() -> Mono.error(new MailboxException("Session not in SELECTED state")))
+        return Mono.fromCallable(() -> Optional.ofNullable(session.getSelected()))
+            .<SelectedMailbox>handle((a, sink) -> a.ifPresentOrElse(sink::next, () -> sink.error(new MailboxException("Session not in SELECTED state"))))
+            .flatMap(selected -> processFetch(request, session, responder, selected, fetch, changedSince))
+            .doOnEach(logOnError(MessageRangeException.class, e -> LOGGER.debug("Fetch failed for mailbox {} because of invalid sequence-set {}",
+                Optional.ofNullable(session.getSelected()).map(SelectedMailbox::getMailboxId), idSet, e)))
+            .onErrorResume(MessageRangeException.class, e -> {
+                taggedBad(request, responder, HumanReadableText.INVALID_MESSAGESET);
+                return Mono.empty();
+            })
+            .doOnEach(logOnError(MailboxException.class, e -> LOGGER.error("Fetch failed for mailbox {} and sequence-set {}",
+                Optional.ofNullable(session.getSelected()).map(SelectedMailbox::getMailboxId), idSet, e)))
+            .onErrorResume(MailboxException.class, e -> {
+                no(request, responder, HumanReadableText.SEARCH_FAILED);
+                return Mono.empty();
+            });
+    }
+
+    private Mono<Void> processFetch(FetchRequest request, ImapSession session, Responder responder, SelectedMailbox selected, FetchData fetch, long changedSince) {
+        MailboxSession mailboxSession = session.getMailboxSession();
+        return Mono.from(getMailboxManager().getMailboxReactive(selected.getMailboxId(), mailboxSession))
             .flatMap(Throwing.<MessageManager, Mono<Void>>function(mailbox -> {
                 boolean vanished = fetch.getVanished();
                 if (vanished && !EnableProcessor.getEnabledCapabilities(session).contains(ImapConstants.SUPPORTS_QRESYNC)) {
@@ -184,16 +199,6 @@ public class FetchProcessor extends AbstractMailboxProcessor<FetchRequest> {
 
                 return doFetch(selected, request, responder, fetch, mailboxSession, mailbox, session);
             }).sneakyThrow())
-            .doOnEach(logOnError(MessageRangeException.class, e -> LOGGER.debug("Fetch failed for mailbox {} because of invalid sequence-set {}", selected.getMailboxId(), idSet, e)))
-            .onErrorResume(MessageRangeException.class, e -> {
-                taggedBad(request, responder, HumanReadableText.INVALID_MESSAGESET);
-                return Mono.empty();
-            })
-            .doOnEach(logOnError(MailboxException.class, e -> LOGGER.error("Fetch failed for mailbox {} and sequence-set {}", selected.getMailboxId(), idSet, e)))
-            .onErrorResume(MailboxException.class, e -> {
-                no(request, responder, HumanReadableText.SEARCH_FAILED);
-                return Mono.empty();
-            })
             .then();
     }
 


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