From cf71d1f3db8f6a986413e3f1ad533a93b396d58c Mon Sep 17 00:00:00 2001 From: Tan Yuanhong Date: Thu, 17 Oct 2019 13:51:09 +0800 Subject: [PATCH 1/7] Implement CLI for listing and searching available commands. --- .../seedu/algobase/commons/core/Messages.java | 1 + .../seedu/algobase/commons/util/AppUtil.java | 13 +++++++ .../algobase/logic/commands/Command.java | 25 +++++++++++++ .../algobase/logic/commands/HelpCommand.java | 36 ++++++++++++++++--- .../algobase/logic/parser/AlgoBaseParser.java | 2 +- .../logic/parser/HelpCommandParser.java | 27 ++++++++++++++ 6 files changed, 99 insertions(+), 5 deletions(-) create mode 100644 src/main/java/seedu/algobase/logic/parser/HelpCommandParser.java diff --git a/src/main/java/seedu/algobase/commons/core/Messages.java b/src/main/java/seedu/algobase/commons/core/Messages.java index 51c8099d012..9ab5761a374 100644 --- a/src/main/java/seedu/algobase/commons/core/Messages.java +++ b/src/main/java/seedu/algobase/commons/core/Messages.java @@ -14,4 +14,5 @@ public class Messages { public static final String MESSAGE_INVALID_TAG_FORMAT = "Invalid tag format! \n"; public static final String MESSAGE_INVALID_TAG_DISPLAYED_INDEX = "The Tag index provided is invalid"; public static final String MESSAGE_PLANS_LISTED_OVERVIEW = "%1$d plans listed!"; + public static final String MESSAGE_INVALID_COMMAND_NAME = "Command %1$s not found!"; } diff --git a/src/main/java/seedu/algobase/commons/util/AppUtil.java b/src/main/java/seedu/algobase/commons/util/AppUtil.java index ae18e698dd8..884ad0ecde8 100644 --- a/src/main/java/seedu/algobase/commons/util/AppUtil.java +++ b/src/main/java/seedu/algobase/commons/util/AppUtil.java @@ -36,4 +36,17 @@ public static void checkArgument(Boolean condition, String errorMessage) { throw new IllegalArgumentException(errorMessage); } } + + public static String getClassStringField(Class targetClass, String fieldName) { + try { + String result = (String) targetClass.getField(fieldName).get(""); + return result; + } catch (NoSuchFieldException e) { + throw new AssertionError("Class " + targetClass.getName() + + "doesn't have " + fieldName + " field."); + } catch (IllegalAccessException e) { + throw new AssertionError("Class " + targetClass.getName() + + "has non-public " + fieldName + "."); + } + } } diff --git a/src/main/java/seedu/algobase/logic/commands/Command.java b/src/main/java/seedu/algobase/logic/commands/Command.java index fa8d92c9517..3c895cc96ff 100644 --- a/src/main/java/seedu/algobase/logic/commands/Command.java +++ b/src/main/java/seedu/algobase/logic/commands/Command.java @@ -17,4 +17,29 @@ public abstract class Command { */ public abstract CommandResult execute(Model model) throws CommandException; + public static final Class[] commandList = { + AddCommand.class, + AddPlanCommand.class, + AddTagCommand.class, + AddTagCommand.class, + ClearCommand.class, + DeleteCommand.class, + DeletePlanCommand.class, + DeleteTagCommand.class, + DeleteTaskCommand.class, + DoneTaskCommand.class, + EditCommand.class, + EditPlanCommand.class, + EditTagCommand.class, + ExitCommand.class, + FindCommand.class, + FindPlanCommand.class, + HelpCommand.class, + ListCommand.class, + ListPlanCommand.class, + ListTagCommand.class, + SortCommand.class, + SwitchCommand.class, + UndoneTaskCommand.class + }; } diff --git a/src/main/java/seedu/algobase/logic/commands/HelpCommand.java b/src/main/java/seedu/algobase/logic/commands/HelpCommand.java index e855b48b58f..457c8ccb448 100644 --- a/src/main/java/seedu/algobase/logic/commands/HelpCommand.java +++ b/src/main/java/seedu/algobase/logic/commands/HelpCommand.java @@ -1,5 +1,11 @@ package seedu.algobase.logic.commands; +import static java.util.Objects.requireNonNull; +import static seedu.algobase.commons.util.AppUtil.getClassStringField; + +import java.util.ArrayList; +import java.util.List; + import seedu.algobase.model.Model; /** @@ -8,15 +14,37 @@ public class HelpCommand extends Command { public static final String COMMAND_WORD = "help"; - public static final String MESSAGE_USAGE = COMMAND_WORD + ": Shows program usage instructions.\n" - + "Example: " + COMMAND_WORD; - + + "Parameter:\n" + + "COMMAND_NAME (can be empty if you want a list of possible commands)\n" + + "Example: " + COMMAND_WORD + "find"; public static final String SHOWING_HELP_MESSAGE = "Opened help window."; + public final boolean isListAllCommands; + public final Class commandClass; + + public HelpCommand(Class commandClass, boolean isListAllCommands) { + this.isListAllCommands = isListAllCommands; + if(!isListAllCommands) { + requireNonNull(commandClass); + this.commandClass = commandClass; + } else { + this.commandClass = commandClass; + } + } + @Override public CommandResult execute(Model model) { - return new CommandResult(SHOWING_HELP_MESSAGE, true, false); + if(isListAllCommands) { + List commandWords = new ArrayList<>(); + for(Class command: Command.commandList) { + commandWords.add(getClassStringField(command, "COMMAND_WORD")); + } + return new CommandResult(commandWords.toString(), true, false); + } else { + String commandUsage = getClassStringField(commandClass, "MESSAGE_USAGE"); + return new CommandResult(commandUsage, true, false); + } } } diff --git a/src/main/java/seedu/algobase/logic/parser/AlgoBaseParser.java b/src/main/java/seedu/algobase/logic/parser/AlgoBaseParser.java index c32d0101325..385e7f0dea7 100644 --- a/src/main/java/seedu/algobase/logic/parser/AlgoBaseParser.java +++ b/src/main/java/seedu/algobase/logic/parser/AlgoBaseParser.java @@ -115,7 +115,7 @@ public Command parseCommand(String userInput) throws ParseException { return new ExitCommand(); case HelpCommand.COMMAND_WORD: - return new HelpCommand(); + return new HelpCommandParser().parse(arguments); case AddTagCommand.COMMAND_WORD: return new AddTagCommandParser().parse(arguments); diff --git a/src/main/java/seedu/algobase/logic/parser/HelpCommandParser.java b/src/main/java/seedu/algobase/logic/parser/HelpCommandParser.java new file mode 100644 index 00000000000..649d72abbe3 --- /dev/null +++ b/src/main/java/seedu/algobase/logic/parser/HelpCommandParser.java @@ -0,0 +1,27 @@ +package seedu.algobase.logic.parser; + +import static seedu.algobase.commons.core.Messages.MESSAGE_INVALID_COMMAND_NAME; +import static seedu.algobase.commons.util.AppUtil.getClassStringField; + +import seedu.algobase.logic.commands.Command; +import seedu.algobase.logic.commands.HelpCommand; +import seedu.algobase.logic.parser.exceptions.ParseException; + +public class HelpCommandParser implements Parser { + + @Override + public HelpCommand parse(String userInput) throws ParseException { + String trimmedArgs = userInput.trim(); + if(trimmedArgs.isEmpty()) { + return new HelpCommand(null, true); + } else { + for(Class command: Command.commandList) { + String commandWord = getClassStringField(command, "COMMAND_WORD"); + if(commandWord.equals(trimmedArgs)) { + return new HelpCommand(command, false); + } + } + throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_NAME, trimmedArgs)); + } + } +} \ No newline at end of file From 574bf408d755ec0b5715ac47734ed4c99e6909b1 Mon Sep 17 00:00:00 2001 From: Tan Yuanhong Date: Thu, 17 Oct 2019 14:06:08 +0800 Subject: [PATCH 2/7] Change GUI behavior for HelpCommand and pass checks --- .../algobase/logic/commands/Command.java | 21 ++++++++------- .../algobase/logic/commands/HelpCommand.java | 26 ++++++++++--------- .../logic/parser/HelpCommandParser.java | 11 +++++--- src/main/resources/view/ResultDisplay.fxml | 5 ++-- 4 files changed, 34 insertions(+), 29 deletions(-) diff --git a/src/main/java/seedu/algobase/logic/commands/Command.java b/src/main/java/seedu/algobase/logic/commands/Command.java index 3c895cc96ff..6e121cc039b 100644 --- a/src/main/java/seedu/algobase/logic/commands/Command.java +++ b/src/main/java/seedu/algobase/logic/commands/Command.java @@ -8,16 +8,7 @@ */ public abstract class Command { - /** - * Executes the command and returns the result message. - * - * @param model {@code Model} which the command should operate on. - * @return feedback message of the operation result for display - * @throws CommandException If an error occurs during command execution. - */ - public abstract CommandResult execute(Model model) throws CommandException; - - public static final Class[] commandList = { + public static final Class[] COMMAND_LIST = { AddCommand.class, AddPlanCommand.class, AddTagCommand.class, @@ -42,4 +33,14 @@ public abstract class Command { SwitchCommand.class, UndoneTaskCommand.class }; + + /** + * Executes the command and returns the result message. + * + * @param model {@code Model} which the command should operate on. + * @return feedback message of the operation result for display + * @throws CommandException If an error occurs during command execution. + */ + public abstract CommandResult execute(Model model) throws CommandException; + } diff --git a/src/main/java/seedu/algobase/logic/commands/HelpCommand.java b/src/main/java/seedu/algobase/logic/commands/HelpCommand.java index 457c8ccb448..8934e0560d7 100644 --- a/src/main/java/seedu/algobase/logic/commands/HelpCommand.java +++ b/src/main/java/seedu/algobase/logic/commands/HelpCommand.java @@ -15,18 +15,17 @@ public class HelpCommand extends Command { public static final String COMMAND_WORD = "help"; public static final String MESSAGE_USAGE = COMMAND_WORD - + ": Shows program usage instructions.\n" - + "Parameter:\n" - + "COMMAND_NAME (can be empty if you want a list of possible commands)\n" - + "Example: " + COMMAND_WORD + "find"; - public static final String SHOWING_HELP_MESSAGE = "Opened help window."; + + ": Shows program usage instructions.\n" + + "Parameter:\n" + + "COMMAND_NAME (can be empty if you want a list of possible commands)\n" + + "Example: " + COMMAND_WORD + "find"; - public final boolean isListAllCommands; - public final Class commandClass; + private final boolean isListAllCommands; + private final Class commandClass; public HelpCommand(Class commandClass, boolean isListAllCommands) { this.isListAllCommands = isListAllCommands; - if(!isListAllCommands) { + if (!isListAllCommands) { requireNonNull(commandClass); this.commandClass = commandClass; } else { @@ -36,15 +35,18 @@ public HelpCommand(Class commandClass, boolean isListAllCommands) { @Override public CommandResult execute(Model model) { - if(isListAllCommands) { + if (isListAllCommands) { List commandWords = new ArrayList<>(); - for(Class command: Command.commandList) { + for (Class command : Command.COMMAND_LIST) { commandWords.add(getClassStringField(command, "COMMAND_WORD")); } - return new CommandResult(commandWords.toString(), true, false); + String commandPrompt = "Available commands are: " + commandWords.toString() + "\n" + + "More information can be found in the popup window."; + return new CommandResult(commandPrompt, true, false); } else { String commandUsage = getClassStringField(commandClass, "MESSAGE_USAGE"); - return new CommandResult(commandUsage, true, false); + return new CommandResult(commandUsage, false, false); } } + } diff --git a/src/main/java/seedu/algobase/logic/parser/HelpCommandParser.java b/src/main/java/seedu/algobase/logic/parser/HelpCommandParser.java index 649d72abbe3..dc817409b5a 100644 --- a/src/main/java/seedu/algobase/logic/parser/HelpCommandParser.java +++ b/src/main/java/seedu/algobase/logic/parser/HelpCommandParser.java @@ -7,21 +7,24 @@ import seedu.algobase.logic.commands.HelpCommand; import seedu.algobase.logic.parser.exceptions.ParseException; +/** + * Parses input arguments and creates a new HelpCommand object + */ public class HelpCommandParser implements Parser { @Override public HelpCommand parse(String userInput) throws ParseException { String trimmedArgs = userInput.trim(); - if(trimmedArgs.isEmpty()) { + if (trimmedArgs.isEmpty()) { return new HelpCommand(null, true); } else { - for(Class command: Command.commandList) { + for (Class command : Command.COMMAND_LIST) { String commandWord = getClassStringField(command, "COMMAND_WORD"); - if(commandWord.equals(trimmedArgs)) { + if (commandWord.equals(trimmedArgs)) { return new HelpCommand(command, false); } } throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_NAME, trimmedArgs)); } } -} \ No newline at end of file +} diff --git a/src/main/resources/view/ResultDisplay.fxml b/src/main/resources/view/ResultDisplay.fxml index 61bc0918ddb..2dbe5c11ad3 100644 --- a/src/main/resources/view/ResultDisplay.fxml +++ b/src/main/resources/view/ResultDisplay.fxml @@ -2,7 +2,6 @@ - -