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/12/03 02:32:27 UTC

[james-project] 08/09: JAMES-2988 FetchGroupConverter should use functional 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 1443a487ef7f33ce7582b66151f6d931bcf92940
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Thu Nov 28 17:35:21 2019 +0700

    JAMES-2988 FetchGroupConverter should use functional style
    
    We replace many ifs by a map-reduce. FetchType reduction is fully tested.
---
 .../mailbox/store/mail/FetchGroupConverter.java    | 66 ++++++++++++++--------
 .../james/mailbox/store/mail/MessageMapper.java    |  4 +-
 2 files changed, 45 insertions(+), 25 deletions(-)

diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/FetchGroupConverter.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/FetchGroupConverter.java
index 1099c93..3e31584 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/FetchGroupConverter.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/FetchGroupConverter.java
@@ -19,48 +19,68 @@
 
 package org.apache.james.mailbox.store.mail;
 
-import java.util.EnumSet;
+import java.util.Collection;
+import java.util.stream.Stream;
 
+import org.apache.commons.lang3.NotImplementedException;
 import org.apache.james.mailbox.model.FetchGroup;
 import org.apache.james.mailbox.model.FetchGroup.Profile;
 
+import com.github.steveash.guavate.Guavate;
+
 public class FetchGroupConverter {
     /**
      * Use the passed {@link FetchGroup} and calculate the right
      * {@link MessageMapper.FetchType} for it
      */
     public static MessageMapper.FetchType getFetchType(FetchGroup group) {
-        EnumSet<Profile> profiles = group.profiles();
-
-        if (profiles.contains(Profile.FULL_CONTENT)) {
+        if (!group.getPartContentDescriptors().isEmpty()) {
             return MessageMapper.FetchType.Full;
         }
-        if (profiles.contains(Profile.MIME_DESCRIPTOR)) {
-            // If we need the mimedescriptor we MAY need the full profile later too.
-            // This gives us no other choice then request it
+
+        Collection<MessageMapper.FetchType> fetchTypes = group.profiles()
+            .stream()
+            .map(FetchGroupConverter::toFetchType)
+            .collect(Guavate.toImmutableList());
+
+        return reduce(fetchTypes);
+    }
+
+    public static MessageMapper.FetchType reduce(Collection<MessageMapper.FetchType> fetchTypes) {
+        boolean full = fetchTypes.contains(MessageMapper.FetchType.Full);
+        boolean headers = fetchTypes.contains(MessageMapper.FetchType.Headers);
+        boolean body = fetchTypes.contains(MessageMapper.FetchType.Body);
+
+        if (full) {
             return MessageMapper.FetchType.Full;
         }
-        if (profiles.contains(Profile.MIME_CONTENT)) {
+        if (headers && body) {
             return MessageMapper.FetchType.Full;
         }
-        if (profiles.contains(Profile.MIME_HEADERS)) {
-            return MessageMapper.FetchType.Full;
+        if (headers) {
+            return MessageMapper.FetchType.Headers;
         }
-        if (!group.getPartContentDescriptors().isEmpty()) {
-            return MessageMapper.FetchType.Full;
+        if (body) {
+            return MessageMapper.FetchType.Body;
         }
+        return MessageMapper.FetchType.Metadata;
+    }
 
-        boolean headers = profiles.contains(Profile.HEADERS);
-        boolean body = profiles.contains(Profile.BODY_CONTENT);
-
-        if (body && headers) {
-            return MessageMapper.FetchType.Full;
-        } else if (body) {
-            return MessageMapper.FetchType.Body;
-        } else if (headers) {
-            return MessageMapper.FetchType.Headers;
-        } else {
-            return MessageMapper.FetchType.Metadata;
+    private static MessageMapper.FetchType toFetchType(Profile profile) {
+        switch (profile) {
+            case HEADERS:
+                return MessageMapper.FetchType.Headers;
+            case BODY_CONTENT:
+                return MessageMapper.FetchType.Body;
+            case FULL_CONTENT:
+            case MIME_CONTENT:
+            case MIME_HEADERS:
+            case MIME_DESCRIPTOR:
+                // If we need the mimedescriptor we MAY need the full profile later too.
+                // This gives us no other choice then request it
+                return MessageMapper.FetchType.Full;
+            default:
+                throw new NotImplementedException("Unsupported FetchGroup Profile" + profile);
         }
     }
 }
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MessageMapper.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MessageMapper.java
index a978a67..027a258 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MessageMapper.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MessageMapper.java
@@ -26,6 +26,7 @@ import java.util.Optional;
 
 import javax.mail.Flags;
 
+import org.apache.commons.lang3.NotImplementedException;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.exception.MailboxException;
@@ -158,7 +159,6 @@ public interface MessageMapper extends Mapper {
      *
      */
     enum FetchType {
-
         /**
          * Fetch only the meta data of the {@link MailboxMessage} which includes:
          * <p>
@@ -197,7 +197,7 @@ public interface MessageMapper extends Mapper {
          * Fetch the complete {@link MailboxMessage}
          * 
          */
-        Full
+        Full;
     }
 
 }
\ No newline at end of file


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