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 <[email protected]> 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: [email protected] For additional commands, e-mail: [email protected]
