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 rc...@apache.org on 2020/02/13 02:29:22 UTC

[james-project] 11/21: [Refactoring] Improve Store command parser readability

This is an automated email from the ASF dual-hosted git repository.

rcordier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 24c3d046177d51e2fd4a13cc267333a91d181532
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Fri Dec 13 07:41:29 2019 +0100

    [Refactoring] Improve Store command parser readability
---
 .../imap/decode/parser/StoreCommandParser.java     | 70 +++++++++++-----------
 1 file changed, 35 insertions(+), 35 deletions(-)

diff --git a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/StoreCommandParser.java b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/StoreCommandParser.java
index 807385c..60c03d3 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/StoreCommandParser.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/StoreCommandParser.java
@@ -29,7 +29,7 @@ import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestLineReader;
-import org.apache.james.imap.decode.ImapRequestLineReader.CharacterValidator;
+import org.apache.james.imap.decode.ImapRequestLineReader.StringValidator;
 import org.apache.james.imap.message.request.StoreRequest;
 import org.apache.james.mailbox.MessageManager;
 
@@ -38,7 +38,7 @@ import org.apache.james.mailbox.MessageManager;
  */
 public class StoreCommandParser extends AbstractUidCommandParser {
 
-    private static final byte[] UNCHANGEDSINCE = "UNCHANGEDSINCE".getBytes();
+    private static final String UNCHANGEDSINCE = "UNCHANGEDSINCE";
     
     public StoreCommandParser(StatusResponseFactory statusResponseFactory) {
         super(ImapConstants.STORE_COMMAND, statusResponseFactory);
@@ -47,50 +47,29 @@ public class StoreCommandParser extends AbstractUidCommandParser {
     @Override
     protected ImapMessage decode(ImapRequestLineReader request, Tag tag, boolean useUids, ImapSession session) throws DecodingException {
         final IdRange[] idSet = request.parseIdRange(session);
-        boolean silent = false;
         long unchangedSince = -1;
         char next = request.nextWordChar();
         if (next == '(') {
             // Seems like we have a CONDSTORE parameter
             request.consume();
-            
-            request.consumeWord(new CharacterValidator() {
-                private int pos = 0;
-                @Override
-                public boolean isValid(char chr) {
-                    if (pos >= UNCHANGEDSINCE.length) {
-                        return false;
-                    } else {
-                        return ImapRequestLineReader.cap(chr) == UNCHANGEDSINCE[pos++];
-                    }
-                }
-            });
+
+            request.consumeWord(new StringValidator(UNCHANGEDSINCE));
             request.consumeChar(' ');
             unchangedSince = request.number(true);
             request.consumeChar(')');
             next = request.nextWordChar();
         }
 
-        final MessageManager.FlagsUpdateMode flagsUpdateMode;
-        if (next == '+') {
-            flagsUpdateMode = MessageManager.FlagsUpdateMode.ADD;
-            request.consume();
-        } else if (next == '-') {
-            flagsUpdateMode = MessageManager.FlagsUpdateMode.REMOVE;
-            request.consume();
-        } else {
-            flagsUpdateMode = MessageManager.FlagsUpdateMode.REPLACE;
-        }
-
+        MessageManager.FlagsUpdateMode flagsUpdateMode = parseFlagsUpdateMode(request, next);
         String directive = request.consumeWord(new ImapRequestLineReader.NoopCharValidator());
-        if ("FLAGS".equalsIgnoreCase(directive)) {
-            silent = false;
-        } else if ("FLAGS.SILENT".equalsIgnoreCase(directive)) {
-            silent = true;
-        } else {
-            throw new DecodingException(HumanReadableText.ILLEGAL_ARGUMENTS, "Invalid Store Directive: '" + directive + "'");
-        }
+        boolean silent = parseSilent(directive);
+        final Flags flags = parseFlags(request);
 
+        request.eol();
+        return new StoreRequest(idSet, silent, flags, useUids, tag, flagsUpdateMode, unchangedSince);
+    }
+
+    private Flags parseFlags(ImapRequestLineReader request) throws DecodingException {
         // Handle all kind of "store-att-flags"
         // See IMAP-281
         final Flags flags = new Flags();
@@ -108,8 +87,29 @@ public class StoreCommandParser extends AbstractUidCommandParser {
                 }
             }
         }
+        return flags;
+    }
 
-        request.eol();
-        return new StoreRequest(idSet, silent, flags, useUids, tag, flagsUpdateMode, unchangedSince);
+    private boolean parseSilent(String directive) throws DecodingException {
+        if ("FLAGS".equalsIgnoreCase(directive)) {
+            return false;
+        } else if ("FLAGS.SILENT".equalsIgnoreCase(directive)) {
+            return true;
+        } else {
+            throw new DecodingException(HumanReadableText.ILLEGAL_ARGUMENTS, "Invalid Store Directive: '" + directive + "'");
+        }
+    }
+
+    private MessageManager.FlagsUpdateMode parseFlagsUpdateMode(ImapRequestLineReader request, char next) throws DecodingException {
+        if (next == '+') {
+            MessageManager.FlagsUpdateMode flagsUpdateMode = MessageManager.FlagsUpdateMode.ADD;
+            request.consume();
+            return flagsUpdateMode;
+        } else if (next == '-') {
+            MessageManager.FlagsUpdateMode flagsUpdateMode = MessageManager.FlagsUpdateMode.REMOVE;
+            request.consume();
+            return flagsUpdateMode;
+        }
+        return MessageManager.FlagsUpdateMode.REPLACE;
     }
 }


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