You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@james.apache.org by bt...@apache.org on 2022/05/09 02:24:59 UTC

[james-project] 01/07: [PERF] IMAP use constants for CharValidator where 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 3ae9cbafb7a7f71ac3fb5f2fd5c9937c930f3171
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Fri May 6 09:26:31 2022 +0700

    [PERF] IMAP use constants for CharValidator where immutable
    
    This represents 3% of IMAP parsing memory
    consumption. Easy win...
---
 .../james/imap/decode/ImapRequestLineReader.java   | 24 +++++++++++++---------
 .../imap/decode/parser/ListCommandParser.java      | 23 +++++++++++----------
 .../imap/decode/parser/StoreCommandParser.java     |  2 +-
 3 files changed, 27 insertions(+), 22 deletions(-)

diff --git a/protocols/imap/src/main/java/org/apache/james/imap/decode/ImapRequestLineReader.java b/protocols/imap/src/main/java/org/apache/james/imap/decode/ImapRequestLineReader.java
index 85ea774a3d..9326f76ecc 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/decode/ImapRequestLineReader.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/decode/ImapRequestLineReader.java
@@ -204,15 +204,14 @@ public abstract class ImapRequestLineReader {
      * Reads an argument of type "atom" from the request.
      */
     public String atom() throws DecodingException {
-        return consumeWord(new AtomCharValidator(), true);
+        return consumeWord(AtomCharValidator.INSTANCE, true);
     }
 
     /**
      * Reads a command "tag" from the request.
      */
     public Tag tag() throws DecodingException {
-        CharacterValidator validator = new TagCharValidator();
-        return new Tag(consumeWord(validator));
+        return new Tag(consumeWord(TagCharValidator.INSTANCE));
     }
 
     /**
@@ -546,8 +545,7 @@ public abstract class ImapRequestLineReader {
         Flags flags = new Flags();
         nextWordChar();
 
-        CharacterValidator validator = new NoopCharValidator();
-        String nextFlag = consumeWord(validator);
+        String nextFlag = consumeWord(NoopCharValidator.INSTANCE);
         DecoderUtils.setFlag(nextFlag, flags);
         return flags;
     }
@@ -665,11 +663,10 @@ public abstract class ImapRequestLineReader {
                 return SearchResUtil.getSavedSequenceSet(session);
             }
         }
-        
-        CharacterValidator validator = new MessageSetCharValidator();
+
         // Don't fail to parse id ranges which are enclosed by "(..)"
         // See IMAP-283
-        String nextWord = consumeWord(validator, true);
+        String nextWord = consumeWord(MessageSetCharValidator.INSTANCE, true);
 
         int commaPos = nextWord.indexOf(',');
         if (commaPos == -1) {
@@ -699,10 +696,9 @@ public abstract class ImapRequestLineReader {
      * Reads a "message set" argument, and parses into an IdSet. This also support the use of $ as sequence-set as stated in SEARCHRES RFC5182 
      */
     public UidRange[] parseUidRange() throws DecodingException {
-        CharacterValidator validator = new MessageSetCharValidator();
         // Don't fail to parse id ranges which are enclosed by "(..)"
         // See IMAP-283
-        String nextWord = consumeWord(validator, true);
+        String nextWord = consumeWord(MessageSetCharValidator.INSTANCE, true);
 
         int commaPos = nextWord.indexOf(',');
         if (commaPos == -1) {
@@ -889,6 +885,8 @@ public abstract class ImapRequestLineReader {
     }
 
     public static class NoopCharValidator implements CharacterValidator {
+        public static CharacterValidator INSTANCE = new NoopCharValidator();
+
         @Override
         public boolean isValid(char chr) {
             return true;
@@ -896,6 +894,8 @@ public abstract class ImapRequestLineReader {
     }
 
     public static class AtomCharValidator implements CharacterValidator {
+        public static CharacterValidator INSTANCE = new AtomCharValidator();
+
         @Override
         public boolean isValid(char chr) {
             return (isCHAR(chr) && !isAtomSpecial(chr) && !isListWildcard(chr) && !isQuotedSpecial(chr));
@@ -907,6 +907,8 @@ public abstract class ImapRequestLineReader {
     }
 
     public static class TagCharValidator extends AtomCharValidator {
+        public static CharacterValidator INSTANCE = new TagCharValidator();
+
         @Override
         public boolean isValid(char chr) {
             if (chr == '+') {
@@ -917,6 +919,8 @@ public abstract class ImapRequestLineReader {
     }
 
     public static class MessageSetCharValidator implements CharacterValidator {
+        public static CharacterValidator INSTANCE = new MessageSetCharValidator();
+
         @Override
         public boolean isValid(char chr) {
             return (isDigit(chr) || chr == ':' || chr == '*' || chr == ',');
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/ListCommandParser.java b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/ListCommandParser.java
index 7ec14fe777..1d5bb5fba5 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/ListCommandParser.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/ListCommandParser.java
@@ -33,6 +33,17 @@ import org.apache.james.imap.message.request.ListRequest;
  * Parse LIST commands
  */
 public class ListCommandParser extends AbstractUidCommandParser {
+    private static class ListCharValidator extends AtomCharValidator {
+        public static ImapRequestLineReader.CharacterValidator INSTANCE = new ListCharValidator();
+
+        @Override
+        public boolean isValid(char chr) {
+            if (ImapRequestLineReader.isListWildcard(chr)) {
+                return true;
+            }
+            return super.isValid(chr);
+        }
+    }
 
     public ListCommandParser(StatusResponseFactory statusResponseFactory) {
         super(ImapConstants.LIST_COMMAND, statusResponseFactory);
@@ -57,17 +68,7 @@ public class ListCommandParser extends AbstractUidCommandParser {
         case '{':
             return request.consumeLiteral(null);
         default:
-            return request.consumeWord(new ListCharValidator());
-        }
-    }
-
-    private static class ListCharValidator extends AtomCharValidator {
-        @Override
-        public boolean isValid(char chr) {
-            if (ImapRequestLineReader.isListWildcard(chr)) {
-                return true;
-            }
-            return super.isValid(chr);
+            return request.consumeWord(ListCharValidator.INSTANCE);
         }
     }
 
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 4ae9d6b33e..f3b32e5360 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
@@ -63,7 +63,7 @@ public class StoreCommandParser extends AbstractUidCommandParser {
         }
 
         MessageManager.FlagsUpdateMode flagsUpdateMode = parseFlagsUpdateMode(request, next);
-        String directive = request.consumeWord(new ImapRequestLineReader.NoopCharValidator());
+        String directive = request.consumeWord(ImapRequestLineReader.NoopCharValidator.INSTANCE);
         boolean silent = parseSilent(directive);
         Flags flags = parseFlags(request);
 


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