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/14 02:09:27 UTC

[james-project] 10/32: [Refactoring] StatusDataItems should be immutable

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 9c0287f70b4aab71b2e7db5c5d2382a187debbd0
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Wed Nov 13 11:46:10 2019 +0700

    [Refactoring] StatusDataItems should be immutable
---
 .../james/imap/api/message/StatusDataItems.java    | 71 ++++++++--------------
 .../imap/decode/parser/StatusCommandParser.java    | 24 ++++----
 2 files changed, 39 insertions(+), 56 deletions(-)

diff --git a/protocols/imap/src/main/java/org/apache/james/imap/api/message/StatusDataItems.java b/protocols/imap/src/main/java/org/apache/james/imap/api/message/StatusDataItems.java
index 5458e1a..06e3542 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/api/message/StatusDataItems.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/api/message/StatusDataItems.java
@@ -18,78 +18,59 @@
  ****************************************************************/
 package org.apache.james.imap.api.message;
 
+import java.util.EnumSet;
+
 import com.google.common.base.MoreObjects;
 
 public class StatusDataItems {
-    private boolean messages;
-
-    private boolean recent;
-
-    private boolean uidNext;
-
-    private boolean uidValidity;
-
-    private boolean unseen;
+    public enum StatusItem {
+        MESSAGES,
+        RECENT,
+        UID_NEXT,
+        UID_VALIDITY,
+        UNSEEN,
+        HIGHEST_MODSEQ
+    }
 
-    private boolean highestModSeq;
+    private final EnumSet<StatusItem> statusItems;
 
-    public boolean isMessages() {
-        return messages;
+    public StatusDataItems(EnumSet<StatusItem> statusItems) {
+        this.statusItems = statusItems;
     }
 
-    public void setMessages(boolean messages) {
-        this.messages = messages;
+    public boolean isMessages() {
+        return statusItems.contains(StatusItem.MESSAGES);
     }
 
     public boolean isRecent() {
-        return recent;
-    }
-
-    public void setRecent(boolean recent) {
-        this.recent = recent;
+        return statusItems.contains(StatusItem.RECENT);
     }
 
     public boolean isUidNext() {
-        return uidNext;
-    }
-
-    public void setUidNext(boolean uidNext) {
-        this.uidNext = uidNext;
+        return statusItems.contains(StatusItem.UID_NEXT);
     }
 
     public boolean isUidValidity() {
-        return uidValidity;
-    }
-
-    public void setUidValidity(boolean uidValidity) {
-        this.uidValidity = uidValidity;
+        return statusItems.contains(StatusItem.UID_VALIDITY);
     }
 
     public boolean isUnseen() {
-        return unseen;
-    }
-
-    public void setUnseen(boolean unseen) {
-        this.unseen = unseen;
-    }
-
-    public void setHighestModSeq(boolean highestModSeq) {
-        this.highestModSeq = highestModSeq;
+        return statusItems.contains(StatusItem.UNSEEN);
     }
     
     public boolean isHighestModSeq() {
-        return highestModSeq;
+        return statusItems.contains(StatusItem.HIGHEST_MODSEQ);
     }
 
     @Override
     public String toString() {
         return MoreObjects.toStringHelper(this)
-            .add("messages", messages)
-            .add("recent", recent)
-            .add("uidNext", uidNext)
-            .add("uidValidity", uidValidity)
-            .add("unseen", unseen)
-            .add("highestModSeq", highestModSeq)
+            .add("messages", isMessages())
+            .add("recent", isRecent())
+            .add("uidNext", isUidNext())
+            .add("uidValidity", isUidValidity())
+            .add("unseen", isUnseen())
+            .add("highestModSeq", isHighestModSeq())
             .toString();
     }
 }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/StatusCommandParser.java b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/StatusCommandParser.java
index 5030f92..92babee 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/StatusCommandParser.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/StatusCommandParser.java
@@ -18,6 +18,8 @@
  ****************************************************************/
 package org.apache.james.imap.decode.parser;
 
+import java.util.EnumSet;
+
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.ImapMessage;
@@ -40,7 +42,7 @@ public class StatusCommandParser extends AbstractImapCommandParser {
     }
 
     private StatusDataItems statusDataItems(ImapRequestLineReader request) throws DecodingException {
-        StatusDataItems items = new StatusDataItems();
+        EnumSet<StatusDataItems.StatusItem> items = EnumSet.noneOf(StatusDataItems.StatusItem.class);
 
         request.nextWordChar();
         request.consumeChar('(');
@@ -48,33 +50,33 @@ public class StatusCommandParser extends AbstractImapCommandParser {
         String nextWord = request.consumeWord(validator);
 
         while (!nextWord.endsWith(")")) {
-            addItem(nextWord, items);
+            items.add(parseStatus(nextWord));
             nextWord = request.consumeWord(validator);
         }
         // Got the closing ")", may be attached to a word.
         if (nextWord.length() > 1) {
-            addItem(nextWord.substring(0, nextWord.length() - 1), items);
+            items.add(parseStatus(nextWord.substring(0, nextWord.length() - 1)));
         }
 
-        return items;
+        return new StatusDataItems(items);
     }
 
-    private void addItem(String nextWord, StatusDataItems items) throws DecodingException {
+    private StatusDataItems.StatusItem parseStatus(String nextWord) throws DecodingException {
         // All the matching must be done in a case-insensitive fashion.
         // See rfc3501 9. Formal Syntax and IMAP-282
         if (nextWord.equalsIgnoreCase(ImapConstants.STATUS_MESSAGES)) {
-            items.setMessages(true);
+            return StatusDataItems.StatusItem.MESSAGES;
         } else if (nextWord.equalsIgnoreCase(ImapConstants.STATUS_RECENT)) {
-            items.setRecent(true);
+            return StatusDataItems.StatusItem.RECENT;
         } else if (nextWord.equalsIgnoreCase(ImapConstants.STATUS_UIDNEXT)) {
-            items.setUidNext(true);
+            return StatusDataItems.StatusItem.UID_NEXT;
         } else if (nextWord.equalsIgnoreCase(ImapConstants.STATUS_UIDVALIDITY)) {
-            items.setUidValidity(true);
+            return StatusDataItems.StatusItem.UID_VALIDITY;
         } else if (nextWord.equalsIgnoreCase(ImapConstants.STATUS_UNSEEN)) {
-            items.setUnseen(true);
+            return StatusDataItems.StatusItem.UNSEEN;
         } else if (nextWord.equalsIgnoreCase(ImapConstants.STATUS_HIGHESTMODSEQ)) {
             // HIGHESTMODSEQ status item as defined in RFC4551 3.6 HIGHESTMODSEQ Status Data Items
-            items.setHighestModSeq(true);
+            return StatusDataItems.StatusItem.HIGHEST_MODSEQ;
         } else {
             throw new DecodingException(HumanReadableText.ILLEGAL_ARGUMENTS, "Unknown status item: '" + nextWord + "'");
         }


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