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