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 7af86315d053ec654db1b27497a03e3c9aed40c1
Author: Benoit Tellier <[email protected]>
AuthorDate: Fri Nov 15 13:16:49 2019 +0700

    [Refactoring] MessageRangeProcessor: adopt functional programming style
---
 .../org/apache/james/imap/api/message/IdRange.java |  8 +++++
 .../processor/AbstractMessageRangeProcessor.java   | 42 +++++++++++-----------
 2 files changed, 30 insertions(+), 20 deletions(-)

diff --git 
a/protocols/imap/src/main/java/org/apache/james/imap/api/message/IdRange.java 
b/protocols/imap/src/main/java/org/apache/james/imap/api/message/IdRange.java
index 0fbf92b..0862d0a 100644
--- 
a/protocols/imap/src/main/java/org/apache/james/imap/api/message/IdRange.java
+++ 
b/protocols/imap/src/main/java/org/apache/james/imap/api/message/IdRange.java
@@ -26,6 +26,8 @@ import java.util.List;
 import java.util.NoSuchElementException;
 import java.util.Optional;
 
+import org.apache.james.mailbox.model.MessageRange;
+
 import com.google.common.collect.ImmutableList;
 
 /**
@@ -39,6 +41,12 @@ public final class IdRange implements Iterable<Long>, 
Comparable<IdRange> {
             .toString();
     }
 
+    public static IdRange from(MessageRange messageRange) {
+        return new IdRange(
+            messageRange.getUidFrom().asLong(),
+            messageRange.getUidTo().asLong());
+    }
+
     private long lowVal;
 
     private long highVal;
diff --git 
a/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMessageRangeProcessor.java
 
b/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMessageRangeProcessor.java
index 22fe645..1fd75cc 100644
--- 
a/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMessageRangeProcessor.java
+++ 
b/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMessageRangeProcessor.java
@@ -19,8 +19,10 @@
 
 package org.apache.james.imap.processor;
 
-import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
+import java.util.Objects;
+import java.util.stream.Stream;
 
 import org.apache.james.imap.api.ImapSessionUtils;
 import org.apache.james.imap.api.display.HumanReadableText;
@@ -43,6 +45,9 @@ import org.apache.james.metrics.api.MetricFactory;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.github.fge.lambdas.Throwing;
+import com.github.steveash.guavate.Guavate;
+
 public abstract class AbstractMessageRangeProcessor<R extends 
AbstractMessageRangeRequest> extends AbstractMailboxProcessor<R> {
     private static final Logger LOGGER = 
LoggerFactory.getLogger(AbstractMessageRangeProcessor.class);
 
@@ -86,29 +91,26 @@ public abstract class AbstractMessageRangeProcessor<R 
extends AbstractMessageRan
     private StatusResponse.ResponseCode handleRanges(R request, ImapSession 
session, MailboxPath targetMailbox, MailboxSession mailboxSession) throws 
MailboxException {
         MessageManager mailbox = getMailboxManager().getMailbox(targetMailbox, 
mailboxSession);
 
-        List<IdRange> resultRanges = new ArrayList<>();
-        for (IdRange range : request.getIdSet()) {
-            MessageRange messageSet = messageRange(session.getSelected(), 
range, request.isUseUids());
-            if (messageSet != null) {
-                List<MessageRange> processedUids = process(targetMailbox, 
session.getSelected(), mailboxSession, messageSet);
-                for (MessageRange mr : processedUids) {
-                    // Set recent flag on copied message as this SHOULD be
-                    // done.
-                    // See RFC 3501 6.4.7. COPY Command
-                    // See IMAP-287
-                    //
-                    // Disable this as this is now done directly in the scope 
of the copy operation.
-                    // See MAILBOX-85
-                    //mailbox.setFlags(new Flags(Flags.Flag.RECENT), true, 
false, mr, mailboxSession);
-                    resultRanges.add(new IdRange(mr.getUidFrom().asLong(), 
mr.getUidTo().asLong()));
-                }
-            }
-        }
-        IdRange[] resultUids = IdRange.mergeRanges(resultRanges).toArray(new 
IdRange[0]);
+        IdRange[] resultUids = 
IdRange.mergeRanges(Arrays.stream(request.getIdSet())
+            .map(Throwing.<IdRange, MessageRange>function(
+                range -> messageRange(session.getSelected(), range, 
request.isUseUids()))
+                .sneakyThrow())
+            .filter(Objects::nonNull)
+            .flatMap(Throwing.<MessageRange, Stream<IdRange>>function(
+                range -> handleRange(session, targetMailbox, mailboxSession, 
range))
+                .sneakyThrow())
+            .collect(Guavate.toImmutableList()))
+            .toArray(new IdRange[0]);
 
         // get folder UIDVALIDITY
         Long uidValidity = mailbox.getMetaData(false, mailboxSession, 
MessageManager.MetaData.FetchGroup.NO_UNSEEN).getUidValidity();
 
         return StatusResponse.ResponseCode.copyUid(uidValidity, 
request.getIdSet(), resultUids);
     }
+
+    private Stream<IdRange> handleRange(ImapSession session, MailboxPath 
targetMailbox, MailboxSession mailboxSession, MessageRange range) throws 
MailboxException {
+        return process(targetMailbox, session.getSelected(), mailboxSession, 
range)
+            .stream()
+            .map(IdRange::from);
+    }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to