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 10:01:15 UTC

[james-project] 10/17: [Refactoring] ImapCommandValidity should be backed by an enum

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 8f2101a8e7e8a28dfb3f1b84337b2a2973b1a1dc
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Thu Dec 12 09:02:02 2019 +0100

    [Refactoring] ImapCommandValidity should be backed by an enum
    
    This avoids unexpected boolean field combinations...
---
 .../org/apache/james/imap/api/ImapCommand.java     | 57 +++++++++----------
 .../org/apache/james/imap/api/ImapCommandTest.java | 66 ++++++++++++++++++++++
 2 files changed, 93 insertions(+), 30 deletions(-)

diff --git a/protocols/imap/src/main/java/org/apache/james/imap/api/ImapCommand.java b/protocols/imap/src/main/java/org/apache/james/imap/api/ImapCommand.java
index 525ed1d..9467237 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/api/ImapCommand.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/api/ImapCommand.java
@@ -19,40 +19,51 @@
 
 package org.apache.james.imap.api;
 
+import java.util.EnumSet;
+
 /**
  * Represents a processor for a particular Imap command. Implementations of this
  * interface should encpasulate all command specific processing.
  */
 public class ImapCommand {
+    enum Validity {
+        NonAuthenticated(EnumSet.of(ImapSessionState.NON_AUTHENTICATED)),
+        Authenticated(EnumSet.of(ImapSessionState.AUTHENTICATED, ImapSessionState.SELECTED)),
+        Selected(EnumSet.of(ImapSessionState.SELECTED)),
+        Any(EnumSet.of(ImapSessionState.AUTHENTICATED, ImapSessionState.NON_AUTHENTICATED, ImapSessionState.SELECTED));
+
+        private final EnumSet<ImapSessionState> validStates;
+
+        Validity(EnumSet<ImapSessionState> validStates) {
+            this.validStates = validStates;
+        }
+
+        boolean allowed(ImapSessionState sessionState) {
+            return validStates.contains(sessionState);
+        }
+    }
+
     public static ImapCommand nonAuthenticatedStateCommand(String name) {
-        return new ImapCommand(false, false, true, name);
+        return new ImapCommand(Validity.NonAuthenticated, name);
     }
 
     public static ImapCommand authenticatedStateCommand(String name) {
-        return new ImapCommand(true, true, false, name);
+        return new ImapCommand(Validity.Authenticated, name);
     }
 
     public static ImapCommand selectedStateCommand(String name) {
-        return new ImapCommand(false, true, false, name);
+        return new ImapCommand(Validity.Selected, name);
     }
 
     public static ImapCommand anyStateCommand(String name) {
-        return new ImapCommand(true, true, true, name);
+        return new ImapCommand(Validity.Any, name);
     }
 
-    private final boolean validInAuthenticated;
-
-    private final boolean validInSelected;
-
-    private final boolean validInNonAuthenticated;
-
+    private final Validity validity;
     private final String name;
 
-    private ImapCommand(boolean validInAuthenticated, boolean validInSelected, boolean validInNonAuthenticated, String name) {
-        super();
-        this.validInAuthenticated = validInAuthenticated;
-        this.validInSelected = validInSelected;
-        this.validInNonAuthenticated = validInNonAuthenticated;
+    private ImapCommand(Validity validity, String name) {
+        this.validity = validity;
         this.name = name;
     }
 
@@ -61,21 +72,7 @@ public class ImapCommand {
     }
 
     public boolean validForState(ImapSessionState state) {
-        final boolean result;
-        switch (state) {
-        case AUTHENTICATED:
-            result = validInAuthenticated;
-            break;
-        case NON_AUTHENTICATED:
-            result = validInNonAuthenticated;
-            break;
-        case SELECTED:
-            result = validInSelected;
-            break;
-        default:
-            result = false;
-        }
-        return result;
+        return validity.allowed(state);
     }
 
     public String toString() {
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/api/ImapCommandTest.java b/protocols/imap/src/test/java/org/apache/james/imap/api/ImapCommandTest.java
new file mode 100644
index 0000000..1166656
--- /dev/null
+++ b/protocols/imap/src/test/java/org/apache/james/imap/api/ImapCommandTest.java
@@ -0,0 +1,66 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.imap.api;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.util.stream.Stream;
+
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.Arguments;
+import org.junit.jupiter.params.provider.MethodSource;
+
+class ImapCommandTest {
+    static Stream<Arguments> validForStateShouldReturnTrue() {
+        return Stream.of(
+            Arguments.arguments(ImapCommand.anyStateCommand("command"), ImapSessionState.AUTHENTICATED),
+            Arguments.arguments(ImapCommand.anyStateCommand("command"), ImapSessionState.SELECTED),
+            Arguments.arguments(ImapCommand.anyStateCommand("command"), ImapSessionState.NON_AUTHENTICATED),
+            Arguments.arguments(ImapCommand.selectedStateCommand("command"), ImapSessionState.SELECTED),
+            Arguments.arguments(ImapCommand.authenticatedStateCommand("command"), ImapSessionState.AUTHENTICATED),
+            Arguments.arguments(ImapCommand.authenticatedStateCommand("command"), ImapSessionState.SELECTED),
+            Arguments.arguments(ImapCommand.nonAuthenticatedStateCommand("command"), ImapSessionState.NON_AUTHENTICATED));
+    }
+
+    @ParameterizedTest
+    @MethodSource
+    void validForStateShouldReturnTrue(ImapCommand command, ImapSessionState state) {
+        assertThat(command.validForState(state)).isTrue();
+    }
+
+    static Stream<Arguments> validForStateShouldReturnFalse() {
+        return Stream.of(
+            Arguments.arguments(ImapCommand.anyStateCommand("command"), ImapSessionState.LOGOUT),
+            Arguments.arguments(ImapCommand.selectedStateCommand("command"), ImapSessionState.LOGOUT),
+            Arguments.arguments(ImapCommand.authenticatedStateCommand("command"), ImapSessionState.LOGOUT),
+            Arguments.arguments(ImapCommand.nonAuthenticatedStateCommand("command"), ImapSessionState.LOGOUT),
+            Arguments.arguments(ImapCommand.selectedStateCommand("command"), ImapSessionState.NON_AUTHENTICATED),
+            Arguments.arguments(ImapCommand.selectedStateCommand("command"), ImapSessionState.AUTHENTICATED),
+            Arguments.arguments(ImapCommand.authenticatedStateCommand("command"), ImapSessionState.NON_AUTHENTICATED),
+            Arguments.arguments(ImapCommand.nonAuthenticatedStateCommand("command"), ImapSessionState.AUTHENTICATED),
+            Arguments.arguments(ImapCommand.nonAuthenticatedStateCommand("command"), ImapSessionState.SELECTED));
+    }
+
+    @ParameterizedTest
+    @MethodSource
+    void validForStateShouldReturnFalse(ImapCommand command, ImapSessionState state) {
+        assertThat(command.validForState(state)).isFalse();
+    }
+}
\ No newline at end of file


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