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 bt...@apache.org on 2019/12/13 02:39:27 UTC

[james-project] 11/27: PROTOCOLS-120 ImapParserFactory should not create new instances

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 <bt...@linagora.com>
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: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org