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/13 02:39:24 UTC

[james-project] 08/27: [Refactoring] FetchData: Provide a builder

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 2b6c925ca951190612f24df98ff5e17fe4d94637
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Tue Dec 10 10:32:05 2019 +0700

    [Refactoring] FetchData: Provide a builder
    
    This allows to have FetchData immutable
---
 .../apache/james/imap/api/message/FetchData.java   | 188 ++++++++++-----------
 .../imap/decode/parser/FetchCommandParser.java     |  58 ++++---
 .../james/imap/message/request/FetchRequest.java   |   3 -
 .../imap/processor/fetch/FetchDataConverter.java   |   5 +-
 .../james/imap/processor/fetch/FetchProcessor.java |  23 ++-
 .../imap/processor/fetch/FetchResponseBuilder.java |  19 ++-
 .../parser/FetchCommandParserPartialFetchTest.java |  14 +-
 .../processor/fetch/FetchDataConverterTest.java    |  43 ++---
 8 files changed, 173 insertions(+), 180 deletions(-)

diff --git a/protocols/imap/src/main/java/org/apache/james/imap/api/message/FetchData.java b/protocols/imap/src/main/java/org/apache/james/imap/api/message/FetchData.java
index 3459a63..3a4b305 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/api/message/FetchData.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/api/message/FetchData.java
@@ -18,6 +18,7 @@
  ****************************************************************/
 package org.apache.james.imap.api.message;
 
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.EnumSet;
 import java.util.HashSet;
@@ -28,137 +29,118 @@ import com.google.common.base.MoreObjects;
 import com.google.common.collect.ImmutableSet;
 
 public class FetchData {
-    enum Item {
-        FLAGS,
-        UID,
-        INTERNAL_DATE,
-        SIZE,
-        ENVELOPE,
-        BODY,
-        BODY_STRUCTURE,
-        MODSEQ,
-    }
-
-    private final EnumSet<Item> itemToFetch = EnumSet.noneOf(Item.class);
-    private final Set<BodyFetchElement> bodyElements = new HashSet<>();
-
-    private boolean setSeen = false;
-    private long changedSince = -1;
-    private boolean vanished;
+    public static class Builder {
+        public static Builder from(FetchData fetchData) {
+            return builder()
+                .fetch(fetchData.itemToFetch)
+                .vanished(fetchData.vanished)
+                .changedSince(fetchData.changedSince)
+                .addBodyElements(fetchData.bodyElements)
+                .seen(fetchData.setSeen);
+        }
 
-    public Collection<BodyFetchElement> getBodyElements() {
-        return bodyElements;
-    }
+        private EnumSet<Item> itemToFetch = EnumSet.noneOf(Item.class);
+        private Set<BodyFetchElement> bodyElements = new HashSet<>();
+        private boolean setSeen = false;
+        private long changedSince = -1;
+        private boolean vanished;
 
-    public boolean isBody() {
-        return itemToFetch.contains(Item.BODY);
-    }
+        public Builder fetch(Item... item) {
+            return fetch(Arrays.asList(item));
+        }
 
-    public FetchData fetchBody() {
-        itemToFetch.add(Item.BODY);
-        return this;
-    }
+        public Builder fetch(Collection<Item> items) {
+            itemToFetch.addAll(items);
+            return this;
+        }
 
-    public boolean isBodyStructure() {
-        return itemToFetch.contains(Item.BODY_STRUCTURE);
-    }
+        public Builder changedSince(long changedSince) {
+            this.changedSince = changedSince;
+            return fetch(Item.MODSEQ);
+        }
 
-    public FetchData fetchBodyStructure() {
-        itemToFetch.add(Item.BODY_STRUCTURE);
-        return this;
-    }
+        /**
+         * Set to true if the VANISHED FETCH modifier was used as stated in <code>QRESYNC</code> extension
+         */
+        public Builder vanished(boolean vanished) {
+            this.vanished = vanished;
+            return this;
+        }
 
-    public boolean isEnvelope() {
-        return itemToFetch.contains(Item.ENVELOPE);
-    }
+        public Builder add(BodyFetchElement element, boolean peek) {
+            if (!peek) {
+                setSeen = true;
+            }
+            bodyElements.add(element);
+            return this;
+        }
 
-    public FetchData fetchEnvelope() {
-        itemToFetch.add(Item.ENVELOPE);
-        return this;
-    }
+        private Builder addBodyElements(Collection<BodyFetchElement> elements) {
+            bodyElements.addAll(elements);
+            return this;
+        }
 
-    public boolean isFlags() {
-        return itemToFetch.contains(Item.FLAGS);
-    }
+        private Builder seen(boolean setSeen) {
+            this.setSeen = setSeen;
+            return this;
+        }
 
-    public FetchData fetchFlags() {
-        itemToFetch.add(Item.FLAGS);
-        return this;
+        public FetchData build() {
+            return new FetchData(itemToFetch, bodyElements, setSeen, changedSince, vanished);
+        }
     }
 
-    public boolean isInternalDate() {
-        return itemToFetch.contains(Item.INTERNAL_DATE);
+    public enum Item {
+        FLAGS,
+        UID,
+        INTERNAL_DATE,
+        SIZE,
+        ENVELOPE,
+        BODY,
+        BODY_STRUCTURE,
+        MODSEQ,
     }
 
-    public FetchData fetchInternalDate() {
-        itemToFetch.add(Item.INTERNAL_DATE);
-        return this;
+    public static Builder builder() {
+        return new Builder();
     }
 
-    public boolean isSize() {
-        return itemToFetch.contains(Item.SIZE);
-    }
+    private final EnumSet<Item> itemToFetch;
+    private final Set<BodyFetchElement> bodyElements;
+    private final boolean setSeen;
+    private final long changedSince;
+    private final boolean vanished;
 
-    public FetchData fetchSize() {
-        itemToFetch.add(Item.SIZE);
-        return this;
+    private FetchData(EnumSet<Item> itemToFetch, Set<BodyFetchElement> bodyElements, boolean setSeen, long changedSince, boolean vanished) {
+        this.itemToFetch = EnumSet.copyOf(itemToFetch);
+        this.bodyElements = ImmutableSet.copyOf(bodyElements);
+        this.setSeen = setSeen;
+        this.changedSince = changedSince;
+        this.vanished = vanished;
     }
 
-    public boolean isUid() {
-        return itemToFetch.contains(Item.UID);
+    public Collection<BodyFetchElement> getBodyElements() {
+        return bodyElements;
     }
 
-    public FetchData fetchUid() {
-        itemToFetch.add(Item.UID);
-        return this;
+    public boolean contains(Item item) {
+        return itemToFetch.contains(item);
     }
 
     public boolean isSetSeen() {
         return setSeen;
     }
-
-
-    public boolean isModSeq() {
-        return itemToFetch.contains(Item.MODSEQ);
-    }
-
-    public FetchData fetchModSeq() {
-        itemToFetch.add(Item.MODSEQ);
-        return this;
-    }
-    
-    public FetchData setChangedSince(long changedSince) {
-        this.changedSince = changedSince;
-        itemToFetch.add(Item.MODSEQ);
-        return this;
-    }
     
     public long getChangedSince() {
         return changedSince;
     }
     
     /**
-     * Set to true if the VANISHED FETCH modifier was used as stated in <code>QRESYNC</code> extension
-     */
-    public FetchData setVanished(boolean vanished) {
-        this.vanished = vanished;
-        return this;
-    }
-    
-    /**
      * Return true if the VANISHED FETCH modifier was used as stated in <code>QRESYNC<code> extension
      */
     public boolean getVanished() {
         return vanished;
     }
-    
-    public FetchData add(BodyFetchElement element, boolean peek) {
-        if (!peek) {
-            setSeen = true;
-        }
-        bodyElements.add(element);
-        return this;
-    }
 
     @Override
     public final int hashCode() {
@@ -181,16 +163,16 @@ public class FetchData {
     @Override
     public String toString() {
         return MoreObjects.toStringHelper(this)
-            .add("flags", isFlags())
-            .add("uid", isUid())
-            .add("internalDate", isInternalDate())
-            .add("size", isSize())
-            .add("envelope", isEnvelope())
-            .add("body", isBody())
-            .add("bodyStructure", isBodyStructure())
+            .add("flags", contains(Item.FLAGS))
+            .add("uid", contains(Item.UID))
+            .add("internalDate", contains(Item.INTERNAL_DATE))
+            .add("size", contains(Item.SIZE))
+            .add("envelope", contains(Item.ENVELOPE))
+            .add("body", contains(Item.BODY))
+            .add("bodyStructure", contains(Item.BODY_STRUCTURE))
             .add("setSeen", setSeen)
             .add("bodyElements", ImmutableSet.copyOf(bodyElements))
-            .add("modSeq", isModSeq())
+            .add("modSeq", contains(Item.MODSEQ))
             .add("changedSince", changedSince)
             .add("vanished", vanished)
             .toString();
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/FetchCommandParser.java b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/FetchCommandParser.java
index 698a819..d0573e3 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/FetchCommandParser.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/FetchCommandParser.java
@@ -18,6 +18,15 @@
  ****************************************************************/
 package org.apache.james.imap.decode.parser;
 
+import static org.apache.james.imap.api.message.FetchData.Item.BODY;
+import static org.apache.james.imap.api.message.FetchData.Item.BODY_STRUCTURE;
+import static org.apache.james.imap.api.message.FetchData.Item.ENVELOPE;
+import static org.apache.james.imap.api.message.FetchData.Item.FLAGS;
+import static org.apache.james.imap.api.message.FetchData.Item.INTERNAL_DATE;
+import static org.apache.james.imap.api.message.FetchData.Item.MODSEQ;
+import static org.apache.james.imap.api.message.FetchData.Item.SIZE;
+import static org.apache.james.imap.api.message.FetchData.Item.UID;
+
 import java.util.List;
 
 import org.apache.james.imap.api.ImapCommand;
@@ -53,8 +62,12 @@ public class FetchCommandParser extends AbstractUidCommandParser {
      *
      * @return fetchData
      */
-    protected FetchData fetchRequest(ImapRequestLineReader request) throws DecodingException {
-        FetchData fetch = new FetchData();
+    private FetchData fetchRequest(ImapRequestLineReader request, boolean useUid) throws DecodingException {
+        FetchData.Builder fetch = FetchData.builder();
+
+        if (useUid) {
+            fetch.fetch(UID);
+        }
 
         char next = nextNonSpaceChar(request);
         if (request.nextChar() == '(') {
@@ -87,7 +100,7 @@ public class FetchCommandParser extends AbstractUidCommandParser {
                             }
                         }
                     });
-                    fetch.setChangedSince(request.number(true));
+                    fetch.changedSince(request.number(true));
                     
                     break;
                 
@@ -104,7 +117,7 @@ public class FetchCommandParser extends AbstractUidCommandParser {
                             }
                         }
                     });
-                    fetch.setVanished(true);
+                    fetch.vanished(true);
                     break;
                 default:
                     break;
@@ -119,44 +132,35 @@ public class FetchCommandParser extends AbstractUidCommandParser {
 
         }
 
-        return fetch;
+        return fetch.build();
     }
 
-    private void addNextElement(ImapRequestLineReader reader, FetchData fetch) throws DecodingException {
+    private void addNextElement(ImapRequestLineReader reader, FetchData.Builder fetch) throws DecodingException {
         // String name = element.toString();
         String name = readWord(reader, " [)\r\n");
         char next = reader.nextChar();
         // Simple elements with no '[]' parameters.
         if (next != '[') {
             if ("FAST".equalsIgnoreCase(name)) {
-                fetch.fetchFlags();
-                fetch.fetchInternalDate();
-                fetch.fetchSize();
+                fetch.fetch(FLAGS, INTERNAL_DATE, SIZE);
             } else if ("FULL".equalsIgnoreCase(name)) {
-                fetch.fetchFlags();
-                fetch.fetchInternalDate();
-                fetch.fetchSize();
-                fetch.fetchEnvelope();
-                fetch.fetchBody();
+                fetch.fetch(FLAGS, INTERNAL_DATE, SIZE, ENVELOPE, BODY);
             } else if ("ALL".equalsIgnoreCase(name)) {
-                fetch.fetchFlags();
-                fetch.fetchInternalDate();
-                fetch.fetchSize();
-                fetch.fetchEnvelope();
+                fetch.fetch(FLAGS, INTERNAL_DATE, SIZE, ENVELOPE);
             } else if ("FLAGS".equalsIgnoreCase(name)) {
-                fetch.fetchFlags();
+                fetch.fetch(FLAGS);
             } else if ("RFC822.SIZE".equalsIgnoreCase(name)) {
-                fetch.fetchSize();
+                fetch.fetch(SIZE);
             } else if ("ENVELOPE".equalsIgnoreCase(name)) {
-                fetch.fetchEnvelope();
+                fetch.fetch(ENVELOPE);
             } else if ("INTERNALDATE".equalsIgnoreCase(name)) {
-                fetch.fetchInternalDate();
+                fetch.fetch(INTERNAL_DATE);
             } else if ("BODY".equalsIgnoreCase(name)) {
-                fetch.fetchBody();
+                fetch.fetch(BODY);
             } else if ("BODYSTRUCTURE".equalsIgnoreCase(name)) {
-                fetch.fetchBodyStructure();
+                fetch.fetch(BODY_STRUCTURE);
             } else if ("UID".equalsIgnoreCase(name)) {
-                fetch.fetchUid();
+                fetch.fetch(UID);
             } else if ("RFC822".equalsIgnoreCase(name)) {
                 fetch.add(BodyFetchElement.createRFC822(), false);
             } else if ("RFC822.HEADER".equalsIgnoreCase(name)) {
@@ -164,7 +168,7 @@ public class FetchCommandParser extends AbstractUidCommandParser {
             } else if ("RFC822.TEXT".equalsIgnoreCase(name)) {
                 fetch.add(BodyFetchElement.createRFC822Text(), false);
             } else if ("MODSEQ".equalsIgnoreCase(name)) {
-                fetch.fetchModSeq();
+                fetch.fetch(MODSEQ);
             } else {
                 throw new DecodingException(HumanReadableText.ILLEGAL_ARGUMENTS, "Invalid fetch attribute: " + name);
             }
@@ -244,7 +248,7 @@ public class FetchCommandParser extends AbstractUidCommandParser {
     @Override
     protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, Tag tag, boolean useUids, ImapSession session) throws DecodingException {
         IdRange[] idSet = request.parseIdRange(session);
-        FetchData fetch = fetchRequest(request);
+        FetchData fetch = fetchRequest(request, useUids);
 
         // Check if we have VANISHED and and UID FETCH as its only allowed there
         //
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/message/request/FetchRequest.java b/protocols/imap/src/main/java/org/apache/james/imap/message/request/FetchRequest.java
index 6867bda..0619636 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/message/request/FetchRequest.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/message/request/FetchRequest.java
@@ -35,9 +35,6 @@ public class FetchRequest extends AbstractImapRequest {
         this.useUids = useUids;
         this.idSet = idSet;
         this.fetch = fetch;
-        if (useUids) {
-            fetch.fetchUid();
-        }
     }
 
     public final FetchData getFetch() {
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/fetch/FetchDataConverter.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/fetch/FetchDataConverter.java
index a6333e0..add60fe 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/fetch/FetchDataConverter.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/fetch/FetchDataConverter.java
@@ -23,6 +23,7 @@ import java.util.Collection;
 
 import org.apache.james.imap.api.message.BodyFetchElement;
 import org.apache.james.imap.api.message.FetchData;
+import org.apache.james.imap.api.message.FetchData.Item;
 import org.apache.james.imap.api.message.SectionType;
 import org.apache.james.mailbox.model.FetchGroup;
 import org.apache.james.mailbox.model.MimePath;
@@ -32,10 +33,10 @@ class FetchDataConverter {
     static FetchGroup getFetchGroup(FetchData fetch) {
         FetchGroup result = FetchGroup.MINIMAL;
 
-        if (fetch.isEnvelope()) {
+        if (fetch.contains(Item.ENVELOPE)) {
             result = result.with(FetchGroup.Profile.HEADERS);
         }
-        if (fetch.isBody() || fetch.isBodyStructure()) {
+        if (fetch.contains(Item.BODY) || fetch.contains(Item.BODY_STRUCTURE)) {
             result = result.with(FetchGroup.Profile.MIME_DESCRIPTOR);
         }
 
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 20517d3..a9677a3 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
@@ -26,6 +26,7 @@ import java.util.List;
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.display.HumanReadableText;
 import org.apache.james.imap.api.message.FetchData;
+import org.apache.james.imap.api.message.FetchData.Item;
 import org.apache.james.imap.api.message.IdRange;
 import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.api.process.ImapProcessor;
@@ -61,8 +62,8 @@ public class FetchProcessor extends AbstractMailboxProcessor<FetchRequest> {
     protected void processRequest(FetchRequest request, ImapSession session, Responder responder) {
         final boolean useUids = request.isUseUids();
         final IdRange[] idSet = request.getIdSet();
-        final FetchData fetch = request.getFetch();
-        
+        final FetchData fetch = computeFetchData(request, session);
+
         try {
             final long changedSince = fetch.getChangedSince();
 
@@ -85,7 +86,7 @@ public class FetchProcessor extends AbstractMailboxProcessor<FetchRequest> {
             final MailboxSession mailboxSession = session.getMailboxSession();
 
             MetaData metaData = mailbox.getMetaData(false, mailboxSession, org.apache.james.mailbox.MessageManager.MetaData.FetchGroup.NO_COUNT);
-            if (fetch.getChangedSince() != -1 || fetch.isModSeq()) {
+            if (fetch.getChangedSince() != -1 || fetch.contains(Item.MODSEQ)) {
                 // Enable CONDSTORE as this is a CONDSTORE enabling command
                 condstoreEnablingCommand(session, responder,  metaData, true);
             }
@@ -106,10 +107,6 @@ public class FetchProcessor extends AbstractMailboxProcessor<FetchRequest> {
                 //       If we do so we could prolly save one mailbox access which should give use some more speed up
                 respondVanished(mailboxSession, mailbox, ranges, changedSince, metaData, responder);
             }
-            // if QRESYNC is enable its necessary to also return the UID in all cases
-            if (EnableProcessor.getEnabledCapabilities(session).contains(ImapConstants.SUPPORTS_QRESYNC)) {
-                fetch.fetchUid();
-            }
             processMessageRanges(session, mailbox, ranges, fetch, useUids, mailboxSession, responder);
 
             
@@ -127,8 +124,16 @@ public class FetchProcessor extends AbstractMailboxProcessor<FetchRequest> {
         }
     }
 
+    private FetchData computeFetchData(FetchRequest request, ImapSession session) {
+        // if QRESYNC is enable its necessary to also return the UID in all cases
+        if (EnableProcessor.getEnabledCapabilities(session).contains(ImapConstants.SUPPORTS_QRESYNC)) {
+            return FetchData.Builder.from(request.getFetch())
+                .fetch(Item.UID)
+                .build();
+        }
+        return request.getFetch();
+    }
 
-    
     /**
      * Process the given message ranges by fetch them and pass them to the
      * {@link org.apache.james.imap.api.process.ImapProcessor.Responder}
@@ -143,7 +148,7 @@ public class FetchProcessor extends AbstractMailboxProcessor<FetchRequest> {
                 final MessageResult result = messages.next();
 
                 //skip unchanged messages - this should be filtered at the mailbox level to take advantage of indexes
-                if (fetch.isModSeq() && result.getModSeq().asLong() <= fetch.getChangedSince()) {
+                if (fetch.contains(Item.MODSEQ) && result.getModSeq().asLong() <= fetch.getChangedSince()) {
                     continue;
                 }
 
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/fetch/FetchResponseBuilder.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/fetch/FetchResponseBuilder.java
index 16de9b3..8484b39 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/fetch/FetchResponseBuilder.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/fetch/FetchResponseBuilder.java
@@ -33,6 +33,7 @@ import javax.mail.Flags;
 
 import org.apache.james.imap.api.message.BodyFetchElement;
 import org.apache.james.imap.api.message.FetchData;
+import org.apache.james.imap.api.message.FetchData.Item;
 import org.apache.james.imap.api.message.SectionType;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.api.process.SelectedMailbox;
@@ -132,7 +133,7 @@ public final class FetchResponseBuilder {
         }
 
         // FLAGS response
-        if (fetch.isFlags() || ensureFlagsResponse) {
+        if (fetch.contains(Item.FLAGS) || ensureFlagsResponse) {
             if (selected.isRecent(resultUid)) {
                 resultFlags.add(Flags.Flag.RECENT);
             }
@@ -140,16 +141,16 @@ public final class FetchResponseBuilder {
         }
 
         // INTERNALDATE response
-        if (fetch.isInternalDate()) {
+        if (fetch.contains(Item.INTERNAL_DATE)) {
             setInternalDate(result.getInternalDate());
         }
 
         // RFC822.SIZE response
-        if (fetch.isSize()) {
+        if (fetch.contains(Item.SIZE)) {
             setSize(result.getSize());
         }
 
-        if (fetch.isEnvelope()) {
+        if (fetch.contains(Item.ENVELOPE)) {
             this.envelope = buildEnvelope(result);
         }
 
@@ -165,29 +166,29 @@ public final class FetchResponseBuilder {
         }
         
         // Only create when needed
-        if (fetch.isBody() || fetch.isBodyStructure()) {
+        if (fetch.contains(Item.BODY) || fetch.contains(Item.BODY_STRUCTURE)) {
             // BODY response
             //
             // the STRUCTURE is only needed when no specific element is requested otherwise we don't need 
             // to access it and may be able to not parse the message
             //
             // See IMAP-333
-            if (fetch.isBody() && this.elements.isEmpty()) {
+            if (fetch.contains(Item.BODY) && this.elements.isEmpty()) {
                 body = new MimeDescriptorStructure(false, result.getMimeDescriptor(), envelopeBuilder);
             }
 
             // BODYSTRUCTURE response
-            if (fetch.isBodyStructure()) {
+            if (fetch.contains(Item.BODY_STRUCTURE)) {
                 bodystructure = new MimeDescriptorStructure(true, result.getMimeDescriptor(), envelopeBuilder);
             }
         }
         // UID response
-        if (fetch.isUid()) {
+        if (fetch.contains(Item.UID)) {
             setUid(resultUid);
         }
 
         
-        if (fetch.isModSeq()) {
+        if (fetch.contains(Item.MODSEQ)) {
             long changedSince = fetch.getChangedSince();
             if (changedSince != -1) {
                 // check if the modsequence if higher then the one specified by the CHANGEDSINCE option
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/FetchCommandParserPartialFetchTest.java b/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/FetchCommandParserPartialFetchTest.java
index 8b4f8c8..160c2b5 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/FetchCommandParserPartialFetchTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/FetchCommandParserPartialFetchTest.java
@@ -56,18 +56,20 @@ public class FetchCommandParserPartialFetchTest  {
     @Test
     public void testShouldParseZeroAndLength() throws Exception {
         IdRange[] ranges = { new IdRange(1) };
-        FetchData data = new FetchData();
-        data.add(new BodyFetchElement("BODY[]", SectionType.CONTENT, null,
-                null, 0L, 100L), false);
+        FetchData data = FetchData.builder()
+            .add(new BodyFetchElement("BODY[]", SectionType.CONTENT, null,
+                null, 0L, 100L), false)
+            .build();
         check("1 (BODY[]<0.100>)\r\n", ranges, false, data, TAG);
     }
 
     @Test
     public void testShouldParseNonZeroAndLength() throws Exception {
         IdRange[] ranges = { new IdRange(1) };
-        FetchData data = new FetchData();
-        data.add(new BodyFetchElement("BODY[]", SectionType.CONTENT, null,
-                null, 20L, 12342348L), false);
+        FetchData data = FetchData.builder()
+            .add(new BodyFetchElement("BODY[]", SectionType.CONTENT, null,
+                null, 20L, 12342348L), false)
+            .build();
         check("1 (BODY[]<20.12342348>)\r\n", ranges, false, data, TAG);
     }
 
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/processor/fetch/FetchDataConverterTest.java b/protocols/imap/src/test/java/org/apache/james/imap/processor/fetch/FetchDataConverterTest.java
index 84f06e7..9272343 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/processor/fetch/FetchDataConverterTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/processor/fetch/FetchDataConverterTest.java
@@ -30,6 +30,7 @@ import java.util.stream.Stream;
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.message.BodyFetchElement;
 import org.apache.james.imap.api.message.FetchData;
+import org.apache.james.imap.api.message.FetchData.Item;
 import org.apache.james.mailbox.model.FetchGroup;
 import org.apache.james.mailbox.model.FetchGroup.Profile;
 import org.apache.james.mailbox.model.MimePath;
@@ -43,37 +44,37 @@ class FetchDataConverterTest {
 
     static Stream<Arguments> getFetchGroupShouldReturnCorrectValue() {
         return Stream.of(
-            Arguments.arguments(new FetchData(), FetchGroup.MINIMAL),
-            Arguments.arguments(new FetchData().fetchBody(), FetchGroup.MINIMAL.with(Profile.MIME_DESCRIPTOR)),
-            Arguments.arguments(new FetchData().fetchBodyStructure(), FetchGroup.MINIMAL.with(Profile.MIME_DESCRIPTOR)),
-            Arguments.arguments(new FetchData().setChangedSince(0L), FetchGroup.MINIMAL),
-            Arguments.arguments(new FetchData().fetchEnvelope(), FetchGroup.HEADERS),
-            Arguments.arguments(new FetchData().fetchFlags(), FetchGroup.MINIMAL),
-            Arguments.arguments(new FetchData().fetchInternalDate(), FetchGroup.MINIMAL),
-            Arguments.arguments(new FetchData().fetchModSeq(), FetchGroup.MINIMAL),
-            Arguments.arguments(new FetchData().fetchUid(), FetchGroup.MINIMAL),
-            Arguments.arguments(new FetchData().setVanished(true), FetchGroup.MINIMAL),
-            Arguments.arguments(new FetchData().add(BodyFetchElement.createRFC822(), PEEK), FetchGroup.FULL_CONTENT),
-            Arguments.arguments(new FetchData().add(BodyFetchElement.createRFC822Header(), PEEK), FetchGroup.HEADERS),
-            Arguments.arguments(new FetchData().add(BodyFetchElement.createRFC822Text(), PEEK), FetchGroup.BODY_CONTENT),
-            Arguments.arguments(new FetchData().add(new BodyFetchElement(ImapConstants.FETCH_RFC822_HEADER, HEADER, PATH, null, null, null), PEEK),
+            Arguments.arguments(FetchData.builder(), FetchGroup.MINIMAL),
+            Arguments.arguments(FetchData.builder().fetch(Item.BODY), FetchGroup.MINIMAL.with(Profile.MIME_DESCRIPTOR)),
+            Arguments.arguments(FetchData.builder().fetch(Item.BODY_STRUCTURE), FetchGroup.MINIMAL.with(Profile.MIME_DESCRIPTOR)),
+            Arguments.arguments(FetchData.builder().changedSince(0L), FetchGroup.MINIMAL),
+            Arguments.arguments(FetchData.builder().fetch(Item.ENVELOPE), FetchGroup.HEADERS),
+            Arguments.arguments(FetchData.builder().fetch(Item.FLAGS), FetchGroup.MINIMAL),
+            Arguments.arguments(FetchData.builder().fetch(Item.INTERNAL_DATE), FetchGroup.MINIMAL),
+            Arguments.arguments(FetchData.builder().fetch(Item.MODSEQ), FetchGroup.MINIMAL),
+            Arguments.arguments(FetchData.builder().fetch(Item.UID), FetchGroup.MINIMAL),
+            Arguments.arguments(FetchData.builder().vanished(true), FetchGroup.MINIMAL),
+            Arguments.arguments(FetchData.builder().add(BodyFetchElement.createRFC822(), PEEK), FetchGroup.FULL_CONTENT),
+            Arguments.arguments(FetchData.builder().add(BodyFetchElement.createRFC822Header(), PEEK), FetchGroup.HEADERS),
+            Arguments.arguments(FetchData.builder().add(BodyFetchElement.createRFC822Text(), PEEK), FetchGroup.BODY_CONTENT),
+            Arguments.arguments(FetchData.builder().add(new BodyFetchElement(ImapConstants.FETCH_RFC822_HEADER, HEADER, PATH, null, null, null), PEEK),
                 FetchGroup.MINIMAL.addPartContent(new MimePath(PATH), Profile.HEADERS)),
-            Arguments.arguments(new FetchData().add(new BodyFetchElement(ImapConstants.FETCH_RFC822_TEXT, HEADER, PATH, null, null, null), PEEK),
+            Arguments.arguments(FetchData.builder().add(new BodyFetchElement(ImapConstants.FETCH_RFC822_TEXT, HEADER, PATH, null, null, null), PEEK),
                 FetchGroup.MINIMAL.addPartContent(new MimePath(PATH), Profile.BODY_CONTENT)),
-            Arguments.arguments(new FetchData().add(new BodyFetchElement(ImapConstants.FETCH_RFC822_TEXT, CONTENT, PATH, null, null, null), PEEK),
+            Arguments.arguments(FetchData.builder().add(new BodyFetchElement(ImapConstants.FETCH_RFC822_TEXT, CONTENT, PATH, null, null, null), PEEK),
                 FetchGroup.MINIMAL.addPartContent(new MimePath(PATH), Profile.BODY_CONTENT)),
-            Arguments.arguments(new FetchData().add(new BodyFetchElement(ImapConstants.FETCH_RFC822_TEXT, CONTENT, PATH, null, null, null), PEEK),
+            Arguments.arguments(FetchData.builder().add(new BodyFetchElement(ImapConstants.FETCH_RFC822_TEXT, CONTENT, PATH, null, null, null), PEEK),
                 FetchGroup.MINIMAL.addPartContent(new MimePath(PATH), Profile.MIME_CONTENT)),
-            Arguments.arguments(new FetchData().add(new BodyFetchElement(ImapConstants.FETCH_RFC822_TEXT, MIME, PATH, null, null, null), PEEK),
+            Arguments.arguments(FetchData.builder().add(new BodyFetchElement(ImapConstants.FETCH_RFC822_TEXT, MIME, PATH, null, null, null), PEEK),
                 FetchGroup.MINIMAL.addPartContent(new MimePath(PATH), Profile.MIME_HEADERS)),
-            Arguments.arguments(new FetchData().add(new BodyFetchElement(ImapConstants.FETCH_RFC822_TEXT, TEXT, PATH, null, null, null), PEEK),
+            Arguments.arguments(FetchData.builder().add(new BodyFetchElement(ImapConstants.FETCH_RFC822_TEXT, TEXT, PATH, null, null, null), PEEK),
                 FetchGroup.MINIMAL.addPartContent(new MimePath(PATH), Profile.BODY_CONTENT)));
     }
 
     @ParameterizedTest
     @MethodSource
-    void getFetchGroupShouldReturnCorrectValue(FetchData initial, FetchGroup expected) {
-        assertThat(FetchDataConverter.getFetchGroup(initial))
+    void getFetchGroupShouldReturnCorrectValue(FetchData.Builder initial, FetchGroup expected) {
+        assertThat(FetchDataConverter.getFetchGroup(initial.build()))
             .isEqualTo(expected);
     }
 }
\ 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