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 <[email protected]> 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: [email protected] For additional commands, e-mail: [email protected]
