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