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 59371b299635244cd033ce9c89bd93247f1c64ec
Author: Benoit Tellier <[email protected]>
AuthorDate: Fri Dec 6 15:25:33 2019 +0700

    PROTOCOLS-120 ImapParserFactory should not create new instances
---
 .../imap/decode/parser/ImapParserFactory.java      | 108 +++++++++------------
 1 file changed, 48 insertions(+), 60 deletions(-)

diff --git 
a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/ImapParserFactory.java
 
b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/ImapParserFactory.java
index de8d619..f4ca8fd 100644
--- 
a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/ImapParserFactory.java
+++ 
b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/ImapParserFactory.java
@@ -35,7 +35,7 @@ import 
org.apache.james.imap.decode.MessagingImapCommandParser;
  * Command instances are created on demand, when first accessed.
  */
 public class ImapParserFactory implements ImapCommandParserFactory {
-    private final Map<String, Class<?>> imapCommands;
+    private final Map<String, ImapCommandParser> imapCommands;
 
     private final StatusResponseFactory statusResponseFactory;
 
@@ -45,100 +45,88 @@ public class ImapParserFactory implements 
ImapCommandParserFactory {
 
         // Commands valid in any state
         // CAPABILITY, NOOP, and LOGOUT
-        imapCommands.put(ImapConstants.CAPABILITY_COMMAND_NAME, 
CapabilityCommandParser.class);
-        imapCommands.put(ImapConstants.NOOP_COMMAND_NAME, 
NoopCommandParser.class);
-        imapCommands.put(ImapConstants.LOGOUT_COMMAND_NAME, 
LogoutCommandParser.class);
+        imapCommands.put(ImapConstants.CAPABILITY_COMMAND_NAME, new 
CapabilityCommandParser());
+        imapCommands.put(ImapConstants.NOOP_COMMAND_NAME, new 
NoopCommandParser());
+        imapCommands.put(ImapConstants.LOGOUT_COMMAND_NAME, new 
LogoutCommandParser());
 
         // Commands valid in NON_AUTHENTICATED state.
         // AUTHENTICATE and LOGIN
-        imapCommands.put(ImapConstants.AUTHENTICATE_COMMAND_NAME, 
AuthenticateCommandParser.class);
-        imapCommands.put(ImapConstants.LOGIN_COMMAND_NAME, 
LoginCommandParser.class);
+        imapCommands.put(ImapConstants.AUTHENTICATE_COMMAND_NAME, new 
AuthenticateCommandParser());
+        imapCommands.put(ImapConstants.LOGIN_COMMAND_NAME, new 
LoginCommandParser());
 
         // Commands valid in AUTHENTICATED or SELECTED state.
         // RFC2060: SELECT, EXAMINE, CREATE, DELETE, RENAME, SUBSCRIBE,
         // UNSUBSCRIBE, LIST, LSUB, STATUS, and APPEND
-        imapCommands.put(ImapConstants.SELECT_COMMAND_NAME, 
SelectCommandParser.class);
-        imapCommands.put(ImapConstants.EXAMINE_COMMAND_NAME, 
ExamineCommandParser.class);
-        imapCommands.put(ImapConstants.CREATE_COMMAND_NAME, 
CreateCommandParser.class);
-        imapCommands.put(ImapConstants.DELETE_COMMAND_NAME, 
DeleteCommandParser.class);
-        imapCommands.put(ImapConstants.RENAME_COMMAND_NAME, 
RenameCommandParser.class);
-        imapCommands.put(ImapConstants.SUBSCRIBE_COMMAND_NAME, 
SubscribeCommandParser.class);
-        imapCommands.put(ImapConstants.UNSUBSCRIBE_COMMAND_NAME, 
UnsubscribeCommandParser.class);
-        imapCommands.put(ImapConstants.LIST_COMMAND_NAME, 
ListCommandParser.class);
-        imapCommands.put(ImapConstants.XLIST_COMMAND_NAME, 
XListCommandParser.class);
-        imapCommands.put(ImapConstants.LSUB_COMMAND_NAME, 
LsubCommandParser.class);
-        imapCommands.put(ImapConstants.STATUS_COMMAND_NAME, 
StatusCommandParser.class);
-        imapCommands.put(ImapConstants.APPEND_COMMAND_NAME, 
AppendCommandParser.class);
+        imapCommands.put(ImapConstants.SELECT_COMMAND_NAME, new 
SelectCommandParser());
+        imapCommands.put(ImapConstants.EXAMINE_COMMAND_NAME, new 
ExamineCommandParser());
+        imapCommands.put(ImapConstants.CREATE_COMMAND_NAME, new 
CreateCommandParser());
+        imapCommands.put(ImapConstants.DELETE_COMMAND_NAME, new 
DeleteCommandParser());
+        imapCommands.put(ImapConstants.RENAME_COMMAND_NAME, new 
RenameCommandParser());
+        imapCommands.put(ImapConstants.SUBSCRIBE_COMMAND_NAME, new 
SubscribeCommandParser());
+        imapCommands.put(ImapConstants.UNSUBSCRIBE_COMMAND_NAME, new 
UnsubscribeCommandParser());
+        imapCommands.put(ImapConstants.LIST_COMMAND_NAME, new 
ListCommandParser());
+        imapCommands.put(ImapConstants.XLIST_COMMAND_NAME, new 
XListCommandParser());
+        imapCommands.put(ImapConstants.LSUB_COMMAND_NAME, new 
LsubCommandParser());
+        imapCommands.put(ImapConstants.STATUS_COMMAND_NAME, new 
StatusCommandParser());
+        imapCommands.put(ImapConstants.APPEND_COMMAND_NAME,new 
AppendCommandParser());
 
         // RFC2342 NAMESPACE
-        imapCommands.put(ImapConstants.NAMESPACE_COMMAND_NAME, 
NamespaceCommandParser.class);
+        imapCommands.put(ImapConstants.NAMESPACE_COMMAND_NAME, new 
NamespaceCommandParser());
 
         // RFC4314 GETACL, SETACL, DELETEACL, LISTRIGHTS, MYRIGHTS
-        imapCommands.put(ImapConstants.GETACL_COMMAND_NAME, 
GetACLCommandParser.class);
-        imapCommands.put(ImapConstants.SETACL_COMMAND_NAME, 
SetACLCommandParser.class);
-        imapCommands.put(ImapConstants.DELETEACL_COMMAND_NAME, 
DeleteACLCommandParser.class);
-        imapCommands.put(ImapConstants.LISTRIGHTS_COMMAND_NAME, 
ListRightsCommandParser.class);
-        imapCommands.put(ImapConstants.MYRIGHTS_COMMAND_NAME, 
MyRightsCommandParser.class);
+        imapCommands.put(ImapConstants.GETACL_COMMAND_NAME, new 
GetACLCommandParser());
+        imapCommands.put(ImapConstants.SETACL_COMMAND_NAME, new 
SetACLCommandParser());
+        imapCommands.put(ImapConstants.DELETEACL_COMMAND_NAME, new 
DeleteACLCommandParser());
+        imapCommands.put(ImapConstants.LISTRIGHTS_COMMAND_NAME, new 
ListRightsCommandParser());
+        imapCommands.put(ImapConstants.MYRIGHTS_COMMAND_NAME, new 
MyRightsCommandParser());
 
         // Commands only valid in SELECTED state.
         // CHECK, CLOSE, EXPUNGE, SEARCH, FETCH, STORE, COPY, UID and IDLE
-        imapCommands.put(ImapConstants.CHECK_COMMAND_NAME, 
CheckCommandParser.class);
-        imapCommands.put(ImapConstants.CLOSE_COMMAND_NAME, 
CloseCommandParser.class);
-        imapCommands.put(ImapConstants.EXPUNGE_COMMAND_NAME, 
ExpungeCommandParser.class);
-        imapCommands.put(ImapConstants.COPY_COMMAND_NAME, 
CopyCommandParser.class);
-        imapCommands.put(ImapConstants.MOVE_COMMAND_NAME, 
MoveCommandParser.class);
-        imapCommands.put(ImapConstants.SEARCH_COMMAND_NAME, 
SearchCommandParser.class);
-        imapCommands.put(ImapConstants.FETCH_COMMAND_NAME, 
FetchCommandParser.class);
-        imapCommands.put(ImapConstants.STORE_COMMAND_NAME, 
StoreCommandParser.class);
-        imapCommands.put(ImapConstants.UID_COMMAND_NAME, 
UidCommandParser.class);
-        imapCommands.put(ImapConstants.IDLE_COMMAND_NAME, 
IdleCommandParser.class);
-        imapCommands.put(ImapConstants.STARTTLS, StartTLSCommandParser.class);
+        imapCommands.put(ImapConstants.CHECK_COMMAND_NAME, new 
CheckCommandParser());
+        imapCommands.put(ImapConstants.CLOSE_COMMAND_NAME, new 
CloseCommandParser());
+        imapCommands.put(ImapConstants.EXPUNGE_COMMAND_NAME, new 
ExpungeCommandParser());
+        imapCommands.put(ImapConstants.COPY_COMMAND_NAME, new 
CopyCommandParser());
+        imapCommands.put(ImapConstants.MOVE_COMMAND_NAME, new 
MoveCommandParser());
+        imapCommands.put(ImapConstants.SEARCH_COMMAND_NAME, new 
SearchCommandParser());
+        imapCommands.put(ImapConstants.FETCH_COMMAND_NAME, new 
FetchCommandParser());
+        imapCommands.put(ImapConstants.STORE_COMMAND_NAME, new 
StoreCommandParser());
+        imapCommands.put(ImapConstants.UID_COMMAND_NAME, new 
UidCommandParser());
+        imapCommands.put(ImapConstants.IDLE_COMMAND_NAME, new 
IdleCommandParser());
+        imapCommands.put(ImapConstants.STARTTLS, new StartTLSCommandParser());
 
         // RFC3691
-        imapCommands.put(ImapConstants.UNSELECT_COMMAND_NAME, 
UnselectCommandParser.class);
+        imapCommands.put(ImapConstants.UNSELECT_COMMAND_NAME, new 
UnselectCommandParser());
 
         // RFC4978
-        imapCommands.put(ImapConstants.COMPRESS_COMMAND_NAME, 
CompressCommandParser.class);
+        imapCommands.put(ImapConstants.COMPRESS_COMMAND_NAME, new 
CompressCommandParser());
         
-        imapCommands.put(ImapConstants.ENABLE_COMMAND_NAME, 
EnableCommandParser.class);
+        imapCommands.put(ImapConstants.ENABLE_COMMAND_NAME, new 
EnableCommandParser());
 
         // RFC2087
         // GETQUOTAROOT, GETQUOTA, SETQUOTA
-        imapCommands.put(ImapConstants.GETQUOTAROOT_COMMAND_NAME, 
GetQuotaRootCommandParser.class);
-        imapCommands.put(ImapConstants.GETQUOTA_COMMAND_NAME, 
GetQuotaCommandParser.class);
-        imapCommands.put(ImapConstants.SETQUOTA_COMMAND_NAME, 
SetQuotaCommandParser.class);
+        imapCommands.put(ImapConstants.GETQUOTAROOT_COMMAND_NAME, new 
GetQuotaRootCommandParser());
+        imapCommands.put(ImapConstants.GETQUOTA_COMMAND_NAME, new 
GetQuotaCommandParser());
+        imapCommands.put(ImapConstants.SETQUOTA_COMMAND_NAME, new 
SetQuotaCommandParser());
 
         //RFC5464
         //SETMETADATA, GETMETADATA
-        imapCommands.put(ImapConstants.SETANNOTATION_COMMAND_NAME, 
SetAnnotationCommandParser.class);
-        imapCommands.put(ImapConstants.GETANNOTATION_COMMAND_NAME, 
GetAnnotationCommandParser.class);
+        imapCommands.put(ImapConstants.SETANNOTATION_COMMAND_NAME, new 
SetAnnotationCommandParser());
+        imapCommands.put(ImapConstants.GETANNOTATION_COMMAND_NAME, new 
GetAnnotationCommandParser());
     }
 
     @Override
     public ImapCommandParser getParser(String commandName) {
-        Class<?> cmdClass = 
imapCommands.get(commandName.toUpperCase(Locale.US));
+        ImapCommandParser parser = 
imapCommands.get(commandName.toUpperCase(Locale.US));
 
-        if (cmdClass == null) {
+        if (parser == null) {
             return null;
         } else {
-            return createCommand(cmdClass);
+            initialiseParser(parser);
+            return parser;
         }
     }
 
-    private ImapCommandParser createCommand(Class<?> commandClass) {
-        try {
-            ImapCommandParser cmd = (ImapCommandParser) 
commandClass.newInstance();
-            initialiseParser(cmd);
-            return cmd;
-        } catch (Exception e) {
-            // TODO: would probably be better to manage this in protocol
-            // TODO: this runtime will produce a nasty disconnect for the 
client
-            throw new RuntimeException("Could not create command instance: " + 
commandClass.getName(), e);
-        }
-    }
-
-    protected void initialiseParser(ImapCommandParser cmd) {
-
+    private void initialiseParser(ImapCommandParser cmd) {
         if (cmd instanceof DelegatingImapCommandParser) {
             ((DelegatingImapCommandParser) cmd).setParserFactory(this);
         }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to