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