You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by bt...@apache.org on 2019/11/19 02:43:25 UTC

[james-project] 23/43: [Refactoring] MessageRangeProcessor: adopt functional programming style

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 <bt...@linagora.com>
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: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org