From b722c1c2ab91b1432c2d10197d73db0fcdcc0f28 Mon Sep 17 00:00:00 2001 From: qhng Date: Fri, 21 Oct 2016 18:44:37 +0800 Subject: [PATCH 01/55] Refactor and clean code base --- src/main/java/seedu/savvytasker/MainApp.java | 16 +- .../savvytasker/commons/core/GuiSettings.java | 4 + .../core/UnmodifiableObservableList.java | 2 +- .../events/model/AddressBookChangedEvent.java | 19 -- .../events/ui/JumpToListRequestEvent.java | 2 +- .../ui/TaskPanelSelectionChangedEvent.java | 2 +- .../exceptions/DataConversionException.java | 5 + .../exceptions/DuplicateDataException.java | 5 + .../exceptions/IllegalValueException.java | 5 + .../commons/util/CollectionUtil.java | 47 ----- .../savvytasker/commons/util/JsonUtil.java | 5 + .../java/seedu/savvytasker/logic/Logic.java | 2 +- .../seedu/savvytasker/logic/LogicManager.java | 2 +- .../logic/commands/AddCommand.java | 5 +- .../logic/commands/AliasCommand.java | 4 +- .../logic/commands/DeleteCommand.java | 4 +- .../logic/commands/ModifyCommand.java | 5 +- .../logic/commands/SelectCommand.java | 2 +- .../logic/commands/UnaliasCommand.java | 4 +- .../logic/parser/MarkCommandParser.java | 4 +- .../logic/parser/RedoCommandParser.java | 2 - .../logic/parser/UndoCommandParser.java | 1 - .../logic/parser/UnmarkCommandParser.java | 4 +- .../seedu/savvytasker/model/AddressBook.java | 165 ----------------- .../java/seedu/savvytasker/model/Model.java | 8 +- .../seedu/savvytasker/model/ModelManager.java | 8 +- .../model/ReadOnlyAddressBook.java | 30 --- .../model/ReadOnlySavvyTasker.java | 4 +- .../seedu/savvytasker/model/SavvyTasker.java | 10 +- .../savvytasker/model/person/Address.java | 54 ------ .../seedu/savvytasker/model/person/Email.java | 56 ------ .../seedu/savvytasker/model/person/Name.java | 55 ------ .../savvytasker/model/person/Person.java | 90 --------- .../seedu/savvytasker/model/person/Phone.java | 54 ------ .../model/person/ReadOnlyPerson.java | 65 ------- .../model/person/UniquePersonList.java | 109 ----------- .../java/seedu/savvytasker/model/tag/Tag.java | 60 ------ .../savvytasker/model/tag/UniqueTagList.java | 143 --------------- .../model/{person => task}/ReadOnlyTask.java | 5 +- .../model/{person => task}/Task.java | 4 +- .../model/{person => task}/TaskList.java | 9 +- .../storage/AddressBookStorage.java | 44 ----- .../storage/SavvyTaskerStorage.java | 1 - .../savvytasker/storage/XmlAdaptedPerson.java | 69 ------- .../savvytasker/storage/XmlAdaptedTag.java | 40 ---- .../savvytasker/storage/XmlAdaptedTask.java | 3 +- .../storage/XmlSerializableSavvyTasker.java | 4 +- .../seedu/savvytasker/ui/BrowserPanel.java | 2 +- .../java/seedu/savvytasker/ui/MainWindow.java | 2 +- .../seedu/savvytasker/ui/StatusBarFooter.java | 6 +- .../java/seedu/savvytasker/ui/TaskCard.java | 2 +- .../seedu/savvytasker/ui/TaskListPanel.java | 2 +- src/test/java/guitests/AddCommandTest.java | 3 +- src/test/java/guitests/ClearCommandTest.java | 2 +- src/test/java/guitests/CommandBoxTest.java | 2 +- src/test/java/guitests/DeleteCommandTest.java | 3 +- src/test/java/guitests/FindCommandTest.java | 3 +- src/test/java/guitests/HelpWindowTest.java | 2 +- src/test/java/guitests/ListCommandTest.java | 3 +- ...okGuiTest.java => SavvyTaskerGuiTest.java} | 5 +- src/test/java/guitests/SelectCommandTest.java | 13 +- .../guitests/guihandles/MainGuiHandle.java | 4 - .../guitests/guihandles/PersonCardHandle.java | 63 ------- .../guihandles/PersonListPanelHandle.java | 172 ------------------ .../guitests/guihandles/TaskCardHandle.java | 2 +- .../guihandles/TaskListPanelHandle.java | 6 +- .../commons/util/ConfigUtilTest.java | 16 +- .../savvytasker/commons/util/XmlUtilTest.java | 11 +- .../savvytasker/logic/LogicManagerTest.java | 4 +- .../storage/XmlAddressBookStorageTest.java | 8 +- .../testutil/AddressBookBuilder.java | 35 ---- .../savvytasker/testutil/PersonBuilder.java | 49 ----- .../testutil/SavvyTaskerBuilder.java | 4 +- .../savvytasker/testutil/TestPerson.java | 76 -------- .../seedu/savvytasker/testutil/TestTask.java | 2 +- .../seedu/savvytasker/testutil/TestUtil.java | 89 ++------- .../testutil/TypicalTestPersons.java | 61 ------- .../testutil/TypicalTestTasks.java | 26 +-- 78 files changed, 147 insertions(+), 1772 deletions(-) delete mode 100644 src/main/java/seedu/savvytasker/commons/events/model/AddressBookChangedEvent.java delete mode 100644 src/main/java/seedu/savvytasker/commons/util/CollectionUtil.java delete mode 100644 src/main/java/seedu/savvytasker/model/AddressBook.java delete mode 100644 src/main/java/seedu/savvytasker/model/ReadOnlyAddressBook.java delete mode 100644 src/main/java/seedu/savvytasker/model/person/Address.java delete mode 100644 src/main/java/seedu/savvytasker/model/person/Email.java delete mode 100644 src/main/java/seedu/savvytasker/model/person/Name.java delete mode 100644 src/main/java/seedu/savvytasker/model/person/Person.java delete mode 100644 src/main/java/seedu/savvytasker/model/person/Phone.java delete mode 100644 src/main/java/seedu/savvytasker/model/person/ReadOnlyPerson.java delete mode 100644 src/main/java/seedu/savvytasker/model/person/UniquePersonList.java delete mode 100644 src/main/java/seedu/savvytasker/model/tag/Tag.java delete mode 100644 src/main/java/seedu/savvytasker/model/tag/UniqueTagList.java rename src/main/java/seedu/savvytasker/model/{person => task}/ReadOnlyTask.java (92%) rename src/main/java/seedu/savvytasker/model/{person => task}/Task.java (97%) rename src/main/java/seedu/savvytasker/model/{person => task}/TaskList.java (94%) delete mode 100644 src/main/java/seedu/savvytasker/storage/AddressBookStorage.java delete mode 100644 src/main/java/seedu/savvytasker/storage/XmlAdaptedPerson.java delete mode 100644 src/main/java/seedu/savvytasker/storage/XmlAdaptedTag.java rename src/test/java/guitests/{AddressBookGuiTest.java => SavvyTaskerGuiTest.java} (95%) delete mode 100644 src/test/java/guitests/guihandles/PersonCardHandle.java delete mode 100644 src/test/java/guitests/guihandles/PersonListPanelHandle.java delete mode 100644 src/test/java/seedu/savvytasker/testutil/AddressBookBuilder.java delete mode 100644 src/test/java/seedu/savvytasker/testutil/PersonBuilder.java delete mode 100644 src/test/java/seedu/savvytasker/testutil/TestPerson.java delete mode 100644 src/test/java/seedu/savvytasker/testutil/TypicalTestPersons.java diff --git a/src/main/java/seedu/savvytasker/MainApp.java b/src/main/java/seedu/savvytasker/MainApp.java index 849b796ee519..7273d2cdea21 100644 --- a/src/main/java/seedu/savvytasker/MainApp.java +++ b/src/main/java/seedu/savvytasker/MainApp.java @@ -31,7 +31,7 @@ public class MainApp extends Application { private static final Logger logger = LogsCenter.getLogger(MainApp.class); - public static final Version VERSION = new Version(1, 0, 0, true); + public static final Version VERSION = new Version(0, 4, 0, true); protected Ui ui; protected Logic logic; @@ -44,7 +44,7 @@ public MainApp() {} @Override public void init() throws Exception { - logger.info("=============================[ Initializing AddressBook ]==========================="); + logger.info("=============================[ Initializing Savvy Tasker ]==========================="); super.init(); config = initConfig(getApplicationParameter("config")); @@ -74,14 +74,14 @@ private Model initModelManager(Storage storage, UserPrefs userPrefs) { try { savvyTaskerOptional = storage.readSavvyTasker(); if(!savvyTaskerOptional.isPresent()){ - logger.info("Data file not found. Will be starting with an empty AddressBook"); + logger.info("Data file not found. Will be starting with an empty Savvy Tasker"); } initialData = savvyTaskerOptional.orElse(new SavvyTasker()); } catch (DataConversionException e) { - logger.warning("Data file not in the correct format. Will be starting with an empty AddressBook"); + logger.warning("Data file not in the correct format. Will be starting with an empty Savvy Tasker"); initialData = new SavvyTasker(); } catch (IOException e) { - logger.warning("Problem while reading from the file. . Will be starting with an empty AddressBook"); + logger.warning("Problem while reading from the file. . Will be starting with an empty Savvy Tasker"); initialData = new SavvyTasker(); } @@ -138,7 +138,7 @@ protected UserPrefs initPrefs(Config config) { "Using default user prefs"); initializedPrefs = new UserPrefs(); } catch (IOException e) { - logger.warning("Problem while reading from the file. . Will be starting with an empty AddressBook"); + logger.warning("Problem while reading from the file. . Will be starting with an empty Savvy Tasker"); initializedPrefs = new UserPrefs(); } @@ -158,13 +158,13 @@ private void initEventsCenter() { @Override public void start(Stage primaryStage) { - logger.info("Starting AddressBook " + MainApp.VERSION); + logger.info("Starting Savvy Tasker " + MainApp.VERSION); ui.start(primaryStage); } @Override public void stop() { - logger.info("============================ [ Stopping Address Book ] ============================="); + logger.info("============================ [ Stopping Savvy Tasker ] ============================="); ui.stop(); try { storage.saveUserPrefs(userPrefs); diff --git a/src/main/java/seedu/savvytasker/commons/core/GuiSettings.java b/src/main/java/seedu/savvytasker/commons/core/GuiSettings.java index fca203251759..c7bb07be54a2 100644 --- a/src/main/java/seedu/savvytasker/commons/core/GuiSettings.java +++ b/src/main/java/seedu/savvytasker/commons/core/GuiSettings.java @@ -9,6 +9,10 @@ */ public class GuiSettings implements Serializable { + /** + * Generated serial + */ + private static final long serialVersionUID = -7442507632162266083L; private static final double DEFAULT_HEIGHT = 600; private static final double DEFAULT_WIDTH = 740; diff --git a/src/main/java/seedu/savvytasker/commons/core/UnmodifiableObservableList.java b/src/main/java/seedu/savvytasker/commons/core/UnmodifiableObservableList.java index ee38fc63d6d3..703ec628cc12 100644 --- a/src/main/java/seedu/savvytasker/commons/core/UnmodifiableObservableList.java +++ b/src/main/java/seedu/savvytasker/commons/core/UnmodifiableObservableList.java @@ -95,7 +95,7 @@ public final SortedList sorted(Comparator comparator) { public final SortedList sorted() { return sorted(Comparator.nullsFirst((o1, o2) -> { if (o1 instanceof Comparable) { - return ((Comparable) o1).compareTo(o2); + return ((Comparable) o1).compareTo(o2); } return Collator.getInstance().compare(o1.toString(), o2.toString()); })); diff --git a/src/main/java/seedu/savvytasker/commons/events/model/AddressBookChangedEvent.java b/src/main/java/seedu/savvytasker/commons/events/model/AddressBookChangedEvent.java deleted file mode 100644 index 02f07cdb169e..000000000000 --- a/src/main/java/seedu/savvytasker/commons/events/model/AddressBookChangedEvent.java +++ /dev/null @@ -1,19 +0,0 @@ -package seedu.savvytasker.commons.events.model; - -import seedu.savvytasker.commons.events.BaseEvent; -import seedu.savvytasker.model.ReadOnlyAddressBook; - -/** Indicates the AddressBook in the model has changed*/ -public class AddressBookChangedEvent extends BaseEvent { - - public final ReadOnlyAddressBook data; - - public AddressBookChangedEvent(ReadOnlyAddressBook data){ - this.data = data; - } - - @Override - public String toString() { - return "number of persons " + data.getPersonList().size() + ", number of tags " + data.getTagList().size(); - } -} diff --git a/src/main/java/seedu/savvytasker/commons/events/ui/JumpToListRequestEvent.java b/src/main/java/seedu/savvytasker/commons/events/ui/JumpToListRequestEvent.java index 3fef46270461..104ee70b0659 100644 --- a/src/main/java/seedu/savvytasker/commons/events/ui/JumpToListRequestEvent.java +++ b/src/main/java/seedu/savvytasker/commons/events/ui/JumpToListRequestEvent.java @@ -3,7 +3,7 @@ import seedu.savvytasker.commons.events.BaseEvent; /** - * Indicates a request to jump to the list of persons + * Indicates a request to jump to the list of tasks */ public class JumpToListRequestEvent extends BaseEvent { diff --git a/src/main/java/seedu/savvytasker/commons/events/ui/TaskPanelSelectionChangedEvent.java b/src/main/java/seedu/savvytasker/commons/events/ui/TaskPanelSelectionChangedEvent.java index dca09770ea5b..89caab54a44f 100644 --- a/src/main/java/seedu/savvytasker/commons/events/ui/TaskPanelSelectionChangedEvent.java +++ b/src/main/java/seedu/savvytasker/commons/events/ui/TaskPanelSelectionChangedEvent.java @@ -1,7 +1,7 @@ package seedu.savvytasker.commons.events.ui; import seedu.savvytasker.commons.events.BaseEvent; -import seedu.savvytasker.model.person.ReadOnlyTask; +import seedu.savvytasker.model.task.ReadOnlyTask; /** * Represents a selection change in the Person List Panel diff --git a/src/main/java/seedu/savvytasker/commons/exceptions/DataConversionException.java b/src/main/java/seedu/savvytasker/commons/exceptions/DataConversionException.java index f64199deff22..087f61d9b771 100644 --- a/src/main/java/seedu/savvytasker/commons/exceptions/DataConversionException.java +++ b/src/main/java/seedu/savvytasker/commons/exceptions/DataConversionException.java @@ -4,6 +4,11 @@ * Represents an error during conversion of data from one format to another */ public class DataConversionException extends Exception { + /** + * Generated serial + */ + private static final long serialVersionUID = -5908631495910190437L; + public DataConversionException(Exception cause) { super(cause); } diff --git a/src/main/java/seedu/savvytasker/commons/exceptions/DuplicateDataException.java b/src/main/java/seedu/savvytasker/commons/exceptions/DuplicateDataException.java index f3fc02d5ae4f..e096adf6b272 100644 --- a/src/main/java/seedu/savvytasker/commons/exceptions/DuplicateDataException.java +++ b/src/main/java/seedu/savvytasker/commons/exceptions/DuplicateDataException.java @@ -4,6 +4,11 @@ * Signals an error caused by duplicate data where there should be none. */ public abstract class DuplicateDataException extends IllegalValueException { + /** + * Generated serial + */ + private static final long serialVersionUID = 5045611929659070003L; + public DuplicateDataException(String message) { super(message); } diff --git a/src/main/java/seedu/savvytasker/commons/exceptions/IllegalValueException.java b/src/main/java/seedu/savvytasker/commons/exceptions/IllegalValueException.java index a33075c24e85..fd5295f907a3 100644 --- a/src/main/java/seedu/savvytasker/commons/exceptions/IllegalValueException.java +++ b/src/main/java/seedu/savvytasker/commons/exceptions/IllegalValueException.java @@ -4,6 +4,11 @@ * Signals that some given data does not fulfill some constraints. */ public class IllegalValueException extends Exception { + /** + * Generated serial + */ + private static final long serialVersionUID = 193885632897265498L; + /** * @param message should contain relevant information on the failed constraint(s) */ diff --git a/src/main/java/seedu/savvytasker/commons/util/CollectionUtil.java b/src/main/java/seedu/savvytasker/commons/util/CollectionUtil.java deleted file mode 100644 index 617290a80c46..000000000000 --- a/src/main/java/seedu/savvytasker/commons/util/CollectionUtil.java +++ /dev/null @@ -1,47 +0,0 @@ -package seedu.savvytasker.commons.util; - -import java.util.Collection; -import java.util.HashSet; -import java.util.Set; - -/** - * Utility methods related to Collections - */ -public class CollectionUtil { - - /** - * Returns true if any of the given items are null. - */ - public static boolean isAnyNull(Object... items) { - for (Object item : items) { - if (item == null) { - return true; - } - } - return false; - } - - - - /** - * Throws an assertion error if the collection or any item in it is null. - */ - public static void assertNoNullElements(Collection items) { - assert items != null; - assert !isAnyNull(items); - } - - /** - * Returns true if every element in a collection are unique by {@link Object#equals(Object)}. - */ - public static boolean elementsAreUnique(Collection items) { - final Set testSet = new HashSet<>(); - for (Object item : items) { - final boolean itemAlreadyExists = !testSet.add(item); // see Set documentation - if (itemAlreadyExists) { - return false; - } - } - return true; - } -} diff --git a/src/main/java/seedu/savvytasker/commons/util/JsonUtil.java b/src/main/java/seedu/savvytasker/commons/util/JsonUtil.java index 99bdac17ec82..b5c8d453273d 100644 --- a/src/main/java/seedu/savvytasker/commons/util/JsonUtil.java +++ b/src/main/java/seedu/savvytasker/commons/util/JsonUtil.java @@ -20,6 +20,11 @@ public class JsonUtil { private static class LevelDeserializer extends FromStringDeserializer { + /** + * Generated serial + */ + private static final long serialVersionUID = 7901046138205615293L; + protected LevelDeserializer(Class vc) { super(vc); } diff --git a/src/main/java/seedu/savvytasker/logic/Logic.java b/src/main/java/seedu/savvytasker/logic/Logic.java index bcea4afa8902..80316d645807 100644 --- a/src/main/java/seedu/savvytasker/logic/Logic.java +++ b/src/main/java/seedu/savvytasker/logic/Logic.java @@ -2,7 +2,7 @@ import javafx.collections.ObservableList; import seedu.savvytasker.logic.commands.CommandResult; -import seedu.savvytasker.model.person.ReadOnlyTask; +import seedu.savvytasker.model.task.ReadOnlyTask; /** * API of the Logic component diff --git a/src/main/java/seedu/savvytasker/logic/LogicManager.java b/src/main/java/seedu/savvytasker/logic/LogicManager.java index 05c2e91286ea..89e11e58dfd9 100644 --- a/src/main/java/seedu/savvytasker/logic/LogicManager.java +++ b/src/main/java/seedu/savvytasker/logic/LogicManager.java @@ -7,7 +7,7 @@ import seedu.savvytasker.logic.commands.CommandResult; import seedu.savvytasker.logic.parser.*; import seedu.savvytasker.model.Model; -import seedu.savvytasker.model.person.ReadOnlyTask; +import seedu.savvytasker.model.task.ReadOnlyTask; import seedu.savvytasker.storage.Storage; import java.util.Stack; diff --git a/src/main/java/seedu/savvytasker/logic/commands/AddCommand.java b/src/main/java/seedu/savvytasker/logic/commands/AddCommand.java index d4346c90bd5a..768d421f5859 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/AddCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/AddCommand.java @@ -1,8 +1,8 @@ package seedu.savvytasker.logic.commands; import seedu.savvytasker.logic.commands.models.AddCommandModel; -import seedu.savvytasker.model.person.*; -import seedu.savvytasker.model.person.TaskList.DuplicateTaskException; +import seedu.savvytasker.model.task.Task; +import seedu.savvytasker.model.task.TaskList.DuplicateTaskException; /** * Adds a person to the address book. @@ -42,7 +42,6 @@ public CommandResult execute() { model.addTask(toAdd); return new CommandResult(String.format(MESSAGE_SUCCESS, toAdd)); } catch (DuplicateTaskException e) { - assert false; // ModelManager will ensure no duplicated tasks return new CommandResult(MESSAGE_DUPLICATE_TASK); } diff --git a/src/main/java/seedu/savvytasker/logic/commands/AliasCommand.java b/src/main/java/seedu/savvytasker/logic/commands/AliasCommand.java index 559bae3ece66..0205fa9ec82f 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/AliasCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/AliasCommand.java @@ -1,8 +1,8 @@ package seedu.savvytasker.logic.commands; import seedu.savvytasker.logic.commands.models.AliasCommandModel; -import seedu.savvytasker.model.person.*; -import seedu.savvytasker.model.person.TaskList.DuplicateTaskException; +import seedu.savvytasker.model.task.Task; +import seedu.savvytasker.model.task.TaskList.DuplicateTaskException; /** * Command to create aliases diff --git a/src/main/java/seedu/savvytasker/logic/commands/DeleteCommand.java b/src/main/java/seedu/savvytasker/logic/commands/DeleteCommand.java index a111be90caf7..42b9bec4a5f1 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/DeleteCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/DeleteCommand.java @@ -5,8 +5,8 @@ import seedu.savvytasker.commons.core.Messages; import seedu.savvytasker.commons.core.UnmodifiableObservableList; import seedu.savvytasker.logic.commands.models.DeleteCommandModel; -import seedu.savvytasker.model.person.ReadOnlyTask; -import seedu.savvytasker.model.person.TaskList.TaskNotFoundException; +import seedu.savvytasker.model.task.ReadOnlyTask; +import seedu.savvytasker.model.task.TaskList.TaskNotFoundException; /** * Deletes a person identified using it's last displayed index from the address book. diff --git a/src/main/java/seedu/savvytasker/logic/commands/ModifyCommand.java b/src/main/java/seedu/savvytasker/logic/commands/ModifyCommand.java index 9b0d8ecde5bb..c04bfea6cfdd 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/ModifyCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/ModifyCommand.java @@ -3,8 +3,9 @@ import seedu.savvytasker.commons.core.Messages; import seedu.savvytasker.commons.core.UnmodifiableObservableList; import seedu.savvytasker.logic.commands.models.ModifyCommandModel; -import seedu.savvytasker.model.person.*; -import seedu.savvytasker.model.person.TaskList.TaskNotFoundException; +import seedu.savvytasker.model.task.ReadOnlyTask; +import seedu.savvytasker.model.task.Task; +import seedu.savvytasker.model.task.TaskList.TaskNotFoundException; /** * Adds a person to the address book. diff --git a/src/main/java/seedu/savvytasker/logic/commands/SelectCommand.java b/src/main/java/seedu/savvytasker/logic/commands/SelectCommand.java index 81cd134d84c6..f905fb1deb79 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/SelectCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/SelectCommand.java @@ -4,7 +4,7 @@ import seedu.savvytasker.commons.core.Messages; import seedu.savvytasker.commons.core.UnmodifiableObservableList; import seedu.savvytasker.commons.events.ui.JumpToListRequestEvent; -import seedu.savvytasker.model.person.ReadOnlyTask; +import seedu.savvytasker.model.task.ReadOnlyTask; /** * Selects a person identified using it's last displayed index from the address book. diff --git a/src/main/java/seedu/savvytasker/logic/commands/UnaliasCommand.java b/src/main/java/seedu/savvytasker/logic/commands/UnaliasCommand.java index 51b95c3d5e19..4d8250324257 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/UnaliasCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/UnaliasCommand.java @@ -2,8 +2,8 @@ import seedu.savvytasker.commons.exceptions.IllegalValueException; import seedu.savvytasker.logic.commands.models.AliasCommandModel; -import seedu.savvytasker.model.person.*; -import seedu.savvytasker.model.person.TaskList.DuplicateTaskException; +import seedu.savvytasker.model.task.Task; +import seedu.savvytasker.model.task.TaskList.DuplicateTaskException; /** * Command to remove aliases diff --git a/src/main/java/seedu/savvytasker/logic/parser/MarkCommandParser.java b/src/main/java/seedu/savvytasker/logic/parser/MarkCommandParser.java index ac8c53d9b02a..322d71bf3ba4 100644 --- a/src/main/java/seedu/savvytasker/logic/parser/MarkCommandParser.java +++ b/src/main/java/seedu/savvytasker/logic/parser/MarkCommandParser.java @@ -4,9 +4,7 @@ import java.util.regex.Pattern; import seedu.savvytasker.commons.core.Messages; -import seedu.savvytasker.logic.commands.DeleteCommand; import seedu.savvytasker.logic.commands.MarkCommand; -import seedu.savvytasker.logic.commands.models.DeleteCommandModel; public class MarkCommandParser implements CommandParser { private static final String HEADER = "mark"; @@ -33,7 +31,7 @@ public String getRequiredFormat() { public MarkCommand parse(String commandText) throws ParseException { Matcher matcher = REGEX_PATTERN.matcher(commandText); if (matcher.matches()) { - int[] indices = parseIndices(matcher.group(REGEX_REF_INDICES)); + parseIndices(matcher.group(REGEX_REF_INDICES)); // TODO: Integrate with MarkCommand properly return new MarkCommand(); diff --git a/src/main/java/seedu/savvytasker/logic/parser/RedoCommandParser.java b/src/main/java/seedu/savvytasker/logic/parser/RedoCommandParser.java index 629e420bab80..7bc1d512878d 100644 --- a/src/main/java/seedu/savvytasker/logic/parser/RedoCommandParser.java +++ b/src/main/java/seedu/savvytasker/logic/parser/RedoCommandParser.java @@ -1,9 +1,7 @@ package seedu.savvytasker.logic.parser; import seedu.savvytasker.commons.core.Messages; -import seedu.savvytasker.logic.commands.ExitCommand; import seedu.savvytasker.logic.commands.RedoCommand; -import seedu.savvytasker.logic.commands.UndoCommand; public class RedoCommandParser implements CommandParser { private static final String HEADER = "redo"; diff --git a/src/main/java/seedu/savvytasker/logic/parser/UndoCommandParser.java b/src/main/java/seedu/savvytasker/logic/parser/UndoCommandParser.java index d83e08312102..f620ba4ab208 100644 --- a/src/main/java/seedu/savvytasker/logic/parser/UndoCommandParser.java +++ b/src/main/java/seedu/savvytasker/logic/parser/UndoCommandParser.java @@ -1,7 +1,6 @@ package seedu.savvytasker.logic.parser; import seedu.savvytasker.commons.core.Messages; -import seedu.savvytasker.logic.commands.ExitCommand; import seedu.savvytasker.logic.commands.UndoCommand; public class UndoCommandParser implements CommandParser { diff --git a/src/main/java/seedu/savvytasker/logic/parser/UnmarkCommandParser.java b/src/main/java/seedu/savvytasker/logic/parser/UnmarkCommandParser.java index 7968fa247ab1..442231edc13b 100644 --- a/src/main/java/seedu/savvytasker/logic/parser/UnmarkCommandParser.java +++ b/src/main/java/seedu/savvytasker/logic/parser/UnmarkCommandParser.java @@ -4,9 +4,7 @@ import java.util.regex.Pattern; import seedu.savvytasker.commons.core.Messages; -import seedu.savvytasker.logic.commands.DeleteCommand; import seedu.savvytasker.logic.commands.UnmarkCommand; -import seedu.savvytasker.logic.commands.models.DeleteCommandModel; public class UnmarkCommandParser implements CommandParser { private static final String HEADER = "unmark"; @@ -33,7 +31,7 @@ public String getRequiredFormat() { public UnmarkCommand parse(String commandText) throws ParseException { Matcher matcher = REGEX_PATTERN.matcher(commandText); if (matcher.matches()) { - int[] indices = parseIndices(matcher.group(REGEX_REF_INDICES)); + parseIndices(matcher.group(REGEX_REF_INDICES)); // TODO: Integrate UnmarkCommand properly! return new UnmarkCommand(); diff --git a/src/main/java/seedu/savvytasker/model/AddressBook.java b/src/main/java/seedu/savvytasker/model/AddressBook.java deleted file mode 100644 index 8604359fbd9a..000000000000 --- a/src/main/java/seedu/savvytasker/model/AddressBook.java +++ /dev/null @@ -1,165 +0,0 @@ -package seedu.savvytasker.model; - -import javafx.collections.ObservableList; -import seedu.savvytasker.model.person.Person; -import seedu.savvytasker.model.person.ReadOnlyPerson; -import seedu.savvytasker.model.person.UniquePersonList; -import seedu.savvytasker.model.person.UniquePersonList.DuplicatePersonException; -import seedu.savvytasker.model.person.UniquePersonList.PersonNotFoundException; -import seedu.savvytasker.model.tag.Tag; -import seedu.savvytasker.model.tag.UniqueTagList; - -import java.util.*; -import java.util.stream.Collectors; - -/** - * Wraps all data at the address-book level - * Duplicates are not allowed (by .equals comparison) - */ -public class AddressBook implements ReadOnlyAddressBook { - - private final UniquePersonList persons; - private final UniqueTagList tags; - - { - persons = new UniquePersonList(); - tags = new UniqueTagList(); - } - - public AddressBook() {} - - /** - * Persons and Tags are copied into this addressbook - */ - public AddressBook(ReadOnlyAddressBook toBeCopied) { - this(toBeCopied.getUniquePersonList(), toBeCopied.getUniqueTagList()); - } - - /** - * Persons and Tags are copied into this addressbook - */ - public AddressBook(UniquePersonList persons, UniqueTagList tags) { - resetData(persons.getInternalList(), tags.getInternalList()); - } - - public static ReadOnlyAddressBook getEmptyAddressBook() { - return new AddressBook(); - } - -//// list overwrite operations - - public ObservableList getPersons() { - return persons.getInternalList(); - } - - public void setPersons(List persons) { - this.persons.getInternalList().setAll(persons); - } - - public void setTags(Collection tags) { - this.tags.getInternalList().setAll(tags); - } - - public void resetData(Collection newPersons, Collection newTags) { - setPersons(newPersons.stream().map(Person::new).collect(Collectors.toList())); - setTags(newTags); - } - - public void resetData(ReadOnlyAddressBook newData) { - resetData(newData.getPersonList(), newData.getTagList()); - } - -//// person-level operations - - /** - * Adds a person to the address book. - * Also checks the new person's tags and updates {@link #tags} with any new tags found, - * and updates the Tag objects in the person to point to those in {@link #tags}. - * - * @throws UniquePersonList.DuplicatePersonException if an equivalent person already exists. - */ - public void addPerson(Person p) throws DuplicatePersonException { - syncTagsWithMasterList(p); - persons.add(p); - } - - /** - * Ensures that every tag in this person: - * - exists in the master list {@link #tags} - * - points to a Tag object in the master list - */ - private void syncTagsWithMasterList(Person person) { - final UniqueTagList personTags = person.getTags(); - tags.mergeFrom(personTags); - - // Create map with values = tag object references in the master list - final Map masterTagObjects = new HashMap<>(); - for (Tag tag : tags) { - masterTagObjects.put(tag, tag); - } - - // Rebuild the list of person tags using references from the master list - final Set commonTagReferences = new HashSet<>(); - for (Tag tag : personTags) { - commonTagReferences.add(masterTagObjects.get(tag)); - } - person.setTags(new UniqueTagList(commonTagReferences)); - } - - public boolean removePerson(ReadOnlyPerson key) throws PersonNotFoundException { - if (persons.remove(key)) { - return true; - } else { - throw new UniquePersonList.PersonNotFoundException(); - } - } - -//// tag-level operations - - public void addTag(Tag t) throws UniqueTagList.DuplicateTagException { - tags.add(t); - } - -//// util methods - - @Override - public String toString() { - return persons.getInternalList().size() + " persons, " + tags.getInternalList().size() + " tags"; - // TODO: refine later - } - - @Override - public List getPersonList() { - return Collections.unmodifiableList(persons.getInternalList()); - } - - @Override - public List getTagList() { - return Collections.unmodifiableList(tags.getInternalList()); - } - - @Override - public UniquePersonList getUniquePersonList() { - return this.persons; - } - - @Override - public UniqueTagList getUniqueTagList() { - return this.tags; - } - - - @Override - public boolean equals(Object other) { - return other == this // short circuit if same object - || (other instanceof AddressBook // instanceof handles nulls - && this.persons.equals(((AddressBook) other).persons) - && this.tags.equals(((AddressBook) other).tags)); - } - - @Override - public int hashCode() { - // use this method for custom fields hashing instead of implementing your own - return Objects.hash(persons, tags); - } -} diff --git a/src/main/java/seedu/savvytasker/model/Model.java b/src/main/java/seedu/savvytasker/model/Model.java index fdd6f4057d2c..2108571315a5 100644 --- a/src/main/java/seedu/savvytasker/model/Model.java +++ b/src/main/java/seedu/savvytasker/model/Model.java @@ -1,11 +1,11 @@ package seedu.savvytasker.model; import seedu.savvytasker.commons.core.UnmodifiableObservableList; -import seedu.savvytasker.model.person.ReadOnlyTask; -import seedu.savvytasker.model.person.Task; -import seedu.savvytasker.model.person.TaskList.DuplicateTaskException; -import seedu.savvytasker.model.person.TaskList.TaskNotFoundException; import seedu.savvytasker.model.task.FindType; +import seedu.savvytasker.model.task.ReadOnlyTask; +import seedu.savvytasker.model.task.Task; +import seedu.savvytasker.model.task.TaskList.DuplicateTaskException; +import seedu.savvytasker.model.task.TaskList.TaskNotFoundException; /** * The API of the Model component. diff --git a/src/main/java/seedu/savvytasker/model/ModelManager.java b/src/main/java/seedu/savvytasker/model/ModelManager.java index c9699f4b7860..e72480a0acc4 100644 --- a/src/main/java/seedu/savvytasker/model/ModelManager.java +++ b/src/main/java/seedu/savvytasker/model/ModelManager.java @@ -7,11 +7,11 @@ import seedu.savvytasker.commons.core.UnmodifiableObservableList; import seedu.savvytasker.commons.events.model.SavvyTaskerChangedEvent; import seedu.savvytasker.commons.util.StringUtil; -import seedu.savvytasker.model.person.ReadOnlyTask; -import seedu.savvytasker.model.person.Task; -import seedu.savvytasker.model.person.TaskList.DuplicateTaskException; -import seedu.savvytasker.model.person.TaskList.TaskNotFoundException; import seedu.savvytasker.model.task.FindType; +import seedu.savvytasker.model.task.ReadOnlyTask; +import seedu.savvytasker.model.task.Task; +import seedu.savvytasker.model.task.TaskList.DuplicateTaskException; +import seedu.savvytasker.model.task.TaskList.TaskNotFoundException; import java.util.Arrays; import java.util.Comparator; diff --git a/src/main/java/seedu/savvytasker/model/ReadOnlyAddressBook.java b/src/main/java/seedu/savvytasker/model/ReadOnlyAddressBook.java deleted file mode 100644 index 31a5e25fa4d2..000000000000 --- a/src/main/java/seedu/savvytasker/model/ReadOnlyAddressBook.java +++ /dev/null @@ -1,30 +0,0 @@ -package seedu.savvytasker.model; - - -import java.util.List; - -import seedu.savvytasker.model.person.ReadOnlyPerson; -import seedu.savvytasker.model.person.UniquePersonList; -import seedu.savvytasker.model.tag.Tag; -import seedu.savvytasker.model.tag.UniqueTagList; - -/** - * Unmodifiable view of an address book - */ -public interface ReadOnlyAddressBook { - - UniqueTagList getUniqueTagList(); - - UniquePersonList getUniquePersonList(); - - /** - * Returns an unmodifiable view of persons list - */ - List getPersonList(); - - /** - * Returns an unmodifiable view of tags list - */ - List getTagList(); - -} diff --git a/src/main/java/seedu/savvytasker/model/ReadOnlySavvyTasker.java b/src/main/java/seedu/savvytasker/model/ReadOnlySavvyTasker.java index 0d47888e8e21..c2a43ec3c167 100644 --- a/src/main/java/seedu/savvytasker/model/ReadOnlySavvyTasker.java +++ b/src/main/java/seedu/savvytasker/model/ReadOnlySavvyTasker.java @@ -2,8 +2,8 @@ import java.util.List; -import seedu.savvytasker.model.person.ReadOnlyTask; -import seedu.savvytasker.model.person.TaskList; +import seedu.savvytasker.model.task.ReadOnlyTask; +import seedu.savvytasker.model.task.TaskList; /** * Unmodifiable view of a task list diff --git a/src/main/java/seedu/savvytasker/model/SavvyTasker.java b/src/main/java/seedu/savvytasker/model/SavvyTasker.java index 673162e66b96..c3c53fe848b3 100644 --- a/src/main/java/seedu/savvytasker/model/SavvyTasker.java +++ b/src/main/java/seedu/savvytasker/model/SavvyTasker.java @@ -1,11 +1,11 @@ package seedu.savvytasker.model; import javafx.collections.ObservableList; -import seedu.savvytasker.model.person.ReadOnlyTask; -import seedu.savvytasker.model.person.Task; -import seedu.savvytasker.model.person.TaskList; -import seedu.savvytasker.model.person.TaskList.DuplicateTaskException; -import seedu.savvytasker.model.person.TaskList.TaskNotFoundException; +import seedu.savvytasker.model.task.ReadOnlyTask; +import seedu.savvytasker.model.task.Task; +import seedu.savvytasker.model.task.TaskList; +import seedu.savvytasker.model.task.TaskList.DuplicateTaskException; +import seedu.savvytasker.model.task.TaskList.TaskNotFoundException; import java.util.*; import java.util.stream.Collectors; diff --git a/src/main/java/seedu/savvytasker/model/person/Address.java b/src/main/java/seedu/savvytasker/model/person/Address.java deleted file mode 100644 index 37fcc64bdd41..000000000000 --- a/src/main/java/seedu/savvytasker/model/person/Address.java +++ /dev/null @@ -1,54 +0,0 @@ -package seedu.savvytasker.model.person; - - -import seedu.savvytasker.commons.exceptions.IllegalValueException; - -/** - * Represents a Person's address in the address book. - * Guarantees: immutable; is valid as declared in {@link #isValidAddress(String)} - */ -public class Address { - - public static final String MESSAGE_ADDRESS_CONSTRAINTS = "Person addresses can be in any format"; - public static final String ADDRESS_VALIDATION_REGEX = ".+"; - - public final String value; - - /** - * Validates given address. - * - * @throws IllegalValueException if given address string is invalid. - */ - public Address(String address) throws IllegalValueException { - assert address != null; - if (!isValidAddress(address)) { - throw new IllegalValueException(MESSAGE_ADDRESS_CONSTRAINTS); - } - this.value = address; - } - - /** - * Returns true if a given string is a valid person email. - */ - public static boolean isValidAddress(String test) { - return test.matches(ADDRESS_VALIDATION_REGEX); - } - - @Override - public String toString() { - return value; - } - - @Override - public boolean equals(Object other) { - return other == this // short circuit if same object - || (other instanceof Address // instanceof handles nulls - && this.value.equals(((Address) other).value)); // state check - } - - @Override - public int hashCode() { - return value.hashCode(); - } - -} \ No newline at end of file diff --git a/src/main/java/seedu/savvytasker/model/person/Email.java b/src/main/java/seedu/savvytasker/model/person/Email.java deleted file mode 100644 index 5ebea8e509da..000000000000 --- a/src/main/java/seedu/savvytasker/model/person/Email.java +++ /dev/null @@ -1,56 +0,0 @@ -package seedu.savvytasker.model.person; - - -import seedu.savvytasker.commons.exceptions.IllegalValueException; - -/** - * Represents a Person's phone number in the address book. - * Guarantees: immutable; is valid as declared in {@link #isValidEmail(String)} - */ -public class Email { - - public static final String MESSAGE_EMAIL_CONSTRAINTS = - "Person emails should be 2 alphanumeric/period strings separated by '@'"; - public static final String EMAIL_VALIDATION_REGEX = "[\\w\\.]+@[\\w\\.]+"; - - public final String value; - - /** - * Validates given email. - * - * @throws IllegalValueException if given email address string is invalid. - */ - public Email(String email) throws IllegalValueException { - assert email != null; - email = email.trim(); - if (!isValidEmail(email)) { - throw new IllegalValueException(MESSAGE_EMAIL_CONSTRAINTS); - } - this.value = email; - } - - /** - * Returns if a given string is a valid person email. - */ - public static boolean isValidEmail(String test) { - return test.matches(EMAIL_VALIDATION_REGEX); - } - - @Override - public String toString() { - return value; - } - - @Override - public boolean equals(Object other) { - return other == this // short circuit if same object - || (other instanceof Email // instanceof handles nulls - && this.value.equals(((Email) other).value)); // state check - } - - @Override - public int hashCode() { - return value.hashCode(); - } - -} diff --git a/src/main/java/seedu/savvytasker/model/person/Name.java b/src/main/java/seedu/savvytasker/model/person/Name.java deleted file mode 100644 index db5efca92b33..000000000000 --- a/src/main/java/seedu/savvytasker/model/person/Name.java +++ /dev/null @@ -1,55 +0,0 @@ -package seedu.savvytasker.model.person; - -import seedu.savvytasker.commons.exceptions.IllegalValueException; - -/** - * Represents a Person's name in the address book. - * Guarantees: immutable; is valid as declared in {@link #isValidName(String)} - */ -public class Name { - - public static final String MESSAGE_NAME_CONSTRAINTS = "Person names should be spaces or alphanumeric characters"; - public static final String NAME_VALIDATION_REGEX = "[\\p{Alnum} ]+"; - - public final String fullName; - - /** - * Validates given name. - * - * @throws IllegalValueException if given name string is invalid. - */ - public Name(String name) throws IllegalValueException { - assert name != null; - name = name.trim(); - if (!isValidName(name)) { - throw new IllegalValueException(MESSAGE_NAME_CONSTRAINTS); - } - this.fullName = name; - } - - /** - * Returns true if a given string is a valid person name. - */ - public static boolean isValidName(String test) { - return test.matches(NAME_VALIDATION_REGEX); - } - - - @Override - public String toString() { - return fullName; - } - - @Override - public boolean equals(Object other) { - return other == this // short circuit if same object - || (other instanceof Name // instanceof handles nulls - && this.fullName.equals(((Name) other).fullName)); // state check - } - - @Override - public int hashCode() { - return fullName.hashCode(); - } - -} diff --git a/src/main/java/seedu/savvytasker/model/person/Person.java b/src/main/java/seedu/savvytasker/model/person/Person.java deleted file mode 100644 index 5c399b048c6e..000000000000 --- a/src/main/java/seedu/savvytasker/model/person/Person.java +++ /dev/null @@ -1,90 +0,0 @@ -package seedu.savvytasker.model.person; - -import java.util.Objects; - -import seedu.savvytasker.commons.util.CollectionUtil; -import seedu.savvytasker.model.tag.UniqueTagList; - -/** - * Represents a Person in the address book. - * Guarantees: details are present and not null, field values are validated. - */ -public class Person implements ReadOnlyPerson { - - private Name name; - private Phone phone; - private Email email; - private Address address; - - private UniqueTagList tags; - - /** - * Every field must be present and not null. - */ - public Person(Name name, Phone phone, Email email, Address address, UniqueTagList tags) { - assert !CollectionUtil.isAnyNull(name, phone, email, address, tags); - this.name = name; - this.phone = phone; - this.email = email; - this.address = address; - this.tags = new UniqueTagList(tags); // protect internal tags from changes in the arg list - } - - /** - * Copy constructor. - */ - public Person(ReadOnlyPerson source) { - this(source.getName(), source.getPhone(), source.getEmail(), source.getAddress(), source.getTags()); - } - - @Override - public Name getName() { - return name; - } - - @Override - public Phone getPhone() { - return phone; - } - - @Override - public Email getEmail() { - return email; - } - - @Override - public Address getAddress() { - return address; - } - - @Override - public UniqueTagList getTags() { - return new UniqueTagList(tags); - } - - /** - * Replaces this person's tags with the tags in the argument tag list. - */ - public void setTags(UniqueTagList replacement) { - tags.setTags(replacement); - } - - @Override - public boolean equals(Object other) { - return other == this // short circuit if same object - || (other instanceof ReadOnlyPerson // instanceof handles nulls - && this.isSameStateAs((ReadOnlyPerson) other)); - } - - @Override - public int hashCode() { - // use this method for custom fields hashing instead of implementing your own - return Objects.hash(name, phone, email, address, tags); - } - - @Override - public String toString() { - return getAsText(); - } - -} diff --git a/src/main/java/seedu/savvytasker/model/person/Phone.java b/src/main/java/seedu/savvytasker/model/person/Phone.java deleted file mode 100644 index fa414a54ea81..000000000000 --- a/src/main/java/seedu/savvytasker/model/person/Phone.java +++ /dev/null @@ -1,54 +0,0 @@ -package seedu.savvytasker.model.person; - -import seedu.savvytasker.commons.exceptions.IllegalValueException; - -/** - * Represents a Person's phone number in the address book. - * Guarantees: immutable; is valid as declared in {@link #isValidPhone(String)} - */ -public class Phone { - - public static final String MESSAGE_PHONE_CONSTRAINTS = "Person phone numbers should only contain numbers"; - public static final String PHONE_VALIDATION_REGEX = "\\d+"; - - public final String value; - - /** - * Validates given phone number. - * - * @throws IllegalValueException if given phone string is invalid. - */ - public Phone(String phone) throws IllegalValueException { - assert phone != null; - phone = phone.trim(); - if (!isValidPhone(phone)) { - throw new IllegalValueException(MESSAGE_PHONE_CONSTRAINTS); - } - this.value = phone; - } - - /** - * Returns true if a given string is a valid person phone number. - */ - public static boolean isValidPhone(String test) { - return test.matches(PHONE_VALIDATION_REGEX); - } - - @Override - public String toString() { - return value; - } - - @Override - public boolean equals(Object other) { - return other == this // short circuit if same object - || (other instanceof Phone // instanceof handles nulls - && this.value.equals(((Phone) other).value)); // state check - } - - @Override - public int hashCode() { - return value.hashCode(); - } - -} diff --git a/src/main/java/seedu/savvytasker/model/person/ReadOnlyPerson.java b/src/main/java/seedu/savvytasker/model/person/ReadOnlyPerson.java deleted file mode 100644 index d0c6ef0fbe50..000000000000 --- a/src/main/java/seedu/savvytasker/model/person/ReadOnlyPerson.java +++ /dev/null @@ -1,65 +0,0 @@ -package seedu.savvytasker.model.person; - -import seedu.savvytasker.model.tag.UniqueTagList; - -/** - * A read-only immutable interface for a Person in the addressbook. - * Implementations should guarantee: details are present and not null, field values are validated. - */ -public interface ReadOnlyPerson { - - Name getName(); - Phone getPhone(); - Email getEmail(); - Address getAddress(); - - /** - * The returned TagList is a deep copy of the internal TagList, - * changes on the returned list will not affect the person's internal tags. - */ - UniqueTagList getTags(); - - /** - * Returns true if both have the same state. (interfaces cannot override .equals) - */ - default boolean isSameStateAs(ReadOnlyPerson other) { - return other == this // short circuit if same object - || (other != null // this is first to avoid NPE below - && other.getName().equals(this.getName()) // state checks here onwards - && other.getPhone().equals(this.getPhone()) - && other.getEmail().equals(this.getEmail()) - && other.getAddress().equals(this.getAddress())); - } - - /** - * Formats the person as text, showing all contact details. - */ - default String getAsText() { - final StringBuilder builder = new StringBuilder(); - builder.append(getName()) - .append(" Phone: ") - .append(getPhone()) - .append(" Email: ") - .append(getEmail()) - .append(" Address: ") - .append(getAddress()) - .append(" Tags: "); - getTags().forEach(builder::append); - return builder.toString(); - } - - /** - * Returns a string representation of this Person's tags - */ - default String tagsString() { - final StringBuffer buffer = new StringBuffer(); - final String separator = ", "; - getTags().forEach(tag -> buffer.append(tag).append(separator)); - if (buffer.length() == 0) { - return ""; - } else { - return buffer.substring(0, buffer.length() - separator.length()); - } - } - -} diff --git a/src/main/java/seedu/savvytasker/model/person/UniquePersonList.java b/src/main/java/seedu/savvytasker/model/person/UniquePersonList.java deleted file mode 100644 index 9d309e5c00ce..000000000000 --- a/src/main/java/seedu/savvytasker/model/person/UniquePersonList.java +++ /dev/null @@ -1,109 +0,0 @@ -package seedu.savvytasker.model.person; - -import javafx.collections.FXCollections; -import javafx.collections.ObservableList; -import seedu.savvytasker.commons.exceptions.DuplicateDataException; -import seedu.savvytasker.commons.util.CollectionUtil; - -import java.util.*; - -/** - * A list of persons that enforces uniqueness between its elements and does not allow nulls. - * - * Supports a minimal set of list operations. - * - * @see Person#equals(Object) - * @see CollectionUtil#elementsAreUnique(Collection) - */ -public class UniquePersonList implements Iterable { - - /** - * Signals that an operation would have violated the 'no duplicates' property of the list. - */ - public static class DuplicatePersonException extends DuplicateDataException { - - /** - * Generated serial ID - */ - private static final long serialVersionUID = 8933810750762846403L; - - protected DuplicatePersonException() { - super("Operation would result in duplicate persons"); - } - } - - /** - * Signals that an operation targeting a specified person in the list would fail because - * there is no such matching person in the list. - */ - public static class PersonNotFoundException extends Exception { - - /** - * Generated serial ID - */ - private static final long serialVersionUID = -7591982407764643511L;} - - private final ObservableList internalList = FXCollections.observableArrayList(); - - /** - * Constructs empty PersonList. - */ - public UniquePersonList() {} - - /** - * Returns true if the list contains an equivalent person as the given argument. - */ - public boolean contains(ReadOnlyPerson toCheck) { - assert toCheck != null; - return internalList.contains(toCheck); - } - - /** - * Adds a person to the list. - * - * @throws DuplicatePersonException if the person to add is a duplicate of an existing person in the list. - */ - public void add(Person toAdd) throws DuplicatePersonException { - assert toAdd != null; - if (contains(toAdd)) { - throw new DuplicatePersonException(); - } - internalList.add(toAdd); - } - - /** - * Removes the equivalent person from the list. - * - * @throws PersonNotFoundException if no such person could be found in the list. - */ - public boolean remove(ReadOnlyPerson toRemove) throws PersonNotFoundException { - assert toRemove != null; - final boolean personFoundAndDeleted = internalList.remove(toRemove); - if (!personFoundAndDeleted) { - throw new PersonNotFoundException(); - } - return personFoundAndDeleted; - } - - public ObservableList getInternalList() { - return internalList; - } - - @Override - public Iterator iterator() { - return internalList.iterator(); - } - - @Override - public boolean equals(Object other) { - return other == this // short circuit if same object - || (other instanceof UniquePersonList // instanceof handles nulls - && this.internalList.equals( - ((UniquePersonList) other).internalList)); - } - - @Override - public int hashCode() { - return internalList.hashCode(); - } -} diff --git a/src/main/java/seedu/savvytasker/model/tag/Tag.java b/src/main/java/seedu/savvytasker/model/tag/Tag.java deleted file mode 100644 index 0c791b549401..000000000000 --- a/src/main/java/seedu/savvytasker/model/tag/Tag.java +++ /dev/null @@ -1,60 +0,0 @@ -package seedu.savvytasker.model.tag; - - -import seedu.savvytasker.commons.exceptions.IllegalValueException; - -/** - * Represents a Tag in the address book. - * Guarantees: immutable; name is valid as declared in {@link #isValidTagName(String)} - */ -public class Tag { - - public static final String MESSAGE_TAG_CONSTRAINTS = "Tags names should be alphanumeric"; - public static final String TAG_VALIDATION_REGEX = "\\p{Alnum}+"; - - public String tagName; - - public Tag() { - } - - /** - * Validates given tag name. - * - * @throws IllegalValueException if the given tag name string is invalid. - */ - public Tag(String name) throws IllegalValueException { - assert name != null; - name = name.trim(); - if (!isValidTagName(name)) { - throw new IllegalValueException(MESSAGE_TAG_CONSTRAINTS); - } - this.tagName = name; - } - - /** - * Returns true if a given string is a valid tag name. - */ - public static boolean isValidTagName(String test) { - return test.matches(TAG_VALIDATION_REGEX); - } - - @Override - public boolean equals(Object other) { - return other == this // short circuit if same object - || (other instanceof Tag // instanceof handles nulls - && this.tagName.equals(((Tag) other).tagName)); // state check - } - - @Override - public int hashCode() { - return tagName.hashCode(); - } - - /** - * Format state as text for viewing. - */ - public String toString() { - return '[' + tagName + ']'; - } - -} diff --git a/src/main/java/seedu/savvytasker/model/tag/UniqueTagList.java b/src/main/java/seedu/savvytasker/model/tag/UniqueTagList.java deleted file mode 100644 index 9066ce8cf006..000000000000 --- a/src/main/java/seedu/savvytasker/model/tag/UniqueTagList.java +++ /dev/null @@ -1,143 +0,0 @@ -package seedu.savvytasker.model.tag; - -import javafx.collections.FXCollections; -import javafx.collections.ObservableList; -import seedu.savvytasker.commons.exceptions.DuplicateDataException; -import seedu.savvytasker.commons.util.CollectionUtil; - -import java.util.*; - -/** - * A list of tags that enforces no nulls and uniqueness between its elements. - * - * Supports minimal set of list operations for the app's features. - * - * @see Tag#equals(Object) - * @see CollectionUtil#elementsAreUnique(Collection) - */ -public class UniqueTagList implements Iterable { - - /** - * Signals that an operation would have violated the 'no duplicates' property of the list. - */ - public static class DuplicateTagException extends DuplicateDataException { - protected DuplicateTagException() { - super("Operation would result in duplicate tags"); - } - } - - private final ObservableList internalList = FXCollections.observableArrayList(); - - /** - * Constructs empty TagList. - */ - public UniqueTagList() {} - - /** - * Varargs/array constructor, enforces no nulls or duplicates. - */ - public UniqueTagList(Tag... tags) throws DuplicateTagException { - assert !CollectionUtil.isAnyNull((Object[]) tags); - final List initialTags = Arrays.asList(tags); - if (!CollectionUtil.elementsAreUnique(initialTags)) { - throw new DuplicateTagException(); - } - internalList.addAll(initialTags); - } - - /** - * java collections constructor, enforces no null or duplicate elements. - */ - public UniqueTagList(Collection tags) throws DuplicateTagException { - CollectionUtil.assertNoNullElements(tags); - if (!CollectionUtil.elementsAreUnique(tags)) { - throw new DuplicateTagException(); - } - internalList.addAll(tags); - } - - /** - * java set constructor, enforces no nulls. - */ - public UniqueTagList(Set tags) { - CollectionUtil.assertNoNullElements(tags); - internalList.addAll(tags); - } - - /** - * Copy constructor, insulates from changes in source. - */ - public UniqueTagList(UniqueTagList source) { - internalList.addAll(source.internalList); // insulate internal list from changes in argument - } - - /** - * All tags in this list as a Set. This set is mutable and change-insulated against the internal list. - */ - public Set toSet() { - return new HashSet<>(internalList); - } - - /** - * Replaces the Tags in this list with those in the argument tag list. - */ - public void setTags(UniqueTagList replacement) { - this.internalList.clear(); - this.internalList.addAll(replacement.internalList); - } - - /** - * Adds every tag from the argument list that does not yet exist in this list. - */ - public void mergeFrom(UniqueTagList tags) { - final Set alreadyInside = this.toSet(); - for (Tag tag : tags) { - if (!alreadyInside.contains(tag)) { - internalList.add(tag); - } - } - } - - /** - * Returns true if the list contains an equivalent Tag as the given argument. - */ - public boolean contains(Tag toCheck) { - assert toCheck != null; - return internalList.contains(toCheck); - } - - /** - * Adds a Tag to the list. - * - * @throws DuplicateTagException if the Tag to add is a duplicate of an existing Tag in the list. - */ - public void add(Tag toAdd) throws DuplicateTagException { - assert toAdd != null; - if (contains(toAdd)) { - throw new DuplicateTagException(); - } - internalList.add(toAdd); - } - - @Override - public Iterator iterator() { - return internalList.iterator(); - } - - public ObservableList getInternalList() { - return internalList; - } - - @Override - public boolean equals(Object other) { - return other == this // short circuit if same object - || (other instanceof UniqueTagList // instanceof handles nulls - && this.internalList.equals( - ((UniqueTagList) other).internalList)); - } - - @Override - public int hashCode() { - return internalList.hashCode(); - } -} diff --git a/src/main/java/seedu/savvytasker/model/person/ReadOnlyTask.java b/src/main/java/seedu/savvytasker/model/task/ReadOnlyTask.java similarity index 92% rename from src/main/java/seedu/savvytasker/model/person/ReadOnlyTask.java rename to src/main/java/seedu/savvytasker/model/task/ReadOnlyTask.java index f435521d6a62..c69fb332fae8 100644 --- a/src/main/java/seedu/savvytasker/model/person/ReadOnlyTask.java +++ b/src/main/java/seedu/savvytasker/model/task/ReadOnlyTask.java @@ -1,10 +1,7 @@ -package seedu.savvytasker.model.person; +package seedu.savvytasker.model.task; import java.util.Date; -import seedu.savvytasker.model.task.PriorityLevel; -import seedu.savvytasker.model.task.RecurrenceType; - /** * A read-only immutable interface for a Task in the TaskList. * Implementations should guarantee: details are present and not null, field values are validated. diff --git a/src/main/java/seedu/savvytasker/model/person/Task.java b/src/main/java/seedu/savvytasker/model/task/Task.java similarity index 97% rename from src/main/java/seedu/savvytasker/model/person/Task.java rename to src/main/java/seedu/savvytasker/model/task/Task.java index 444057e377de..2d1ca88fcd0b 100644 --- a/src/main/java/seedu/savvytasker/model/person/Task.java +++ b/src/main/java/seedu/savvytasker/model/task/Task.java @@ -1,11 +1,9 @@ -package seedu.savvytasker.model.person; +package seedu.savvytasker.model.task; import java.util.Date; import java.util.Objects; import seedu.savvytasker.logic.commands.models.ModifyCommandModel; -import seedu.savvytasker.model.task.PriorityLevel; -import seedu.savvytasker.model.task.RecurrenceType; /** * Represents a Task in the task list. diff --git a/src/main/java/seedu/savvytasker/model/person/TaskList.java b/src/main/java/seedu/savvytasker/model/task/TaskList.java similarity index 94% rename from src/main/java/seedu/savvytasker/model/person/TaskList.java rename to src/main/java/seedu/savvytasker/model/task/TaskList.java index 3ec686a3200e..2676e21c8539 100644 --- a/src/main/java/seedu/savvytasker/model/person/TaskList.java +++ b/src/main/java/seedu/savvytasker/model/task/TaskList.java @@ -1,19 +1,17 @@ -package seedu.savvytasker.model.person; +package seedu.savvytasker.model.task; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import seedu.savvytasker.commons.exceptions.DuplicateDataException; -import seedu.savvytasker.commons.util.CollectionUtil; import java.util.*; /** - * A list of persons that enforces uniqueness between its elements and does not allow nulls. + * A list of tasks that enforces uniqueness between its elements and does not allow nulls. * * Supports a minimal set of list operations. * - * @see Person#equals(Object) - * @see CollectionUtil#elementsAreUnique(Collection) + * @see Task#equals(Object) */ public class TaskList implements Iterable { @@ -82,6 +80,7 @@ public int getNextId() { * Returns true if the list contains an equivalent task as the given argument. */ public boolean contains(ReadOnlyTask toCheck) { + assert toCheck != null; return internalList.contains(toCheck); } diff --git a/src/main/java/seedu/savvytasker/storage/AddressBookStorage.java b/src/main/java/seedu/savvytasker/storage/AddressBookStorage.java deleted file mode 100644 index c88249e480ff..000000000000 --- a/src/main/java/seedu/savvytasker/storage/AddressBookStorage.java +++ /dev/null @@ -1,44 +0,0 @@ -package seedu.savvytasker.storage; - -import java.io.IOException; -import java.util.Optional; - -import seedu.savvytasker.commons.exceptions.DataConversionException; -import seedu.savvytasker.model.ReadOnlyAddressBook; - -/** - * Represents a storage for {@link seedu.savvytasker.model.AddressBook}. - */ -public interface AddressBookStorage { - - /** - * Returns the file path of the data file. - */ - String getAddressBookFilePath(); - - /** - * Returns AddressBook data as a {@link ReadOnlyAddressBook}. - * Returns {@code Optional.empty()} if storage file is not found. - * @throws DataConversionException if the data in storage is not in the expected format. - * @throws IOException if there was any problem when reading from the storage. - */ - Optional readAddressBook() throws DataConversionException, IOException; - - /** - * @see #getAddressBookFilePath() - */ - Optional readAddressBook(String filePath) throws DataConversionException, IOException; - - /** - * Saves the given {@link ReadOnlyAddressBook} to the storage. - * @param addressBook cannot be null. - * @throws IOException if there was any problem writing to the file. - */ - void saveAddressBook(ReadOnlyAddressBook addressBook) throws IOException; - - /** - * @see #saveAddressBook(ReadOnlyAddressBook) - */ - void saveAddressBook(ReadOnlyAddressBook addressBook, String filePath) throws IOException; - -} diff --git a/src/main/java/seedu/savvytasker/storage/SavvyTaskerStorage.java b/src/main/java/seedu/savvytasker/storage/SavvyTaskerStorage.java index c4dfe119738a..2346201925f4 100644 --- a/src/main/java/seedu/savvytasker/storage/SavvyTaskerStorage.java +++ b/src/main/java/seedu/savvytasker/storage/SavvyTaskerStorage.java @@ -4,7 +4,6 @@ import java.util.Optional; import seedu.savvytasker.commons.exceptions.DataConversionException; -import seedu.savvytasker.model.ReadOnlyAddressBook; import seedu.savvytasker.model.ReadOnlySavvyTasker; /** diff --git a/src/main/java/seedu/savvytasker/storage/XmlAdaptedPerson.java b/src/main/java/seedu/savvytasker/storage/XmlAdaptedPerson.java deleted file mode 100644 index 1e1b0f535b9d..000000000000 --- a/src/main/java/seedu/savvytasker/storage/XmlAdaptedPerson.java +++ /dev/null @@ -1,69 +0,0 @@ -package seedu.savvytasker.storage; - -import javax.xml.bind.annotation.XmlElement; - -import seedu.savvytasker.commons.exceptions.IllegalValueException; -import seedu.savvytasker.model.person.*; -import seedu.savvytasker.model.tag.Tag; -import seedu.savvytasker.model.tag.UniqueTagList; - -import java.util.ArrayList; -import java.util.List; - -/** - * JAXB-friendly version of the Person. - */ -public class XmlAdaptedPerson { - - @XmlElement(required = true) - private String name; - @XmlElement(required = true) - private String phone; - @XmlElement(required = true) - private String email; - @XmlElement(required = true) - private String address; - - @XmlElement - private List tagged = new ArrayList<>(); - - /** - * No-arg constructor for JAXB use. - */ - public XmlAdaptedPerson() {} - - - /** - * Converts a given Person into this class for JAXB use. - * - * @param source future changes to this will not affect the created XmlAdaptedPerson - */ - public XmlAdaptedPerson(ReadOnlyPerson source) { - name = source.getName().fullName; - phone = source.getPhone().value; - email = source.getEmail().value; - address = source.getAddress().value; - tagged = new ArrayList<>(); - for (Tag tag : source.getTags()) { - tagged.add(new XmlAdaptedTag(tag)); - } - } - - /** - * Converts this jaxb-friendly adapted person object into the model's Person object. - * - * @throws IllegalValueException if there were any data constraints violated in the adapted person - */ - public Person toModelType() throws IllegalValueException { - final List personTags = new ArrayList<>(); - for (XmlAdaptedTag tag : tagged) { - personTags.add(tag.toModelType()); - } - final Name name = new Name(this.name); - final Phone phone = new Phone(this.phone); - final Email email = new Email(this.email); - final Address address = new Address(this.address); - final UniqueTagList tags = new UniqueTagList(personTags); - return new Person(name, phone, email, address, tags); - } -} diff --git a/src/main/java/seedu/savvytasker/storage/XmlAdaptedTag.java b/src/main/java/seedu/savvytasker/storage/XmlAdaptedTag.java deleted file mode 100644 index be4a7ba24565..000000000000 --- a/src/main/java/seedu/savvytasker/storage/XmlAdaptedTag.java +++ /dev/null @@ -1,40 +0,0 @@ -package seedu.savvytasker.storage; - -import javax.xml.bind.annotation.XmlValue; - -import seedu.savvytasker.commons.exceptions.IllegalValueException; -import seedu.savvytasker.commons.util.CollectionUtil; -import seedu.savvytasker.model.tag.Tag; - -/** - * JAXB-friendly adapted version of the Tag. - */ -public class XmlAdaptedTag { - - @XmlValue - public String tagName; - - /** - * No-arg constructor for JAXB use. - */ - public XmlAdaptedTag() {} - - /** - * Converts a given Tag into this class for JAXB use. - * - * @param source future changes to this will not affect the created - */ - public XmlAdaptedTag(Tag source) { - tagName = source.tagName; - } - - /** - * Converts this jaxb-friendly adapted tag object into the model's Tag object. - * - * @throws IllegalValueException if there were any data constraints violated in the adapted person - */ - public Tag toModelType() throws IllegalValueException { - return new Tag(tagName); - } - -} diff --git a/src/main/java/seedu/savvytasker/storage/XmlAdaptedTask.java b/src/main/java/seedu/savvytasker/storage/XmlAdaptedTask.java index a853b13d3cc8..c174b6679e2e 100644 --- a/src/main/java/seedu/savvytasker/storage/XmlAdaptedTask.java +++ b/src/main/java/seedu/savvytasker/storage/XmlAdaptedTask.java @@ -5,9 +5,10 @@ import javax.xml.bind.annotation.XmlElement; import seedu.savvytasker.commons.exceptions.IllegalValueException; -import seedu.savvytasker.model.person.*; import seedu.savvytasker.model.task.PriorityLevel; +import seedu.savvytasker.model.task.ReadOnlyTask; import seedu.savvytasker.model.task.RecurrenceType; +import seedu.savvytasker.model.task.Task; /** * JAXB-friendly version of the Task. diff --git a/src/main/java/seedu/savvytasker/storage/XmlSerializableSavvyTasker.java b/src/main/java/seedu/savvytasker/storage/XmlSerializableSavvyTasker.java index 758883d24544..60af43918762 100644 --- a/src/main/java/seedu/savvytasker/storage/XmlSerializableSavvyTasker.java +++ b/src/main/java/seedu/savvytasker/storage/XmlSerializableSavvyTasker.java @@ -5,8 +5,8 @@ import seedu.savvytasker.commons.exceptions.IllegalValueException; import seedu.savvytasker.model.ReadOnlySavvyTasker; -import seedu.savvytasker.model.person.ReadOnlyTask; -import seedu.savvytasker.model.person.TaskList; +import seedu.savvytasker.model.task.ReadOnlyTask; +import seedu.savvytasker.model.task.TaskList; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/seedu/savvytasker/ui/BrowserPanel.java b/src/main/java/seedu/savvytasker/ui/BrowserPanel.java index 61d4002ee809..97c49d2ecd7f 100644 --- a/src/main/java/seedu/savvytasker/ui/BrowserPanel.java +++ b/src/main/java/seedu/savvytasker/ui/BrowserPanel.java @@ -6,7 +6,7 @@ import javafx.scene.web.WebView; import seedu.savvytasker.commons.core.LogsCenter; import seedu.savvytasker.commons.util.FxViewUtil; -import seedu.savvytasker.model.person.ReadOnlyTask; +import seedu.savvytasker.model.task.ReadOnlyTask; import java.util.logging.Logger; diff --git a/src/main/java/seedu/savvytasker/ui/MainWindow.java b/src/main/java/seedu/savvytasker/ui/MainWindow.java index d2cb976d729e..426f6a7e0bf5 100644 --- a/src/main/java/seedu/savvytasker/ui/MainWindow.java +++ b/src/main/java/seedu/savvytasker/ui/MainWindow.java @@ -13,7 +13,7 @@ import seedu.savvytasker.commons.events.ui.ExitAppRequestEvent; import seedu.savvytasker.logic.Logic; import seedu.savvytasker.model.UserPrefs; -import seedu.savvytasker.model.person.ReadOnlyTask; +import seedu.savvytasker.model.task.ReadOnlyTask; /** * The Main Window. Provides the basic application layout containing diff --git a/src/main/java/seedu/savvytasker/ui/StatusBarFooter.java b/src/main/java/seedu/savvytasker/ui/StatusBarFooter.java index 82e78af5844d..d61565efed33 100644 --- a/src/main/java/seedu/savvytasker/ui/StatusBarFooter.java +++ b/src/main/java/seedu/savvytasker/ui/StatusBarFooter.java @@ -7,7 +7,7 @@ import javafx.scene.layout.GridPane; import javafx.stage.Stage; import seedu.savvytasker.commons.core.LogsCenter; -import seedu.savvytasker.commons.events.model.AddressBookChangedEvent; +import seedu.savvytasker.commons.events.model.SavvyTaskerChangedEvent; import seedu.savvytasker.commons.util.FxViewUtil; import org.controlsfx.control.StatusBar; @@ -91,9 +91,9 @@ public String getFxmlPath() { } @Subscribe - public void handleAddressBookChangedEvent(AddressBookChangedEvent abce) { + public void handleAddressBookChangedEvent(SavvyTaskerChangedEvent stce) { String lastUpdated = (new Date()).toString(); - logger.info(LogsCenter.getEventHandlingLogMessage(abce, "Setting last updated status to " + lastUpdated)); + logger.info(LogsCenter.getEventHandlingLogMessage(stce, "Setting last updated status to " + lastUpdated)); setSyncStatus("Last Updated: " + lastUpdated); } } diff --git a/src/main/java/seedu/savvytasker/ui/TaskCard.java b/src/main/java/seedu/savvytasker/ui/TaskCard.java index 181b6f5882d1..b3cc0f963fce 100644 --- a/src/main/java/seedu/savvytasker/ui/TaskCard.java +++ b/src/main/java/seedu/savvytasker/ui/TaskCard.java @@ -6,7 +6,7 @@ import javafx.scene.Node; import javafx.scene.control.Label; import javafx.scene.layout.HBox; -import seedu.savvytasker.model.person.ReadOnlyTask; +import seedu.savvytasker.model.task.ReadOnlyTask; public class TaskCard extends UiPart{ diff --git a/src/main/java/seedu/savvytasker/ui/TaskListPanel.java b/src/main/java/seedu/savvytasker/ui/TaskListPanel.java index ab563ccfbbf1..9556633a395d 100644 --- a/src/main/java/seedu/savvytasker/ui/TaskListPanel.java +++ b/src/main/java/seedu/savvytasker/ui/TaskListPanel.java @@ -12,7 +12,7 @@ import javafx.stage.Stage; import seedu.savvytasker.commons.core.LogsCenter; import seedu.savvytasker.commons.events.ui.TaskPanelSelectionChangedEvent; -import seedu.savvytasker.model.person.ReadOnlyTask; +import seedu.savvytasker.model.task.ReadOnlyTask; import java.util.logging.Logger; diff --git a/src/test/java/guitests/AddCommandTest.java b/src/test/java/guitests/AddCommandTest.java index 0bfa5b38948a..d845d6939c8d 100644 --- a/src/test/java/guitests/AddCommandTest.java +++ b/src/test/java/guitests/AddCommandTest.java @@ -5,13 +5,12 @@ import org.junit.Test; import seedu.savvytasker.commons.core.Messages; -import seedu.savvytasker.logic.commands.AddCommand; import seedu.savvytasker.testutil.TestTask; import seedu.savvytasker.testutil.TestUtil; import static org.junit.Assert.assertTrue; -public class AddCommandTest extends AddressBookGuiTest { +public class AddCommandTest extends SavvyTaskerGuiTest { @Test public void add() { diff --git a/src/test/java/guitests/ClearCommandTest.java b/src/test/java/guitests/ClearCommandTest.java index c050385dfd98..b34b5c5c0c79 100644 --- a/src/test/java/guitests/ClearCommandTest.java +++ b/src/test/java/guitests/ClearCommandTest.java @@ -4,7 +4,7 @@ import static org.junit.Assert.assertTrue; -public class ClearCommandTest extends AddressBookGuiTest { +public class ClearCommandTest extends SavvyTaskerGuiTest { @Test public void clear() { diff --git a/src/test/java/guitests/CommandBoxTest.java b/src/test/java/guitests/CommandBoxTest.java index 1a6e83c3e562..dbd8b655d036 100644 --- a/src/test/java/guitests/CommandBoxTest.java +++ b/src/test/java/guitests/CommandBoxTest.java @@ -4,7 +4,7 @@ import static org.junit.Assert.assertEquals; -public class CommandBoxTest extends AddressBookGuiTest { +public class CommandBoxTest extends SavvyTaskerGuiTest { @Test public void commandBox_commandSucceeds_textCleared() { diff --git a/src/test/java/guitests/DeleteCommandTest.java b/src/test/java/guitests/DeleteCommandTest.java index 71b4906d2f91..8a1d371f2841 100644 --- a/src/test/java/guitests/DeleteCommandTest.java +++ b/src/test/java/guitests/DeleteCommandTest.java @@ -2,14 +2,13 @@ import org.junit.Test; -import seedu.savvytasker.testutil.TestPerson; import seedu.savvytasker.testutil.TestTask; import seedu.savvytasker.testutil.TestUtil; import static org.junit.Assert.assertTrue; import static seedu.savvytasker.logic.commands.DeleteCommand.MESSAGE_DELETE_TASK_SUCCESS; -public class DeleteCommandTest extends AddressBookGuiTest { +public class DeleteCommandTest extends SavvyTaskerGuiTest { @Test public void delete() { diff --git a/src/test/java/guitests/FindCommandTest.java b/src/test/java/guitests/FindCommandTest.java index da744ae83173..57f8aae9ce6c 100644 --- a/src/test/java/guitests/FindCommandTest.java +++ b/src/test/java/guitests/FindCommandTest.java @@ -3,12 +3,11 @@ import org.junit.Test; import seedu.savvytasker.commons.core.Messages; -import seedu.savvytasker.testutil.TestPerson; import seedu.savvytasker.testutil.TestTask; import static org.junit.Assert.assertTrue; -public class FindCommandTest extends AddressBookGuiTest { +public class FindCommandTest extends SavvyTaskerGuiTest { @Test public void find_nonEmptyList() { diff --git a/src/test/java/guitests/HelpWindowTest.java b/src/test/java/guitests/HelpWindowTest.java index 436c485f1efe..988156dd3dec 100644 --- a/src/test/java/guitests/HelpWindowTest.java +++ b/src/test/java/guitests/HelpWindowTest.java @@ -5,7 +5,7 @@ import static org.junit.Assert.assertTrue; -public class HelpWindowTest extends AddressBookGuiTest { +public class HelpWindowTest extends SavvyTaskerGuiTest { @Test public void openHelpWindow() { diff --git a/src/test/java/guitests/ListCommandTest.java b/src/test/java/guitests/ListCommandTest.java index 23d159d059c8..1dc3be5934e0 100644 --- a/src/test/java/guitests/ListCommandTest.java +++ b/src/test/java/guitests/ListCommandTest.java @@ -3,12 +3,11 @@ import org.junit.Test; import seedu.savvytasker.commons.core.Messages; -import seedu.savvytasker.testutil.TestPerson; import seedu.savvytasker.testutil.TestTask; import static org.junit.Assert.assertTrue; -public class ListCommandTest extends AddressBookGuiTest { +public class ListCommandTest extends SavvyTaskerGuiTest { @Test public void list_nonEmptyList() { diff --git a/src/test/java/guitests/AddressBookGuiTest.java b/src/test/java/guitests/SavvyTaskerGuiTest.java similarity index 95% rename from src/test/java/guitests/AddressBookGuiTest.java rename to src/test/java/guitests/SavvyTaskerGuiTest.java index 3cec1060d631..3db0a8a67871 100644 --- a/src/test/java/guitests/AddressBookGuiTest.java +++ b/src/test/java/guitests/SavvyTaskerGuiTest.java @@ -12,8 +12,7 @@ import seedu.savvytasker.TestApp; import seedu.savvytasker.commons.core.EventsCenter; import seedu.savvytasker.model.SavvyTasker; -import seedu.savvytasker.model.person.ReadOnlyPerson; -import seedu.savvytasker.model.person.ReadOnlyTask; +import seedu.savvytasker.model.task.ReadOnlyTask; import seedu.savvytasker.testutil.TestUtil; import seedu.savvytasker.testutil.TypicalTestTasks; @@ -25,7 +24,7 @@ /** * A GUI Test class for AddressBook. */ -public abstract class AddressBookGuiTest { +public abstract class SavvyTaskerGuiTest { /* The TestName Rule makes the current test name available inside test methods */ @Rule diff --git a/src/test/java/guitests/SelectCommandTest.java b/src/test/java/guitests/SelectCommandTest.java index 28f68b2d897b..04a823f9147f 100644 --- a/src/test/java/guitests/SelectCommandTest.java +++ b/src/test/java/guitests/SelectCommandTest.java @@ -1,13 +1,6 @@ package guitests; -import org.junit.Test; - -import seedu.savvytasker.model.person.ReadOnlyPerson; -import seedu.savvytasker.model.person.ReadOnlyTask; - -import static org.junit.Assert.assertEquals; - -public class SelectCommandTest extends AddressBookGuiTest { +public class SelectCommandTest extends SavvyTaskerGuiTest { /** Not running the select test for now, not implemented @@ -34,7 +27,7 @@ public void selectPerson_emptyList(){ commandBox.runCommand("clear"); assertListSize(0); assertSelectionInvalid(1); //invalid index - }*/ + } private void assertSelectionInvalid(int index) { commandBox.runCommand("select " + index); @@ -56,6 +49,6 @@ private void assertPersonSelected(int index) { private void assertNoPersonSelected() { assertEquals(taskListPanel.getSelectedTasks().size(), 0); - } + }*/ } diff --git a/src/test/java/guitests/guihandles/MainGuiHandle.java b/src/test/java/guitests/guihandles/MainGuiHandle.java index 5266a7101816..198d6376e724 100644 --- a/src/test/java/guitests/guihandles/MainGuiHandle.java +++ b/src/test/java/guitests/guihandles/MainGuiHandle.java @@ -12,10 +12,6 @@ public class MainGuiHandle extends GuiHandle { public MainGuiHandle(GuiRobot guiRobot, Stage primaryStage) { super(guiRobot, primaryStage, TestApp.APP_TITLE); } - - public PersonListPanelHandle getPersonListPanel() { - return new PersonListPanelHandle(guiRobot, primaryStage); - } public TaskListPanelHandle getTaskListPanel() { return new TaskListPanelHandle(guiRobot, primaryStage); diff --git a/src/test/java/guitests/guihandles/PersonCardHandle.java b/src/test/java/guitests/guihandles/PersonCardHandle.java deleted file mode 100644 index 795942eaaf73..000000000000 --- a/src/test/java/guitests/guihandles/PersonCardHandle.java +++ /dev/null @@ -1,63 +0,0 @@ -package guitests.guihandles; - -import guitests.GuiRobot; -import javafx.scene.Node; -import javafx.stage.Stage; -import seedu.savvytasker.model.person.ReadOnlyPerson; - -/** - * Provides a handle to a person card in the person list panel. - */ -public class PersonCardHandle extends GuiHandle { - private static final String NAME_FIELD_ID = "#name"; - private static final String ADDRESS_FIELD_ID = "#address"; - private static final String PHONE_FIELD_ID = "#phone"; - private static final String EMAIL_FIELD_ID = "#email"; - - private Node node; - - public PersonCardHandle(GuiRobot guiRobot, Stage primaryStage, Node node){ - super(guiRobot, primaryStage, null); - this.node = node; - } - - protected String getTextFromLabel(String fieldId) { - return getTextFromLabel(fieldId, node); - } - - public String getFullName() { - return getTextFromLabel(NAME_FIELD_ID); - } - - public String getAddress() { - return getTextFromLabel(ADDRESS_FIELD_ID); - } - - public String getPhone() { - return getTextFromLabel(PHONE_FIELD_ID); - } - - public String getEmail() { - return getTextFromLabel(EMAIL_FIELD_ID); - } - - public boolean isSamePerson(ReadOnlyPerson person){ - return getFullName().equals(person.getName().fullName) && getPhone().equals(person.getPhone().value) - && getEmail().equals(person.getEmail().value) && getAddress().equals(person.getAddress().value); - } - - @Override - public boolean equals(Object obj) { - if(obj instanceof PersonCardHandle) { - PersonCardHandle handle = (PersonCardHandle) obj; - return getFullName().equals(handle.getFullName()) - && getAddress().equals(handle.getAddress()); //TODO: compare the rest - } - return super.equals(obj); - } - - @Override - public String toString() { - return getFullName() + " " + getAddress(); - } -} diff --git a/src/test/java/guitests/guihandles/PersonListPanelHandle.java b/src/test/java/guitests/guihandles/PersonListPanelHandle.java deleted file mode 100644 index 239e290db5e7..000000000000 --- a/src/test/java/guitests/guihandles/PersonListPanelHandle.java +++ /dev/null @@ -1,172 +0,0 @@ -package guitests.guihandles; - - -import guitests.GuiRobot; -import javafx.geometry.Point2D; -import javafx.scene.Node; -import javafx.scene.control.ListView; -import javafx.stage.Stage; -import seedu.savvytasker.TestApp; -import seedu.savvytasker.model.person.Person; -import seedu.savvytasker.model.person.ReadOnlyPerson; -import seedu.savvytasker.testutil.TestUtil; - -import java.util.List; -import java.util.Optional; -import java.util.Set; - -import static org.junit.Assert.assertTrue; - -/** - * Provides a handle for the panel containing the person list. - */ -public class PersonListPanelHandle extends GuiHandle { - - public static final int NOT_FOUND = -1; - public static final String CARD_PANE_ID = "#cardPane"; - - private static final String PERSON_LIST_VIEW_ID = "#personListView"; - - public PersonListPanelHandle(GuiRobot guiRobot, Stage primaryStage) { - super(guiRobot, primaryStage, TestApp.APP_TITLE); - } - - public List getSelectedPersons() { - ListView personList = getListView(); - return personList.getSelectionModel().getSelectedItems(); - } - - public ListView getListView() { - return (ListView) getNode(PERSON_LIST_VIEW_ID); - } - - /** - * Returns true if the list is showing the person details correctly and in correct order. - * @param persons A list of person in the correct order. - */ - public boolean isListMatching(ReadOnlyPerson... persons) { - return this.isListMatching(0, persons); - } - - /** - * Clicks on the ListView. - */ - public void clickOnListView() { - Point2D point= TestUtil.getScreenMidPoint(getListView()); - guiRobot.clickOn(point.getX(), point.getY()); - } - - /** - * Returns true if the {@code persons} appear as the sub list (in that order) at position {@code startPosition}. - */ - public boolean containsInOrder(int startPosition, ReadOnlyPerson... persons) { - List personsInList = getListView().getItems(); - - // Return false if the list in panel is too short to contain the given list - if (startPosition + persons.length > personsInList.size()){ - return false; - } - - // Return false if any of the persons doesn't match - for (int i = 0; i < persons.length; i++) { - if (!personsInList.get(startPosition + i).getName().fullName.equals(persons[i].getName().fullName)){ - return false; - } - } - - return true; - } - - /** - * Returns true if the list is showing the person details correctly and in correct order. - * @param startPosition The starting position of the sub list. - * @param persons A list of person in the correct order. - */ - public boolean isListMatching(int startPosition, ReadOnlyPerson... persons) throws IllegalArgumentException { - if (persons.length + startPosition != getListView().getItems().size()) { - throw new IllegalArgumentException("List size mismatched\n" + - "Expected " + (getListView().getItems().size() - 1) + " persons"); - } - assertTrue(this.containsInOrder(startPosition, persons)); - for (int i = 0; i < persons.length; i++) { - final int scrollTo = i + startPosition; - guiRobot.interact(() -> getListView().scrollTo(scrollTo)); - guiRobot.sleep(200); - if (!TestUtil.compareCardAndPerson(getPersonCardHandle(startPosition + i), persons[i])) { - return false; - } - } - return true; - } - - - public PersonCardHandle navigateToPerson(String name) { - guiRobot.sleep(500); //Allow a bit of time for the list to be updated - final Optional person = getListView().getItems().stream().filter(p -> p.getName().fullName.equals(name)).findAny(); - if (!person.isPresent()) { - throw new IllegalStateException("Name not found: " + name); - } - - return navigateToPerson(person.get()); - } - - /** - * Navigates the listview to display and select the person. - */ - public PersonCardHandle navigateToPerson(ReadOnlyPerson person) { - int index = getPersonIndex(person); - - guiRobot.interact(() -> { - getListView().scrollTo(index); - guiRobot.sleep(150); - getListView().getSelectionModel().select(index); - }); - guiRobot.sleep(100); - return getPersonCardHandle(person); - } - - - /** - * Returns the position of the person given, {@code NOT_FOUND} if not found in the list. - */ - public int getPersonIndex(ReadOnlyPerson targetPerson) { - List personsInList = getListView().getItems(); - for (int i = 0; i < personsInList.size(); i++) { - if(personsInList.get(i).getName().equals(targetPerson.getName())){ - return i; - } - } - return NOT_FOUND; - } - - /** - * Gets a person from the list by index - */ - public ReadOnlyPerson getPerson(int index) { - return getListView().getItems().get(index); - } - - public PersonCardHandle getPersonCardHandle(int index) { - return getPersonCardHandle(new Person(getListView().getItems().get(index))); - } - - public PersonCardHandle getPersonCardHandle(ReadOnlyPerson person) { - Set nodes = getAllCardNodes(); - Optional personCardNode = nodes.stream() - .filter(n -> new PersonCardHandle(guiRobot, primaryStage, n).isSamePerson(person)) - .findFirst(); - if (personCardNode.isPresent()) { - return new PersonCardHandle(guiRobot, primaryStage, personCardNode.get()); - } else { - return null; - } - } - - protected Set getAllCardNodes() { - return guiRobot.lookup(CARD_PANE_ID).queryAll(); - } - - public int getNumberOfPeople() { - return getListView().getItems().size(); - } -} diff --git a/src/test/java/guitests/guihandles/TaskCardHandle.java b/src/test/java/guitests/guihandles/TaskCardHandle.java index 5986aa3f423d..0eb1d2b9114b 100644 --- a/src/test/java/guitests/guihandles/TaskCardHandle.java +++ b/src/test/java/guitests/guihandles/TaskCardHandle.java @@ -3,7 +3,7 @@ import guitests.GuiRobot; import javafx.scene.Node; import javafx.stage.Stage; -import seedu.savvytasker.model.person.ReadOnlyTask; +import seedu.savvytasker.model.task.ReadOnlyTask; /** * Provides a handle to a person card in the person list panel. diff --git a/src/test/java/guitests/guihandles/TaskListPanelHandle.java b/src/test/java/guitests/guihandles/TaskListPanelHandle.java index ff5a68322000..787b7715a43e 100644 --- a/src/test/java/guitests/guihandles/TaskListPanelHandle.java +++ b/src/test/java/guitests/guihandles/TaskListPanelHandle.java @@ -7,8 +7,8 @@ import javafx.scene.control.ListView; import javafx.stage.Stage; import seedu.savvytasker.TestApp; -import seedu.savvytasker.model.person.ReadOnlyTask; -import seedu.savvytasker.model.person.Task; +import seedu.savvytasker.model.task.ReadOnlyTask; +import seedu.savvytasker.model.task.Task; import seedu.savvytasker.testutil.TestUtil; import java.util.List; @@ -36,7 +36,9 @@ public List getSelectedTasks() { return taskList.getSelectionModel().getSelectedItems(); } + @SuppressWarnings("unchecked") public ListView getListView() { + // Should be a listview of readonlytask only. return (ListView) getNode(TASK_LIST_VIEW_ID); } diff --git a/src/test/java/seedu/savvytasker/commons/util/ConfigUtilTest.java b/src/test/java/seedu/savvytasker/commons/util/ConfigUtilTest.java index d62176304361..f3fa7414459e 100644 --- a/src/test/java/seedu/savvytasker/commons/util/ConfigUtilTest.java +++ b/src/test/java/seedu/savvytasker/commons/util/ConfigUtilTest.java @@ -86,7 +86,8 @@ private Config getTypicalConfig() { private Optional read(String configFileInTestDataFolder) throws DataConversionException { String configFilePath = addToTestDataPathIfNotNull(configFileInTestDataFolder); - return new ConfigUtil().readConfig(configFilePath); + new ConfigUtil(); + return ConfigUtil.readConfig(configFilePath); } @Test @@ -106,24 +107,25 @@ public void saveConfig_allInOrder_success() throws DataConversionException, IOEx Config original = getTypicalConfig(); String configFilePath = testFolder.getRoot() + File.separator + "TempConfig.json"; - ConfigUtil configStorage = new ConfigUtil(); + new ConfigUtil(); //Try writing when the file doesn't exist - configStorage.saveConfig(original, configFilePath); - Config readBack = configStorage.readConfig(configFilePath).get(); + ConfigUtil.saveConfig(original, configFilePath); + Config readBack = ConfigUtil.readConfig(configFilePath).get(); assertEquals(original, readBack); //Try saving when the file exists original.setAppTitle("Updated Title"); original.setLogLevel(Level.FINE); - configStorage.saveConfig(original, configFilePath); - readBack = configStorage.readConfig(configFilePath).get(); + ConfigUtil.saveConfig(original, configFilePath); + readBack = ConfigUtil.readConfig(configFilePath).get(); assertEquals(original, readBack); } private void save(Config config, String configFileInTestDataFolder) throws IOException { String configFilePath = addToTestDataPathIfNotNull(configFileInTestDataFolder); - new ConfigUtil().saveConfig(config, configFilePath); + new ConfigUtil(); + ConfigUtil.saveConfig(config, configFilePath); } private String addToTestDataPathIfNotNull(String configFileInTestDataFolder) { diff --git a/src/test/java/seedu/savvytasker/commons/util/XmlUtilTest.java b/src/test/java/seedu/savvytasker/commons/util/XmlUtilTest.java index 8b3dba7cfdae..515df40c1155 100644 --- a/src/test/java/seedu/savvytasker/commons/util/XmlUtilTest.java +++ b/src/test/java/seedu/savvytasker/commons/util/XmlUtilTest.java @@ -6,7 +6,6 @@ import seedu.savvytasker.commons.util.FileUtil; import seedu.savvytasker.commons.util.XmlUtil; -import seedu.savvytasker.model.AddressBook; import seedu.savvytasker.model.SavvyTasker; import seedu.savvytasker.storage.XmlSerializableSavvyTasker; import seedu.savvytasker.testutil.SavvyTaskerBuilder; @@ -32,7 +31,7 @@ public class XmlUtilTest { @Test public void getDataFromFile_nullFile_AssertionError() throws Exception { thrown.expect(AssertionError.class); - XmlUtil.getDataFromFile(null, AddressBook.class); + XmlUtil.getDataFromFile(null, SavvyTasker.class); } @Test @@ -44,13 +43,13 @@ public void getDataFromFile_nullClass_AssertionError() throws Exception { @Test public void getDataFromFile_missingFile_FileNotFoundException() throws Exception { thrown.expect(FileNotFoundException.class); - XmlUtil.getDataFromFile(MISSING_FILE, AddressBook.class); + XmlUtil.getDataFromFile(MISSING_FILE, SavvyTasker.class); } @Test public void getDataFromFile_emptyFile_DataFormatMismatchException() throws Exception { thrown.expect(JAXBException.class); - XmlUtil.getDataFromFile(EMPTY_FILE, AddressBook.class); + XmlUtil.getDataFromFile(EMPTY_FILE, SavvyTasker.class); } @Test @@ -62,7 +61,7 @@ public void getDataFromFile_validFile_validResult() throws Exception { @Test public void saveDataToFile_nullFile_AssertionError() throws Exception { thrown.expect(AssertionError.class); - XmlUtil.saveDataToFile(null, new AddressBook()); + XmlUtil.saveDataToFile(null, new SavvyTasker()); } @Test @@ -74,7 +73,7 @@ public void saveDataToFile_nullClass_AssertionError() throws Exception { @Test public void saveDataToFile_missingFile_FileNotFoundException() throws Exception { thrown.expect(FileNotFoundException.class); - XmlUtil.saveDataToFile(MISSING_FILE, new AddressBook()); + XmlUtil.saveDataToFile(MISSING_FILE, new SavvyTasker()); } @Test diff --git a/src/test/java/seedu/savvytasker/logic/LogicManagerTest.java b/src/test/java/seedu/savvytasker/logic/LogicManagerTest.java index 876ade6fd0c3..868ec8334264 100644 --- a/src/test/java/seedu/savvytasker/logic/LogicManagerTest.java +++ b/src/test/java/seedu/savvytasker/logic/LogicManagerTest.java @@ -12,10 +12,10 @@ import seedu.savvytasker.logic.commands.*; import seedu.savvytasker.model.Model; import seedu.savvytasker.model.ModelManager; -import seedu.savvytasker.model.ReadOnlyAddressBook; import seedu.savvytasker.model.ReadOnlySavvyTasker; import seedu.savvytasker.model.SavvyTasker; -import seedu.savvytasker.model.person.*; +import seedu.savvytasker.model.task.ReadOnlyTask; +import seedu.savvytasker.model.task.Task; import seedu.savvytasker.storage.StorageManager; import org.junit.After; diff --git a/src/test/java/seedu/savvytasker/storage/XmlAddressBookStorageTest.java b/src/test/java/seedu/savvytasker/storage/XmlAddressBookStorageTest.java index fd45d942fa1f..11fb099cfba1 100644 --- a/src/test/java/seedu/savvytasker/storage/XmlAddressBookStorageTest.java +++ b/src/test/java/seedu/savvytasker/storage/XmlAddressBookStorageTest.java @@ -10,7 +10,7 @@ import seedu.savvytasker.commons.util.FileUtil; import seedu.savvytasker.model.ReadOnlySavvyTasker; import seedu.savvytasker.model.SavvyTasker; -import seedu.savvytasker.model.person.Task; +import seedu.savvytasker.model.task.Task; import seedu.savvytasker.storage.XmlSavvyTaskerStorage; import seedu.savvytasker.testutil.TypicalTestTasks; @@ -73,14 +73,14 @@ public void readAndSaveAddressBook_allInOrder_success() throws Exception { assertEquals(original, new SavvyTasker(readBack)); //Modify data, overwrite exiting file, and read back - original.addTask(new Task(TypicalTestTasks.happy)); - original.removeTask(new Task(TypicalTestTasks.happy)); + original.addTask(new Task(td.happy)); + original.removeTask(new Task(td.happy)); xmlSavvyTaskerStorage.saveSavvyTasker(original, filePath); readBack = xmlSavvyTaskerStorage.readSavvyTasker(filePath).get(); assertEquals(original, new SavvyTasker(readBack)); //Save and read without specifying file path - original.addTask(new Task(TypicalTestTasks.happy)); + original.addTask(new Task(td.happy)); xmlSavvyTaskerStorage.saveSavvyTasker(original); //file path not specified readBack = xmlSavvyTaskerStorage.readSavvyTasker().get(); //file path not specified assertEquals(original, new SavvyTasker(readBack)); diff --git a/src/test/java/seedu/savvytasker/testutil/AddressBookBuilder.java b/src/test/java/seedu/savvytasker/testutil/AddressBookBuilder.java deleted file mode 100644 index 2345c9fce0bb..000000000000 --- a/src/test/java/seedu/savvytasker/testutil/AddressBookBuilder.java +++ /dev/null @@ -1,35 +0,0 @@ -package seedu.savvytasker.testutil; - -import seedu.savvytasker.commons.exceptions.IllegalValueException; -import seedu.savvytasker.model.AddressBook; -import seedu.savvytasker.model.person.Person; -import seedu.savvytasker.model.person.UniquePersonList; -import seedu.savvytasker.model.tag.Tag; - -/** - * A utility class to help with building Addressbook objects. - * Example usage:
- * {@code AddressBook ab = new AddressBookBuilder().withPerson("John", "Doe").withTag("Friend").build();} - */ -public class AddressBookBuilder { - - private AddressBook addressBook; - - public AddressBookBuilder(AddressBook addressBook){ - this.addressBook = addressBook; - } - - public AddressBookBuilder withPerson(Person person) throws UniquePersonList.DuplicatePersonException { - addressBook.addPerson(person); - return this; - } - - public AddressBookBuilder withTag(String tagName) throws IllegalValueException { - addressBook.addTag(new Tag(tagName)); - return this; - } - - public AddressBook build(){ - return addressBook; - } -} diff --git a/src/test/java/seedu/savvytasker/testutil/PersonBuilder.java b/src/test/java/seedu/savvytasker/testutil/PersonBuilder.java deleted file mode 100644 index 580427840d3c..000000000000 --- a/src/test/java/seedu/savvytasker/testutil/PersonBuilder.java +++ /dev/null @@ -1,49 +0,0 @@ -package seedu.savvytasker.testutil; - -import seedu.savvytasker.commons.exceptions.IllegalValueException; -import seedu.savvytasker.model.person.*; -import seedu.savvytasker.model.tag.Tag; - -/** - * - */ -public class PersonBuilder { - - private TestPerson person; - - public PersonBuilder() { - this.person = new TestPerson(); - } - - public PersonBuilder withName(String name) throws IllegalValueException { - this.person.setName(new Name(name)); - return this; - } - - public PersonBuilder withTags(String ... tags) throws IllegalValueException { - for (String tag: tags) { - person.getTags().add(new Tag(tag)); - } - return this; - } - - public PersonBuilder withAddress(String address) throws IllegalValueException { - this.person.setAddress(new Address(address)); - return this; - } - - public PersonBuilder withPhone(String phone) throws IllegalValueException { - this.person.setPhone(new Phone(phone)); - return this; - } - - public PersonBuilder withEmail(String email) throws IllegalValueException { - this.person.setEmail(new Email(email)); - return this; - } - - public TestPerson build() { - return this.person; - } - -} diff --git a/src/test/java/seedu/savvytasker/testutil/SavvyTaskerBuilder.java b/src/test/java/seedu/savvytasker/testutil/SavvyTaskerBuilder.java index 153c3e1be516..d1b2337909b6 100644 --- a/src/test/java/seedu/savvytasker/testutil/SavvyTaskerBuilder.java +++ b/src/test/java/seedu/savvytasker/testutil/SavvyTaskerBuilder.java @@ -1,8 +1,8 @@ package seedu.savvytasker.testutil; import seedu.savvytasker.model.SavvyTasker; -import seedu.savvytasker.model.person.Task; -import seedu.savvytasker.model.person.TaskList.DuplicateTaskException; +import seedu.savvytasker.model.task.Task; +import seedu.savvytasker.model.task.TaskList.DuplicateTaskException; /** * A utility class to help with building SavvyTasker objects. diff --git a/src/test/java/seedu/savvytasker/testutil/TestPerson.java b/src/test/java/seedu/savvytasker/testutil/TestPerson.java deleted file mode 100644 index c67221403dd9..000000000000 --- a/src/test/java/seedu/savvytasker/testutil/TestPerson.java +++ /dev/null @@ -1,76 +0,0 @@ -package seedu.savvytasker.testutil; - -import seedu.savvytasker.model.person.*; -import seedu.savvytasker.model.tag.UniqueTagList; - -/** - * A mutable person object. For testing only. - */ -public class TestPerson implements ReadOnlyPerson { - - private Name name; - private Address address; - private Email email; - private Phone phone; - private UniqueTagList tags; - - public TestPerson() { - tags = new UniqueTagList(); - } - - public void setName(Name name) { - this.name = name; - } - - public void setAddress(Address address) { - this.address = address; - } - - public void setEmail(Email email) { - this.email = email; - } - - public void setPhone(Phone phone) { - this.phone = phone; - } - - @Override - public Name getName() { - return name; - } - - @Override - public Phone getPhone() { - return phone; - } - - @Override - public Email getEmail() { - return email; - } - - @Override - public Address getAddress() { - return address; - } - - @Override - public UniqueTagList getTags() { - return tags; - } - - @Override - public String toString() { - return getAsText(); - } - - public String getAddCommand() { - StringBuilder sb = new StringBuilder(); - sb.append("add " + this.getName().fullName + " "); - sb.append("p/" + this.getPhone().value + " "); - sb.append("e/" + this.getEmail().value + " "); - sb.append("a/" + this.getAddress().value + " "); - this.getTags().getInternalList().stream().forEach(s -> sb.append("t/" + s.tagName + " ")); - return sb.toString(); - } -} diff --git a/src/test/java/seedu/savvytasker/testutil/TestTask.java b/src/test/java/seedu/savvytasker/testutil/TestTask.java index 77995ad849b8..223e9c412af7 100644 --- a/src/test/java/seedu/savvytasker/testutil/TestTask.java +++ b/src/test/java/seedu/savvytasker/testutil/TestTask.java @@ -2,8 +2,8 @@ import java.util.Date; -import seedu.savvytasker.model.person.*; import seedu.savvytasker.model.task.PriorityLevel; +import seedu.savvytasker.model.task.ReadOnlyTask; import seedu.savvytasker.model.task.RecurrenceType; /** diff --git a/src/test/java/seedu/savvytasker/testutil/TestUtil.java b/src/test/java/seedu/savvytasker/testutil/TestUtil.java index 836a3a710feb..7f06bd27b935 100644 --- a/src/test/java/seedu/savvytasker/testutil/TestUtil.java +++ b/src/test/java/seedu/savvytasker/testutil/TestUtil.java @@ -1,7 +1,6 @@ package seedu.savvytasker.testutil; import com.google.common.io.Files; -import guitests.guihandles.PersonCardHandle; import guitests.guihandles.TaskCardHandle; import javafx.geometry.Bounds; import javafx.geometry.Point2D; @@ -15,13 +14,12 @@ import org.testfx.api.FxToolkit; import seedu.savvytasker.TestApp; -import seedu.savvytasker.commons.exceptions.IllegalValueException; import seedu.savvytasker.commons.util.FileUtil; import seedu.savvytasker.commons.util.XmlUtil; import seedu.savvytasker.model.SavvyTasker; -import seedu.savvytasker.model.person.*; -import seedu.savvytasker.model.tag.Tag; -import seedu.savvytasker.model.tag.UniqueTagList; +import seedu.savvytasker.model.task.ReadOnlyTask; +import seedu.savvytasker.model.task.Task; +import seedu.savvytasker.model.task.TaskList; import seedu.savvytasker.storage.XmlSerializableSavvyTasker; import java.io.File; @@ -62,47 +60,6 @@ public static void assertThrows(Class expected, Runnable ex */ public static String SANDBOX_FOLDER = FileUtil.getPath("./src/test/data/sandbox/"); - public static final Person[] samplePersonData = getSamplePersonData(); - - private static Person[] getSamplePersonData() { - try { - return new Person[]{ - new Person(new Name("Ali Muster"), new Phone("9482424"), new Email("hans@google.com"), new Address("4th street"), new UniqueTagList()), - new Person(new Name("Boris Mueller"), new Phone("87249245"), new Email("ruth@google.com"), new Address("81th street"), new UniqueTagList()), - new Person(new Name("Carl Kurz"), new Phone("95352563"), new Email("heinz@yahoo.com"), new Address("wall street"), new UniqueTagList()), - new Person(new Name("Daniel Meier"), new Phone("87652533"), new Email("cornelia@google.com"), new Address("10th street"), new UniqueTagList()), - new Person(new Name("Elle Meyer"), new Phone("9482224"), new Email("werner@gmail.com"), new Address("michegan ave"), new UniqueTagList()), - new Person(new Name("Fiona Kunz"), new Phone("9482427"), new Email("lydia@gmail.com"), new Address("little tokyo"), new UniqueTagList()), - new Person(new Name("George Best"), new Phone("9482442"), new Email("anna@google.com"), new Address("4th street"), new UniqueTagList()), - new Person(new Name("Hoon Meier"), new Phone("8482424"), new Email("stefan@mail.com"), new Address("little india"), new UniqueTagList()), - new Person(new Name("Ida Mueller"), new Phone("8482131"), new Email("hans@google.com"), new Address("chicago ave"), new UniqueTagList()) - }; - } catch (IllegalValueException e) { - assert false; - //not possible - return null; - } - } - - public static final Tag[] sampleTagData = getSampleTagData(); - - private static Tag[] getSampleTagData() { - try { - return new Tag[]{ - new Tag("relatives"), - new Tag("friends") - }; - } catch (IllegalValueException e) { - assert false; - return null; - //not possible - } - } - - public static List generateSamplePersonData() { - return Arrays.asList(samplePersonData); - } - public static final Task[] sampleTaskData = getSampleTaskData(); private static Task[] getSampleTaskData() { @@ -228,6 +185,7 @@ public static void tearDownRuntime() throws Exception { * * Caveat: only find method declared in the current Class, not inherited from supertypes */ + @SuppressWarnings({ "unchecked", "rawtypes" }) public static Method getPrivateMethod(Class objectClass, String methodName) throws NoSuchMethodException { Method method = objectClass.getDeclaredMethod(methodName); method.setAccessible(true); @@ -312,15 +270,15 @@ public static TestTask[] removeTaskFromList(final TestTask[] list, int targetInd } /** - * Replaces persons[i] with a person. - * @param persons The array of persons. - * @param person The replacement person - * @param index The index of the person to be replaced. + * Replaces tasks[i] with a task. + * @param tasks The array of tasks. + * @param task The replacement task + * @param index The index of the task to be replaced. * @return */ - public static TestPerson[] replacePersonFromList(TestPerson[] persons, TestPerson person, int index) { - persons[index] = person; - return persons; + public static TestTask[] replaceTaskFromList(TestTask[] tasks, TestTask task, int index) { + tasks[index] = task; + return tasks; } /** @@ -343,33 +301,8 @@ private static List asList(T[] objs) { return list; } - public static boolean compareCardAndPerson(PersonCardHandle card, ReadOnlyPerson person) { - return card.isSamePerson(person); - } - public static boolean compareCardAndTask(TaskCardHandle card, ReadOnlyTask task) { return card.isSameTask(task); } - public static Tag[] getTagList(String tags) { - - if (tags.equals("")) { - return new Tag[]{}; - } - - final String[] split = tags.split(", "); - - final List collect = Arrays.asList(split).stream().map(e -> { - try { - return new Tag(e.replaceFirst("Tag: ", "")); - } catch (IllegalValueException e1) { - //not possible - assert false; - return null; - } - }).collect(Collectors.toList()); - - return collect.toArray(new Tag[split.length]); - } - } diff --git a/src/test/java/seedu/savvytasker/testutil/TypicalTestPersons.java b/src/test/java/seedu/savvytasker/testutil/TypicalTestPersons.java deleted file mode 100644 index a8981e23a855..000000000000 --- a/src/test/java/seedu/savvytasker/testutil/TypicalTestPersons.java +++ /dev/null @@ -1,61 +0,0 @@ -package seedu.savvytasker.testutil; - -import seedu.savvytasker.commons.exceptions.IllegalValueException; -import seedu.savvytasker.model.AddressBook; -import seedu.savvytasker.model.person.*; - -/** - * - */ -public class TypicalTestPersons { - - public static TestPerson alice, benson, carl, daniel, elle, fiona, george, hoon, ida; - - public TypicalTestPersons() { - try { - alice = new PersonBuilder().withName("Alice Pauline").withAddress("123, Jurong West Ave 6, #08-111") - .withEmail("alice@gmail.com").withPhone("85355255") - .withTags("friends").build(); - benson = new PersonBuilder().withName("Benson Meier").withAddress("311, Clementi Ave 2, #02-25") - .withEmail("johnd@gmail.com").withPhone("98765432") - .withTags("owesMoney", "friends").build(); - carl = new PersonBuilder().withName("Carl Kurz").withPhone("95352563").withEmail("heinz@yahoo.com").withAddress("wall street").build(); - daniel = new PersonBuilder().withName("Daniel Meier").withPhone("87652533").withEmail("cornelia@google.com").withAddress("10th street").build(); - elle = new PersonBuilder().withName("Elle Meyer").withPhone("9482224").withEmail("werner@gmail.com").withAddress("michegan ave").build(); - fiona = new PersonBuilder().withName("Fiona Kunz").withPhone("9482427").withEmail("lydia@gmail.com").withAddress("little tokyo").build(); - george = new PersonBuilder().withName("George Best").withPhone("9482442").withEmail("anna@google.com").withAddress("4th street").build(); - - //Manually added - hoon = new PersonBuilder().withName("Hoon Meier").withPhone("8482424").withEmail("stefan@mail.com").withAddress("little india").build(); - ida = new PersonBuilder().withName("Ida Mueller").withPhone("8482131").withEmail("hans@google.com").withAddress("chicago ave").build(); - } catch (IllegalValueException e) { - e.printStackTrace(); - assert false : "not possible"; - } - } - - public static void loadAddressBookWithSampleData(AddressBook ab) { - - try { - ab.addPerson(new Person(alice)); - ab.addPerson(new Person(benson)); - ab.addPerson(new Person(carl)); - ab.addPerson(new Person(daniel)); - ab.addPerson(new Person(elle)); - ab.addPerson(new Person(fiona)); - ab.addPerson(new Person(george)); - } catch (UniquePersonList.DuplicatePersonException e) { - assert false : "not possible"; - } - } - - public TestPerson[] getTypicalPersons() { - return new TestPerson[]{alice, benson, carl, daniel, elle, fiona, george}; - } - - public AddressBook getTypicalAddressBook(){ - AddressBook ab = new AddressBook(); - loadAddressBookWithSampleData(ab); - return ab; - } -} diff --git a/src/test/java/seedu/savvytasker/testutil/TypicalTestTasks.java b/src/test/java/seedu/savvytasker/testutil/TypicalTestTasks.java index 33291b0f2eae..30d9ccb22167 100644 --- a/src/test/java/seedu/savvytasker/testutil/TypicalTestTasks.java +++ b/src/test/java/seedu/savvytasker/testutil/TypicalTestTasks.java @@ -5,18 +5,18 @@ import seedu.savvytasker.commons.exceptions.IllegalValueException; import seedu.savvytasker.model.SavvyTasker; -import seedu.savvytasker.model.person.*; -import seedu.savvytasker.model.person.TaskList.DuplicateTaskException; import seedu.savvytasker.model.task.PriorityLevel; +import seedu.savvytasker.model.task.Task; +import seedu.savvytasker.model.task.TaskList.DuplicateTaskException; /** * */ public class TypicalTestTasks { - public static TestTask highPriority, medPriority, lowPriority, furthestDue, + public TestTask highPriority, medPriority, lowPriority, furthestDue, nearerDue, notSoNearerDue, earliestDue, longDue, happy, haloween; - private static SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy"); + private SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy"); public TypicalTestTasks() { try { @@ -47,16 +47,16 @@ public TypicalTestTasks() { } public static void loadSavvyTaskerWithSampleData(SavvyTasker st) { - + TypicalTestTasks td = new TypicalTestTasks(); try { - st.addTask(new Task(highPriority)); - st.addTask(new Task(medPriority)); - st.addTask(new Task(lowPriority)); - st.addTask(new Task(furthestDue)); - st.addTask(new Task(nearerDue)); - st.addTask(new Task(notSoNearerDue)); - st.addTask(new Task(earliestDue)); - st.addTask(new Task(longDue)); + st.addTask(new Task(td.highPriority)); + st.addTask(new Task(td.medPriority)); + st.addTask(new Task(td.lowPriority)); + st.addTask(new Task(td.furthestDue)); + st.addTask(new Task(td.nearerDue)); + st.addTask(new Task(td.notSoNearerDue)); + st.addTask(new Task(td.earliestDue)); + st.addTask(new Task(td.longDue)); } catch (DuplicateTaskException e) { assert false : "not possible"; } From 4275e33ecd61c9dc4c9aaa5a2210b947305bc5ec Mon Sep 17 00:00:00 2001 From: "Henry\\Henry" Date: Fri, 21 Oct 2016 18:48:10 +0800 Subject: [PATCH 02/55] Refactor TaskFieldParser,IndexParser,FindCommandParser subparsing methods to not reset parameter. Add AliasCommandParser Add skeleton methods addPreprocessorSymbol and removePreprocessorSymbol in LogicManager to prepare for future alias implementation Update ParserTest to conduct unit test on AliasCommandParser --- .../seedu/savvytasker/logic/LogicManager.java | 11 ++++ .../logic/parser/AliasCommandParser.java | 66 +++++++++++++++++++ .../logic/parser/FindCommandParser.java | 21 +++--- .../savvytasker/logic/parser/IndexParser.java | 15 +++-- .../logic/parser/TaskFieldParser.java | 52 +++++++-------- .../savvytasker/logic/parser/ParserTest.java | 44 +++++++++++++ 6 files changed, 166 insertions(+), 43 deletions(-) create mode 100644 src/main/java/seedu/savvytasker/logic/parser/AliasCommandParser.java diff --git a/src/main/java/seedu/savvytasker/logic/LogicManager.java b/src/main/java/seedu/savvytasker/logic/LogicManager.java index 05c2e91286ea..52b59c36aedf 100644 --- a/src/main/java/seedu/savvytasker/logic/LogicManager.java +++ b/src/main/java/seedu/savvytasker/logic/LogicManager.java @@ -95,4 +95,15 @@ public boolean redo() { return redone; } + + public void addPreprocessSymbol(String symbol, String representation) { + assert symbol != null; + assert representation != null; + + + } + + public void removePreprocessingSymbol(String symbol) { + assert symbol != null; + } } diff --git a/src/main/java/seedu/savvytasker/logic/parser/AliasCommandParser.java b/src/main/java/seedu/savvytasker/logic/parser/AliasCommandParser.java new file mode 100644 index 000000000000..a4cb956e6574 --- /dev/null +++ b/src/main/java/seedu/savvytasker/logic/parser/AliasCommandParser.java @@ -0,0 +1,66 @@ +package seedu.savvytasker.logic.parser; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import seedu.savvytasker.commons.core.Messages; +import seedu.savvytasker.logic.commands.AliasCommand; +import seedu.savvytasker.logic.commands.models.AliasCommandModel; + +public class AliasCommandParser implements CommandParser { + private static final String HEADER = "alias"; + private static final String READABLE_FORMAT = HEADER+" t/TEXT k/KEYWORD"; + + private static final String REGEX_REF_ORIGINAL = "Text"; + private static final String REGEX_REF_REPLACEMENT = "Keyword"; + + private static final Pattern REGEX_PATTERN = Pattern.compile( + HEADER+"\\s+((?<=\\s)(" + + "(t/(?<"+REGEX_REF_ORIGINAL+">[^/]+)(?!.*\\st/))|" + + "(k/(?<"+REGEX_REF_REPLACEMENT+">[^/]+)(?!.*\\sk/))" + + ")(\\s|$)){2}" + ); + + @Override + public String getHeader() { + return HEADER; + } + + @Override + public String getRequiredFormat() { + return READABLE_FORMAT; + } + + @Override + public AliasCommand parse(String commandText) throws ParseException { + Matcher matcher = REGEX_PATTERN.matcher(commandText); + if (matcher.matches()) { + String original = parseOriginal(matcher.group(REGEX_REF_ORIGINAL)); + String replacement = parseReplacement(matcher.group(REGEX_REF_REPLACEMENT)); + return new AliasCommand(new AliasCommandModel(original, replacement)); + } + + throw new ParseException(commandText, String.format( + Messages.MESSAGE_INVALID_COMMAND_FORMAT, getRequiredFormat())); + } + + private static String parseOriginal(String originalText) throws ParseException { + String trimmedText = originalText.trim(); + + if (trimmedText.isEmpty()) + throw new ParseException(trimmedText, "TEXT: Needs to be at least one character!"); + + return trimmedText; + } + + private static String parseReplacement(String keywordText) throws ParseException { + String trimmedKeywordText = keywordText.trim(); + if (trimmedKeywordText.length() < 2) { + throw new ParseException(trimmedKeywordText, "KEYWORD: Needs to consist at least 2 character."); + } + if (trimmedKeywordText.matches(".*\\s+.*")) { + throw new ParseException(trimmedKeywordText, "KEYWORD: Needs to be a single word without spaces."); + } + return trimmedKeywordText; + } +} diff --git a/src/main/java/seedu/savvytasker/logic/parser/FindCommandParser.java b/src/main/java/seedu/savvytasker/logic/parser/FindCommandParser.java index fb65a05632a0..b06da2a4aa31 100644 --- a/src/main/java/seedu/savvytasker/logic/parser/FindCommandParser.java +++ b/src/main/java/seedu/savvytasker/logic/parser/FindCommandParser.java @@ -47,27 +47,28 @@ public FindCommand parse(String commandText) throws ParseException { } private FindType parseFindType(String findTypeText) throws ParseException { + if (findTypeText == null) + return null; + + String trimmedFindTypeText = findTypeText.trim(); try { - if (findTypeText == null) - return null; - findTypeText = findTypeText.trim(); - return FindType.valueOfIgnoreCase(findTypeText); + return FindType.valueOfIgnoreCase(trimmedFindTypeText); } catch (IllegalArgumentException ex) { - throw new ParseException(findTypeText, "FIND_TYPE: Unknown type '" + findTypeText + "'"); + throw new ParseException(trimmedFindTypeText, "FIND_TYPE: Unknown type '" + findTypeText + "'"); } } private String[] parseKeywords(String keywordsBefore, String keywordsAfter) throws ParseException { - keywordsBefore = keywordsBefore.trim(); - keywordsAfter = keywordsAfter.trim(); + String trimmedKeywordsBefore = keywordsBefore.trim(); + String trimmedKeywordsAfter = keywordsAfter.trim(); String[] keywordsArr1 = new String[0]; String[] keywordsArr2 = new String[0]; - if (!keywordsBefore.isEmpty()) keywordsArr1 = keywordsBefore.split("\\s+"); - if (!keywordsAfter.isEmpty()) keywordsArr2 = keywordsAfter.split("\\s+"); + if (!trimmedKeywordsBefore.isEmpty()) keywordsArr1 = trimmedKeywordsBefore.split("\\s+"); + if (!trimmedKeywordsAfter.isEmpty()) keywordsArr2 = trimmedKeywordsAfter.split("\\s+"); if (keywordsArr1.length == 0 && keywordsArr2.length == 0) - throw new ParseException(keywordsBefore + " ... " + keywordsAfter, + throw new ParseException(trimmedKeywordsBefore + " ... " + trimmedKeywordsAfter, "KEYWORD: Need to specify at least one keyword!"); return concatArray(keywordsArr1, keywordsArr2); diff --git a/src/main/java/seedu/savvytasker/logic/parser/IndexParser.java b/src/main/java/seedu/savvytasker/logic/parser/IndexParser.java index 48d99e6ab6b1..f5ed949c3aa8 100644 --- a/src/main/java/seedu/savvytasker/logic/parser/IndexParser.java +++ b/src/main/java/seedu/savvytasker/logic/parser/IndexParser.java @@ -18,11 +18,11 @@ public class IndexParser { */ public int parseSingle(String indexText) throws ParseException { boolean parseError = false; - + + String trimmedIndexText = indexText.trim(); int index = 0; try { - indexText = indexText.trim(); - index = Integer.parseInt(indexText); + index = Integer.parseInt(trimmedIndexText); if (index <= 0) parseError = true; @@ -31,7 +31,7 @@ public int parseSingle(String indexText) throws ParseException { } if (parseError) - throw new ParseException(indexText, "Must be a positive whole number."); + throw new ParseException(trimmedIndexText, "Must be a positive whole number."); return index; } @@ -45,11 +45,12 @@ public int parseSingle(String indexText) throws ParseException { */ public int[] parseMultiple(String indicesText) throws ParseException { boolean parseError = false; - + + String trimmedIndicesText = indicesText.trim(); int[] indices = null; try { indices = Arrays - .stream(indicesText.trim().split("\\s+")) + .stream(trimmedIndicesText.split("\\s+")) .mapToInt(Integer::parseInt) .toArray(); @@ -64,7 +65,7 @@ public int[] parseMultiple(String indicesText) throws ParseException { } if (parseError) - throw new ParseException(indicesText, "Must be positive whole numbers."); + throw new ParseException(trimmedIndicesText, "Must be positive whole numbers."); return indices; } diff --git a/src/main/java/seedu/savvytasker/logic/parser/TaskFieldParser.java b/src/main/java/seedu/savvytasker/logic/parser/TaskFieldParser.java index 3e93ad399c0c..8521d48e0320 100644 --- a/src/main/java/seedu/savvytasker/logic/parser/TaskFieldParser.java +++ b/src/main/java/seedu/savvytasker/logic/parser/TaskFieldParser.java @@ -21,24 +21,22 @@ public String parseTaskName(String taskNameText) throws ParseException { } public InferredDate parseStartDate(String dateText) throws ParseException { - try { - if (dateText == null) - return null; - dateText = dateText.trim(); - return dateParser.parseSingle(dateText); - } catch (ParseException ex) { - throw new ParseException(dateText, "START_DATE: " + ex.getFailureDetails()); - } + return parseDate(dateText, "START_DATE: "); } public InferredDate parseEndDate(String dateText) throws ParseException { + return parseDate(dateText, "END_DATE: "); + } + + private InferredDate parseDate(String dateText, String errorField) throws ParseException { + if (dateText == null) + return null; + + String trimmedDateText = dateText.trim(); try { - if (dateText == null) - return null; - dateText = dateText.trim(); - return dateParser.parseSingle(dateText); + return dateParser.parseSingle(trimmedDateText); } catch (ParseException ex) { - throw new ParseException(dateText, "END_DATE: " + ex.getFailureDetails()); + throw new ParseException(trimmedDateText, errorField + ex.getFailureDetails()); } } @@ -49,24 +47,26 @@ public String parseLocation(String locationText) throws ParseException { } public PriorityLevel parsePriorityLevel(String priorityLevelText) throws ParseException { + if (priorityLevelText == null) + return null; + + String trimmedPriorityLevelText = priorityLevelText.trim(); try { - if (priorityLevelText == null) - return null; - priorityLevelText = priorityLevelText.trim(); - return PriorityLevel.valueOfIgnoreCase(priorityLevelText); + return PriorityLevel.valueOfIgnoreCase(trimmedPriorityLevelText); } catch (IllegalArgumentException ex) { - throw new ParseException(priorityLevelText, "PRIORITY_LEVEL: Unknown type '" + priorityLevelText + "'"); + throw new ParseException(trimmedPriorityLevelText, "PRIORITY_LEVEL: Unknown type '" + priorityLevelText + "'"); } } public RecurrenceType parseRecurrenceType(String recurrenceTypeText) throws ParseException { + if (recurrenceTypeText == null) + return null; + + String trimmedRecurrenceTypeText = recurrenceTypeText.trim(); try { - if (recurrenceTypeText == null) - return null; - recurrenceTypeText = recurrenceTypeText.trim(); - return RecurrenceType.valueOfIgnoreCase(recurrenceTypeText); + return RecurrenceType.valueOfIgnoreCase(trimmedRecurrenceTypeText); } catch (IllegalArgumentException ex) { - throw new ParseException(recurrenceTypeText, "RECURRING_TYPE: Unknown type '" + recurrenceTypeText + "'"); + throw new ParseException(trimmedRecurrenceTypeText, "RECURRING_TYPE: Unknown type '" + recurrenceTypeText + "'"); } } @@ -74,12 +74,12 @@ public Integer parseNumberOfRecurrence(String numRecurrenceText) throws ParseExc if (numRecurrenceText == null) return null; + String trimmedNumRecurrenceText = numRecurrenceText.trim(); int numRecurrence = 0; boolean parseError = false; try { - numRecurrenceText = numRecurrenceText.trim(); - numRecurrence = Integer.parseInt(numRecurrenceText); + numRecurrence = Integer.parseInt(trimmedNumRecurrenceText); if (numRecurrence < 0) parseError = true; } catch (NumberFormatException ex) { @@ -87,7 +87,7 @@ public Integer parseNumberOfRecurrence(String numRecurrenceText) throws ParseExc } if (parseError) - throw new ParseException(numRecurrenceText, "NUMBER_OF_RECURRENCE: Must be a nonnegative whole number!"); + throw new ParseException(trimmedNumRecurrenceText, "NUMBER_OF_RECURRENCE: Must be a nonnegative whole number!"); return numRecurrence; } diff --git a/src/test/java/seedu/savvytasker/logic/parser/ParserTest.java b/src/test/java/seedu/savvytasker/logic/parser/ParserTest.java index b7272f1bccb6..e075fe78d871 100644 --- a/src/test/java/seedu/savvytasker/logic/parser/ParserTest.java +++ b/src/test/java/seedu/savvytasker/logic/parser/ParserTest.java @@ -19,6 +19,7 @@ public class ParserTest { private UnmarkCommandParser unmarkParser; private UndoCommandParser undoParser; private RedoCommandParser redoParser; + private AliasCommandParser aliasParser; @Rule public ExpectedException thrown = ExpectedException.none(); @@ -37,6 +38,7 @@ public void setup() { unmarkParser = new UnmarkCommandParser(); undoParser = new UndoCommandParser(); redoParser = new RedoCommandParser(); + aliasParser = new AliasCommandParser(); } @Test @@ -388,5 +390,47 @@ public void parse_redo_invalid() throws ParseException { public void parse_redo_valid() throws ParseException { assertNotEquals(redoParser.parse("redo"), null); } + + //================================================================================== + + @Test + public void parse_alias_keywordUnspecified() throws ParseException { + thrown.expect(ParseException.class); + aliasParser.parse("alias t/ a string of things"); + } + + @Test + public void parse_alias_textUnspecified() throws ParseException { + thrown.expect(ParseException.class); + aliasParser.parse("alias k/ xyz"); + } + + @Test + public void parse_alias_noSwitchesSpecified() throws ParseException { + thrown.expect(ParseException.class); + aliasParser.parse("alias power overwhelming"); + } + @Test + public void parse_alias_keywordTooLong() throws ParseException { + thrown.expect(ParseException.class); + aliasParser.parse("alias k/ not a single word t/ project management"); + } + + @Test + public void parse_alias_keywordEmpty() throws ParseException { + thrown.expect(ParseException.class); + aliasParser.parse("alias k/ t/ project management"); + } + + @Test + public void parse_alias_textEmpty() throws ParseException { + thrown.expect(ParseException.class); + aliasParser.parse("alias k/ pjm t/ "); + } + + @Test + public void parse_alias_fullValid() throws ParseException { + assertNotEquals(aliasParser.parse("alias k/ pjm t/ project management "), null); + } } From 524749772405ac8f3eb8310453f42c933dc04716 Mon Sep 17 00:00:00 2001 From: "Henry\\Henry" Date: Fri, 21 Oct 2016 19:32:17 +0800 Subject: [PATCH 03/55] Refactor Command abstract class setData() method to setModel(). Add setLogic() method in Command abstract class Add LogicRequiringCommand and ModelRequiringCommand abstract classes to provide a way to get access to logic and model dependencies Refactor *Command classes to inherit from ModelRequiringCommand and LogicRequiringCommand whereas before that they inherit directly from Command to gain dependencies. --- .../seedu/savvytasker/logic/LogicManager.java | 4 +++- .../savvytasker/logic/commands/AddCommand.java | 2 +- .../savvytasker/logic/commands/AliasCommand.java | 12 ++---------- .../savvytasker/logic/commands/ClearCommand.java | 2 +- .../savvytasker/logic/commands/Command.java | 16 ++++++++++------ .../logic/commands/DeleteCommand.java | 2 +- .../savvytasker/logic/commands/FindCommand.java | 2 +- .../savvytasker/logic/commands/ListCommand.java | 2 +- .../logic/commands/LogicRequiringCommand.java | 16 ++++++++++++++++ .../logic/commands/ModelRequiringCommand.java | 16 ++++++++++++++++ .../logic/commands/ModifyCommand.java | 2 +- .../logic/commands/SelectCommand.java | 2 +- .../logic/commands/UnaliasCommand.java | 2 +- 13 files changed, 55 insertions(+), 25 deletions(-) create mode 100644 src/main/java/seedu/savvytasker/logic/commands/LogicRequiringCommand.java create mode 100644 src/main/java/seedu/savvytasker/logic/commands/ModelRequiringCommand.java diff --git a/src/main/java/seedu/savvytasker/logic/LogicManager.java b/src/main/java/seedu/savvytasker/logic/LogicManager.java index 051a2d5da8c4..99cac5ca19c7 100644 --- a/src/main/java/seedu/savvytasker/logic/LogicManager.java +++ b/src/main/java/seedu/savvytasker/logic/LogicManager.java @@ -5,6 +5,7 @@ import seedu.savvytasker.commons.core.LogsCenter; import seedu.savvytasker.logic.commands.Command; import seedu.savvytasker.logic.commands.CommandResult; +import seedu.savvytasker.logic.commands.ModelRequiringCommand; import seedu.savvytasker.logic.parser.*; import seedu.savvytasker.model.Model; import seedu.savvytasker.model.task.ReadOnlyTask; @@ -37,7 +38,8 @@ public LogicManager(Model model, Storage storage) { public CommandResult execute(String commandText) { logger.info("----------------[USER COMMAND][" + commandText + "]"); Command command = parser.parse(commandText); - command.setData(model); + command.setModel(model); + command.setLogic(this); CommandResult result = command.execute(); if (command.canUndo()) { diff --git a/src/main/java/seedu/savvytasker/logic/commands/AddCommand.java b/src/main/java/seedu/savvytasker/logic/commands/AddCommand.java index 768d421f5859..f76eb8687fa9 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/AddCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/AddCommand.java @@ -7,7 +7,7 @@ /** * Adds a person to the address book. */ -public class AddCommand extends Command { +public class AddCommand extends ModelRequiringCommand { public static final String COMMAND_WORD = "add"; diff --git a/src/main/java/seedu/savvytasker/logic/commands/AliasCommand.java b/src/main/java/seedu/savvytasker/logic/commands/AliasCommand.java index 0205fa9ec82f..5635fa5af12e 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/AliasCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/AliasCommand.java @@ -2,12 +2,11 @@ import seedu.savvytasker.logic.commands.models.AliasCommandModel; import seedu.savvytasker.model.task.Task; -import seedu.savvytasker.model.task.TaskList.DuplicateTaskException; /** * Command to create aliases */ -public class AliasCommand extends Command { +public class AliasCommand extends LogicRequiringCommand { public static final String COMMAND_WORD = "alias"; @@ -31,14 +30,7 @@ public AliasCommand(AliasCommandModel commandModel) { @Override public CommandResult execute() { - assert model != null; - try { - model.addTask(toAdd); - return new CommandResult(String.format(MESSAGE_SUCCESS, toAdd)); - } catch (DuplicateTaskException e) { - return new CommandResult(MESSAGE_DUPLICATE_ALIAS); - } - + return null; } @Override diff --git a/src/main/java/seedu/savvytasker/logic/commands/ClearCommand.java b/src/main/java/seedu/savvytasker/logic/commands/ClearCommand.java index f43c44c60055..d25ff1860465 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/ClearCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/ClearCommand.java @@ -5,7 +5,7 @@ /** * Clears the address book. */ -public class ClearCommand extends Command { +public class ClearCommand extends ModelRequiringCommand { public static final String COMMAND_WORD = "clear"; public static final String MESSAGE_SUCCESS = "Savvy Tasker has been cleared!"; diff --git a/src/main/java/seedu/savvytasker/logic/commands/Command.java b/src/main/java/seedu/savvytasker/logic/commands/Command.java index 9fd31b4836b8..8820316acaec 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/Command.java +++ b/src/main/java/seedu/savvytasker/logic/commands/Command.java @@ -3,14 +3,13 @@ import seedu.savvytasker.commons.core.EventsCenter; import seedu.savvytasker.commons.core.Messages; import seedu.savvytasker.commons.events.ui.IncorrectCommandAttemptedEvent; +import seedu.savvytasker.logic.Logic; import seedu.savvytasker.model.Model; /** * Represents a command with hidden internal logic and the ability to be executed. */ public abstract class Command { - protected Model model; - /** * Constructs a feedback message to summarise an operation that displayed a listing of tasks. * @@ -29,13 +28,18 @@ public static String getMessageForTaskListShownSummary(int displaySize) { public abstract CommandResult execute(); /** - * Provides any needed dependencies to the command. + * Provides any model related dependencies to the command. * Commands making use of any of these should override this method to gain * access to the dependencies. */ - public void setData(Model model) { - this.model = model; - } + public void setModel(Model model) { /* Intentionally does nothing */ } + + /** + * Provides any logic related dependencies to the command. + * Commands making use of any of these should override this method to gain + * access to the dependencies. + */ + public void setLogic(Logic logic) { /* Intentionally does nothing */ } /** * Raises an event to indicate an attempt to execute an incorrect command diff --git a/src/main/java/seedu/savvytasker/logic/commands/DeleteCommand.java b/src/main/java/seedu/savvytasker/logic/commands/DeleteCommand.java index 42b9bec4a5f1..fae540e50188 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/DeleteCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/DeleteCommand.java @@ -11,7 +11,7 @@ /** * Deletes a person identified using it's last displayed index from the address book. */ -public class DeleteCommand extends Command { +public class DeleteCommand extends ModelRequiringCommand { public static final String COMMAND_WORD = "delete"; public static final String COMMAND_FORMAT = "delete INDEX [MORE_INDEX]"; diff --git a/src/main/java/seedu/savvytasker/logic/commands/FindCommand.java b/src/main/java/seedu/savvytasker/logic/commands/FindCommand.java index 85caa64d8d0a..4d27df864e52 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/FindCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/FindCommand.java @@ -8,7 +8,7 @@ * Keyword matching is case sensitive. * @author A0139915W */ -public class FindCommand extends Command { +public class FindCommand extends ModelRequiringCommand { public static final String COMMAND_WORD = "find"; public static final String COMMAND_FORMAT = "find [t/FIND_TYPE] KEYWORD [MORE_KEYWORDS]"; diff --git a/src/main/java/seedu/savvytasker/logic/commands/ListCommand.java b/src/main/java/seedu/savvytasker/logic/commands/ListCommand.java index 2a5e8135893c..7db5f8679e92 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/ListCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/ListCommand.java @@ -6,7 +6,7 @@ /** * Lists all tasks in the savvy tasker to the user. */ -public class ListCommand extends Command { +public class ListCommand extends ModelRequiringCommand { public static final String COMMAND_WORD = "list"; diff --git a/src/main/java/seedu/savvytasker/logic/commands/LogicRequiringCommand.java b/src/main/java/seedu/savvytasker/logic/commands/LogicRequiringCommand.java new file mode 100644 index 000000000000..fff0dcda6e9a --- /dev/null +++ b/src/main/java/seedu/savvytasker/logic/commands/LogicRequiringCommand.java @@ -0,0 +1,16 @@ +package seedu.savvytasker.logic.commands; + +import seedu.savvytasker.logic.Logic; + +/** + * Represents a command which requires the Logic class as a dependency. + * Commands should inherit this class if they only require dependency the logic + * and not the model. +*/ +public abstract class LogicRequiringCommand extends Command { + protected Logic logic; + + public void setLogic(Logic logic) { + this.logic = logic; + } +} diff --git a/src/main/java/seedu/savvytasker/logic/commands/ModelRequiringCommand.java b/src/main/java/seedu/savvytasker/logic/commands/ModelRequiringCommand.java new file mode 100644 index 000000000000..d5536971392b --- /dev/null +++ b/src/main/java/seedu/savvytasker/logic/commands/ModelRequiringCommand.java @@ -0,0 +1,16 @@ +package seedu.savvytasker.logic.commands; + +import seedu.savvytasker.model.Model; + +/** + * Represents a command which requires the Model class as a dependency. + * Commands should inherit this class if they only require dependency the model + * and not the logic. +*/ +public abstract class ModelRequiringCommand extends Command { + protected Model model; + + public void setModel(Model model) { + this.model = model; + } +} diff --git a/src/main/java/seedu/savvytasker/logic/commands/ModifyCommand.java b/src/main/java/seedu/savvytasker/logic/commands/ModifyCommand.java index c04bfea6cfdd..802f5dd5420b 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/ModifyCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/ModifyCommand.java @@ -10,7 +10,7 @@ /** * Adds a person to the address book. */ -public class ModifyCommand extends Command { +public class ModifyCommand extends ModelRequiringCommand { public static final String COMMAND_WORD = "modify"; diff --git a/src/main/java/seedu/savvytasker/logic/commands/SelectCommand.java b/src/main/java/seedu/savvytasker/logic/commands/SelectCommand.java index f905fb1deb79..69b3429d5bd1 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/SelectCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/SelectCommand.java @@ -9,7 +9,7 @@ /** * Selects a person identified using it's last displayed index from the address book. */ -public class SelectCommand extends Command { +public class SelectCommand extends ModelRequiringCommand { public final int targetIndex; diff --git a/src/main/java/seedu/savvytasker/logic/commands/UnaliasCommand.java b/src/main/java/seedu/savvytasker/logic/commands/UnaliasCommand.java index 4d8250324257..593ff15a1f3c 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/UnaliasCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/UnaliasCommand.java @@ -8,7 +8,7 @@ /** * Command to remove aliases */ -public class UnaliasCommand extends Command { +public class UnaliasCommand extends ModelRequiringCommand { public static final String COMMAND_WORD = "unalias"; From 0fb08ec0322d3508705c5e809cc7afc37737c40b Mon Sep 17 00:00:00 2001 From: "Henry\\Henry" Date: Fri, 21 Oct 2016 20:05:44 +0800 Subject: [PATCH 04/55] Add parsing preprocessing handling methods in Logic interface and LogicManager Modify AliasCommand to prepare for its implementation Add preprocessing handling methods in MasterParser --- .../java/seedu/savvytasker/logic/Logic.java | 20 +++++++- .../seedu/savvytasker/logic/LogicManager.java | 23 +++++++-- .../logic/commands/AliasCommand.java | 8 ++-- .../logic/parser/MasterParser.java | 47 ++++++++++++++++++- 4 files changed, 86 insertions(+), 12 deletions(-) diff --git a/src/main/java/seedu/savvytasker/logic/Logic.java b/src/main/java/seedu/savvytasker/logic/Logic.java index 80316d645807..37cc8a249822 100644 --- a/src/main/java/seedu/savvytasker/logic/Logic.java +++ b/src/main/java/seedu/savvytasker/logic/Logic.java @@ -2,6 +2,7 @@ import javafx.collections.ObservableList; import seedu.savvytasker.logic.commands.CommandResult; +import seedu.savvytasker.logic.parser.MasterParser; import seedu.savvytasker.model.task.ReadOnlyTask; /** @@ -24,12 +25,27 @@ public interface Logic { * * @return true if a command was undone, false otherwise */ - boolean undo(); + public boolean undo(); /** * Redoes the previous undone command. Does nothing if there is nothing to redo. * * @return true if a command was redone, false otherwise */ - boolean redo(); + public boolean redo(); + + /** + * Refer to {@link MasterParser#addPreprocessSymbol(String,String)} + */ + public boolean addPreprocessSymbol(String symbol, String representation); + + /** + * Refer to {@link MasterParser#removePreprocessingSymbol(String)} + */ + public boolean removePreprocessingSymbol(String symbol); + + /** + * Refer to {@link MasterParser#doesPreprocessingSymbolExist(String)} + */ + public boolean doesPreprocessingSymbolExist(String symbol); } diff --git a/src/main/java/seedu/savvytasker/logic/LogicManager.java b/src/main/java/seedu/savvytasker/logic/LogicManager.java index 99cac5ca19c7..16427534153f 100644 --- a/src/main/java/seedu/savvytasker/logic/LogicManager.java +++ b/src/main/java/seedu/savvytasker/logic/LogicManager.java @@ -98,14 +98,27 @@ public boolean redo() { return redone; } - public void addPreprocessSymbol(String symbol, String representation) { - assert symbol != null; - assert representation != null; + public boolean addPreprocessSymbol(String symbol, String representation) { + boolean success = parser.addPreprocessSymbol(symbol, representation); + if (success) { + /* TODO :Inform model */ + } + + return success; + } + + public boolean removePreprocessingSymbol(String symbol) { + boolean success = parser.removePreprocessingSymbol(symbol); + + if (success) { + /* TODO :Inform model */ + } + return success; } - public void removePreprocessingSymbol(String symbol) { - assert symbol != null; + public boolean doesPreprocessingSymbolExist(String symbol) { + return parser.doesPreprocessingSymbolExist(symbol); } } diff --git a/src/main/java/seedu/savvytasker/logic/commands/AliasCommand.java b/src/main/java/seedu/savvytasker/logic/commands/AliasCommand.java index 5635fa5af12e..091a2b399199 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/AliasCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/AliasCommand.java @@ -18,18 +18,18 @@ public class AliasCommand extends LogicRequiringCommand { public static final String MESSAGE_SUCCESS = "New alias added: %1$s"; public static final String MESSAGE_DUPLICATE_ALIAS = "This alias is already in use"; - private final Task toAdd; - + private AliasCommandModel commandModel; /** * Creates an alias command */ public AliasCommand(AliasCommandModel commandModel) { - // create new alias mapping - toAdd = null; + assert commandModel != null; + this.commandModel = commandModel; } @Override public CommandResult execute() { + assert logic != null; return null; } diff --git a/src/main/java/seedu/savvytasker/logic/parser/MasterParser.java b/src/main/java/seedu/savvytasker/logic/parser/MasterParser.java index 4b9cf202a4e0..e95cb5f92468 100644 --- a/src/main/java/seedu/savvytasker/logic/parser/MasterParser.java +++ b/src/main/java/seedu/savvytasker/logic/parser/MasterParser.java @@ -17,9 +17,11 @@ public class MasterParser { Pattern.compile("(?
\\S+).*"); private final Map> commandParsers; + private final Map preprocessingTokens; public MasterParser() { this.commandParsers = new HashMap>(); + this.preprocessingTokens = new HashMap(); } public Command parse(String userInput) { @@ -70,7 +72,7 @@ public void registerCommandParser(CommandParser commandParser * @return true if such a command parser is registered, false otherwise */ public boolean isCommandParserRegistered(String header) { - return (commandParsers.get(header) != null); + return commandParsers.containsKey(header); } /** @@ -83,4 +85,47 @@ public boolean isCommandParserRegistered(String header) { public CommandParser unregisterCommandParser(String header) { return commandParsers.remove(header); } + + /** + * Adds a preprocessing symbol representing a string of text, which will be used + * be the parser to replace all such symbols with its representation before parsing. + * If an existing symbol exists, calling this method has no effect and just returns false. + * + * @param symbol the preprocessing symbol or keyword. Must be a single token. + * @param representation the text that the symbol represents. Must not be an empty string. + * @return true if the symbol does not previously exist and is added successfully, false otherwise + */ + public boolean addPreprocessSymbol(String symbol, String representation) { + assert symbol != null && !symbol.matches(".*\\s+.*"); + assert representation != null && !representation.isEmpty(); + + if (preprocessingTokens.containsKey(symbol)) + return false; + + preprocessingTokens.put(symbol, representation); + return true; + } + + /** + * Removes a preprocessing symbol. The parser will no longer replace all symbols before parsing. + * + * @param symbol the symbol to remove. + * @return true if the symbol exists and is removed, false otherwise + */ + public boolean removePreprocessingSymbol(String symbol) { + assert symbol != null; + + return preprocessingTokens.remove(symbol) != null; + } + + /** + * Returns true if specified preprocessing symbol currently exists, false otherwise. + * @param symbol the symbol to check for existence + * @return true if the symbol exists, false otherwise + */ + public boolean doesPreprocessingSymbolExist(String symbol) { + assert symbol != null; + + return preprocessingTokens.containsKey(symbol); + } } From df09c0a3a9d7125276f72c14e8bb897ae7fb7785 Mon Sep 17 00:00:00 2001 From: "Henry\\Henry" Date: Sat, 22 Oct 2016 17:21:31 +0800 Subject: [PATCH 05/55] Add AliasSymbol as the model data for alias symbols Add AliasSymbolList as the collection class for storing AliasSymbol Add DuplicateSymbolKeywordException, SymbolKeywordNotFoundException class for errors when using AliasSymbolList add and remove method Add AliasSymbolChangedEvent for notifying observers that alias symbol has been added or removed Add XmlAdaptedAliasSymbol which is used for serialization and deserialization of AliasSymbol Modify SavvyTasker class to provide methods to add and remove AliasSymbol data into internal AliasSymbolList Modify ReadOnlySavyTasker to provide methods for accessing AliasSymbolList Modify Model interface and ModelManager class to provide methods to add and remove AliasSymbol data as well as raise AliasSymbolChangedEvent Modify XmlSerializableSavvyTasker to be capable of being stored/loaded to for AliasSymbol data Modify Logic interface to no longer expose AliasSymbol handling methods and undo/redo functionality - Changes should be communicated through events Modify LogicManager to subscribe to AliasSymbolChangedEvent to handle adding and removal of AliasSymbols and removed previous addPreprocessSymbol and removePreprocessSymbol methods Implement LogicManager.loadAllAliasSymbols() to add externally loaded symbols (from the storage) into the parser during construction stage Implement AliasCommand.execute() to work properly Refactor AliasCommandModel and AliasCommandParser to use consistent naming of AliasSymbol components Fix XmlAdaptedTask showing wrong comment Remove LogicRequiringModel class - now AliasSymbol changes are communicated through events rather than directly through LogicRequiringModel dependency --- .../events/model/AliasSymbolChangedEvent.java | 34 +++++ .../java/seedu/savvytasker/logic/Logic.java | 31 +---- .../seedu/savvytasker/logic/LogicManager.java | 60 +++++---- .../logic/commands/AliasCommand.java | 18 ++- .../logic/commands/LogicRequiringCommand.java | 16 --- .../commands/models/AliasCommandModel.java | 18 +-- .../logic/parser/AliasCommandParser.java | 18 +-- .../logic/parser/MasterParser.java | 55 ++++---- .../java/seedu/savvytasker/model/Model.java | 8 ++ .../seedu/savvytasker/model/ModelManager.java | 29 +++- .../model/ReadOnlySavvyTasker.java | 15 ++- .../seedu/savvytasker/model/SavvyTasker.java | 68 +++++++--- .../savvytasker/model/alias/AliasSymbol.java | 54 ++++++++ .../model/alias/AliasSymbolList.java | 126 ++++++++++++++++++ .../DuplicateSymbolKeywordException.java | 11 ++ .../alias/SymbolKeywordNotFoundException.java | 11 ++ .../storage/XmlAdaptedAliasSymbol.java | 39 ++++++ .../savvytasker/storage/XmlAdaptedTask.java | 2 +- .../storage/XmlSerializableSavvyTasker.java | 41 +++++- .../seedu/savvytasker/testutil/TestUtil.java | 3 +- 20 files changed, 515 insertions(+), 142 deletions(-) create mode 100644 src/main/java/seedu/savvytasker/commons/events/model/AliasSymbolChangedEvent.java delete mode 100644 src/main/java/seedu/savvytasker/logic/commands/LogicRequiringCommand.java create mode 100644 src/main/java/seedu/savvytasker/model/alias/AliasSymbol.java create mode 100644 src/main/java/seedu/savvytasker/model/alias/AliasSymbolList.java create mode 100644 src/main/java/seedu/savvytasker/model/alias/DuplicateSymbolKeywordException.java create mode 100644 src/main/java/seedu/savvytasker/model/alias/SymbolKeywordNotFoundException.java create mode 100644 src/main/java/seedu/savvytasker/storage/XmlAdaptedAliasSymbol.java diff --git a/src/main/java/seedu/savvytasker/commons/events/model/AliasSymbolChangedEvent.java b/src/main/java/seedu/savvytasker/commons/events/model/AliasSymbolChangedEvent.java new file mode 100644 index 000000000000..aa035335d976 --- /dev/null +++ b/src/main/java/seedu/savvytasker/commons/events/model/AliasSymbolChangedEvent.java @@ -0,0 +1,34 @@ +package seedu.savvytasker.commons.events.model; + +import seedu.savvytasker.commons.events.BaseEvent; +import seedu.savvytasker.model.alias.AliasSymbol; + +/** + * Represents an event where the user has added an alias symbol. + */ +public class AliasSymbolChangedEvent extends BaseEvent { + /** + * The action that was performed, i.e. the symbol was added or removed. + */ + public enum Action { + Added, + Removed; + } + + public final AliasSymbol symbol; + public final Action action; + + public AliasSymbolChangedEvent(AliasSymbol symbol, Action action) { + assert symbol != null; + assert action != null; + + this.symbol = symbol; + this.action = action; + } + + @Override + public String toString() { + return "Alias symbol " + action.toString() + ": " + symbol.toString(); + } + +} diff --git a/src/main/java/seedu/savvytasker/logic/Logic.java b/src/main/java/seedu/savvytasker/logic/Logic.java index 37cc8a249822..48fc5b35c433 100644 --- a/src/main/java/seedu/savvytasker/logic/Logic.java +++ b/src/main/java/seedu/savvytasker/logic/Logic.java @@ -3,6 +3,7 @@ import javafx.collections.ObservableList; import seedu.savvytasker.logic.commands.CommandResult; import seedu.savvytasker.logic.parser.MasterParser; +import seedu.savvytasker.model.alias.AliasSymbol; import seedu.savvytasker.model.task.ReadOnlyTask; /** @@ -18,34 +19,4 @@ public interface Logic { /** Returns the filtered list of tasks */ ObservableList getFilteredTaskList(); - - /** - * Undoes the previous command. Does nothing but return false if there is - * no command to undo. - * - * @return true if a command was undone, false otherwise - */ - public boolean undo(); - - /** - * Redoes the previous undone command. Does nothing if there is nothing to redo. - * - * @return true if a command was redone, false otherwise - */ - public boolean redo(); - - /** - * Refer to {@link MasterParser#addPreprocessSymbol(String,String)} - */ - public boolean addPreprocessSymbol(String symbol, String representation); - - /** - * Refer to {@link MasterParser#removePreprocessingSymbol(String)} - */ - public boolean removePreprocessingSymbol(String symbol); - - /** - * Refer to {@link MasterParser#doesPreprocessingSymbolExist(String)} - */ - public boolean doesPreprocessingSymbolExist(String symbol); } diff --git a/src/main/java/seedu/savvytasker/logic/LogicManager.java b/src/main/java/seedu/savvytasker/logic/LogicManager.java index 16427534153f..a750afccaaef 100644 --- a/src/main/java/seedu/savvytasker/logic/LogicManager.java +++ b/src/main/java/seedu/savvytasker/logic/LogicManager.java @@ -3,17 +3,21 @@ import javafx.collections.ObservableList; import seedu.savvytasker.commons.core.ComponentManager; import seedu.savvytasker.commons.core.LogsCenter; +import seedu.savvytasker.commons.events.model.AliasSymbolChangedEvent; import seedu.savvytasker.logic.commands.Command; import seedu.savvytasker.logic.commands.CommandResult; -import seedu.savvytasker.logic.commands.ModelRequiringCommand; import seedu.savvytasker.logic.parser.*; import seedu.savvytasker.model.Model; +import seedu.savvytasker.model.alias.AliasSymbol; import seedu.savvytasker.model.task.ReadOnlyTask; import seedu.savvytasker.storage.Storage; +import java.util.List; import java.util.Stack; import java.util.logging.Logger; +import com.google.common.eventbus.Subscribe; + /** * The main LogicManager of the app. */ @@ -32,6 +36,7 @@ public LogicManager(Model model, Storage storage) { this.redoStack = new Stack(); registerAllDefaultCommandParsers(); + loadAllAliasSymbols(); } @Override @@ -68,10 +73,17 @@ private void registerAllDefaultCommandParsers() { parser.registerCommandParser(new UnmarkCommandParser()); parser.registerCommandParser(new UndoCommandParser()); parser.registerCommandParser(new RedoCommandParser()); + parser.registerCommandParser(new AliasCommandParser()); + } + + private void loadAllAliasSymbols() { + List allSynbols = model.getSavvyTasker().getReadOnlyListOfAliasSymbols(); + for (AliasSymbol symbol : allSynbols) { + parser.addAliasSymbol(symbol); + } } - @Override - public boolean undo() { + private boolean undo() { boolean undone = false; if (!undoStack.isEmpty()) { @@ -84,8 +96,7 @@ public boolean undo() { return undone; } - @Override - public boolean redo() { + private boolean redo() { boolean redone = false; if (!redoStack.isEmpty()) { @@ -98,27 +109,24 @@ public boolean redo() { return redone; } - public boolean addPreprocessSymbol(String symbol, String representation) { - boolean success = parser.addPreprocessSymbol(symbol, representation); - - if (success) { - /* TODO :Inform model */ + @Subscribe + public void handleAliasSymbolChangedEvent(AliasSymbolChangedEvent event) { + logger.info(LogsCenter.getEventHandlingLogMessage( + event, "Alias symbol " + event.action.toString().toLowerCase())); + if (event.action.equals(AliasSymbolChangedEvent.Action.Added)) { + boolean success = parser.addAliasSymbol(event.symbol); + if (success) { + logger.info("Added alias symbol '"+event.symbol.getKeyword()+"' to parser"); + } else { + logger.warning("Failed to add alias symbol '"+event.symbol.getKeyword()+" to parser"); + } + } else { + boolean success = parser.removeAliasSymbol(event.symbol.getKeyword()); + if (success) { + logger.info("Removed alias symbol '"+event.symbol.getKeyword()+"' from parser"); + } else { + logger.warning("Failed to remove alias symbol '"+event.symbol.getKeyword()+" from parser"); + } } - - return success; - } - - public boolean removePreprocessingSymbol(String symbol) { - boolean success = parser.removePreprocessingSymbol(symbol); - - if (success) { - /* TODO :Inform model */ - } - - return success; - } - - public boolean doesPreprocessingSymbolExist(String symbol) { - return parser.doesPreprocessingSymbolExist(symbol); } } diff --git a/src/main/java/seedu/savvytasker/logic/commands/AliasCommand.java b/src/main/java/seedu/savvytasker/logic/commands/AliasCommand.java index 091a2b399199..ac59e7a93c5e 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/AliasCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/AliasCommand.java @@ -1,12 +1,13 @@ package seedu.savvytasker.logic.commands; import seedu.savvytasker.logic.commands.models.AliasCommandModel; -import seedu.savvytasker.model.task.Task; +import seedu.savvytasker.model.alias.AliasSymbol; +import seedu.savvytasker.model.alias.DuplicateSymbolKeywordException; /** * Command to create aliases */ -public class AliasCommand extends LogicRequiringCommand { +public class AliasCommand extends ModelRequiringCommand { public static final String COMMAND_WORD = "alias"; @@ -29,8 +30,17 @@ public AliasCommand(AliasCommandModel commandModel) { @Override public CommandResult execute() { - assert logic != null; - return null; + assert model != null; + + AliasSymbol symbolToAdd = new AliasSymbol(commandModel.getKeyword(), + commandModel.getRepresentingText()); + + try { + model.addAliasSymbol(symbolToAdd); + return new CommandResult(String.format(MESSAGE_SUCCESS, symbolToAdd)); + } catch (DuplicateSymbolKeywordException e) { + return new CommandResult(MESSAGE_DUPLICATE_ALIAS); + } } @Override diff --git a/src/main/java/seedu/savvytasker/logic/commands/LogicRequiringCommand.java b/src/main/java/seedu/savvytasker/logic/commands/LogicRequiringCommand.java deleted file mode 100644 index fff0dcda6e9a..000000000000 --- a/src/main/java/seedu/savvytasker/logic/commands/LogicRequiringCommand.java +++ /dev/null @@ -1,16 +0,0 @@ -package seedu.savvytasker.logic.commands; - -import seedu.savvytasker.logic.Logic; - -/** - * Represents a command which requires the Logic class as a dependency. - * Commands should inherit this class if they only require dependency the logic - * and not the model. -*/ -public abstract class LogicRequiringCommand extends Command { - protected Logic logic; - - public void setLogic(Logic logic) { - this.logic = logic; - } -} diff --git a/src/main/java/seedu/savvytasker/logic/commands/models/AliasCommandModel.java b/src/main/java/seedu/savvytasker/logic/commands/models/AliasCommandModel.java index 88d3503f7c05..ae819531fc38 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/models/AliasCommandModel.java +++ b/src/main/java/seedu/savvytasker/logic/commands/models/AliasCommandModel.java @@ -6,16 +6,16 @@ public class AliasCommandModel extends CommandModel { private String keyword; - private String shortKeyword; + private String representingText; /** * Creates the model to be used with the alias command. - * @param keyword The keyword to replace. - * @param shortKeyword The keyword to replace with. + * @param keyword The keyword. + * @param representingText The text that the keyword represents. */ - public AliasCommandModel(String keyword, String shortKeyword) { + public AliasCommandModel(String keyword, String representingText) { this.keyword = keyword; - this.shortKeyword = shortKeyword; + this.representingText = representingText; } public String getKeyword() { @@ -26,11 +26,11 @@ public void setKeyword(String keyword) { this.keyword = keyword; } - public String getShortKeyword() { - return shortKeyword; + public String getRepresentingText() { + return representingText; } - public void setShortKeyword(String shortKeyword) { - this.shortKeyword = shortKeyword; + public void setRepresentingText(String shortKeyword) { + this.representingText = shortKeyword; } } diff --git a/src/main/java/seedu/savvytasker/logic/parser/AliasCommandParser.java b/src/main/java/seedu/savvytasker/logic/parser/AliasCommandParser.java index a4cb956e6574..8118e28374e1 100644 --- a/src/main/java/seedu/savvytasker/logic/parser/AliasCommandParser.java +++ b/src/main/java/seedu/savvytasker/logic/parser/AliasCommandParser.java @@ -11,13 +11,13 @@ public class AliasCommandParser implements CommandParser { private static final String HEADER = "alias"; private static final String READABLE_FORMAT = HEADER+" t/TEXT k/KEYWORD"; - private static final String REGEX_REF_ORIGINAL = "Text"; - private static final String REGEX_REF_REPLACEMENT = "Keyword"; + private static final String REGEX_REF_REPRESENTATION = "Text"; + private static final String REGEX_REF_KEYWORD = "Keyword"; private static final Pattern REGEX_PATTERN = Pattern.compile( HEADER+"\\s+((?<=\\s)(" + - "(t/(?<"+REGEX_REF_ORIGINAL+">[^/]+)(?!.*\\st/))|" + - "(k/(?<"+REGEX_REF_REPLACEMENT+">[^/]+)(?!.*\\sk/))" + + "(t/(?<"+REGEX_REF_REPRESENTATION+">[^/]+)(?!.*\\st/))|" + + "(k/(?<"+REGEX_REF_KEYWORD+">[^/]+)(?!.*\\sk/))" + ")(\\s|$)){2}" ); @@ -35,16 +35,16 @@ public String getRequiredFormat() { public AliasCommand parse(String commandText) throws ParseException { Matcher matcher = REGEX_PATTERN.matcher(commandText); if (matcher.matches()) { - String original = parseOriginal(matcher.group(REGEX_REF_ORIGINAL)); - String replacement = parseReplacement(matcher.group(REGEX_REF_REPLACEMENT)); - return new AliasCommand(new AliasCommandModel(original, replacement)); + String representation = parseRepresentation(matcher.group(REGEX_REF_REPRESENTATION)); + String keyword = parseKeyword(matcher.group(REGEX_REF_KEYWORD)); + return new AliasCommand(new AliasCommandModel(keyword, representation)); } throw new ParseException(commandText, String.format( Messages.MESSAGE_INVALID_COMMAND_FORMAT, getRequiredFormat())); } - private static String parseOriginal(String originalText) throws ParseException { + private static String parseRepresentation(String originalText) throws ParseException { String trimmedText = originalText.trim(); if (trimmedText.isEmpty()) @@ -53,7 +53,7 @@ private static String parseOriginal(String originalText) throws ParseException { return trimmedText; } - private static String parseReplacement(String keywordText) throws ParseException { + private static String parseKeyword(String keywordText) throws ParseException { String trimmedKeywordText = keywordText.trim(); if (trimmedKeywordText.length() < 2) { throw new ParseException(trimmedKeywordText, "KEYWORD: Needs to consist at least 2 character."); diff --git a/src/main/java/seedu/savvytasker/logic/parser/MasterParser.java b/src/main/java/seedu/savvytasker/logic/parser/MasterParser.java index e95cb5f92468..0dfee5f602e2 100644 --- a/src/main/java/seedu/savvytasker/logic/parser/MasterParser.java +++ b/src/main/java/seedu/savvytasker/logic/parser/MasterParser.java @@ -11,17 +11,18 @@ import seedu.savvytasker.logic.commands.Command; import seedu.savvytasker.logic.commands.HelpCommand; import seedu.savvytasker.logic.commands.IncorrectCommand; +import seedu.savvytasker.model.alias.AliasSymbol; public class MasterParser { private static final Pattern BASIC_COMMAND_FORMAT = Pattern.compile("(?
\\S+).*"); private final Map> commandParsers; - private final Map preprocessingTokens; + private final Map aliasingSymbols; public MasterParser() { this.commandParsers = new HashMap>(); - this.preprocessingTokens = new HashMap(); + this.aliasingSymbols = new HashMap(); } public Command parse(String userInput) { @@ -87,45 +88,53 @@ public CommandParser unregisterCommandParser(String header) { } /** - * Adds a preprocessing symbol representing a string of text, which will be used - * be the parser to replace all such symbols with its representation before parsing. - * If an existing symbol exists, calling this method has no effect and just returns false. + * Adds an aliasing symbol to be used by the parser to replace all such the symbol's keyword with + * its representation before parsing. If a symbol with an identical keyword exists, calling this + * method has no effect and just returns false. * - * @param symbol the preprocessing symbol or keyword. Must be a single token. - * @param representation the text that the symbol represents. Must not be an empty string. - * @return true if the symbol does not previously exist and is added successfully, false otherwise + * @param symbol the symbol, cannot be null. + * @return true if this symbol is added successfully, false if another symbol with the same keyword + * already exists and this symbol cannot be added. */ - public boolean addPreprocessSymbol(String symbol, String representation) { - assert symbol != null && !symbol.matches(".*\\s+.*"); - assert representation != null && !representation.isEmpty(); + public boolean addAliasSymbol(AliasSymbol symbol) { + assert symbol != null; - if (preprocessingTokens.containsKey(symbol)) + if (aliasingSymbols.containsKey(symbol.getKeyword())) return false; - preprocessingTokens.put(symbol, representation); + aliasingSymbols.put(symbol.getKeyword(), symbol); return true; } /** - * Removes a preprocessing symbol. The parser will no longer replace all symbols before parsing. + * Removes an aliasing symbol, identified by its keyword. The parser will no longer replace the + * keyword of this symbol with its representation before parsing. * - * @param symbol the symbol to remove. + * @param symbol the symbol to remove, cannot be null * @return true if the symbol exists and is removed, false otherwise */ - public boolean removePreprocessingSymbol(String symbol) { - assert symbol != null; + public boolean removeAliasSymbol(String symbolKeyword) { + assert symbolKeyword != null; - return preprocessingTokens.remove(symbol) != null; + return aliasingSymbols.remove(symbolKeyword) != null; } /** - * Returns true if specified preprocessing symbol currently exists, false otherwise. - * @param symbol the symbol to check for existence + * Returns true if a symbol with the specified keyword exists, false otherwise. + * @param symbolKeyword the keyword to check for, cannot be null * @return true if the symbol exists, false otherwise */ - public boolean doesPreprocessingSymbolExist(String symbol) { - assert symbol != null; + public boolean doesAliasSymbolExist(String symbolKeyword) { + assert symbolKeyword != null; - return preprocessingTokens.containsKey(symbol); + return aliasingSymbols.containsKey(symbolKeyword); + } + + /** + * Clears all existing symbols. + * @see #removeAliasSymbol + */ + public void clearAllAliasSymbols() { + aliasingSymbols.clear(); } } diff --git a/src/main/java/seedu/savvytasker/model/Model.java b/src/main/java/seedu/savvytasker/model/Model.java index 2108571315a5..aa1c28f0c73c 100644 --- a/src/main/java/seedu/savvytasker/model/Model.java +++ b/src/main/java/seedu/savvytasker/model/Model.java @@ -1,6 +1,9 @@ package seedu.savvytasker.model; import seedu.savvytasker.commons.core.UnmodifiableObservableList; +import seedu.savvytasker.model.alias.AliasSymbol; +import seedu.savvytasker.model.alias.DuplicateSymbolKeywordException; +import seedu.savvytasker.model.alias.SymbolKeywordNotFoundException; import seedu.savvytasker.model.task.FindType; import seedu.savvytasker.model.task.ReadOnlyTask; import seedu.savvytasker.model.task.Task; @@ -46,4 +49,9 @@ public interface Model { /** Updates the filter of the filtered task list to filter by the given keywords*/ void updateFilteredTaskList(FindType findType, String[] keywords); + /** Adds the given AliasSymbol */ + void addAliasSymbol(AliasSymbol symbol) throws DuplicateSymbolKeywordException; + + /** Removes an the given AliasSymbol. */ + void removeAliasSymbol(AliasSymbol symbol) throws SymbolKeywordNotFoundException; } diff --git a/src/main/java/seedu/savvytasker/model/ModelManager.java b/src/main/java/seedu/savvytasker/model/ModelManager.java index e72480a0acc4..4448b123559d 100644 --- a/src/main/java/seedu/savvytasker/model/ModelManager.java +++ b/src/main/java/seedu/savvytasker/model/ModelManager.java @@ -5,8 +5,12 @@ import seedu.savvytasker.commons.core.ComponentManager; import seedu.savvytasker.commons.core.LogsCenter; import seedu.savvytasker.commons.core.UnmodifiableObservableList; +import seedu.savvytasker.commons.events.model.AliasSymbolChangedEvent; import seedu.savvytasker.commons.events.model.SavvyTaskerChangedEvent; import seedu.savvytasker.commons.util.StringUtil; +import seedu.savvytasker.model.alias.AliasSymbol; +import seedu.savvytasker.model.alias.DuplicateSymbolKeywordException; +import seedu.savvytasker.model.alias.SymbolKeywordNotFoundException; import seedu.savvytasker.model.task.FindType; import seedu.savvytasker.model.task.ReadOnlyTask; import seedu.savvytasker.model.task.Task; @@ -58,7 +62,7 @@ public ModelManager(ReadOnlySavvyTasker initialData) { sortedAndFilteredTasks = new SortedList<>(filteredTasks, new TaskSortedByDefault()); updateFilteredListToShowActive(); // shows only active tasks on start } - + @Override public void resetData(ReadOnlySavvyTasker newData) { savvyTasker.resetData(newData); @@ -75,6 +79,15 @@ private void indicateSavvyTaskerChanged() { raise(new SavvyTaskerChangedEvent(savvyTasker)); } + private void indicateAliasSymbolAdded(AliasSymbol symbol) { + raise(new AliasSymbolChangedEvent(symbol, AliasSymbolChangedEvent.Action.Added)); + } + + private void indicateAliasSymbolRemoved(AliasSymbol symbol) { + raise(new AliasSymbolChangedEvent(symbol, AliasSymbolChangedEvent.Action.Removed)); + } + + @Override public synchronized void deleteTask(ReadOnlyTask target) throws TaskNotFoundException { savvyTasker.removeTask(target); @@ -95,6 +108,20 @@ public synchronized void addTask(Task t) throws DuplicateTaskException { indicateSavvyTaskerChanged(); } + @Override + public synchronized void addAliasSymbol(AliasSymbol symbol) throws DuplicateSymbolKeywordException { + savvyTasker.addAliasSymbol(symbol); + indicateSavvyTaskerChanged(); + indicateAliasSymbolAdded(symbol); + } + + @Override + public synchronized void removeAliasSymbol(AliasSymbol symbol) throws SymbolKeywordNotFoundException { + savvyTasker.removeAliasSymbol(symbol); + indicateSavvyTaskerChanged(); + indicateAliasSymbolRemoved(symbol); + } + //=========== Filtered/Sorted Task List Accessors =============================================================== @Override diff --git a/src/main/java/seedu/savvytasker/model/ReadOnlySavvyTasker.java b/src/main/java/seedu/savvytasker/model/ReadOnlySavvyTasker.java index c2a43ec3c167..8b4a456b44b7 100644 --- a/src/main/java/seedu/savvytasker/model/ReadOnlySavvyTasker.java +++ b/src/main/java/seedu/savvytasker/model/ReadOnlySavvyTasker.java @@ -2,6 +2,8 @@ import java.util.List; +import seedu.savvytasker.model.alias.AliasSymbol; +import seedu.savvytasker.model.alias.AliasSymbolList; import seedu.savvytasker.model.task.ReadOnlyTask; import seedu.savvytasker.model.task.TaskList; @@ -9,12 +11,23 @@ * Unmodifiable view of a task list */ public interface ReadOnlySavvyTasker { - + /** + * Returns a defensively copied task list. + */ TaskList getTaskList(); + + /** + * Returns a defensively copied alias symbol list. + */ + AliasSymbolList getAliasSymbolList(); /** * Returns an unmodifiable view of task list */ List getReadOnlyListOfTasks(); + /** + * Returns unmodifiable view of symbols list + */ + List getReadOnlyListOfAliasSymbols(); } diff --git a/src/main/java/seedu/savvytasker/model/SavvyTasker.java b/src/main/java/seedu/savvytasker/model/SavvyTasker.java index c3c53fe848b3..e0646448b520 100644 --- a/src/main/java/seedu/savvytasker/model/SavvyTasker.java +++ b/src/main/java/seedu/savvytasker/model/SavvyTasker.java @@ -1,6 +1,10 @@ package seedu.savvytasker.model; import javafx.collections.ObservableList; +import seedu.savvytasker.model.alias.AliasSymbol; +import seedu.savvytasker.model.alias.AliasSymbolList; +import seedu.savvytasker.model.alias.DuplicateSymbolKeywordException; +import seedu.savvytasker.model.alias.SymbolKeywordNotFoundException; import seedu.savvytasker.model.task.ReadOnlyTask; import seedu.savvytasker.model.task.Task; import seedu.savvytasker.model.task.TaskList; @@ -17,32 +21,28 @@ public class SavvyTasker implements ReadOnlySavvyTasker { private final TaskList tasks; + private final AliasSymbolList symbols; - { - tasks = new TaskList(); + public SavvyTasker() { + this.tasks = new TaskList(); + this.symbols = new AliasSymbolList(); } - public SavvyTasker() {} - - /** - * Persons and Tags are copied into this savvytasker - */ public SavvyTasker(ReadOnlySavvyTasker toBeCopied) { - this(toBeCopied.getTaskList()); + this(toBeCopied.getTaskList(), toBeCopied.getAliasSymbolList()); } - /** - * Persons and Tags are copied into this savvytasker - */ - public SavvyTasker(TaskList tasks) { + public SavvyTasker(TaskList tasks, AliasSymbolList symbols) { + this(); resetData(tasks.getInternalList()); + this.symbols.reset(symbols); } public static ReadOnlySavvyTasker getEmptySavvyTasker() { return new SavvyTasker(); } -//// list overwrite operations +//// task list overwrite operations public ObservableList getTasks() { return tasks.getInternalList(); @@ -60,7 +60,7 @@ public void resetData(ReadOnlySavvyTasker newData) { resetData(newData.getReadOnlyListOfTasks()); } -//// task-level operations +//// symbol/task-level operations /** * Returns the next available id for use to uniquely identify a task. @@ -106,12 +106,31 @@ public boolean replaceTask(ReadOnlyTask key, Task replacement) throws TaskNotFou throw new TaskList.TaskNotFoundException(); } } + + /** + * Adds an alias symbol to savvy tasker. + * @param symbol the symbol to add + * @throws DuplicateSymbolKeywordException if another symbol with the same keyword already exists + */ + public void addAliasSymbol(AliasSymbol symbol) throws DuplicateSymbolKeywordException { + symbols.addAliasSymbol(symbol); + } + + /** + * Removes an alias symbol from savvy tasker. + * @param symbol the symbol to remove + * @throws SymbolKeywordNotFoundException if there is no such symbol + */ + public void removeAliasSymbol(AliasSymbol symbol) throws SymbolKeywordNotFoundException { + symbols.removeAliasSymbol(symbol); + } + //// util methods @Override public String toString() { - return tasks.getInternalList().size() + " tasks"; + return tasks.getInternalList().size() + " tasks, " + symbols.size() + " symbols"; // TODO: refine later } @@ -122,19 +141,32 @@ public List getReadOnlyListOfTasks() { @Override public TaskList getTaskList() { - return tasks; + TaskList defensiveCopy = new TaskList(); + defensiveCopy.getInternalList().addAll(tasks.getInternalList()); + return defensiveCopy; + } + + @Override + public List getReadOnlyListOfAliasSymbols() { + return symbols.asReadonly(); + } + + @Override + public AliasSymbolList getAliasSymbolList() { + return new AliasSymbolList(symbols); } @Override public boolean equals(Object other) { return other == this // short circuit if same object || (other instanceof SavvyTasker // instanceof handles nulls - && this.tasks.equals(((SavvyTasker) other).tasks)); + && this.tasks.equals(((SavvyTasker) other).tasks) + && this.symbols.equals(((SavvyTasker) other).symbols)); } @Override public int hashCode() { // use this method for custom fields hashing instead of implementing your own - return Objects.hash(tasks); + return Objects.hash(tasks, symbols); } } diff --git a/src/main/java/seedu/savvytasker/model/alias/AliasSymbol.java b/src/main/java/seedu/savvytasker/model/alias/AliasSymbol.java new file mode 100644 index 000000000000..1139898274a3 --- /dev/null +++ b/src/main/java/seedu/savvytasker/model/alias/AliasSymbol.java @@ -0,0 +1,54 @@ +package seedu.savvytasker.model.alias; + +import java.util.Objects; + +/** + * A class that represents a keyword-representation pair. This pair can be used + * by the parser for substituting keywords found in a commandText with its + * representation. Instances of this class are immutable. + */ +public class AliasSymbol { + private final String keyword; + private final String representation; + + /** + * Creates a Symbol object with the specified keyword and its representation. + * The keyword must be a single word without spaces while the representation + * can be any non-empty string. Both parameters cannot be null. + * + * @param keyword + * @param representation + */ + public AliasSymbol(String keyword, String representation) { + assert keyword != null && !keyword.matches(".*\\s+.*"); + assert representation != null && !representation.isEmpty(); + + this.keyword = keyword; + this.representation = representation; + } + + public String getKeyword() { + return this.keyword; + } + + public String getRepresentation() { + return this.representation; + } + + @Override + public String toString() { + return "[Keyword: " + this.keyword + ", Representation: " + this.representation + "]"; + } + + @Override + public boolean equals(Object object) { + return this == object || (object instanceof AliasSymbol && + this.keyword.equals(((AliasSymbol)object).keyword) && + this.representation.equals(((AliasSymbol)object).representation)); + } + + @Override + public int hashCode() { + return Objects.hash(keyword, representation); + } +} diff --git a/src/main/java/seedu/savvytasker/model/alias/AliasSymbolList.java b/src/main/java/seedu/savvytasker/model/alias/AliasSymbolList.java new file mode 100644 index 000000000000..75b89017d2b7 --- /dev/null +++ b/src/main/java/seedu/savvytasker/model/alias/AliasSymbolList.java @@ -0,0 +1,126 @@ +package seedu.savvytasker.model.alias; + +import java.util.Iterator; +import java.util.List; + +import edu.emory.mathcs.backport.java.util.Collections; +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; + +public class AliasSymbolList implements Iterable { + private final ObservableList internalList = FXCollections.observableArrayList(); + + /** Default constructor */ + public AliasSymbolList() {} + + /** + * Copy constructor + * @param src the list to copy from, cannot be null + */ + public AliasSymbolList(AliasSymbolList src) { + assert src != null; + internalList.addAll(src.internalList); + } + + @Override + public Iterator iterator() { + return internalList.iterator(); + } + + /** + * Returns true if a symbol with the specified symbolKeyword exists in the list + * @param symbolKeyword the symbolKeyword to check for + * @return true if exists, false otherwise + */ + public boolean contains(String symbolKeyword) { + for (AliasSymbol symbol : internalList) { + if (symbol.getKeyword().equals(symbolKeyword)) + return true; + } + + return false; + } + + /** + * Returns true if the symbol exists in the list. Both keyword and representation must match. + * @param symbol the symol to check for + * @return true if exists, false otherwise + */ + public boolean contains(AliasSymbol symbol) { + return internalList.contains(symbol); + } + + /** + * Adds a symbol to the list. The symbol being added must not have a keyword that clashes with another + * symbol in the list. + * @param symbol the symbol to add, cannot be null + * @throws DuplicateSymbolKeywordException if a symbol with the same keyword already exists + */ + public void addAliasSymbol(AliasSymbol symbol) throws DuplicateSymbolKeywordException { + assert symbol != null; + if (contains(symbol.getKeyword())) + throw new DuplicateSymbolKeywordException(); + internalList.add(symbol); + } + + /** + * Removes a symbol from the list. + * @param symbol the symbol to remove, cannot be null + * @throws SymbolKeywordNotFoundException if no such symbol can be found. + */ + public void removeAliasSymbol(AliasSymbol symbol) throws SymbolKeywordNotFoundException { + assert symbol != null; + if (!contains(symbol)) + throw new SymbolKeywordNotFoundException(); + internalList.remove(symbol); + } + + /** + * Replace an old symbol with a new symbol. The new symbol's keyword must equal to the old + * symbol's keyword. + * + * @param oldSymbol the old symbol to be replaced, cannot be null + * @param newSymbol the new symbol to used to replace, cannot be null + * @throws SymbolKeywordNotFoundException if an old symbol with the keyword is not found. + */ + public void replaceAliasSymbol(AliasSymbol oldSymbol, AliasSymbol newSymbol) throws SymbolKeywordNotFoundException { + assert oldSymbol != null && newSymbol != null; + assert oldSymbol.getKeyword().equals(newSymbol.getKeyword()); + + removeAliasSymbol(oldSymbol); + internalList.add(newSymbol); + } + + /** + * Clears this list and copy all elements from the other list to this. + * @param other the other list + */ + public void reset(AliasSymbolList other) { + assert other != null; + internalList.addAll(other.internalList); // AliasSymbol is immutable, no need for deep copy. + } + + /** + * Gets the size of this list. + * @return the size of this list + */ + public int size() { + return internalList.size(); + } + + public List asReadonly() { + return Collections.unmodifiableList(internalList); + } + + @Override + public boolean equals(Object other) { + return other == this // short circuit if same object + || (other instanceof AliasSymbolList // instanceof handles nulls + && this.internalList.equals( ((AliasSymbolList) other).internalList)); + } + + @Override + public int hashCode() { + return internalList.hashCode(); + } +} diff --git a/src/main/java/seedu/savvytasker/model/alias/DuplicateSymbolKeywordException.java b/src/main/java/seedu/savvytasker/model/alias/DuplicateSymbolKeywordException.java new file mode 100644 index 000000000000..6328a85e3d6d --- /dev/null +++ b/src/main/java/seedu/savvytasker/model/alias/DuplicateSymbolKeywordException.java @@ -0,0 +1,11 @@ +package seedu.savvytasker.model.alias; + +import seedu.savvytasker.commons.exceptions.IllegalValueException; + +public class DuplicateSymbolKeywordException extends IllegalValueException { + private static final long serialVersionUID = -5516547118656055929L; + + public DuplicateSymbolKeywordException() { + super("Operation will result in two symbols with the same keyword defined."); + } +} diff --git a/src/main/java/seedu/savvytasker/model/alias/SymbolKeywordNotFoundException.java b/src/main/java/seedu/savvytasker/model/alias/SymbolKeywordNotFoundException.java new file mode 100644 index 000000000000..3d6b84feb5d0 --- /dev/null +++ b/src/main/java/seedu/savvytasker/model/alias/SymbolKeywordNotFoundException.java @@ -0,0 +1,11 @@ +package seedu.savvytasker.model.alias; + +import seedu.savvytasker.commons.exceptions.IllegalValueException; + +public class SymbolKeywordNotFoundException extends IllegalValueException { + private static final long serialVersionUID = -5516547118656055929L; + + public SymbolKeywordNotFoundException() { + super("Unable to find a symbol with the specified keyword."); + } +} diff --git a/src/main/java/seedu/savvytasker/storage/XmlAdaptedAliasSymbol.java b/src/main/java/seedu/savvytasker/storage/XmlAdaptedAliasSymbol.java new file mode 100644 index 000000000000..9f6ca2e6a139 --- /dev/null +++ b/src/main/java/seedu/savvytasker/storage/XmlAdaptedAliasSymbol.java @@ -0,0 +1,39 @@ +package seedu.savvytasker.storage; + +import javax.xml.bind.annotation.XmlElement; + +import seedu.savvytasker.commons.exceptions.IllegalValueException; +import seedu.savvytasker.model.alias.AliasSymbol; + +public class XmlAdaptedAliasSymbol { + + @XmlElement(required = true) + private String keyword; + @XmlElement(required = true) + private String representation; + + /** + * No-arg constructor for JAXB use. + */ + public XmlAdaptedAliasSymbol() {} + + + /** + * Converts a given AliasSymbol into this class for JAXB use. + * + * @param source future changes to this will not affect the created XmlAdaptedAliasSymbol + */ + public XmlAdaptedAliasSymbol(AliasSymbol source) { + keyword = source.getKeyword(); + representation = source.getRepresentation(); + } + + /** + * Converts this jaxb-friendly adapted alias symbol object into the model's AliasSymbol object. + * + * @throws IllegalValueException if there were any data constraints violated in the adapted AliasSymbol + */ + public AliasSymbol toModelType() throws IllegalValueException { + return new AliasSymbol(keyword, representation); + } +} diff --git a/src/main/java/seedu/savvytasker/storage/XmlAdaptedTask.java b/src/main/java/seedu/savvytasker/storage/XmlAdaptedTask.java index c174b6679e2e..b887f3a7ddb1 100644 --- a/src/main/java/seedu/savvytasker/storage/XmlAdaptedTask.java +++ b/src/main/java/seedu/savvytasker/storage/XmlAdaptedTask.java @@ -64,7 +64,7 @@ public XmlAdaptedTask(ReadOnlyTask source) { } /** - * Converts this jaxb-friendly adapted person object into the model's Task object. + * Converts this jaxb-friendly adapted task object into the model's Task object. * * @throws IllegalValueException if there were any data constraints violated in the adapted Task */ diff --git a/src/main/java/seedu/savvytasker/storage/XmlSerializableSavvyTasker.java b/src/main/java/seedu/savvytasker/storage/XmlSerializableSavvyTasker.java index 60af43918762..331a2e8a5cd1 100644 --- a/src/main/java/seedu/savvytasker/storage/XmlSerializableSavvyTasker.java +++ b/src/main/java/seedu/savvytasker/storage/XmlSerializableSavvyTasker.java @@ -3,13 +3,17 @@ import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; +import seedu.savvytasker.commons.core.LogsCenter; import seedu.savvytasker.commons.exceptions.IllegalValueException; import seedu.savvytasker.model.ReadOnlySavvyTasker; +import seedu.savvytasker.model.alias.AliasSymbol; +import seedu.savvytasker.model.alias.AliasSymbolList; import seedu.savvytasker.model.task.ReadOnlyTask; import seedu.savvytasker.model.task.TaskList; import java.util.ArrayList; import java.util.List; +import java.util.logging.Logger; import java.util.stream.Collectors; /** @@ -17,12 +21,16 @@ */ @XmlRootElement(name = "savvytasker") public class XmlSerializableSavvyTasker implements ReadOnlySavvyTasker { + private static final Logger logger = LogsCenter.getLogger(XmlSerializableSavvyTasker.class); @XmlElement private List tasks; + @XmlElement + private List symbols; { tasks = new ArrayList<>(); + symbols = new ArrayList<>(); } /** @@ -35,6 +43,7 @@ public XmlSerializableSavvyTasker() {} */ public XmlSerializableSavvyTasker(ReadOnlySavvyTasker src) { tasks.addAll(src.getReadOnlyListOfTasks().stream().map(XmlAdaptedTask::new).collect(Collectors.toList())); + symbols.addAll(src.getReadOnlyListOfAliasSymbols().stream().map(XmlAdaptedAliasSymbol::new).collect(Collectors.toList())); } @Override @@ -44,7 +53,8 @@ public TaskList getTaskList() { try { lists.add(t.toModelType()); } catch (IllegalValueException e) { - //TODO: better error handling + logger.warning("Failed to convert XmlAdaptedTask to Task or add it to TaskList: " + + e.getMessage()); } } return lists; @@ -56,11 +66,36 @@ public List getReadOnlyListOfTasks() { try { return p.toModelType(); } catch (IllegalValueException e) { - e.printStackTrace(); - //TODO: better error handling + logger.warning("Failed to convert XmlAdaptedTask to Task: " + e.getMessage()); return null; } }).collect(Collectors.toCollection(ArrayList::new)); } + @Override + public AliasSymbolList getAliasSymbolList() { + AliasSymbolList lists = new AliasSymbolList(); + for (XmlAdaptedAliasSymbol s : symbols) { + try { + lists.addAliasSymbol(s.toModelType()); + } catch (IllegalValueException e) { + logger.warning("Failed to convert XmlAliasSymbol to AliasSymbol " + + "or add it to AliasSymbolList: " + e.getMessage() ); + } + } + return lists; + + } + + @Override + public List getReadOnlyListOfAliasSymbols() { + return symbols.stream().map(p -> { + try { + return p.toModelType(); + } catch (IllegalValueException e) { + logger.warning("Failed to convert XmlAliasSymbol to AliasSymbol: " + e.getMessage()); + return null; + } + }).collect(Collectors.toCollection(ArrayList::new)); + } } diff --git a/src/test/java/seedu/savvytasker/testutil/TestUtil.java b/src/test/java/seedu/savvytasker/testutil/TestUtil.java index 7f06bd27b935..45fd0ba223cd 100644 --- a/src/test/java/seedu/savvytasker/testutil/TestUtil.java +++ b/src/test/java/seedu/savvytasker/testutil/TestUtil.java @@ -17,6 +17,7 @@ import seedu.savvytasker.commons.util.FileUtil; import seedu.savvytasker.commons.util.XmlUtil; import seedu.savvytasker.model.SavvyTasker; +import seedu.savvytasker.model.alias.AliasSymbolList; import seedu.savvytasker.model.task.ReadOnlyTask; import seedu.savvytasker.model.task.Task; import seedu.savvytasker.model.task.TaskList; @@ -109,7 +110,7 @@ public static void main(String... s) { } public static SavvyTasker generateEmptySavvyTasker() { - return new SavvyTasker(new TaskList()); + return new SavvyTasker(new TaskList(), new AliasSymbolList()); } public static XmlSerializableSavvyTasker generateSampleStorageSavvyTasker() { From 64fe1abc24577ad6fad8a539423839e706f97bd4 Mon Sep 17 00:00:00 2001 From: "Henry\\Henry" Date: Sat, 22 Oct 2016 18:08:30 +0800 Subject: [PATCH 06/55] Add UnaliasCommandParser to parse unalias command Implement UnaliasCommand.execute() to execute unalias command Refactor UnaliasCommandModel to use consistent naming Refactor AliasCommand to use consistent naming Modify ParserTest to also test UnaliasCommandParser Update UserGuide.md to reflect changes in alias and unalias command --- docs/UserGuide.md | 25 ++++++---- .../seedu/savvytasker/logic/LogicManager.java | 1 + .../logic/commands/AliasCommand.java | 6 +-- .../logic/commands/UnaliasCommand.java | 33 ++++++++---- .../commands/models/UnaliasCommandModel.java | 18 +++---- .../logic/parser/AliasCommandParser.java | 10 ++-- .../logic/parser/UnaliasCommandParser.java | 50 +++++++++++++++++++ .../savvytasker/logic/parser/ParserTest.java | 15 ++++++ 8 files changed, 121 insertions(+), 37 deletions(-) create mode 100644 src/main/java/seedu/savvytasker/logic/parser/UnaliasCommandParser.java diff --git a/docs/UserGuide.md b/docs/UserGuide.md index fa1ab5f41ab0..fa9f472dd927 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -192,22 +192,29 @@ Clears all entries from the Savvy Task.
Format: `clear` #### Alias a keyword : `alias` -Alias a keyword with shorter version of keyword
-Format: `alias k/KEYWORD s/SHORT_KEYWORD` +Alias a keyword to mean another text.
+Format: `alias k/KEYWORD r/REPRESENTATION` Examples: -* `alias k/Project Meeting s/pjm`
-System will interpret subsequent user command of "pjm" as "Project Meeting"
+* `alias k/pjm r/Project Meeting`
+System will interpret subsequent keywords "pjm" as "Project Meeting"
`add pjm s/05-10-2016 st/14:00 et/18:00 r/daily n/2 c/CS2103`
-Add "Project Meeting" to task list +Add "Project Meeting" to task list
+>Note that only keywords must be a single word by themselves, or they will not be replaced. +The below example shows 'pjm' as part of another word and it is not replaced with its representation. +inside another word + `add pjm2 s/05-10-2016 st/14:00 et/18:00 r/daily n/2 c/CS2103`
+Add "pjm2" to task list, and not "Project Meeting2"
+ + #### Unalias a keyword : `unalias` -Unalias of shorter version of keyword
-Format: `unalias s/SHORT_KEYWORD` +Unalias a keyword
+Format: `unalias KEYWORD` Examples: -* `unalias s/pjm`
-Remove replacement of shorter version of "pjm" back to "Project Meeting"
+* `unalias pjm`
+Removes the replacement of keyword "pjm" with "Project Meeting"
`add pjm s/05-10-2016 st/14:00 et/18:00 r/daily n/2 c/CS2103`
Add task named "pjm" to task list diff --git a/src/main/java/seedu/savvytasker/logic/LogicManager.java b/src/main/java/seedu/savvytasker/logic/LogicManager.java index a750afccaaef..5d9b64fa6c2b 100644 --- a/src/main/java/seedu/savvytasker/logic/LogicManager.java +++ b/src/main/java/seedu/savvytasker/logic/LogicManager.java @@ -74,6 +74,7 @@ private void registerAllDefaultCommandParsers() { parser.registerCommandParser(new UndoCommandParser()); parser.registerCommandParser(new RedoCommandParser()); parser.registerCommandParser(new AliasCommandParser()); + parser.registerCommandParser(new UnaliasCommandParser()); } private void loadAllAliasSymbols() { diff --git a/src/main/java/seedu/savvytasker/logic/commands/AliasCommand.java b/src/main/java/seedu/savvytasker/logic/commands/AliasCommand.java index ac59e7a93c5e..2d44a820320c 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/AliasCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/AliasCommand.java @@ -32,12 +32,12 @@ public AliasCommand(AliasCommandModel commandModel) { public CommandResult execute() { assert model != null; - AliasSymbol symbolToAdd = new AliasSymbol(commandModel.getKeyword(), + AliasSymbol toAdd = new AliasSymbol(commandModel.getKeyword(), commandModel.getRepresentingText()); try { - model.addAliasSymbol(symbolToAdd); - return new CommandResult(String.format(MESSAGE_SUCCESS, symbolToAdd)); + model.addAliasSymbol(toAdd); + return new CommandResult(String.format(MESSAGE_SUCCESS, toAdd)); } catch (DuplicateSymbolKeywordException e) { return new CommandResult(MESSAGE_DUPLICATE_ALIAS); } diff --git a/src/main/java/seedu/savvytasker/logic/commands/UnaliasCommand.java b/src/main/java/seedu/savvytasker/logic/commands/UnaliasCommand.java index 593ff15a1f3c..788579802c5d 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/UnaliasCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/UnaliasCommand.java @@ -1,9 +1,9 @@ package seedu.savvytasker.logic.commands; import seedu.savvytasker.commons.exceptions.IllegalValueException; -import seedu.savvytasker.logic.commands.models.AliasCommandModel; -import seedu.savvytasker.model.task.Task; -import seedu.savvytasker.model.task.TaskList.DuplicateTaskException; +import seedu.savvytasker.logic.commands.models.UnaliasCommandModel; +import seedu.savvytasker.model.alias.AliasSymbol; +import seedu.savvytasker.model.alias.SymbolKeywordNotFoundException; /** * Command to remove aliases @@ -20,27 +20,38 @@ public class UnaliasCommand extends ModelRequiringCommand { public static final String MESSAGE_SUCCESS = "Alias removed: %1$s"; public static final String MESSAGE_UNREGOGNIZED_ALIAS = "This alias is not in use"; - private final Task toAdd; - + private UnaliasCommandModel commandModel; /** * Convenience constructor using raw values. * * @throws IllegalValueException if any of the raw values are invalid */ - public UnaliasCommand(AliasCommandModel commandModel) { - this.toAdd = null; + public UnaliasCommand(UnaliasCommandModel commandModel) { + assert commandModel != null; + this.commandModel = commandModel; } @Override public CommandResult execute() { assert model != null; + + AliasSymbol toRemove = null; + for(AliasSymbol symbol : model.getSavvyTasker().getReadOnlyListOfAliasSymbols()) { + if (symbol.getKeyword().equals(this.commandModel.getKeyword())) { + toRemove = symbol; + break; + } + } + try { - model.addTask(toAdd); - return new CommandResult(String.format(MESSAGE_SUCCESS, toAdd)); - } catch (DuplicateTaskException e) { + if (toRemove == null) + return new CommandResult(MESSAGE_UNREGOGNIZED_ALIAS); + + model.removeAliasSymbol(toRemove); + return new CommandResult(String.format(MESSAGE_SUCCESS, toRemove)); + } catch (SymbolKeywordNotFoundException e) { return new CommandResult(MESSAGE_UNREGOGNIZED_ALIAS); } - } @Override diff --git a/src/main/java/seedu/savvytasker/logic/commands/models/UnaliasCommandModel.java b/src/main/java/seedu/savvytasker/logic/commands/models/UnaliasCommandModel.java index 889943c58d64..ebc11c3eb152 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/models/UnaliasCommandModel.java +++ b/src/main/java/seedu/savvytasker/logic/commands/models/UnaliasCommandModel.java @@ -5,23 +5,23 @@ */ public class UnaliasCommandModel extends CommandModel { - private String shortKeyword; + private String keyword; /** * Creates the model to be used with the unalias command. * @param shortKeyword The keyword to replace with. */ - public UnaliasCommandModel(String shortKeyword) { - assert(shortKeyword != null && !shortKeyword.isEmpty()); - this.shortKeyword = shortKeyword; + public UnaliasCommandModel(String keyword) { + assert(keyword != null && !keyword.isEmpty()); + this.keyword = keyword; } - public String getShortKeyword() { - return shortKeyword; + public String getKeyword() { + return keyword; } - public void setShortKeyword(String shortKeyword) { - assert(shortKeyword != null && !shortKeyword.isEmpty()); - this.shortKeyword = shortKeyword; + public void setKeyword(String keyword) { + assert(keyword != null && !keyword.isEmpty()); + this.keyword = keyword; } } diff --git a/src/main/java/seedu/savvytasker/logic/parser/AliasCommandParser.java b/src/main/java/seedu/savvytasker/logic/parser/AliasCommandParser.java index 8118e28374e1..dfa73d21e4ff 100644 --- a/src/main/java/seedu/savvytasker/logic/parser/AliasCommandParser.java +++ b/src/main/java/seedu/savvytasker/logic/parser/AliasCommandParser.java @@ -9,14 +9,14 @@ public class AliasCommandParser implements CommandParser { private static final String HEADER = "alias"; - private static final String READABLE_FORMAT = HEADER+" t/TEXT k/KEYWORD"; + private static final String READABLE_FORMAT = HEADER+" k/KEYWORD r/REPRESENTATION"; private static final String REGEX_REF_REPRESENTATION = "Text"; private static final String REGEX_REF_KEYWORD = "Keyword"; private static final Pattern REGEX_PATTERN = Pattern.compile( HEADER+"\\s+((?<=\\s)(" + - "(t/(?<"+REGEX_REF_REPRESENTATION+">[^/]+)(?!.*\\st/))|" + + "(r/(?<"+REGEX_REF_REPRESENTATION+">[^/]+)(?!.*\\sr/))|" + "(k/(?<"+REGEX_REF_KEYWORD+">[^/]+)(?!.*\\sk/))" + ")(\\s|$)){2}" ); @@ -44,16 +44,16 @@ public AliasCommand parse(String commandText) throws ParseException { Messages.MESSAGE_INVALID_COMMAND_FORMAT, getRequiredFormat())); } - private static String parseRepresentation(String originalText) throws ParseException { + private String parseRepresentation(String originalText) throws ParseException { String trimmedText = originalText.trim(); if (trimmedText.isEmpty()) - throw new ParseException(trimmedText, "TEXT: Needs to be at least one character!"); + throw new ParseException(trimmedText, "REPRESENTATION: Needs to be at least one character!"); return trimmedText; } - private static String parseKeyword(String keywordText) throws ParseException { + private String parseKeyword(String keywordText) throws ParseException { String trimmedKeywordText = keywordText.trim(); if (trimmedKeywordText.length() < 2) { throw new ParseException(trimmedKeywordText, "KEYWORD: Needs to consist at least 2 character."); diff --git a/src/main/java/seedu/savvytasker/logic/parser/UnaliasCommandParser.java b/src/main/java/seedu/savvytasker/logic/parser/UnaliasCommandParser.java new file mode 100644 index 000000000000..4e03dca70173 --- /dev/null +++ b/src/main/java/seedu/savvytasker/logic/parser/UnaliasCommandParser.java @@ -0,0 +1,50 @@ +package seedu.savvytasker.logic.parser; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import seedu.savvytasker.commons.core.Messages; +import seedu.savvytasker.logic.commands.UnaliasCommand; +import seedu.savvytasker.logic.commands.models.UnaliasCommandModel; + +public class UnaliasCommandParser implements CommandParser { + private static final String HEADER = "unalias"; + private static final String READABLE_FORMAT = HEADER+" KEYWORD"; + + private static final String REGEX_REF_KEYWORD = "Keyword"; + + private static final Pattern REGEX_PATTERN = Pattern.compile( + HEADER+"\\s+(?<"+REGEX_REF_KEYWORD+">[^/]+)" + ); + + @Override + public String getHeader() { + return HEADER; + } + + @Override + public String getRequiredFormat() { + return READABLE_FORMAT; + } + + @Override + public UnaliasCommand parse(String commandText) throws ParseException { + Matcher matcher = REGEX_PATTERN.matcher(commandText); + if (matcher.matches()) { + String keyword = parseKeyword(matcher.group(REGEX_REF_KEYWORD)); + return new UnaliasCommand(new UnaliasCommandModel(keyword)); + } + + throw new ParseException(commandText, String.format( + Messages.MESSAGE_INVALID_COMMAND_FORMAT, getRequiredFormat())); + } + + private String parseKeyword(String keywordText) throws ParseException { + String trimmedKeywordText = keywordText.trim(); + if (trimmedKeywordText.isEmpty()) { + throw new ParseException(trimmedKeywordText, "KEYWORD: Cannot be empty."); + } + return trimmedKeywordText; + } + +} diff --git a/src/test/java/seedu/savvytasker/logic/parser/ParserTest.java b/src/test/java/seedu/savvytasker/logic/parser/ParserTest.java index e075fe78d871..75726b845ccf 100644 --- a/src/test/java/seedu/savvytasker/logic/parser/ParserTest.java +++ b/src/test/java/seedu/savvytasker/logic/parser/ParserTest.java @@ -20,6 +20,7 @@ public class ParserTest { private UndoCommandParser undoParser; private RedoCommandParser redoParser; private AliasCommandParser aliasParser; + private UnaliasCommandParser unaliasParser; @Rule public ExpectedException thrown = ExpectedException.none(); @@ -39,6 +40,7 @@ public void setup() { undoParser = new UndoCommandParser(); redoParser = new RedoCommandParser(); aliasParser = new AliasCommandParser(); + unaliasParser = new UnaliasCommandParser(); } @Test @@ -433,4 +435,17 @@ public void parse_alias_textEmpty() throws ParseException { public void parse_alias_fullValid() throws ParseException { assertNotEquals(aliasParser.parse("alias k/ pjm t/ project management "), null); } + + //================================================================================== + + @Test + public void parse_unalias_emptyKeyword() throws ParseException { + thrown.expect(ParseException.class); + unaliasParser.parse("unalias "); + } + + @Test + public void parse_unalias_valid() throws ParseException { + assertNotEquals(unaliasParser.parse("unalias something "), null); + } } From ea16c552c55b16770959b932e7561447b7eda441 Mon Sep 17 00:00:00 2001 From: "Henry\\Henry" Date: Sat, 22 Oct 2016 20:02:58 +0800 Subject: [PATCH 07/55] Add canParseHeader() method in Logic and LogicManager to support querying of ability of parsing a command Add dependency from AliasCommand to Logic Add checking in AliasCommand.execute() to prevent using command headers as aliasing keyword Update MasterParser.parse() to enable aliasing Update AliasCommandParser and UnaliasCommandParser to turn off aliasing Modify ParserTest to test using MasterParser instead of individual parser. Modify ParserTest to conduct parameterized testing. --- docs/UserGuide.md | 1 - .../java/seedu/savvytasker/logic/Logic.java | 3 + .../seedu/savvytasker/logic/LogicManager.java | 5 + .../logic/commands/AliasCommand.java | 13 + .../logic/commands/IncorrectCommand.java | 5 +- .../logic/parser/AliasCommandParser.java | 5 + .../logic/parser/MasterParser.java | 108 ++++++-- .../logic/parser/UnaliasCommandParser.java | 5 + .../savvytasker/logic/parser/ParserTest.java | 255 +++++++++--------- 9 files changed, 244 insertions(+), 156 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index fa9f472dd927..f3329a64ca49 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -206,7 +206,6 @@ inside another word `add pjm2 s/05-10-2016 st/14:00 et/18:00 r/daily n/2 c/CS2103`
Add "pjm2" to task list, and not "Project Meeting2"
- #### Unalias a keyword : `unalias` Unalias a keyword
diff --git a/src/main/java/seedu/savvytasker/logic/Logic.java b/src/main/java/seedu/savvytasker/logic/Logic.java index 48fc5b35c433..b0924fb05e34 100644 --- a/src/main/java/seedu/savvytasker/logic/Logic.java +++ b/src/main/java/seedu/savvytasker/logic/Logic.java @@ -19,4 +19,7 @@ public interface Logic { /** Returns the filtered list of tasks */ ObservableList getFilteredTaskList(); + + /** */ + boolean canParseHeader(String keyword); } diff --git a/src/main/java/seedu/savvytasker/logic/LogicManager.java b/src/main/java/seedu/savvytasker/logic/LogicManager.java index 5d9b64fa6c2b..bb03786c0a08 100644 --- a/src/main/java/seedu/savvytasker/logic/LogicManager.java +++ b/src/main/java/seedu/savvytasker/logic/LogicManager.java @@ -130,4 +130,9 @@ public void handleAliasSymbolChangedEvent(AliasSymbolChangedEvent event) { } } } + + @Override + public boolean canParseHeader(String header) { + return parser.isCommandParserRegistered(header); + } } diff --git a/src/main/java/seedu/savvytasker/logic/commands/AliasCommand.java b/src/main/java/seedu/savvytasker/logic/commands/AliasCommand.java index 2d44a820320c..f8081cc4cd69 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/AliasCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/AliasCommand.java @@ -1,5 +1,6 @@ package seedu.savvytasker.logic.commands; +import seedu.savvytasker.logic.Logic; import seedu.savvytasker.logic.commands.models.AliasCommandModel; import seedu.savvytasker.model.alias.AliasSymbol; import seedu.savvytasker.model.alias.DuplicateSymbolKeywordException; @@ -18,8 +19,10 @@ public class AliasCommand extends ModelRequiringCommand { public static final String MESSAGE_SUCCESS = "New alias added: %1$s"; public static final String MESSAGE_DUPLICATE_ALIAS = "This alias is already in use"; + public static final String MESSAGE_INVALID_KEYWORD = "Unable to use a command name as a keyword!"; private AliasCommandModel commandModel; + private Logic logic; /** * Creates an alias command */ @@ -35,6 +38,10 @@ public CommandResult execute() { AliasSymbol toAdd = new AliasSymbol(commandModel.getKeyword(), commandModel.getRepresentingText()); + if (logic.canParseHeader(toAdd.getKeyword())) { + return new CommandResult(MESSAGE_INVALID_KEYWORD); + } + try { model.addAliasSymbol(toAdd); return new CommandResult(String.format(MESSAGE_SUCCESS, toAdd)); @@ -43,6 +50,12 @@ public CommandResult execute() { } } + @Override + public void setLogic(Logic logic) { + assert logic != null; + this.logic = logic; + } + @Override public boolean canUndo() { return true; diff --git a/src/main/java/seedu/savvytasker/logic/commands/IncorrectCommand.java b/src/main/java/seedu/savvytasker/logic/commands/IncorrectCommand.java index ac495facbc16..aefb1024f989 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/IncorrectCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/IncorrectCommand.java @@ -5,10 +5,11 @@ * Represents an incorrect command. Upon execution, produces some feedback to the user. */ public class IncorrectCommand extends Command { - + public final String resolvedText; public final String feedbackToUser; - public IncorrectCommand(String feedbackToUser){ + public IncorrectCommand(String resolvedText, String feedbackToUser){ + this.resolvedText = resolvedText; this.feedbackToUser = feedbackToUser; } diff --git a/src/main/java/seedu/savvytasker/logic/parser/AliasCommandParser.java b/src/main/java/seedu/savvytasker/logic/parser/AliasCommandParser.java index dfa73d21e4ff..88ba8f176474 100644 --- a/src/main/java/seedu/savvytasker/logic/parser/AliasCommandParser.java +++ b/src/main/java/seedu/savvytasker/logic/parser/AliasCommandParser.java @@ -31,6 +31,11 @@ public String getRequiredFormat() { return READABLE_FORMAT; } + @Override + public boolean shouldPreprocess() { + return false; + } + @Override public AliasCommand parse(String commandText) throws ParseException { Matcher matcher = REGEX_PATTERN.matcher(commandText); diff --git a/src/main/java/seedu/savvytasker/logic/parser/MasterParser.java b/src/main/java/seedu/savvytasker/logic/parser/MasterParser.java index 0dfee5f602e2..80d8a7f69b21 100644 --- a/src/main/java/seedu/savvytasker/logic/parser/MasterParser.java +++ b/src/main/java/seedu/savvytasker/logic/parser/MasterParser.java @@ -14,8 +14,8 @@ import seedu.savvytasker.model.alias.AliasSymbol; public class MasterParser { - private static final Pattern BASIC_COMMAND_FORMAT = - Pattern.compile("(?
\\S+).*"); + private static final Pattern KEYWORD_PATTERN = + Pattern.compile("(\\S+)(\\s+|$)"); private final Map> commandParsers; private final Map aliasingSymbols; @@ -26,26 +26,96 @@ public MasterParser() { } public Command parse(String userInput) { - final String trimmedUserInput = userInput.trim(); - final Matcher matcher = BASIC_COMMAND_FORMAT.matcher(trimmedUserInput); - if (!matcher.matches()) { - return new IncorrectCommand(String.format( - MESSAGE_INVALID_COMMAND_FORMAT, HelpCommand.MESSAGE_USAGE)); - } + String[] pieces = preprocessInitial(userInput.trim()); + if (pieces == null) + return new IncorrectCommand(userInput, MESSAGE_UNKNOWN_COMMAND); - final String header = matcher.group("header"); - CommandParser parser = commandParsers.get(header); - if (parser == null) { - return new IncorrectCommand(MESSAGE_UNKNOWN_COMMAND); - } + String header = pieces[0]; + String body = pieces[1]; + String trueHeader = extractHeader(header); + CommandParser parser = commandParsers.get(trueHeader); + if (parser == null) + return new IncorrectCommand(header + body, MESSAGE_UNKNOWN_COMMAND); + if (parser.shouldPreprocess()) + body = preprocessBody(body); + String combined = header + body; try { - return parser.parse(trimmedUserInput); + return parser.parse(combined); } catch (ParseException pe) { - /* TODO: Modify this to use ParseException's detail. */ - return new IncorrectCommand(String.format( - MESSAGE_INVALID_COMMAND_FORMAT, parser.getRequiredFormat())); + return new IncorrectCommand(combined, String.format( + MESSAGE_INVALID_COMMAND_FORMAT, pe.getFailureDetails())); + } + } + + /** + * Does an initial preprocessing of a command text in case the header is aliased. + * Returns a string array with 2 elements: the first is the header which is possibly aliased, + * which will be replaced with the representation of the aliasing, whereas the + * second is the body. If no header is found, this method returns null. + * + * @param commandText the command text + * @return a string array containing 2 elements, first is the header, second is the body; or null if + * there is no header in the command text + */ + private String[] preprocessInitial(String commandText) { + Matcher matcher = KEYWORD_PATTERN.matcher(commandText); + + if (matcher.find()) { + String header = matcher.group(1); + String spaces = matcher.group(2); + + AliasSymbol symbol = aliasingSymbols.get(header); + if (symbol != null) { + header = symbol.getRepresentation(); + } + + String body = commandText.substring(matcher.end()); + return new String[] {header + spaces, body}; } + + return null; + } + + /** + * Gets the header from the preprocessed header as a preprocessed header may contain + * several tokens. + * + * @param preprocessedHeader the preprocessed header + * @return the true header + */ + private String extractHeader(String preprocessedHeader) { + Matcher matcher = KEYWORD_PATTERN.matcher(preprocessedHeader); + + if (matcher.find()) { + return matcher.group(1); + } + + return null; + } + + /** + * Preprocess the body to replace keywords with their replacement if they are aliased. + * @param bodyText the body text + * @return the preprocessed body text + */ + private String preprocessBody(String bodyText) { + StringBuilder builder = new StringBuilder(); + Matcher matcher = KEYWORD_PATTERN.matcher(bodyText); + + while (matcher.find()) { + String keyword = matcher.group(1); + String spaces = matcher.group(2); // Preserves the amount of spaces as that may be what user wants + + AliasSymbol symbol = aliasingSymbols.get(keyword); + if (symbol != null) + keyword = symbol.getRepresentation(); + + builder.append(keyword); + builder.append(spaces); + } + + return builder.toString(); } /** @@ -94,13 +164,15 @@ public CommandParser unregisterCommandParser(String header) { * * @param symbol the symbol, cannot be null. * @return true if this symbol is added successfully, false if another symbol with the same keyword - * already exists and this symbol cannot be added. + * already exists or the keyword is used by a command and this symbol cannot be added. */ public boolean addAliasSymbol(AliasSymbol symbol) { assert symbol != null; if (aliasingSymbols.containsKey(symbol.getKeyword())) return false; + if (isCommandParserRegistered(symbol.getKeyword())) + return false; aliasingSymbols.put(symbol.getKeyword(), symbol); return true; diff --git a/src/main/java/seedu/savvytasker/logic/parser/UnaliasCommandParser.java b/src/main/java/seedu/savvytasker/logic/parser/UnaliasCommandParser.java index 4e03dca70173..a770660253d7 100644 --- a/src/main/java/seedu/savvytasker/logic/parser/UnaliasCommandParser.java +++ b/src/main/java/seedu/savvytasker/logic/parser/UnaliasCommandParser.java @@ -26,6 +26,11 @@ public String getHeader() { public String getRequiredFormat() { return READABLE_FORMAT; } + + @Override + public boolean shouldPreprocess() { + return false; + } @Override public UnaliasCommand parse(String commandText) throws ParseException { diff --git a/src/test/java/seedu/savvytasker/logic/parser/ParserTest.java b/src/test/java/seedu/savvytasker/logic/parser/ParserTest.java index 75726b845ccf..f9396c433ec9 100644 --- a/src/test/java/seedu/savvytasker/logic/parser/ParserTest.java +++ b/src/test/java/seedu/savvytasker/logic/parser/ParserTest.java @@ -1,451 +1,436 @@ package seedu.savvytasker.logic.parser; +import static org.junit.Assert.assertTrue; + +import java.util.Collection; + import static org.junit.Assert.assertNotEquals; -import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameters; + +import edu.emory.mathcs.backport.java.util.Arrays; +import seedu.savvytasker.logic.commands.IncorrectCommand; +import seedu.savvytasker.model.alias.AliasSymbol; +@RunWith(Parameterized.class) public class ParserTest { - private AddCommandParser addParser; - private DeleteCommandParser deleteParser; - private ModifyCommandParser modifyParser; - private ClearCommandParser clearParser; - private ListCommandParser listParser; - private FindCommandParser findParser; - private HelpCommandParser helpParser; - private ExitCommandParser exitParser; - private MarkCommandParser markParser; - private UnmarkCommandParser unmarkParser; - private UndoCommandParser undoParser; - private RedoCommandParser redoParser; - private AliasCommandParser aliasParser; - private UnaliasCommandParser unaliasParser; + private MasterParser masterParser; @Rule public ExpectedException thrown = ExpectedException.none(); - @Before - public void setup() { - addParser = new AddCommandParser(); - deleteParser = new DeleteCommandParser(); - modifyParser = new ModifyCommandParser(); - clearParser = new ClearCommandParser(); - listParser = new ListCommandParser(); - findParser = new FindCommandParser(); - helpParser = new HelpCommandParser(); - exitParser = new ExitCommandParser(); - markParser = new MarkCommandParser(); - unmarkParser = new UnmarkCommandParser(); - undoParser = new UndoCommandParser(); - redoParser = new RedoCommandParser(); - aliasParser = new AliasCommandParser(); - unaliasParser = new UnaliasCommandParser(); + public ParserTest(MasterParser masterParser) { + this.masterParser = masterParser; + } + + public static MasterParser createGenericMasterParser() { + MasterParser masterParser = new MasterParser(); + masterParser.registerCommandParser(new AddCommandParser()); + masterParser.registerCommandParser(new DeleteCommandParser()); + masterParser.registerCommandParser(new FindCommandParser()); + masterParser.registerCommandParser(new ListCommandParser()); + masterParser.registerCommandParser(new ModifyCommandParser()); + masterParser.registerCommandParser(new HelpCommandParser()); + masterParser.registerCommandParser(new ClearCommandParser()); + masterParser.registerCommandParser(new ExitCommandParser()); + masterParser.registerCommandParser(new MarkCommandParser()); + masterParser.registerCommandParser(new UnmarkCommandParser()); + masterParser.registerCommandParser(new UndoCommandParser()); + masterParser.registerCommandParser(new RedoCommandParser()); + masterParser.registerCommandParser(new AliasCommandParser()); + masterParser.registerCommandParser(new UnaliasCommandParser()); + return masterParser; + } + + @SuppressWarnings("unchecked") + @Parameters + public static Collection parameterized() { + MasterParser masterParser1 = createGenericMasterParser(); + MasterParser masterParser2 = createGenericMasterParser(); + masterParser2.addAliasSymbol(new AliasSymbol("xyz", "string of words")); + MasterParser masterParser3 = createGenericMasterParser(); + masterParser3.addAliasSymbol(new AliasSymbol("xyz", "string of words")); + masterParser3.removeAliasSymbol("xyz"); + + return Arrays.asList(new MasterParser[] { + masterParser1, + masterParser2, + masterParser3, + }); } @Test public void parse_add_reorder() throws ParseException { - assertNotEquals(addParser.parse("add task l/ comp e/ tomorrow, 3pm s/ today, 2pm n/ 2"), null); + assertNotEquals(masterParser.parse("add xyz l/ comp e/ tomorrow, 3pm s/ today, 2pm n/ 2"), null); } @Test public void parse_add_multipleSpaces() throws ParseException { - assertNotEquals(addParser.parse("add Multiple Spaces s/ 2pm"), null); + assertNotEquals(masterParser.parse("add Multiple xyz s/ 2pm"), null); } @Test public void parse_add_sameOptionMultipleTimes() throws ParseException { - thrown.expect(ParseException.class); - addParser.parse("add task s/ tomorrow 3pm s/ tomorrow 10pm"); + assertTrue(masterParser.parse("add xyz s/ tomorrow 3pm s/ tomorrow 10pm") instanceof IncorrectCommand); } @Test public void parse_add_missingTaskName() throws ParseException { - thrown.expect(ParseException.class); - addParser.parse("add s/ tomorrow 3pm"); + assertTrue(masterParser.parse("add s/ tomorrow 3pm") instanceof IncorrectCommand); } @Test public void parse_add_arbitrarySlash() throws ParseException { - thrown.expect(ParseException.class); - addParser.parse("add task s/ tomorrow 2pm/3pm e/ sunday"); + assertTrue(masterParser.parse("add xyz s/ tomorrow 2pm/3pm e/ sunday") instanceof IncorrectCommand); } @Test public void parse_add_fullValid() throws ParseException { - assertNotEquals(addParser.parse("add task s/wednesday e/thursday l/ comp p/ high r/ none n/ 1 c/ test d/ test"), null); + assertNotEquals(masterParser.parse("add xyz s/wednesday e/thursday l/ comp p/ high r/ none n/ 1 c/ test d/ test"), null); } @Test public void parse_add_invalidRecurrenceType() throws ParseException { - thrown.expect(ParseException.class); - addParser.parse("add task r/ Error "); + assertTrue(masterParser.parse("add xyz r/ Error ") instanceof IncorrectCommand); } @Test public void parse_add_invalidPriorityLevel() throws ParseException { - thrown.expect(ParseException.class); - addParser.parse("add task p/ Error "); + assertTrue(masterParser.parse("add xyz p/ Error ") instanceof IncorrectCommand); } //================================================================================== @Test public void parse_delete_noIndexSpecified() throws ParseException { - thrown.expect(ParseException.class); - deleteParser.parse("delete"); + assertTrue(masterParser.parse("delete") instanceof IncorrectCommand); } @Test public void parse_delete_oneIndex() throws ParseException { - assertNotEquals(deleteParser.parse("delete 1"), null); + assertNotEquals(masterParser.parse("delete 1"), null); } @Test public void parse_delete_multipleIndices() throws ParseException { - assertNotEquals(deleteParser.parse("delete 1 2 3"), null); + assertNotEquals(masterParser.parse("delete 1 2 3"), null); } @Test public void parse_delete_multipleSpacesIndices() throws ParseException { - assertNotEquals(deleteParser.parse("delete 1 2 3"), null); + assertNotEquals(masterParser.parse("delete 1 2 3"), null); } @Test public void parse_delete_negativeIndex() throws ParseException { - thrown.expect(ParseException.class); - deleteParser.parse("delete -1"); + assertTrue(masterParser.parse("delete -1") instanceof IncorrectCommand); } @Test public void parse_delete_zeroIndex() throws ParseException { - thrown.expect(ParseException.class); - deleteParser.parse("delete 0"); + assertTrue(masterParser.parse("delete 0") instanceof IncorrectCommand); } //================================================================================== @Test public void parse_modify_noIndex() throws ParseException { - thrown.expect(ParseException.class); - modifyParser.parse("modify t/ newtask"); + assertTrue(masterParser.parse("modify t/ newtask") instanceof IncorrectCommand); } @Test public void parse_modify_multipleIndex() throws ParseException { - thrown.expect(ParseException.class); - modifyParser.parse("modify 1 2 3 t/ newtask"); + assertTrue(masterParser.parse("modify 1 2 3 t/ xyz") instanceof IncorrectCommand); } @Test public void parse_modify_negativeIndex() throws ParseException { - thrown.expect(ParseException.class); - modifyParser.parse("modify -1 t/ newtask"); + assertTrue(masterParser.parse("modify -1 t/ newtask") instanceof IncorrectCommand); } @Test public void parse_modify_zeroIndex() throws ParseException { - thrown.expect(ParseException.class); - modifyParser.parse("modify 0 t/ newtask"); + assertTrue(masterParser.parse("modify 0 t/ newtask") instanceof IncorrectCommand); } @Test public void parse_modify_onlySpecifyIndex() throws ParseException { - assertNotEquals(modifyParser.parse("modify 1"), null); + assertNotEquals(masterParser.parse("modify 1"), null); } @Test public void parse_modify_fullValid() throws ParseException { - assertNotEquals(modifyParser.parse("modify 3 t/ newtask s/wednesday e/thursday l/ comp p/ high r/ none n/ 1 c/ test d/ test"), null); + assertNotEquals(masterParser.parse("modify 3 t/ xyz s/wednesday e/thursday l/ comp p/ high r/ none n/ 1 c/ test d/ test"), null); } @Test public void parse_modify_reorder() throws ParseException { - assertNotEquals(modifyParser.parse("modify 1 l/ comp e/ tomorrow, 3pm s/ today, 2pm n/ 2"), null); + assertNotEquals(masterParser.parse("modify 1 l/ comp e/ tomorrow, 3pm s/ today, 2pm n/ 2"), null); } @Test public void parse_modify_multipleSpaces() throws ParseException { - assertNotEquals(modifyParser.parse("modify 1 t/ Multiple Spaces s/ 2pm"), null); + assertNotEquals(masterParser.parse("modify 1 t/ Multiple Spaces s/ 2pm"), null); } //================================================================================== @Test public void parse_clear_spaces() throws ParseException { - assertNotEquals(clearParser.parse("clear "), null); + assertNotEquals(masterParser.parse("clear "), null); } @Test public void parse_clear_invalid() throws ParseException { - thrown.expect(ParseException.class); - clearParser.parse("clear 1"); + assertTrue(masterParser.parse("clear 1") instanceof IncorrectCommand); } @Test public void parse_clear_valid() throws ParseException { - assertNotEquals(clearParser.parse("clear"), null); + assertNotEquals(masterParser.parse("clear"), null); } //================================================================================== @Test public void parse_list_noParameters() throws ParseException { - assertNotEquals(listParser.parse("list"), null); + assertNotEquals(masterParser.parse("list"), null); } @Test public void parse_list_noParametersSpaces() throws ParseException { - assertNotEquals(listParser.parse("list "), null); + assertNotEquals(masterParser.parse("list "), null); } @Test public void parse_list_valid() throws ParseException { - assertNotEquals(listParser.parse("list t/ Priority Level "), null); + assertNotEquals(masterParser.parse("list t/ Priority Level "), null); } @Test public void parse_list_invalidType() throws ParseException { - thrown.expect(ParseException.class); - listParser.parse("list t/ Error "); + assertTrue(masterParser.parse("list t/ Error ") instanceof IncorrectCommand); } //================================================================================== @Test public void parse_find_noKeywords() throws ParseException { - thrown.expect(ParseException.class); - findParser.parse("find"); + assertTrue(masterParser.parse("find") instanceof IncorrectCommand); } @Test public void parse_find_noKeywordsSpaces() throws ParseException { - thrown.expect(ParseException.class); - findParser.parse("find "); + assertTrue(masterParser.parse("find ") instanceof IncorrectCommand); } @Test public void parse_find_noKeywordsButWithType() throws ParseException { - thrown.expect(ParseException.class); - findParser.parse("find t/ Exact "); + assertTrue(masterParser.parse("find t/ Exact ") instanceof IncorrectCommand); } @Test public void parse_find_invalidType() throws ParseException { - thrown.expect(ParseException.class); - findParser.parse("find t/ Error some words"); + assertTrue(masterParser.parse("find t/ Error some words") instanceof IncorrectCommand); } @Test public void parse_find_validAfter() throws ParseException { - assertNotEquals(findParser.parse("find t/ Exact this word "), null); + assertNotEquals(masterParser.parse("find t/ Exact this word "), null); } @Test public void parse_find_validBefore() throws ParseException { - assertNotEquals(findParser.parse("find some words t/ Partial "), null); + assertNotEquals(masterParser.parse("find some words t/ Partial "), null); } @Test public void parse_find_validBeforeAndAfter() throws ParseException { - assertNotEquals(findParser.parse("find some words t/ Full some words after "), null); + assertNotEquals(masterParser.parse("find some words t/ Full some words after "), null); } //================================================================================== @Test public void parse_help_spaces() throws ParseException { - assertNotEquals(helpParser.parse("help "), null); + assertNotEquals(masterParser.parse("help "), null); } @Test public void parse_help_invalid() throws ParseException { - thrown.expect(ParseException.class); - helpParser.parse("help 1"); + assertTrue(masterParser.parse("help 1") instanceof IncorrectCommand); } @Test public void parse_help_valid() throws ParseException { - assertNotEquals(helpParser.parse("help"), null); + assertNotEquals(masterParser.parse("help"), null); } //================================================================================== @Test public void parse_exit_spaces() throws ParseException { - assertNotEquals(exitParser.parse("exit "), null); + assertNotEquals(masterParser.parse("exit "), null); } @Test public void parse_exit_invalid() throws ParseException { - thrown.expect(ParseException.class); - helpParser.parse("exit 1"); + assertTrue(masterParser.parse("exit 1") instanceof IncorrectCommand); } @Test public void parse_exit_valid() throws ParseException { - assertNotEquals(exitParser.parse("exit"), null); + assertNotEquals(masterParser.parse("exit"), null); } //================================================================================== @Test public void parse_mark_noIndexSpecified() throws ParseException { - thrown.expect(ParseException.class); - markParser.parse("mark"); + assertTrue(masterParser.parse("mark") instanceof IncorrectCommand); } @Test public void parse_mark_oneIndex() throws ParseException { - assertNotEquals(markParser.parse("mark 1"), null); + assertNotEquals(masterParser.parse("mark 1"), null); } @Test public void parse_mark_multipleIndices() throws ParseException { - assertNotEquals(markParser.parse("mark 1 2 3"), null); + assertNotEquals(masterParser.parse("mark 1 2 3"), null); } @Test public void parse_mark_multipleSpacesIndices() throws ParseException { - assertNotEquals(markParser.parse("mark 1 2 3"), null); + assertNotEquals(masterParser.parse("mark 1 2 3"), null); } @Test public void parse_mark_negativeIndex() throws ParseException { - thrown.expect(ParseException.class); - markParser.parse("mark -1"); + assertTrue(masterParser.parse("mark -1") instanceof IncorrectCommand); } @Test public void parse_mark_zeroIndex() throws ParseException { - thrown.expect(ParseException.class); - markParser.parse("mark 0"); + assertTrue(masterParser.parse("mark 0") instanceof IncorrectCommand); } //================================================================================== @Test public void parse_unmark_noIndexSpecified() throws ParseException { - thrown.expect(ParseException.class); - unmarkParser.parse("unmark"); + assertTrue(masterParser.parse("unmark") instanceof IncorrectCommand); } @Test public void parse_unmark_oneIndex() throws ParseException { - assertNotEquals(unmarkParser.parse("unmark 1"), null); + assertNotEquals(masterParser.parse("unmark 1"), null); } @Test public void parse_unmark_multipleIndices() throws ParseException { - assertNotEquals(unmarkParser.parse("unmark 1 2 3"), null); + assertNotEquals(masterParser.parse("unmark 1 2 3"), null); } @Test public void parse_unmark_multipleSpacesIndices() throws ParseException { - assertNotEquals(unmarkParser.parse("unmark 1 2 3"), null); + assertNotEquals(masterParser.parse("unmark 1 2 3"), null); } @Test public void parse_unmark_negativeIndex() throws ParseException { - thrown.expect(ParseException.class); - unmarkParser.parse("unmark -1"); + assertTrue(masterParser.parse("unmark -1") instanceof IncorrectCommand); } @Test public void parse_unmark_zeroIndex() throws ParseException { - thrown.expect(ParseException.class); - unmarkParser.parse("unmark 0"); + assertTrue(masterParser.parse("unmark 0") instanceof IncorrectCommand); } //================================================================================== @Test public void parse_undo_spaces() throws ParseException { - assertNotEquals(undoParser.parse("undo "), null); + assertNotEquals(masterParser.parse("undo "), null); } @Test public void parse_undo_invalid() throws ParseException { - thrown.expect(ParseException.class); - helpParser.parse("undo 1"); + assertTrue(masterParser.parse("undo 1") instanceof IncorrectCommand); } @Test public void parse_undo_valid() throws ParseException { - assertNotEquals(undoParser.parse("undo"), null); + assertNotEquals(masterParser.parse("undo"), null); } //================================================================================== @Test public void parse_redo_spaces() throws ParseException { - assertNotEquals(redoParser.parse("redo "), null); + assertNotEquals(masterParser.parse("redo "), null); } @Test public void parse_redo_invalid() throws ParseException { - thrown.expect(ParseException.class); - helpParser.parse("redo 1"); + assertTrue(masterParser.parse("redo 1") instanceof IncorrectCommand); } @Test public void parse_redo_valid() throws ParseException { - assertNotEquals(redoParser.parse("redo"), null); + assertNotEquals(masterParser.parse("redo"), null); } //================================================================================== @Test public void parse_alias_keywordUnspecified() throws ParseException { - thrown.expect(ParseException.class); - aliasParser.parse("alias t/ a string of things"); + assertTrue(masterParser.parse("alias r/ a string of things") instanceof IncorrectCommand); } @Test public void parse_alias_textUnspecified() throws ParseException { - thrown.expect(ParseException.class); - aliasParser.parse("alias k/ xyz"); + assertTrue(masterParser.parse("alias k/ xyz") instanceof IncorrectCommand); } @Test public void parse_alias_noSwitchesSpecified() throws ParseException { - thrown.expect(ParseException.class); - aliasParser.parse("alias power overwhelming"); + assertTrue(masterParser.parse("alias power xyz") instanceof IncorrectCommand); } @Test public void parse_alias_keywordTooLong() throws ParseException { - thrown.expect(ParseException.class); - aliasParser.parse("alias k/ not a single word t/ project management"); + assertTrue(masterParser.parse("alias k/ not a single word r/ project management") instanceof IncorrectCommand); } @Test public void parse_alias_keywordEmpty() throws ParseException { - thrown.expect(ParseException.class); - aliasParser.parse("alias k/ t/ project management"); + assertTrue(masterParser.parse("alias k/ r/ project management") instanceof IncorrectCommand); } @Test public void parse_alias_textEmpty() throws ParseException { - thrown.expect(ParseException.class); - aliasParser.parse("alias k/ pjm t/ "); + assertTrue(masterParser.parse("alias k/ pjm r/ ") instanceof IncorrectCommand); } @Test public void parse_alias_fullValid() throws ParseException { - assertNotEquals(aliasParser.parse("alias k/ pjm t/ project management "), null); + assertNotEquals(masterParser.parse("alias k/ pjm r/ xyz management "), null); } //================================================================================== @Test public void parse_unalias_emptyKeyword() throws ParseException { - thrown.expect(ParseException.class); - unaliasParser.parse("unalias "); + assertTrue(masterParser.parse("unalias ") instanceof IncorrectCommand); } @Test public void parse_unalias_valid() throws ParseException { - assertNotEquals(unaliasParser.parse("unalias something "), null); + assertNotEquals(masterParser.parse("unalias something "), null); } } From 2641c574ff93f8ed709ecaf83cb8e5581ba61659 Mon Sep 17 00:00:00 2001 From: "Henry\\Henry" Date: Sun, 23 Oct 2016 21:25:20 +0800 Subject: [PATCH 08/55] Modify to MasterParser.registerCommandParser() to return boolean if registration fails, and to reject any parser with the same header as existing AliasSymbol keyword Rollback ParserTest and separated MasterParser test into its own test case Organised imports for all classes --- src/main/java/seedu/savvytasker/MainApp.java | 17 +- .../commons/core/EventsCenter.java | 4 +- .../savvytasker/commons/core/GuiSettings.java | 2 +- .../savvytasker/commons/core/LogsCenter.java | 7 +- .../core/UnmodifiableObservableList.java | 19 +- .../savvytasker/commons/core/Version.java | 6 +- .../savvytasker/commons/util/JsonUtil.java | 6 +- .../savvytasker/commons/util/XmlUtil.java | 5 +- .../java/seedu/savvytasker/logic/Logic.java | 2 - .../seedu/savvytasker/logic/LogicManager.java | 28 +- .../logic/parser/MasterParser.java | 24 +- .../seedu/savvytasker/model/ModelManager.java | 16 +- .../seedu/savvytasker/model/SavvyTasker.java | 9 +- .../savvytasker/model/task/TaskList.java | 5 +- .../savvytasker/storage/StorageManager.java | 8 +- .../savvytasker/storage/XmlFileStorage.java | 6 +- .../storage/XmlSerializableSavvyTasker.java | 10 +- .../seedu/savvytasker/ui/BrowserPanel.java | 4 +- .../java/seedu/savvytasker/ui/CommandBox.java | 7 +- .../java/seedu/savvytasker/ui/HelpWindow.java | 4 +- .../seedu/savvytasker/ui/StatusBarFooter.java | 11 +- .../seedu/savvytasker/ui/TaskListPanel.java | 4 +- .../java/seedu/savvytasker/ui/UiManager.java | 5 +- .../savvytasker/logic/parser/ParserTest.java | 299 +++++++++++------- 24 files changed, 309 insertions(+), 199 deletions(-) diff --git a/src/main/java/seedu/savvytasker/MainApp.java b/src/main/java/seedu/savvytasker/MainApp.java index 7273d2cdea21..26073d7271ad 100644 --- a/src/main/java/seedu/savvytasker/MainApp.java +++ b/src/main/java/seedu/savvytasker/MainApp.java @@ -1,6 +1,12 @@ package seedu.savvytasker; +import java.io.IOException; +import java.util.Map; +import java.util.Optional; +import java.util.logging.Logger; + import com.google.common.eventbus.Subscribe; + import javafx.application.Application; import javafx.application.Platform; import javafx.stage.Stage; @@ -14,17 +20,16 @@ import seedu.savvytasker.commons.util.StringUtil; import seedu.savvytasker.logic.Logic; import seedu.savvytasker.logic.LogicManager; -import seedu.savvytasker.model.*; +import seedu.savvytasker.model.Model; +import seedu.savvytasker.model.ModelManager; +import seedu.savvytasker.model.ReadOnlySavvyTasker; +import seedu.savvytasker.model.SavvyTasker; +import seedu.savvytasker.model.UserPrefs; import seedu.savvytasker.storage.Storage; import seedu.savvytasker.storage.StorageManager; import seedu.savvytasker.ui.Ui; import seedu.savvytasker.ui.UiManager; -import java.io.IOException; -import java.util.Map; -import java.util.Optional; -import java.util.logging.Logger; - /** * The main entry point to the application. */ diff --git a/src/main/java/seedu/savvytasker/commons/core/EventsCenter.java b/src/main/java/seedu/savvytasker/commons/core/EventsCenter.java index 02229513af8d..2fc38e500309 100644 --- a/src/main/java/seedu/savvytasker/commons/core/EventsCenter.java +++ b/src/main/java/seedu/savvytasker/commons/core/EventsCenter.java @@ -1,11 +1,11 @@ package seedu.savvytasker.commons.core; +import java.util.logging.Logger; + import com.google.common.eventbus.EventBus; import seedu.savvytasker.commons.events.BaseEvent; -import java.util.logging.Logger; - /** * Manages the event dispatching of the app. */ diff --git a/src/main/java/seedu/savvytasker/commons/core/GuiSettings.java b/src/main/java/seedu/savvytasker/commons/core/GuiSettings.java index c7bb07be54a2..70a000c20a18 100644 --- a/src/main/java/seedu/savvytasker/commons/core/GuiSettings.java +++ b/src/main/java/seedu/savvytasker/commons/core/GuiSettings.java @@ -1,6 +1,6 @@ package seedu.savvytasker.commons.core; -import java.awt.*; +import java.awt.Point; import java.io.Serializable; import java.util.Objects; diff --git a/src/main/java/seedu/savvytasker/commons/core/LogsCenter.java b/src/main/java/seedu/savvytasker/commons/core/LogsCenter.java index 67937bc7cf32..bf86bc58c263 100644 --- a/src/main/java/seedu/savvytasker/commons/core/LogsCenter.java +++ b/src/main/java/seedu/savvytasker/commons/core/LogsCenter.java @@ -1,7 +1,12 @@ package seedu.savvytasker.commons.core; import java.io.IOException; -import java.util.logging.*; +import java.util.logging.ConsoleHandler; +import java.util.logging.FileHandler; +import java.util.logging.Handler; +import java.util.logging.Level; +import java.util.logging.Logger; +import java.util.logging.SimpleFormatter; import seedu.savvytasker.commons.events.BaseEvent; diff --git a/src/main/java/seedu/savvytasker/commons/core/UnmodifiableObservableList.java b/src/main/java/seedu/savvytasker/commons/core/UnmodifiableObservableList.java index 703ec628cc12..17ca7991be01 100644 --- a/src/main/java/seedu/savvytasker/commons/core/UnmodifiableObservableList.java +++ b/src/main/java/seedu/savvytasker/commons/core/UnmodifiableObservableList.java @@ -1,18 +1,23 @@ package seedu.savvytasker.commons.core; -import javafx.beans.InvalidationListener; -import javafx.collections.ListChangeListener; -import javafx.collections.ObservableList; -import javafx.collections.transformation.FilteredList; -import javafx.collections.transformation.SortedList; - import java.text.Collator; -import java.util.*; +import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; import java.util.function.Consumer; import java.util.function.Predicate; import java.util.function.UnaryOperator; import java.util.stream.Stream; +import javafx.beans.InvalidationListener; +import javafx.collections.ListChangeListener; +import javafx.collections.ObservableList; +import javafx.collections.transformation.FilteredList; +import javafx.collections.transformation.SortedList; + /** * Unmodifiable view of an observable list */ diff --git a/src/main/java/seedu/savvytasker/commons/core/Version.java b/src/main/java/seedu/savvytasker/commons/core/Version.java index 8921bd194c43..69bd28883b19 100644 --- a/src/main/java/seedu/savvytasker/commons/core/Version.java +++ b/src/main/java/seedu/savvytasker/commons/core/Version.java @@ -1,11 +1,11 @@ package seedu.savvytasker.commons.core; -import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.annotation.JsonValue; - import java.util.regex.Matcher; import java.util.regex.Pattern; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; + /** * Represents a version with major, minor and patch number */ diff --git a/src/main/java/seedu/savvytasker/commons/util/JsonUtil.java b/src/main/java/seedu/savvytasker/commons/util/JsonUtil.java index b5c8d453273d..2b81ec5f6a93 100644 --- a/src/main/java/seedu/savvytasker/commons/util/JsonUtil.java +++ b/src/main/java/seedu/savvytasker/commons/util/JsonUtil.java @@ -1,5 +1,8 @@ package seedu.savvytasker.commons.util; +import java.io.IOException; +import java.util.logging.Level; + import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.core.JsonProcessingException; @@ -11,9 +14,6 @@ import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; -import java.io.IOException; -import java.util.logging.Level; - /** * Converts a Java object instance to JSON and vice versa */ diff --git a/src/main/java/seedu/savvytasker/commons/util/XmlUtil.java b/src/main/java/seedu/savvytasker/commons/util/XmlUtil.java index 55602db5aa63..d135fd4d51a8 100644 --- a/src/main/java/seedu/savvytasker/commons/util/XmlUtil.java +++ b/src/main/java/seedu/savvytasker/commons/util/XmlUtil.java @@ -1,11 +1,12 @@ package seedu.savvytasker.commons.util; +import java.io.File; +import java.io.FileNotFoundException; + import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; import javax.xml.bind.Unmarshaller; -import java.io.File; -import java.io.FileNotFoundException; /** * Helps with reading from and writing to XML files. diff --git a/src/main/java/seedu/savvytasker/logic/Logic.java b/src/main/java/seedu/savvytasker/logic/Logic.java index b0924fb05e34..db33308d66c6 100644 --- a/src/main/java/seedu/savvytasker/logic/Logic.java +++ b/src/main/java/seedu/savvytasker/logic/Logic.java @@ -2,8 +2,6 @@ import javafx.collections.ObservableList; import seedu.savvytasker.logic.commands.CommandResult; -import seedu.savvytasker.logic.parser.MasterParser; -import seedu.savvytasker.model.alias.AliasSymbol; import seedu.savvytasker.model.task.ReadOnlyTask; /** diff --git a/src/main/java/seedu/savvytasker/logic/LogicManager.java b/src/main/java/seedu/savvytasker/logic/LogicManager.java index bb03786c0a08..65c32d5756a7 100644 --- a/src/main/java/seedu/savvytasker/logic/LogicManager.java +++ b/src/main/java/seedu/savvytasker/logic/LogicManager.java @@ -1,23 +1,37 @@ package seedu.savvytasker.logic; +import java.util.List; +import java.util.Stack; +import java.util.logging.Logger; + +import com.google.common.eventbus.Subscribe; + import javafx.collections.ObservableList; import seedu.savvytasker.commons.core.ComponentManager; import seedu.savvytasker.commons.core.LogsCenter; import seedu.savvytasker.commons.events.model.AliasSymbolChangedEvent; import seedu.savvytasker.logic.commands.Command; import seedu.savvytasker.logic.commands.CommandResult; -import seedu.savvytasker.logic.parser.*; +import seedu.savvytasker.logic.parser.AddCommandParser; +import seedu.savvytasker.logic.parser.AliasCommandParser; +import seedu.savvytasker.logic.parser.ClearCommandParser; +import seedu.savvytasker.logic.parser.DeleteCommandParser; +import seedu.savvytasker.logic.parser.ExitCommandParser; +import seedu.savvytasker.logic.parser.FindCommandParser; +import seedu.savvytasker.logic.parser.HelpCommandParser; +import seedu.savvytasker.logic.parser.ListCommandParser; +import seedu.savvytasker.logic.parser.MarkCommandParser; +import seedu.savvytasker.logic.parser.MasterParser; +import seedu.savvytasker.logic.parser.ModifyCommandParser; +import seedu.savvytasker.logic.parser.RedoCommandParser; +import seedu.savvytasker.logic.parser.UnaliasCommandParser; +import seedu.savvytasker.logic.parser.UndoCommandParser; +import seedu.savvytasker.logic.parser.UnmarkCommandParser; import seedu.savvytasker.model.Model; import seedu.savvytasker.model.alias.AliasSymbol; import seedu.savvytasker.model.task.ReadOnlyTask; import seedu.savvytasker.storage.Storage; -import java.util.List; -import java.util.Stack; -import java.util.logging.Logger; - -import com.google.common.eventbus.Subscribe; - /** * The main LogicManager of the app. */ diff --git a/src/main/java/seedu/savvytasker/logic/parser/MasterParser.java b/src/main/java/seedu/savvytasker/logic/parser/MasterParser.java index 80d8a7f69b21..ce4eae6273d6 100644 --- a/src/main/java/seedu/savvytasker/logic/parser/MasterParser.java +++ b/src/main/java/seedu/savvytasker/logic/parser/MasterParser.java @@ -9,7 +9,6 @@ import java.util.regex.Pattern; import seedu.savvytasker.logic.commands.Command; -import seedu.savvytasker.logic.commands.HelpCommand; import seedu.savvytasker.logic.commands.IncorrectCommand; import seedu.savvytasker.model.alias.AliasSymbol; @@ -119,20 +118,29 @@ private String preprocessBody(String bodyText) { } /** - * Registers a command parser that will be used by the master parser. - * The header of this command parser must not be used by any other command parsers - * that are currently registered into the master parser. Use {@link #isCommandParserRegistered(String) - * isCommandParserRegistered } method to check if such a command parser is already registered. + * Registers a command parser that will be used by the master parser, and return true if it + * is successfully registered. The header of this command parser should not be used by any + * other registered command parsers or used by any AliasSymbol whose keyword is the registered + * with the same name, or false will be return and the parser will not be added. Use + * {@link #isCommandParserRegistered(String) isCommandParserRegistered } method to check if + * a command parser is already registered, and {@link #doesAliasSymbolExist(String) doesAliasSymbolExist} * * Parameter commandParser should not be null. * * @param commandParser the command parser + * @return true if successfully registered, false if there is an parser with the same header + * already registered or if an alias with the same keyword is previously added. */ - public void registerCommandParser(CommandParser commandParser) { + public boolean registerCommandParser(CommandParser commandParser) { assert commandParser != null; - assert commandParsers.get(commandParser.getHeader()) == null; - commandParsers.put(commandParser.getHeader(), commandParser); + if (commandParsers.containsKey(commandParser.getHeader())) + return false; + if (aliasingSymbols.containsKey(commandParser.getHeader())) + return false; + + commandParsers.put(commandParser.getHeader(), commandParser); + return true; } /** diff --git a/src/main/java/seedu/savvytasker/model/ModelManager.java b/src/main/java/seedu/savvytasker/model/ModelManager.java index 4448b123559d..abe5f205cee9 100644 --- a/src/main/java/seedu/savvytasker/model/ModelManager.java +++ b/src/main/java/seedu/savvytasker/model/ModelManager.java @@ -1,5 +1,13 @@ package seedu.savvytasker.model; +import java.util.Arrays; +import java.util.Comparator; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Set; +import java.util.logging.Logger; + import javafx.collections.transformation.FilteredList; import javafx.collections.transformation.SortedList; import seedu.savvytasker.commons.core.ComponentManager; @@ -17,14 +25,6 @@ import seedu.savvytasker.model.task.TaskList.DuplicateTaskException; import seedu.savvytasker.model.task.TaskList.TaskNotFoundException; -import java.util.Arrays; -import java.util.Comparator; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Set; -import java.util.logging.Logger; - /** * Represents the in-memory model of the savvy tasker data. * All changes to any model should be synchronized. diff --git a/src/main/java/seedu/savvytasker/model/SavvyTasker.java b/src/main/java/seedu/savvytasker/model/SavvyTasker.java index e0646448b520..fecd070b6e7e 100644 --- a/src/main/java/seedu/savvytasker/model/SavvyTasker.java +++ b/src/main/java/seedu/savvytasker/model/SavvyTasker.java @@ -1,5 +1,11 @@ package seedu.savvytasker.model; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + import javafx.collections.ObservableList; import seedu.savvytasker.model.alias.AliasSymbol; import seedu.savvytasker.model.alias.AliasSymbolList; @@ -11,9 +17,6 @@ import seedu.savvytasker.model.task.TaskList.DuplicateTaskException; import seedu.savvytasker.model.task.TaskList.TaskNotFoundException; -import java.util.*; -import java.util.stream.Collectors; - /** * Wraps all data at the savvy-tasker level * Duplicates are not allowed (by .equals comparison) diff --git a/src/main/java/seedu/savvytasker/model/task/TaskList.java b/src/main/java/seedu/savvytasker/model/task/TaskList.java index 2676e21c8539..e08a416761d7 100644 --- a/src/main/java/seedu/savvytasker/model/task/TaskList.java +++ b/src/main/java/seedu/savvytasker/model/task/TaskList.java @@ -1,11 +1,12 @@ package seedu.savvytasker.model.task; +import java.util.Iterator; +import java.util.LinkedList; + import javafx.collections.FXCollections; import javafx.collections.ObservableList; import seedu.savvytasker.commons.exceptions.DuplicateDataException; -import java.util.*; - /** * A list of tasks that enforces uniqueness between its elements and does not allow nulls. * diff --git a/src/main/java/seedu/savvytasker/storage/StorageManager.java b/src/main/java/seedu/savvytasker/storage/StorageManager.java index 5f3294212a02..5117af6e555e 100644 --- a/src/main/java/seedu/savvytasker/storage/StorageManager.java +++ b/src/main/java/seedu/savvytasker/storage/StorageManager.java @@ -1,5 +1,9 @@ package seedu.savvytasker.storage; +import java.io.IOException; +import java.util.Optional; +import java.util.logging.Logger; + import com.google.common.eventbus.Subscribe; import seedu.savvytasker.commons.core.ComponentManager; @@ -10,10 +14,6 @@ import seedu.savvytasker.model.ReadOnlySavvyTasker; import seedu.savvytasker.model.UserPrefs; -import java.io.IOException; -import java.util.Optional; -import java.util.logging.Logger; - /** * Manages storage of AddressBook data in local storage. */ diff --git a/src/main/java/seedu/savvytasker/storage/XmlFileStorage.java b/src/main/java/seedu/savvytasker/storage/XmlFileStorage.java index 69ec4b912c02..6848873f4bc6 100644 --- a/src/main/java/seedu/savvytasker/storage/XmlFileStorage.java +++ b/src/main/java/seedu/savvytasker/storage/XmlFileStorage.java @@ -1,13 +1,13 @@ package seedu.savvytasker.storage; +import java.io.File; +import java.io.FileNotFoundException; + import javax.xml.bind.JAXBException; import seedu.savvytasker.commons.exceptions.DataConversionException; import seedu.savvytasker.commons.util.XmlUtil; -import java.io.File; -import java.io.FileNotFoundException; - /** * Stores savvytasker data in an XML file */ diff --git a/src/main/java/seedu/savvytasker/storage/XmlSerializableSavvyTasker.java b/src/main/java/seedu/savvytasker/storage/XmlSerializableSavvyTasker.java index 331a2e8a5cd1..da4e0a98cc93 100644 --- a/src/main/java/seedu/savvytasker/storage/XmlSerializableSavvyTasker.java +++ b/src/main/java/seedu/savvytasker/storage/XmlSerializableSavvyTasker.java @@ -1,5 +1,10 @@ package seedu.savvytasker.storage; +import java.util.ArrayList; +import java.util.List; +import java.util.logging.Logger; +import java.util.stream.Collectors; + import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; @@ -11,11 +16,6 @@ import seedu.savvytasker.model.task.ReadOnlyTask; import seedu.savvytasker.model.task.TaskList; -import java.util.ArrayList; -import java.util.List; -import java.util.logging.Logger; -import java.util.stream.Collectors; - /** * An Immutable SavvyTasker that is serializable to XML format */ diff --git a/src/main/java/seedu/savvytasker/ui/BrowserPanel.java b/src/main/java/seedu/savvytasker/ui/BrowserPanel.java index 97c49d2ecd7f..3475f9fde5ac 100644 --- a/src/main/java/seedu/savvytasker/ui/BrowserPanel.java +++ b/src/main/java/seedu/savvytasker/ui/BrowserPanel.java @@ -1,5 +1,7 @@ package seedu.savvytasker.ui; +import java.util.logging.Logger; + import javafx.event.Event; import javafx.scene.Node; import javafx.scene.layout.AnchorPane; @@ -8,8 +10,6 @@ import seedu.savvytasker.commons.util.FxViewUtil; import seedu.savvytasker.model.task.ReadOnlyTask; -import java.util.logging.Logger; - /** * The Browser Panel of the App. */ diff --git a/src/main/java/seedu/savvytasker/ui/CommandBox.java b/src/main/java/seedu/savvytasker/ui/CommandBox.java index a33cc84f28d2..81d26932aee4 100644 --- a/src/main/java/seedu/savvytasker/ui/CommandBox.java +++ b/src/main/java/seedu/savvytasker/ui/CommandBox.java @@ -1,6 +1,9 @@ package seedu.savvytasker.ui; +import java.util.logging.Logger; + import com.google.common.eventbus.Subscribe; + import javafx.fxml.FXML; import javafx.scene.Node; import javafx.scene.control.SplitPane; @@ -11,9 +14,7 @@ import seedu.savvytasker.commons.events.ui.IncorrectCommandAttemptedEvent; import seedu.savvytasker.commons.util.FxViewUtil; import seedu.savvytasker.logic.Logic; -import seedu.savvytasker.logic.commands.*; - -import java.util.logging.Logger; +import seedu.savvytasker.logic.commands.CommandResult; public class CommandBox extends UiPart { private final Logger logger = LogsCenter.getLogger(CommandBox.class); diff --git a/src/main/java/seedu/savvytasker/ui/HelpWindow.java b/src/main/java/seedu/savvytasker/ui/HelpWindow.java index 1f5a0ba2f5e9..63df34b43afa 100644 --- a/src/main/java/seedu/savvytasker/ui/HelpWindow.java +++ b/src/main/java/seedu/savvytasker/ui/HelpWindow.java @@ -1,5 +1,7 @@ package seedu.savvytasker.ui; +import java.util.logging.Logger; + import javafx.scene.Node; import javafx.scene.Scene; import javafx.scene.layout.AnchorPane; @@ -8,8 +10,6 @@ import seedu.savvytasker.commons.core.LogsCenter; import seedu.savvytasker.commons.util.FxViewUtil; -import java.util.logging.Logger; - /** * Controller for a help page */ diff --git a/src/main/java/seedu/savvytasker/ui/StatusBarFooter.java b/src/main/java/seedu/savvytasker/ui/StatusBarFooter.java index d61565efed33..4d927f84f101 100644 --- a/src/main/java/seedu/savvytasker/ui/StatusBarFooter.java +++ b/src/main/java/seedu/savvytasker/ui/StatusBarFooter.java @@ -1,6 +1,12 @@ package seedu.savvytasker.ui; +import java.util.Date; +import java.util.logging.Logger; + +import org.controlsfx.control.StatusBar; + import com.google.common.eventbus.Subscribe; + import javafx.fxml.FXML; import javafx.scene.Node; import javafx.scene.layout.AnchorPane; @@ -10,11 +16,6 @@ import seedu.savvytasker.commons.events.model.SavvyTaskerChangedEvent; import seedu.savvytasker.commons.util.FxViewUtil; -import org.controlsfx.control.StatusBar; - -import java.util.Date; -import java.util.logging.Logger; - /** * A ui for the status bar that is displayed at the footer of the application. */ diff --git a/src/main/java/seedu/savvytasker/ui/TaskListPanel.java b/src/main/java/seedu/savvytasker/ui/TaskListPanel.java index 9556633a395d..9b10bf105c42 100644 --- a/src/main/java/seedu/savvytasker/ui/TaskListPanel.java +++ b/src/main/java/seedu/savvytasker/ui/TaskListPanel.java @@ -1,5 +1,7 @@ package seedu.savvytasker.ui; +import java.util.logging.Logger; + import javafx.application.Platform; import javafx.collections.ObservableList; import javafx.fxml.FXML; @@ -14,8 +16,6 @@ import seedu.savvytasker.commons.events.ui.TaskPanelSelectionChangedEvent; import seedu.savvytasker.model.task.ReadOnlyTask; -import java.util.logging.Logger; - /** * Panel containing the list of persons. */ diff --git a/src/main/java/seedu/savvytasker/ui/UiManager.java b/src/main/java/seedu/savvytasker/ui/UiManager.java index 0f9881b7ad5f..cd41d3a82aa1 100644 --- a/src/main/java/seedu/savvytasker/ui/UiManager.java +++ b/src/main/java/seedu/savvytasker/ui/UiManager.java @@ -1,6 +1,9 @@ package seedu.savvytasker.ui; +import java.util.logging.Logger; + import com.google.common.eventbus.Subscribe; + import javafx.application.Platform; import javafx.scene.control.Alert; import javafx.scene.control.Alert.AlertType; @@ -18,8 +21,6 @@ import seedu.savvytasker.logic.Logic; import seedu.savvytasker.model.UserPrefs; -import java.util.logging.Logger; - /** * The manager of the UI component. */ diff --git a/src/test/java/seedu/savvytasker/logic/parser/ParserTest.java b/src/test/java/seedu/savvytasker/logic/parser/ParserTest.java index f9396c433ec9..eea24cb41cab 100644 --- a/src/test/java/seedu/savvytasker/logic/parser/ParserTest.java +++ b/src/test/java/seedu/savvytasker/logic/parser/ParserTest.java @@ -1,436 +1,503 @@ package seedu.savvytasker.logic.parser; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; -import java.util.Collection; - -import static org.junit.Assert.assertNotEquals; +import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import org.junit.runners.Parameterized.Parameters; -import edu.emory.mathcs.backport.java.util.Arrays; +import seedu.savvytasker.logic.commands.AddCommand; +import seedu.savvytasker.logic.commands.Command; import seedu.savvytasker.logic.commands.IncorrectCommand; import seedu.savvytasker.model.alias.AliasSymbol; -@RunWith(Parameterized.class) public class ParserTest { - private MasterParser masterParser; + private AddCommandParser addParser; + private DeleteCommandParser deleteParser; + private ModifyCommandParser modifyParser; + private ClearCommandParser clearParser; + private ListCommandParser listParser; + private FindCommandParser findParser; + private HelpCommandParser helpParser; + private ExitCommandParser exitParser; + private MarkCommandParser markParser; + private UnmarkCommandParser unmarkParser; + private UndoCommandParser undoParser; + private RedoCommandParser redoParser; + private AliasCommandParser aliasParser; + private UnaliasCommandParser unaliasParser; @Rule public ExpectedException thrown = ExpectedException.none(); - public ParserTest(MasterParser masterParser) { - this.masterParser = masterParser; - } - - public static MasterParser createGenericMasterParser() { - MasterParser masterParser = new MasterParser(); - masterParser.registerCommandParser(new AddCommandParser()); - masterParser.registerCommandParser(new DeleteCommandParser()); - masterParser.registerCommandParser(new FindCommandParser()); - masterParser.registerCommandParser(new ListCommandParser()); - masterParser.registerCommandParser(new ModifyCommandParser()); - masterParser.registerCommandParser(new HelpCommandParser()); - masterParser.registerCommandParser(new ClearCommandParser()); - masterParser.registerCommandParser(new ExitCommandParser()); - masterParser.registerCommandParser(new MarkCommandParser()); - masterParser.registerCommandParser(new UnmarkCommandParser()); - masterParser.registerCommandParser(new UndoCommandParser()); - masterParser.registerCommandParser(new RedoCommandParser()); - masterParser.registerCommandParser(new AliasCommandParser()); - masterParser.registerCommandParser(new UnaliasCommandParser()); - return masterParser; - } - - @SuppressWarnings("unchecked") - @Parameters - public static Collection parameterized() { - MasterParser masterParser1 = createGenericMasterParser(); - MasterParser masterParser2 = createGenericMasterParser(); - masterParser2.addAliasSymbol(new AliasSymbol("xyz", "string of words")); - MasterParser masterParser3 = createGenericMasterParser(); - masterParser3.addAliasSymbol(new AliasSymbol("xyz", "string of words")); - masterParser3.removeAliasSymbol("xyz"); - - return Arrays.asList(new MasterParser[] { - masterParser1, - masterParser2, - masterParser3, - }); + @Before + public void setup() { + addParser = new AddCommandParser(); + deleteParser = new DeleteCommandParser(); + modifyParser = new ModifyCommandParser(); + clearParser = new ClearCommandParser(); + listParser = new ListCommandParser(); + findParser = new FindCommandParser(); + helpParser = new HelpCommandParser(); + exitParser = new ExitCommandParser(); + markParser = new MarkCommandParser(); + unmarkParser = new UnmarkCommandParser(); + undoParser = new UndoCommandParser(); + redoParser = new RedoCommandParser(); + aliasParser = new AliasCommandParser(); + unaliasParser = new UnaliasCommandParser(); } @Test public void parse_add_reorder() throws ParseException { - assertNotEquals(masterParser.parse("add xyz l/ comp e/ tomorrow, 3pm s/ today, 2pm n/ 2"), null); + assertNotNull(addParser.parse("add task l/ comp e/ tomorrow, 3pm s/ today, 2pm n/ 2")); } @Test public void parse_add_multipleSpaces() throws ParseException { - assertNotEquals(masterParser.parse("add Multiple xyz s/ 2pm"), null); + assertNotNull(addParser.parse("add Multiple Spaces s/ 2pm")); } @Test public void parse_add_sameOptionMultipleTimes() throws ParseException { - assertTrue(masterParser.parse("add xyz s/ tomorrow 3pm s/ tomorrow 10pm") instanceof IncorrectCommand); + thrown.expect(ParseException.class); + addParser.parse("add task s/ tomorrow 3pm s/ tomorrow 10pm"); } @Test public void parse_add_missingTaskName() throws ParseException { - assertTrue(masterParser.parse("add s/ tomorrow 3pm") instanceof IncorrectCommand); + thrown.expect(ParseException.class); + addParser.parse("add s/ tomorrow 3pm"); } @Test public void parse_add_arbitrarySlash() throws ParseException { - assertTrue(masterParser.parse("add xyz s/ tomorrow 2pm/3pm e/ sunday") instanceof IncorrectCommand); + thrown.expect(ParseException.class); + addParser.parse("add task s/ tomorrow 2pm/3pm e/ sunday"); } @Test public void parse_add_fullValid() throws ParseException { - assertNotEquals(masterParser.parse("add xyz s/wednesday e/thursday l/ comp p/ high r/ none n/ 1 c/ test d/ test"), null); + assertNotNull(addParser.parse("add task s/wednesday e/thursday l/ comp p/ high r/ none n/ 1 c/ test d/ test")); } @Test public void parse_add_invalidRecurrenceType() throws ParseException { - assertTrue(masterParser.parse("add xyz r/ Error ") instanceof IncorrectCommand); + thrown.expect(ParseException.class); + addParser.parse("add task r/ Error "); } @Test public void parse_add_invalidPriorityLevel() throws ParseException { - assertTrue(masterParser.parse("add xyz p/ Error ") instanceof IncorrectCommand); + thrown.expect(ParseException.class); + addParser.parse("add task p/ Error "); } //================================================================================== @Test public void parse_delete_noIndexSpecified() throws ParseException { - assertTrue(masterParser.parse("delete") instanceof IncorrectCommand); + thrown.expect(ParseException.class); + deleteParser.parse("delete"); } @Test public void parse_delete_oneIndex() throws ParseException { - assertNotEquals(masterParser.parse("delete 1"), null); + assertNotNull(deleteParser.parse("delete 1")); } @Test public void parse_delete_multipleIndices() throws ParseException { - assertNotEquals(masterParser.parse("delete 1 2 3"), null); + assertNotNull(deleteParser.parse("delete 1 2 3")); } @Test public void parse_delete_multipleSpacesIndices() throws ParseException { - assertNotEquals(masterParser.parse("delete 1 2 3"), null); + assertNotNull(deleteParser.parse("delete 1 2 3")); } @Test public void parse_delete_negativeIndex() throws ParseException { - assertTrue(masterParser.parse("delete -1") instanceof IncorrectCommand); + thrown.expect(ParseException.class); + deleteParser.parse("delete -1"); } @Test public void parse_delete_zeroIndex() throws ParseException { - assertTrue(masterParser.parse("delete 0") instanceof IncorrectCommand); + thrown.expect(ParseException.class); + deleteParser.parse("delete 0"); } //================================================================================== @Test public void parse_modify_noIndex() throws ParseException { - assertTrue(masterParser.parse("modify t/ newtask") instanceof IncorrectCommand); + thrown.expect(ParseException.class); + modifyParser.parse("modify t/ newtask"); } @Test public void parse_modify_multipleIndex() throws ParseException { - assertTrue(masterParser.parse("modify 1 2 3 t/ xyz") instanceof IncorrectCommand); + thrown.expect(ParseException.class); + modifyParser.parse("modify 1 2 3 t/ newtask"); } @Test public void parse_modify_negativeIndex() throws ParseException { - assertTrue(masterParser.parse("modify -1 t/ newtask") instanceof IncorrectCommand); + thrown.expect(ParseException.class); + modifyParser.parse("modify -1 t/ newtask"); } @Test public void parse_modify_zeroIndex() throws ParseException { - assertTrue(masterParser.parse("modify 0 t/ newtask") instanceof IncorrectCommand); + thrown.expect(ParseException.class); + modifyParser.parse("modify 0 t/ newtask"); } @Test public void parse_modify_onlySpecifyIndex() throws ParseException { - assertNotEquals(masterParser.parse("modify 1"), null); + assertNotNull(modifyParser.parse("modify 1")); } @Test public void parse_modify_fullValid() throws ParseException { - assertNotEquals(masterParser.parse("modify 3 t/ xyz s/wednesday e/thursday l/ comp p/ high r/ none n/ 1 c/ test d/ test"), null); + assertNotNull(modifyParser.parse("modify 3 t/ newtask s/wednesday e/thursday l/ comp p/ high r/ none n/ 1 c/ test d/ test")); } @Test public void parse_modify_reorder() throws ParseException { - assertNotEquals(masterParser.parse("modify 1 l/ comp e/ tomorrow, 3pm s/ today, 2pm n/ 2"), null); + assertNotNull(modifyParser.parse("modify 1 l/ comp e/ tomorrow, 3pm s/ today, 2pm n/ 2")); } @Test public void parse_modify_multipleSpaces() throws ParseException { - assertNotEquals(masterParser.parse("modify 1 t/ Multiple Spaces s/ 2pm"), null); + assertNotNull(modifyParser.parse("modify 1 t/ Multiple Spaces s/ 2pm")); } //================================================================================== @Test public void parse_clear_spaces() throws ParseException { - assertNotEquals(masterParser.parse("clear "), null); + assertNotNull(clearParser.parse("clear ")); } @Test public void parse_clear_invalid() throws ParseException { - assertTrue(masterParser.parse("clear 1") instanceof IncorrectCommand); + thrown.expect(ParseException.class); + clearParser.parse("clear 1"); } @Test public void parse_clear_valid() throws ParseException { - assertNotEquals(masterParser.parse("clear"), null); + assertNotNull(clearParser.parse("clear")); } //================================================================================== @Test public void parse_list_noParameters() throws ParseException { - assertNotEquals(masterParser.parse("list"), null); + assertNotNull(listParser.parse("list")); } @Test public void parse_list_noParametersSpaces() throws ParseException { - assertNotEquals(masterParser.parse("list "), null); + assertNotNull(listParser.parse("list ")); } @Test public void parse_list_valid() throws ParseException { - assertNotEquals(masterParser.parse("list t/ Priority Level "), null); + assertNotNull(listParser.parse("list t/ Priority Level ")); } @Test public void parse_list_invalidType() throws ParseException { - assertTrue(masterParser.parse("list t/ Error ") instanceof IncorrectCommand); + thrown.expect(ParseException.class); + listParser.parse("list t/ Error "); } //================================================================================== @Test public void parse_find_noKeywords() throws ParseException { - assertTrue(masterParser.parse("find") instanceof IncorrectCommand); + thrown.expect(ParseException.class); + findParser.parse("find"); } @Test public void parse_find_noKeywordsSpaces() throws ParseException { - assertTrue(masterParser.parse("find ") instanceof IncorrectCommand); + thrown.expect(ParseException.class); + findParser.parse("find "); } @Test public void parse_find_noKeywordsButWithType() throws ParseException { - assertTrue(masterParser.parse("find t/ Exact ") instanceof IncorrectCommand); + thrown.expect(ParseException.class); + findParser.parse("find t/ Exact "); } @Test public void parse_find_invalidType() throws ParseException { - assertTrue(masterParser.parse("find t/ Error some words") instanceof IncorrectCommand); + thrown.expect(ParseException.class); + findParser.parse("find t/ Error some words"); } @Test public void parse_find_validAfter() throws ParseException { - assertNotEquals(masterParser.parse("find t/ Exact this word "), null); + assertNotNull(findParser.parse("find t/ Exact this word ")); } @Test public void parse_find_validBefore() throws ParseException { - assertNotEquals(masterParser.parse("find some words t/ Partial "), null); + assertNotNull(findParser.parse("find some words t/ Partial ")); } @Test public void parse_find_validBeforeAndAfter() throws ParseException { - assertNotEquals(masterParser.parse("find some words t/ Full some words after "), null); + assertNotNull(findParser.parse("find some words t/ Full some words after ")); } //================================================================================== @Test public void parse_help_spaces() throws ParseException { - assertNotEquals(masterParser.parse("help "), null); + assertNotNull(helpParser.parse("help ")); } @Test public void parse_help_invalid() throws ParseException { - assertTrue(masterParser.parse("help 1") instanceof IncorrectCommand); + thrown.expect(ParseException.class); + helpParser.parse("help 1"); } @Test public void parse_help_valid() throws ParseException { - assertNotEquals(masterParser.parse("help"), null); + assertNotNull(helpParser.parse("help")); } //================================================================================== @Test public void parse_exit_spaces() throws ParseException { - assertNotEquals(masterParser.parse("exit "), null); + assertNotNull(exitParser.parse("exit ")); } @Test public void parse_exit_invalid() throws ParseException { - assertTrue(masterParser.parse("exit 1") instanceof IncorrectCommand); + thrown.expect(ParseException.class); + helpParser.parse("exit 1"); } @Test public void parse_exit_valid() throws ParseException { - assertNotEquals(masterParser.parse("exit"), null); + assertNotNull(exitParser.parse("exit")); } //================================================================================== @Test public void parse_mark_noIndexSpecified() throws ParseException { - assertTrue(masterParser.parse("mark") instanceof IncorrectCommand); + thrown.expect(ParseException.class); + markParser.parse("mark"); } @Test public void parse_mark_oneIndex() throws ParseException { - assertNotEquals(masterParser.parse("mark 1"), null); + assertNotNull(markParser.parse("mark 1")); } @Test public void parse_mark_multipleIndices() throws ParseException { - assertNotEquals(masterParser.parse("mark 1 2 3"), null); + assertNotNull(markParser.parse("mark 1 2 3")); } @Test public void parse_mark_multipleSpacesIndices() throws ParseException { - assertNotEquals(masterParser.parse("mark 1 2 3"), null); + assertNotNull(markParser.parse("mark 1 2 3")); } @Test public void parse_mark_negativeIndex() throws ParseException { - assertTrue(masterParser.parse("mark -1") instanceof IncorrectCommand); + thrown.expect(ParseException.class); + markParser.parse("mark -1"); } @Test public void parse_mark_zeroIndex() throws ParseException { - assertTrue(masterParser.parse("mark 0") instanceof IncorrectCommand); + thrown.expect(ParseException.class); + markParser.parse("mark 0"); } //================================================================================== @Test public void parse_unmark_noIndexSpecified() throws ParseException { - assertTrue(masterParser.parse("unmark") instanceof IncorrectCommand); + thrown.expect(ParseException.class); + unmarkParser.parse("unmark"); } @Test public void parse_unmark_oneIndex() throws ParseException { - assertNotEquals(masterParser.parse("unmark 1"), null); + assertNotNull(unmarkParser.parse("unmark 1")); } @Test public void parse_unmark_multipleIndices() throws ParseException { - assertNotEquals(masterParser.parse("unmark 1 2 3"), null); + assertNotNull(unmarkParser.parse("unmark 1 2 3")); } @Test public void parse_unmark_multipleSpacesIndices() throws ParseException { - assertNotEquals(masterParser.parse("unmark 1 2 3"), null); + assertNotNull(unmarkParser.parse("unmark 1 2 3")); } @Test public void parse_unmark_negativeIndex() throws ParseException { - assertTrue(masterParser.parse("unmark -1") instanceof IncorrectCommand); + thrown.expect(ParseException.class); + unmarkParser.parse("unmark -1"); } @Test public void parse_unmark_zeroIndex() throws ParseException { - assertTrue(masterParser.parse("unmark 0") instanceof IncorrectCommand); + thrown.expect(ParseException.class); + unmarkParser.parse("unmark 0"); } //================================================================================== @Test public void parse_undo_spaces() throws ParseException { - assertNotEquals(masterParser.parse("undo "), null); + assertNotNull(undoParser.parse("undo ")); } @Test public void parse_undo_invalid() throws ParseException { - assertTrue(masterParser.parse("undo 1") instanceof IncorrectCommand); + thrown.expect(ParseException.class); + helpParser.parse("undo 1"); } @Test public void parse_undo_valid() throws ParseException { - assertNotEquals(masterParser.parse("undo"), null); + assertNotNull(undoParser.parse("undo")); } //================================================================================== @Test public void parse_redo_spaces() throws ParseException { - assertNotEquals(masterParser.parse("redo "), null); + assertNotNull(redoParser.parse("redo ")); } @Test public void parse_redo_invalid() throws ParseException { - assertTrue(masterParser.parse("redo 1") instanceof IncorrectCommand); + thrown.expect(ParseException.class); + helpParser.parse("redo 1"); } @Test public void parse_redo_valid() throws ParseException { - assertNotEquals(masterParser.parse("redo"), null); + assertNotNull(redoParser.parse("redo")); } //================================================================================== @Test public void parse_alias_keywordUnspecified() throws ParseException { - assertTrue(masterParser.parse("alias r/ a string of things") instanceof IncorrectCommand); + thrown.expect(ParseException.class); + aliasParser.parse("alias r/ a string of things"); } @Test public void parse_alias_textUnspecified() throws ParseException { - assertTrue(masterParser.parse("alias k/ xyz") instanceof IncorrectCommand); + thrown.expect(ParseException.class); + aliasParser.parse("alias k/ xyz"); } @Test public void parse_alias_noSwitchesSpecified() throws ParseException { - assertTrue(masterParser.parse("alias power xyz") instanceof IncorrectCommand); + thrown.expect(ParseException.class); + aliasParser.parse("alias power overwhelming"); } @Test public void parse_alias_keywordTooLong() throws ParseException { - assertTrue(masterParser.parse("alias k/ not a single word r/ project management") instanceof IncorrectCommand); + thrown.expect(ParseException.class); + aliasParser.parse("alias k/ not a single word r/ project management"); } @Test public void parse_alias_keywordEmpty() throws ParseException { - assertTrue(masterParser.parse("alias k/ r/ project management") instanceof IncorrectCommand); + thrown.expect(ParseException.class); + aliasParser.parse("alias k/ r/ project management"); } @Test public void parse_alias_textEmpty() throws ParseException { - assertTrue(masterParser.parse("alias k/ pjm r/ ") instanceof IncorrectCommand); + thrown.expect(ParseException.class); + aliasParser.parse("alias k/ pjm r/ "); } @Test public void parse_alias_fullValid() throws ParseException { - assertNotEquals(masterParser.parse("alias k/ pjm r/ xyz management "), null); + assertNotNull(aliasParser.parse("alias k/ pjm r/ project management ")); } //================================================================================== @Test public void parse_unalias_emptyKeyword() throws ParseException { - assertTrue(masterParser.parse("unalias ") instanceof IncorrectCommand); + thrown.expect(ParseException.class); + unaliasParser.parse("unalias "); } @Test public void parse_unalias_valid() throws ParseException { - assertNotEquals(masterParser.parse("unalias something "), null); + assertNotNull(unaliasParser.parse("unalias something ")); + } + + //================================================================================== + + @Test + public void parse_master_subparser() throws ParseException { + MasterParser parser = new MasterParser(); + parser.registerCommandParser(new AddCommandParser()); + assertTrue(parser.parse(" add A New Task s/ tomorrow e/ the day after tomorrow, l/ SR10 ") instanceof AddCommand); + } + + @Test + public void parse_master_subparserRemoved() throws ParseException { + MasterParser parser = new MasterParser(); + parser.registerCommandParser(new AddCommandParser()); + parser.unregisterCommandParser("add"); + assertTrue(parser.parse(" add A New Task s/ tomorrow e/ the day after tomorrow, l/ SR10 ") instanceof IncorrectCommand); + } + + @Test + public void parse_master_alias() throws ParseException { + MasterParser parser = new MasterParser(); + parser.registerCommandParser(new AddCommandParser()); + parser.addAliasSymbol(new AliasSymbol("xyz", "add A New Task")); + parser.addAliasSymbol(new AliasSymbol("pqr", "s/ tomorrow e/ 30 september 3pm")); + assertTrue(parser.parse("xyz pqr") instanceof AddCommand); + } + + @Test + public void parse_master_invalidAlias() throws ParseException { + MasterParser parser = new MasterParser(); + parser.registerCommandParser(new AddCommandParser()); + assertFalse(parser.addAliasSymbol(new AliasSymbol("add", "add A New Task"))); + } + + @Test + public void parse_master_removedAlias() throws ParseException { + MasterParser parser = new MasterParser(); + parser.registerCommandParser(new AddCommandParser()); + parser.addAliasSymbol(new AliasSymbol("xyz", "add A New Task")); + parser.removeAliasSymbol("xyz"); + assertTrue(parser.parse("xyz pqr") instanceof IncorrectCommand); } } From 35217da2f36936253edb4d14158da8810bfa2572 Mon Sep 17 00:00:00 2001 From: tet54 Date: Mon, 24 Oct 2016 17:03:22 +0800 Subject: [PATCH 09/55] Established structure for undo and redo, missing inverse commands for each undoable operation --- .project | 2 +- .../seedu/savvytasker/logic/LogicManager.java | 72 ++++++++++++++++++- .../logic/commands/AddCommand.java | 23 +++++- .../logic/commands/AliasCommand.java | 17 +++++ .../logic/commands/ClearCommand.java | 18 +++++ .../savvytasker/logic/commands/Command.java | 12 ++++ .../logic/commands/DeleteCommand.java | 19 ++++- .../logic/commands/ExitCommand.java | 17 +++++ .../logic/commands/FindCommand.java | 17 +++++ .../logic/commands/HelpCommand.java | 18 +++++ .../logic/commands/IncorrectCommand.java | 19 ++++- .../logic/commands/ListCommand.java | 19 +++++ .../logic/commands/MarkCommand.java | 18 +++++ .../logic/commands/ModifyCommand.java | 19 ++++- .../logic/commands/RedoCommand.java | 21 +++++- .../logic/commands/SelectCommand.java | 18 +++++ .../logic/commands/UnaliasCommand.java | 18 +++++ .../logic/commands/UndoCommand.java | 21 +++++- .../logic/commands/UnmarkCommand.java | 18 +++++ 19 files changed, 374 insertions(+), 12 deletions(-) diff --git a/.project b/.project index 1c9339c5f927..6692e9c722f6 100644 --- a/.project +++ b/.project @@ -1,6 +1,6 @@ - addressbook-level4 + main Project addressbook-level4 created by Buildship. diff --git a/src/main/java/seedu/savvytasker/logic/LogicManager.java b/src/main/java/seedu/savvytasker/logic/LogicManager.java index 65c32d5756a7..986a04d4a99c 100644 --- a/src/main/java/seedu/savvytasker/logic/LogicManager.java +++ b/src/main/java/seedu/savvytasker/logic/LogicManager.java @@ -61,7 +61,18 @@ public CommandResult execute(String commandText) { command.setLogic(this); CommandResult result = command.execute(); - if (command.canUndo()) { + + if (command.isUndo()){ + if (!undo()) { + result = new CommandResult("Cannot Undo"); + } + } + else if (command.isRedo()){ + if (!redo()) { + result = new CommandResult("Cannot Redo"); + } + } + else if (command.canUndo()){ undoStack.push(command); redoStack.clear(); } @@ -109,6 +120,63 @@ private boolean undo() { } return undone; + + /* + undone = false; + + if (!undoStack.isEmpty()) { + String commandText = undoStack.pop(); + String commandType[] = commandText.split(" "); + + if (commandType[0].equals("add")) { + String commandTextInverse = new String("delete " + model.getFilteredTaskList().size()); //TODO: can only undo after add at end of list + Command commandInverse = parser.parse(commandTextInverse); + commandInverse.setData(model); + CommandResult tempResult = commandInverse.execute(); + } + else if (commandType[0].equals("delete")){ + String commandTextInverse = new String("add" + " " + "temporary task"); //TODO: need to find details + Command commandInverse = parser.parse(commandTextInverse); + commandInverse.setData(model); + CommandResult tempResult = commandInverse.execute(); + } + else if (commandType[0].equals("modify")){ + String commandTextInverse = new String("modify" + " " + commandType[0]); //TODO: need to find original + Command commandInverse = parser.parse(commandTextInverse); + commandInverse.setData(model); + CommandResult tempResult = commandInverse.execute(); + } + else if (commandType[0].equals("alias")){ + String commandTextInverse = new String("unalias" + " " + commandType[2]); + Command commandInverse = parser.parse(commandTextInverse); + commandInverse.setData(model); + CommandResult tempResult = commandInverse.execute(); + } + else if (commandType[0].equals("unalias")){ + String commandTextInverse = new String("alias" + " " + commandType[0] + " " + commandType[1]); //TODO: need to find keyword + Command commandInverse = parser.parse(commandTextInverse); + commandInverse.setData(model); + CommandResult tempResult = commandInverse.execute(); + } + else if (commandType[0].equals("mark")){ + String commandTextInverse = new String("unmark" + " " + commandType[1]); + Command commandInverse = parser.parse(commandTextInverse); + commandInverse.setData(model); + CommandResult tempResult = commandInverse.execute(); + } + else if (commandType[0].equals("unmark")){ + String commandTextInverse = new String("mark" + " " + commandType[1]); + Command commandInverse = parser.parse(commandTextInverse); + commandInverse.setData(model); + CommandResult tempResult = commandInverse.execute(); + } + //command.undo(); + redoStack.push(commandText); + undone = true; + } + return undone; + + */ } private boolean redo() { @@ -116,7 +184,7 @@ private boolean redo() { if (!redoStack.isEmpty()) { Command command = redoStack.pop(); - command.redo(); + command.execute(); undoStack.push(command); redone = true; } diff --git a/src/main/java/seedu/savvytasker/logic/commands/AddCommand.java b/src/main/java/seedu/savvytasker/logic/commands/AddCommand.java index f76eb8687fa9..6288c155a24e 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/AddCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/AddCommand.java @@ -68,8 +68,27 @@ public boolean redo() { */ @Override public boolean undo() { - // TODO Auto-generated method stub + + System.out.println("entered undo!! in add"); + + return false; + } + + /** + * Check if command is an undo command + * @return true if the command is an undo operation, false otherwise + */ + @Override + public boolean isUndo() { + return false; + } + + /** + * Check if command is a redo command + * @return true if the command is a redo operation, false otherwise + */ + @Override + public boolean isRedo(){ return false; } - } diff --git a/src/main/java/seedu/savvytasker/logic/commands/AliasCommand.java b/src/main/java/seedu/savvytasker/logic/commands/AliasCommand.java index f8081cc4cd69..1ba60e0dee87 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/AliasCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/AliasCommand.java @@ -80,4 +80,21 @@ public boolean undo() { return false; } + /** + * Check if command is an undo command + * @return true if the command is an undo operation, false otherwise + */ + @Override + public boolean isUndo() { + return false; + } + + /** + * Check if command is a redo command + * @return true if the command is a redo operation, false otherwise + */ + @Override + public boolean isRedo(){ + return false; + } } diff --git a/src/main/java/seedu/savvytasker/logic/commands/ClearCommand.java b/src/main/java/seedu/savvytasker/logic/commands/ClearCommand.java index d25ff1860465..5a478e827d80 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/ClearCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/ClearCommand.java @@ -44,4 +44,22 @@ public boolean undo() { // nothing required to be done return true; } + + /** + * Check if command is an undo command + * @return true if the command is an undo operation, false otherwise + */ + @Override + public boolean isUndo() { + return false; + } + + /** + * Check if command is a redo command + * @return true if the command is a redo operation, false otherwise + */ + @Override + public boolean isRedo(){ + return false; + } } diff --git a/src/main/java/seedu/savvytasker/logic/commands/Command.java b/src/main/java/seedu/savvytasker/logic/commands/Command.java index 8820316acaec..251dbcc4423d 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/Command.java +++ b/src/main/java/seedu/savvytasker/logic/commands/Command.java @@ -65,4 +65,16 @@ protected void indicateAttemptToExecuteIncorrectCommand() { * @return true if the operation completed successfully, false otherwise */ public abstract boolean undo(); + + /** + * Check if command is an undo command + * @return true if the command is an undo operation, false otherwise + */ + public abstract boolean isUndo(); + + /** + * Check if command is a redo command + * @return true if the command is a redo operation, false otherwise + */ + public abstract boolean isRedo(); } diff --git a/src/main/java/seedu/savvytasker/logic/commands/DeleteCommand.java b/src/main/java/seedu/savvytasker/logic/commands/DeleteCommand.java index fae540e50188..ac7f03330e30 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/DeleteCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/DeleteCommand.java @@ -82,5 +82,22 @@ public boolean undo() { // nothing required to be done return true; } - + + /** + * Check if command is an undo command + * @return true if the command is an undo operation, false otherwise + */ + @Override + public boolean isUndo() { + return false; + } + + /** + * Check if command is a redo command + * @return true if the command is a redo operation, false otherwise + */ + @Override + public boolean isRedo(){ + return false; + } } diff --git a/src/main/java/seedu/savvytasker/logic/commands/ExitCommand.java b/src/main/java/seedu/savvytasker/logic/commands/ExitCommand.java index 7283c3f76980..249999aa5751 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/ExitCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/ExitCommand.java @@ -45,4 +45,21 @@ public boolean undo() { return true; } + /** + * Check if command is an undo command + * @return true if the command is an undo operation, false otherwise + */ + @Override + public boolean isUndo() { + return false; + } + + /** + * Check if command is a redo command + * @return true if the command is a redo operation, false otherwise + */ + @Override + public boolean isRedo(){ + return false; + } } diff --git a/src/main/java/seedu/savvytasker/logic/commands/FindCommand.java b/src/main/java/seedu/savvytasker/logic/commands/FindCommand.java index 4d27df864e52..1acb1f8f4c84 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/FindCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/FindCommand.java @@ -61,4 +61,21 @@ public boolean undo() { return true; } + /** + * Check if command is an undo command + * @return true if the command is an undo operation, false otherwise + */ + @Override + public boolean isUndo() { + return false; + } + + /** + * Check if command is a redo command + * @return true if the command is a redo operation, false otherwise + */ + @Override + public boolean isRedo(){ + return false; + } } diff --git a/src/main/java/seedu/savvytasker/logic/commands/HelpCommand.java b/src/main/java/seedu/savvytasker/logic/commands/HelpCommand.java index 7969b3f5500f..fad3326ca80e 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/HelpCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/HelpCommand.java @@ -48,4 +48,22 @@ public boolean undo() { // nothing required to be done return true; } + + /** + * Check if command is an undo command + * @return true if the command is an undo operation, false otherwise + */ + @Override + public boolean isUndo() { + return false; + } + + /** + * Check if command is a redo command + * @return true if the command is a redo operation, false otherwise + */ + @Override + public boolean isRedo(){ + return false; + } } diff --git a/src/main/java/seedu/savvytasker/logic/commands/IncorrectCommand.java b/src/main/java/seedu/savvytasker/logic/commands/IncorrectCommand.java index aefb1024f989..2eaa4e940c43 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/IncorrectCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/IncorrectCommand.java @@ -43,6 +43,23 @@ public boolean undo() { // nothing required to be done return true; } - + + /** + * Check if command is an undo command + * @return true if the command is an undo operation, false otherwise + */ + @Override + public boolean isUndo() { + return false; + } + + /** + * Check if command is a redo command + * @return true if the command is a redo operation, false otherwise + */ + @Override + public boolean isRedo(){ + return false; + } } diff --git a/src/main/java/seedu/savvytasker/logic/commands/ListCommand.java b/src/main/java/seedu/savvytasker/logic/commands/ListCommand.java index 7db5f8679e92..822d92fba13f 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/ListCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/ListCommand.java @@ -78,4 +78,23 @@ public boolean undo() { // nothing required to be done return true; } + + /** + * Check if command is an undo command + * @return true if the command is an undo operation, false otherwise + */ + @Override + public boolean isUndo() { + return false; + } + + /** + * Check if command is a redo command + * @return true if the command is a redo operation, false otherwise + */ + @Override + public boolean isRedo(){ + return false; + } } + diff --git a/src/main/java/seedu/savvytasker/logic/commands/MarkCommand.java b/src/main/java/seedu/savvytasker/logic/commands/MarkCommand.java index 017c43a3b06c..c87eea143afb 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/MarkCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/MarkCommand.java @@ -25,4 +25,22 @@ public boolean undo() { // TODO Auto-generated method stub return false; } + + /** + * Check if command is an undo command + * @return true if the command is an undo operation, false otherwise + */ + @Override + public boolean isUndo() { + return false; + } + + /** + * Check if command is a redo command + * @return true if the command is a redo operation, false otherwise + */ + @Override + public boolean isRedo(){ + return false; + } } diff --git a/src/main/java/seedu/savvytasker/logic/commands/ModifyCommand.java b/src/main/java/seedu/savvytasker/logic/commands/ModifyCommand.java index 802f5dd5420b..787f427b8c59 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/ModifyCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/ModifyCommand.java @@ -80,5 +80,22 @@ public boolean undo() { // TODO Auto-generated method stub return false; } - + + /** + * Check if command is an undo command + * @return true if the command is an undo operation, false otherwise + */ + @Override + public boolean isUndo() { + return false; + } + + /** + * Check if command is a redo command + * @return true if the command is a redo operation, false otherwise + */ + @Override + public boolean isRedo(){ + return false; + } } diff --git a/src/main/java/seedu/savvytasker/logic/commands/RedoCommand.java b/src/main/java/seedu/savvytasker/logic/commands/RedoCommand.java index 61f927e24cc5..ea9d329ca51e 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/RedoCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/RedoCommand.java @@ -7,7 +7,7 @@ public class RedoCommand extends Command { public static final String COMMAND_WORD = "redo"; - public static final String MESSAGE_REDO_ACKNOWLEDGEMENT = "Redo last command as requested ..."; + public static final String MESSAGE_REDO_ACKNOWLEDGEMENT = "Last command redone"; public RedoCommand() {} @@ -40,5 +40,22 @@ public boolean undo() { // nothing required to be done return true; } - + + /** + * Check if command is an undo command + * @return true if the command is an undo operation, false otherwise + */ + @Override + public boolean isUndo() { + return false; + } + + /** + * Check if command is a redo command + * @return true if the command is a redo operation, false otherwise + */ + @Override + public boolean isRedo(){ + return true; + } } diff --git a/src/main/java/seedu/savvytasker/logic/commands/SelectCommand.java b/src/main/java/seedu/savvytasker/logic/commands/SelectCommand.java index 69b3429d5bd1..36c4c9e5f67d 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/SelectCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/SelectCommand.java @@ -65,4 +65,22 @@ public boolean undo() { // nothing required to be done return true; } + + /** + * Check if command is an undo command + * @return true if the command is an undo operation, false otherwise + */ + @Override + public boolean isUndo() { + return false; + } + + /** + * Check if command is a redo command + * @return true if the command is a redo operation, false otherwise + */ + @Override + public boolean isRedo(){ + return false; + } } diff --git a/src/main/java/seedu/savvytasker/logic/commands/UnaliasCommand.java b/src/main/java/seedu/savvytasker/logic/commands/UnaliasCommand.java index 788579802c5d..48128a0e3251 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/UnaliasCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/UnaliasCommand.java @@ -77,5 +77,23 @@ public boolean undo() { // TODO Auto-generated method stub return false; } + + /** + * Check if command is an undo command + * @return true if the command is an undo operation, false otherwise + */ + @Override + public boolean isUndo() { + return false; + } + + /** + * Check if command is a redo command + * @return true if the command is a redo operation, false otherwise + */ + @Override + public boolean isRedo(){ + return false; + } } diff --git a/src/main/java/seedu/savvytasker/logic/commands/UndoCommand.java b/src/main/java/seedu/savvytasker/logic/commands/UndoCommand.java index 12dce4a507fa..f0b8458a01e2 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/UndoCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/UndoCommand.java @@ -7,7 +7,7 @@ public class UndoCommand extends Command { public static final String COMMAND_WORD = "undo"; - public static final String MESSAGE_UNDO_ACKNOWLEDGEMENT = "Undo last command as requested ..."; + public static final String MESSAGE_UNDO_ACKNOWLEDGEMENT = "Last command undone"; public UndoCommand() {} @@ -40,5 +40,22 @@ public boolean undo() { // nothing required to be done return true; } - + + /** + * Check if command is an undo command + * @return true if the command is an undo operation, false otherwise + */ + @Override + public boolean isUndo() { + return true; + } + + /** + * Check if command is a redo command + * @return true if the command is a redo operation, false otherwise + */ + @Override + public boolean isRedo(){ + return false; + } } diff --git a/src/main/java/seedu/savvytasker/logic/commands/UnmarkCommand.java b/src/main/java/seedu/savvytasker/logic/commands/UnmarkCommand.java index cb731bc89bc2..435ade613f55 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/UnmarkCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/UnmarkCommand.java @@ -25,4 +25,22 @@ public boolean undo() { // TODO Auto-generated method stub return false; } + + /** + * Check if command is an undo command + * @return true if the command is an undo operation, false otherwise + */ + @Override + public boolean isUndo() { + return false; + } + + /** + * Check if command is a redo command + * @return true if the command is a redo operation, false otherwise + */ + @Override + public boolean isRedo(){ + return false; + } } From 242f09cedeba515d9b5ab989e0864af101225989 Mon Sep 17 00:00:00 2001 From: tet54 Date: Mon, 24 Oct 2016 17:27:56 +0800 Subject: [PATCH 10/55] Undo for Add Command implemented --- .../logic/commands/AddCommand.java | 19 +++++++++++++++++-- .../java/seedu/savvytasker/model/Model.java | 5 ++++- .../seedu/savvytasker/model/ModelManager.java | 5 +++++ 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/src/main/java/seedu/savvytasker/logic/commands/AddCommand.java b/src/main/java/seedu/savvytasker/logic/commands/AddCommand.java index 6288c155a24e..c93b53818c2a 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/AddCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/AddCommand.java @@ -1,8 +1,14 @@ package seedu.savvytasker.logic.commands; +import java.util.LinkedList; + +import seedu.savvytasker.commons.core.Messages; +import seedu.savvytasker.commons.core.UnmodifiableObservableList; import seedu.savvytasker.logic.commands.models.AddCommandModel; +import seedu.savvytasker.model.task.ReadOnlyTask; import seedu.savvytasker.model.task.Task; import seedu.savvytasker.model.task.TaskList.DuplicateTaskException; +import seedu.savvytasker.model.task.TaskList.TaskNotFoundException; /** * Adds a person to the address book. @@ -68,9 +74,18 @@ public boolean redo() { */ @Override public boolean undo() { + UnmodifiableObservableList lastShownList = model.getFilteredTaskListTask(); - System.out.println("entered undo!! in add"); - + for (int i = 0; i < lastShownList.size(); i++) { + if (lastShownList.get(i) == toAdd){ + ReadOnlyTask taskToDelete = lastShownList.get(i); + try { + model.deleteTask(taskToDelete); + } catch (TaskNotFoundException e) { + e.printStackTrace(); + } + } + } return false; } diff --git a/src/main/java/seedu/savvytasker/model/Model.java b/src/main/java/seedu/savvytasker/model/Model.java index aa1c28f0c73c..bdae2ca65d39 100644 --- a/src/main/java/seedu/savvytasker/model/Model.java +++ b/src/main/java/seedu/savvytasker/model/Model.java @@ -31,8 +31,11 @@ public interface Model { * */ void addTask(Task task) throws DuplicateTaskException; - /** Returns the filtered task list as an {@code UnmodifiableObservableList} */ + /** Returns the filtered task list as an {@code UnmodifiableObservableList} */ UnmodifiableObservableList getFilteredTaskList(); + + /** Returns the filtered task list as an {@code UnmodifiableObservableList} */ + UnmodifiableObservableList getFilteredTaskListTask(); /** Updates the filter of the filtered task list to show all active tasks sorted by due date */ void updateFilteredListToShowActiveSortedByDueDate(); diff --git a/src/main/java/seedu/savvytasker/model/ModelManager.java b/src/main/java/seedu/savvytasker/model/ModelManager.java index abe5f205cee9..457722708f87 100644 --- a/src/main/java/seedu/savvytasker/model/ModelManager.java +++ b/src/main/java/seedu/savvytasker/model/ModelManager.java @@ -128,6 +128,11 @@ public synchronized void removeAliasSymbol(AliasSymbol symbol) throws SymbolKeyw public UnmodifiableObservableList getFilteredTaskList() { return new UnmodifiableObservableList(sortedAndFilteredTasks); } + + @Override + public UnmodifiableObservableList getFilteredTaskListTask() { + return new UnmodifiableObservableList(sortedAndFilteredTasks); + } @Override public void updateFilteredListToShowActiveSortedByDueDate() { From 82f3acf1a4968b56c827f868f359ec325271db54 Mon Sep 17 00:00:00 2001 From: tet54 Date: Mon, 24 Oct 2016 20:43:18 +0800 Subject: [PATCH 11/55] Implemented Undo for AliasCommand --- .../savvytasker/logic/commands/AddCommand.java | 3 ++- .../logic/commands/AliasCommand.java | 17 +++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/main/java/seedu/savvytasker/logic/commands/AddCommand.java b/src/main/java/seedu/savvytasker/logic/commands/AddCommand.java index c93b53818c2a..b9797651996a 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/AddCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/AddCommand.java @@ -74,6 +74,7 @@ public boolean redo() { */ @Override public boolean undo() { + UnmodifiableObservableList lastShownList = model.getFilteredTaskListTask(); for (int i = 0; i < lastShownList.size(); i++) { @@ -85,7 +86,7 @@ public boolean undo() { e.printStackTrace(); } } - } + } return false; } diff --git a/src/main/java/seedu/savvytasker/logic/commands/AliasCommand.java b/src/main/java/seedu/savvytasker/logic/commands/AliasCommand.java index 1ba60e0dee87..684ea1f98638 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/AliasCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/AliasCommand.java @@ -4,6 +4,7 @@ import seedu.savvytasker.logic.commands.models.AliasCommandModel; import seedu.savvytasker.model.alias.AliasSymbol; import seedu.savvytasker.model.alias.DuplicateSymbolKeywordException; +import seedu.savvytasker.model.alias.SymbolKeywordNotFoundException; /** * Command to create aliases @@ -77,6 +78,22 @@ public boolean redo() { @Override public boolean undo() { // TODO Auto-generated method stub + + assert model != null; + + AliasSymbol toRemove = null; + for(AliasSymbol symbol : model.getSavvyTasker().getReadOnlyListOfAliasSymbols()) { + if (symbol.getKeyword().equals(this.commandModel.getKeyword())) { + toRemove = symbol; + break; + } + } + try { + model.removeAliasSymbol(toRemove); + } catch (SymbolKeywordNotFoundException e) { + e.printStackTrace(); + } + return false; } From 8ca6b2eea7ddacdd27a4a782f3a57a957c293e67 Mon Sep 17 00:00:00 2001 From: tet54 Date: Mon, 24 Oct 2016 23:50:18 +0800 Subject: [PATCH 12/55] Implemented redo for Delete and undo for Unalias --- .../seedu/savvytasker/logic/LogicManager.java | 2 +- .../logic/commands/AddCommand.java | 5 +--- .../logic/commands/DeleteCommand.java | 30 ++++++++++++++++--- .../logic/commands/UnaliasCommand.java | 16 ++++++++-- 4 files changed, 41 insertions(+), 12 deletions(-) diff --git a/src/main/java/seedu/savvytasker/logic/LogicManager.java b/src/main/java/seedu/savvytasker/logic/LogicManager.java index 986a04d4a99c..02fdc428865b 100644 --- a/src/main/java/seedu/savvytasker/logic/LogicManager.java +++ b/src/main/java/seedu/savvytasker/logic/LogicManager.java @@ -184,7 +184,7 @@ private boolean redo() { if (!redoStack.isEmpty()) { Command command = redoStack.pop(); - command.execute(); + command.redo(); undoStack.push(command); redone = true; } diff --git a/src/main/java/seedu/savvytasker/logic/commands/AddCommand.java b/src/main/java/seedu/savvytasker/logic/commands/AddCommand.java index b9797651996a..7e7f274f42e2 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/AddCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/AddCommand.java @@ -1,8 +1,5 @@ package seedu.savvytasker.logic.commands; -import java.util.LinkedList; - -import seedu.savvytasker.commons.core.Messages; import seedu.savvytasker.commons.core.UnmodifiableObservableList; import seedu.savvytasker.logic.commands.models.AddCommandModel; import seedu.savvytasker.model.task.ReadOnlyTask; @@ -64,7 +61,7 @@ public boolean canUndo() { */ @Override public boolean redo() { - // TODO Auto-generated method stub + execute(); return false; } diff --git a/src/main/java/seedu/savvytasker/logic/commands/DeleteCommand.java b/src/main/java/seedu/savvytasker/logic/commands/DeleteCommand.java index ac7f03330e30..7321a6caeb59 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/DeleteCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/DeleteCommand.java @@ -6,6 +6,8 @@ import seedu.savvytasker.commons.core.UnmodifiableObservableList; import seedu.savvytasker.logic.commands.models.DeleteCommandModel; import seedu.savvytasker.model.task.ReadOnlyTask; +import seedu.savvytasker.model.task.Task; +import seedu.savvytasker.model.task.TaskList.DuplicateTaskException; import seedu.savvytasker.model.task.TaskList.TaskNotFoundException; /** @@ -24,10 +26,12 @@ public class DeleteCommand extends ModelRequiringCommand { public static final String MESSAGE_DELETE_TASK_SUCCESS = "Deleted Task: %1$s"; public final DeleteCommandModel commandModel; + private Task deleted; public DeleteCommand(DeleteCommandModel commandModel) { assert (commandModel != null); this.commandModel = commandModel; + this.deleted = null; } @@ -48,6 +52,7 @@ public CommandResult execute() { StringBuilder resultSb = new StringBuilder(); try { for(ReadOnlyTask taskToDelete : tasksToDelete) { + deleted = (Task)taskToDelete; model.deleteTask(taskToDelete); resultSb.append(String.format(MESSAGE_DELETE_TASK_SUCCESS, taskToDelete)); } @@ -60,7 +65,7 @@ public CommandResult execute() { @Override public boolean canUndo() { - return false; + return true; } /** @@ -69,7 +74,18 @@ public boolean canUndo() { */ @Override public boolean redo() { - // nothing required to be done + UnmodifiableObservableList lastShownList = model.getFilteredTaskListTask(); + + for (int i = 0; i < lastShownList.size(); i++) { + if (lastShownList.get(i) == deleted){ + ReadOnlyTask taskToDelete = lastShownList.get(i); + try { + model.deleteTask(taskToDelete); + } catch (TaskNotFoundException e) { + e.printStackTrace(); + } + } + } return true; } @@ -78,8 +94,14 @@ public boolean redo() { * @return true if the operation completed successfully, false otherwise */ @Override - public boolean undo() { - // nothing required to be done + public boolean undo() { + assert model != null; + try { + model.addTask(deleted); + } catch (DuplicateTaskException e) { + e.printStackTrace(); + } + return true; } diff --git a/src/main/java/seedu/savvytasker/logic/commands/UnaliasCommand.java b/src/main/java/seedu/savvytasker/logic/commands/UnaliasCommand.java index 48128a0e3251..c1211ed8010a 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/UnaliasCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/UnaliasCommand.java @@ -3,6 +3,7 @@ import seedu.savvytasker.commons.exceptions.IllegalValueException; import seedu.savvytasker.logic.commands.models.UnaliasCommandModel; import seedu.savvytasker.model.alias.AliasSymbol; +import seedu.savvytasker.model.alias.DuplicateSymbolKeywordException; import seedu.savvytasker.model.alias.SymbolKeywordNotFoundException; /** @@ -21,6 +22,8 @@ public class UnaliasCommand extends ModelRequiringCommand { public static final String MESSAGE_UNREGOGNIZED_ALIAS = "This alias is not in use"; private UnaliasCommandModel commandModel; + private AliasSymbol toUndo; + /** * Convenience constructor using raw values. * @@ -29,6 +32,7 @@ public class UnaliasCommand extends ModelRequiringCommand { public UnaliasCommand(UnaliasCommandModel commandModel) { assert commandModel != null; this.commandModel = commandModel; + this.toUndo = null; } @Override @@ -46,7 +50,7 @@ public CommandResult execute() { try { if (toRemove == null) return new CommandResult(MESSAGE_UNREGOGNIZED_ALIAS); - + toUndo = toRemove; model.removeAliasSymbol(toRemove); return new CommandResult(String.format(MESSAGE_SUCCESS, toRemove)); } catch (SymbolKeywordNotFoundException e) { @@ -65,7 +69,7 @@ public boolean canUndo() { */ @Override public boolean redo() { - // TODO Auto-generated method stub + execute(); return false; } /** @@ -74,7 +78,13 @@ public boolean redo() { */ @Override public boolean undo() { - // TODO Auto-generated method stub + + try { + model.addAliasSymbol(toUndo); + } catch (DuplicateSymbolKeywordException e) { + e.printStackTrace(); + } + return false; } From f9dd4e4aeae01e0f1a03f17927320e7d3b13d5af Mon Sep 17 00:00:00 2001 From: qhng Date: Tue, 25 Oct 2016 00:07:45 +0800 Subject: [PATCH 13/55] Reflect actual outputs to match expected test cases. --- .../java/seedu/savvytasker/commons/core/Messages.java | 2 +- .../savvytasker/logic/parser/DeleteCommandParser.java | 2 +- .../seedu/savvytasker/logic/parser/FindCommandParser.java | 3 ++- .../java/seedu/savvytasker/logic/parser/IndexParser.java | 3 ++- .../java/seedu/savvytasker/logic/parser/MasterParser.java | 6 +++--- .../java/seedu/savvytasker/logic/LogicManagerTest.java | 8 ++++++-- 6 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/main/java/seedu/savvytasker/commons/core/Messages.java b/src/main/java/seedu/savvytasker/commons/core/Messages.java index 4189f2b16b34..d9083d241b93 100644 --- a/src/main/java/seedu/savvytasker/commons/core/Messages.java +++ b/src/main/java/seedu/savvytasker/commons/core/Messages.java @@ -5,7 +5,7 @@ */ public class Messages { - public static final String MESSAGE_UNKNOWN_COMMAND = "Unknown command"; + public static final String MESSAGE_UNKNOWN_COMMAND = "Unknown command! \n%1$s"; public static final String MESSAGE_INVALID_COMMAND_FORMAT = "Invalid command format! \n%1$s"; public static final String MESSAGE_INVALID_TASK_DISPLAYED_INDEX = "The task index provided is invalid"; public static final String MESSAGE_TASKS_LISTED_OVERVIEW = "%1$d tasks listed!"; diff --git a/src/main/java/seedu/savvytasker/logic/parser/DeleteCommandParser.java b/src/main/java/seedu/savvytasker/logic/parser/DeleteCommandParser.java index 56762f21fd6f..6b69c94d57b2 100644 --- a/src/main/java/seedu/savvytasker/logic/parser/DeleteCommandParser.java +++ b/src/main/java/seedu/savvytasker/logic/parser/DeleteCommandParser.java @@ -45,7 +45,7 @@ private int[] parseIndices(String indicesText) throws ParseException { try { return INDEX_PARSER.parseMultiple(indicesText); } catch (ParseException ex) { - throw new ParseException(indicesText, "INDEX [MORE_INDEX]: " + ex.getFailureDetails()); + throw new ParseException(indicesText, String.format(Messages.MESSAGE_INVALID_COMMAND_FORMAT, getRequiredFormat() + ": " + ex.getFailureDetails())); } } diff --git a/src/main/java/seedu/savvytasker/logic/parser/FindCommandParser.java b/src/main/java/seedu/savvytasker/logic/parser/FindCommandParser.java index b06da2a4aa31..49ade30e3ff6 100644 --- a/src/main/java/seedu/savvytasker/logic/parser/FindCommandParser.java +++ b/src/main/java/seedu/savvytasker/logic/parser/FindCommandParser.java @@ -4,6 +4,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; +import seedu.savvytasker.commons.core.Messages; import seedu.savvytasker.logic.commands.FindCommand; import seedu.savvytasker.logic.commands.models.FindCommandModel; import seedu.savvytasker.model.task.FindType; @@ -43,7 +44,7 @@ public FindCommand parse(String commandText) throws ParseException { return new FindCommand(new FindCommandModel(findType, keywords)); } - throw new ParseException(commandText, getRequiredFormat()); + throw new ParseException(commandText, String.format(Messages.MESSAGE_INVALID_COMMAND_FORMAT, getRequiredFormat())); } private FindType parseFindType(String findTypeText) throws ParseException { diff --git a/src/main/java/seedu/savvytasker/logic/parser/IndexParser.java b/src/main/java/seedu/savvytasker/logic/parser/IndexParser.java index f5ed949c3aa8..efe41688f339 100644 --- a/src/main/java/seedu/savvytasker/logic/parser/IndexParser.java +++ b/src/main/java/seedu/savvytasker/logic/parser/IndexParser.java @@ -8,6 +8,7 @@ * they act on. */ public class IndexParser { + public static String INDEX_MUST_BE_POSITIVE = "Must be positive whole numbers."; /** * Parses a single index. * @@ -65,7 +66,7 @@ public int[] parseMultiple(String indicesText) throws ParseException { } if (parseError) - throw new ParseException(trimmedIndicesText, "Must be positive whole numbers."); + throw new ParseException(trimmedIndicesText, INDEX_MUST_BE_POSITIVE); return indices; } diff --git a/src/main/java/seedu/savvytasker/logic/parser/MasterParser.java b/src/main/java/seedu/savvytasker/logic/parser/MasterParser.java index ce4eae6273d6..e0baa0f26bd1 100644 --- a/src/main/java/seedu/savvytasker/logic/parser/MasterParser.java +++ b/src/main/java/seedu/savvytasker/logic/parser/MasterParser.java @@ -9,6 +9,7 @@ import java.util.regex.Pattern; import seedu.savvytasker.logic.commands.Command; +import seedu.savvytasker.logic.commands.HelpCommand; import seedu.savvytasker.logic.commands.IncorrectCommand; import seedu.savvytasker.model.alias.AliasSymbol; @@ -27,7 +28,7 @@ public MasterParser() { public Command parse(String userInput) { String[] pieces = preprocessInitial(userInput.trim()); if (pieces == null) - return new IncorrectCommand(userInput, MESSAGE_UNKNOWN_COMMAND); + return new IncorrectCommand(userInput, String.format(MESSAGE_INVALID_COMMAND_FORMAT, HelpCommand.MESSAGE_USAGE)); String header = pieces[0]; String body = pieces[1]; @@ -42,8 +43,7 @@ public Command parse(String userInput) { try { return parser.parse(combined); } catch (ParseException pe) { - return new IncorrectCommand(combined, String.format( - MESSAGE_INVALID_COMMAND_FORMAT, pe.getFailureDetails())); + return new IncorrectCommand(combined, String.format(pe.getFailureDetails())); } } diff --git a/src/test/java/seedu/savvytasker/logic/LogicManagerTest.java b/src/test/java/seedu/savvytasker/logic/LogicManagerTest.java index 868ec8334264..30776f5af566 100644 --- a/src/test/java/seedu/savvytasker/logic/LogicManagerTest.java +++ b/src/test/java/seedu/savvytasker/logic/LogicManagerTest.java @@ -3,6 +3,7 @@ import com.google.common.eventbus.Subscribe; import seedu.savvytasker.commons.core.EventsCenter; +import seedu.savvytasker.commons.core.Messages; import seedu.savvytasker.commons.core.UnmodifiableObservableList; import seedu.savvytasker.commons.events.model.SavvyTaskerChangedEvent; import seedu.savvytasker.commons.events.ui.JumpToListRequestEvent; @@ -10,6 +11,7 @@ import seedu.savvytasker.logic.Logic; import seedu.savvytasker.logic.LogicManager; import seedu.savvytasker.logic.commands.*; +import seedu.savvytasker.logic.parser.IndexParser; import seedu.savvytasker.model.Model; import seedu.savvytasker.model.ModelManager; import seedu.savvytasker.model.ReadOnlySavvyTasker; @@ -191,8 +193,10 @@ public void execute_add_successful() throws Exception { private void assertIncorrectIndexFormatBehaviorForCommand(String commandWord, String expectedMessage) throws Exception { assertCommandBehavior(commandWord , expectedMessage); //index missing - // Parser doesn't support these yet, skipping test case - //assertCommandBehavior(commandWord + " +1", expectedMessage); //index should be unsigned + // the following commands outputs a different expected message dealing with + // invalid indices. + expectedMessage = String.format(Messages.MESSAGE_INVALID_COMMAND_FORMAT, DeleteCommand.COMMAND_FORMAT) + ": " + IndexParser.INDEX_MUST_BE_POSITIVE; + //assertCommandBehavior(commandWord + " +1", expectedMessage); //index should be unsigned [NOT SUPPORTED] assertCommandBehavior(commandWord + " -1", expectedMessage); //index should be unsigned assertCommandBehavior(commandWord + " 0", expectedMessage); //index cannot be 0 assertCommandBehavior(commandWord + " not_a_number", expectedMessage); From 8569ef36272c4819746be55d728865cb64ba1cc2 Mon Sep 17 00:00:00 2001 From: tet54 Date: Tue, 25 Oct 2016 00:10:52 +0800 Subject: [PATCH 14/55] Implemented redo for Alias, and undo for Modify --- .../logic/commands/AliasCommand.java | 2 +- .../logic/commands/ModifyCommand.java | 21 ++++++++++++++++--- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/main/java/seedu/savvytasker/logic/commands/AliasCommand.java b/src/main/java/seedu/savvytasker/logic/commands/AliasCommand.java index 684ea1f98638..b2dad63d5e6d 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/AliasCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/AliasCommand.java @@ -68,7 +68,7 @@ public boolean canUndo() { */ @Override public boolean redo() { - // TODO Auto-generated method stub + execute(); return false; } /** diff --git a/src/main/java/seedu/savvytasker/logic/commands/ModifyCommand.java b/src/main/java/seedu/savvytasker/logic/commands/ModifyCommand.java index 787f427b8c59..5e885aa98601 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/ModifyCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/ModifyCommand.java @@ -24,12 +24,14 @@ public class ModifyCommand extends ModelRequiringCommand { public static final String MESSAGE_DUPLICATE_TASK = "This task already exists in the task list"; private final ModifyCommandModel commandModel; - + private Task originalTask; + /** * Creates an add command. */ public ModifyCommand(ModifyCommandModel commandModel) { this.commandModel = commandModel; + this.originalTask = null; } @Override @@ -48,6 +50,7 @@ public CommandResult execute() { Task replacement = new Task(taskToModify, commandModel); try { + originalTask = (Task)taskToModify; model.modifyTask(taskToModify, replacement); } catch (TaskNotFoundException e) { assert false : "The target task cannot be missing"; @@ -67,7 +70,7 @@ public boolean canUndo() { */ @Override public boolean redo() { - // TODO Auto-generated method stub + execute(); return false; } @@ -77,7 +80,19 @@ public boolean redo() { */ @Override public boolean undo() { - // TODO Auto-generated method stub + + assert model != null; + assert commandModel != null; + + UnmodifiableObservableList lastShownList = model.getFilteredTaskList(); + ReadOnlyTask taskToModify = lastShownList.get(commandModel.getIndex() - 1); + + try { + model.modifyTask(taskToModify, originalTask); + } catch (TaskNotFoundException e) { + assert false : "The target task cannot be missing"; + } + return false; } From 84a28efa3c363ffbe81f2c858c0884b3380f2887 Mon Sep 17 00:00:00 2001 From: tet54 Date: Tue, 25 Oct 2016 01:11:22 +0800 Subject: [PATCH 15/55] Implemented undo and redo for multiple index delete --- .../logic/commands/DeleteCommand.java | 27 ++++++++++--------- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/src/main/java/seedu/savvytasker/logic/commands/DeleteCommand.java b/src/main/java/seedu/savvytasker/logic/commands/DeleteCommand.java index 7321a6caeb59..5053a06812d5 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/DeleteCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/DeleteCommand.java @@ -23,15 +23,14 @@ public class DeleteCommand extends ModelRequiringCommand { + "Parameters: INDEX (must be a positive integer)\n" + "Example: " + COMMAND_WORD + " 1"; - public static final String MESSAGE_DELETE_TASK_SUCCESS = "Deleted Task: %1$s"; + public static final String MESSAGE_DELETE_TASK_SUCCESS = "Deleted Task: %1$s\n"; public final DeleteCommandModel commandModel; - private Task deleted; + private LinkedList tasksToUndo = new LinkedList(); public DeleteCommand(DeleteCommandModel commandModel) { assert (commandModel != null); this.commandModel = commandModel; - this.deleted = null; } @@ -52,8 +51,8 @@ public CommandResult execute() { StringBuilder resultSb = new StringBuilder(); try { for(ReadOnlyTask taskToDelete : tasksToDelete) { - deleted = (Task)taskToDelete; model.deleteTask(taskToDelete); + tasksToUndo.add((Task)taskToDelete); resultSb.append(String.format(MESSAGE_DELETE_TASK_SUCCESS, taskToDelete)); } } catch (TaskNotFoundException pnfe) { @@ -76,13 +75,15 @@ public boolean canUndo() { public boolean redo() { UnmodifiableObservableList lastShownList = model.getFilteredTaskListTask(); - for (int i = 0; i < lastShownList.size(); i++) { - if (lastShownList.get(i) == deleted){ - ReadOnlyTask taskToDelete = lastShownList.get(i); - try { - model.deleteTask(taskToDelete); - } catch (TaskNotFoundException e) { - e.printStackTrace(); + for(Task toUndo : tasksToUndo){ + for (int i = 0; i < lastShownList.size(); i++) { + if (lastShownList.get(i) == toUndo){ + ReadOnlyTask taskToDelete = lastShownList.get(i); + try { + model.deleteTask(taskToDelete); + } catch (TaskNotFoundException e) { + e.printStackTrace(); + } } } } @@ -96,12 +97,14 @@ public boolean redo() { @Override public boolean undo() { assert model != null; + + for(Task deleted : tasksToUndo) try { model.addTask(deleted); } catch (DuplicateTaskException e) { e.printStackTrace(); } - + return true; } From 802a4ce936d2ad5bcd8f53366765873d41083ec1 Mon Sep 17 00:00:00 2001 From: tet54 Date: Tue, 25 Oct 2016 02:32:48 +0800 Subject: [PATCH 16/55] Implemented undo and redo for clear and delete commands --- .../seedu/savvytasker/logic/LogicManager.java | 57 ------------------- .../logic/commands/ClearCommand.java | 13 +++-- .../logic/commands/DeleteCommand.java | 24 +++++++- 3 files changed, 30 insertions(+), 64 deletions(-) diff --git a/src/main/java/seedu/savvytasker/logic/LogicManager.java b/src/main/java/seedu/savvytasker/logic/LogicManager.java index 02fdc428865b..69d1acd5dbe9 100644 --- a/src/main/java/seedu/savvytasker/logic/LogicManager.java +++ b/src/main/java/seedu/savvytasker/logic/LogicManager.java @@ -120,63 +120,6 @@ private boolean undo() { } return undone; - - /* - undone = false; - - if (!undoStack.isEmpty()) { - String commandText = undoStack.pop(); - String commandType[] = commandText.split(" "); - - if (commandType[0].equals("add")) { - String commandTextInverse = new String("delete " + model.getFilteredTaskList().size()); //TODO: can only undo after add at end of list - Command commandInverse = parser.parse(commandTextInverse); - commandInverse.setData(model); - CommandResult tempResult = commandInverse.execute(); - } - else if (commandType[0].equals("delete")){ - String commandTextInverse = new String("add" + " " + "temporary task"); //TODO: need to find details - Command commandInverse = parser.parse(commandTextInverse); - commandInverse.setData(model); - CommandResult tempResult = commandInverse.execute(); - } - else if (commandType[0].equals("modify")){ - String commandTextInverse = new String("modify" + " " + commandType[0]); //TODO: need to find original - Command commandInverse = parser.parse(commandTextInverse); - commandInverse.setData(model); - CommandResult tempResult = commandInverse.execute(); - } - else if (commandType[0].equals("alias")){ - String commandTextInverse = new String("unalias" + " " + commandType[2]); - Command commandInverse = parser.parse(commandTextInverse); - commandInverse.setData(model); - CommandResult tempResult = commandInverse.execute(); - } - else if (commandType[0].equals("unalias")){ - String commandTextInverse = new String("alias" + " " + commandType[0] + " " + commandType[1]); //TODO: need to find keyword - Command commandInverse = parser.parse(commandTextInverse); - commandInverse.setData(model); - CommandResult tempResult = commandInverse.execute(); - } - else if (commandType[0].equals("mark")){ - String commandTextInverse = new String("unmark" + " " + commandType[1]); - Command commandInverse = parser.parse(commandTextInverse); - commandInverse.setData(model); - CommandResult tempResult = commandInverse.execute(); - } - else if (commandType[0].equals("unmark")){ - String commandTextInverse = new String("mark" + " " + commandType[1]); - Command commandInverse = parser.parse(commandTextInverse); - commandInverse.setData(model); - CommandResult tempResult = commandInverse.execute(); - } - //command.undo(); - redoStack.push(commandText); - undone = true; - } - return undone; - - */ } private boolean redo() { diff --git a/src/main/java/seedu/savvytasker/logic/commands/ClearCommand.java b/src/main/java/seedu/savvytasker/logic/commands/ClearCommand.java index 5a478e827d80..78b9fff3b2c7 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/ClearCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/ClearCommand.java @@ -1,5 +1,6 @@ package seedu.savvytasker.logic.commands; +import seedu.savvytasker.model.ReadOnlySavvyTasker; import seedu.savvytasker.model.SavvyTasker; /** @@ -9,20 +10,23 @@ public class ClearCommand extends ModelRequiringCommand { public static final String COMMAND_WORD = "clear"; public static final String MESSAGE_SUCCESS = "Savvy Tasker has been cleared!"; - + + private ReadOnlySavvyTasker original; + public ClearCommand() {} @Override public CommandResult execute() { assert model != null; + original = new SavvyTasker(model.getSavvyTasker()); model.resetData(SavvyTasker.getEmptySavvyTasker()); return new CommandResult(MESSAGE_SUCCESS); } @Override public boolean canUndo() { - return false; + return true; } /** @@ -31,7 +35,7 @@ public boolean canUndo() { */ @Override public boolean redo() { - // nothing required to be done + execute(); return true; } @@ -41,7 +45,8 @@ public boolean redo() { */ @Override public boolean undo() { - // nothing required to be done + assert model != null; + model.resetData(original); return true; } diff --git a/src/main/java/seedu/savvytasker/logic/commands/DeleteCommand.java b/src/main/java/seedu/savvytasker/logic/commands/DeleteCommand.java index 5053a06812d5..f551c45316ce 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/DeleteCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/DeleteCommand.java @@ -5,9 +5,11 @@ import seedu.savvytasker.commons.core.Messages; import seedu.savvytasker.commons.core.UnmodifiableObservableList; import seedu.savvytasker.logic.commands.models.DeleteCommandModel; +import seedu.savvytasker.model.ReadOnlySavvyTasker; +import seedu.savvytasker.model.SavvyTasker; import seedu.savvytasker.model.task.ReadOnlyTask; import seedu.savvytasker.model.task.Task; -import seedu.savvytasker.model.task.TaskList.DuplicateTaskException; +//import seedu.savvytasker.model.task.TaskList.DuplicateTaskException; import seedu.savvytasker.model.task.TaskList.TaskNotFoundException; /** @@ -27,7 +29,8 @@ public class DeleteCommand extends ModelRequiringCommand { public final DeleteCommandModel commandModel; private LinkedList tasksToUndo = new LinkedList(); - + private ReadOnlySavvyTasker original; + public DeleteCommand(DeleteCommandModel commandModel) { assert (commandModel != null); this.commandModel = commandModel; @@ -47,6 +50,8 @@ public CommandResult execute() { } tasksToDelete.add(lastShownList.get(targetIndex - 1)); } + + original = new SavvyTasker(model.getSavvyTasker()); StringBuilder resultSb = new StringBuilder(); try { @@ -58,6 +63,8 @@ public CommandResult execute() { } catch (TaskNotFoundException pnfe) { assert false : "The target task cannot be missing"; } + + return new CommandResult(resultSb.toString()); } @@ -73,6 +80,10 @@ public boolean canUndo() { */ @Override public boolean redo() { + execute(); + + /* + * METHOD 2 UnmodifiableObservableList lastShownList = model.getFilteredTaskListTask(); for(Task toUndo : tasksToUndo){ @@ -87,6 +98,7 @@ public boolean redo() { } } } + */ return true; } @@ -96,6 +108,12 @@ public boolean redo() { */ @Override public boolean undo() { + + assert model != null; + model.resetData(original); + + /* + * METHOD 2 assert model != null; for(Task deleted : tasksToUndo) @@ -104,7 +122,7 @@ public boolean undo() { } catch (DuplicateTaskException e) { e.printStackTrace(); } - + */ return true; } From dbb043ffb2cbcf2ad1af356f21373e8877bd33a4 Mon Sep 17 00:00:00 2001 From: tet54 Date: Tue, 25 Oct 2016 03:36:16 +0800 Subject: [PATCH 17/55] Updated command methods --- .../seedu/savvytasker/logic/commands/AddCommand.java | 4 ++++ .../savvytasker/logic/commands/AliasCommand.java | 11 +++++++++-- .../savvytasker/logic/commands/ClearCommand.java | 4 ++++ .../savvytasker/logic/commands/DeleteCommand.java | 12 +++++++----- .../savvytasker/logic/commands/ExitCommand.java | 8 ++++++-- .../savvytasker/logic/commands/FindCommand.java | 8 ++++++-- .../savvytasker/logic/commands/HelpCommand.java | 8 ++++++-- .../savvytasker/logic/commands/IncorrectCommand.java | 8 ++++++-- .../savvytasker/logic/commands/ListCommand.java | 8 ++++++-- .../savvytasker/logic/commands/ModifyCommand.java | 8 ++++++-- .../savvytasker/logic/commands/RedoCommand.java | 8 ++++++-- .../savvytasker/logic/commands/SelectCommand.java | 8 ++++++-- .../savvytasker/logic/commands/UnaliasCommand.java | 8 ++++++-- .../savvytasker/logic/commands/UndoCommand.java | 8 ++++++-- 14 files changed, 84 insertions(+), 27 deletions(-) diff --git a/src/main/java/seedu/savvytasker/logic/commands/AddCommand.java b/src/main/java/seedu/savvytasker/logic/commands/AddCommand.java index 7e7f274f42e2..dadb7bf94cbb 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/AddCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/AddCommand.java @@ -50,6 +50,10 @@ public CommandResult execute() { } + /** + * Checks if a command can perform undo operations + * @return true if the command supports undo, false otherwise + */ @Override public boolean canUndo() { return true; diff --git a/src/main/java/seedu/savvytasker/logic/commands/AliasCommand.java b/src/main/java/seedu/savvytasker/logic/commands/AliasCommand.java index b2dad63d5e6d..9970a9fb607d 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/AliasCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/AliasCommand.java @@ -51,12 +51,19 @@ public CommandResult execute() { } } + /** + * Provides logic related dependencies to the alias command. + */ @Override public void setLogic(Logic logic) { assert logic != null; this.logic = logic; } + /** + * Checks if a command can perform undo operations + * @return true if the command supports undo, false otherwise + */ @Override public boolean canUndo() { return true; @@ -69,7 +76,7 @@ public boolean canUndo() { @Override public boolean redo() { execute(); - return false; + return true; } /** * Undo the alias command @@ -94,7 +101,7 @@ public boolean undo() { e.printStackTrace(); } - return false; + return true; } /** diff --git a/src/main/java/seedu/savvytasker/logic/commands/ClearCommand.java b/src/main/java/seedu/savvytasker/logic/commands/ClearCommand.java index 78b9fff3b2c7..95d85d91cfe6 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/ClearCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/ClearCommand.java @@ -24,6 +24,10 @@ public CommandResult execute() { return new CommandResult(MESSAGE_SUCCESS); } + /** + * Checks if a command can perform undo operations + * @return true if the command supports undo, false otherwise + */ @Override public boolean canUndo() { return true; diff --git a/src/main/java/seedu/savvytasker/logic/commands/DeleteCommand.java b/src/main/java/seedu/savvytasker/logic/commands/DeleteCommand.java index f551c45316ce..aaf401686725 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/DeleteCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/DeleteCommand.java @@ -8,7 +8,7 @@ import seedu.savvytasker.model.ReadOnlySavvyTasker; import seedu.savvytasker.model.SavvyTasker; import seedu.savvytasker.model.task.ReadOnlyTask; -import seedu.savvytasker.model.task.Task; +//import seedu.savvytasker.model.task.Task; //import seedu.savvytasker.model.task.TaskList.DuplicateTaskException; import seedu.savvytasker.model.task.TaskList.TaskNotFoundException; @@ -28,7 +28,7 @@ public class DeleteCommand extends ModelRequiringCommand { public static final String MESSAGE_DELETE_TASK_SUCCESS = "Deleted Task: %1$s\n"; public final DeleteCommandModel commandModel; - private LinkedList tasksToUndo = new LinkedList(); + //private LinkedList tasksToUndo = new LinkedList(); private ReadOnlySavvyTasker original; public DeleteCommand(DeleteCommandModel commandModel) { @@ -57,18 +57,20 @@ public CommandResult execute() { try { for(ReadOnlyTask taskToDelete : tasksToDelete) { model.deleteTask(taskToDelete); - tasksToUndo.add((Task)taskToDelete); + //tasksToUndo.add((Task)taskToDelete); resultSb.append(String.format(MESSAGE_DELETE_TASK_SUCCESS, taskToDelete)); } } catch (TaskNotFoundException pnfe) { assert false : "The target task cannot be missing"; } - - return new CommandResult(resultSb.toString()); } + /** + * Checks if a command can perform undo operations + * @return true if the command supports undo, false otherwise + */ @Override public boolean canUndo() { return true; diff --git a/src/main/java/seedu/savvytasker/logic/commands/ExitCommand.java b/src/main/java/seedu/savvytasker/logic/commands/ExitCommand.java index 249999aa5751..bc74b87b29ca 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/ExitCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/ExitCommand.java @@ -20,6 +20,10 @@ public CommandResult execute() { return new CommandResult(MESSAGE_EXIT_ACKNOWLEDGEMENT); } + /** + * Checks if a command can perform undo operations + * @return true if the command supports undo, false otherwise + */ @Override public boolean canUndo() { return false; @@ -32,7 +36,7 @@ public boolean canUndo() { @Override public boolean redo() { // nothing required to be done - return true; + return false; } /** @@ -42,7 +46,7 @@ public boolean redo() { @Override public boolean undo() { // nothing required to be done - return true; + return false; } /** diff --git a/src/main/java/seedu/savvytasker/logic/commands/FindCommand.java b/src/main/java/seedu/savvytasker/logic/commands/FindCommand.java index 1acb1f8f4c84..a2c9a0713249 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/FindCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/FindCommand.java @@ -36,6 +36,10 @@ public CommandResult execute() { return new CommandResult(getMessageForTaskListShownSummary(model.getFilteredTaskList().size())); } + /** + * Checks if a command can perform undo operations + * @return true if the command supports undo, false otherwise + */ @Override public boolean canUndo() { return false; @@ -48,7 +52,7 @@ public boolean canUndo() { @Override public boolean redo() { // nothing required to be done - return true; + return false; } /** @@ -58,7 +62,7 @@ public boolean redo() { @Override public boolean undo() { // nothing required to be done - return true; + return false; } /** diff --git a/src/main/java/seedu/savvytasker/logic/commands/HelpCommand.java b/src/main/java/seedu/savvytasker/logic/commands/HelpCommand.java index fad3326ca80e..c2094322f109 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/HelpCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/HelpCommand.java @@ -24,6 +24,10 @@ public CommandResult execute() { return new CommandResult(SHOWING_HELP_MESSAGE); } + /** + * Checks if a command can perform undo operations + * @return true if the command supports undo, false otherwise + */ @Override public boolean canUndo() { return false; @@ -36,7 +40,7 @@ public boolean canUndo() { @Override public boolean redo() { // nothing required to be done - return true; + return false; } /** @@ -46,7 +50,7 @@ public boolean redo() { @Override public boolean undo() { // nothing required to be done - return true; + return false; } /** diff --git a/src/main/java/seedu/savvytasker/logic/commands/IncorrectCommand.java b/src/main/java/seedu/savvytasker/logic/commands/IncorrectCommand.java index 2eaa4e940c43..c3410e0e46b2 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/IncorrectCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/IncorrectCommand.java @@ -19,6 +19,10 @@ public CommandResult execute() { return new CommandResult(feedbackToUser); } + /** + * Checks if a command can perform undo operations + * @return true if the command supports undo, false otherwise + */ @Override public boolean canUndo() { return false; @@ -31,7 +35,7 @@ public boolean canUndo() { @Override public boolean redo() { // nothing required to be done - return true; + return false; } /** @@ -41,7 +45,7 @@ public boolean redo() { @Override public boolean undo() { // nothing required to be done - return true; + return false; } /** diff --git a/src/main/java/seedu/savvytasker/logic/commands/ListCommand.java b/src/main/java/seedu/savvytasker/logic/commands/ListCommand.java index 822d92fba13f..72bf63f7a20f 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/ListCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/ListCommand.java @@ -53,6 +53,10 @@ public CommandResult execute() { return new CommandResult(getMessageForTaskListShownSummary(model.getFilteredTaskList().size())); } + /** + * Checks if a command can perform undo operations + * @return true if the command supports undo, false otherwise + */ @Override public boolean canUndo() { return false; @@ -65,7 +69,7 @@ public boolean canUndo() { @Override public boolean redo() { // nothing required to be done - return true; + return false; } @@ -76,7 +80,7 @@ public boolean redo() { @Override public boolean undo() { // nothing required to be done - return true; + return false; } /** diff --git a/src/main/java/seedu/savvytasker/logic/commands/ModifyCommand.java b/src/main/java/seedu/savvytasker/logic/commands/ModifyCommand.java index 5e885aa98601..dffc909ea4aa 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/ModifyCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/ModifyCommand.java @@ -59,6 +59,10 @@ public CommandResult execute() { return new CommandResult(String.format(MESSAGE_SUCCESS, replacement)); } + /** + * Checks if a command can perform undo operations + * @return true if the command supports undo, false otherwise + */ @Override public boolean canUndo() { return true; @@ -71,7 +75,7 @@ public boolean canUndo() { @Override public boolean redo() { execute(); - return false; + return true; } /** @@ -93,7 +97,7 @@ public boolean undo() { assert false : "The target task cannot be missing"; } - return false; + return true; } /** diff --git a/src/main/java/seedu/savvytasker/logic/commands/RedoCommand.java b/src/main/java/seedu/savvytasker/logic/commands/RedoCommand.java index ea9d329ca51e..b5dac483b939 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/RedoCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/RedoCommand.java @@ -16,6 +16,10 @@ public CommandResult execute() { return new CommandResult(MESSAGE_REDO_ACKNOWLEDGEMENT); } + /** + * Checks if a command can perform undo operations + * @return true if the command supports undo, false otherwise + */ @Override public boolean canUndo() { return false; @@ -28,7 +32,7 @@ public boolean canUndo() { @Override public boolean redo() { // nothing required to be done - return true; + return false; } /** @@ -38,7 +42,7 @@ public boolean redo() { @Override public boolean undo() { // nothing required to be done - return true; + return false; } /** diff --git a/src/main/java/seedu/savvytasker/logic/commands/SelectCommand.java b/src/main/java/seedu/savvytasker/logic/commands/SelectCommand.java index 36c4c9e5f67d..1478b31f11fc 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/SelectCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/SelectCommand.java @@ -41,6 +41,10 @@ public CommandResult execute() { } + /** + * Checks if a command can perform undo operations + * @return true if the command supports undo, false otherwise + */ @Override public boolean canUndo() { return false; @@ -53,7 +57,7 @@ public boolean canUndo() { @Override public boolean redo() { // nothing required to be done - return true; + return false; } /** @@ -63,7 +67,7 @@ public boolean redo() { @Override public boolean undo() { // nothing required to be done - return true; + return false; } /** diff --git a/src/main/java/seedu/savvytasker/logic/commands/UnaliasCommand.java b/src/main/java/seedu/savvytasker/logic/commands/UnaliasCommand.java index c1211ed8010a..275d889aeaa6 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/UnaliasCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/UnaliasCommand.java @@ -58,6 +58,10 @@ public CommandResult execute() { } } + /** + * Checks if a command can perform undo operations + * @return true if the command supports undo, false otherwise + */ @Override public boolean canUndo() { return true; @@ -70,7 +74,7 @@ public boolean canUndo() { @Override public boolean redo() { execute(); - return false; + return true; } /** * Undo the unalias command @@ -85,7 +89,7 @@ public boolean undo() { e.printStackTrace(); } - return false; + return true; } /** diff --git a/src/main/java/seedu/savvytasker/logic/commands/UndoCommand.java b/src/main/java/seedu/savvytasker/logic/commands/UndoCommand.java index f0b8458a01e2..0e79d955da2c 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/UndoCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/UndoCommand.java @@ -16,6 +16,10 @@ public CommandResult execute() { return new CommandResult(MESSAGE_UNDO_ACKNOWLEDGEMENT); } + /** + * Checks if a command can perform undo operations + * @return true if the command supports undo, false otherwise + */ @Override public boolean canUndo() { return false; @@ -28,7 +32,7 @@ public boolean canUndo() { @Override public boolean redo() { // nothing required to be done - return true; + return false; } /** @@ -38,7 +42,7 @@ public boolean redo() { @Override public boolean undo() { // nothing required to be done - return true; + return false; } /** From 19cf4b18db3b91471f4a54a94c4569c7d2bd2a00 Mon Sep 17 00:00:00 2001 From: tet54 Date: Tue, 25 Oct 2016 03:36:34 +0800 Subject: [PATCH 18/55] Implemented Mark Command --- .../logic/commands/MarkCommand.java | 86 +++++++++++++++++-- .../logic/parser/MarkCommandParser.java | 5 +- 2 files changed, 80 insertions(+), 11 deletions(-) diff --git a/src/main/java/seedu/savvytasker/logic/commands/MarkCommand.java b/src/main/java/seedu/savvytasker/logic/commands/MarkCommand.java index c87eea143afb..bfc6e8516d26 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/MarkCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/MarkCommand.java @@ -1,29 +1,97 @@ package seedu.savvytasker.logic.commands; -public class MarkCommand extends Command { +import java.util.LinkedList; + +import seedu.savvytasker.commons.core.Messages; +import seedu.savvytasker.commons.core.UnmodifiableObservableList; +import seedu.savvytasker.logic.commands.models.MarkCommandModel; +import seedu.savvytasker.model.ReadOnlySavvyTasker; +import seedu.savvytasker.model.SavvyTasker; +import seedu.savvytasker.model.task.ReadOnlyTask; +import seedu.savvytasker.model.task.Task; +import seedu.savvytasker.model.task.TaskList.DuplicateTaskException; +import seedu.savvytasker.model.task.TaskList.TaskNotFoundException; + +public class MarkCommand extends ModelRequiringCommand { + + public static final String COMMAND_WORD = "mark"; + public static final String COMMAND_FORMAT = "mark INDEX [MORE_INDEX]"; + + public static final String MESSAGE_USAGE = COMMAND_WORD + + ": Marks the tasks identified by the index number used in the last task listing as done.\n" + + "Parameters: INDEX (must be a positive integer)\n" + + "Example: " + COMMAND_WORD + " 1"; + + public static final String MESSAGE_MARK_TASK_SUCCESS = "Marked Task: %1$s\n"; + + public final MarkCommandModel commandModel; + private ReadOnlySavvyTasker original; + + public MarkCommand(MarkCommandModel commandModel) { + assert (commandModel != null); + this.commandModel = commandModel; + } @Override public CommandResult execute() { - // TODO Auto-generated method stub - return null; + + UnmodifiableObservableList lastShownList = model.getFilteredTaskList(); + + LinkedList tasksToMark = new LinkedList(); + for(int targetIndex : commandModel.getTargetIndex()) { + if (lastShownList.size() < targetIndex || targetIndex <= 0) { + indicateAttemptToExecuteIncorrectCommand(); + return new CommandResult(Messages.MESSAGE_INVALID_TASK_DISPLAYED_INDEX); + } + tasksToMark.add((Task) lastShownList.get(targetIndex - 1)); + } + + original = new SavvyTasker(model.getSavvyTasker()); + + StringBuilder resultSb = new StringBuilder(); + try { + for(Task taskToMark : tasksToMark) { + taskToMark.setArchived(true); + model.deleteTask(taskToMark); + model.addTask(taskToMark); + resultSb.append(String.format(MESSAGE_MARK_TASK_SUCCESS, taskToMark)); + } + } catch (TaskNotFoundException pnfe) { + assert false : "The target task cannot be missing"; + } catch (DuplicateTaskException e) { + e.printStackTrace(); + } + return new CommandResult(resultSb.toString()); } + /** + * Checks if a command can perform undo operations + * @return true if the command supports undo, false otherwise + */ @Override public boolean canUndo() { - // TODO Auto-generated method stub - return false; + return true; } + /** + * Redo the mark command + * @return true if the operation completed successfully, false otherwise + */ @Override public boolean redo() { - // TODO Auto-generated method stub - return false; + execute(); + return true; } + /** + * Undo the mark command + * @return true if the operation completed successfully, false otherwise + */ @Override public boolean undo() { - // TODO Auto-generated method stub - return false; + assert model != null; + model.resetData(original); + return true; } /** diff --git a/src/main/java/seedu/savvytasker/logic/parser/MarkCommandParser.java b/src/main/java/seedu/savvytasker/logic/parser/MarkCommandParser.java index 322d71bf3ba4..301f5fdf5f76 100644 --- a/src/main/java/seedu/savvytasker/logic/parser/MarkCommandParser.java +++ b/src/main/java/seedu/savvytasker/logic/parser/MarkCommandParser.java @@ -5,6 +5,7 @@ import seedu.savvytasker.commons.core.Messages; import seedu.savvytasker.logic.commands.MarkCommand; +import seedu.savvytasker.logic.commands.models.MarkCommandModel; public class MarkCommandParser implements CommandParser { private static final String HEADER = "mark"; @@ -31,10 +32,10 @@ public String getRequiredFormat() { public MarkCommand parse(String commandText) throws ParseException { Matcher matcher = REGEX_PATTERN.matcher(commandText); if (matcher.matches()) { - parseIndices(matcher.group(REGEX_REF_INDICES)); + int[] indices = parseIndices(matcher.group(REGEX_REF_INDICES)); // TODO: Integrate with MarkCommand properly - return new MarkCommand(); + return new MarkCommand(new MarkCommandModel(indices)); } throw new ParseException(commandText, String.format( From 3eefdcd895983866cae16103ffe598ce55619375 Mon Sep 17 00:00:00 2001 From: tet54 Date: Tue, 25 Oct 2016 03:49:34 +0800 Subject: [PATCH 19/55] Updated mark command --- .../savvytasker/logic/commands/MarkCommand.java | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/main/java/seedu/savvytasker/logic/commands/MarkCommand.java b/src/main/java/seedu/savvytasker/logic/commands/MarkCommand.java index bfc6e8516d26..8ebcb7525db7 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/MarkCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/MarkCommand.java @@ -23,6 +23,7 @@ public class MarkCommand extends ModelRequiringCommand { + "Example: " + COMMAND_WORD + " 1"; public static final String MESSAGE_MARK_TASK_SUCCESS = "Marked Task: %1$s\n"; + public static final String MESSAGE_MARK_TASK_FAIL = "Task is already marked!\n"; public final MarkCommandModel commandModel; private ReadOnlySavvyTasker original; @@ -51,10 +52,14 @@ public CommandResult execute() { StringBuilder resultSb = new StringBuilder(); try { for(Task taskToMark : tasksToMark) { - taskToMark.setArchived(true); - model.deleteTask(taskToMark); - model.addTask(taskToMark); - resultSb.append(String.format(MESSAGE_MARK_TASK_SUCCESS, taskToMark)); + if (!taskToMark.isArchived()){ + taskToMark.setArchived(true); + model.deleteTask(taskToMark); + model.addTask(taskToMark); + resultSb.append(String.format(MESSAGE_MARK_TASK_SUCCESS, taskToMark)); + } else { + resultSb.append(String.format(MESSAGE_MARK_TASK_FAIL, taskToMark)); + } } } catch (TaskNotFoundException pnfe) { assert false : "The target task cannot be missing"; From ae0a954aba87e139df64e2b4bb4bec2fae9334fe Mon Sep 17 00:00:00 2001 From: tet54 Date: Tue, 25 Oct 2016 03:49:45 +0800 Subject: [PATCH 20/55] Implemented unmark command --- .../logic/commands/UnmarkCommand.java | 92 +++++++++++++++++-- .../logic/parser/UnmarkCommandParser.java | 5 +- 2 files changed, 86 insertions(+), 11 deletions(-) diff --git a/src/main/java/seedu/savvytasker/logic/commands/UnmarkCommand.java b/src/main/java/seedu/savvytasker/logic/commands/UnmarkCommand.java index 435ade613f55..98ee57219411 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/UnmarkCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/UnmarkCommand.java @@ -1,29 +1,103 @@ package seedu.savvytasker.logic.commands; -public class UnmarkCommand extends Command { +import java.util.LinkedList; +import seedu.savvytasker.commons.core.Messages; +import seedu.savvytasker.commons.core.UnmodifiableObservableList; +import seedu.savvytasker.logic.commands.models.UnmarkCommandModel; +import seedu.savvytasker.model.ReadOnlySavvyTasker; +import seedu.savvytasker.model.SavvyTasker; +import seedu.savvytasker.model.task.ReadOnlyTask; +import seedu.savvytasker.model.task.Task; +import seedu.savvytasker.model.task.TaskList.DuplicateTaskException; +import seedu.savvytasker.model.task.TaskList.TaskNotFoundException; + +public class UnmarkCommand extends ModelRequiringCommand { + + public static final String COMMAND_WORD = "unmark"; + public static final String COMMAND_FORMAT = "unmark INDEX [MORE_INDEX]"; + + public static final String MESSAGE_USAGE = COMMAND_WORD + + ": Unmarks the marked tasks identified by the index number used in the last task listing.\n" + + "Parameters: INDEX (must be a positive integer)\n" + + "Example: " + COMMAND_WORD + " 1"; + + public static final String MESSAGE_UNMARK_TASK_SUCCESS = "Unmarked Task: %1$s\n"; + public static final String MESSAGE_UNMARK_TASK_FAIL = "Task is already unmarked!\n"; + + public final UnmarkCommandModel commandModel; + private ReadOnlySavvyTasker original; + + public UnmarkCommand(UnmarkCommandModel commandModel) { + assert (commandModel != null); + this.commandModel = commandModel; + } + @Override public CommandResult execute() { - // TODO Auto-generated method stub - return null; + + UnmodifiableObservableList lastShownList = model.getFilteredTaskList(); + + LinkedList tasksToUnmark = new LinkedList(); + for(int targetIndex : commandModel.getTargetIndex()) { + if (lastShownList.size() < targetIndex || targetIndex <= 0) { + indicateAttemptToExecuteIncorrectCommand(); + return new CommandResult(Messages.MESSAGE_INVALID_TASK_DISPLAYED_INDEX); + } + tasksToUnmark.add((Task) lastShownList.get(targetIndex - 1)); + } + + original = new SavvyTasker(model.getSavvyTasker()); + + StringBuilder resultSb = new StringBuilder(); + try { + for(Task taskToUnmark : tasksToUnmark) { + if (taskToUnmark.isArchived()){ + taskToUnmark.setArchived(false); + model.deleteTask(taskToUnmark); + model.addTask(taskToUnmark); + model.updateFilteredListToShowArchived(); + resultSb.append(String.format(MESSAGE_UNMARK_TASK_SUCCESS, taskToUnmark)); + } else { + resultSb.append(String.format(MESSAGE_UNMARK_TASK_FAIL, taskToUnmark)); + } + } + } catch (TaskNotFoundException pnfe) { + assert false : "The target task cannot be missing"; + } catch (DuplicateTaskException e) { + e.printStackTrace(); + } + return new CommandResult(resultSb.toString()); } + /** + * Checks if a command can perform undo operations + * @return true if the command supports undo, false otherwise + */ @Override public boolean canUndo() { - // TODO Auto-generated method stub - return false; + return true; } + /** + * Redo the unmark command + * @return true if the operation completed successfully, false otherwise + */ @Override public boolean redo() { - // TODO Auto-generated method stub - return false; + execute(); + return true; } + /** + * Undo the unmark command + * @return true if the operation completed successfully, false otherwise + */ @Override public boolean undo() { - // TODO Auto-generated method stub - return false; + assert model != null; + model.resetData(original); + return true; } /** diff --git a/src/main/java/seedu/savvytasker/logic/parser/UnmarkCommandParser.java b/src/main/java/seedu/savvytasker/logic/parser/UnmarkCommandParser.java index 442231edc13b..f00259977f5c 100644 --- a/src/main/java/seedu/savvytasker/logic/parser/UnmarkCommandParser.java +++ b/src/main/java/seedu/savvytasker/logic/parser/UnmarkCommandParser.java @@ -5,6 +5,7 @@ import seedu.savvytasker.commons.core.Messages; import seedu.savvytasker.logic.commands.UnmarkCommand; +import seedu.savvytasker.logic.commands.models.UnmarkCommandModel; public class UnmarkCommandParser implements CommandParser { private static final String HEADER = "unmark"; @@ -31,10 +32,10 @@ public String getRequiredFormat() { public UnmarkCommand parse(String commandText) throws ParseException { Matcher matcher = REGEX_PATTERN.matcher(commandText); if (matcher.matches()) { - parseIndices(matcher.group(REGEX_REF_INDICES)); + int[] indices = parseIndices(matcher.group(REGEX_REF_INDICES)); // TODO: Integrate UnmarkCommand properly! - return new UnmarkCommand(); + return new UnmarkCommand(new UnmarkCommandModel(indices)); } throw new ParseException(commandText, String.format( From 56a0538cdaaa7917267705fb057ba6809dbd1fce Mon Sep 17 00:00:00 2001 From: qhng Date: Tue, 25 Oct 2016 23:57:57 +0800 Subject: [PATCH 21/55] Remove CommandModels. Unnecessary coupling removed. --- .../logic/commands/AddCommand.java | 48 +++++-- .../logic/commands/AliasCommand.java | 17 +-- .../logic/commands/DeleteCommand.java | 11 +- .../logic/commands/FindCommand.java | 20 +-- .../logic/commands/ListCommand.java | 14 +- .../logic/commands/MarkCommand.java | 10 +- .../logic/commands/ModifyCommand.java | 50 +++++-- .../logic/commands/UnaliasCommand.java | 10 +- .../logic/commands/UnmarkCommand.java | 12 +- .../commands/models/AddCommandModel.java | 116 ---------------- .../commands/models/AliasCommandModel.java | 36 ----- .../logic/commands/models/CommandModel.java | 12 -- .../commands/models/DeleteCommandModel.java | 23 ---- .../commands/models/FindCommandModel.java | 40 ------ .../commands/models/ListCommandModel.java | 23 ---- .../commands/models/MarkCommandModel.java | 23 ---- .../commands/models/ModifyCommandModel.java | 126 ------------------ .../commands/models/SelectCommandModel.java | 23 ---- .../commands/models/UnaliasCommandModel.java | 27 ---- .../commands/models/UnmarkCommandModel.java | 23 ---- .../logic/parser/AddCommandParser.java | 6 +- .../logic/parser/AliasCommandParser.java | 3 +- .../logic/parser/DeleteCommandParser.java | 4 +- .../logic/parser/FindCommandParser.java | 3 +- .../logic/parser/ListCommandParser.java | 3 +- .../logic/parser/MarkCommandParser.java | 5 +- .../logic/parser/ModifyCommandParser.java | 6 +- .../logic/parser/UnaliasCommandParser.java | 3 +- .../logic/parser/UnmarkCommandParser.java | 3 +- .../seedu/savvytasker/model/task/Task.java | 24 ++-- 30 files changed, 144 insertions(+), 580 deletions(-) delete mode 100644 src/main/java/seedu/savvytasker/logic/commands/models/AddCommandModel.java delete mode 100644 src/main/java/seedu/savvytasker/logic/commands/models/AliasCommandModel.java delete mode 100644 src/main/java/seedu/savvytasker/logic/commands/models/CommandModel.java delete mode 100644 src/main/java/seedu/savvytasker/logic/commands/models/DeleteCommandModel.java delete mode 100644 src/main/java/seedu/savvytasker/logic/commands/models/FindCommandModel.java delete mode 100644 src/main/java/seedu/savvytasker/logic/commands/models/ListCommandModel.java delete mode 100644 src/main/java/seedu/savvytasker/logic/commands/models/MarkCommandModel.java delete mode 100644 src/main/java/seedu/savvytasker/logic/commands/models/ModifyCommandModel.java delete mode 100644 src/main/java/seedu/savvytasker/logic/commands/models/SelectCommandModel.java delete mode 100644 src/main/java/seedu/savvytasker/logic/commands/models/UnaliasCommandModel.java delete mode 100644 src/main/java/seedu/savvytasker/logic/commands/models/UnmarkCommandModel.java diff --git a/src/main/java/seedu/savvytasker/logic/commands/AddCommand.java b/src/main/java/seedu/savvytasker/logic/commands/AddCommand.java index dadb7bf94cbb..f44cafab416d 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/AddCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/AddCommand.java @@ -1,8 +1,12 @@ package seedu.savvytasker.logic.commands; +import java.util.Date; + import seedu.savvytasker.commons.core.UnmodifiableObservableList; -import seedu.savvytasker.logic.commands.models.AddCommandModel; +import seedu.savvytasker.logic.parser.DateParser.InferredDate; +import seedu.savvytasker.model.task.PriorityLevel; import seedu.savvytasker.model.task.ReadOnlyTask; +import seedu.savvytasker.model.task.RecurrenceType; import seedu.savvytasker.model.task.Task; import seedu.savvytasker.model.task.TaskList.DuplicateTaskException; import seedu.savvytasker.model.task.TaskList.TaskNotFoundException; @@ -23,19 +27,47 @@ public class AddCommand extends ModelRequiringCommand { public static final String MESSAGE_SUCCESS = "New task added: %1$s"; public static final String MESSAGE_DUPLICATE_TASK = "This task already exists in the task list"; - private final Task toAdd; + private final String taskName; + private final InferredDate startDateTime; + private Date inferredStart; + private final InferredDate endDateTime; + private Date inferredEnd; + private final String location; + private final PriorityLevel priority; + private final RecurrenceType recurringType; + private final Integer numberOfRecurrence; + private final String category; + private final String description; + + private Task toAdd; /** * Creates an add command. */ - public AddCommand(AddCommandModel commandModel) { + public AddCommand(String taskName, InferredDate startDateTime, InferredDate endDateTime, + String location, PriorityLevel priority, RecurrenceType recurringType, + Integer numberOfRecurrence, String category, String description) { + this.taskName = taskName; + this.startDateTime = startDateTime; + this.endDateTime = endDateTime; + this.location = location; + this.priority = priority; + this.recurringType = recurringType; + this.numberOfRecurrence = numberOfRecurrence; + this.category = category; + this.description = description; + + createTask(); + } + + private void createTask() { final boolean isArchived = false; // all tasks are first added as active tasks final int taskId = 0; // taskId to be assigned by ModelManager, leave as 0 - this.toAdd = new Task(taskId, commandModel.getTaskName(), - commandModel.getStartDateTime(), commandModel.getEndDateTime(), - commandModel.getLocation(), commandModel.getPriority(), - commandModel.getRecurringType(), commandModel.getNumberOfRecurrence(), - commandModel.getCategory(), commandModel.getDescription(), isArchived); + + //TODO: Smart defaults for date + this.toAdd = new Task(taskId, taskName, inferredStart, inferredEnd, + location, priority, recurringType, numberOfRecurrence, + category, description, isArchived); } @Override diff --git a/src/main/java/seedu/savvytasker/logic/commands/AliasCommand.java b/src/main/java/seedu/savvytasker/logic/commands/AliasCommand.java index 9970a9fb607d..d3cc9854c612 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/AliasCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/AliasCommand.java @@ -1,7 +1,6 @@ package seedu.savvytasker.logic.commands; import seedu.savvytasker.logic.Logic; -import seedu.savvytasker.logic.commands.models.AliasCommandModel; import seedu.savvytasker.model.alias.AliasSymbol; import seedu.savvytasker.model.alias.DuplicateSymbolKeywordException; import seedu.savvytasker.model.alias.SymbolKeywordNotFoundException; @@ -22,22 +21,24 @@ public class AliasCommand extends ModelRequiringCommand { public static final String MESSAGE_DUPLICATE_ALIAS = "This alias is already in use"; public static final String MESSAGE_INVALID_KEYWORD = "Unable to use a command name as a keyword!"; - private AliasCommandModel commandModel; private Logic logic; + private final String keyword; + private final String representingText; /** * Creates an alias command */ - public AliasCommand(AliasCommandModel commandModel) { - assert commandModel != null; - this.commandModel = commandModel; + public AliasCommand(String keyword, String representingText) { + assert keyword != null; + assert representingText != null; + this.keyword = keyword; + this.representingText = representingText; } @Override public CommandResult execute() { assert model != null; - AliasSymbol toAdd = new AliasSymbol(commandModel.getKeyword(), - commandModel.getRepresentingText()); + AliasSymbol toAdd = new AliasSymbol(keyword, representingText); if (logic.canParseHeader(toAdd.getKeyword())) { return new CommandResult(MESSAGE_INVALID_KEYWORD); @@ -90,7 +91,7 @@ public boolean undo() { AliasSymbol toRemove = null; for(AliasSymbol symbol : model.getSavvyTasker().getReadOnlyListOfAliasSymbols()) { - if (symbol.getKeyword().equals(this.commandModel.getKeyword())) { + if (symbol.getKeyword().equals(this.keyword)) { toRemove = symbol; break; } diff --git a/src/main/java/seedu/savvytasker/logic/commands/DeleteCommand.java b/src/main/java/seedu/savvytasker/logic/commands/DeleteCommand.java index aaf401686725..a5161fc96845 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/DeleteCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/DeleteCommand.java @@ -4,7 +4,6 @@ import seedu.savvytasker.commons.core.Messages; import seedu.savvytasker.commons.core.UnmodifiableObservableList; -import seedu.savvytasker.logic.commands.models.DeleteCommandModel; import seedu.savvytasker.model.ReadOnlySavvyTasker; import seedu.savvytasker.model.SavvyTasker; import seedu.savvytasker.model.task.ReadOnlyTask; @@ -27,23 +26,21 @@ public class DeleteCommand extends ModelRequiringCommand { public static final String MESSAGE_DELETE_TASK_SUCCESS = "Deleted Task: %1$s\n"; - public final DeleteCommandModel commandModel; //private LinkedList tasksToUndo = new LinkedList(); private ReadOnlySavvyTasker original; + private final int[] targetIndices; - public DeleteCommand(DeleteCommandModel commandModel) { - assert (commandModel != null); - this.commandModel = commandModel; + public DeleteCommand(int[] targetIndices) { + this.targetIndices = targetIndices; } - @Override public CommandResult execute() { UnmodifiableObservableList lastShownList = model.getFilteredTaskList(); LinkedList tasksToDelete = new LinkedList(); - for(int targetIndex : commandModel.getTargetIndex()) { + for(int targetIndex : this.targetIndices) { if (lastShownList.size() < targetIndex || targetIndex <= 0) { indicateAttemptToExecuteIncorrectCommand(); return new CommandResult(Messages.MESSAGE_INVALID_TASK_DISPLAYED_INDEX); diff --git a/src/main/java/seedu/savvytasker/logic/commands/FindCommand.java b/src/main/java/seedu/savvytasker/logic/commands/FindCommand.java index a2c9a0713249..9d07d32e2cc1 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/FindCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/FindCommand.java @@ -1,6 +1,5 @@ package seedu.savvytasker.logic.commands; -import seedu.savvytasker.logic.commands.models.FindCommandModel; import seedu.savvytasker.model.task.FindType; /** @@ -17,22 +16,23 @@ public class FindCommand extends ModelRequiringCommand { + "the specified keywords (case-sensitive) and displays them as a list with index numbers.\n" + "Parameters: KEYWORD [MORE_KEYWORDS]...\n" + "Example: " + COMMAND_WORD + " alice bob charlie"; + + private final FindType findType; + private final String[] keywords; - private final FindCommandModel commandModel; - - public FindCommand(FindCommandModel commandModel) { - assert (commandModel != null); - this.commandModel = commandModel; + public FindCommand(FindType findType, String[] keywords) { + this.findType = findType; + this.keywords = keywords; } @Override public CommandResult execute() { - FindType findType = commandModel.getFindType(); - if (findType == null) { + FindType _findType = findType; + if (_findType == null) { // use default find type, partial. - findType = FindType.Partial; + _findType = FindType.Partial; } - model.updateFilteredTaskList(findType, commandModel.getKeywords()); + model.updateFilteredTaskList(_findType, keywords); return new CommandResult(getMessageForTaskListShownSummary(model.getFilteredTaskList().size())); } diff --git a/src/main/java/seedu/savvytasker/logic/commands/ListCommand.java b/src/main/java/seedu/savvytasker/logic/commands/ListCommand.java index 72bf63f7a20f..ac5d7f0a675f 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/ListCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/ListCommand.java @@ -1,6 +1,5 @@ package seedu.savvytasker.logic.commands; -import seedu.savvytasker.logic.commands.models.ListCommandModel; import seedu.savvytasker.model.task.ListType; /** @@ -17,26 +16,25 @@ public class ListCommand extends ModelRequiringCommand { public static final String MESSAGE_SUCCESS = "Listed all tasks"; - private final ListCommandModel commandModel; + private final ListType listType; /** * Creates the List command to list the specified tasks * @author A0139915W * @param commandModel Arguments for the List command, must not be null */ - public ListCommand(ListCommandModel commandModel) { - assert commandModel != null; - this.commandModel = commandModel; + public ListCommand(ListType listType) { + this.listType = listType; } @Override public CommandResult execute() { - ListType listType = commandModel.getListType(); + ListType _listType = listType; if (listType == null) { // use default, sort by due date - listType = ListType.DueDate; + _listType = ListType.DueDate; } - switch (listType) + switch (_listType) { case DueDate: model.updateFilteredListToShowActiveSortedByDueDate(); diff --git a/src/main/java/seedu/savvytasker/logic/commands/MarkCommand.java b/src/main/java/seedu/savvytasker/logic/commands/MarkCommand.java index 8ebcb7525db7..931c81b9e4c0 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/MarkCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/MarkCommand.java @@ -4,7 +4,6 @@ import seedu.savvytasker.commons.core.Messages; import seedu.savvytasker.commons.core.UnmodifiableObservableList; -import seedu.savvytasker.logic.commands.models.MarkCommandModel; import seedu.savvytasker.model.ReadOnlySavvyTasker; import seedu.savvytasker.model.SavvyTasker; import seedu.savvytasker.model.task.ReadOnlyTask; @@ -25,12 +24,11 @@ public class MarkCommand extends ModelRequiringCommand { public static final String MESSAGE_MARK_TASK_SUCCESS = "Marked Task: %1$s\n"; public static final String MESSAGE_MARK_TASK_FAIL = "Task is already marked!\n"; - public final MarkCommandModel commandModel; + public final int[] targetIndices; private ReadOnlySavvyTasker original; - public MarkCommand(MarkCommandModel commandModel) { - assert (commandModel != null); - this.commandModel = commandModel; + public MarkCommand(int[] targetIndices) { + this.targetIndices = targetIndices; } @Override @@ -39,7 +37,7 @@ public CommandResult execute() { UnmodifiableObservableList lastShownList = model.getFilteredTaskList(); LinkedList tasksToMark = new LinkedList(); - for(int targetIndex : commandModel.getTargetIndex()) { + for(int targetIndex : targetIndices) { if (lastShownList.size() < targetIndex || targetIndex <= 0) { indicateAttemptToExecuteIncorrectCommand(); return new CommandResult(Messages.MESSAGE_INVALID_TASK_DISPLAYED_INDEX); diff --git a/src/main/java/seedu/savvytasker/logic/commands/ModifyCommand.java b/src/main/java/seedu/savvytasker/logic/commands/ModifyCommand.java index dffc909ea4aa..07ba3a3a846c 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/ModifyCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/ModifyCommand.java @@ -1,14 +1,18 @@ package seedu.savvytasker.logic.commands; +import java.util.Date; + import seedu.savvytasker.commons.core.Messages; import seedu.savvytasker.commons.core.UnmodifiableObservableList; -import seedu.savvytasker.logic.commands.models.ModifyCommandModel; +import seedu.savvytasker.logic.parser.DateParser.InferredDate; +import seedu.savvytasker.model.task.PriorityLevel; import seedu.savvytasker.model.task.ReadOnlyTask; +import seedu.savvytasker.model.task.RecurrenceType; import seedu.savvytasker.model.task.Task; import seedu.savvytasker.model.task.TaskList.TaskNotFoundException; /** - * Adds a person to the address book. + * Modifies a task in savvy tasker. */ public class ModifyCommand extends ModelRequiringCommand { @@ -23,31 +27,56 @@ public class ModifyCommand extends ModelRequiringCommand { public static final String MESSAGE_SUCCESS = "Task modified: %1$s"; public static final String MESSAGE_DUPLICATE_TASK = "This task already exists in the task list"; - private final ModifyCommandModel commandModel; private Task originalTask; + private Task replacement; + private final int index; + private final String taskName; + private final InferredDate startDateTime; + private Date inferredStart; + private final InferredDate endDateTime; + private Date inferredEnd; + private final String location; + private final PriorityLevel priority; + private final RecurrenceType recurringType; + private final Integer numberOfRecurrence; + private final String category; + private final String description; /** * Creates an add command. */ - public ModifyCommand(ModifyCommandModel commandModel) { - this.commandModel = commandModel; + public ModifyCommand(int index, String taskName, InferredDate startDateTime, InferredDate endDateTime, String location, + PriorityLevel priority, RecurrenceType recurringType, Integer numberOfRecurrence, String category, + String description) { + this.index = index; + this.taskName = taskName; + this.startDateTime = startDateTime; + this.endDateTime = endDateTime; + this.location = location; + this.priority = priority; + this.recurringType = recurringType; + this.numberOfRecurrence = numberOfRecurrence; + this.category = category; + this.description = description; this.originalTask = null; } @Override public CommandResult execute() { assert model != null; - assert commandModel != null; UnmodifiableObservableList lastShownList = model.getFilteredTaskList(); - if (lastShownList.size() < commandModel.getIndex()) { + if (lastShownList.size() < index) { indicateAttemptToExecuteIncorrectCommand(); return new CommandResult(Messages.MESSAGE_INVALID_TASK_DISPLAYED_INDEX); } - ReadOnlyTask taskToModify = lastShownList.get(commandModel.getIndex() - 1); - Task replacement = new Task(taskToModify, commandModel); + ReadOnlyTask taskToModify = lastShownList.get(index - 1); + Task replacement = new Task(taskToModify, taskName, inferredStart, + inferredEnd, location, priority, + recurringType, numberOfRecurrence, + category, description); try { originalTask = (Task)taskToModify; @@ -86,10 +115,9 @@ public boolean redo() { public boolean undo() { assert model != null; - assert commandModel != null; UnmodifiableObservableList lastShownList = model.getFilteredTaskList(); - ReadOnlyTask taskToModify = lastShownList.get(commandModel.getIndex() - 1); + ReadOnlyTask taskToModify = lastShownList.get(index - 1); try { model.modifyTask(taskToModify, originalTask); diff --git a/src/main/java/seedu/savvytasker/logic/commands/UnaliasCommand.java b/src/main/java/seedu/savvytasker/logic/commands/UnaliasCommand.java index 275d889aeaa6..4f9e18c1e3ef 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/UnaliasCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/UnaliasCommand.java @@ -1,7 +1,6 @@ package seedu.savvytasker.logic.commands; import seedu.savvytasker.commons.exceptions.IllegalValueException; -import seedu.savvytasker.logic.commands.models.UnaliasCommandModel; import seedu.savvytasker.model.alias.AliasSymbol; import seedu.savvytasker.model.alias.DuplicateSymbolKeywordException; import seedu.savvytasker.model.alias.SymbolKeywordNotFoundException; @@ -21,7 +20,7 @@ public class UnaliasCommand extends ModelRequiringCommand { public static final String MESSAGE_SUCCESS = "Alias removed: %1$s"; public static final String MESSAGE_UNREGOGNIZED_ALIAS = "This alias is not in use"; - private UnaliasCommandModel commandModel; + private final String keyword; private AliasSymbol toUndo; /** @@ -29,9 +28,8 @@ public class UnaliasCommand extends ModelRequiringCommand { * * @throws IllegalValueException if any of the raw values are invalid */ - public UnaliasCommand(UnaliasCommandModel commandModel) { - assert commandModel != null; - this.commandModel = commandModel; + public UnaliasCommand(String keyword) { + this.keyword = keyword; this.toUndo = null; } @@ -41,7 +39,7 @@ public CommandResult execute() { AliasSymbol toRemove = null; for(AliasSymbol symbol : model.getSavvyTasker().getReadOnlyListOfAliasSymbols()) { - if (symbol.getKeyword().equals(this.commandModel.getKeyword())) { + if (symbol.getKeyword().equals(this.keyword)) { toRemove = symbol; break; } diff --git a/src/main/java/seedu/savvytasker/logic/commands/UnmarkCommand.java b/src/main/java/seedu/savvytasker/logic/commands/UnmarkCommand.java index 98ee57219411..feac83517f47 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/UnmarkCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/UnmarkCommand.java @@ -4,7 +4,6 @@ import seedu.savvytasker.commons.core.Messages; import seedu.savvytasker.commons.core.UnmodifiableObservableList; -import seedu.savvytasker.logic.commands.models.UnmarkCommandModel; import seedu.savvytasker.model.ReadOnlySavvyTasker; import seedu.savvytasker.model.SavvyTasker; import seedu.savvytasker.model.task.ReadOnlyTask; @@ -24,13 +23,12 @@ public class UnmarkCommand extends ModelRequiringCommand { public static final String MESSAGE_UNMARK_TASK_SUCCESS = "Unmarked Task: %1$s\n"; public static final String MESSAGE_UNMARK_TASK_FAIL = "Task is already unmarked!\n"; - - public final UnmarkCommandModel commandModel; + + private final int[] targetIndices; private ReadOnlySavvyTasker original; - public UnmarkCommand(UnmarkCommandModel commandModel) { - assert (commandModel != null); - this.commandModel = commandModel; + public UnmarkCommand(int[] targetIndices) { + this.targetIndices = targetIndices; } @Override @@ -39,7 +37,7 @@ public CommandResult execute() { UnmodifiableObservableList lastShownList = model.getFilteredTaskList(); LinkedList tasksToUnmark = new LinkedList(); - for(int targetIndex : commandModel.getTargetIndex()) { + for(int targetIndex : targetIndices) { if (lastShownList.size() < targetIndex || targetIndex <= 0) { indicateAttemptToExecuteIncorrectCommand(); return new CommandResult(Messages.MESSAGE_INVALID_TASK_DISPLAYED_INDEX); diff --git a/src/main/java/seedu/savvytasker/logic/commands/models/AddCommandModel.java b/src/main/java/seedu/savvytasker/logic/commands/models/AddCommandModel.java deleted file mode 100644 index 998480d63c77..000000000000 --- a/src/main/java/seedu/savvytasker/logic/commands/models/AddCommandModel.java +++ /dev/null @@ -1,116 +0,0 @@ -package seedu.savvytasker.logic.commands.models; - -import java.util.Date; - -import seedu.savvytasker.logic.parser.DateParser.InferredDate; -import seedu.savvytasker.model.task.PriorityLevel; -import seedu.savvytasker.model.task.RecurrenceType; - -/** - * Represents a model for use with the add command. - * @author A0139915W - */ -public class AddCommandModel extends CommandModel { - - private String taskName; - private Date startDateTime; - private Date endDateTime; - private String location; - private PriorityLevel priority; - private RecurrenceType recurringType; - private Integer numberOfRecurrence; - private String category; - private String description; - - public AddCommandModel(String taskName, InferredDate startDateTime, InferredDate endDateTime, String location, - PriorityLevel priority, RecurrenceType recurringType, Integer numberOfRecurrence, String category, - String description) { - this.taskName = taskName; - setStartDateTime(startDateTime); - setEndDateTime(endDateTime); - this.location = location; - this.priority = priority; - this.recurringType = recurringType; - this.numberOfRecurrence = numberOfRecurrence; - this.category = category; - this.description = description; - } - - public AddCommandModel(String taskName) { - this.taskName = taskName; - } - - public String getTaskName() { - return taskName; - } - - public void setTaskName(String taskName) { - this.taskName = taskName; - } - - public Date getStartDateTime() { - return startDateTime; - } - - public void setStartDateTime(InferredDate startDateTime) { - // TODO: Logic for parsing InferredDate to Date - this.startDateTime = null; - } - - public Date getEndDateTime() { - return endDateTime; - } - - public void setEndDateTime(InferredDate endDateTime) { - // TODO: Logic for parsing InferredDate to Date - this.endDateTime = null; - } - - public String getLocation() { - return location; - } - - public void setLocation(String location) { - this.location = location; - } - - public PriorityLevel getPriority() { - return priority; - } - - public void setPriority(PriorityLevel priority) { - this.priority = priority; - } - - public RecurrenceType getRecurringType() { - return recurringType; - } - - public void setRecurringType(RecurrenceType recurringType) { - this.recurringType = recurringType; - } - - public Integer getNumberOfRecurrence() { - return numberOfRecurrence; - } - - public void setNumberOfRecurrence(Integer numberOfRecurrence) { - this.numberOfRecurrence = numberOfRecurrence; - } - - public String getCategory() { - return category; - } - - public void setCategory(String category) { - this.category = category; - } - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } -} diff --git a/src/main/java/seedu/savvytasker/logic/commands/models/AliasCommandModel.java b/src/main/java/seedu/savvytasker/logic/commands/models/AliasCommandModel.java deleted file mode 100644 index ae819531fc38..000000000000 --- a/src/main/java/seedu/savvytasker/logic/commands/models/AliasCommandModel.java +++ /dev/null @@ -1,36 +0,0 @@ -package seedu.savvytasker.logic.commands.models; - -/** - * Represents a model for use with the alias command. - */ -public class AliasCommandModel extends CommandModel { - - private String keyword; - private String representingText; - - /** - * Creates the model to be used with the alias command. - * @param keyword The keyword. - * @param representingText The text that the keyword represents. - */ - public AliasCommandModel(String keyword, String representingText) { - this.keyword = keyword; - this.representingText = representingText; - } - - public String getKeyword() { - return keyword; - } - - public void setKeyword(String keyword) { - this.keyword = keyword; - } - - public String getRepresentingText() { - return representingText; - } - - public void setRepresentingText(String shortKeyword) { - this.representingText = shortKeyword; - } -} diff --git a/src/main/java/seedu/savvytasker/logic/commands/models/CommandModel.java b/src/main/java/seedu/savvytasker/logic/commands/models/CommandModel.java deleted file mode 100644 index e2bcd795b4fe..000000000000 --- a/src/main/java/seedu/savvytasker/logic/commands/models/CommandModel.java +++ /dev/null @@ -1,12 +0,0 @@ -package seedu.savvytasker.logic.commands.models; - -/** - * Represents a model for use with the commands. - */ -public abstract class CommandModel { - - protected CommandModel() { - - } - -} diff --git a/src/main/java/seedu/savvytasker/logic/commands/models/DeleteCommandModel.java b/src/main/java/seedu/savvytasker/logic/commands/models/DeleteCommandModel.java deleted file mode 100644 index e1eeecf8b05a..000000000000 --- a/src/main/java/seedu/savvytasker/logic/commands/models/DeleteCommandModel.java +++ /dev/null @@ -1,23 +0,0 @@ -package seedu.savvytasker.logic.commands.models; - -/** - * Represents a model for use with the delete command. - */ -public class DeleteCommandModel extends CommandModel { - - private int[] targetIndex; - - public DeleteCommandModel(int[] targetIndex) { - assert(targetIndex != null); - this.targetIndex = targetIndex; - } - - public int[] getTargetIndex() { - return targetIndex; - } - - public void setTargetIndex(int[] targetIndex) { - assert(targetIndex != null); - this.targetIndex = targetIndex; - } -} diff --git a/src/main/java/seedu/savvytasker/logic/commands/models/FindCommandModel.java b/src/main/java/seedu/savvytasker/logic/commands/models/FindCommandModel.java deleted file mode 100644 index 77b1f5447950..000000000000 --- a/src/main/java/seedu/savvytasker/logic/commands/models/FindCommandModel.java +++ /dev/null @@ -1,40 +0,0 @@ -package seedu.savvytasker.logic.commands.models; - -import seedu.savvytasker.model.task.FindType; - -/** - * Represents a model for use with the find command. - */ -public class FindCommandModel extends CommandModel { - - private FindType findType; - private String[] keywords; - - /** - * Creates a model to be used with the find command. - * @param findType Type of match - * @param keywords Keywords to match, must not be null - */ - public FindCommandModel(FindType findType, String[] keywords) { - assert (keywords != null); - this.keywords = keywords; - this.findType = findType; - } - - public String[] getKeywords() { - return keywords; - } - - public void setKeywords(String[] keywords) { - assert (keywords != null); - this.keywords = keywords; - } - - public FindType getFindType() { - return findType; - } - - public void setFindType(FindType findType) { - this.findType = findType; - } -} diff --git a/src/main/java/seedu/savvytasker/logic/commands/models/ListCommandModel.java b/src/main/java/seedu/savvytasker/logic/commands/models/ListCommandModel.java deleted file mode 100644 index 78f072d9d888..000000000000 --- a/src/main/java/seedu/savvytasker/logic/commands/models/ListCommandModel.java +++ /dev/null @@ -1,23 +0,0 @@ -package seedu.savvytasker.logic.commands.models; - -import seedu.savvytasker.model.task.ListType; - -/** - * Represents a model for use with the list command. - */ -public class ListCommandModel extends CommandModel { - - private ListType listType; - - public ListCommandModel(ListType listType) { - this.listType = listType; - } - - public ListType getListType() { - return listType; - } - - public void setListType(ListType listType) { - this.listType = listType; - } -} diff --git a/src/main/java/seedu/savvytasker/logic/commands/models/MarkCommandModel.java b/src/main/java/seedu/savvytasker/logic/commands/models/MarkCommandModel.java deleted file mode 100644 index 40705b417a43..000000000000 --- a/src/main/java/seedu/savvytasker/logic/commands/models/MarkCommandModel.java +++ /dev/null @@ -1,23 +0,0 @@ -package seedu.savvytasker.logic.commands.models; - -/** - * Represents a model for use with the mark command. - */ -public class MarkCommandModel extends CommandModel { - - private int[] targetIndex; - - public MarkCommandModel(int[] targetIndex) { - assert(targetIndex != null); - this.targetIndex = targetIndex; - } - - public int[] getTargetIndex() { - return targetIndex; - } - - public void setTargetIndex(int[] targetIndex) { - assert(targetIndex != null); - this.targetIndex = targetIndex; - } -} diff --git a/src/main/java/seedu/savvytasker/logic/commands/models/ModifyCommandModel.java b/src/main/java/seedu/savvytasker/logic/commands/models/ModifyCommandModel.java deleted file mode 100644 index ddb64b9bb4a8..000000000000 --- a/src/main/java/seedu/savvytasker/logic/commands/models/ModifyCommandModel.java +++ /dev/null @@ -1,126 +0,0 @@ -package seedu.savvytasker.logic.commands.models; - -import java.util.Date; - -import seedu.savvytasker.logic.parser.DateParser.InferredDate; -import seedu.savvytasker.model.task.PriorityLevel; -import seedu.savvytasker.model.task.RecurrenceType; - -/** - * Represents a model for use with the modify command. - * @author A0139915W - */ -public class ModifyCommandModel extends CommandModel { - - private int index; - private String taskName; - private Date startDateTime; - private Date endDateTime; - private String location; - private PriorityLevel priority; - private RecurrenceType recurringType; - private Integer numberOfRecurrence; - private String category; - private String description; - - public ModifyCommandModel(int index, String taskName, InferredDate startDateTime, InferredDate endDateTime, String location, - PriorityLevel priority, RecurrenceType recurringType, Integer numberOfRecurrence, String category, - String description) { - this.index = index; - this.taskName = taskName; - setStartDateTime(startDateTime); - setEndDateTime(endDateTime); - this.location = location; - this.priority = priority; - this.recurringType = recurringType; - this.numberOfRecurrence = numberOfRecurrence; - this.category = category; - this.description = description; - } - - public ModifyCommandModel(int index) { - this.index = index; - } - - public int getIndex() { - return index; - } - - public void setIndex(int index) { - this.index = index; - } - - public String getTaskName() { - return taskName; - } - - public void setTaskName(String taskName) { - this.taskName = taskName; - } - - public Date getStartDateTime() { - return startDateTime; - } - - public void setStartDateTime(InferredDate startDateTime) { - // TODO: Logic for parsing InferredDate to Date - this.startDateTime = null; - } - - public Date getEndDateTime() { - return endDateTime; - } - - public void setEndDateTime(InferredDate endDateTime) { - // TODO: Logic for parsing InferredDate to Date - this.endDateTime = null; - } - - public String getLocation() { - return location; - } - - public void setLocation(String location) { - this.location = location; - } - - public PriorityLevel getPriority() { - return priority; - } - - public void setPriority(PriorityLevel priority) { - this.priority = priority; - } - - public RecurrenceType getRecurringType() { - return recurringType; - } - - public void setRecurringType(RecurrenceType recurringType) { - this.recurringType = recurringType; - } - - public Integer getNumberOfRecurrence() { - return numberOfRecurrence; - } - - public void setNumberOfRecurrence(Integer numberOfRecurrence) { - this.numberOfRecurrence = numberOfRecurrence; - } - - public String getCategory() { - return category; - } - - public void setCategory(String category) { - this.category = category; - } - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } -} diff --git a/src/main/java/seedu/savvytasker/logic/commands/models/SelectCommandModel.java b/src/main/java/seedu/savvytasker/logic/commands/models/SelectCommandModel.java deleted file mode 100644 index c791c035433f..000000000000 --- a/src/main/java/seedu/savvytasker/logic/commands/models/SelectCommandModel.java +++ /dev/null @@ -1,23 +0,0 @@ -package seedu.savvytasker.logic.commands.models; - -/** - * Represents a model for use with the select command. - */ -public class SelectCommandModel extends CommandModel { - - private int[] targetIndex; - - public SelectCommandModel(int[] targetIndex) { - assert(targetIndex != null); - this.targetIndex = targetIndex; - } - - public int[] getTargetIndex() { - return targetIndex; - } - - public void setTargetIndex(int[] targetIndex) { - assert(targetIndex != null); - this.targetIndex = targetIndex; - } -} diff --git a/src/main/java/seedu/savvytasker/logic/commands/models/UnaliasCommandModel.java b/src/main/java/seedu/savvytasker/logic/commands/models/UnaliasCommandModel.java deleted file mode 100644 index ebc11c3eb152..000000000000 --- a/src/main/java/seedu/savvytasker/logic/commands/models/UnaliasCommandModel.java +++ /dev/null @@ -1,27 +0,0 @@ -package seedu.savvytasker.logic.commands.models; - -/** - * Represents a model for use with the unalias command. - */ -public class UnaliasCommandModel extends CommandModel { - - private String keyword; - - /** - * Creates the model to be used with the unalias command. - * @param shortKeyword The keyword to replace with. - */ - public UnaliasCommandModel(String keyword) { - assert(keyword != null && !keyword.isEmpty()); - this.keyword = keyword; - } - - public String getKeyword() { - return keyword; - } - - public void setKeyword(String keyword) { - assert(keyword != null && !keyword.isEmpty()); - this.keyword = keyword; - } -} diff --git a/src/main/java/seedu/savvytasker/logic/commands/models/UnmarkCommandModel.java b/src/main/java/seedu/savvytasker/logic/commands/models/UnmarkCommandModel.java deleted file mode 100644 index 2b5b3cf59660..000000000000 --- a/src/main/java/seedu/savvytasker/logic/commands/models/UnmarkCommandModel.java +++ /dev/null @@ -1,23 +0,0 @@ -package seedu.savvytasker.logic.commands.models; - -/** - * Represents a model for use with the unmark command. - */ -public class UnmarkCommandModel extends CommandModel { - - private int[] targetIndex; - - public UnmarkCommandModel(int[] targetIndex) { - assert(targetIndex != null); - this.targetIndex = targetIndex; - } - - public int[] getTargetIndex() { - return targetIndex; - } - - public void setTargetIndex(int[] targetIndex) { - assert(targetIndex != null); - this.targetIndex = targetIndex; - } -} diff --git a/src/main/java/seedu/savvytasker/logic/parser/AddCommandParser.java b/src/main/java/seedu/savvytasker/logic/parser/AddCommandParser.java index 7c82874b6939..cd16976d29dd 100644 --- a/src/main/java/seedu/savvytasker/logic/parser/AddCommandParser.java +++ b/src/main/java/seedu/savvytasker/logic/parser/AddCommandParser.java @@ -5,7 +5,6 @@ import seedu.savvytasker.commons.core.Messages; import seedu.savvytasker.logic.commands.AddCommand; -import seedu.savvytasker.logic.commands.models.AddCommandModel; import seedu.savvytasker.logic.parser.DateParser.InferredDate; import seedu.savvytasker.model.task.PriorityLevel; import seedu.savvytasker.model.task.RecurrenceType; @@ -64,11 +63,10 @@ public AddCommand parse(String commandText) throws ParseException { String category = TASK_PARSER.parseCategory(matcher.group(REGEX_REF_CATEGORY)); String description = TASK_PARSER.parseDescription(matcher.group(REGEX_REF_DESCRIPTION)); - return new AddCommand( - new AddCommandModel(taskName, startDate, + return new AddCommand(taskName, startDate, endDate, location, priority, recurrence, nrOfRecurrence, - category, description)); + category, description); } throw new ParseException(commandText, String.format( diff --git a/src/main/java/seedu/savvytasker/logic/parser/AliasCommandParser.java b/src/main/java/seedu/savvytasker/logic/parser/AliasCommandParser.java index 88ba8f176474..3011836487bc 100644 --- a/src/main/java/seedu/savvytasker/logic/parser/AliasCommandParser.java +++ b/src/main/java/seedu/savvytasker/logic/parser/AliasCommandParser.java @@ -5,7 +5,6 @@ import seedu.savvytasker.commons.core.Messages; import seedu.savvytasker.logic.commands.AliasCommand; -import seedu.savvytasker.logic.commands.models.AliasCommandModel; public class AliasCommandParser implements CommandParser { private static final String HEADER = "alias"; @@ -42,7 +41,7 @@ public AliasCommand parse(String commandText) throws ParseException { if (matcher.matches()) { String representation = parseRepresentation(matcher.group(REGEX_REF_REPRESENTATION)); String keyword = parseKeyword(matcher.group(REGEX_REF_KEYWORD)); - return new AliasCommand(new AliasCommandModel(keyword, representation)); + return new AliasCommand(keyword, representation); } throw new ParseException(commandText, String.format( diff --git a/src/main/java/seedu/savvytasker/logic/parser/DeleteCommandParser.java b/src/main/java/seedu/savvytasker/logic/parser/DeleteCommandParser.java index 6b69c94d57b2..439fae24d8b2 100644 --- a/src/main/java/seedu/savvytasker/logic/parser/DeleteCommandParser.java +++ b/src/main/java/seedu/savvytasker/logic/parser/DeleteCommandParser.java @@ -5,7 +5,6 @@ import seedu.savvytasker.commons.core.Messages; import seedu.savvytasker.logic.commands.DeleteCommand; -import seedu.savvytasker.logic.commands.models.DeleteCommandModel; public class DeleteCommandParser implements CommandParser { private static final String HEADER = "delete"; @@ -33,8 +32,7 @@ public DeleteCommand parse(String commandText) throws ParseException { Matcher matcher = REGEX_PATTERN.matcher(commandText); if (matcher.matches()) { int[] indices = parseIndices(matcher.group(REGEX_REF_INDICES)); - - return new DeleteCommand(new DeleteCommandModel(indices)); + return new DeleteCommand(indices); } throw new ParseException(commandText, String.format( diff --git a/src/main/java/seedu/savvytasker/logic/parser/FindCommandParser.java b/src/main/java/seedu/savvytasker/logic/parser/FindCommandParser.java index 49ade30e3ff6..de681a8c61a5 100644 --- a/src/main/java/seedu/savvytasker/logic/parser/FindCommandParser.java +++ b/src/main/java/seedu/savvytasker/logic/parser/FindCommandParser.java @@ -6,7 +6,6 @@ import seedu.savvytasker.commons.core.Messages; import seedu.savvytasker.logic.commands.FindCommand; -import seedu.savvytasker.logic.commands.models.FindCommandModel; import seedu.savvytasker.model.task.FindType; public class FindCommandParser implements CommandParser { @@ -41,7 +40,7 @@ public FindCommand parse(String commandText) throws ParseException { String[] keywords = parseKeywords(matcher.group(REGEX_REF_KEYWORDS_BEFORE_TYPE), matcher.group(REGEX_REF_KEYWORDS_AFTER_TYPE)); - return new FindCommand(new FindCommandModel(findType, keywords)); + return new FindCommand(findType, keywords); } throw new ParseException(commandText, String.format(Messages.MESSAGE_INVALID_COMMAND_FORMAT, getRequiredFormat())); diff --git a/src/main/java/seedu/savvytasker/logic/parser/ListCommandParser.java b/src/main/java/seedu/savvytasker/logic/parser/ListCommandParser.java index 6f16320adbfc..a0d69d5db143 100644 --- a/src/main/java/seedu/savvytasker/logic/parser/ListCommandParser.java +++ b/src/main/java/seedu/savvytasker/logic/parser/ListCommandParser.java @@ -5,7 +5,6 @@ import seedu.savvytasker.commons.core.Messages; import seedu.savvytasker.logic.commands.ListCommand; -import seedu.savvytasker.logic.commands.models.ListCommandModel; import seedu.savvytasker.model.task.ListType; public class ListCommandParser implements CommandParser { @@ -34,7 +33,7 @@ public ListCommand parse(String commandText) throws ParseException { if (matcher.matches()) { ListType listType = parseListType(matcher.group(REGEX_REF_LIST_TYPE)); - return new ListCommand(new ListCommandModel(listType)); + return new ListCommand(listType); } throw new ParseException(commandText, String.format( diff --git a/src/main/java/seedu/savvytasker/logic/parser/MarkCommandParser.java b/src/main/java/seedu/savvytasker/logic/parser/MarkCommandParser.java index 301f5fdf5f76..bb3a682bebbb 100644 --- a/src/main/java/seedu/savvytasker/logic/parser/MarkCommandParser.java +++ b/src/main/java/seedu/savvytasker/logic/parser/MarkCommandParser.java @@ -5,7 +5,6 @@ import seedu.savvytasker.commons.core.Messages; import seedu.savvytasker.logic.commands.MarkCommand; -import seedu.savvytasker.logic.commands.models.MarkCommandModel; public class MarkCommandParser implements CommandParser { private static final String HEADER = "mark"; @@ -33,9 +32,7 @@ public MarkCommand parse(String commandText) throws ParseException { Matcher matcher = REGEX_PATTERN.matcher(commandText); if (matcher.matches()) { int[] indices = parseIndices(matcher.group(REGEX_REF_INDICES)); - - // TODO: Integrate with MarkCommand properly - return new MarkCommand(new MarkCommandModel(indices)); + return new MarkCommand(indices); } throw new ParseException(commandText, String.format( diff --git a/src/main/java/seedu/savvytasker/logic/parser/ModifyCommandParser.java b/src/main/java/seedu/savvytasker/logic/parser/ModifyCommandParser.java index c5dd487168b9..8010b505c490 100644 --- a/src/main/java/seedu/savvytasker/logic/parser/ModifyCommandParser.java +++ b/src/main/java/seedu/savvytasker/logic/parser/ModifyCommandParser.java @@ -5,7 +5,6 @@ import seedu.savvytasker.commons.core.Messages; import seedu.savvytasker.logic.commands.ModifyCommand; -import seedu.savvytasker.logic.commands.models.ModifyCommandModel; import seedu.savvytasker.logic.parser.DateParser.InferredDate; import seedu.savvytasker.model.task.PriorityLevel; import seedu.savvytasker.model.task.RecurrenceType; @@ -69,11 +68,10 @@ public ModifyCommand parse(String commandText) throws ParseException { String category = TASK_PARSER.parseCategory(matcher.group(REGEX_REF_CATEGORY)); String description = TASK_PARSER.parseDescription(matcher.group(REGEX_REF_DESCRIPTION)); - return new ModifyCommand( - new ModifyCommandModel(index, taskName, startDate, + return new ModifyCommand(index, taskName, startDate, endDate, location, priority, recurrence, nrOfRecurrence, - category, description)); + category, description); } throw new ParseException(commandText, String.format( diff --git a/src/main/java/seedu/savvytasker/logic/parser/UnaliasCommandParser.java b/src/main/java/seedu/savvytasker/logic/parser/UnaliasCommandParser.java index a770660253d7..5fc61f5d5947 100644 --- a/src/main/java/seedu/savvytasker/logic/parser/UnaliasCommandParser.java +++ b/src/main/java/seedu/savvytasker/logic/parser/UnaliasCommandParser.java @@ -5,7 +5,6 @@ import seedu.savvytasker.commons.core.Messages; import seedu.savvytasker.logic.commands.UnaliasCommand; -import seedu.savvytasker.logic.commands.models.UnaliasCommandModel; public class UnaliasCommandParser implements CommandParser { private static final String HEADER = "unalias"; @@ -37,7 +36,7 @@ public UnaliasCommand parse(String commandText) throws ParseException { Matcher matcher = REGEX_PATTERN.matcher(commandText); if (matcher.matches()) { String keyword = parseKeyword(matcher.group(REGEX_REF_KEYWORD)); - return new UnaliasCommand(new UnaliasCommandModel(keyword)); + return new UnaliasCommand(keyword); } throw new ParseException(commandText, String.format( diff --git a/src/main/java/seedu/savvytasker/logic/parser/UnmarkCommandParser.java b/src/main/java/seedu/savvytasker/logic/parser/UnmarkCommandParser.java index f00259977f5c..7261d671482a 100644 --- a/src/main/java/seedu/savvytasker/logic/parser/UnmarkCommandParser.java +++ b/src/main/java/seedu/savvytasker/logic/parser/UnmarkCommandParser.java @@ -5,7 +5,6 @@ import seedu.savvytasker.commons.core.Messages; import seedu.savvytasker.logic.commands.UnmarkCommand; -import seedu.savvytasker.logic.commands.models.UnmarkCommandModel; public class UnmarkCommandParser implements CommandParser { private static final String HEADER = "unmark"; @@ -35,7 +34,7 @@ public UnmarkCommand parse(String commandText) throws ParseException { int[] indices = parseIndices(matcher.group(REGEX_REF_INDICES)); // TODO: Integrate UnmarkCommand properly! - return new UnmarkCommand(new UnmarkCommandModel(indices)); + return new UnmarkCommand(indices); } throw new ParseException(commandText, String.format( diff --git a/src/main/java/seedu/savvytasker/model/task/Task.java b/src/main/java/seedu/savvytasker/model/task/Task.java index 2d1ca88fcd0b..858d850b0002 100644 --- a/src/main/java/seedu/savvytasker/model/task/Task.java +++ b/src/main/java/seedu/savvytasker/model/task/Task.java @@ -3,8 +3,6 @@ import java.util.Date; import java.util.Objects; -import seedu.savvytasker.logic.commands.models.ModifyCommandModel; - /** * Represents a Task in the task list. */ @@ -59,7 +57,9 @@ public Task(ReadOnlyTask source) { /** * Copy and modify constructor */ - public Task(ReadOnlyTask source, ModifyCommandModel commandModel) { + public Task(ReadOnlyTask source, String taskName, Date startDateTime, Date endDateTime, String location, + PriorityLevel priority, RecurrenceType recurringType, Integer numberOfRecurrence, String category, + String description) { this(source.getId(), source.getTaskName(), source.getStartDateTime(), source.getEndDateTime(), source.getLocation(), source.getPriority(), source.getRecurringType(), source.getNumberOfRecurrence(), @@ -67,15 +67,15 @@ public Task(ReadOnlyTask source, ModifyCommandModel commandModel) { //this.id should follow that of the source. //this.isArchived should follow that of the source. - this.taskName = commandModel.getTaskName() == null ? this.taskName : commandModel.getTaskName(); - this.startDateTime = commandModel.getStartDateTime() == null ? this.startDateTime : commandModel.getStartDateTime(); - this.endDateTime = commandModel.getEndDateTime() == null ? this.endDateTime : commandModel.getEndDateTime(); - this.location = commandModel.getLocation() == null ? this.location : commandModel.getLocation(); - this.priority = commandModel.getPriority() == null ? this.priority : commandModel.getPriority(); - this.recurringType = commandModel.getRecurringType() == null ? this.recurringType : commandModel.getRecurringType(); - this.numberOfRecurrence = commandModel.getNumberOfRecurrence() == null ? this.numberOfRecurrence : commandModel.getNumberOfRecurrence().intValue(); - this.category = commandModel.getCategory() == null ? this.category : commandModel.getCategory(); - this.description = commandModel.getDescription() == null ? this.description : commandModel.getDescription(); + this.taskName = taskName == null ? this.taskName : taskName; + this.startDateTime = startDateTime == null ? this.startDateTime : startDateTime; + this.endDateTime = endDateTime == null ? this.endDateTime : endDateTime; + this.location = location == null ? this.location : location; + this.priority = priority == null ? this.priority : priority; + this.recurringType = recurringType == null ? this.recurringType : recurringType; + this.numberOfRecurrence = numberOfRecurrence == null ? this.numberOfRecurrence : numberOfRecurrence.intValue(); + this.category = category == null ? this.category : category; + this.description = description == null ? this.description : description; } @Override From e20948dac402cd5d33ccb8029c7d22dacab4aabf Mon Sep 17 00:00:00 2001 From: e0003801 Date: Wed, 26 Oct 2016 09:30:08 +0800 Subject: [PATCH 22/55] Update Architecture diagram --- docs/images/Architecture.png | Bin 35271 -> 49778 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/images/Architecture.png b/docs/images/Architecture.png index bdc789000f778ee47e3c8c993e8818b940ad4b9a..e387a5121cff97bb4111e46a169ff19778d4128d 100644 GIT binary patch literal 49778 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 From aaf4d799bcb0dc13e955690af6702310257c5844 Mon Sep 17 00:00:00 2001 From: e0003801 Date: Wed, 26 Oct 2016 09:57:03 +0800 Subject: [PATCH 23/55] Update LogicClassDiagram, fix arrow in Architecture Diagram --- docs/images/Architecture.png | Bin 49778 -> 49857 bytes docs/images/LogicClassDiagram.png | Bin 25114 -> 46355 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/images/Architecture.png b/docs/images/Architecture.png index e387a5121cff97bb4111e46a169ff19778d4128d..be91e60933ece6cb810516c235bcfd2bcf752aa4 100644 GIT binary patch literal 49857 zcmdSBcT^Mow>}y`ictiSA}xTZG!c;|y(mSLPC!6FkPZO_ArvWsfPhq`OAR#;dXX*` zn)FU+(n1Zrx72n3>htnx@3 z1iIh>0ujekkO4>Nx8taRA4D$N$_m7C-@JbTe_XJZSCa>UN+U0wnvnv3Uwoxv-~s|& z`HBA~isie)3>;*9qxkHNj+50JxS6vhNX_=8vy%((7rTa)mF-JQU#!S$5a_$$<45wk z?j~!K7yWdH68E=$OqFdEl;yGK`K5E`abLK6UF_b2Om&*xkkH3Ug6$Lrv|keaOf&x^ zd`ObN$4ECz%uDux`d(gMy2A|$CHk?0Nh{p3xU1s-YbbnBa(OV$;tLIr<)JU z-z;mFJ59^LhZDYhVHs%fg6mW}8oTr^q?Jzgv1$W3YLf

V~h{$@#o7(ADfb^w(_|*e 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

f?+NC_2 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 literal 49778 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ΞviqS_Vi*-mYQf!nAbl3rg09oX`aB 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 W2k$o4<7$WD)N>ko>cwi;?)?v41X;-d literal 25114 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 Date: Wed, 26 Oct 2016 10:22:49 +0800 Subject: [PATCH 24/55] Update DeletePersonSdForLogic.png --- docs/images/DeletePersonSdForLogic.png | Bin 33338 -> 53330 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/images/DeletePersonSdForLogic.png b/docs/images/DeletePersonSdForLogic.png index 6c272fb17af609864e7d3801148621b3250de02b..109f4bc4d39021e4e3b41370d0a493865ef3c497 100644 GIT binary patch literal 53330 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 VYzq12hoI};(9pYDqIUc7{{r)Cfr$VB literal 33338 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 IXmj=d09G0d;Q#;t From 3191f505ae94f3208d771c191a560c3dd7371a18 Mon Sep 17 00:00:00 2001 From: e0003801 Date: Wed, 26 Oct 2016 10:25:42 +0800 Subject: [PATCH 25/55] Add * quantifier to CommandParser interface for LogicClassDiagram --- docs/images/LogicClassDiagram.png | Bin 46355 -> 46494 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/images/LogicClassDiagram.png b/docs/images/LogicClassDiagram.png index ee1a17dd43f811e109b61e12d15116cbd30b3d2b..b21e58f52dd4d40a711073ff887569441811b99d 100644 GIT binary patch literal 46494 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

k9JsEi>*Pvn~%dCF;Lb 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 literal 46355 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ΞviqS_Vi*-mYQf!nAbl3rg09oX`aB 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 W2k$o4<7$WD)N>ko>cwi;?)?v41X;-d From c54fcbc03bfeb7a9cb4094acb0253f21af8ecd01 Mon Sep 17 00:00:00 2001 From: qhng Date: Wed, 26 Oct 2016 12:51:37 +0800 Subject: [PATCH 26/55] Fix default values not being used for Task --- .../java/seedu/savvytasker/model/task/Task.java | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/main/java/seedu/savvytasker/model/task/Task.java b/src/main/java/seedu/savvytasker/model/task/Task.java index 858d850b0002..006bb51a56e3 100644 --- a/src/main/java/seedu/savvytasker/model/task/Task.java +++ b/src/main/java/seedu/savvytasker/model/task/Task.java @@ -28,8 +28,16 @@ public Task(int id, String taskName, Date startDateTime, Date endDateTime, Strin this.startDateTime = startDateTime; this.endDateTime = endDateTime; this.location = location; - this.priority = priority; - this.recurringType = recurringType; + if (priority == null) { + this.priority = PriorityLevel.Medium; + } else { + this.priority = priority; + } + if (recurringType == null) { + this.recurringType = RecurrenceType.None; + } else { + this.recurringType = recurringType; + } if (numberOfRecurrence == null) { this.numberOfRecurrence = 0; } else { @@ -42,6 +50,10 @@ public Task(int id, String taskName, Date startDateTime, Date endDateTime, Strin public Task(String taskName) { this.taskName = taskName; + // sets initial default values + this.priority = PriorityLevel.Medium; + this.recurringType = RecurrenceType.None; + this.numberOfRecurrence = 0; } /** From 43c5e9cd6913fba8611cec1c6ab4fd2576c23d20 Mon Sep 17 00:00:00 2001 From: qhng Date: Wed, 26 Oct 2016 12:53:19 +0800 Subject: [PATCH 27/55] Update SUT components to start off with default values specified in Task --- src/test/java/guitests/ListCommandTest.java | 2 +- src/test/java/seedu/savvytasker/testutil/TestTask.java | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/test/java/guitests/ListCommandTest.java b/src/test/java/guitests/ListCommandTest.java index 1dc3be5934e0..d068b12b5855 100644 --- a/src/test/java/guitests/ListCommandTest.java +++ b/src/test/java/guitests/ListCommandTest.java @@ -28,7 +28,7 @@ public void list_nonEmptyList_byDueDate() { @Test public void list_nonEmptyList_byPriority() { assertListResult("list t/PriorityLevel", td.highPriority, td.medPriority, - td.lowPriority, td.furthestDue, td.nearerDue, td.notSoNearerDue, td.earliestDue); //multiple results + td.furthestDue, td.nearerDue, td.notSoNearerDue, td.earliestDue, td.lowPriority); //multiple results } @Test diff --git a/src/test/java/seedu/savvytasker/testutil/TestTask.java b/src/test/java/seedu/savvytasker/testutil/TestTask.java index 223e9c412af7..d47f7ee3bee0 100644 --- a/src/test/java/seedu/savvytasker/testutil/TestTask.java +++ b/src/test/java/seedu/savvytasker/testutil/TestTask.java @@ -24,6 +24,10 @@ public class TestTask implements ReadOnlyTask { private boolean isArchived; public TestTask() { + // sets initial default values + this.priority = PriorityLevel.Medium; + this.recurringType = RecurrenceType.None; + this.numberOfRecurrence = 0; } public int getId() { From 0b87be02c305feaa8106193dcbe28905f911bd54 Mon Sep 17 00:00:00 2001 From: qhng Date: Wed, 26 Oct 2016 12:53:36 +0800 Subject: [PATCH 28/55] Implement smart defaults for date --- .../savvytasker/commons/core/Messages.java | 1 + .../commons/util/SmartDefaultDates.java | 152 ++++++++++++++++++ .../logic/commands/AddCommand.java | 16 +- .../logic/commands/MarkCommand.java | 3 + .../logic/commands/ModifyCommand.java | 19 ++- .../logic/commands/UnmarkCommand.java | 3 + .../java/seedu/savvytasker/model/Model.java | 5 +- .../seedu/savvytasker/model/ModelManager.java | 5 +- .../seedu/savvytasker/model/SavvyTasker.java | 5 +- .../savvytasker/model/task/TaskList.java | 38 ++++- .../testutil/SavvyTaskerBuilder.java | 3 +- .../testutil/TypicalTestTasks.java | 3 + 12 files changed, 231 insertions(+), 22 deletions(-) create mode 100644 src/main/java/seedu/savvytasker/commons/util/SmartDefaultDates.java diff --git a/src/main/java/seedu/savvytasker/commons/core/Messages.java b/src/main/java/seedu/savvytasker/commons/core/Messages.java index d9083d241b93..134dcd37d6b9 100644 --- a/src/main/java/seedu/savvytasker/commons/core/Messages.java +++ b/src/main/java/seedu/savvytasker/commons/core/Messages.java @@ -9,5 +9,6 @@ public class Messages { public static final String MESSAGE_INVALID_COMMAND_FORMAT = "Invalid command format! \n%1$s"; public static final String MESSAGE_INVALID_TASK_DISPLAYED_INDEX = "The task index provided is invalid"; public static final String MESSAGE_TASKS_LISTED_OVERVIEW = "%1$d tasks listed!"; + public static final String MESSAGE_INVALID_START_END = "The end time cannot be earlier than the start time"; } diff --git a/src/main/java/seedu/savvytasker/commons/util/SmartDefaultDates.java b/src/main/java/seedu/savvytasker/commons/util/SmartDefaultDates.java new file mode 100644 index 000000000000..d23b4ed64516 --- /dev/null +++ b/src/main/java/seedu/savvytasker/commons/util/SmartDefaultDates.java @@ -0,0 +1,152 @@ +package seedu.savvytasker.commons.util; + +import java.util.Calendar; +import java.util.Date; + +import seedu.savvytasker.logic.parser.DateParser.InferredDate; + +/** + * Helper functions for handling dates. + * @author A0139915W + */ + +public class SmartDefaultDates { + + private Date startDateTime; + private Date endDateTime; + private final Calendar calendar; + private final Calendar today; + + /** + * + * @param startDateTime Starting date time + * @param endDateTime Ending date time + * @throws InvalidDateException If endDateTime is earlier than startDateTime + */ + public SmartDefaultDates(InferredDate startDateTime, InferredDate endDateTime) { + calendar = Calendar.getInstance(); + today = Calendar.getInstance(); + today.setTime(new Date()); + if (startDateTime == null && endDateTime == null) { + // dates not being supplied, nothing to parse + } else if (startDateTime == null && endDateTime != null) { + // apply smart default for endDateTime only + parseEnd(endDateTime); + } else if (startDateTime != null && endDateTime == null) { + // apply smart default for startDateTime only + parseStart(startDateTime); + } else { + parseStartAndEnd(startDateTime, endDateTime); + } + } + + /** + * Gets the smart default for end date + * @param today the time now + * @param endDateTime the end time to parse + * @return + */ + public Date getEnd(InferredDate endDateTime) { + if (endDateTime == null) return null; + calendar.setTime(endDateTime.getInferredDateTime()); + if (endDateTime.isDateInferred()) { + // date not supplied + // defaults to today + calendar.set(Calendar.DATE, today.get(Calendar.DATE)); + calendar.set(Calendar.MONTH, today.get(Calendar.MONTH)); + calendar.set(Calendar.YEAR, today.get(Calendar.YEAR)); + } else if (endDateTime.isTimeInferred()) { + // time not supplied + // defaults to 2359 + calendar.set(Calendar.HOUR_OF_DAY, 23); + calendar.set(Calendar.MINUTE, 59); + calendar.set(Calendar.SECOND, 59); + } + return calendar.getTime(); + } + + /** + * Sets the starting and ending date/time based on defaults for providing only + * the end time + * @param endDateTime end time supplied + */ + private void parseEnd(InferredDate endDateTime) { + assert endDateTime.getInferredDateTime() != null; + Date start = new Date(); + this.endDateTime = getEnd(endDateTime); + + // Since only end date is supplied, the task is considered to start at 12am today + calendar.setTime(start); + calendar.set(Calendar.HOUR_OF_DAY, 0); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.SECOND, 0); + this.startDateTime = calendar.getTime(); + } + + + /** + * Gets the smart default for start date + * @param today the time now + * @param startDateTime the start time to parse + * @return + */ + public Date getStart(InferredDate startDateTime) { + if (startDateTime == null) return null; + calendar.setTime(startDateTime.getInferredDateTime()); + if (startDateTime.isDateInferred()) { + // date not supplied + // defaults to today + calendar.set(Calendar.DATE, today.get(Calendar.DATE)); + calendar.set(Calendar.MONTH, today.get(Calendar.MONTH)); + calendar.set(Calendar.YEAR, today.get(Calendar.YEAR)); + } else if (startDateTime.isTimeInferred()) { + // time not supplied + // defaults to 0000 + calendar.set(Calendar.HOUR_OF_DAY, 0); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.SECOND, 0); + } + return calendar.getTime(); + } + + + /** + * Sets the starting and ending date/time based on defaults for providing only + * the start time + * @param startDateTime start time supplied + */ + private void parseStart(InferredDate startDateTime) { + assert startDateTime.getInferredDateTime() != null; + Date end = (Date)startDateTime.getInferredDateTime().clone(); + this.startDateTime = getStart(startDateTime); + + // Since only the start time is supplied, the task is considered to end today 2359 on the same day as start. + calendar.setTime(end); + calendar.set(Calendar.HOUR_OF_DAY, 23); + calendar.set(Calendar.MINUTE, 59); + calendar.set(Calendar.SECOND, 59); + this.endDateTime = calendar.getTime(); + } + + private void parseStartAndEnd(InferredDate startDateTime, InferredDate endDateTime) { + assert endDateTime.getInferredDateTime() != null; + assert startDateTime.getInferredDateTime() != null; + Date start = getStart(startDateTime); + Date end = getEnd(endDateTime); + this.startDateTime = start; + this.endDateTime = end; + if (this.startDateTime.compareTo(this.endDateTime) > 0) { + calendar.setTime(this.endDateTime); + calendar.add(Calendar.DATE, 7); + this.endDateTime = calendar.getTime(); + } + } + + public Date getStartDate() { + return startDateTime; + } + + public Date getEndDate() { + return endDateTime; + } +} \ No newline at end of file diff --git a/src/main/java/seedu/savvytasker/logic/commands/AddCommand.java b/src/main/java/seedu/savvytasker/logic/commands/AddCommand.java index f44cafab416d..07d16272c5d8 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/AddCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/AddCommand.java @@ -1,14 +1,14 @@ package seedu.savvytasker.logic.commands; -import java.util.Date; - import seedu.savvytasker.commons.core.UnmodifiableObservableList; +import seedu.savvytasker.commons.util.SmartDefaultDates; import seedu.savvytasker.logic.parser.DateParser.InferredDate; import seedu.savvytasker.model.task.PriorityLevel; import seedu.savvytasker.model.task.ReadOnlyTask; import seedu.savvytasker.model.task.RecurrenceType; import seedu.savvytasker.model.task.Task; import seedu.savvytasker.model.task.TaskList.DuplicateTaskException; +import seedu.savvytasker.model.task.TaskList.InvalidDateException; import seedu.savvytasker.model.task.TaskList.TaskNotFoundException; /** @@ -26,12 +26,11 @@ public class AddCommand extends ModelRequiringCommand { public static final String MESSAGE_SUCCESS = "New task added: %1$s"; public static final String MESSAGE_DUPLICATE_TASK = "This task already exists in the task list"; + public static final String MESSAGE_INVALID_START_END = "The end time cannot be earlier than the start time"; private final String taskName; private final InferredDate startDateTime; - private Date inferredStart; private final InferredDate endDateTime; - private Date inferredEnd; private final String location; private final PriorityLevel priority; private final RecurrenceType recurringType; @@ -56,8 +55,6 @@ public AddCommand(String taskName, InferredDate startDateTime, InferredDate endD this.numberOfRecurrence = numberOfRecurrence; this.category = category; this.description = description; - - createTask(); } private void createTask() { @@ -65,7 +62,8 @@ private void createTask() { final int taskId = 0; // taskId to be assigned by ModelManager, leave as 0 //TODO: Smart defaults for date - this.toAdd = new Task(taskId, taskName, inferredStart, inferredEnd, + SmartDefaultDates sdd = new SmartDefaultDates(startDateTime, endDateTime); + this.toAdd = new Task(taskId, taskName, sdd.getStartDate(), sdd.getEndDate(), location, priority, recurringType, numberOfRecurrence, category, description, isArchived); } @@ -73,11 +71,15 @@ private void createTask() { @Override public CommandResult execute() { assert model != null; + createTask(); + try { model.addTask(toAdd); return new CommandResult(String.format(MESSAGE_SUCCESS, toAdd)); } catch (DuplicateTaskException e) { return new CommandResult(MESSAGE_DUPLICATE_TASK); + } catch (InvalidDateException ex) { + return new CommandResult(MESSAGE_INVALID_START_END); } } diff --git a/src/main/java/seedu/savvytasker/logic/commands/MarkCommand.java b/src/main/java/seedu/savvytasker/logic/commands/MarkCommand.java index 931c81b9e4c0..2f1dc16538cf 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/MarkCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/MarkCommand.java @@ -9,6 +9,7 @@ import seedu.savvytasker.model.task.ReadOnlyTask; import seedu.savvytasker.model.task.Task; import seedu.savvytasker.model.task.TaskList.DuplicateTaskException; +import seedu.savvytasker.model.task.TaskList.InvalidDateException; import seedu.savvytasker.model.task.TaskList.TaskNotFoundException; public class MarkCommand extends ModelRequiringCommand { @@ -63,6 +64,8 @@ public CommandResult execute() { assert false : "The target task cannot be missing"; } catch (DuplicateTaskException e) { e.printStackTrace(); + } catch (InvalidDateException e) { + assert false : "The target task should be valid, only the archived flag is set"; } return new CommandResult(resultSb.toString()); } diff --git a/src/main/java/seedu/savvytasker/logic/commands/ModifyCommand.java b/src/main/java/seedu/savvytasker/logic/commands/ModifyCommand.java index 07ba3a3a846c..1d7d1be6a74f 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/ModifyCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/ModifyCommand.java @@ -1,14 +1,14 @@ package seedu.savvytasker.logic.commands; -import java.util.Date; - import seedu.savvytasker.commons.core.Messages; import seedu.savvytasker.commons.core.UnmodifiableObservableList; +import seedu.savvytasker.commons.util.SmartDefaultDates; import seedu.savvytasker.logic.parser.DateParser.InferredDate; import seedu.savvytasker.model.task.PriorityLevel; import seedu.savvytasker.model.task.ReadOnlyTask; import seedu.savvytasker.model.task.RecurrenceType; import seedu.savvytasker.model.task.Task; +import seedu.savvytasker.model.task.TaskList.InvalidDateException; import seedu.savvytasker.model.task.TaskList.TaskNotFoundException; /** @@ -32,9 +32,7 @@ public class ModifyCommand extends ModelRequiringCommand { private final int index; private final String taskName; private final InferredDate startDateTime; - private Date inferredStart; private final InferredDate endDateTime; - private Date inferredEnd; private final String location; private final PriorityLevel priority; private final RecurrenceType recurringType; @@ -71,10 +69,13 @@ public CommandResult execute() { indicateAttemptToExecuteIncorrectCommand(); return new CommandResult(Messages.MESSAGE_INVALID_TASK_DISPLAYED_INDEX); } + + + SmartDefaultDates sdd = new SmartDefaultDates(null, null); ReadOnlyTask taskToModify = lastShownList.get(index - 1); - Task replacement = new Task(taskToModify, taskName, inferredStart, - inferredEnd, location, priority, + replacement = new Task(taskToModify, taskName, sdd.getStart(startDateTime), + sdd.getEnd(endDateTime), location, priority, recurringType, numberOfRecurrence, category, description); @@ -83,6 +84,8 @@ public CommandResult execute() { model.modifyTask(taskToModify, replacement); } catch (TaskNotFoundException e) { assert false : "The target task cannot be missing"; + } catch (InvalidDateException ex) { + return new CommandResult(Messages.MESSAGE_INVALID_START_END); } return new CommandResult(String.format(MESSAGE_SUCCESS, replacement)); @@ -123,6 +126,10 @@ public boolean undo() { model.modifyTask(taskToModify, originalTask); } catch (TaskNotFoundException e) { assert false : "The target task cannot be missing"; + } catch (InvalidDateException ex) { + //TODO: Verify branch + //assert false : "The target task cannot be having an invalid start end "; + //return new CommandResult(Messages.MESSAGE_INVALID_START_END); } return true; diff --git a/src/main/java/seedu/savvytasker/logic/commands/UnmarkCommand.java b/src/main/java/seedu/savvytasker/logic/commands/UnmarkCommand.java index feac83517f47..77f09f7d71e5 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/UnmarkCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/UnmarkCommand.java @@ -9,6 +9,7 @@ import seedu.savvytasker.model.task.ReadOnlyTask; import seedu.savvytasker.model.task.Task; import seedu.savvytasker.model.task.TaskList.DuplicateTaskException; +import seedu.savvytasker.model.task.TaskList.InvalidDateException; import seedu.savvytasker.model.task.TaskList.TaskNotFoundException; public class UnmarkCommand extends ModelRequiringCommand { @@ -64,6 +65,8 @@ public CommandResult execute() { assert false : "The target task cannot be missing"; } catch (DuplicateTaskException e) { e.printStackTrace(); + }catch (InvalidDateException e) { + assert false : "The target task should be valid, only the archived flag is set"; } return new CommandResult(resultSb.toString()); } diff --git a/src/main/java/seedu/savvytasker/model/Model.java b/src/main/java/seedu/savvytasker/model/Model.java index bdae2ca65d39..9eaef9cd7905 100644 --- a/src/main/java/seedu/savvytasker/model/Model.java +++ b/src/main/java/seedu/savvytasker/model/Model.java @@ -8,6 +8,7 @@ import seedu.savvytasker.model.task.ReadOnlyTask; import seedu.savvytasker.model.task.Task; import seedu.savvytasker.model.task.TaskList.DuplicateTaskException; +import seedu.savvytasker.model.task.TaskList.InvalidDateException; import seedu.savvytasker.model.task.TaskList.TaskNotFoundException; /** @@ -24,12 +25,12 @@ public interface Model { void deleteTask(ReadOnlyTask target) throws TaskNotFoundException; /** Modifies the given Task. */ - void modifyTask(ReadOnlyTask target, Task replacement) throws TaskNotFoundException; + void modifyTask(ReadOnlyTask target, Task replacement) throws TaskNotFoundException, InvalidDateException; /** Adds the given Task. * @throws {@link DuplicateTaskException} if a duplicate is found * */ - void addTask(Task task) throws DuplicateTaskException; + void addTask(Task task) throws DuplicateTaskException, InvalidDateException; /** Returns the filtered task list as an {@code UnmodifiableObservableList} */ UnmodifiableObservableList getFilteredTaskList(); diff --git a/src/main/java/seedu/savvytasker/model/ModelManager.java b/src/main/java/seedu/savvytasker/model/ModelManager.java index 457722708f87..553c0004037d 100644 --- a/src/main/java/seedu/savvytasker/model/ModelManager.java +++ b/src/main/java/seedu/savvytasker/model/ModelManager.java @@ -23,6 +23,7 @@ import seedu.savvytasker.model.task.ReadOnlyTask; import seedu.savvytasker.model.task.Task; import seedu.savvytasker.model.task.TaskList.DuplicateTaskException; +import seedu.savvytasker.model.task.TaskList.InvalidDateException; import seedu.savvytasker.model.task.TaskList.TaskNotFoundException; /** @@ -95,13 +96,13 @@ public synchronized void deleteTask(ReadOnlyTask target) throws TaskNotFoundExce } @Override - public void modifyTask(ReadOnlyTask target, Task replacement) throws TaskNotFoundException { + public void modifyTask(ReadOnlyTask target, Task replacement) throws TaskNotFoundException, InvalidDateException { savvyTasker.replaceTask(target, replacement); indicateSavvyTaskerChanged(); } @Override - public synchronized void addTask(Task t) throws DuplicateTaskException { + public synchronized void addTask(Task t) throws DuplicateTaskException, InvalidDateException { t.setId(savvyTasker.getNextTaskId()); savvyTasker.addTask(t); updateFilteredListToShowActive(); diff --git a/src/main/java/seedu/savvytasker/model/SavvyTasker.java b/src/main/java/seedu/savvytasker/model/SavvyTasker.java index fecd070b6e7e..d11aef04d442 100644 --- a/src/main/java/seedu/savvytasker/model/SavvyTasker.java +++ b/src/main/java/seedu/savvytasker/model/SavvyTasker.java @@ -15,6 +15,7 @@ import seedu.savvytasker.model.task.Task; import seedu.savvytasker.model.task.TaskList; import seedu.savvytasker.model.task.TaskList.DuplicateTaskException; +import seedu.savvytasker.model.task.TaskList.InvalidDateException; import seedu.savvytasker.model.task.TaskList.TaskNotFoundException; /** @@ -78,7 +79,7 @@ public int getNextTaskId() { * Adds a task to savvy tasker. * @throws TaskList.DuplicateTaskException if an equivalent task already exists. */ - public void addTask(Task t) throws DuplicateTaskException { + public void addTask(Task t) throws DuplicateTaskException, InvalidDateException { tasks.add(t); } @@ -102,7 +103,7 @@ public boolean removeTask(ReadOnlyTask key) throws TaskNotFoundException { * @return true if the task is removed successfully * @throws TaskNotFoundException if the task to be removed does not exist */ - public boolean replaceTask(ReadOnlyTask key, Task replacement) throws TaskNotFoundException { + public boolean replaceTask(ReadOnlyTask key, Task replacement) throws TaskNotFoundException, InvalidDateException { if (tasks.contains(key)) { return tasks.replace(key, replacement); } else { diff --git a/src/main/java/seedu/savvytasker/model/task/TaskList.java b/src/main/java/seedu/savvytasker/model/task/TaskList.java index e08a416761d7..61445730e98d 100644 --- a/src/main/java/seedu/savvytasker/model/task/TaskList.java +++ b/src/main/java/seedu/savvytasker/model/task/TaskList.java @@ -6,6 +6,7 @@ import javafx.collections.FXCollections; import javafx.collections.ObservableList; import seedu.savvytasker.commons.exceptions.DuplicateDataException; +import seedu.savvytasker.commons.exceptions.IllegalValueException; /** * A list of tasks that enforces uniqueness between its elements and does not allow nulls. @@ -16,6 +17,21 @@ */ public class TaskList implements Iterable { + /** + * Signals that an operation would have violated the 'end time earlier than start time' property of the list. + */ + public static class InvalidDateException extends IllegalValueException { + + /** + * Generated serial ID + */ + private static final long serialVersionUID = 8933810750762846403L; + + protected InvalidDateException() { + super("Operation would result in invalid start/end dates"); + } + } + /** * Signals that an operation would have violated the 'no duplicates' property of the list. */ @@ -85,16 +101,31 @@ public boolean contains(ReadOnlyTask toCheck) { return internalList.contains(toCheck); } + /** + * Returns true if the end time is not earlier than the start time. + */ + public boolean isValidStartEnd(ReadOnlyTask toCheck) { + assert toCheck != null; + if (toCheck.getStartDateTime() != null && toCheck.getEndDateTime() != null && + toCheck.getStartDateTime().compareTo(toCheck.getEndDateTime()) >= 0) { + return false; + } + return true; + } + /** * Adds a task to the list. * * @throws DuplicateTaskException if the person to add is a duplicate of an existing task in the list. */ - public void add(Task toAdd) throws DuplicateTaskException { + public void add(Task toAdd) throws DuplicateTaskException, InvalidDateException { assert toAdd != null; if (contains(toAdd)) { throw new DuplicateTaskException(); } + if (!isValidStartEnd(toAdd)) { + throw new InvalidDateException(); + } internalList.add(toAdd); } @@ -117,10 +148,13 @@ public boolean remove(ReadOnlyTask toRemove) throws TaskNotFoundException { * * @throws TaskNotFoundException if no such task could be found in the list. */ - public boolean replace(ReadOnlyTask toReplace, Task replacement) throws TaskNotFoundException { + public boolean replace(ReadOnlyTask toReplace, Task replacement) throws TaskNotFoundException, InvalidDateException { assert toReplace != null; assert replacement != null; if (internalList.contains(toReplace)) { + if (!isValidStartEnd(replacement)) { + throw new InvalidDateException(); + } internalList.set(internalList.indexOf(toReplace), replacement); return true; } diff --git a/src/test/java/seedu/savvytasker/testutil/SavvyTaskerBuilder.java b/src/test/java/seedu/savvytasker/testutil/SavvyTaskerBuilder.java index d1b2337909b6..db6af1cab618 100644 --- a/src/test/java/seedu/savvytasker/testutil/SavvyTaskerBuilder.java +++ b/src/test/java/seedu/savvytasker/testutil/SavvyTaskerBuilder.java @@ -3,6 +3,7 @@ import seedu.savvytasker.model.SavvyTasker; import seedu.savvytasker.model.task.Task; import seedu.savvytasker.model.task.TaskList.DuplicateTaskException; +import seedu.savvytasker.model.task.TaskList.InvalidDateException; /** * A utility class to help with building SavvyTasker objects. @@ -17,7 +18,7 @@ public SavvyTaskerBuilder(SavvyTasker savvyTasker){ this.savvyTasker = savvyTasker; } - public SavvyTaskerBuilder withTask(Task task) throws DuplicateTaskException { + public SavvyTaskerBuilder withTask(Task task) throws DuplicateTaskException, InvalidDateException { savvyTasker.addTask(task); return this; } diff --git a/src/test/java/seedu/savvytasker/testutil/TypicalTestTasks.java b/src/test/java/seedu/savvytasker/testutil/TypicalTestTasks.java index 30d9ccb22167..a89ccf000d95 100644 --- a/src/test/java/seedu/savvytasker/testutil/TypicalTestTasks.java +++ b/src/test/java/seedu/savvytasker/testutil/TypicalTestTasks.java @@ -8,6 +8,7 @@ import seedu.savvytasker.model.task.PriorityLevel; import seedu.savvytasker.model.task.Task; import seedu.savvytasker.model.task.TaskList.DuplicateTaskException; +import seedu.savvytasker.model.task.TaskList.InvalidDateException; /** * @@ -59,6 +60,8 @@ public static void loadSavvyTaskerWithSampleData(SavvyTasker st) { st.addTask(new Task(td.longDue)); } catch (DuplicateTaskException e) { assert false : "not possible"; + } catch (InvalidDateException e) { + assert false : "not possible"; } } From 23f2a3e29c2ddf90474fa51229bf6c25690e7cab Mon Sep 17 00:00:00 2001 From: qhng Date: Wed, 26 Oct 2016 13:25:07 +0800 Subject: [PATCH 29/55] Implement search by category --- .../savvytasker/commons/util/StringUtil.java | 1 + .../seedu/savvytasker/model/ModelManager.java | 32 +++++++++++++++++-- .../savvytasker/model/task/FindType.java | 11 ++++++- 3 files changed, 41 insertions(+), 3 deletions(-) diff --git a/src/main/java/seedu/savvytasker/commons/util/StringUtil.java b/src/main/java/seedu/savvytasker/commons/util/StringUtil.java index 017c52cb6b4c..8a7355cdec6b 100644 --- a/src/main/java/seedu/savvytasker/commons/util/StringUtil.java +++ b/src/main/java/seedu/savvytasker/commons/util/StringUtil.java @@ -15,6 +15,7 @@ public static boolean containsExactIgnoreCase(String source, String query) { } public static boolean containsPartialIgnoreCase(String source, String query) { + if (source == null) return false; String[] split = source.toLowerCase().split("\\s+"); List strings = Arrays.asList(split); return strings.stream().filter(s -> s.contains(query.toLowerCase())).count() > 0; diff --git a/src/main/java/seedu/savvytasker/model/ModelManager.java b/src/main/java/seedu/savvytasker/model/ModelManager.java index 553c0004037d..f7dd384fc7cf 100644 --- a/src/main/java/seedu/savvytasker/model/ModelManager.java +++ b/src/main/java/seedu/savvytasker/model/ModelManager.java @@ -176,6 +176,9 @@ public void updateFilteredTaskList(FindType findType, String[] keywords) { case Exact: qualifier = new TaskNameExactMatchQualifier(keywords); break; + case Category: + qualifier = new CategoryPartialMatchQualifier(keywords); + break; default: assert false; // should never get here. } @@ -234,6 +237,31 @@ default Set createSet(String[] keywords) { } } + /** + * Qualifier matching a partial word from the set of keywords + * @author A0139915W + */ + private class CategoryPartialMatchQualifier implements Qualifier { + private Set keyWordsToMatch; + + CategoryPartialMatchQualifier(String[] keyWordsToMatch) { + this.keyWordsToMatch = createSet(keyWordsToMatch); + } + + @Override + public boolean run(ReadOnlyTask task) { + return keyWordsToMatch.stream() + .filter(keyword -> StringUtil.containsPartialIgnoreCase(task.getCategory(), keyword)) + .findAny() + .isPresent(); + } + + @Override + public String toString() { + return "category(PartialMatch)=" + String.join(", ", keyWordsToMatch); + } + } + /** * Qualifier matching a partial word from the set of keywords * @author A0139915W @@ -255,7 +283,7 @@ public boolean run(ReadOnlyTask task) { @Override public String toString() { - return "taskName(FullMatch)=" + String.join(", ", keyWordsToMatch); + return "taskName(PartialMatch)=" + String.join(", ", keyWordsToMatch); } } @@ -324,7 +352,7 @@ public boolean run(ReadOnlyTask task) { @Override public String toString() { - return "taskName(FullMatch)=" + String.join(", ", keyWordsToMatch); + return "taskName(ExactMatch)=" + String.join(", ", keyWordsToMatch); } } diff --git a/src/main/java/seedu/savvytasker/model/task/FindType.java b/src/main/java/seedu/savvytasker/model/task/FindType.java index f63026fc68e1..b196e242eaea 100644 --- a/src/main/java/seedu/savvytasker/model/task/FindType.java +++ b/src/main/java/seedu/savvytasker/model/task/FindType.java @@ -7,19 +7,28 @@ public enum FindType { /** * Specifies partial matching of a single keyword. + * Searches by Task's name. * E.g. 'ap' matches 'happy' */ Partial, /** * Specifies full matching of a single keyword. + * Searches by Task's name. * E.g. 'ap' does not match 'happy', 'happy' matches 'very happy' */ Full, /** * Specifies full matching of all keywords in a set of keywords. + * Searches by Task's name. * E.g. 'happy' does not match 'very happy', 'very happy' matches 'very happy' */ - Exact; + Exact, + /** + * Specifies partial matching of all keywords in a set of keywords. + * Searches by Task's category. + * E.g. 'happy' does not match 'very happy', 'very happy' matches 'very happy' + */ + Category; /** * Gets a FindType enum object from its enum name, ignoring cases. From a5dad2c6314144599b1e1ab9921d6933ee65d9d0 Mon Sep 17 00:00:00 2001 From: Qing Hua Date: Wed, 26 Oct 2016 14:19:36 +0800 Subject: [PATCH 30/55] Update UserGuide.md --- docs/UserGuide.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index f3329a64ca49..11318ed67eb2 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -55,9 +55,8 @@ Format: `add TASK_NAME [s/START_DATE] [e/END_DATE] [l/LOCATION] [p/PRIORITY_LEVE > Parameters | Description > -------- | :-------- > TASK_NAME | `Mandatory` Specifies the name of the task. -> START_DATE **(See DATE)** | `Optional` Specifies the starting date and time of the task. -> END_DATE **(See DATE)** | `Optional` Specifies the ending date and time of the task. -> **DATE** | If only the DATE is specified, the TIME defaults to starting at 12am or ending at 11:59pm.
If only the TIME is specified, the DATE defaults to today.

If only START_DATE is supplied, the task will be a 1-day event starting from the specified START_DATE and ending on the same day at 11:59pm.
If only END_DATE is supplied, the task will start today at 12am.

The date and time can be entered in a formal format like 17-03-2016, or a natural format like next wednesday, 2pm. The formal format follows the system's settings for whether mm-dd-yyyy or dd-mm-yyyy is used. +> START_DATE (See [DATE](#date)) | `Optional` Specifies the starting date and time of the task. +> END_DATE (See [DATE](#date)) | `Optional` Specifies the ending date and time of the task. > LOCATION | `Optional` Specifies the location where the task happens. > PRIORITY_LEVEL | `Optional` Specifies the priority level of the task.
`Accepts` values `low`, `medium`, `high`
`Defaults` to `???` > RECURRING_TYPE | `Optional` Specifies the recurring type of the task.
`Accepts` values `none`, `daily`, `weekly`, `monthly`, `yearly`
`Defaults` to `none` @@ -65,6 +64,10 @@ Format: `add TASK_NAME [s/START_DATE] [e/END_DATE] [l/LOCATION] [p/PRIORITY_LEVE > CATEGORY | `Optional` Specifies a custom category for the task. This can be used for keeping track of similar tasks. > DESCRIPTION | `Optional` Describes the task. +## Date + +If only the DATE is specified, the TIME defaults to starting at 12am or ending at 11:59pm.
If only the TIME is specified, the DATE defaults to today.

If only `START_DATE` is supplied, the task will be a 1-day event starting from the specified `START_DATE` and ending on the same day at 11:59pm.
If only `END_DATE` is supplied, the task will start today at 12am.

The date and time can be entered in a formal format like 17-03-2016, or a natural format like next wednesday, 2pm. The formal format follows the system's settings for whether mm-dd-yyyy or dd-mm-yyyy is used. + Examples: * `add Project Meeting s/05-10-2016 2pm e/6pm r/daily n/2 c/CS2103 d/Discuss about roles and milestones`
Add task named, Project Meeting, under CS2103 category. The task is schedule to take place on 5th and 6th of October 2016 from 2pm to 6pm each day. From aaae65f8c67af204d6126fbdb016488bba7b14ea Mon Sep 17 00:00:00 2001 From: Qing Hua Date: Wed, 26 Oct 2016 14:20:32 +0800 Subject: [PATCH 31/55] Update UserGuide.md --- docs/UserGuide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 11318ed67eb2..6457d93eae67 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -64,7 +64,7 @@ Format: `add TASK_NAME [s/START_DATE] [e/END_DATE] [l/LOCATION] [p/PRIORITY_LEVE > CATEGORY | `Optional` Specifies a custom category for the task. This can be used for keeping track of similar tasks. > DESCRIPTION | `Optional` Describes the task. -## Date +##### Date If only the DATE is specified, the TIME defaults to starting at 12am or ending at 11:59pm.
If only the TIME is specified, the DATE defaults to today.

If only `START_DATE` is supplied, the task will be a 1-day event starting from the specified `START_DATE` and ending on the same day at 11:59pm.
If only `END_DATE` is supplied, the task will start today at 12am.

The date and time can be entered in a formal format like 17-03-2016, or a natural format like next wednesday, 2pm. The formal format follows the system's settings for whether mm-dd-yyyy or dd-mm-yyyy is used. From 48dde8e33e6643cf5a1698c967a56d5e0fcd9be5 Mon Sep 17 00:00:00 2001 From: Qing Hua Date: Wed, 26 Oct 2016 14:22:04 +0800 Subject: [PATCH 32/55] Update UserGuide.md --- docs/UserGuide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 6457d93eae67..c973619e238b 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -66,7 +66,7 @@ Format: `add TASK_NAME [s/START_DATE] [e/END_DATE] [l/LOCATION] [p/PRIORITY_LEVE ##### Date -If only the DATE is specified, the TIME defaults to starting at 12am or ending at 11:59pm.
If only the TIME is specified, the DATE defaults to today.

If only `START_DATE` is supplied, the task will be a 1-day event starting from the specified `START_DATE` and ending on the same day at 11:59pm.
If only `END_DATE` is supplied, the task will start today at 12am.

The date and time can be entered in a formal format like 17-03-2016, or a natural format like next wednesday, 2pm. The formal format follows the system's settings for whether mm-dd-yyyy or dd-mm-yyyy is used. +> If only the DATE is specified, the TIME defaults to starting at 12am or ending at 11:59pm.
If only the TIME is specified, the DATE defaults to today.

If only `START_DATE` is supplied, the task will be a 1-day event starting from the specified `START_DATE` and ending on the same day at 11:59pm.
If only `END_DATE` is supplied, the task will start today at 12am.

The date and time can be entered in a formal format like 17-03-2016, or a natural format like next wednesday, 2pm. The formal format follows the system's settings for whether mm-dd-yyyy or dd-mm-yyyy is used. Examples: * `add Project Meeting s/05-10-2016 2pm e/6pm r/daily n/2 c/CS2103 d/Discuss about roles and milestones`
From 3c779176ccd8a152fea522e9088b53ba2b9dbbe0 Mon Sep 17 00:00:00 2001 From: Qing Hua Date: Wed, 26 Oct 2016 14:36:40 +0800 Subject: [PATCH 33/55] Update UserGuide.md --- docs/UserGuide.md | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index c973619e238b..580103b004a7 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -145,7 +145,7 @@ Format: `modify INDEX [t/TASK_NAME] [s/START_DATE] [e/END_DATE] [l/LOCATION] [p/ > Parameters | Description > -------- | :-------- > INDEX | `Mandatory` Specifies the index of the listing shown to modify.
The index **must be a positive integer** 1, 2, 3, ... -> TASK_NAME
START_DATE
END_DATE
LOCATION
PRIORITY_LEVEL
RECURRING_TYPE
NUMBER_OF_RECURRENCE
CATEGORY
DESCRIPTION | See [Adding a task](#adding-a-task-add) +> TASK_NAME
START_DATE
END_DATE
LOCATION
PRIORITY_LEVEL
RECURRING_TYPE
NUMBER_OF_RECURRENCE
CATEGORY
DESCRIPTION | Similar to [Adding a task](#adding-a-task-add) >
> Overwrites any of the specified fields ('LOCATION', 'DESCRIPTION'...) with the new values @@ -231,17 +231,17 @@ Add task named "pjm" to task list Command | Format -------- | :-------- -[Add](#adding-a-task-add) | `add TASK_NAME [s/START_DATE] [e/END_DATE] [l/LOCATION] [p/PRIORITY_LEVEL] [r/RECURRING_TYPE] [n/NUMBER_OF_RECURRENCE] [c/CATEGORY] [d/DESCRIPTION]` -[Alias](#alias-a-keyword--alias) | `alias k/KEYWORD s/SHORT_KEYWORD` -[Clear](#clearing-all-entries--clear) | `clear` -[Delete](#deleting-a-task--delete) | `delete INDEX [MORE_INDEX]` -[Exit](#exiting-the-program--exit) | `exit` -[Find](#finding-all-task-containing-any-keyword-in-its-name-find) | `find [t/FIND_TYPE] KEYWORD [MORE_KEYWORDS]` -[List](#listing-all-tasks-list) | `list [t/LIST_TYPE]` -[Help](#viewing-help--help) | `help` -[Modify](#modifies-a-task--modify) | `modify INDEX [t/TASK_NAME] [s/START_DATE] [e/END_DATE] [l/LOCATION] [p/PRIORITY_LEVEL] [r/RECURRING_TYPE] [n/NUMBER_OF_RECURRENCE] [c/CATEGORY] [d/DESCRIPTION]` -[Mark](#mark-a-task-as-done--mark) | `mark INDEX [MORE_INDEX]` -[Unmark](#unmark-a-task-as-done--unmark) | `unmark INDEX [MORE_INDEX]` -[Undo](#undo-the-most-recent-operation--undo) | `undo` -[Redo](#redo-the-most-recent-undo-operation--redo) | `redo` -[Unalias](#unalias-a-keyword--unalias) | `unalias s/SHORT_KEYWORD` +[Add](#adding-a-task-add) | `add TASK_NAME [s/START_DATE] [e/END_DATE] [l/LOCATION] [p/PRIORITY_LEVEL] [r/RECURRING_TYPE] [n/NUMBER_OF_RECURRENCE] [c/CATEGORY] [d/DESCRIPTION]`
Example: `add Weekly Milestone s/Thurs r/weekly n/3 l/COM1 c/Meeting` +[Alias](#alias-a-keyword--alias) | `alias k/KEYWORD s/SHORT_KEYWORD`
Example: `alias k/main success scenario s/mss` +[Clear](#clearing-all-entries--clear) | `clear`
Example: `clear` +[Delete](#deleting-a-task--delete) | `delete INDEX [MORE_INDEX]`
Example: `delete 1 2 3` +[Exit](#exiting-the-program--exit) | `exit`
Example: `exit` +[Find](#finding-all-task-containing-any-keyword-in-its-name-find) | `find [t/FIND_TYPE] KEYWORD [MORE_KEYWORDS]`
Example: `find t/exact CS2103 Meeting` +[List](#listing-all-tasks-list) | `list [t/LIST_TYPE]`
Example: `list t/archived` +[Help](#viewing-help--help) | `help`
Example: `help` +[Modify](#modifies-a-task--modify) | `modify INDEX [t/TASK_NAME] [s/START_DATE] [e/END_DATE] [l/LOCATION] [p/PRIORITY_LEVEL] [r/RECURRING_TYPE] [n/NUMBER_OF_RECURRENCE] [c/CATEGORY] [d/DESCRIPTION]`
Example: `modify 2 t/Wednesday Weekly Milestone s/wed d/Project Meeting and Finalization` +[Mark](#mark-a-task-as-done--mark) | `mark INDEX [MORE_INDEX]`
Example: `mark 1 2 3` +[Unmark](#unmark-a-task-as-done--unmark) | `unmark INDEX [MORE_INDEX]`
Example: `unmark 1 2 3` +[Undo](#undo-the-most-recent-operation--undo) | `undo`
Example: `undo` +[Redo](#redo-the-most-recent-undo-operation--redo) | `redo`
Example: `redo` +[Unalias](#unalias-a-keyword--unalias) | `unalias s/SHORT_KEYWORD`
Example: `unalias s/mss` From 8bc1a72bb7846205c881dbc45de25e2af8f3a874 Mon Sep 17 00:00:00 2001 From: Qing Hua Date: Wed, 26 Oct 2016 14:37:48 +0800 Subject: [PATCH 34/55] Update UserGuide.md --- docs/UserGuide.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 580103b004a7..b29a856b6076 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -233,15 +233,15 @@ Command | Format -------- | :-------- [Add](#adding-a-task-add) | `add TASK_NAME [s/START_DATE] [e/END_DATE] [l/LOCATION] [p/PRIORITY_LEVEL] [r/RECURRING_TYPE] [n/NUMBER_OF_RECURRENCE] [c/CATEGORY] [d/DESCRIPTION]`
Example: `add Weekly Milestone s/Thurs r/weekly n/3 l/COM1 c/Meeting` [Alias](#alias-a-keyword--alias) | `alias k/KEYWORD s/SHORT_KEYWORD`
Example: `alias k/main success scenario s/mss` -[Clear](#clearing-all-entries--clear) | `clear`
Example: `clear` +[Clear](#clearing-all-entries--clear) | `clear` [Delete](#deleting-a-task--delete) | `delete INDEX [MORE_INDEX]`
Example: `delete 1 2 3` -[Exit](#exiting-the-program--exit) | `exit`
Example: `exit` +[Exit](#exiting-the-program--exit) | `exit` [Find](#finding-all-task-containing-any-keyword-in-its-name-find) | `find [t/FIND_TYPE] KEYWORD [MORE_KEYWORDS]`
Example: `find t/exact CS2103 Meeting` [List](#listing-all-tasks-list) | `list [t/LIST_TYPE]`
Example: `list t/archived` -[Help](#viewing-help--help) | `help`
Example: `help` +[Help](#viewing-help--help) | `help` [Modify](#modifies-a-task--modify) | `modify INDEX [t/TASK_NAME] [s/START_DATE] [e/END_DATE] [l/LOCATION] [p/PRIORITY_LEVEL] [r/RECURRING_TYPE] [n/NUMBER_OF_RECURRENCE] [c/CATEGORY] [d/DESCRIPTION]`
Example: `modify 2 t/Wednesday Weekly Milestone s/wed d/Project Meeting and Finalization` [Mark](#mark-a-task-as-done--mark) | `mark INDEX [MORE_INDEX]`
Example: `mark 1 2 3` [Unmark](#unmark-a-task-as-done--unmark) | `unmark INDEX [MORE_INDEX]`
Example: `unmark 1 2 3` -[Undo](#undo-the-most-recent-operation--undo) | `undo`
Example: `undo` -[Redo](#redo-the-most-recent-undo-operation--redo) | `redo`
Example: `redo` +[Undo](#undo-the-most-recent-operation--undo) | `undo` +[Redo](#redo-the-most-recent-undo-operation--redo) | `redo` [Unalias](#unalias-a-keyword--unalias) | `unalias s/SHORT_KEYWORD`
Example: `unalias s/mss` From fcfa44d3d52bf28bffa51829d76bb715d09c2de5 Mon Sep 17 00:00:00 2001 From: Qing Hua Date: Wed, 26 Oct 2016 15:38:09 +0800 Subject: [PATCH 35/55] Update DeveloperGuide.md --- docs/DeveloperGuide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 6ae5ee04604c..b4d254dcf40b 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -148,7 +148,7 @@ Given below is the Sequence Diagram for interactions within the `Logic` componen The `Model`, * stores a `UserPref` object that represents the user's preferences. * stores the Savvy Tasker data. -* exposes a `UnmodifiableObservableList` that can be 'observed' e.g. the UI can be bound to this list +* exposes a `UnmodifiableObservableList` that can be 'observed' e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change. * does not depend on any of the other three components. From c00e3e61c27d2c403c7bb1be16f042baf53d2df5 Mon Sep 17 00:00:00 2001 From: Qing Hua Date: Wed, 26 Oct 2016 15:38:35 +0800 Subject: [PATCH 36/55] Update diagrams --- docs/images/DeletePersonSdForLogic.png | Bin 53330 -> 52263 bytes docs/images/ModelClassDiagram.png | Bin 38821 -> 50721 bytes docs/images/SDforDeletePerson.png | Bin 22068 -> 27088 bytes .../images/SDforDeletePersonEventHandling.png | Bin 21553 -> 29824 bytes docs/images/StorageClassDiagram.png | Bin 24010 -> 37977 bytes docs/images/UiClassDiagram.png | Bin 38175 -> 50420 bytes 6 files changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/images/DeletePersonSdForLogic.png b/docs/images/DeletePersonSdForLogic.png index 109f4bc4d39021e4e3b41370d0a493865ef3c497..65838899739125293255f3a2c7b082e148556203 100644 GIT binary patch literal 52263 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 VYzq12hoI};(9pYDqIUc7{{r)Cfr$VB diff --git a/docs/images/ModelClassDiagram.png b/docs/images/ModelClassDiagram.png index 8cdf11ec93a1cee41efe62caa9b3684419f92d67..3abf6bc7892e2daa1ff24522c726b1a09c1f2502 100644 GIT binary patch literal 50721 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 DqH-^* diff --git a/docs/images/SDforDeletePerson.png b/docs/images/SDforDeletePerson.png index 1e836f10dcd82adcf6b8839f3093e72e23772cfc..4e557dbe13457d35b227236335a3890b3cb8ab9d 100644 GIT binary patch literal 27088 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 diff --git a/docs/images/SDforDeletePersonEventHandling.png b/docs/images/SDforDeletePersonEventHandling.png index ecec0805d32cad1f9c39cc4afc78b621c708f5f1..5feee5c1342ad115b4a7d7d60912c980a53116fc 100644 GIT binary patch literal 29824 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 literal 21553 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�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 Jy&IfZ{5Rr`v*iE) diff --git a/docs/images/StorageClassDiagram.png b/docs/images/StorageClassDiagram.png index 7a4cd2700cbfa2539b471a07053cbd3e8302ad61..38916d7647ea83f7822b4a3d5078ba62861817cc 100644 GIT binary patch literal 37977 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 literal 24010 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 IRG%Twkr0jl2G9Ij=FNG-m9#t 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 diff --git a/docs/images/UiClassDiagram.png b/docs/images/UiClassDiagram.png index 459245e267af331a1cdb078d21e56abed3d96cc8..af140c15285faf4954d05f8c317da55c8f2b529f 100644 GIT binary patch literal 50420 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%0DKpYJy^{(#_{`RO{keyJ7x)RE7` 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 z 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 Date: Wed, 26 Oct 2016 15:41:45 +0800 Subject: [PATCH 37/55] Update diagrams From e8f4f1ab7ef0d768163024ac22f9d8e39d1bd61e Mon Sep 17 00:00:00 2001 From: tet54 Date: Wed, 26 Oct 2016 16:02:11 +0800 Subject: [PATCH 38/55] Updated Diagrams powerpoint file --- docs/diagrams/Diagrams.pptx | Bin 73797 -> 72343 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/diagrams/Diagrams.pptx b/docs/diagrams/Diagrams.pptx index 3c28abe9c1d30925e2a4f5544c4d61377620995a..84b0128ce687a12a50093b86e7c7dcaf35a78e98 100644 GIT binary patch delta 39740 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 J9B9QaH-kDMg7Uo6kj=5fPnQy#9U zx@VvH^SkW7vm`bd(~-h~I%qq8_;B>|FlZ>9kNS(0trAlW^@RsQF2hYZ4nug#^~twx zV>F_d{WmG@2O$2oJ`zHZ+__QZZ!4gK=^o?pN8$4k4h!2b)h`}z<0;?OM`mNXSd2L| zIP3sodf}hXa&s~JOiQsMPkZlJ%H-dMEIa)0PKb7sgO~dW17Y9ye~<7M>h6>8kT~lz zrhyq!RaZsyX$2r9^D5g^e=tV7(hjm>M9*xno|Yzwz4Y0lrsH>p%t2}hnH3Evms@TP z8ZPNUp?ca@u|4T3igij88tI@er~^dwe0S@sXDQWC*EUL^HblKiLlL&+-Cyw1yKnCd zQ9<>t?-wOTA1k}{&-8G%IKDtSyEx@HnBZ_FWv{dtUZ3he|9#a{zvy^h+s>w%zoNr5 z`2V@FaxH~mz*`vhphL&=O^aU;PUEZR1lnr-ex`NVYs+q`2453P5t^8(-cRZF}yq+qyvaE+wBrSO`2)F}1&tbkv_5_D9=n#Q_hYsUN}*YTS_lVHt-; z`^6tNbw~l8$8-h6}g0nU~}!klf@);NcCH?#89a6BZ# zbf#UBj1m;j)Q+8d<3s%e$Nj@U90(0Aen|?;Ii%Oq$mnFHxEFr3!>H(3J^1h$=`c*5 zWlS*kokrbvd>>)q(aUCozrUcLWrD%4Ord)`=}Kg}lrVFl5r|l9v*`KJ=`1%y?(Tx6 z$cly}=)n&&ld90I8I;$VEcBnT5=XxHziT$wjOC+O*BSd06fUZw(_lBf4rd^Du7j&(w#iMd zX{S96A|Tet_Q+;v+I17>1v{RujIdiRK~4jUdFQ?`#Gt67vAFoJt<#b`)rv7OM&A$@#tB^k7 zv&F!WLgMVHcTgzYrHZ`?ArBWvA1C9ETJ6{nYS4}j;bHVmxD|QTmq~g|H(U`Ix?4qQ zZxb7Wrv|mh$3?uc*-KZ^4>%_lT@ffuyh|D=SUlG?wnLI_gW~uiX;v3f3yL5y_f1K| zWwQbRiu-p}1$YN*sZ%-4GR^M#=$OQ`+b)a& zAd6o(U4Oks*T#@EMD3yS5+G}o1Ff~R*rsT~0%i>iCt(gPWLnnJ%iL&bIq}mk-B+2` z0B=k8Ew@Lsy7Al#l}^J?BYQIge3n4rzJv>8Bv|wHq)PJ?9&n9Ww^NaSZilcL4p53D zbIkEq6+eC52a_w0q$jm zz3Y(z;C^jp|6J~jW{$^vl8njkUw$6#9rZUXs<_N%HMohM^X=e$9WVz;Mu{~pA?zt+ zN(w&wgwTXMq}P1W0IM9uq4kPe11h)ES@=FZIhd#lM0ozq*W-vH%MZf=dt4~K|I>1FiR4OtV`hdSI=G(+h8G*|OcEpgs`;{i^t~e>A6nLCR+&#? z(XyiU@)Z-hpF|yz%%{_EqnWnOt%94syI|T=eR1;Cqu9bQR~-5ocNt*0+2kqi77s>p zyBJ?sns=prl@Cob+$uYVy}RRJSiXWPbZbV_41iBjYN>H}1Jd3SeC8|PqSbHUc$EkS zK%J-aZdzdQaaQA5*J2;7+%A@r-GwJ8DB!OK!i?8Ke0I1lxG*zH)Nc7+3`y#syLchqhX=4DTE5qf~a>t&>)S8OcjJ69t-Lc-ilFb3f_EE%0Ie)W$0pyLB`QYm_-O+fi~7} zbH$wlU_Jbz8kM^kicmdKJ$w*D=fY<^e&q$@#r(mrdd?aF^x5GkaD6ZjITY%HgtTy` zpuE=qc6?0VNdkuRZ$A@jcSaSA@83Sru>K*|G4j(qiRNK$=p0?f&32{gs64SqSv6B7tMG}218BxZru6!}5DIq8Mn0)Iw)%QB}l`?y7`XWTXcCZ8t0Fr@c8b-77yO1B_N z-|yP#u_+oFw0RXizba4~k~kL?@ICP*d6rAm!olcurt1HNRj&>b+8LNKVQRkJ{;QY=7KQBEU^*tKI zHr?p{L3Q$T>-7Myw<%X!z=v1RkHwTGT(TY2*30cV`+J)fR7?!RWXimh5nPW;>}DWI z{Gk#CyaQ&qJIDNnfq14TV6W<|L|j?$=0gK1ftx`nE%_`QX7eVglcdw_rEcBw*_=*C z|6~k5ypDLQ1?RE@#3FK+0!h69(!EdSwkj)#l9Tbw=vUa6!PpSRdF-R@r2h7D19-jy@QD8#fLGcTS&VEN z|9Y=_aDI^E6ANoj;?WzaNEs{+32_!=-+vBqjZ47XQ_x5jH#KG~G#<+90;^b+v>+KQ0JTMYH>Di-&w z7M$jYy`vkxNrS~u)@KZ!TGry>H<%2mYmi#mlm8ME8~uY`8Bpb>N1ds#D2h2xNlnvV zez6D79h|!B&zyQQwQN>j@{XzgJ_SfP3SRTj6Aa`~0+EL!E|lQHB)<@VOw*PSM5JeR zP`}o<4OYa-o3SV?u@g3|>Rb6qG8n3nrSVTeW(~b*20QH-y=Rr$gJC$}x*- z?~7%HxC<+L6*+o1ncMVeSsHP7&LAx}m{H0TtbxQ2<$qCkWvVV`u=B`_^niaS`%dZhg?Eum?W3b0AG>-Fd)bkT*>OX~AgL~kzrhmlx2E1}Fl*GpXl z@;w*o0IaPN?XXe&T7KejgUh0v&&zW=m5OSjF6`Ru4u0JJC#RVy+(G~`YhuiV?zU2! zH8Zu1bok{UleaRKkWQ*JW8&TmjYM=`gBz9$31N2E0K9?})u)OF&FUf4Hb5#Ja&&$z zzs_AZ7_Ej9VF({eLzvqEjq~k38|uH;7H|kI5J;st6cxU20P?K+&wWJ}Tot}vL+DV8 z5$K{LG4T_S0l{xG_euzG`2>fBMr{Kse{cNnTa^g7%tmL>p#O2AP@!A}9NtEYQBaN% zk=YI&@+BP74Qn!P8?rkBwicMSH7iXkL}3u*7K|69a3?@|*v~*Q!hJmg;|D7Ye&rM- zYNycEJqn1EYsGz(hLmb>2WcLbpu1}*!&stC5Qw<}e1Bmt5Aazjv^i7UR=k^iBzS*eL#okZ=BmlOu2_m%qD`f%4^U{JZtecd z7!<7TC(kn(XXNQ{!`79xCj$Lf$R_amyH>G!kl2M^L~O#}ndZ>8ZQGw8I;u$2r6RY` z35VVR?3GeJ2XWd!c2VSCric-2znfrbt=1LrJCWtL++W=zoa>!giZ&zg=UUu?&iVY+ zoO9G_Ba74yaUH>{jM+LV>z%f<|Iixwx&AYLM=e)dAA}^Drqr4#Ub#6LP?zdWoz~2r zP>?)nzq2u+(P#groldJCpQWhHES6MX@Z3hstqA2+(y-8Dm>PB%xo0JnkKt#jVlniV!1Mk% zcq6a6(ufb*se+mlPL|{Boc@NR;zAuzT(O)T@xQpJVPXan6gI}ob4niy1Z28lb#@&L z=#t!s>Fx7I)k*qJ5yUPa#3?2>#X6yS`s3hd^UUn_1OnvNeLF;;q_95Hp&@f4HQhDR zNE>_KT!oJrO(lZpGmDE?xzYQ!d1l&CkO=rYmNHLx#&Q3HK#!a0a1CVM*6`Sx?rN`5 z*OE$f)VDig)5tOft({JZnmMpE58iwT0LKwSSoxewNEAaW)z{su@1kCm_Jy#sNGu$p z({5Rz5Du@l#W71Z4d}h)WbD#69&S8(>1RfVx3?VOHU7yD6NIDuV3POnJG_bd&!{rA zHU`x7RjlL`OLVPTh!jZ{=^B;b3RF*l1w_az5_h$X*Ht{LsOZ}|4*?739PcnQfT)$s zK%mXXF;!^7W*9~)W(a|$Yag@(A4|ipEbJziw9{)hV#ix7qg{wpKtCRhQbRBbyK8@h zE3DtXy9hfcbr3)C{3k?{%Q5`P<|X%TMA4AUdbj}X+(Wp?Rw$TIsgLxcsBtY4lZZO4 zE*hLws{z?ED*qGU%Uf+d57QV1_-q=p0n_UB`tN^WhbBygcuC~%aDM+P1Qiz^#2p$* z;AzN!_zazVeyD6+wZ4Br?9sMv%7$#J6~40)1UM@1!I_bQ-}P5cAu}qq42!jU4+!x= zg?!)kQj~~4|MGp-O#fD&ZCZr6hF=C#J(IsItgooEP!y2LSu&4Tw>`>GBht1ck#=D)m*y{ zgylNsOkVEchxd z+ryb=SHD{8FQhI^r^g3^%HDk=LxMsx`gw+4Zp#G;cW~l6xyr#&%;P*9LP|r02Bqu6 zAY+4gJaT{>V0;bR^5h{h5phlH3vIX|TNO)ht`ipnYj7!!|1RUV&}h1nOa+9mj!j=3)2kX1G|G_k^PRRgd{7NM)<1)~ z-oD6(zYZtZEXN|k5wRAQfe?HlF$fZ%4jAAJK@7h@8S5ZoAPK(?L>hb#D8Yen5Sp4K zz}8?bLjFDK6U3Yt-^X{MlkpP-wy>LM(U15^>D%?5Y&PGmRToA`B2e-8w8 zM5lL!juoHzz$XaU!0r|9@v;!l&D3U66)~KL2BEG_!}TXf=smogAhhbA>*Wz)3=i}j z;z%K?kM(roKKoU+^T?2E5k*B(qTos?H^et)f#R%<$#AIiu(qaohd*SB_lFVv2qX3 z)oS>A*|fR|4Rf(Y4RqssS&x~Z*mh)3<5b86{x#9#gMGl}lD=|ylyCm*$&W}vIWgIhgfhzRRi^IYksqn}SW#0PcH9{Fq&|Az1|}af?NwLJ|uq*6NbE3vr8g^p*b5K4( zEOS;LdjWt@!1g`l69mS*&mQ;9?8$ith!A4>1o@qz+&1UK{naoskmWp>EX1<>39>`F zXmiCeh5Sk{)$y^kz-VW4F7(G4qOLkK-l+sfr=TLNA~64WoHNe=Q)I1~==TY4f0vd0 zUWu$)qPx{#8zt_z?Ds`Fl)=S^x+GeafrX_k!0S(G0p0iFbcZq(Nj3%TjvNsc1JsWh z;iln)y(;<!rLZD=(#B=>%mxZuJG18Dz^B-^?446Cu#|2EgPKBz#S22+@1T{X+K@ z;PR1~?S`?eKNH4ttpRy+c{11|q~1Y_v$wC(Q!0N`Uhv`H&61qy#k1k+#=9Y$Y}sVU zkZFqE`nFW;sUb-BoI4)5XMh+qr0TQa=xGMdRs1plnP&RzXDRAB*HfS9kX8()zQ?>h zfiBAibOt8Z|K2e`4{=Os>ObVEtj<>fY~`?jPu8``@5rn_hF9}55B(XCrGLDPT;w>w zl@ylwqi=LQv1i{G6Q$x&4Fm$%LO4D;fxUk83j(lvY2COUul?Nu5q;S_b0z_{ntk2$ z3H|NO<=KQc`e~R`jqM>Ju7Tzit5S~Oe^-a=hjr)AB#ZE!soL`3;@Yj#F-h@&#KW3S zI<-V|SVn4CNfkRrc1}wA)e=itrs;=7iXEN~TN*{S$mE-NM>osd{BG7KrB~zQZqBEq zS6d&}r?4Gs;P*?0DFtlWmcQrt(wUZVcwr{I2jDeUyR#cJUMQHdm&P`|d=<7O1|i!8ScPjDh^gaXfB&pr7SQR z9UsBPVZLv-K+5Yo-SXf7tSrGwcv9UR&Ac7!!|ep6EYFG25jT!8&7YTHto%XcBzZwA zoK7OLAe}_kRGlQ?r$r6?Q`xJC2mW@-`OaR=cu zvV{;<%8*W0avJmt%ECRs)f{x*c${%A<#Ze>%Hnvj_K^_kPuAZ1v@_Odq^sIERkr!aj_jF9 zQtI@Ux1mH~F`YY1@rH!ZzNUdiw3cs(V4O#;;(&`sTwOq~Wdc&dO?_*$;)ZnR@uY27?~-v&p9yj)s5p4Q69hVeT2?iI zZ8ii@Pq0l!KhuV=p(S&dfc8zu6YO5*#mBi4y(7K&s|Zz0@k<5<^8=FaR-bi#aA zVib{;Y66#DFv4bLQ}%2W;CQjlpgqIcX@l6v&(xghTr3Kwlg4@J0I(FcF2mkFh}by| zdUsBAF6LEm28%=xTDUfV-^`sxNnJW$iHV^`P$bM^XM_{DN=BnU{S`;4hnkt>r==*& zAblx65-5u$2720+o6VmZvOPBR!SifrPN0E0ZXs*JxlmIp-K3B*(PxZ3jgXFhQ-F@# z_i5f}J2_{EUU@oD9(2&fe&OpyQ|(Gq*V(ka59rxPpIZyKKK4Kc%hm-X6(@0m5Q>~$ z6vGLbh=SnuqB>C3;*LUK^CyqChge@XZX3W;{q}F<1cD7rBeKm5GTu*`8Fr;Hh=#g+gKfT% zhf@UC>1yO-2sm~(Grc;|pQ~S8j!=?D*P_+h6!jTxk|@ze$Bo?sUV~x6G8>*&!mfV- zf25K4{PK6r<{VNkZ4v3InAz=QsLL!cc?Z35Vt%0QP20?Q>EwU_6u+~eSB4xc-ot{V z6|Clz*ZFabZL6mKfL>bApE~V-NXod&tw6R8Gilsv;W9ti?sQLHxjZ=?LnF{gxBDjo zW&)SQ)eP7m1Tj*zd&1vCeKnu3o_P zQFsh&NHU)&HAPFV>$|{)4%w=El^DQgM3o`j>b+qBBvEz}lUIAKtZac`ui>z&Dy+?; zu{psQ8Z6Ldr0V@p9ic1tFls1sCq}KMSwD*$jv==qq?ta=JD7%v>1Mm($p$b@->lYV zy}`=mPy>=ACUn)trtA&dwrpbFE1j6oR3_)^)Hlsx$;CXNKQA~rH#cyuxNDzd`4K9H zu&4j;Z{h{V{B=DPB>_VAX*1*v>YQ7F*KOX)EcC3E6o zqf4+wsn^X6qr{chMS73EDkpW&jk8ZQdszGkB3r_T^d?DR7o zz*T|CjJK>u4AfFyC1!zT3L@8?u?K(@iX?(>o>Ui=+!#yC9J6Utdd%0+D@c}AifU7Q&-jTY3mDz*{0Ii!4SfhRw+kqi`ITEFWQ9?0FJ5w7y zX~Gj|b$`@|B9EhE1;a34|AJ0n<~`Xlfo1sXQ;Nq<)XWX{%vqPgo(|@J(5SI%(o*%= zPoy+_8`*?Ju0GOYWR9&Dw(6J7tz$LTasVY6!G}ZbEgFoQXnltQ5Bsm@!FcX8N8YII zOhpEhsf=0i& z$2F@=1A153 z^-6H^`>*xKD+crZB~~YH0W0hk33pK^!vjxbs&uXeb!xE=L@KstJgP-|cDryI?9JQG z3#OMYq63(oRi3$S>4!@yHr(u0x^z))4AnBw8@S+Tg(WT8AQ(nHcvdVxd=3 z+YtYp~icI(y|TDXv%nnY6eR*j(HcIyiS@pq+;{S8nVT8zb3;ePn;3iwx6{xon|F!Vz>Rd|yS#IMelrD?0x%qx$Cg=1 z+?8ri%eSJ%uT<~Q04ize6a&L)RcqC`oPn%`r;~t_{V-fN3ev0z z`T;^%ORlE-GE50g5yKf{qY|lw$&aS6$fuwnGnh6~hZ4leV*;tm$-6UAU}Dq^QUX)% z!0bpk0Y;*qAK92L_(nc*(MHtdcE!`~ZV7@LA+=i7*wP?7#HaSv^Bbky7%L{yKFk>g zv$k9y+RrsPU*k03@&vOOmS-a@AZ;coaI0M4K;%A$R-35;uLwV-J@-<$9qZbZeRcmX zGVQ$ngHpGG5I+-Xb*e5=7YzBX#_|2>ctjlX|388MTVnSsY&(1D1@7n*o>_*m9hg>R z7-Ib;NepZMa9&Yz5TP)Sm*T26hCo8@#p{N=Ou-g}enX~hZED-Mx*>9zRmnS_+RjvvNvod=;lF zm{lD7K`yh_`|At#ZB~zMU*5W2Wc0}UstSL?z_m)5BV7Xor^4L_y9F+k6!&i%rk}f+ z`ohJT|&yxCz;D z=39GxZRr{JHIu5uGW28g{wO`PEH3@wv>)2UwP3Y|%Gwo#sYx|oU>xRBO4yRgW z3SZN{*^5=Ui_sZm^;j~Bu3=RfPq0QoJBlB4R`~S;_q{NA)Y;@JHvc1EpJExdEu(L} z1+ni|UiACX+!dRFvvpIuRhS~#u9uwJpA9=YUd@no2`-nCJs+PR+@1FJ$UQ^8n2G8o3A#6u{~cJ> zPi;s5s+6CD>9kBJ=zIjB1Kz8~WVShg`X0=Si8Po$+nhmS#e#RL#v0vm62X%;rsn#d zk9}pAmLm(I4!x*Pv~9i@zHW;dT|4%MxV#;^XOP$gcVL9Iz{Td{yucgb)L6T|b$ZT= zaB36p;lVl<7(=Kk-AJzRe)N2m^CXg*0A$+S_VM)ao!9Fs5x!4c=Fa^vGuL}ZsDL=u zjA4|FHQZJmUQMQMLPRk32S@9U5*NmoKUW*p4H7j4^CU)fJ`;VNJ}x+m2u`M^TXTZS zqr-G$ZM}i5ph@4TrlvhVh#u{h3lsJ{6cl!M?wnV9AXTn7mTGgfl1B6>u4e%4D~7X) zcU?r!G#o!`FkF8d|1hNnyVS767)-CMQY=uFw>>b&q-h+mV>Z;H&2FZhoT~uDeL{PB zJZ-JlK4#<4I@*Rnpylvnkh*CDpQbH##b}9_?rnAdP(SJu&NG>qmDRjMQw}?>%MeT;!T= zc%XXmW5T@e!JVrgg0pvKaPm=~@0Q?+PFeZIz1>6UrmE2)6*2C>)-D-~taARorlWmz zL#U<)G)hhAx^efr0l!f~%0=%AoivrNxdlh=5=0N$9#_Mzw??E z*?iNiIM)op*Tc|3OAE$d!IldgYTzgF*eV zru3U7$Bt|s@Oa2$^2o;pI1&@^bpMNf*r^*cX6H`1Cpx+479$Kf z$DqYOw=i1ano5LZc^21%7&?J@sk#_DyK3Ewnyj4D{dVG+;8cT6s>+_~z*AEDB`7k! zCazkKu7An;u8euI-gu~7JeimC`6;i_dllm#xs*Ro1oayg zab#W?UkXMW@XZnp#qu-uS^ibxI`Mih*lcFML+|f{(yHj-zpmnEn4**^^^-j%k>}_k zf;wjy`*PC)YYJvGuH}f*PHjzR6d%3q0buK^M0YDrrPWz9C&^q-8`KNhwO#e=RYX9MHyAk8W&!zF=irH+NALx?*umGUCA%`|Jxd8&8PvPb(X|zAf_TTM{RCnYaNa zA}uC3)27?g$KlI;tTzvnWHch2k{R=d`@UZ;Gh zBDeTNEx+!J&J>!JzDw!V*t$=={1jm-L__#%S5S0DwB^uw3*nnunnSTUvuUU8ee0Aq zroIqTPb)Bx0oGX|K7)rWopY2zWQ=(DrqwuK>7dm22gEN*9*9-qfk222+Coq`6woxh z+HqG#dULWJ6+)Zu>W(IVyTKc0z79!4b0dkl{X=v{@42znA1Qb?iD|wZFuoQ9%=p>_a*+USH=}&?_;IC zdEeL?lWrcmfp=gQfoNVcTRy2YMJ#K|WG?#Boj+u4S)~=+Ev^4N1|I*=cgcIpA7QC# zg6rGQ`e*Z}De^jsFfasG!z61Ed-f6{3X-5@vwjpIWL1RtxhKK z4jpf_DwLe|S&P-XO-M*OeOsP}ddp&sG=e!EvVWig%`E83dG<#4U_54b9bd^b-dFbQ#&-`!5d1uK#> zLJi-KLEG*#HFPf!8&vNI$g+`u{1uHt)BF4#!L;#mo;Kx=TkBQw2bA0S!bM6dwYx=o z-obhWRav=O@edmAFob7btyEJ^8ZHL#t<71Ey^6SPdco|^%_q$ECfCHQzRi(^>TWae zg+{H>oAD9hhSYL;-_IX+PoCkGtD?RW0+A{D9Z)dII%pz=j~9oEWL-Kg!Zkqu?;{!?Dh}Nz_iNkO z-;=82AAbja?Md`Iu!3LV0`kA2L;nsWW3v9bB!#z=fNJpUzm_GE@J~hXk0qh9JUj{b zD^gIEn@NKB#qWS%;tv^bCJ8m*5li|<$l(f5IsAD^s4AWz2{q(VN%`l7jTD#CO8qW) zKn?JhrMST6_wUToe*jq~nF4r$olueQg$dySY3L4~!x{git(E3-$20#CU@~06<@!HD zpbS)2{%4>)T?l0Nf4A0;tIv(B-7m!Ok7b~{E3Vj}k5A zxF!Dd`}<$D*MIzj%KlFM@{{>JFF)cB>b)Ek&g1-y+bTNvNd<1{zkEb~Px0dUj}+F!Y=5ZZ7uxVDIfA*WyJ%j delta 41071 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 Date: Wed, 26 Oct 2016 16:29:13 +0800 Subject: [PATCH 39/55] Updated developer guide with undo and redo use cases + minor format updates --- docs/DeveloperGuide.md | 46 +++++++++++++++++++++++++++++++++++++----- 1 file changed, 41 insertions(+), 5 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index b4d254dcf40b..0edce898baca 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -1,4 +1,4 @@ -# Developer Guide +# Developer Guide * [Setting Up](#setting-up) * [Design](#design) @@ -277,6 +277,7 @@ Priority | As a ... | I want to ... | So that I can... `* * *` | user | add a new task | record tasks that need to be done some day `* * *` | user | update a task description/due date/priority level | make modifications to tasks without having delete and re-add it `* * *` | user | mark completed tasks as done | remind myself that I have completed a task +`* * *` | user | unmark marked tasks | list a resurfaced task without having to key in the same information again `* * *` | user | delete a task | get rid of tasks that I no longer care to track `* * *` | user | sort ongoing tasks by due date or priority | decide what needs to be done soon `* * *` | user | view the list of ongoing tasks | decide what needs to be done @@ -330,6 +331,7 @@ Use case ends. 1. Savvy Tasker waits for user command 2. User requests to list tasks 3. Savvy Tasker shows a list of tasks
+Use case ends. **Extensions** @@ -345,6 +347,7 @@ Use case ends. 1. Savvy Tasker waits for user command 2. User requests to find tasks by keyword 3. Savvy Tasker displays the list of tasks that contains the keyword in the name
+Use case ends. **Extensions** @@ -389,7 +392,8 @@ Use case ends. 1. Savvy Tasker waits for user command 2. User request to mark specific tasks in the list based on task’s index -3. Savvy Tasker marks the tasks
+3. Savvy Tasker marks the tasks, removes it from the task list, and adds it to the Archived list
+Use case ends. **Extensions** @@ -405,15 +409,16 @@ Use case ends. > 3b1. Savvy Tasker shows a 'task already marked' error message.
> Use case resumes at step 1 -###Use case: Unmark of task +###Use case: Unmark marked task **MSS** 1. Savvy Tasker waits for user command 2. User requests to list archived tasks 3. Savvy Tasker displays a list of archived tasks, sorted by time and date the task has been marked -4. User request to unmark of the specific task in the list based on task’s index -4. Savvy Tasker removes the done mark of the specific task
+4. User requests to unmark the specific task in the list based on task’s index +5. Savvy Tasker removes the marked status of the specific task, removes it from the Archived list, and adds it back to the task list
+Use case ends. **Extensions** @@ -457,6 +462,7 @@ Use case ends. 4. User request a command 4. Savvy Tasker check if the command contain any shorten keyword, if it does, replace the shorten keyword with the associated keyword from its database 5. Savvy Tasker carry out the command
+Use case ends. **Extensions** @@ -475,6 +481,7 @@ Use case ends. 1. Savvy Tasker waits for user command 2. User requests to unalias a shorten keyword 3. Savvy Tasker remove the shorten keyword associated with the keyword in its database
+Use case ends. **Extensions** @@ -482,6 +489,35 @@ Use case ends. > 2a1. Savvy Tasker shows a 'not found' error message > Use case resumes at step 1
+###Use case: Undo previous command + +**MSS** + +1. Savvy Tasker waits for user command +2. User requests to undo last executed command +3. Savvy Tasker undos the last executed command to return to the state before that command was executed
+Use case ends. + +**Extensions** + +2a. There is no previously executed command to undo +> 2a1. Savvy Tasker shows a 'cannot undo' error message
+> Use case ends + +###Use case: Redo most recently undone command + +**MSS** + +1. Savvy Tasker waits for user command +2. User requests to redo last undone command +3. Savvy Tasker re executes the executed command that was last undone
+Use case ends. + +**Extensions** + +2a. There are no executed undo commands to redo +> 2a1. Savvy Tasker shows a 'cannot redo' error message
+> Use case ends ## Appendix C : Non Functional Requirements From 1ff858b5f5428f95c5cebb1ed2731e8f669838de Mon Sep 17 00:00:00 2001 From: e0003801 Date: Wed, 26 Oct 2016 16:55:17 +0800 Subject: [PATCH 40/55] Update Architecture.png and LogicClassDiagram.png --- docs/images/Architecture.png | Bin 49857 -> 30955 bytes docs/images/LogicClassDiagram.png | Bin 46494 -> 28003 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/images/Architecture.png b/docs/images/Architecture.png index be91e60933ece6cb810516c235bcfd2bcf752aa4..8c2b9061268f4a5a939a7a73021be10940a9bef6 100644 GIT binary patch literal 30955 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 ZA^2X48u@*S71#{ZZAG;kIoC{H{1-tssJQ?D literal 49857 zcmdSBcT^Mow>}y`ictiSA}xTZG!c;|y(mSLPC!6FkPZO_ArvWsfPhq`OAR#;dXX*` zn)FU+(n1Zrx72n3>htnx@3 z1iIh>0ujekkO4>Nx8taRA4D$N$_m7C-@JbTe_XJZSCa>UN+U0wnvnv3Uwoxv-~s|& z`HBA~isie)3>;*9qxkHNj+50JxS6vhNX_=8vy%((7rTa)mF-JQU#!S$5a_$$<45wk z?j~!K7yWdH68E=$OqFdEl;yGK`K5E`abLK6UF_b2Om&*xkkH3Ug6$Lrv|keaOf&x^ zd`ObN$4ECz%uDux`d(gMy2A|$CHk?0Nh{p3xU1s-YbbnBa(OV$;tLIr<)JU z-z;mFJ59^LhZDYhVHs%fg6mW}8oTr^q?Jzgv1$W3YLf

V~h{$@#o7(ADfb^w(_|*e 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

f?+NC_2 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 diff --git a/docs/images/LogicClassDiagram.png b/docs/images/LogicClassDiagram.png index b21e58f52dd4d40a711073ff887569441811b99d..aadbac7e0f3fee8302d54861c678e459e69fb038 100644 GIT binary patch literal 28003 zcmeFZcT`hb+b>PJo^9B0HRkdT6h2GrNPCBj~naz*xj$ZU$ID?Arj%%Hqw6q+Z z^&Fh3i<*sFn{dzhdU1+{f#Mj z{R!niSopvvfp4B2hT zR_hAC=hBB>BFufZ5-MI9cFt=sho4G_1+24LwGuIybBjvp3C4S^<-qZ4W6VXnOvh%odljv4*iUf`>3i$lJpIQP*sDc|F7#5vGeQFw2n?`-)j@Ezox z^H?+7?ugoz;~Cs&+rT~sbzcqy2!ma=(MK}onAAcC^Pw>9cW}@^(6cL3RE(CWv`3E;{V6S9@s1O&r5LG4S z0m4~cqUl-Mh|1~_zG#6mpGDjXf1^0CJ;b(1gjnSe1`G8J6+x`t0T2)J?04kitGCCX zq=Fo?1!mxb8_AW9Pg}nniyUS#Etzkk0v`dt1D3X1|D6PElJuJhY8vf@ud~N3=J#sK zW#Y%Drz@8EK^FezKDZhy)qT9-1h6x}O>^Yko19DzG9%4((;W`rDQ?;psD)}eGHEV6 zb~SKgBIXtr90Wezc?aA;5Mh`7W&nK5E5AYfssaaEYJ?kI*r|!L8as%iI9oAQ=s-`q z8Cx`SqSxvyCbR^AXFtWLyIv(H4itYjA+4&8Q07X_#QL?`InXK?uea!3MBH`= zD1V<$WnHY(TC;FoNE~a>J>xTTP#ZFdkz7Qo%CNPM|)ADY1P`e zS;cH*GA14tB@)|FLiW$TMjJ~8S@fDWb~1GMBGx7))vK&jw>;3{gIChXC9iECV`Dkw zU}b~l{J?5j>wL}9a|;|P5{y&@x5zuj_^I*XET?v#y7qIxXLF4Vq7Ck19lnDk%CAeH zJ=0kZ_v$x5t*PDSQOEdM_`nrr7&L-(bs-qM1@*^Pjs={!2do7 zvSf&Qrq78)2*xj8qM!sIc6WGMq5S8>csKzDVi^w)b(hS(zSjNlQ0FAVL`pcDLovKt zbanUk^FxfyCHSHPA-wgu0x-0N2fLaK1uC308csLDI<2`M+yY1O>h*zq6 z>VOr;J`Rr;J-$BN!5@_#>@rWTQEdnd4mu=p1oGycKn3h*(AGz{By=jYNJB3ScYb>{ zR{uv5H(DG@n!I2%(or(8V4B}vU~<+8c8BRKLuzKMMCRk(T+~m;V07tBa(vz_9nr(? z*ohjx;SAQxZn0 zbPGHWR}9LYpuHjIRH;v=xzKgO{5Kwb(t^DhqNsL7QQ}ou;@jsc*jP1&p4ez}pdF(M z<3yVB*tbp`rc11a4WR4D^R$+p%F^%96Ro{5P*l9UA!YgxK}0NH_ugBfhF8?uN+p(| z)jeG3FUI_Zf4ZcNp}MU4mV+EVzf%7*5YeUuB|YzYclRw^8fj;wPUDv3-WF&!*c8=! zQA`Kfomcyy%vZBXk8(hbU?|L|s?`>JE1S+YD_pR@IRvg*~ zW!<``y+X^1?PxP_+hWnE)+to>CtfCpwxb?O*G{uqSsC%I_IyemaN{@D3FruRJSSx7 zjTO<)Fibu3*$`_p?Qb7)wKh`-!3KYkvWhJADOHO#jx-297bq8<6Ce4}=LFVxv?dxx zeHjti70S>Ws9g_DP4PZ}){-ktLkT9=q-!SyiWO}H9Tr?}|`Y&&1NFp7yw4^+r z#Suahx;f)|Z4B|1Vl3(^HkOBO+g2I&Ev0z_>d11l81J&iQMNnW8R+)x{I3g1<)4M^ zESJ;KKBEG@5pMBoL^5H)*k>b^e|IjGJdpw|h9N95Iyd+Lws~R*_4YtFny=rY1n^a!(-}iDd`u4Z>nhVBa)8yeIALGxyRzR5KP#J0e~%Ksy|<$K zLE8b{vP&m*g%NH3$0oRg>-=(r5XF<&rHksLsgAwNvN`F$cP&^6eL%_GhI8Q}*pzq{bD;s-TF@jFkr8UXH?WWQSJaqPoFC@L`*!`^wS`R+2zgx=VWnr{I%K zu(B3-ySw(asPSgAoH@Q0(V*j>R$x_0I#S$nMCkTHy?}#E4u@XI9~OxA6}@=@E3$SM zIbGT#wLi9~IrTnUn1)%|fcj{1N}Y-L6-nKXMhiCpznSoCM3}w8^iFl8rrNi#L$xTv zySpksETS}89hr2B=Fi5cZBy;0<<%%38N*~U<4 zHQ=Z-3f-(S%~Q~B3!ywnYK)-(yMAZlK#pv|iTB3}LymuxKzzwoExOb#nH$4j-H9%= zDe3X?i*EDR9&?bnavSTU`$5Nu1I<*cImFgAZk1n$-?zx0-`f%wSSmn=+tp&h1A4Gb z9#2D;cZJ6#rHd+2ZX&Rz;4|efKu2)u97JM|6-Q+(l1XAEO|rUCC8vvRmf*tFxoWizQvA33d~5M-C~m}gkPqV*SMD~ z*waycSY;T1**%vt2D&AB8Y2F*xnq!I%@W_A*;A0+(wtk?9!wM$b8kw+kfBu?XFbx= z#WtTO!h(=d=>s2Mx{Nfv?sPG>NDNBqJ9r8ib^DavJTWVEpgW?7d@(cnLWwv+jM;X+ z=%YuxntL3%5%AcdCy-*99;!J8ie=Y}gd&+|;OS#6y&OPr@%wr2OVc2fgtOv`LL(Hc zQ~HWCnNVZpX3ACVZ&T-s46$uTMz72y|Kg44cc_$_@v1DM_N-XyEh(#5^(CWgG84;2QgBmkOsG z)6#VwUE5WycIm)n4joeFTC>5u2$Yp?%xMF|viuS&Y~d-Mi&!2bbIm7LEe@+)*CNFr z<5C6XWUOL64vSlcl^E(;mj~KXoLR2R9xY-gDP7$KAPs`ygr$?O5K19|gp zIsz?u-!X>qPLYrW$&TSy^LSI)=caBHz+ub&y8+KTc{$x3-H8z%t z&#FDGHjgQJJ5YQuZ>mj)CfD00xq_dUA*_RxQIVCw{DdA7vZqLhOB%lNO~(7x=O8f3 zdA@qSUmk$Y^vGPRvPS$B!^)A8_nhbfAE>OwZ$C}D=ua^oZ;$+Gy{IvCW2#|${d=1h zEu4JMUBZq#dljDYV5$b(*srBMX!jYF6jX$2s4Fix;7SIH`SSYPLajXGg%Gz7X#!A* z?9=Me>)}90Dwf^Fam=z+&CRm*>Y`U%Rx~Ihl$RnsJr#6|dcmJkp#liUMc;ZsTQDUU zDx}9^I_uD(4=9QSLFVSS*mF$34yPwQYNJgWH^^$)V@FD5)wM5E?}<6^_0N?105*Ih zk3ACNL|>yIPn8AUdP-9i<5Q0Hi87SC(VJEq&iv|)Tt&)&ov0fbnlqhtE{7$4`e|gN zrZ|wD#C)}HkW3udQoVcFpJ7i^#RX$&W~MC_CS}3;tnp$q+v&I|=&mPPQDGx!9PahuqHweMBqGPUhx{AR-C2GuW*E-gPl zBXNy7>%e*D>lYdP>gQouHzqb7r|C{bWbfe6gcKv@!C1Q}Hd`5zP6r|#PnCM<%fwR; zCGVcE+uu)*fa}?t`i}-B!Clresm&p-8Dhb!j4QgP|JJhAy~8jBW~{pL=HZ0?Oqsonzw|M&X)bK8`BDDXg?G%<6Y_jFi>cgq6N-ntj=f^xOouMAb@JE39(n z1KfU@n@Wx{Een@F(M?v97MJ!WOeE0K@ZnImT?}~GkUm^V{tjCaK{Pk| z8|zxz*FF-mH@12daf(Ov5R*ec!y=s*CXn9()2OovD_<3<{RE8nJZ5zQilMDF%sNiw zKxyuj2_$XG{`T{M2?^SY-{`TGMdFA$L|MY0D~=UQ-HZ z2hkpT$+f(^ANF^5*0!DY&?rD9+{YMvz5lVytn}FC6yWyQf3+0gzkD84W>NR;^qwtB z4S>J8mC%2Q9{6m|*5Y~D-eP+{ePgx0`w80OVOHkOhu>ZIe*T zs6KyCaW#paZobnxIktW1hS@gyZ^`#7>#1?3f{1-A0&(XLPTD|Ds!DaMD{#oM@cH>% zJ@Ip)Fm|S3AOFM~Uw(U!t=a)eHV^9u3JJ*rHw9lhZ@r&~+EOjpZ7vN|K>lSZOf%E_ z3)uBd&)uIi!P2*dgm8Jk+zKv7FXaHae)R`NokZ?;CMb~DLu3jY?8$>-F&w}L81C)w zvFy5#8{xJEv7SpIoZumSnEyYV2=^5z<#^3jX(CtJztpVNDY(w&S7ez%<(8-3b=!_D zua%=en-?|qvwiNKII$Nyq&SU~e?ddB6FqyVWyk)?s`#>%T-)-ausdHYQ+Yqq%0HxX zqgOFzD~J(JbP^|WGPe-7+|PNY<(Vk+Cy50~$iCyTlLGuKxO5g=yhou>(+e2)WJ2)^ z`J2KhaY9lkoKNJ8%RK6s64rQWpNz1oQEvV~zxR;#TF+AJm(YN^kQW5Va_vSb5Xj~F znU>Vz46e=$siFbGZHwpq{UpRH4Z23lU;gS6p&0s`;jY(a8|90;R4mJRCsoje+Nmy8 zI8a$WyD)Y;9VtikZH@_iwRf#jEesUesdKLh=I4MaA1Gduf6F6QTt=lz-|)a~_^Wew z0>KnIMJ@aORK?)iwZfT_wr~SdmXX4eiwCMpah5}b`%#p`^|G>TE$^_KQ?l%8zG=Cu z*HB(}1X8j}1`N-Le%z1Dv|9V(s0&qLUB=j?l?H=p( zsvneO-8nO@$J&mbALT+{hJV$u!`fJK5_y4|=lPIZLuyy9U`04fu4WrFN1C8-ei09_ z(D#H{-<`EL&VCJ@0UzCKuME4-Dfh6uD+@qwB!i@=-;eQ~j3FguZ|mj(s3r4iCj z*5%xCl@p%K^&;JKInORDTH);iq%AwDc$~`f(mfsb=QyVkl-h5tE&Fti`{jtjNag(< zQEWOPpzJr;K*RzQ>g^F|lY{-`#Kz_Td`)kM)Om@1R@|$K5>t*YO>5Z*4)ki&^0>Og zbzwcR4wM8U$G(e&iT%nB21a-Trj1(kk@iwE&u|w*+vV3NbD)!SwMiC&h-!w_>Oq%f_y9zD%v}N72HcA(c z8VhK$?^qncOQ}t<6jqHMh;!=ab!Tc_TQ+Nv4_&TUXuLKPYrCA=WFd*6xURv%e1>7Q zF~th_NsVGHF(agVm=HAGs4q`@&F;*Uy{X_1E83)_sZHEOeiHHy^7 zimeex@Qo9%ejmz7hO(wLoiHEY@6FbTQl=b}NJ#8plhs|e?|s>PT7o0V+oH|vUs6*?R_$`J^}T9kS;NJ3%hzCQB2TqQTnc{T0ilsLqKJiPWoqXK zWWbKxB}I#k;39?O)kJ9XQd%%U3>w2Vn3{Z{=i)hD7NW6NcX(pT}^Sso`THDg)dkgzYk%)7QgK0Q=- z4P$rs{08uleQ!)6gLQF70@%&OX2&m7Jty<1XarIlx@JG93x=pl-Ap)n<*}P6}ks<^^tkwV|3Ka_~ z3~v@Xp3dS5b6IuN$sU;ZkGWuN5c}tmvVzfh=?S%F5z!mLSos#i+89o>E8K`0+zP{F zs20B+yhXmD!~y3f;l4^n%bhr9xC`hm{q+7va;{pY1YF~Qw#MM~)7KLBUFt;5onMPI z`P|5@!7MbL5GoT06g|N+k1Dn=gjOq)F-N)c~FF$k21p52{TzG0GI_Wz|WIZ6d06X`w!)OBzja znYGLFOsIA?Zm@?T74~yE&+*T^{44C35XvwPNzDnvM-fZHJKhvl#YU{?+`oXjbsyWb zR2m1vj8_hDZnO4E8fYLV-fvx3T+jjYF|o@p)jq=LbD(RucX`f#>UJtRr&26TF&h z)DDp-^X7A3Vw^i%3vVTweQ4|#LJ!;t*k#~+m^QH^=Yw8>$^`C@FAR_@dyww9V zT09Qt3FUUryhT3;ItlC1-}i3$R^HY3M`^KUvkJ3aC_v~#n70uf_z|FihajGO)xp`G zG%%))cCldkI65C4BjWGW-UpjmTtl-O22ShAw%0HVX}+G&6SKdLqWVR1mAV96=uvdB z`9_5o96VJ9-4c7*RON;iJp#Nq8f!$d_nKy3WqCNb@?}sqIKG19gt>o3BXa6aX~eef z9ZvlpX@7<{x)kcvHC4spt+lajnwA*`;X~x8Z<41L`(HO{dCN9V1j)7Zp=Fypqw3Dl zE<{2`;JO|?m#Q<-8RVIop)hxw zgnt=R*f?qc?k?T(fyWgqGR{JjvXwxZO?=QB+B2h;)_@^xuXMKSy zZvI9?Q*{(#YUD)UX$)e_)HlMoYJl@x)$xha;!D^HdtyY&v^x{XraJ|g-Jls)E&&)| zs#jq{9p>*x4BOM>qm^316V3mG@V-G`bdf+%dNb!y_Fu(q>wr^nUngly$?KR_6B`vjANE}=muWFNMEPYHr(|PNv`N~;o`FlexYZ49QLqbHY zI9Ag&wkSkYst2cmeYa0k#p2MghdMqk7)VD>cbn}5v!(jsYx`A|x9K=di7^Lw4W2Rc z7=K|Y-Uv57P`^umS(fSzZ^(B%1WB^R;SeCgnCCg-2+@KoAd0)ax2~-Zxiz zF+lMJo&bv}Tp5psW2eU3?L%CQjH`r*~uhSDizc;FVj+ zGC*UlLWzzEyCc>~C@>u*?lCJTb|sIw~>s-j>S(Y zOsIag{+gK5yCuAdaFFy+;?~EC&KlT@CXT7UA5Y$5<^H{ksVsc40d=s9MiMD73M-~1 z&JK}bw}pgz!mIcT7MepSH8F6F80(cx5k#Ph_=k+OrVytpN&GOaOJYUxoEIx$?iQ@s zSfn<|N1C^>J!gndBmtfDO^?;IiKj&fk)!fGj$s`TK#87QqpRMbI~9Dgg?6JCkj#`- z>F2yME>{hB;(L?`85k1-Dxo}dT)!gpGLyqhJ&!i2$m?7OYFPpiG@-VV$$>7BwiQQA z{aCdGxxOl7*`@h;orC+p`;M}vf(f>(+UW*bqyT()))gT0agNvLl%uUBxLAoIavZv@ zleQ`|j@2a|;)w_pU}D#9i2kEm*tXY=^bJFOENVM8>isQbvc$`H2q=P9oa!%@#n^C8 zW$9yMrOC=1auae{q6kNB4!IlmY`L!}c-8}H1GvO_qQY!(8lQ~o1+E=0`b*$B-poXC zA;e{5mZw7FwPs(eE0e=uy*j&9k~_DU`i@E6$3B+)L#Nj`nnyf1*Z_*zxH-{MN9Qy^ zbQF-?0s5}p(F{Fp%uGlxvm3?2g5!j$CM4Ji)3+`M=;#UG4ueBAXx*Put?eVYOUByI zRQQaRcQ~(EW7}Bm1C?>lfN0*E_9iXO#}d}WW2t@k)fb=6Wj|hTW`}tOQrxB^#fygM z)8Wr{9J8r=bfTYMzSX4g+YAqef~IA`r;T~vUNHF3c)i=lr}JKxA)8Z>Mz}bN^AQj9 zBiAz%54V%hzPxhJQ)MWEKI`?C%Gmp5K2T4@Q_oH=@dIT#q#oR-wX{r!GFy2iBDm#o zyaXKw-ZF6D59d~Fl;R9QCyX-L89ePVEos)U-zj{%ApJ)V#c5+5n16 z)lVrk{W%%el5~E&#_t6>ac4Bdyeo-gE+yiOmYAFG;D0-EG4VC=i!A~{#-n<0S1{^Cet+fTpUx2Gr%MZQhfZ_&*v3_utn5!y(Zmd*MydjvhcHj7 zKXoyNUe+0Yes4G2r(Wy(>je~t_xy`CdnTH3*P&_7?K|ojLo4eL4T-6*+Iz`Q$r8Ve zqiC*;gi)Ph*UlKf^lCDD!Zw7d0@npfFkI>^d>d9iDd>2go#&G4pX(tJSQOjvHDpfd z$5)_tyL8;LQS0=92Lc7e8(Io8goXt5I)PALHb%?Umf+6ZFv=QZM!(`P}4u=NzYPR+HAa-8ZVoE$P0rzS?D@rY8h2xKJ%aTN{QQ0V^P7UVKQ6ti zL)sn1h>sXrQX>qQO%GT&bS@b+btr><0>)x?IUL^3#C|)9pLr*LfznU^clXGO#_s(r zS%+HP)HoPw}$R) zmV52X%cC>+)iL;Gq+2nsm}1Rig|8I2xqi--wFd;*W(kB2>7*;=g9a#w_rKI^ol~W^ zi0^E>HC5+71ey?HO9UuiBjpT*GUswdy@Iu@ZBoKYY@_tARdHLtNKmA;i9lh8=VXToU+c=szT|$A}~xBmzZy-M_)qO0|(3 z1G>*EVt~F#cUS*L$F}u=b%WYUrShwk_?-nTB5{2cOxWqzsC4aA;h}7*~sapp3lcplLa~UsX%v*+%rJ0Bj=VbU0fR=7r=VZd@j0m zz9ol?H=dhTe;QdH3>(Xd2LztFs&xXR02LiGBAreNFn*@Xd*&q=Ida6x(xV_ow7%{N zKqG&yei(K1q~MRT%-{FPXXK;;75}2s=cIf$=I4KBTU~0%kEHSM4j|h{ZnTTz-+iaA z{#&5sMJ@t*p8vs38r%e;ErL}Y$qrw6oIws)xdSlR9L$i`74DGvqu+pV{d*vzMhA$c z+5eZ5-r0Ra3CJ&(Z-MnMh5~5Jf*Bse)V3%|y#zg572Qc576IWpjk50R026>5=D7w$ zKj5ToEHE_u-}LKsKlLw!gCoX(gSS%n<>1fP@7N1UfSWOd3q(~h?0^i`A#ryB_AwxV zxmr-W=uRl&)d-m7Gn~-Y$F?Uy2>_GVK#%UC0RYyj|0)v(I{r8O8fc1vX!I|X(Z`>Y zLfbq+=!1t$&X_6n-}OVs)*9Vz}w zb3KqagWQSX4Q_Hgv0{H;qMMs6=I^46elE(c|NGY0@Lx##OJ+dEtQGkL$GUCe>w!rb zBq3^{skCP$+RPihZ~J-TdMT0~ATIwv95r?aEWll(GM&!Qz{v#mm z@cbs7u!!7G>@nUoi6Ff(-m)8@E9p?vmP^DB@?x&n{+?Lo}-hPB*V z^M*Y?PLb6R+~3$O19t;p9#u&=pWh=XyL9%FATH^*>=!=@_UV1U7x3(7J9-{#ya!qL z+wqG}fjkf(w-_jq2+X8gmvL^n&O~pFgJ}qZT;&HorAMgG_p17B?YS+owFAhQ*4-SP zb$)wZ59B<-e0v<4_+X(c;DIDC4zXT+l3j!!O}@EZ5Fs)|Jez1P_*%Z?$c><%;7@2- z>#x7tbqS6qn0|UEn~*w?(>Ql^TIpZ*QJ)=e>7ADp(;~T_XuSsn(|3b&c3wXUo|gLQ z+|T1meWc!|OduxhjZaT_aG-IVnzquXIX>|j@5xjCVeEZn7=R10DF~-j=X1EEvLp2D z_$PVv%5ntb^vN8Z6MY2Pi$55)WopL1WmX#z!|u)Mx~#Seke=Z9&FORg@Mq zp2*sgF#`|K`X`|x(}6UW3=|n>Fe}k0`T0-ztW=rv1*@>5;lDE#)fsFDO#!@hbXXWT zbLzff26PQ4bH@Q^o_3#nR>2LS?)n4N^>6HP+vqf|M>-=f5=&ZOEhB8;y_QH>dxIBV zhw+Zr{auEQTh4Y+YAX_2sAC4-U+>!u$up$m5u*;^W}Xi6P14=1Wv%O3v>|%1R?qFiz8lxn{FzNHmo+0uE{_iCJYU_}bf(LU!vjwlG$z5VV z59Gmx!R3?Sqv{Ii%V9t){3g#Ah_#%nISvBjF27J&$d=y5$h){<#Og_7vnUAc&egko z+kY+trj1FCXPWH6wnyH@n=b!A&6e*Ecv-UE{Ww1z1%4cVQtLWziTK|@5^U+zjOV%h z&FHp$+9Jzg;Qu!v172!ZS7M&b55_YBBnIb!BQtm3b~$STsyBV+Yh5J3HOrd81E9Kq zH`FfbFKd%I(U!}%%sU7ZZW-K0PNtS0G;b5Aw#Xkr`QyLf3d8LzOK z9}5iYm7`l&))(L4SGPc{`@Nv9ALkChaEl7Aora|~0l*%c9ILMw5TQekrXClo?w%;T zZBf=jNan5RHQsu|d;`4FweG>52~*Mnf77m)okWNH-PKQiw8Eb>>KB6wurI%b320?& z<5C)o|9laC0=a^XRh)M~js`osB`Yo$+OA2^7MjY@C#1Szu!X5sJ{m6u-c2=(J)`*c z_Mi;GWT{fIilU1|FFspyS}(QJ%>WV^j$E#vJLI(TRHeU^JON8NZt%*28+*V(R^JHg zU_u#~-mAq@+gLk5;4!eT8pxepwCs?Jhr)63IhY=}Rk_OXria=G%(1c_#5Ag%t3*&P z4eRS!DQ=}rdQLNPm3U|;Mtm$y>oHsz{lbX7>4C|X>OTT%j#{jxrPD|76e_ls43tC< zjm(RP>I2g&F0&EkEm7Nho!GBNZcFA!9FQlg8JfA1VpW{oay&CDa6VCZ4}^Y`%^>yL z0_qOKBI#~?+k zwc8BZ1#$wjcrVeb&1TMPZ{CX_iYHdPkJ|4RL(Fz07?Z{wuG^_dGPO!LXr$Ceyk)f^ z_&|#)y5Tmc8lbh?nF-H?<*u}2R2jvAb@%g09~W+|V6C&{+sIksTMC=uM3=G0`Y>l- z!Zo8yq_VCT`arX1)mpn1VOO2h-V6X^j$>jm>eAWh+Wf=;3L*2Y^GHm@>KXpT+yTy` zQPcT%{alzFZgm_EtPoVp9DCrkcEEIKJ=OuB_CYQ%>H-V^o`#kONTep16fBk4c{6J& zFsHzJ0$doN${|Wk$XX>gnx_`C6V2L09a}9Lz52HCg0l&Yg2WT&>ShrgbH;m z{Ne*`EE;Gpsz_bQwDYPht|BMf&1zk30uy3}mY%ol=x*%nF3^yysGfJGF7EiJ(Lft; zG;oNk!}PoHYTg8ksltGdM#V881XRu}(Y=cGn1%jGUC~=($1rh*==+%J838-sgwkPj3@eIlS4k6U* zs223E;lHTK)TR^T_WETyot}5ttB>TM1{&%t0)Q(%80sq@DEwmVq`@v=$y$OfR*%gjL1h$yah}FR86Gv7a&7~qzm_Cz||$9xUayvq;W}4UkJ09#^SMA zo`(WZBXH74t|AdmvbMh)29t>B_}Z0yK%xK5s)$?efWD&A88y48*uuPAekr+Uc?{3W zK*{rQG3>n`B_?uK*P;*Ro-()`H7h=3NN9T70X4KdVsp1m`2-WHcG-ZWs&*PsLsM!d zhg^l=sJmXiPw6q62UHJ`=AVBB9O_3paG=SoTy0I@8N-vDeD7T<4{2fdSYc4Fr=WMsmV7#b?x8zqPm^ zrs+|k&xyt;Vya8NXK(ICh=Gg~f?6sMpFy@+5K767z|?~?Fu`x%J6i)(9LPBfXH9O0 zo1#eu)Y>L?6B^N*;6U>>)uv7=#vx~G{TJ?-SuzoQCvA*Jn`zF0#-sS@B?nr6KYKU1 zL58wyh_tEju4*}o`O`2Sb*9W5TI%W8TS0wG6^rSX!FbVvr|@n8&n-)vff#(PyA!{f z>$N!E{S7lEAOFP;<8jjXdgcp?9g^U{FB)Ljtp7G?;LhR@@*dENY0~kSN7>Npp+Dl% zD$l{(Z?!KLfPUWnR_vD*Y|poQLE6g=S*Sa4!ZrpDn3;|cOx5xS9x41NcujA@l@cw3EXRo^N64NZePPE@Z{VH-r3O~V z9#?*h*_9vp{U8|m+S~4mqs-*6CwP;Vf+z8?AITpJlZ&(gD6tCbbc6&J@jjSukAC%@AB&hbI=?kjjt?1fJwuX6c?&Ta*30fVw)2UO-DH#mX$3pd7)$)y?TPyIFatFl`^(GS;x zq2PkpU(K;|E3Tjt-p&q)EKGGUB!g*lJ(Ro!;tmH#9DqHk`HQpovm>6 zRp7Wz4CY785Y9n)l#HTIV#L?pj4gX4$kRqV7N+Eass6+Yac<#?oS@SmK={Wb(@(Q} z1Y-gR>W|*@n%;sF9INe+Lowi`xix8|>%s{l^7_Z|ltN$O9sBQqg=^QZAd>vJF7F;~z;l^tzqQa%1PMIE4Sh z(R{~)yQ`SjhkV8KPSp#7X-q*BIA;KvX?SsNz2wV#8Q?Hwwv;y#^H3ZJGdG`kDD0@y zdYhtxLIDoivG#fPBXU84A2UDLHVq}30BK@@_J@6-!mU^X6+y@$g>$FDJ_%T*kA3Bz zP%+m@Yu-b9GQ$d2bXxwRIoV6Na+CE=^0QN5@=44GYoiaAhU*Wm*Zu8n?Y&9<)chkh z?uPh6V*6zvw&c0<4D{Vd%+z^+(Dx@)M!>ozs6S_B!xj~tRh|yD9`2HkIr@u$UKcPU z-AHMFSKl&eEMcuvvu~;TD&^6L`imN_M&@9Tl4{%svW?M& zfNbDK?6qHnGpgy3-3bSy!Da;55;8yX>m-bF_(l>1_5xY7ZTKlau;oNAwr`|KI{FuX z7(Js+JZ-r2iy@4T)J7uJ1$4TUx&?33^@846fjrTC{_#g!T2wr{n46N8GLI#sNU$D!@z`3%F_tY5x+B`Rm$ zSA|jgL~Ps(c0Hf~3E;KWqsq+xq^n}H!!OQwc+;LJ&MZ&gK0&V-z69Q6)9_yLuJa9s z4Q|vivcF7~i#PF6-KtP$GSc01Vmro**%_GeHy`4ck;(h}c{m@*A(!X9*c~WgIsP)>qYN#^q(_ZlPY`V$Y@xtMp z5Xxz&tL#>JELc$dQ2u-w9&wzr_9X-7e(CcCYL5gFxx}6jZWa06rl5&lOZ-r-VRpxA zZ>M%33+^5A-kW_+;q-2L8wf{qBl+6#6xxqhN^kEpk8-)LQbl;?5?9suWnV`Ft7-l* z?62k(-C8sE4S!!W3srN&driKdO*4ZpZaowZl(K_mGrKTttRV9KI#FWZ*)-EC&+jw9 zT=TQi(Z%3{-ZkR7;9H^khrjI-S|H8=6EK^BWU8B6e2oH+cimg?5$C`!zc6RkXbs^4 zn+CtGB>w2+tt%~OfpXNm3}!?=pZF$w8>lIa`qUT4%zr)E_R;G2(X=}kT{dv? zzA#w7VIXnQ;a=dff*j(;6nI&|HvRdp?ucUu3*dd${fu4x@QZER4)bK*22^Ohai|2= zWY;+>WlpYt_%MX6{a3yGU?Mn^umJN@zTTDhX^&%Z(%Lm_zwdm4V9cMf8 zdt7IBl)kZYD;sF$(-bPirith&^GO1mt!5mePs{D(1mh`2n9&o`aFjpC3foJNEG^4fP?7DaWf|4BK{_ZWCHZ87tb&-A4ewS5}Q?_ zgwrvl8VVM`RmU6OIx8=Si6E+g&FK@(_Z#+XQkF0k1*6;n3R})SVr>th*5wR*k0#ad z_8le(^@2p1FiYSn8xX);`>SZlpED=)d_RmBhAdW~!mlUtYy-I1aaTTF`F-vKpUitPV-@ufYmnfJg2s_3Qh&`OJH>KxS{y)i{K96RZCUIVLI5XtLi7h zU-fthpnL*ZOviL(3O`oKP6bK!JG=+h3mEkQrq_}}HyM=8eejkB^K3VY-wPOuAj9h9 zM_$C5kpwb1H4JjIwP-7j-kKu9hWX|<>DS6~S~=y+sCv8UW0so?PfP*K{n*FU7UezW z=6L9Hs{3|zYXL9c6X3@sT?M_;<{tpXf;r!c=PSY1y)BPQr`#?W%t9f47p3%ow+jAf z&Tlf<5@ldU*o|?ep@FNMbJbzXyFn>!@M_>c;8uyNnb+_fFdwm|vIK0yFXJM#5{cQp zZx?dg!q3Lo2B_jov2i$;_YE6XuzTOm?&I`x({scPh5|Vf2K(|)I4Eb3u(qsixb^qP zlc98=rMH-dH|c+mzM}RlP+rhpWphRzK6#M3V-mdO&qyUVX{T}WdZ!MU*QltA^zs5~ zDg}gE7W;E21?_pbe$8rZlH~-DibsK|FLm1raPwjc7_~?8(kiO&Eg5Hkv6w&ocF13) z01T;+`M;c~@>~Max+a0rG+Hnj;QmVkDwD|_ma)6N2)ZwA|TT&4?)(PY?6 zK_Jk;&Ic|u0R7_t#k;smeCJN?1`PdI-)}Q-0Q6(tq4e*f2c6KKUhsa_h&^~e>(L$d zCAza1kFZT|8EygIuFbW%|j#z@f(T$?_X# zLgW|So2GnlCv#=l44klG_LD|tV^^OC`$#{d|89fY0eK+cA<4UJ9nH*!OBS?9BQ`Kn zA6XK!81e5<-&+{@xZqIximS%TdR+CC#b>uwY21@ z5cBw%Bs~Z875~Xq4 zNo12wf`LlnBn)Y1u@IC{cB{E=;!Lh&#EM_VLFjat%W)^lp7F0mudVHxx_RAf45Efp z9b!erP$Gz2wvM%6;b0TxyLX@QvG8>lf${s_SLTxT7qU6+!uy&mW~07*|Ak9?jq!9; z7(pey4WXjGttC>Lx;Qc2W03n)q2|LV#$+}7K{JJ2N`6~AA%bS)=c6)29}WGh3bRY5 zl|*zirS}M5FMH6T)yh>Qgn1>Z=z}rQsZ4Hs5J3o1&z{Z&-pWT9jKB>WMm6fjq{+0@ zSXLX`16Sm2cF~LS!hcipi@scF)o+bsE5ApfESrKqeJv=^Bi_9UyjQTa89tTMN1}dw z;3KU~<&WTZ>VKDRX0N6yoiDS_B z1p{|dVYzxqBl1~6skCCz!qK$pn_neLk8_|U*YC4zatgpw%!Om##i|+SI+umr|WVY&LIG@;bPVPdRY3#9p1nboF1%>fSWWCnaFWt25^O zY;l$Ke&dpOV1~ahK%c=oHrm>XH+SDTOytEtIW2 zx^K_F1Q4*UXUI?;`A;Gm28YL4LY*Hi7o37sy#;sp%j|Ve26^eWlxb9!%~Si3FFR{# zcbD<4Hs)jGnEpmgplXy8;Y^@30*1}1EPs0pj1Zr%U!nS|HW2G45TQD1Rwg+n8maTQ zgP2-_v|1u`!&-Dw_c6E zbYj8H$;2v@wzEht(n3?Hi-bwHCSAFuTTi8pyugql!h;Cn`t;%T7Vf5C21LF?3CqpI zG8A%f+HxrdWrLwodUsWzdc*!>!g0ZS)`op;87UX$HRFN2PbKB{dp36#o0-vgJPIU~ z0Eng!L^Ebo|GuR(Ee=@%yb)`4EebC~>ZZ+LHCM%|Mkabtii?WGP_Z;Ndf>92^Zr#s z{g>x4Gqt0%K-zd9a?xx?(yWzIzU@E#0#3?6u2ujiWX0?PqC_y$TCZ~d^=!XVCHjkg z{t~WTbOmbE1njnpKpya~>6$E`oDe(T^$NiC(jEDa!Efe_4O!R817szjUcq=_0|WQ( z^8HFj4k%wV{SG`X1H29RM}*Q0Rvp)qzIS))S$S2JFEam%MUve%Bx?KE+!BGuzgL5C z2jkw_pWuY`kJ@JPVF_p8ao!C%jB3yFq`r!c@+- z-y@LMr_U>IAZ>kGpUxO5PA2x)kN^KRyi=AGfjo7;({QmLc;$8%mxaCJOnQYrw*L~) z9(Rbol|Hf9nXOySeX;G`YyFb0lczU`fiXpOTxAxJN?vx--TrBPQ4s|Ae({n)b>4~! z&v$=x{tjM+Y2@Nj{x>2b3GOi_uSFuEsF8?qe72u@Rd4YCCs2lwsy8>g?(@vR1qdPS zfs3|4j$s;kd*G)OHZrzJIN(*)TETY*+`LTbr;e{aP$l4Im-<4?@%p<}U?T$<1Juth z0p?pN;yYR@-vbk;pdPG8iJ%r$7X!v0rxS02^WmByopqHNBvX*C73QYlE(N>w;4 z(&Adc4lRoafsz2NIw>L~6iJXOOTi+wfE5uLaX6MOgDiqCNfB{CAc%?)V-i+b!V(fp z0%V!*CCEX~{4syezwf-<-22_{z2tu1Z@Jx8z+fVM@&7EZyc>3_rJnSaX#2O#4+Xzx z`tA8~?jnvSD`OpdK10A7TvLlGRN$&d72d-E%XH**JVTMYSmGhC3WaB zes4cbhH}@7!YvfBbXx`IU(l(6d|g1cYqCASFR?Ly-Y(AZk&tuoP-D}TFKb0xOn=(w z6gw&rw2*UeFCrXIZd7-VyKA18rAd|h4PI21)jC{8z@9wT$_~MQ65br-RAT2NXc!$k z9>PC-1SHTyWI8FgUtD+QI+17L+y~U%=)g&WVB6%@c@O3gosHpS4;B5qk8ZF~q$>cK zQ=F;@f%yjbfy6Rnx~kodGPjMkmNRm#-)90=Ej?(EC*B^#uYK7J2P9(p2!lfRF6VP* z?O4@#W;ef6As%S93P{n$tH?;#I6caqV)Eo^#2fno+Wo^kc0cbk(urAYhaKfsehWSd zlR|7LikkuO=OoGc*_dWHJ>hu5WKDli8mMNYn}4)q=X`s~b(iDch_dDv+cAHvBXGha z2mi*G@`9ijd0JciM7ODk{m>i%_9NO+MwJLa7VfbHG<{AF{5Kr9``Wk5H?*e!&$5d# z90})2aWKftzuHm1Vf`sVOl6`}ctB|e4A3U1qy_rv&@X9MXqazzY}UerkJI;Z8^QT2 z^MfaC#Jt1tZSAuLvL}oylU|iOzh1Y#{0BJMf|x)ct)^_W)d`ctgeI>Mp?U!|o{N1! z#9|~`@pnGm%+pS-a0%C~lx|ib#t|ZJaHC^Wv>Ea~KVT(hB!kuhEvFbbUGb-T50MYD zB34YZN@mJf?@@p5=<)>i5-IsAs?*JLA@I3`-7b2j6(G8I2N=>Lmcpls({NBRCV zEXI9Gp+j1=^Xi^6V^1Kaz;HNI*r9g=#MjV=XG85jT1L6J43&*#@pW9aV@+?)Nor%8 zx4KZhU)BC4(f1rs(4%F`F#%Y$h`T^@KvQ=2NzX<}#j~L?RZG?HwaosMoK3^bnj&2i zV71|_*GC(?dPTyaYlnPeAR(PKd#5x;uK#M0Y9Uf@&yS zOs`fba~v&;>oDRkUx7J67yV!u3MFLiXOBJ z>r4x#T|_{_k5zuK$jFU6Z7gNT74>b>Df4WXW!YMK119w7A`t{glsafT+p zc;HjKqFkr8+LPepPIwOynfFm4ylqJ8L8TyZknq*Sn!u-brfSm0SEsdW(9KJsw0FXE zr}{p|^HtqS>b-js=g!ESP9|?t)yGylwKy}3!J5<)DCYObubmG~krE#kRT6wa@x83{ zUKW$$O7YEII$J0WqnJ#Xf#Ft4CF>2}UnRPWpJ2*^R((jDOHOp&j*hH_EMqXHno)1) z^An(Tv}!&?ky@v&7fhb*A!j(=!9kMe$5MxV3UP6n}%xSjRoMkWgh!^NF2A{0Ss0i1noNK_(=qE-e7JGKVw*MhNfR+ zu1oryvkYLs^V!$zSFPQ*V_*wG2LvjnOK>f>5NDP|AtW&(1xA_UU{G-b2jUjm#ji9) z?57y&K1P=6v6_fX;CbqDoyc*nHEb7nU0eWYoCd$&lbP&4*bQRY8)TL-Se%4K8+hzn z5^{%Bm+{_+HfG4Cz?*G97T_gRS@vZq1Ks&|hC-6_h8Qw8#q)EYa#;Q+ap zhP`}eZu>!r5RG<$AYPThiv2UuJ0kyD;+s=F>p{p62iU-cJ#nD$#E))~36T&%#*N-( z!qd|3x>H*Bl&Sk0+_IJE_b0oZF)C|os|?n>Ra?yv4pmVxj{0)^x!+km=ZrE{P%{>G zf@RBsoy+b@#WVEP1->t?b0cFJ7W`j>QLn5Q$H9b06P802y~I9_2(E4aK(YM8X)vNm zkd+`uP>Yw%(^4OP-FFVw-EpRb(pkV$lc~b{%)6EeXUo8UHoCLUx$sa0^ zxzblVSjYc$8zqoW0f!tHxSV7t1{a>1+uN+476*x{6ltt#9o8QFO?Y2mDUh^0$+PMX%xJ(4!#@a%sLl^?MUPkJl;5 z{+Eqi62=>pDjm_b>L|Yp->$`(A4zUT7#15>OD};o%V~E6Hi$;az9P!@KH! z`zG+o_?2&7z+YEDT8c7PrN0FH0Die{`&|7w9$szioip(?ZKk&ed^lC|fD%l-!TdD(kv*Q_{i-@OpV?S@A6(>93VX3;VwGz6-^>W5qT2qgT5~DNf;!n z#B^hlaw<`L<-;ZG%aOPFUTt0eK=*Xz<$P^zgE0Y3I)@mP(JbN7Ao-K9r6!L9_SG2@ zTZyI@%K@!pY-N3tdaPsPFPf<5R5fTPe>fRoIH#U;dbdu&@3gMOi63_|?q>hqpHW%~ zcB%}y$5@z%ZUU(a2~BGID^lJo#Vj%kvxmCT%8>>p+pk_GGllprKpQLXU#^dxmXgi~ zJJ*{C#B)Eh{#MV=oXzHiYNzn0_DDYQRg|K<(Ng0vWk1CCC`z!nDRk77T>{ zK-YfkMlRzWFy%agq)Ro|Z#03+25~wAswU@_ZGi}(E@vq~rY`w1uS=LF^PsAp)$K4M z07=h~U1!wi+`TV^a2UU?ireY zg2s6kyiaBJI}wq|nO@Kw0$Wyv=`jl#%+L_;G_A5&*(3gM_PMgiG<8!Kd}}$bNs};Zs3Ynf0A~t;mV-V8+clELj3cE-!|MTz`YP2g?gf<&fR`z>PS5s zzX^z2dVTS@lTj|$+%mVJLzt~MI_2}`k*Q5G5oIFy@v=s^VP+0BUy;0mHv-dq`7k?& z4F7x?eb_Sx>07p%OVdrM%J7_a8zcS0qy3z!e-eZ3m7N z9-?JB%$e$DD@#gDrl&O%Dx7Be5sw8~&3iD;l-v; zW6QBoYd_c0^=yNk{`dO`?Uk0kH&`zD^vBC=GroMOD5(CfcZT?Kz&K&VZ&z^tasSK9 z$KqXmFZcVlx9|ROEp$(nbS_5+f1&&Tb&!Mm4@Y^Nf85#0+SkAbrW+@Y^QaviuNq}< zB1KeLxZn#(xK-#?1l;P2kc0eZ`{^MGh~kj5EM}lu?0fc&dzQ2Wk`>3s$#giB{HYU;R{uFznC=Tx4FBFrPl))Z}LkYhDI!d)Cf) z`t#J|Vj2^P1bg|L#a8H;q;lS#ZJW=iitRl-Ih_A>&5;T(ybg?^xDgTQP>C?zaw_Vq zlkm&t0zLyiee|DA{eK39e|G-=9yH=)7G94mjns1mLEf2vq2|x7DmL#WWCZ?l-l?l{ z+dbtdw1T>nTvswV7D;!T_`Kz|Rx_xf?Btn(Nv_W^da~PrTusvPKy0@!?U|coNzi$3 z<6{g>Fmx|hC={qQ=0pp>`oTeVkpKiD3?we;x2q(q092#KGA zSx<~lsLBtn}s>e;O+UnurNMx$v^;V1p^Nu~56!@hvSv zL(?oNa6YQRX|`Wr#Vpeder>6XIdg!o1sBnMU_`OrTXLmazFQKtvD%FNrrq*kOU)hv z)iiU+wwqq+rq*lrGK+va(i6#@1R_>4&W8-kshL71_6iM}+Gp65?>c{y@^uL6?Xj~t zFapdv=vhmuGPl~RhN8Zjo9bHP?ru^|9sA%Lnf=%G#(xX9S)4{m}V(aCA|rF*wi$BYKj;N(y8n--yIDfVpL!G4iPq=GZ@0R;>n94Z&Fbha z4imNOWmW`J?#6>*DSbJm$-}4a{pAUT!y??0CLI$3 zM`0dNPZf^nb)*Jx1ebF(Nv>BwHmf0l0Y7}tvr%Mq?u*=GAd4PkJ>zoDW6vR{v9WKa z^(-$1e9Xg2#sx4yBvvQKoy$>UOHQfj7VFTx_3=J<6!LelwIY_4&mCg9oxp5}hRr_q zd=fR-`qe4}4^KxPa5upM6KT-c$;Lbk>>4l*TpbZ-@WU?WTpK<0` zz5EL+v#En}sZn-VF+GuU~u!%K(63NuNJyV8ck@crcO8>CSL7aC*|6_W`K6 z0}Top^6LNcn%WiXIA^N2u9a7AtC2$PmIphv?)5Ag55m_HEOk6;+|4mt-S4@H47syP zgCl#!EQVVBS}vwoopq>fVZVsaLw@sO@aL)N2udsnaJBXNx_fIhkdA8Ng{Hm`7IK_B zP7fZ{+*@pzH~ZCNJT}HKZFtLr7h2r$dQe(~sk2I(LW620pg%2` z0HE79`sbyqEv{l6sQ_S5jfNQ^9k1d^Yso^VNOmHsi;xJ>8x^WB-7{lo}AHqAAWLVMfTZAYkL+jw|BCsTmi>3*VY>SR}XJ_ z@R=zAGnU4#R9U`Lnozn)Oom_F&i3=bp65|#&5IQ0DQ10*Da~oC(RN5)lI}(_Yp1cJ zOzM*CiSJqEHLE#^8*X*{nSt!h2fxme+C2*&Wgo4<>km_T+owgC@q&MTa+dhlZQXmi z`ON}3g0Op(z0L@&YN>Z(>V&9f!*$eTtcn`d>5;#W%Yi6bX>s_w?y*T&xbEmo}`Y=d^<_uj^XeEQQ4}@csj5TUsP?<#K#+rAl;&%!RpK z;WQt%oGeJFDH);DYg5##6Va`c`V~>5-6Y^{x$LV|8 zfYRR}zY63~4zE8Vj7JBF_rUM4WZK#Hua8@g#$ZqVo9kaEuf`W{|A^cid|6mu`Ej}O z=2g7t9`Lr}{W9WS>3oK_KoVO#D&d9>Qtj_>8LP-Qw?9OMX{_3|@Eg^4!s$yS>W9^i zATEks{nclaKV*ws(Rx}feqbtp*j;;1^*l;eY(Vt}JhMhKFi66VkKOa z(M)k5b)I2<)LtjY?dzlbozEUCi!tA-y9NNLz-Xy=O39bImv1@9x(AKFC52V++^Ei? zdy6{RE`g%B_l4R^-@%h!(FuT?}qg5LA-cN!917};kpQ;*M z#T&+Jr~=l30=EuV8Zs}2ST<}aiXp-w^5DpydC0UNzT!-O|Kt1o9PLGprw&b?&S~ne z+Td*JoYbRvT@v|;dX2RtoW5PIkAuA!ey((%ZB4y~Ig9OmPtk0*DYUYYBYLhp?xO>a zF|6C=Az>VRi2x}KvAsk#Pq69}dac8|SylF$D_V)fd`hBM=AwaE?}*kN`<^?}^L)UpJC$Q~dm3SzYgmbAvsGVDo${ zz&~IW<1;^AFv=eQBg&*hFaglP)x=ccv%Orj2uR)n|P z=86f2N(>FVI9u5r3KeTKoaC^cOp9S{B9#Y!oMd^<#;lwO;Xe)t^otH`lOPrlz%Pi! z_(8|Rhvu?b_l40hIb$+In*jsPJH3AGjV7|<8*}##1b>-odIXh>hYSwo?>5-E4YnqP zomU>_j4PUo2=k@i0+4(RWdAmUE+e^;4&95KoO$J^8|6+qEam=2a2i{V1QsEpAn)pW z*z1M|m0h6?w|>5fJ>$uzZ@17+&)OdMAM=(le~o6BAZd6mww#l06GFa!G0Pzoaost| z5B+m^SNxH$M0sXGUI%(a&cvNqgL3Y|q)ucRJwD5Nk#_E!d{T0Eec^Q4`0U%aG?E*E z$^@DI!;w?iB=JT1C1piDTcm;5o%0KiGf7!fe*7wm@_(VcD3qj@cAAw zf{;x4UKZ+oT~F>6h=1I9+Sf%d(^;Th1pujusNacaH{Mz8o9= zxPsm*=>33ot5bVNKRL_RhhTiJe>Oa~TQ?UI@wjhfRGEiGQM1@<1l&hJC&a+P2nRH*4ik3dkVDTj;2s7dqhVk7?Li#bcv= z_APeb%TJ`}D`Y7&-fjPA>yOdx?A{yXKc(0-(iP$)(G5(qmAu-X=wzRIXgf4L2d@xw z9uKT9;#?+Uae6P3yn03$2-3O!)?{0j61AV+ujiN8aE@Z#`t?Yxjfr`=^fq=e4|?Fc zn*9uON{biwY7+BASQbEd2DDnab0!WrFB$p|>haC2C%ZdcRm}}JZAZZ4L(N_>2~#7D zrb8+6N05W>l}K)`s`;skKecWoUzoQ}H5a$_u7-oxF-TQ(R;i2W2fJywL?(IJ{tsdF=bw5b7|eKJj_Z&UbMy!*RK+lH&DPv`Dg9 zK(>{;RiM}$jHRU`pvv^vAv+5jdqbnD5B4Ha=>S~|tJ)Qsf(g=0zqgvdh)!{CWuE~} z=c@a;d*_&*g@P4#mt|lZ>QJidEjp=pTP}FcxMRz8*}Pk8ev&kl&Cx z)17)x5TV31i^<-t=6MYX9_L>gl(FS_v#H{%!<2SVJbZHk2+PpA!YeP4d>T!zK*Tw z_0?6-Jpt>Dj9wRr!P)@nNo5H1=Y*s#&!;+hLu#u*G2Zt13b>BE2}VZ9Qe2jV46b0 zjM{){XeZkBX|zfTv$Ju%{^l=}(CwPQO;o$;O{i;3zpw;5@qk##TcJ8zW3SiWscw%z z-KKjf8|gQ*dA<^r42$g@RQnB2<#A7#_yxctBn0zbc%sd>jy;l-nAa_Hn-)CK`(hwD zYpuQG9eb1W9eyj_#aWV5(IO@55tCJXhGYi7r7^_;TNaAQ zzTo0LZBYkDhS~y_xtSjF0Q%Gc)&qbIR?RFS=@YN=fb;N^8W6=%m0Dhf!Ae3dkl0~J zOmei)TH(dA*N7$V(v7f4K5gx5baazvt*hh-p!Pf40wwm;Zmb^;C+TV^Z#s<*BM@KD zW6J%Io5Q5)(lbW~TJ@VnUHbV!!hztB9F7#2%-k)hpn!-~UGsp(^0n&~5q}3h)VLS$ zP+U1Zf7sD|1gg4}ub-kc^0N;{g?FDb!+Y{LOu!xAvrrNX%cav2On588Uj6`Me8Ynr zL(82r&Vc4m&&2h6 z>+=8?87#LGh&h`R?0@-od_UVSt$-m;fPA|i|1^F6#&7%)T10ZwH<5IXcD(oQ?on@= zOCt+gaIs3F_ld|zgkU?(xkYrFsO|guTX?q#HYNJXX;+y~hyZ7+#dM9U>H6o_?!x@0 z*sq$M+nc;!jmZcVS?`Y59#Vj_yn=D?K#w2K;!|#-6cth%7lg?>%&dhiFgqQ1!GAqL z)N2-3PuW-;l=tY?#$~uK*$yuTRW$X{AF8Lk-(pLGEmt2@Ek=8VuHz=8xQt=8uUBJ{85x%`Kno+_k&FF)}TT!rd`mvGy@;f}8izD-70Zz6) zAz8a;caQgj$~7oD8=YdaPS4cX;C1zVi{Vq>pcwCbT;OFg_yg3CMfjRDlRuKyM~hHi z)XQ5q8s6h8@R)84w+Dlz<*Lgux<7fjxnr!V{TMWGz?XiwDKvL75t2H$z4EKh8W6yG zet`Q^z_8FTu52-JvyQfwFVRxeVm(QYcc%Qf89ILLh~@NLg5Sd4@chi5N)-=v%_cQd zo#T@;`;bf?_U2C__R+hbGv+zFZL^eMAfO?R90&s(k9U9oH5cEpw+ zr8HH(UcD)-%vH9b>R*aWAJ;1!-R?l0=q98+PAe= zv0*$`skZz0To;&xfl)BXvA5rD892sxc-sKYytfEDQnhO9w5#&TdEbIo%8h}Kw#q`_ z7q5Fo**NBmiaHLy0F;`h)%dj#77hQMJ8TuDPKfc6j`oN91rH>OeCll;bXP#V{G`c%x zGQZ!MZbp}J@A2Na7sL>&UeWUUE9(!+rL=CTL|2I3psl&Yp>70_?V)w69c5OG3oc$g z34t=C{?)l<21<0xF$+C#_3d0Urt*zh%sms&uMRNnM9=6!6a)7b`omAQ&#M#2dZnX8 zz5*O`*QKC$Uv8QM6$wl23l_5xdgXnLEYi?XgPGIjg*vrXKIC)jBr0|?25XGg`Fu`2 z42oh13lf*G3_Caup*HF8ul5r z^2_+)ba1DmTRfuvn`$C`B2TW}+M{Q^|9H(;@oUt@cxpZZ8N)C4J z>Ultsi(CH06dj_|9!Er960kc8CmuviMw0C1##qb5lJ2e#lG)ZuO$WvPFJK2dzwU+U z+v9Z`nRV5j3d-*t$4Y(5^xJ5?w!8F{)xO3X>j@`us6kkkJC^2MEHoDsSw}4wZa*F;8iWv$zOSt z-BR=9lk;V0RDl0?UfWJ?a6sK1pIUCP9 zBozw8(l-t`$7JW!L_24cGV`?VYZnx}of@9j!6&{Ui(T!EvYMGAKzjT8qO$IVbn;-QRw=G;{y(orm%>n6BGFstLPD6;d4IN2M6ofC*Xramo09@-%T?k7#YJRe%d% z2ExF^vk}}eeL<;*Rg%KFv+uVCYhtI*^uvOZFv(k+uarait^Pu#Wb5jUzZN;&o`mI4 zE&AyXZol~4u#9@?D0(rtLvY;iOg!G&6MA=bT$IDVKk37>{kHk?YVq$}UI*)-oP0tt zEBhzohI75Cnn7BBEoATB6BKT&TBE@b@*ram8#Qe%G5zPGkdV=hjBnx3PHA;*eR0~? z!VjER2XE`oJ?)ZI`PL;lNR`5qYi#<0nOppsxbk9?Sl<%%$6SV-43F*VC>vBbO_zDk zcvm*a^my6HYeC_Z3V7jX*01k1#h-t>P+5A*CjX#&zm`=3n_fvE*a3QF-B*eg&1msG z_j*+QW?e$ev54~(ZQup%EDx-*vJ{m}9@+=WaJ%Q)d}ttN=z*e{b;Iy_&1n}yzfJGx zqpK54G&CO>*>sgxwf)yNB4kBX0j{ZcSBhw8VQs%xx68VFlOzBQ1}20z>~3$wGqQ~m z&P4wF^}WNye|;*ndbCK=2q?j@r5zt*d(ga71?St2mucRJHXQ8}_-K^rcIxfS*{yBH zSmIGUbBKLE(@SHPrENiDDNAcq-F_|W1RcGCn#6+U8JcDj`M-6swLp3kR22_B*8Sjh zE0z<<6&Zc`vAX)z?wy)wA)5s)l-H)7N9J|*usHu0E(YFB1p3PA=GY_Ym3VZfx z|5f~eEmUfrDDckGCcv>f0gjx>+))qtK_21pwU&n6D*igfTTNbF#3mvI7P)|?p-Cet z;uZmY(=Gt1uWw_^oe6(%-!d^W-ui;P+)U65Yfk9n?T zNAS11a6W#*lPxy6sh&4)4RsK+S+#NYa1^y!E#6wsqPmwQ(AL+u?xE=(`emwxMNK)) zX!%1?CZrNrbv_32e~ZRX<-pFynWohBmnn|$awXU^EewE4cd_zMx6cjV8XYtG%H$Ta z&(4X(5ghqn!@Ixw(<>EP0s6K}xnh-3LR66@oR^Zh7A8; zzo}?YPZ!8Sk~*?qrGKQwZRwM2jo?ez`4IHZiK8NJ!pIZ))`X*VN{%v(l7Ynr@MV5d8ofnXGe{o44%E(!%IhhB$j2(OBjzQhp8?s#NpjrfBA}Ej z9xPe2C)Sd(Lmvrc8A-9nvv%GEJ65?NAW5-2v=$xiz}wOtzk`Ucwmzy6XVZdhYu1Xh zi35+?=QJ>)h%bC0>eYKqyPW6|unfO&@Ua^#CUHqqR83tU%egy3V()9Y$+cLhZWF5A z>H=Kof!!`}&8kw$XnTT>)c}^m0e2azuba#}rJ_q5XO&7<)msfrG`Ls};LCz9eb*m?MRuB*{a_Qp zfe@+^to3s3+Gnv#O{PbJ_$t)pRz{141`Ie@?{0CXlkb})*3qZR$YUjTel)T86uR&9 zS9E)MEdqRNnwu_i_&%_BQJ0X4=8}&Z<$hTkuTh{KhtF-XyCr(ZkNgEuJOzWErN zY(qpK_=LxZTbyag$*9@+Ro{Nt{_6udn(TurWf$O`kA7p;|31JFzF7zj#1_dz)k@^l z5@Zs|DD}Abd!wvsB%ZX%ip{3g&-RL#^Ya***ksLz4K2+F>c^}wVs2(7oAM)bgEeC!$! zkiT56-ao`mgQ`yHq_db(Q->@QtCy7hWaW+`Clc~fk0+bMNVxhzHk4t+G`HSV;n2Z0 zfoyHlhjQs>Q)-5D5s7oo#RhE9^i1Gu?dweq+k0hS#LyoGG(~;IF>9RWYH8PMakv_vz!a=k9VC2?jmz4hMRy&Tc z+X6Yp-pg(qTTfzLPIo-$8jk(WFTtSal3E|;6|tiJAPQ{*<|nb12jeQ-Q@z$qBPG3!fBmF)^beDc>VMFz;Vf`{Gp0;} z(#yh9{M^ zq>5KU^8D;8!Eq3VOE}gC5ckxw*K#sx$OtQ1dIfMkx?qleul2(y=KhJv)opy4*hn1L zCU!?(#7}xn%vP@YY8){TK*^^GWfDoYAsS%YK`YMpv6x(5@VwqZiQ&1 zk!KeUH$Q1Pq}5|qe&CKvs60yJPuDRAZu->e!@`Qbp8b4?N&Sj%7r|xp$fH}FO65lT zfD8E~RC#g*s4(-$w>TW6t}FI_OTIOq?Uk>ac`#aqxxX3*8>1%HGRx&gFi?6XK>@bX zJ@Hm=U736AnOCn3IrT|**~Va3|I8y%#h+Uer%O1m@`=W|NPgGGg+bQOh>G{qdrrh> z)jp1d#^AdPFOlV!IAeIc$U0vpkr?oki8zmpvM$mnOG}n&*?^h3?H;D4q*rB)ez$w% z;N&^f>r}(6$^(RQ9NMpcWV*iyO-A%v?yDofu~1osL~AIc#7U>4@;wkl8uk|O`Nu$<%G#qLOJU*2FwwTl zABfKF>DBB{24Z8nW#@%vZR>Q{D4Dd&>0cpmg~bZz37`rlc&%pbR~t32WjfyScJV0mqa!TKzD~v$K6>KEBQ>@qn$j8uneIjw^@VWh`&<67AOb%BzBo zBjB{4AvIs^>pj2S>+f2rFDk9NQVohfmK!++AS|qWMlk1hdEWZinhKYd`%xK87Cxg^ ze@(=O0^SGMw`zm^f^&oYYqudR_2Twz3+g&k%(6xy=e4EE`6Ohy#)8Hyd(bxr-!yzI za$242E0uHvIH^zax|>N*{pj_anjvDK0_=Nc zshwRTvx2)uWW?c6q|fKe;txClvgb-VR3}X$%PcH$+znx{HpehAzx_l{kd6RZrx+ww zS!<;*-BU)LvV|hN`X~>Yh)Z_c0chq+r~KAkdzo`7?lw?Bs1WC;Gj;rQkCv^|l%$dR zP&PI)^v5u;z%TSgb)?a)TGPl^=vEp3cf$qW5VHoyh^w}Dlq4iv*#H0wt1eWOe+LvX z0&(-n=@#45H#;@l#b@8?vy0BEyJoN_fZ>dL-oqB`VU8*N6Ysa2bO)t6r2sHj8G1MH z$Mf%(Mp&~q$$P2607z`qN^V5m(jOgthFn$0*1$9Qqopr&nOm_MNmp5&juaIc>4TYnKC89iZ-S6f3(rCN3O)Z#Q|vi_hP3x zs$qfuJqyIb8n+`rKzP9kJuK5r7E^#O7jE(ghT^BNsNW0pD#QPSmcxmTpE2#l{&=4o zsJ%E^5b-$1JdtKXJCRt&d+vCSxI_rJWb_6A>S_OVS#1|DQF-1e^2^L5K4nbaZ&}nZ zQegT{{iMpQt5ij;?JbJb>XUhm;?>G?zyscos*^ai0%TVf8}Rg25<{}RQS2p%2Jq+9 z{9|D%xT?Z(lZOh2iJy0e+DdBTuldKgA`0N(J$_(&VfhwB`ux(e@oN5Etw0^Ky$M0` z0Wre*c))UCjTUSs@cnN0=k;4yO7~|!7j3EO99_v-o%zx)fN9WWU#0+#XAl0Vb_lhk z(*rylK;8jP6Gz_tQ9hZjbn)Vd0^p)x)W4uIuC~Of+4&vjjI{hu1w^{=7b-oM%ZW# z8Y}|oPL?8LIB?(V38julgdxLDdg@mdhd~|g^W5da-1C4 zCHl_EOX>P~eE|KSX94@G_5nCSC{RD`4k<5*h$M&6a0ZAqxv4l5LlY0$tsUq{$W&b( zuR7(?uMEdJ55~pbA?mfn-7fg1J5UIUnh>GvKiKR(OwkVW5JC|4B4*S4eizH+c|8J( zWgPVrfYZtuLBNx(wwu0tv-iQh!IX67GGV>A%bMPd$WP4d%WTC2a7_tAw$-z@Xom_y};C##xsuXW4Jf2^)5RH1pad zT^n7qFKIM9iYvGU#rrZ%>9ENx7P!4^Eb?SLJo~7Lt=a z>vlA$WXpYTH3JI{%}1|QM}#wG9VYBZ7W5|$0z-@3X> zWoiUH=n)wjNJE|?kE@6Thb}v@F`2+bF0YYeFcdx zJB4o>t14ymT;W`|JPEy0uQ~vx{X70LV&&%YG*qV0b>>is`JE&aT8AV>);p6}kG8V{^I}B+Iip-0d}0N^DRP3z?G-i>-!**J zos(_C(0zslHC+Mkz3L7dEQ+>wb$f0?c>+&(LlZENpGc}Q^k#-6S8=@YEJqu?^$hbP z{lPxEdX|08Zy|~u<_UK+OJ@qH^PptEO#GeLk&HO~G0XEsHBc}FRFwaHdG_%B0+>7a zJj!b(v|fg8>5HEQdeKp~`?YAX zsFeuyv?zIFcbqin#4dhghQuZOR00EeaqYaiSH6yQ{3-0jG~@2^5-W*1_FYH3gf$Iz z{uev?xX!Bnw9Ry1BKB}waAIE)e8`*nk*JBSU|mYkG9)vu2DS~z424A{VG(uvlnno& zEe^B!q+flQrNhN7Oe8JEr7sUY0dUX>0wwS+ndsVx`C~$AQy^TD0RQh6G=pj40_7_BN)6!Y4$*R5k%tCwBC4G7COWJTrJynpj@L`%H zSe=5?v{PcHfKkWAUiP90q^Ju0xIBMyZ6}M7p;N@|lYfa{44V{F=le_pw&@pZIdkP0 z9~UX}(zZ9}2Do`Of;9n2Wv5A-$c+{>Jxrs!rr0S2bnOVE-pd9_?sUz&)P2hm+UpGc zt$S?N@fG@M6xZJx|M(w|h~DTcU*j?U?TQn2imUyvu*7)Nh-U6kT}e2|%eNP{f$WQ5@u)w$dvLBT+?zJciJ z>xnZRtSgyw;YmDpY?7xsyrZw)Ei=QX>ErBC@o#}b zG%D1N{~nFtLq%Q{snqmd`BCzNvY+aqi-b1C`Piv}$$`5+rcZ>1AZk*PDmDfX1e!T~ zE2moc8OZaM@d8Yfk$keEO@n+WQ$Tl66=sYHiDK+)XIS%%S+)6I`?}W1w81=#lQ2Yd zUF>*SaO?hmc{Z!4|s`()sR{PM=*I9tms51{obK*q@|7TlIwjIxy#k0^_ z6Vxy%!V;(1j4Gf$Ew`6_sGP)eMZUHF;V84%7*~^C=$eA?r=VwrVF;z5`5@+$#NzAX$|%W{ZPX z)h(?6e&5~p>9@3pF7Evhb_e-vKi5o$ zoXC>4phClYU25CfTj{;VlXOIJa+z(yol}wC5ENzM-y^+lXC&G)*TZN!FHUbYCrUWf zeLFo%ZI@K-ljx16CB&d6+cy{Gb#q!BGdY{xbRFbMV_{z z+IT|eVL)YzThZzC`aD?bu_p#+>3IL0OTmIAm{Bs%I#D00& zZ{8wb_y$8(P>n6$fZp9(0A{O&_Stb;`Zn_OwkcAUke2nk&Pe@J%UM>fkJDWRx>wY% z@ce$4qW>0IlOih?fF#k{DfeKnI9Szo6+&XqZD52eD8l<5gUb)hynO#D6$S>sn}E34h1L>h(Nw3I=Lbu3${9v}*F{bJHimw*;o z1PsTm{}ll`vF&7l!pHmculnO^330Onq&6LpuQzEEm;Fg}4E>M3q#aR0tS+T=2s zTG#kTPq~tx${g)Ezv4351ma+s1jHce_DePGe-7Cnoh6mZtf3`w{8mF^W)D0XukXLL znb&b!^r1s!wBGVzJKJAV5nutJ@q^h*!xZI|SNlht`={RcdHK5To340?0bXBiz(}Tz zw_n9m`OoQV)iw9C;m3q^8dxsN4Ie)k{`|iLrWfwuNF1#Tl(mgzUi~wnG6l5Uv(;6w z^+7qc27a*IlrW=V40bCY_O6my+$B-lYJu?Tl;E*cmD7M*Q`jbCI3l zUMv%1K{`Ch_N&5Jcoet3=ywaC!FT7I$Td{l8AQW=6TKH%oe8vdy5NsT?2=S_^10S)sxqVFuZfm7o>SG{Q-^@T5UF_>+nbWf%>a^6PFz4(p-WfXcnM z>^K`=1Ms)$@z=3C}JT^GrtI4`)wN$Y?>VyPa!TEDzS*$?^;~uWZfu(CvRgUM6hlIxNPfiLvm;;UvW@MTux6kGjeNAR zQG6TqDv@fqnIiDn=X#Jp2gpI|uL%gUSn+3#3w)3~fhWh&30c>CobK_YZ$5S~F%@0u zHJIQ(H1LYG1Ph8!mj$W>TYwfr0Xo2E28Y^GZcSQSwoLlSC}%#sEt;LX_`5Ydvll#P zVopr)yFIZNqg1i0o3%H7l|Sf4!h2xL3dL~Ey>uu$aCitT`Ze0@*Uu%6Q2D#jHM?2{ zu#WbAuWwL;LHM6GH6OXIC^TBKRFTr~HTHHoXyEl&fgI~t+d^~^VM689D?Rhj8ak1_ zgAI_Yf4}LE^}BRfpat>I!c571{g|*>=WFEDbtfmi(G=(r<==gNq#i>)B+}@m5bK$~ zOa+?!4jKKi;IWT+`!Y2bG3ppNpLI>GE}uI#HkDiVWS9-RB&@hB#tbfm#eE|9j| zVgE4tWUF9zrY=Xs&}JoMFnZfs8D-+yS)|^+Cn{-1E+Y3d$8ns7iG(&|{oKEg$k09! zZVUuOcNLP$a>cWPYfHche#WeH6WD;bEr8pl5KXCP8{sYh{L$6cz7P$%)$Zy#^L2S} zpt=6y@KT6LFXJSrJY#K*DRWj=MBwcwjt_E_@Pg=m z%eh1;&pGoyrf83Ohig8^wT-E;+jq^ekmA04ze+h^l#3%zd@u3h{^) zU1@O=U_Q{bc4?J(TIqwSdA$d@A6J)?KJnrx@6q36F$Jz~5^vn$DA0MSYWE%!oCZ(S zzN~%w4}ux|6CQzKpRUvbaE(s49jIWnSx~_1orfLaFp(T1a5_JgaX@fiRq*0b%UW3b zwz>X=^xE!kvJ>|bz#lCocuv4pbS%6AB37j2F+Hg|@%b>(V%5tiFJhIW>1dLERE#(p zXY9XY-6i=csteSmK6^<{>A8`T=M~6+b>#pG=AZ0TB}T^EF|h~Vv|{bBVBo`1^OYy@ zIcF3>Wuz%CC)BL$T__NzF5}35YF7S=hSTDrVuiiIWdsZ#0=|i$N7%><3NT<|%nXN` zhMP|KD58J2ZWOesWNv@Pz#hk*3pa!S+R`l0XU1{{=xy0E8_V1Z2R-I{`H;x>CMq5 zOGuelSLef?{QY^+AaT!6XZuNc#W6HNLEFBd!33_>r70|^$gtjKORy4AYcy>GiEH8! zmkSJ7!Xuw+N)%Ca?%v$B2jBAB*qE1CI)+zRX_kg`*xNRr8aJ9;c-+7;()fM-db~5! z%(#@m+g=z@k+S@zZ0+k1JBeb19r`H%C}v#@)Sol7pg(!e=8%qkH5c(x{XckMg8N-3lX`#FQyT0L9y;if&SuvsXSV_h~R1JS>P2cRX4C0vk zA?0>0A+m03HjaXeXAAbRwN>P6gG6!uytujkPJa?KMHjnUY#h{QAhw_#5=6pNT;Bjh za$lay9iX3iNSd;bh6I6oDs^bGvxw1RGePDMdB$gF}ln~7ha_(&G$M1Z)Hhin*c|3z5KN1&$hJZEWCuolp ziXL9*Q}U{t+bP3+nY#q$-kmcB-(YBpz6)oaR=enpIi zfjy<|SPk|b=hful$ItF7%O$zaIQZTBZB;+f5&W@*)}p$*H>S_IV#+FMI+~KNe(Eql zfjLFUqfDUintmChkevH7)%1dTY|ZlnCXLa*U*~ZR@qn!M6vL8k#}zPakK%3R(V{q8 zA=mW^9;;Lt6!YN6Bs*n2gB39nB40FWLkARWle&821YD*wo285_(i)ygSM?<*`+JFb z$y?Mvm@)g-QM%o>lL!iApYM@5`2NJ+PmB5Re8<8ypW>UhhYGB!rS>}D;(8Unc5QBr zWtok_MtiH{bi=!ofd~#$rReYIBF6AX*=%=tF|W_*g&e<44oe9VhKEnq=-}YZK+Y=}?95xrjLZ-h_jt>=R@!dvocJf?74$g9` z2@(6{iuXVZ=xxW}K5TGzWWRBsQ+9O?&v1U$eX`b~0g9%VJgw3OQNklqBK8ApU8{7m zA%UQnpePPvwFlchv0DKO0s0v20MAYE=88q#^c#|Hi+uH1SS=^5?oT?ds7#lO<+HF{ ziON)2u_EduNcM@NJz#O9k9Uw@T}#CiIVq-?ocr~rst&{1FE2F*;N%ZBCbcR`Wzz?4 zHCZwYfBV(L3Ikn*n9C)E!75+wVe$x}GHVg7+_G{ikrdmoR?;6@8EWwNKspk}78V{c zzzK%RkFte#*tKT=LDe6B=X#y`DadJe;GyS2oDC^~m z?9o<9F6>BhQJ^CEvaE*AVj&z4fjZ zP&IquOc(*M1$*ZqhUOr9=Cbj7Xk0u8#cu<~D%&=AQyH zmP5MWy*E$QBkz}dOd_WD{Wl#(;dP&uhx(vq`jwcPAcGgxvCsZ499io;qrSDWr10Sa z%%!sG@=(K5-D1!?tYdG#=ee)WZ~qe6oKTjq2WOmDt^vRWW(gW~+LL}4gij|+-50Fl zZRXfNWHmP!9*$jk!9o002ZE~rEF^(skEQ#y5nR{2y` zl8RAs4PPL+kVu&rNaUtTt`JEiHcL)g#X(clUoESiCm)oF`z{+6h}{QW8#!Qgp>z-U z=2Oae^QET$y#EvJ*r%r6gfZ?H55}(iNqp%G!=K>YO}Hy|C>gu&3D21-e|ZP) zx=u>7&1NYpMo6r?@5Njt9t~fIWYKag0=KX8v4uBQ74>;-Vu{z$Z&-aNYV9#IzVTgD72925b93KUE9L$=fL{Q_`d_m7h@?2J*!f(+O z+u{wgKMBy4H~nLuoxKh|mvPO~h)u|}&FufVUa^zKmw!o)SdKn*{gw0(+Ztb+Aunbr zUtjejGA-(sbsq&0)w&6XU&} zn?511*%2%xIjN{@MSQ+um>PpgX_F|Iza1GK`>^hq_mzz$0XUnPe0A|SB|T`IJehIX zc@W9d&R|_0pL@T`$PRQVh(@uU{&>kCS&RDbj!e4RZFIyF1l0?UXaC9=pc9bKUgSBH z2j4tRbfIZ%CSz;7$fbDB7UGQ%p8S5$+56(4v!pAnICW|NSXY^&wURem?$kkf z3k`}s^b}n|k03@g1<9q6A?;jcU2V_o#>7i_cFl`<7nS|p9ore(Y6i!ATkT)Mr>}{a zb}4g5i(O%a2{d>c)m2+E1$~*?SU`!-+K?PztB|mvquS9`{ z`;x*L79eR+H3|{%aQfB(d*EbDj?LT;j@-Y>ljjGp?~%%By6g zeYdEVLQMJs zCy`Ethnw;pPfVSEoPMb|cX~+0MoU`$^3%2o^0>3)#etoHNC#j22@+e~BYv9deC^t3 zor}^62X9mmTY31^kf4$H6J zDc^687D3gc?rJ3+%|UJ6nBf?npKYhD!y(7JwEp+~>nl15VVvr?ba>DB)qZo~yF$LL zkT)y#rb0`^**ZfSWGyMBSOVAtJN8!jRd;cV%zR797%qw=mnj$e)n~*ZGfsg~K)_Ut z3W-ajlc#q7_5KZjXhrd`%;dbQa`*GP?#l1g?>dT?m1Ge&IC1Ovd(2#gX=CbSS&(0B zdm#69Bs$2Mve((Qhcx75B=>`s;ct%urL#9QAoyPTT~(g?I|+dn^>-oJ-Ladgj1D)0 zL>(o6ob8!3vS5k9nGu_I2c8xYvxgu2S(aq4n+T+(g^L|RT+n?QS&f2%479yh#2Sg8 z%eeZLcZ@*gGFa}16|Cu0jP@?g^DS(glbfm0uch;I@crO)SHJ^7@uV@#{i(UHTB3V@ zkV+lVK4p5+Z_@5Q75~8{{on{gqiix&-`BJyZ_%nj96y_7RD4kdJ&ZzjXM4X&9C1s2 zE|%*pAkzDoHObp@MEu7aKn~4w1UfU%8pi42@vBtl#$kcBZQsTbk4QbFhU|%Tw-X)V z%Ol%IA**yRw+p}L*;KqbmO%MQz$1;OOEzoufdMD~kE!~6vEHQdZ=S<7nyox|Mt6jh zaedKY{dH{rOvau5zOta1E2c)RI86ETW!uF1tc|f<=Ita>IpVU-WPkIJ4tKp_9Pd&p zYNMt-A4N675e`X=1$Y6j9V#QVO4{X1(9eiR(nOuE8mDybJh6G4(G`gkgf#ar3p4GV z6T9jB<&u<`t}s`#dsJwD5)5Bz#}0GmgIsO}eUhGxh`{x7bMy@nFB_k@o-qNDTxD#@ zhOquMTkOQf79T#zH-a6}NUC(yvlg`3!2~9NwQ^otUjlqFofo+>|JZkaIgM=FrAx@w}HQ ziIbm!1b{P*O<6udOJSkcNbGNcULe<6k1!r1ZcQZ4p*dNr$>|W8CZ!kB^C&!HqjzA479?0`Qn;-MHS%1tkaciAI ztO?>$I5;zv;4eyET^3Svr(|-*%EBe3UJxpZ6x5H zs2yzwmZt6!*sr$(*nBjBFuh@ce#|cT&0x9OfS+ zWNO>OqhG%!XM2#y1B`YtF8 z7U*ULdOV2!bPcg~(4^a4NJ z8pvyeyZ1eJAA@{7F)ib>nDS~->vo)+C_P-gJ)hSs>Xwh}r)0Vtef+AVs<+TgSGjd7 z31|v_;Xc=t)Nk28OB!cWKJo0`;6;`p*O>m8hftc{G%s^HcrWj}l|0Xu%+7Q}8aG@J z>EUnc(@(pjR`oAUM0&rNm58u{@C+GbpOW+gB5ozp6M*}kx&#G3Y~wId{MrMCRmB}% zl9gix*-*4Ux&(8x$Cup$4Oox85$Y53*y?%zlt2=Ddp}WCSH|2qGY#7&u>xet9(5g< z@YphxGn@`E9(bGjgjF?#WLiq~I!TH#U2NO9K3U{u&SIi za=d!&&yOb%v;`Ee_EMviPbE5`8W+?^mlHfoT(jS*SkG(hF5GTOJ+f1GwZ1f$_G;d~ zx4(SPAjo;lzWPnGD1 zd-ABCv4Xhn{GLOTX9uS1ixQl2uIj7P{S!+%(P`YJJ6f7z9Vqq(tGb(WDFK&a>-z#? znQu6RCengouGPmTnMb)0u>^3)bqBq7t=}9U%C=sA-5I?DR01mVu2;aZ&cNhllp42s;V5HKLa7WWf?wrnz zOmgA@RKgZ}4PeE1&!5Vg5KfA8IutfOtn#9;rm*~4h>KAU4}1Pq zo8JD&O)u6JN>C92Z3+S6XiQep5vtEN^xc{7V7Q#LTm9V@^qP;kcvBjn$%TSOfwbu^ zFvgI8U(|gdk#hO&(}r;zxwrw5`qz8tU7)Y`RJK*|zux{1mOyp<+qmBJ>WReD$I6+$ zqdDeD0UPmyZYc34T>Oi=(_wVn@YfG;-&wWg@vQG2xy$?Ad>%GKb3JuT7P79jj6j<92o+Cwf-t40Btf4Bybv46U4T!3=@rPw-jyDiC+Z>qS>O=|kKpZ5qaervb%-BHAuW-a zkvl9j0g$p?Q{u&fDZ`{pk9L+=Pw!hLkoP&_ zz)zWu0gn)|=k%rgVA?BMX0=WXj@E{Y2A7h<8}G4Eo~HG`Pn#Y7te^qGCF*CS&WxNA))nNrnip=v?* zPNFGW-!YO00i}QLHv_timOc2@;&RdlJ09AmbtZkjF4ebNva6=#RZEZx{-cJsy-*2Z zSi{s9pM&6Ht9oXNKo?V_g=%)T;HpkE&{xbSgn7Ee^H81q#aicMz*2C5WCbWl{{X@^ zF!4PX6XhvLx^X~xZ6?0x*P%&jaNx1w@$aV=cQB3jOcz7xF{(Q_etf2w3K8k9`moH; zs!VDR_mR)&+yVaWclYDwmdH~DW*MEJ`}{|8OF#P~lxehOJzbO0@*SoqfM)qVxd6ws zhF`=$vS%KMVq71*c-?wi#{ki@{8Yt^unAFI@^+M<;8XKqF zj;NP^^A2+;^hPjC+`cwZ%@^oXW3rnwM7)Op9r3e``5S}ezlWoO0Qj()FhV8AOS~4u z#gpv&9W3LiY2(ul*?a9`3*Tc;i*<4ud>>VYN#iqR4diPBO02=_R6A+nDA&K<{0JVK z5hK5{f9mX8)ND(UkH&!?vY5$lKTOehBHpvBS2 z9_zNo%&xUlfvr+H*EZ$moR?3oy2j1DRrc$qEr^Wi8&A=`GUxUGoVJ3ABUnXG$DCwm z?c-DK)HzoKU}f*;8HY@nEOoRsKkXaV$!kj1&oBPd)0IIQ(iJs*BP+xs#q%YUhmLt@ zIKjax$huG%h6!@+Tj|<%FdjrpD2YkMAtiuFRf-w08(is|yy})@&osa(Gq?Ga$d`G4 z(i@83p32%O(k}>m)Azs)v{Knz^1qWc%2Q>CXqM3o~4+&@V3K(}U7JdJYZofhbnWoCZ-+!xmBKXqtk zsMUYFf4ASHadc!f>uwFBsE+pSmDB06YHaz;v0v%Y7HW2u^Yp$)?WZXr*-yDmAv5ON z10MlSv+IT{f26%;aDl3S-SPf|p;GhWjaN}Rd@a3DnhDz_)gyRjb7FHT3PWYD3AXDa zObYXjbD$O_u1g;#Vs;}+0L%8xaOLwwNmJ|HJ@fVQhgeA0oK7K2C_Ng?DDDX#aEI0_ zbHg!1-{3aDGSIt__}JeCJh*6PYz&lVxGdGa&)@p=71jIbWS5w6$Le}7{stB%Lr-5g z()A&gT{tBI_c;=9BPfm)(mfBfYxbJFR<4N?mtOY?Q8M

k9JsEi>*Pvn~%dCF;Lb z8G29kw+V_k*WM30_#_Dz_-m!-5Yp|9$jofy%_ddx3^bpeZ=q{;Pd*KJL3nKP*UroP zey3)@Nh9cC=$y#Te4_bS!blM7tLWmxOeXp%N6QxN%Y;z&!Y{pK)vl9Tlv)>vmN%T- zrCOSLbjj1fYVTCIQpFb3?N~?G7yyRy#tSrK2Y=T!w2<5BHcD3|E&fV-TBMKM$WfLf zPI;#YAd})+5XC9s-5vM&*<((=9Y1!d9U~DjyEeNw?ijty4B? zc=Rf4>=H3mhZ1vjLBo{`f4%Cz=5?Y`IZa@>@xkbiLBDdd=n%AkhKkB?7BlGnC<253 zYC;%!k0YPZiT!)vS*I(w&^?!|$@aI*j|PCJhg$!K*1^1xAeP?QFRl1LD!((11jdpp zwR62TF#A(473$4b?atMk6+8LD!bsAu+e;&^MB3~EXvw(mw|b!K#8`u7LJ0uGk8 zdS-8YHJ#*7@m$UVlUhf8$g7$?cSJdu=BuOa zYLx?gn1GH~mY$&1%z7k5ViY4ueKjJEUv|1sm>qnqkchJlM;! z>X7J;yLC089@K>$0F@A9)F<;pOhN#9Ve=oPu$Vc)isq&An9Lr+fm0w&k``+EVl8UA z$t&!4j^~pP{HW{NtUK8BHPeE!S@CKk>nE{?^5%l^$u6FILzeyN8*w#}-8hKKKUfbE zHG?nZ&M5Oc04zE_^+ty9dc$Yjo|dqv)*ofE1stEbX0G8RyPn3Vy{(z{cWA;}<{|lF zkq3KV0_6_4zP+z%MH+Vv=}<{Mab=BYuIAjJX!$L~^Q?K4^x>{`99g)gPj8CrwP^Zz z?(n0dWDY)^1^@=>nxtdA8+<>%;GkhD_4pTMrJpkY6-8Icnfgb~+RnWJlq++|b_hK4 zsZvjR_`UG`x%wJR4}|4-3R+TW6xyRMOG{$`8uh>^l-3Us`w@mz8hS?r-O4P7~3ZS!^QC{-lM!{mwMC5`Y>=M!10!f|uAN(Jm>=nMT zb@`}5zpFS}HleS4dg){iIu~Z69*RR+Fz^4Q1{|kKcjM5GnGGFEXY~=tlB(5_9PxNN z9qi$9HaqA|am+pEs}TIr)q06k4|!4}y2CE;R5B(1#OitL$E|M@J?|bfbPNI@1VG#X zk#ucX7Tttm5CCI0QLIncw+4-#%80S4X92JVck_vhkR5CYaH6~D+D&cjYa~Rf{P$fx z=V7Edc4})DOJUyHR~yFwXDd>T<8ENnlQQNzDYu^nhaiRM_0X8@VwV0otH58YZC_>p z3Be=j=tKu~=U%W>QD$1M4(V=K08|G89CfKe5fg!d`$37YV(ry@4fJwMjE|A1k2?1f z;~4i>Nu{zWPtR&NR>s$^dg_o5_wD0P_Y@D6I_1YxRvbvhzGkj(%hA&keVN8x%x3W-Z7F;38Na>qAi2x(##P<25`@$>-)!#Ds(y!l7$$68H!J#h zRJV~WNN_SI$FZT8*UP!00~Xo|-~=lH>&BL%rZ^*rjfyKC$_!0H!=9wrvB)~)BW0~-|1BL%@iz6fsA>kU+HjBxK(8) za)pN`uw2dU9}Rw)n3k$x@K4Se?EJbu!s%{+>_6Tx1Zm ziRtRtpAyew^L3V`b+<+Q=%ExJ#l~`@u+Mn$$DLe)D)NVra`>dUQQyYi`e#v8^QNo6 z-TQ12^{f|l9n`38f|-9HY&c8qchmT@y4)<6$qeTN(i}6)yMviGK+CfQ0uS&mGO;JR z3~Pxw@yz}hYQLpzwEHH)vb(xMPW#HWcC8I+m8(S0)aBPQ+Dn`On_AQp7f|o|&sybw9yBM-Y+s$h-j;7)hvq~or>7nZ6eTp`cYEIo_3+OmV$DXPoMduqpc;&u~ZF8 z{?1%Fz)oA*)RMo=(?o@eN3Xi2gw!nbbf-?SjH?FCctMZam(6uQ?8$Dx>GB!Z)Gw9s zCLNzvnC+eF?i;TuvsR!n%_XwQltuUD$5cXr%f{9vu0?lP+_0d-5!UI&X0sF%ebEsj z?Vkvbci}x|$gr2DA=7ei^!oWFEQ=N39h3A=gv}RAo?rZ?vZcXw=DfeRbKapiEA;h< z#7-+EZXflPsfku`#XN|qXFy^ktXi27u1pE9G73TIT$P#1s>W0tm5nDY*X@?Gob0el zu?oq&`27JjKqX_HEj^QUYtQf4@2(1!=w{N>PTbTW9F_tp)bfHW>%FX>2^qUJZ6#p- zW*&Nw#1w&jyRPsp zP?nph)9WE;S0wot{J;?Dy=xuD`_M^|UG#S1O zE#WaUA`hceo+@|>hA+EYX5fWqJAI8t!c3i!#?Y5AIdx?Cqr6sGmy9Ys?SK`>lw&RQ zJ>_G(B16i=`TTn8OiQaIHB=#)IWGat!bC0H{A_k;cWXY`whQih`>GyGP&50PEiEL7 z)meOOfU4O>c-JL~658c7*h`KpbfLU}yLx@%&$2QXXJrKgEu>ZGJp)Ozb{Vl2nF}pj z420)KlZD!WAwg|^>pm8h6CuGqFwmm!&I`ZdZ2SmG6T^_QJ{9aG>^>HWO z`srfx(p9`gsfOPTkl#f3+YG!|ELC3~q2dQ|ep=cN!V z7^aQ1nNs@)qHlq6%A*Xu9XcYu>OxeOYT*{}hw}ypp3652a^obb8@vDTN1~$lyg!3b z5qE%Z(N=#d{XQpnsm}8|nUGe<$k^}d_?NtstvM3)scJj@dHr6~X%B%YsGay0M2~Nq zo^Hjz45o{O#@Js4BAqypJHc-RZz9%Vkd>V>96%0iYUz=LRROQj@`Egm7y!8T!yh(& zBu#t%G)O(do**elGxhm&%}{EqyqoLiMjx^mG^A;Fvv37ORQ0-CQM7tU(R3D$fhxd| zBY5BbjT7pZPK?jPf30|`7l#bLqTIeiHX9rHOH!l6ZM0^^HIf^U(xmMVVb@d8+5$}Y zlK8`Aj^OWLdww;LlkMj4LMeH5m+LM8;$pK%8)j3R07fD{CNI{Pf@-Zx9ZLMZBb@Gl z>07R+D{6x00sLmkG_O&kxM>f5J)VK=QqL7qPe{~=*3X>qy7OPvF_}$GVlPaVEto3M zlA%;_@=TLMIoX$H`cXzm5Vli<{o)T|&BSgi*MH!i+A(dZ%(v3I4KrEU|Fb(OjN=0r zxBN->z-JIo%InK5G2$#*fN1wh8-9p08|C(1FN)EyOw;95&-#ChnA#b_vpq84UO(T^ zP#oV#(?EZP*mgJHG?Wyk&Q6&Xxe%L8G&jC}JtRfviH<$P;C$&HA&bnQ#x`H^9`?|@ywBL2_DXHOX>MY5Q4SnatajM zzOS`eQiWK|pZ(RLrAjV>4vOY{K{nhz0gsq3wdcmy@`Zs;<%S%BtozY8~+^$DHa8F0%84H7ddPj!&2}i3G z=$IsKUrL=-9n0l(Tv(~GQ|mVL6B|$nO~xq+eU9;*PoNSLCDOBvls5te z!lk1Lu7l6&cIUgE3(j~L@7eA6YeO66v*J}#FGL}e%o~c$CSjBcIxar=;C#$qyR@V| zZs)O*s_hV#Co_yRwkcB}A4rBwLYk8;<@PVMT_`ha=w7c?)K$>2#iK`wba}6?rTTnMw!`Z8 z9FB<`jQwr~QT7#VZi=1!>BB_FhCNFn2E)DIJX(#5siz=Zf@usxd9mm>A0)V5k@?WQ zJVEq&?$u@#&ELLZ(8PRAGUV%}?QfeUdtl>Jw`9HDXG!e}kTB6v4GQK95^XT(J)N0` zZ$H{#WGx;hOIu0*7yS|BC+`1;{^-vC)*rzf#V$ZuO_I~bX4S_IKN@vw#oJ2xf6HbF z`j2B<@m(F@Kn_ojcl^W$a&o32(sN$aM>rlJJjNO(>4OP(-Pxv=w$1il#u_Y5gz8Ep zB_Y1~+m0F|GaP}xwBlj%VSs1GcyyD*4eYibtTErOyjFat(sGk96vn9*{{U82_CJax zZK_Y@axw_rz4Q3_zr5&q84poryog7Nd@Oac}8agjP%TFEy|*%Pq@&|>*~#nNlby4c6VN1oPT z>yYWJmL$dwl29mNUJrycC39Ws^9|B%bN{}AhDme@%?Nt$@viZs_&~JbgT(CsgQ|y7 zKAtXZzG5c#2rv(&=H#t*D!6Ku?-}(yL_hO~RM<8ey9A zqd3R{$hO)YGk1x8!@TxPW83x@TNHk6WQ>syxKb$cY+UMQi|BOAzVcBO>8+1P-!&Rd z4D~^rN);PN`Bw}?ie^SLj?IpF?Iq$j=`HFlCmrXv5=O=8<0vlp#gaA2g!tu@yOZUAMM2*&B*bgyXE!an&{mw!Z0Sw<3u>ZB| zKuRp0kshSF3KmxBvsL@=i4R+t;QPCBnFS?&HFJnzm{=GxIu z<<33&Y1j83)9X?CGtlpmSdAObFj>$h`E2j4rU;KsiM?}(es6>`F@45GhIHL7wQD`h zGn90cT~9EnFDfFbDdVB2w2=U7p1|;{9=Xsd5r!m}l_tSCzS7l{!AME*fJ$;Zu zG~j0xk5GK5DZ_uRftL;5@;sOVZ9zr%NiIm-Z(|Ps>I8DbZ_ zFmgh}_wwJgMM#UBM*MXu=+qMt5#CPpB*$wmmNFUst-jT~oQBj3Dx3KtH3jccb;O)U zVA}lC&%I>aVm)Due+ILg6Mi+#sfcQ=E(;Ru3d*h?US8Y`_gjhg*lVeUx8g0OI$P}! z$iuP9SY&mg%=_82QW={kOJ0?oAX&R>BymE#{+hfr) z=kEley_AWIL9_6qOFR(=3d zz`mJ`KVlk#H6B!ELA`X6!)y!~(ondtzZt#6OTg>A1e>Uy6x#{)B18GYv@)YiXwOe8p+9yUApbANsz> zlK<=MO>nw`zp8$rxnaG$WAi*8#?;5^LHJRipKjYG4C$Q6(sx zaKlc;GVNj(QVX%W+c4WW4n&^6Jx0Xoo%{_bzJkb|^?{Cr1M`M0dHJ18jk7Pq z!XxxA;XNNe4BDM>!tXkcvVri~8VNK(2j{zT?efk4^>7=Mn%b&0YlmZBtU(*tq*ryQ z*3{j$b8qCk1psFw+scSnQ83LtB#`Ci9ufXFbU{Lf3Yo)l@(99qu^HPtDw%*&Y$6<_Gj`wmksz zFW2;`)rksz5m7QxF`N(xg!DYa`!7dt>PrOwGL)Jd?543%IcEQFWckgQTYjWuYLXMI ze`MlV!*}J1_<{h5Tqs>shq4Gv2Aei^RDwlqK$x#T$LIPxfXr*7WYLSa*0ehgpZo!JbmyEF*-4#c4u3~Kt9 zQx?zuY~_c(o2S)cH*px(Ep))i%Dm)h3STBaRln;tGCl+WsmFB1Ti!$fro0@K2xv#i zd}{!4^rc75RCJ#!L_^Vt#CbxR^GN^mXpR#cEin}MbuPn*cmVf42m*h|k1lEzZ8}_n z^CIF2o7(S}YjTUY=vULJtLZ}f_=N4W&~X_O>bgvFcnlxAYew5PJe4(Ne*pM=%xw1( znFvE%mA);8GPe?v1pwOPwI3%>_CwSi_8}Q?wVT=5_Lfkb>7Fjh<4X0`cBvH^eJ@oW z*L*MWZ!okq&Pe@TqtPZ6R<9}oih75SGG%J2Q@dA*MPzvsw=?XI<^wj*IIT%+RzCBM zuld_|nHJp$-vn(Ns&iF5qpu!LB?$_@^jB;nz^l1C`?kJX!oD7+WRLEh$a@*v9kdF| zaq{Jy;M3s!yIbQ^gU*k&gEN?KME*KFINTSJ4^}e|Rd`HH9F2KfWz>>}p^D2PUAWKr zJeAyMef15Evgk{_Y2O4cW+zaTnOz^;*0rzr3xqP=_mB0writ@ylw*AnIHNr-fKCx5 zt%t1gYgvy#eDwk&#U8jFZZ^`!<%Zo14E>~rQ~c&*WDRs?AFaQDgVjxlS!`4-_C^Or z=DyDpt_;+nX|i6xQbLez7cnmx+b&v{GntTnz$V8_p9bpBSFW8fW{%sa1H1;T+%_E*FBV$Iltp>swSS4gwE2h9u8EhX0(g zDZpB*S=n{I=>2-#b1O-UUuodsf?g|b5b143LME^BvazD)Hvz?Fm2FXgVKlkefVS6>I zC+6&sn`Q2M1IA*$d!af0(*9}>1CoAVYBznFRU7@!$pLj?R50(R9PgQR5*%jcR3JYw zq8B;nPD8TFeNpdDr88A7>LKwNwo8Ecz?8lszJovL~(cp)*{R_7z`rYYu%;PCJ_()g-54;Mv|DIC=MagTf&~7mrj{o)Z zU$4|R`DBlAl2Sj){^P;izvxUNUy_1DUd8cV5G#CLU+nUbO5R9uYs2*xJwvh7 z9VX5doIdffr&bh8f4%TRL`$r?y?dVAjF7$$ju3|V2MHPk!xQ!rvYY3E?txj zIsR1v^fwAc>woVjN#24>OuQi(fyj*7>~GF5iQ=CZ*mQp$ zT_=8*nl#-f3KGR{#B5yRKNl{Yp#sFDhzF^k#F%Cf@k|N6c3JSu8wq~?y)%W_m+m^h z0Ei?ArBeE@Zz}s+Z`-<+tN4=sj86maHRT=76ZB$nYx zkOiN~2q}1Oeh{6!9Ycs|E0f_{P;86sTjy(uZkAkjnRDY>^Uh3b-+#`$?Lm=$``_R z$iqw`k~uEYD^VN$Ci?x(E(>)#Ojje^`VHvT>h~?l6A(lg?N*Y~mBbT~z#ha-6#*`n+jGPmC;-l$$+P8P- za-v6tTZBHOdqr4iyqT(KegakLY&j75YZI-v3h8~s@AZOQWhnVQYa9*WmHg+O@n041 z#X25fhS5vid3_dTN9MFteHmy=JLu8g-oaKj>V(sI;b$`)f?r?3G{~d-u2i!}k?e7s zXPp<6ha9oS9xu2e(5Rdi+keM>k>{d2LeZ{M4pN;iWxUXSkhshCds`q?=)5IfKDP0a zol!Q7li(wOq;)&_8ZG{!h&JaQjZrC}0phWU4w5G@Rs5N-EYjQ8Nru?yFLuk$f_OcI)L zQ9C?YzHCFF-{ZbTK%-9IQHj{fR9*(h!|G36UJ`Ou$j%f{8{eo80g@CY55eQQ>}y;! zomRCO$E~o|l*KT4i6d!>07s~Qqwr|B@Z4a52A>^Y;6dY~3$bCBd4Y-W^w@ZzoF5dj)STPj;#{3}+ze1J0v~O9J#CW_>o!a%#;)^yAJhDek|78G7tee_wWUMkBOZ;^|O$6UT+vPnUU_)}Mn=8h)_uu|}Zi)}C3N z{uIFxbhkhPD-%!RWX9cupOBC_OYB_n{QHP0SN2AkhsmQ&IG90_{R`GAH2ywnD-wZb zY#fter@cOdt(fXmdAJKlR%!>?WpH124e5*}&%DRGQ%{j}Wzna^>t*!s)r5i!GuGgQ zb@$;f=3AYe7=(V7qn2t=H{)A1l?yliT}Y|5nvIb>;FHAAb-}S$7pAX_XT6QNxNW0W z=ys|u>s7L{SDav@!4iM;%HE_vLS$-np{F$qGlbdhz>(hH<@dL6HO^YQ0f4fr1NrKg zm!t$&=hGE9JmJU_-`V4f*r`mbcDi9@1*0r-UpsRrWaa%MX}Hsh4FV=e&N9q=dtJO; zk9#bvThOGUEOE+H4^sD+%9;ty1Zs)#v1ky5CirFl`!j_PdhFay0a)hVM%Jk>(FIXY zr<+_;Do?l4K8P$VqbuN6u60L>0w&xFb$kYk6mk~RzE1bi_0JI_t4|6-`!}u2)y-;K zC8QU7%DGJR4gxxZztY;-A|kCklsm298G?ZeC_<{4%;P?+@xjzgSe`aNO=l~K+gQL!a@BIAYso&P04@>!CW&%uodcE ze{yR{lecIL7c)1&LaTi@ra5KdwQ6DPDU1c5l#!){^G%RTrqHPIkGg%st!#E)wY#~) zF*-)iq+Sj`geA>ToMRMP{b)gLTpHAQvB-C{~$; zlb$OlZ}Ww@hSNO+fRjloWcrtND#`18V&#ynf})tJff;1@SKs3$uAybYH+wRZ_T{*a zTW&P6I4hT@Z>_qUEc-f9pN~DV0K=sJ++LgnjXgV@R&s;nQY?5~yNe>f+V0j>R~8Av zj{TbgZti}r`m_=4D8Y+wgsI={TVrpn@@ai`V4b5c^yQ5jA&y!_gsrfO?gMel17lxM z6<`OVi?S|3^1QY%&3(y8PSY|eNJ9Dz;a=tF8ycB~TX8}Kh$2gay{20d-U&y?F{>Ne zg8{d<*QG^e=TiGX-=0mNH_<;>!r0G`8Pc!=N!CAh=q%ouka z?cgRjt1MX~f?(cO+mtoJ&63w?Kr3_J-S>r?J^P5-Y5Vxat%Jm@`;)h?misgv`8w2E z7?(|zc1HJm?Lj+#6BxX^A_iF8khl?3=21Tv@}&6P+SM4e^mS$I=i^sTsPsEChBK_J zY$|>pOHE-)WmWfOu?wlBWHu#{80dm3Mpmjyzfjw}jN8DjByd^=ADax1Rw%AnrQ`Ls z#D>k!dh{P;8_N$%YZr!jgzh;@@s1-u5`XuzhnH9(tAy7w{LYFb7ymFDcK;?*T6)Ls zN#Me#C~cF@8TX$j&+b-OTkUH%4;Do(VBP$K9N6V{g_$bbqs+cx#ODfGqP*M>-+gdj zdbf?H@HbOFwX;UV23EFu9WF|DpU0F3DX4lf;brCbSokxc<1zt_E^Tgd^m~{o9e%sd zoerAGbgOW>J$m-2Ne>zIn3cY@3v3UY7#E zd@||jJD8NF8mcmK1!tP^t7pE4i%ls@PLg~YBJosnS5hz;abkFP{=_ha`f@Sj7Im3r zoh6#FFMoVbMTH5XV6Z)KjtrbMp}=Zo3(eteYJ zQ=v7xy`M38MI|CA@G_e&&HpLwI>VY;+U>SuMMMNasVa&F=y}&CGgr z0r5M&9pb)Dw@Wn$Vv*xFNNBJ4Q`2V%YzaAesyA?&EcBpgY+LrL>n6_Zbu3;$^A;COGG{p61OV z+OvBf1IX^9cyqI%C3}>X5#^ZYmt*ncHe<{2=O&vSPdPO7O(n=Ivh6`#X5c*xv`|Xv z4F|L$oXCsyyZaHZZ;wU_8N}bO4S&aLGA*PPp!E57ga(}2c`2%pG`)g4Z?_>p9 zS}}=jopD0Y8;kcxMdLGDO*u%koP#F%KkoCyv%uQE$t$#itWt`HG0Qg9?eU}SyP7S9 z;#c-=@p4uGT#a8M(U5m}OIRZ15wjv#AiZ4aOSOlBX@>s{qvDj!tpkd@ys3XVWs|f- zjaR0y2h*x+M(O_SLvj)$GYG6ZtuT1A?Zmwf6!i$A4xw za86#;D*wc=9|!x$w?hv4m=%|f3SteTry4Qd{EuKA@wI_*uwr44A4u=WLDUeL8Dy-i z3rZfyJ5xVsm*r7JaT4qKJ!3TP1Xz-5DdP78Zj+I95A%UI$PP=J9b7iic!k;U3yXjA*VlnVEsn60o(C|3bXVK2m#P%2T5;i6g~dMb07Qj> z9q@nr_cv(r_niM$BxNBw2%%R3yvJZoXyX(dFJyD58a*`Ifg7+)-)Zq7{8MnP>A2xT znd4TwMk%swqzV`E@}3F@6L59*SbHrVMo)_cAJ^13xUa+Ou3Rfq%jZ1Ua%RSgmIqI}YDt88DG=8YO|-Aw$-0 z^D;h;CRqa|;L8Cons1*3v2f^oN=ztx2eu<;H#spn`q{D;+C6p2%+r*p!}FABksp@y zHml1^sjQ)uC#pL$_agb@02qb+a)23I4}-(^oMS>gM>|9)#c9kZyH^~-mdus?bE+v4 z@ow^;E+{ZGllZ$81z})FXMSQB#&~XrAN1`lYb_<>1Vk)annDyE6JoTqngaXf*ju zt!+#5eL#U$r2p^*M9O|67$b|l4!7($R{1Khy58-R$7Q7_pIP9$fz$H}Tyf?Dg^-u? zi`tzWAhbIV7$Vlg;0}pJjd9M`IlaC`b^X9Y*GzaEsvw8y&;Zoa-1+W57S4jrmg)Pv zyW69r4WUqWcoCxePX|-N4ZCj?*4?KLHR>lwfr~jr1inC0k+&~R$Csde50uEd2~bjPO2Hh*$b2BaR`iY|51$yPiC zZQV`ZZ)og?<+tee8&1EU4U9WD_n-ER>r(-yz1MC0-_rc{O);P#u(n3RDZJjpA|h*a z`I;XJSm;`KTG6d6oMeM6zVdqK`hWimS-ioO!qubq(7ynUU#dgb=$EF!-5u51sPCFP zLys&-J$Gy?9CsYfZqU5k_d_nk=RgEi7UC9%ea|D3F+Jg@sCae3_%t1ltQ#~h#$`JVnDdw_(TA(K!Jz&4M9JcYldd)RFU<2F z$v0*+SMi+uf9ap``hV%4e{|=@2=|=-&T{PclCICHi5}{m&Z;`=7IG+UH~FJ=a(OkM zdHm8TU1}(8u>K&akG+lX7O!`>g~7 zCD>CD@rdg6mHULiFcY6Kz3yBj87Cm#?jL~f4n#9fqa}Nm zTE}gMM)kukQIJ6|ZUQv6zM}(oAn9AK<_X*VQg?3IrM}J9KTqt};THhG!XyMsR*AG0 z@_6I4Uw>Vh{OQm)CzNZ&=*21d_cTUzpTL#=+8suU?|(AE<`l%Fvk7YPy$(+TDh zJaEsVjPu_8E+_IWsn&>geQ-}~<;A$AZ-Qk+9PyM9;>sE=G~uGx9mEMJA=!ua4_z&X zJP*^xrNbIf{V|$=6EYLpBX6LE@6(hjzhF1Y+TmAF{w~D94flOT_N7zYcjW}v^6LY- zZ<5SV#-rtW3xxvmkLxM!@5m9$3PHD86sn}kr4}8U@Ora(!LCQ|Nf%5z1*5XhlrlAc z!^XytrrXN8P0qWdmCnsw@23zL%BoGIP8%k;nB>$@A2&}=qmibDe0kjz0ac0{g3@(R zPQ2*m3G z>dw`&A*i?@qoSTVZAYJ!r5x&RKK29m8dzKIjM7HBq^q`fGUxzeLv8NBndc^21lDF6G!=ZEmFVmV&r=Ij#Pc@}QCaEz^bfhrVB=nwKS9 zOSzrgp{h0MVe~V`G}Y61$z+5;5{gi_jL=k!kxA@g?I|-F+9$ad?g>k_bl>5jQFRB}%m6$Z>f_ zakIACYAJFliEqUF8&*;(;_U~@cyuFZc7Ga>0a6!s=MU`|IktnMTQd79T2 z+s8MuVw^lLa7igpobTNr8A;W)?()ym^p)uG2^$|qYxE$?0WtD%(?HKV3!V9fl%_Wt zg`0X4DuQO3tDS2O74R2uA|=eTC{@x6IpxBbSj2;KzGIVRcliy2hhvXs8AcN- zJ-(xs`bQpC2XVv!T>D;@k~~y@c))?Zg{)LE>|Ivn*EiQCWAQ`>Pwh%z5U8+mF@1nF zmjH){=Gc8cHdj9f6L-a>YkFSwCACEP>d;@H<9r&LC>(jpjxcaiy}fo&Q?8zNJ-v8Y z;7_prWq0YI?CiQ_fx!tPu3R&#YXRnsI7nYJJ&nE)m^<3DLw1Y1a-FX)@)#G0 zq?x38mZcjA)F%!r#&t4Z)N9FG1i~!Om)T4ds5}jQTb9v`c^|3n@3s|}AsbE&ec7DV5T_8I;r6QLeJ zK0c`KS^LGTVDeT2vwA$L=xkG5f$liwc6sd9CW~5igthr+opGo0wuQ2Hwl7=Ohcy^$ zMmq@`w4&$T;*RRom)k|3lhg1C=43$|H)PyjQpDoN4Ne6Pxi~z$G+J)@*-370(19WFU ziI^*L^tSeX!mf`vRQFkB7dgW^tn7?g8gqb%%HAmEuierMcT$7fW9Ms}i%i3h^YC*5 zg3WuSwIp${Q#rw@+#hi$)~3yloHBG&@B71VBl)9f=jUYP7u=Pvbbc+*WB%^yqF$Yu zr*WE$mUHU$tZLdbRQ-VOh(~X<=9a>OhHXE}+q+5r%m_sE0Xbi0f!?)&*fz23rr=PS zQMZ#N^QNhS&gs!iszP-t)Z~CscC}W5E&%>!eZ0O7^%pZBNukzvR1-<=sjBxpDSKQJLvW zn$ojjgPJ2ka&gmzqi#vOslDaxsnP=?Z%chN9r53+_;dICqrTOAcKi|86JYT$V} zh;Dbo2&MCg+J!5dTj!0Cp#Jg7{Hj{kyHRh$WTVCwKcu`1g1A1Dvz+CAq{#Q%cwDjWbP z1zY34Kq<@@(s#)J4y!j%Ud8X2P4Vi`(^u=v$v=?fF9K`gpV)R_BZH;!U38rN3y5#* z3CvHFoK}Tl?Hcm@wH^9Hp~8?E-g5et+yw+swu7KYPw1w6r2NWX-}udRe8SPr{tH(9 zn`Z!!IPAn3a35eyw#XJi?HF z;K5DTLN6q$a(i#J-pZ2s;$E|abulprNie|#+b+dPS$fKj%(@r&FS`#?!-EGVu^( zPF;@fxK!%vY^75dIIGxC$xYT=F)2aEVMikPy!r_K+Z@hZTKXbdC)TpH2LGhUztzej zU(Pz^`;{DH^$T9%lbzV>Csigs&}LJFBa*`VEED=7KH+7dg%~Tz7U$(juCg1mfhcpr>zKlo485U3T+2THUf#r!w~@$rA08-}-cs~l*SE!Vv3yy+75OKdQULP>o2yqMLKSW z7P3cnTqxhl^4|FS^|9oTikX}410g0_*p=`HQI;VmIG1{Du#2BoPj21~owLI%bhORb zVCLj^_zd`tEizFsSX$tNl<1X(9puAMaQKVO=UQddIVwj8DyXXqBzK(b?)MH%x)9Rkb*CB@HEbrO zKD2;C4XQG_BLJhjgMb=sc3ym5Z5b#69f^KIoXkBVYVs$a^J*Dp-b5s;%a#zrKpyG& z%xuYD#{^X?UEOqKxKeA?BF1VKqxU&Q2Z36iIQy-qE-+et+CplxS06LQ*mS->(lIJP zts+hBjOP%Mf4j=@OLGk5)7aI|Nke?B{Pl;|ULHQ>Ved9W6P)o3`6P3e9#fZ#clRlNl-DRILSC z;IeGL94#z|ESQX6UMQ&7HkJKZ`OuE1eOj4iJJiqpaW0M2EZKciSO6N~^$gixK2=h& z#Qb<<(>ZidyfK;W$JI%0>LjZvhi9*|ByMRyg^F?q6&`z1K^wm{7?L_q8`Uzs;>7&b zY=y9jDq}cvsT5O5V}tlrboU$~R&&M+OTXYc!8zf55b8g{Zr)ySdhgr5YUaTc+j%M{ zuBkwpJ})*GB4&4#-JbMfCBK70V|l$(#obnhD@u)ZceQg^p?g@f_Qa@cv3CSR6m=@! zCf(NHre%d2vR?YoY2*QLQA4C zv$c*9+cjQ%s>ixr+oIuhW!`p=Y^dvt^gzd(jIL1s_zSf9C&Oo(?cXh>Z+7L@mgYE~ z`^g-tF`h9@^BtM(W`W{lFK(N7pC%CCepm?V&$^y9e|ni5fR{rRrM`o>x!|@sCu3MP zmYe@BpG?Y@m*si%4WYDdOSyDG>uB_E}JLJXKF|Sy% z+F_kMuFId-@zu;E+V<*OPp7U}bX()#2eqC0%Vn zlafdYLP4Dx+BnwaP$c4!tHG6-;xxTv)CV8MgTNcerXA~J+=EU{J=%(@ww_pRc< z308>7xcpc>XmO~PpaBx5z3(;Vdc74BYFrA8Nb90#z%7n{rly+3*r z-0bZTmFv_9QkFV=R-7ONGLYv4*3&-K|ZcH+enu(g|M)_+jKrV`?}I2H2tt#VAv z5Q3JPCH1ANXlUkTHGWK{0rBN%;j3c;;)gh8N+`w7(aHRgKjpM5kVh;Vw4yP)pt$XD zEv|NU%2=Z^O;3rGE}56M2ycFponIU_-kv10IVdoCprzkAMK&kpyLGZkR-6X#9BEZ@ z2wC^nsjaD>U8Y&*Bu6u33eF%^wlp@z55H0o##2gIp-^B&AbYJ5^7zqD_43l;eU&y_ z5BkogJbR91-^%{BUU_tmrMhm)-9dPqqiuhr=%D5H50_k)d)t!D(4ncVY?PVD!Hdfe zgt~p?U*$4a${n_+er7=GBa7h%>m=O z@{NAy4}p=z(wCj<>S0eRH0YAd!o@hX<3a+01YA?oFkzvnP+#%7)4uK?C`l{!OXi|@;z(Gt`S~WsLsUHg7~BqkQmI@6rDECh zcI&Yt`J;TTkG=KNi)eY3+54A|$Bns|-vhyKIOmx|i?U-Dm0h$s;1(DOB~coI|xOBoU4B=4rFzo^)@VOZv1d z+8}qf1hL1ThLC+Ip@AP;E`#8u8hRhr7LD;v5~dZRoF4E8KNk&utQ;NQ65neiNGx|NJNMa3g@kt@YDTOm-n7h1BT-;7 z*-*N=kk~@>qn+npd~KJ1IcwtEo(J3+S&0wd}9 zC}48(p%lD{q}=415~+2yX=oRm;jM_gs+?T{RXWHtod)o?mv-~G7??2p*cZHC8no`E z(Jk4D7^?&+Nu57))V5W{m|L%O>9U9Gfz%AA c%R{T19MjdMrq5p(0Z*aJN}7sUmu@}!9}BwoQ~&?~ From 9f44ee6ad56ad041906e865be6177b1f57d66fe7 Mon Sep 17 00:00:00 2001 From: e0003801 Date: Wed, 26 Oct 2016 16:55:39 +0800 Subject: [PATCH 41/55] Update Diagrams --- docs/diagrams/Diagrams.pptx | Bin 72343 -> 73660 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/diagrams/Diagrams.pptx b/docs/diagrams/Diagrams.pptx index 84b0128ce687a12a50093b86e7c7dcaf35a78e98..a7703f08a8f1da6a5dcc9da3022e647b23bc1d67 100644 GIT binary patch delta 19870 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 delta 18038 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 Date: Wed, 26 Oct 2016 16:56:57 +0800 Subject: [PATCH 42/55] Update Architecture.png and LogicClassDiagram.png From fb06eacf18ec768c0ef27caeaf275925243a1ab3 Mon Sep 17 00:00:00 2001 From: e0003801 Date: Wed, 26 Oct 2016 16:58:31 +0800 Subject: [PATCH 43/55] Update LogicClassDiagram.png --- docs/images/LogicClassDiagram.png | Bin 28003 -> 42394 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/images/LogicClassDiagram.png b/docs/images/LogicClassDiagram.png index aadbac7e0f3fee8302d54861c678e459e69fb038..6c71318ac3a99526e7b2e008a8d207f9f1baa850 100644 GIT binary patch literal 42394 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 H==J{quuu=g literal 28003 zcmeFZcT`hb+b>PJo^9B0HRkdT6h2GrNPCBj~naz*xj$ZU$ID?Arj%%Hqw6q+Z z^&Fh3i<*sFn{dzhdU1+{f#Mj z{R!niSopvvfp4B2hT zR_hAC=hBB>BFufZ5-MI9cFt=sho4G_1+24LwGuIybBjvp3C4S^<-qZ4W6VXnOvh%odljv4*iUf`>3i$lJpIQP*sDc|F7#5vGeQFw2n?`-)j@Ezox z^H?+7?ugoz;~Cs&+rT~sbzcqy2!ma=(MK}onAAcC^Pw>9cW}@^(6cL3RE(CWv`3E;{V6S9@s1O&r5LG4S z0m4~cqUl-Mh|1~_zG#6mpGDjXf1^0CJ;b(1gjnSe1`G8J6+x`t0T2)J?04kitGCCX zq=Fo?1!mxb8_AW9Pg}nniyUS#Etzkk0v`dt1D3X1|D6PElJuJhY8vf@ud~N3=J#sK zW#Y%Drz@8EK^FezKDZhy)qT9-1h6x}O>^Yko19DzG9%4((;W`rDQ?;psD)}eGHEV6 zb~SKgBIXtr90Wezc?aA;5Mh`7W&nK5E5AYfssaaEYJ?kI*r|!L8as%iI9oAQ=s-`q z8Cx`SqSxvyCbR^AXFtWLyIv(H4itYjA+4&8Q07X_#QL?`InXK?uea!3MBH`= zD1V<$WnHY(TC;FoNE~a>J>xTTP#ZFdkz7Qo%CNPM|)ADY1P`e zS;cH*GA14tB@)|FLiW$TMjJ~8S@fDWb~1GMBGx7))vK&jw>;3{gIChXC9iECV`Dkw zU}b~l{J?5j>wL}9a|;|P5{y&@x5zuj_^I*XET?v#y7qIxXLF4Vq7Ck19lnDk%CAeH zJ=0kZ_v$x5t*PDSQOEdM_`nrr7&L-(bs-qM1@*^Pjs={!2do7 zvSf&Qrq78)2*xj8qM!sIc6WGMq5S8>csKzDVi^w)b(hS(zSjNlQ0FAVL`pcDLovKt zbanUk^FxfyCHSHPA-wgu0x-0N2fLaK1uC308csLDI<2`M+yY1O>h*zq6 z>VOr;J`Rr;J-$BN!5@_#>@rWTQEdnd4mu=p1oGycKn3h*(AGz{By=jYNJB3ScYb>{ zR{uv5H(DG@n!I2%(or(8V4B}vU~<+8c8BRKLuzKMMCRk(T+~m;V07tBa(vz_9nr(? z*ohjx;SAQxZn0 zbPGHWR}9LYpuHjIRH;v=xzKgO{5Kwb(t^DhqNsL7QQ}ou;@jsc*jP1&p4ez}pdF(M z<3yVB*tbp`rc11a4WR4D^R$+p%F^%96Ro{5P*l9UA!YgxK}0NH_ugBfhF8?uN+p(| z)jeG3FUI_Zf4ZcNp}MU4mV+EVzf%7*5YeUuB|YzYclRw^8fj;wPUDv3-WF&!*c8=! zQA`Kfomcyy%vZBXk8(hbU?|L|s?`>JE1S+YD_pR@IRvg*~ zW!<``y+X^1?PxP_+hWnE)+to>CtfCpwxb?O*G{uqSsC%I_IyemaN{@D3FruRJSSx7 zjTO<)Fibu3*$`_p?Qb7)wKh`-!3KYkvWhJADOHO#jx-297bq8<6Ce4}=LFVxv?dxx zeHjti70S>Ws9g_DP4PZ}){-ktLkT9=q-!SyiWO}H9Tr?}|`Y&&1NFp7yw4^+r z#Suahx;f)|Z4B|1Vl3(^HkOBO+g2I&Ev0z_>d11l81J&iQMNnW8R+)x{I3g1<)4M^ zESJ;KKBEG@5pMBoL^5H)*k>b^e|IjGJdpw|h9N95Iyd+Lws~R*_4YtFny=rY1n^a!(-}iDd`u4Z>nhVBa)8yeIALGxyRzR5KP#J0e~%Ksy|<$K zLE8b{vP&m*g%NH3$0oRg>-=(r5XF<&rHksLsgAwNvN`F$cP&^6eL%_GhI8Q}*pzq{bD;s-TF@jFkr8UXH?WWQSJaqPoFC@L`*!`^wS`R+2zgx=VWnr{I%K zu(B3-ySw(asPSgAoH@Q0(V*j>R$x_0I#S$nMCkTHy?}#E4u@XI9~OxA6}@=@E3$SM zIbGT#wLi9~IrTnUn1)%|fcj{1N}Y-L6-nKXMhiCpznSoCM3}w8^iFl8rrNi#L$xTv zySpksETS}89hr2B=Fi5cZBy;0<<%%38N*~U<4 zHQ=Z-3f-(S%~Q~B3!ywnYK)-(yMAZlK#pv|iTB3}LymuxKzzwoExOb#nH$4j-H9%= zDe3X?i*EDR9&?bnavSTU`$5Nu1I<*cImFgAZk1n$-?zx0-`f%wSSmn=+tp&h1A4Gb z9#2D;cZJ6#rHd+2ZX&Rz;4|efKu2)u97JM|6-Q+(l1XAEO|rUCC8vvRmf*tFxoWizQvA33d~5M-C~m}gkPqV*SMD~ z*waycSY;T1**%vt2D&AB8Y2F*xnq!I%@W_A*;A0+(wtk?9!wM$b8kw+kfBu?XFbx= z#WtTO!h(=d=>s2Mx{Nfv?sPG>NDNBqJ9r8ib^DavJTWVEpgW?7d@(cnLWwv+jM;X+ z=%YuxntL3%5%AcdCy-*99;!J8ie=Y}gd&+|;OS#6y&OPr@%wr2OVc2fgtOv`LL(Hc zQ~HWCnNVZpX3ACVZ&T-s46$uTMz72y|Kg44cc_$_@v1DM_N-XyEh(#5^(CWgG84;2QgBmkOsG z)6#VwUE5WycIm)n4joeFTC>5u2$Yp?%xMF|viuS&Y~d-Mi&!2bbIm7LEe@+)*CNFr z<5C6XWUOL64vSlcl^E(;mj~KXoLR2R9xY-gDP7$KAPs`ygr$?O5K19|gp zIsz?u-!X>qPLYrW$&TSy^LSI)=caBHz+ub&y8+KTc{$x3-H8z%t z&#FDGHjgQJJ5YQuZ>mj)CfD00xq_dUA*_RxQIVCw{DdA7vZqLhOB%lNO~(7x=O8f3 zdA@qSUmk$Y^vGPRvPS$B!^)A8_nhbfAE>OwZ$C}D=ua^oZ;$+Gy{IvCW2#|${d=1h zEu4JMUBZq#dljDYV5$b(*srBMX!jYF6jX$2s4Fix;7SIH`SSYPLajXGg%Gz7X#!A* z?9=Me>)}90Dwf^Fam=z+&CRm*>Y`U%Rx~Ihl$RnsJr#6|dcmJkp#liUMc;ZsTQDUU zDx}9^I_uD(4=9QSLFVSS*mF$34yPwQYNJgWH^^$)V@FD5)wM5E?}<6^_0N?105*Ih zk3ACNL|>yIPn8AUdP-9i<5Q0Hi87SC(VJEq&iv|)Tt&)&ov0fbnlqhtE{7$4`e|gN zrZ|wD#C)}HkW3udQoVcFpJ7i^#RX$&W~MC_CS}3;tnp$q+v&I|=&mPPQDGx!9PahuqHweMBqGPUhx{AR-C2GuW*E-gPl zBXNy7>%e*D>lYdP>gQouHzqb7r|C{bWbfe6gcKv@!C1Q}Hd`5zP6r|#PnCM<%fwR; zCGVcE+uu)*fa}?t`i}-B!Clresm&p-8Dhb!j4QgP|JJhAy~8jBW~{pL=HZ0?Oqsonzw|M&X)bK8`BDDXg?G%<6Y_jFi>cgq6N-ntj=f^xOouMAb@JE39(n z1KfU@n@Wx{Een@F(M?v97MJ!WOeE0K@ZnImT?}~GkUm^V{tjCaK{Pk| z8|zxz*FF-mH@12daf(Ov5R*ec!y=s*CXn9()2OovD_<3<{RE8nJZ5zQilMDF%sNiw zKxyuj2_$XG{`T{M2?^SY-{`TGMdFA$L|MY0D~=UQ-HZ z2hkpT$+f(^ANF^5*0!DY&?rD9+{YMvz5lVytn}FC6yWyQf3+0gzkD84W>NR;^qwtB z4S>J8mC%2Q9{6m|*5Y~D-eP+{ePgx0`w80OVOHkOhu>ZIe*T zs6KyCaW#paZobnxIktW1hS@gyZ^`#7>#1?3f{1-A0&(XLPTD|Ds!DaMD{#oM@cH>% zJ@Ip)Fm|S3AOFM~Uw(U!t=a)eHV^9u3JJ*rHw9lhZ@r&~+EOjpZ7vN|K>lSZOf%E_ z3)uBd&)uIi!P2*dgm8Jk+zKv7FXaHae)R`NokZ?;CMb~DLu3jY?8$>-F&w}L81C)w zvFy5#8{xJEv7SpIoZumSnEyYV2=^5z<#^3jX(CtJztpVNDY(w&S7ez%<(8-3b=!_D zua%=en-?|qvwiNKII$Nyq&SU~e?ddB6FqyVWyk)?s`#>%T-)-ausdHYQ+Yqq%0HxX zqgOFzD~J(JbP^|WGPe-7+|PNY<(Vk+Cy50~$iCyTlLGuKxO5g=yhou>(+e2)WJ2)^ z`J2KhaY9lkoKNJ8%RK6s64rQWpNz1oQEvV~zxR;#TF+AJm(YN^kQW5Va_vSb5Xj~F znU>Vz46e=$siFbGZHwpq{UpRH4Z23lU;gS6p&0s`;jY(a8|90;R4mJRCsoje+Nmy8 zI8a$WyD)Y;9VtikZH@_iwRf#jEesUesdKLh=I4MaA1Gduf6F6QTt=lz-|)a~_^Wew z0>KnIMJ@aORK?)iwZfT_wr~SdmXX4eiwCMpah5}b`%#p`^|G>TE$^_KQ?l%8zG=Cu z*HB(}1X8j}1`N-Le%z1Dv|9V(s0&qLUB=j?l?H=p( zsvneO-8nO@$J&mbALT+{hJV$u!`fJK5_y4|=lPIZLuyy9U`04fu4WrFN1C8-ei09_ z(D#H{-<`EL&VCJ@0UzCKuME4-Dfh6uD+@qwB!i@=-;eQ~j3FguZ|mj(s3r4iCj z*5%xCl@p%K^&;JKInORDTH);iq%AwDc$~`f(mfsb=QyVkl-h5tE&Fti`{jtjNag(< zQEWOPpzJr;K*RzQ>g^F|lY{-`#Kz_Td`)kM)Om@1R@|$K5>t*YO>5Z*4)ki&^0>Og zbzwcR4wM8U$G(e&iT%nB21a-Trj1(kk@iwE&u|w*+vV3NbD)!SwMiC&h-!w_>Oq%f_y9zD%v}N72HcA(c z8VhK$?^qncOQ}t<6jqHMh;!=ab!Tc_TQ+Nv4_&TUXuLKPYrCA=WFd*6xURv%e1>7Q zF~th_NsVGHF(agVm=HAGs4q`@&F;*Uy{X_1E83)_sZHEOeiHHy^7 zimeex@Qo9%ejmz7hO(wLoiHEY@6FbTQl=b}NJ#8plhs|e?|s>PT7o0V+oH|vUs6*?R_$`J^}T9kS;NJ3%hzCQB2TqQTnc{T0ilsLqKJiPWoqXK zWWbKxB}I#k;39?O)kJ9XQd%%U3>w2Vn3{Z{=i)hD7NW6NcX(pT}^Sso`THDg)dkgzYk%)7QgK0Q=- z4P$rs{08uleQ!)6gLQF70@%&OX2&m7Jty<1XarIlx@JG93x=pl-Ap)n<*}P6}ks<^^tkwV|3Ka_~ z3~v@Xp3dS5b6IuN$sU;ZkGWuN5c}tmvVzfh=?S%F5z!mLSos#i+89o>E8K`0+zP{F zs20B+yhXmD!~y3f;l4^n%bhr9xC`hm{q+7va;{pY1YF~Qw#MM~)7KLBUFt;5onMPI z`P|5@!7MbL5GoT06g|N+k1Dn=gjOq)F-N)c~FF$k21p52{TzG0GI_Wz|WIZ6d06X`w!)OBzja znYGLFOsIA?Zm@?T74~yE&+*T^{44C35XvwPNzDnvM-fZHJKhvl#YU{?+`oXjbsyWb zR2m1vj8_hDZnO4E8fYLV-fvx3T+jjYF|o@p)jq=LbD(RucX`f#>UJtRr&26TF&h z)DDp-^X7A3Vw^i%3vVTweQ4|#LJ!;t*k#~+m^QH^=Yw8>$^`C@FAR_@dyww9V zT09Qt3FUUryhT3;ItlC1-}i3$R^HY3M`^KUvkJ3aC_v~#n70uf_z|FihajGO)xp`G zG%%))cCldkI65C4BjWGW-UpjmTtl-O22ShAw%0HVX}+G&6SKdLqWVR1mAV96=uvdB z`9_5o96VJ9-4c7*RON;iJp#Nq8f!$d_nKy3WqCNb@?}sqIKG19gt>o3BXa6aX~eef z9ZvlpX@7<{x)kcvHC4spt+lajnwA*`;X~x8Z<41L`(HO{dCN9V1j)7Zp=Fypqw3Dl zE<{2`;JO|?m#Q<-8RVIop)hxw zgnt=R*f?qc?k?T(fyWgqGR{JjvXwxZO?=QB+B2h;)_@^xuXMKSy zZvI9?Q*{(#YUD)UX$)e_)HlMoYJl@x)$xha;!D^HdtyY&v^x{XraJ|g-Jls)E&&)| zs#jq{9p>*x4BOM>qm^316V3mG@V-G`bdf+%dNb!y_Fu(q>wr^nUngly$?KR_6B`vjANE}=muWFNMEPYHr(|PNv`N~;o`FlexYZ49QLqbHY zI9Ag&wkSkYst2cmeYa0k#p2MghdMqk7)VD>cbn}5v!(jsYx`A|x9K=di7^Lw4W2Rc z7=K|Y-Uv57P`^umS(fSzZ^(B%1WB^R;SeCgnCCg-2+@KoAd0)ax2~-Zxiz zF+lMJo&bv}Tp5psW2eU3?L%CQjH`r*~uhSDizc;FVj+ zGC*UlLWzzEyCc>~C@>u*?lCJTb|sIw~>s-j>S(Y zOsIag{+gK5yCuAdaFFy+;?~EC&KlT@CXT7UA5Y$5<^H{ksVsc40d=s9MiMD73M-~1 z&JK}bw}pgz!mIcT7MepSH8F6F80(cx5k#Ph_=k+OrVytpN&GOaOJYUxoEIx$?iQ@s zSfn<|N1C^>J!gndBmtfDO^?;IiKj&fk)!fGj$s`TK#87QqpRMbI~9Dgg?6JCkj#`- z>F2yME>{hB;(L?`85k1-Dxo}dT)!gpGLyqhJ&!i2$m?7OYFPpiG@-VV$$>7BwiQQA z{aCdGxxOl7*`@h;orC+p`;M}vf(f>(+UW*bqyT()))gT0agNvLl%uUBxLAoIavZv@ zleQ`|j@2a|;)w_pU}D#9i2kEm*tXY=^bJFOENVM8>isQbvc$`H2q=P9oa!%@#n^C8 zW$9yMrOC=1auae{q6kNB4!IlmY`L!}c-8}H1GvO_qQY!(8lQ~o1+E=0`b*$B-poXC zA;e{5mZw7FwPs(eE0e=uy*j&9k~_DU`i@E6$3B+)L#Nj`nnyf1*Z_*zxH-{MN9Qy^ zbQF-?0s5}p(F{Fp%uGlxvm3?2g5!j$CM4Ji)3+`M=;#UG4ueBAXx*Put?eVYOUByI zRQQaRcQ~(EW7}Bm1C?>lfN0*E_9iXO#}d}WW2t@k)fb=6Wj|hTW`}tOQrxB^#fygM z)8Wr{9J8r=bfTYMzSX4g+YAqef~IA`r;T~vUNHF3c)i=lr}JKxA)8Z>Mz}bN^AQj9 zBiAz%54V%hzPxhJQ)MWEKI`?C%Gmp5K2T4@Q_oH=@dIT#q#oR-wX{r!GFy2iBDm#o zyaXKw-ZF6D59d~Fl;R9QCyX-L89ePVEos)U-zj{%ApJ)V#c5+5n16 z)lVrk{W%%el5~E&#_t6>ac4Bdyeo-gE+yiOmYAFG;D0-EG4VC=i!A~{#-n<0S1{^Cet+fTpUx2Gr%MZQhfZ_&*v3_utn5!y(Zmd*MydjvhcHj7 zKXoyNUe+0Yes4G2r(Wy(>je~t_xy`CdnTH3*P&_7?K|ojLo4eL4T-6*+Iz`Q$r8Ve zqiC*;gi)Ph*UlKf^lCDD!Zw7d0@npfFkI>^d>d9iDd>2go#&G4pX(tJSQOjvHDpfd z$5)_tyL8;LQS0=92Lc7e8(Io8goXt5I)PALHb%?Umf+6ZFv=QZM!(`P}4u=NzYPR+HAa-8ZVoE$P0rzS?D@rY8h2xKJ%aTN{QQ0V^P7UVKQ6ti zL)sn1h>sXrQX>qQO%GT&bS@b+btr><0>)x?IUL^3#C|)9pLr*LfznU^clXGO#_s(r zS%+HP)HoPw}$R) zmV52X%cC>+)iL;Gq+2nsm}1Rig|8I2xqi--wFd;*W(kB2>7*;=g9a#w_rKI^ol~W^ zi0^E>HC5+71ey?HO9UuiBjpT*GUswdy@Iu@ZBoKYY@_tARdHLtNKmA;i9lh8=VXToU+c=szT|$A}~xBmzZy-M_)qO0|(3 z1G>*EVt~F#cUS*L$F}u=b%WYUrShwk_?-nTB5{2cOxWqzsC4aA;h}7*~sapp3lcplLa~UsX%v*+%rJ0Bj=VbU0fR=7r=VZd@j0m zz9ol?H=dhTe;QdH3>(Xd2LztFs&xXR02LiGBAreNFn*@Xd*&q=Ida6x(xV_ow7%{N zKqG&yei(K1q~MRT%-{FPXXK;;75}2s=cIf$=I4KBTU~0%kEHSM4j|h{ZnTTz-+iaA z{#&5sMJ@t*p8vs38r%e;ErL}Y$qrw6oIws)xdSlR9L$i`74DGvqu+pV{d*vzMhA$c z+5eZ5-r0Ra3CJ&(Z-MnMh5~5Jf*Bse)V3%|y#zg572Qc576IWpjk50R026>5=D7w$ zKj5ToEHE_u-}LKsKlLw!gCoX(gSS%n<>1fP@7N1UfSWOd3q(~h?0^i`A#ryB_AwxV zxmr-W=uRl&)d-m7Gn~-Y$F?Uy2>_GVK#%UC0RYyj|0)v(I{r8O8fc1vX!I|X(Z`>Y zLfbq+=!1t$&X_6n-}OVs)*9Vz}w zb3KqagWQSX4Q_Hgv0{H;qMMs6=I^46elE(c|NGY0@Lx##OJ+dEtQGkL$GUCe>w!rb zBq3^{skCP$+RPihZ~J-TdMT0~ATIwv95r?aEWll(GM&!Qz{v#mm z@cbs7u!!7G>@nUoi6Ff(-m)8@E9p?vmP^DB@?x&n{+?Lo}-hPB*V z^M*Y?PLb6R+~3$O19t;p9#u&=pWh=XyL9%FATH^*>=!=@_UV1U7x3(7J9-{#ya!qL z+wqG}fjkf(w-_jq2+X8gmvL^n&O~pFgJ}qZT;&HorAMgG_p17B?YS+owFAhQ*4-SP zb$)wZ59B<-e0v<4_+X(c;DIDC4zXT+l3j!!O}@EZ5Fs)|Jez1P_*%Z?$c><%;7@2- z>#x7tbqS6qn0|UEn~*w?(>Ql^TIpZ*QJ)=e>7ADp(;~T_XuSsn(|3b&c3wXUo|gLQ z+|T1meWc!|OduxhjZaT_aG-IVnzquXIX>|j@5xjCVeEZn7=R10DF~-j=X1EEvLp2D z_$PVv%5ntb^vN8Z6MY2Pi$55)WopL1WmX#z!|u)Mx~#Seke=Z9&FORg@Mq zp2*sgF#`|K`X`|x(}6UW3=|n>Fe}k0`T0-ztW=rv1*@>5;lDE#)fsFDO#!@hbXXWT zbLzff26PQ4bH@Q^o_3#nR>2LS?)n4N^>6HP+vqf|M>-=f5=&ZOEhB8;y_QH>dxIBV zhw+Zr{auEQTh4Y+YAX_2sAC4-U+>!u$up$m5u*;^W}Xi6P14=1Wv%O3v>|%1R?qFiz8lxn{FzNHmo+0uE{_iCJYU_}bf(LU!vjwlG$z5VV z59Gmx!R3?Sqv{Ii%V9t){3g#Ah_#%nISvBjF27J&$d=y5$h){<#Og_7vnUAc&egko z+kY+trj1FCXPWH6wnyH@n=b!A&6e*Ecv-UE{Ww1z1%4cVQtLWziTK|@5^U+zjOV%h z&FHp$+9Jzg;Qu!v172!ZS7M&b55_YBBnIb!BQtm3b~$STsyBV+Yh5J3HOrd81E9Kq zH`FfbFKd%I(U!}%%sU7ZZW-K0PNtS0G;b5Aw#Xkr`QyLf3d8LzOK z9}5iYm7`l&))(L4SGPc{`@Nv9ALkChaEl7Aora|~0l*%c9ILMw5TQekrXClo?w%;T zZBf=jNan5RHQsu|d;`4FweG>52~*Mnf77m)okWNH-PKQiw8Eb>>KB6wurI%b320?& z<5C)o|9laC0=a^XRh)M~js`osB`Yo$+OA2^7MjY@C#1Szu!X5sJ{m6u-c2=(J)`*c z_Mi;GWT{fIilU1|FFspyS}(QJ%>WV^j$E#vJLI(TRHeU^JON8NZt%*28+*V(R^JHg zU_u#~-mAq@+gLk5;4!eT8pxepwCs?Jhr)63IhY=}Rk_OXria=G%(1c_#5Ag%t3*&P z4eRS!DQ=}rdQLNPm3U|;Mtm$y>oHsz{lbX7>4C|X>OTT%j#{jxrPD|76e_ls43tC< zjm(RP>I2g&F0&EkEm7Nho!GBNZcFA!9FQlg8JfA1VpW{oay&CDa6VCZ4}^Y`%^>yL z0_qOKBI#~?+k zwc8BZ1#$wjcrVeb&1TMPZ{CX_iYHdPkJ|4RL(Fz07?Z{wuG^_dGPO!LXr$Ceyk)f^ z_&|#)y5Tmc8lbh?nF-H?<*u}2R2jvAb@%g09~W+|V6C&{+sIksTMC=uM3=G0`Y>l- z!Zo8yq_VCT`arX1)mpn1VOO2h-V6X^j$>jm>eAWh+Wf=;3L*2Y^GHm@>KXpT+yTy` zQPcT%{alzFZgm_EtPoVp9DCrkcEEIKJ=OuB_CYQ%>H-V^o`#kONTep16fBk4c{6J& zFsHzJ0$doN${|Wk$XX>gnx_`C6V2L09a}9Lz52HCg0l&Yg2WT&>ShrgbH;m z{Ne*`EE;Gpsz_bQwDYPht|BMf&1zk30uy3}mY%ol=x*%nF3^yysGfJGF7EiJ(Lft; zG;oNk!}PoHYTg8ksltGdM#V881XRu}(Y=cGn1%jGUC~=($1rh*==+%J838-sgwkPj3@eIlS4k6U* zs223E;lHTK)TR^T_WETyot}5ttB>TM1{&%t0)Q(%80sq@DEwmVq`@v=$y$OfR*%gjL1h$yah}FR86Gv7a&7~qzm_Cz||$9xUayvq;W}4UkJ09#^SMA zo`(WZBXH74t|AdmvbMh)29t>B_}Z0yK%xK5s)$?efWD&A88y48*uuPAekr+Uc?{3W zK*{rQG3>n`B_?uK*P;*Ro-()`H7h=3NN9T70X4KdVsp1m`2-WHcG-ZWs&*PsLsM!d zhg^l=sJmXiPw6q62UHJ`=AVBB9O_3paG=SoTy0I@8N-vDeD7T<4{2fdSYc4Fr=WMsmV7#b?x8zqPm^ zrs+|k&xyt;Vya8NXK(ICh=Gg~f?6sMpFy@+5K767z|?~?Fu`x%J6i)(9LPBfXH9O0 zo1#eu)Y>L?6B^N*;6U>>)uv7=#vx~G{TJ?-SuzoQCvA*Jn`zF0#-sS@B?nr6KYKU1 zL58wyh_tEju4*}o`O`2Sb*9W5TI%W8TS0wG6^rSX!FbVvr|@n8&n-)vff#(PyA!{f z>$N!E{S7lEAOFP;<8jjXdgcp?9g^U{FB)Ljtp7G?;LhR@@*dENY0~kSN7>Npp+Dl% zD$l{(Z?!KLfPUWnR_vD*Y|poQLE6g=S*Sa4!ZrpDn3;|cOx5xS9x41NcujA@l@cw3EXRo^N64NZePPE@Z{VH-r3O~V z9#?*h*_9vp{U8|m+S~4mqs-*6CwP;Vf+z8?AITpJlZ&(gD6tCbbc6&J@jjSukAC%@AB&hbI=?kjjt?1fJwuX6c?&Ta*30fVw)2UO-DH#mX$3pd7)$)y?TPyIFatFl`^(GS;x zq2PkpU(K;|E3Tjt-p&q)EKGGUB!g*lJ(Ro!;tmH#9DqHk`HQpovm>6 zRp7Wz4CY785Y9n)l#HTIV#L?pj4gX4$kRqV7N+Eass6+Yac<#?oS@SmK={Wb(@(Q} z1Y-gR>W|*@n%;sF9INe+Lowi`xix8|>%s{l^7_Z|ltN$O9sBQqg=^QZAd>vJF7F;~z;l^tzqQa%1PMIE4Sh z(R{~)yQ`SjhkV8KPSp#7X-q*BIA;KvX?SsNz2wV#8Q?Hwwv;y#^H3ZJGdG`kDD0@y zdYhtxLIDoivG#fPBXU84A2UDLHVq}30BK@@_J@6-!mU^X6+y@$g>$FDJ_%T*kA3Bz zP%+m@Yu-b9GQ$d2bXxwRIoV6Na+CE=^0QN5@=44GYoiaAhU*Wm*Zu8n?Y&9<)chkh z?uPh6V*6zvw&c0<4D{Vd%+z^+(Dx@)M!>ozs6S_B!xj~tRh|yD9`2HkIr@u$UKcPU z-AHMFSKl&eEMcuvvu~;TD&^6L`imN_M&@9Tl4{%svW?M& zfNbDK?6qHnGpgy3-3bSy!Da;55;8yX>m-bF_(l>1_5xY7ZTKlau;oNAwr`|KI{FuX z7(Js+JZ-r2iy@4T)J7uJ1$4TUx&?33^@846fjrTC{_#g!T2wr{n46N8GLI#sNU$D!@z`3%F_tY5x+B`Rm$ zSA|jgL~Ps(c0Hf~3E;KWqsq+xq^n}H!!OQwc+;LJ&MZ&gK0&V-z69Q6)9_yLuJa9s z4Q|vivcF7~i#PF6-KtP$GSc01Vmro**%_GeHy`4ck;(h}c{m@*A(!X9*c~WgIsP)>qYN#^q(_ZlPY`V$Y@xtMp z5Xxz&tL#>JELc$dQ2u-w9&wzr_9X-7e(CcCYL5gFxx}6jZWa06rl5&lOZ-r-VRpxA zZ>M%33+^5A-kW_+;q-2L8wf{qBl+6#6xxqhN^kEpk8-)LQbl;?5?9suWnV`Ft7-l* z?62k(-C8sE4S!!W3srN&driKdO*4ZpZaowZl(K_mGrKTttRV9KI#FWZ*)-EC&+jw9 zT=TQi(Z%3{-ZkR7;9H^khrjI-S|H8=6EK^BWU8B6e2oH+cimg?5$C`!zc6RkXbs^4 zn+CtGB>w2+tt%~OfpXNm3}!?=pZF$w8>lIa`qUT4%zr)E_R;G2(X=}kT{dv? zzA#w7VIXnQ;a=dff*j(;6nI&|HvRdp?ucUu3*dd${fu4x@QZER4)bK*22^Ohai|2= zWY;+>WlpYt_%MX6{a3yGU?Mn^umJN@zTTDhX^&%Z(%Lm_zwdm4V9cMf8 zdt7IBl)kZYD;sF$(-bPirith&^GO1mt!5mePs{D(1mh`2n9&o`aFjpC3foJNEG^4fP?7DaWf|4BK{_ZWCHZ87tb&-A4ewS5}Q?_ zgwrvl8VVM`RmU6OIx8=Si6E+g&FK@(_Z#+XQkF0k1*6;n3R})SVr>th*5wR*k0#ad z_8le(^@2p1FiYSn8xX);`>SZlpED=)d_RmBhAdW~!mlUtYy-I1aaTTF`F-vKpUitPV-@ufYmnfJg2s_3Qh&`OJH>KxS{y)i{K96RZCUIVLI5XtLi7h zU-fthpnL*ZOviL(3O`oKP6bK!JG=+h3mEkQrq_}}HyM=8eejkB^K3VY-wPOuAj9h9 zM_$C5kpwb1H4JjIwP-7j-kKu9hWX|<>DS6~S~=y+sCv8UW0so?PfP*K{n*FU7UezW z=6L9Hs{3|zYXL9c6X3@sT?M_;<{tpXf;r!c=PSY1y)BPQr`#?W%t9f47p3%ow+jAf z&Tlf<5@ldU*o|?ep@FNMbJbzXyFn>!@M_>c;8uyNnb+_fFdwm|vIK0yFXJM#5{cQp zZx?dg!q3Lo2B_jov2i$;_YE6XuzTOm?&I`x({scPh5|Vf2K(|)I4Eb3u(qsixb^qP zlc98=rMH-dH|c+mzM}RlP+rhpWphRzK6#M3V-mdO&qyUVX{T}WdZ!MU*QltA^zs5~ zDg}gE7W;E21?_pbe$8rZlH~-DibsK|FLm1raPwjc7_~?8(kiO&Eg5Hkv6w&ocF13) z01T;+`M;c~@>~Max+a0rG+Hnj;QmVkDwD|_ma)6N2)ZwA|TT&4?)(PY?6 zK_Jk;&Ic|u0R7_t#k;smeCJN?1`PdI-)}Q-0Q6(tq4e*f2c6KKUhsa_h&^~e>(L$d zCAza1kFZT|8EygIuFbW%|j#z@f(T$?_X# zLgW|So2GnlCv#=l44klG_LD|tV^^OC`$#{d|89fY0eK+cA<4UJ9nH*!OBS?9BQ`Kn zA6XK!81e5<-&+{@xZqIximS%TdR+CC#b>uwY21@ z5cBw%Bs~Z875~Xq4 zNo12wf`LlnBn)Y1u@IC{cB{E=;!Lh&#EM_VLFjat%W)^lp7F0mudVHxx_RAf45Efp z9b!erP$Gz2wvM%6;b0TxyLX@QvG8>lf${s_SLTxT7qU6+!uy&mW~07*|Ak9?jq!9; z7(pey4WXjGttC>Lx;Qc2W03n)q2|LV#$+}7K{JJ2N`6~AA%bS)=c6)29}WGh3bRY5 zl|*zirS}M5FMH6T)yh>Qgn1>Z=z}rQsZ4Hs5J3o1&z{Z&-pWT9jKB>WMm6fjq{+0@ zSXLX`16Sm2cF~LS!hcipi@scF)o+bsE5ApfESrKqeJv=^Bi_9UyjQTa89tTMN1}dw z;3KU~<&WTZ>VKDRX0N6yoiDS_B z1p{|dVYzxqBl1~6skCCz!qK$pn_neLk8_|U*YC4zatgpw%!Om##i|+SI+umr|WVY&LIG@;bPVPdRY3#9p1nboF1%>fSWWCnaFWt25^O zY;l$Ke&dpOV1~ahK%c=oHrm>XH+SDTOytEtIW2 zx^K_F1Q4*UXUI?;`A;Gm28YL4LY*Hi7o37sy#;sp%j|Ve26^eWlxb9!%~Si3FFR{# zcbD<4Hs)jGnEpmgplXy8;Y^@30*1}1EPs0pj1Zr%U!nS|HW2G45TQD1Rwg+n8maTQ zgP2-_v|1u`!&-Dw_c6E zbYj8H$;2v@wzEht(n3?Hi-bwHCSAFuTTi8pyugql!h;Cn`t;%T7Vf5C21LF?3CqpI zG8A%f+HxrdWrLwodUsWzdc*!>!g0ZS)`op;87UX$HRFN2PbKB{dp36#o0-vgJPIU~ z0Eng!L^Ebo|GuR(Ee=@%yb)`4EebC~>ZZ+LHCM%|Mkabtii?WGP_Z;Ndf>92^Zr#s z{g>x4Gqt0%K-zd9a?xx?(yWzIzU@E#0#3?6u2ujiWX0?PqC_y$TCZ~d^=!XVCHjkg z{t~WTbOmbE1njnpKpya~>6$E`oDe(T^$NiC(jEDa!Efe_4O!R817szjUcq=_0|WQ( z^8HFj4k%wV{SG`X1H29RM}*Q0Rvp)qzIS))S$S2JFEam%MUve%Bx?KE+!BGuzgL5C z2jkw_pWuY`kJ@JPVF_p8ao!C%jB3yFq`r!c@+- z-y@LMr_U>IAZ>kGpUxO5PA2x)kN^KRyi=AGfjo7;({QmLc;$8%mxaCJOnQYrw*L~) z9(Rbol|Hf9nXOySeX;G`YyFb0lczU`fiXpOTxAxJN?vx--TrBPQ4s|Ae({n)b>4~! z&v$=x{tjM+Y2@Nj{x>2b3GOi_uSFuEsF8?qe72u@Rd4YCCs2lwsy8>g?(@vR1qdPS zfs3|4j$s;kd*G)OHZrzJIN(*)TETY*+`LTbr;e{aP$l4Im-<4?@%p<}U?T$<1Juth z0p?pN;yYR@-vbk;pdPG8iJ%r$7X!v0rxS02^WmByopqHNBvX*C73QYlE(N>w;4 z(&Adc4lRoafsz2NIw>L~6iJXOOTi+wfE5uLaX6MOgDiqCNfB{CAc%?)V-i+b!V(fp z0%V!*CCEX~{4syezwf-<-22_{z2tu1Z@Jx8z+fVM@&7EZyc>3_rJnSaX#2O#4+Xzx z`tA8~?jnvSD`OpdK10A7TvLlGRN$&d72d-E%XH**JVTMYSmGhC3WaB zes4cbhH}@7!YvfBbXx`IU(l(6d|g1cYqCASFR?Ly-Y(AZk&tuoP-D}TFKb0xOn=(w z6gw&rw2*UeFCrXIZd7-VyKA18rAd|h4PI21)jC{8z@9wT$_~MQ65br-RAT2NXc!$k z9>PC-1SHTyWI8FgUtD+QI+17L+y~U%=)g&WVB6%@c@O3gosHpS4;B5qk8ZF~q$>cK zQ=F;@f%yjbfy6Rnx~kodGPjMkmNRm#-)90=Ej?(EC*B^#uYK7J2P9(p2!lfRF6VP* z?O4@#W;ef6As%S93P{n$tH?;#I6caqV)Eo^#2fno+Wo^kc0cbk(urAYhaKfsehWSd zlR|7LikkuO=OoGc*_dWHJ>hu5WKDli8mMNYn}4)q=X`s~b(iDch_dDv+cAHvBXGha z2mi*G@`9ijd0JciM7ODk{m>i%_9NO+MwJLa7VfbHG<{AF{5Kr9``Wk5H?*e!&$5d# z90})2aWKftzuHm1Vf`sVOl6`}ctB|e4A3U1qy_rv&@X9MXqazzY}UerkJI;Z8^QT2 z^MfaC#Jt1tZSAuLvL}oylU|iOzh1Y#{0BJMf|x)ct)^_W)d`ctgeI>Mp?U!|o{N1! z#9|~`@pnGm%+pS-a0%C~lx|ib#t|ZJaHC^Wv>Ea~KVT(hB!kuhEvFbbUGb-T50MYD zB34YZN@mJf?@@p5=<)>i5-IsAs?*JLA@I3`-7b2j6(G8I2N=>Lmcpls({NBRCV zEXI9Gp+j1=^Xi^6V^1Kaz;HNI*r9g=#MjV=XG85jT1L6J43&*#@pW9aV@+?)Nor%8 zx4KZhU)BC4(f1rs(4%F`F#%Y$h`T^@KvQ=2NzX<}#j~L?RZG?HwaosMoK3^bnj&2i zV71|_*GC(?dPTyaYlnPeAR(PKd#5x;uK#M0Y9Uf@&yS zOs`fba~v&;>oDRkUx7J67yV!u3MFLiXOBJ z>r4x#T|_{_k5zuK$jFU6Z7gNT74>b>Df4WXW!YMK119w7A`t{glsafT+p zc;HjKqFkr8+LPepPIwOynfFm4ylqJ8L8TyZknq*Sn!u-brfSm0SEsdW(9KJsw0FXE zr}{p|^HtqS>b-js=g!ESP9|?t)yGylwKy}3!J5<)DCYObubmG~krE#kRT6wa@x83{ zUKW$$O7YEII$J0WqnJ#Xf#Ft4CF>2}UnRPWpJ2*^R((jDOHOp&j*hH_EMqXHno)1) z^An(Tv}!&?ky@v&7fhb*A!j(=!9kMe$5MxV3UP6n}%xSjRoMkWgh!^NF2A{0Ss0i1noNK_(=qE-e7JGKVw*MhNfR+ zu1oryvkYLs^V!$zSFPQ*V_*wG2LvjnOK>f>5NDP|AtW&(1xA_UU{G-b2jUjm#ji9) z?57y&K1P=6v6_fX;CbqDoyc*nHEb7nU0eWYoCd$&lbP&4*bQRY8)TL-Se%4K8+hzn z5^{%Bm+{_+HfG4Cz?*G97T_gRS@vZq1Ks&|hC-6_h8Qw8#q)EYa#;Q+ap zhP`}eZu>!r5RG<$AYPThiv2UuJ0kyD;+s=F>p{p62iU-cJ#nD$#E))~36T&%#*N-( z!qd|3x>H*Bl&Sk0+_IJE_b0oZF)C|os|?n>Ra?yv4pmVxj{0)^x!+km=ZrE{P%{>G zf@RBsoy+b@#WVEP1->t?b0cFJ7W`j>QLn5Q$H9b06P802y~I9_2(E4aK(YM8X)vNm zkd+`uP>Yw%(^4OP-FFVw-EpRb(pkV$lc~b{%)6EeXUo8UHoCLUx$sa0^ zxzblVSjYc$8zqoW0f!tHxSV7t1{a>1+uN+476*x{6ltt#9o8QFO?Y2mDUh^0$+PMX%xJ(4!#@a%sLl^?MUPkJl;5 z{+Eqi6 Date: Wed, 26 Oct 2016 17:00:04 +0800 Subject: [PATCH 44/55] Deleted --- docs/images/LogicClassDiagram.png | Bin 42394 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 docs/images/LogicClassDiagram.png diff --git a/docs/images/LogicClassDiagram.png b/docs/images/LogicClassDiagram.png deleted file mode 100644 index 6c71318ac3a99526e7b2e008a8d207f9f1baa850..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42394 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 H==J{quuu=g From e83270f7a1594a3c08786cdbf79652667c4dc486 Mon Sep 17 00:00:00 2001 From: e0003801 Date: Wed, 26 Oct 2016 17:00:34 +0800 Subject: [PATCH 45/55] Add LogicClassDiagram Previous commit did not go through for some weird reason --- docs/images/LogicClassDiagram.png | Bin 0 -> 42394 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/images/LogicClassDiagram.png diff --git a/docs/images/LogicClassDiagram.png b/docs/images/LogicClassDiagram.png new file mode 100644 index 0000000000000000000000000000000000000000..6c71318ac3a99526e7b2e008a8d207f9f1baa850 GIT binary patch literal 42394 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 H==J{quuu=g literal 0 HcmV?d00001 From e760248025068665f471bb8d962d7b868b4cc8e0 Mon Sep 17 00:00:00 2001 From: qhng Date: Wed, 26 Oct 2016 17:08:55 +0800 Subject: [PATCH 46/55] Collate codes --- collated/main/A0139915W.md | 1430 +++++++++++++++++ collated/test/A0139915W.md | 660 ++++++++ .../ui/TaskPanelSelectionChangedEvent.java | 5 +- .../commons/util/SmartDefaultDates.java | 11 +- .../savvytasker/commons/util/StringUtil.java | 6 +- .../logic/commands/AddCommand.java | 3 +- .../logic/commands/DeleteCommand.java | 4 +- .../logic/commands/ListCommand.java | 4 +- .../java/seedu/savvytasker/model/Model.java | 2 + .../seedu/savvytasker/model/ModelManager.java | 15 +- .../model/ReadOnlySavvyTasker.java | 4 + .../seedu/savvytasker/model/SavvyTasker.java | 20 +- .../savvytasker/model/task/TaskList.java | 2 + src/test/java/guitests/AddCommandTest.java | 2 + .../guihandles/TaskListPanelHandle.java | 2 + .../testutil/SavvyTaskerBuilder.java | 2 + .../savvytasker/testutil/TaskBuilder.java | 4 +- .../seedu/savvytasker/testutil/TestUtil.java | 16 +- .../testutil/TypicalTestTasks.java | 4 +- 19 files changed, 2168 insertions(+), 28 deletions(-) create mode 100644 collated/main/A0139915W.md create mode 100644 collated/test/A0139915W.md diff --git a/collated/main/A0139915W.md b/collated/main/A0139915W.md new file mode 100644 index 000000000000..773f4c1a3a22 --- /dev/null +++ b/collated/main/A0139915W.md @@ -0,0 +1,1430 @@ +# A0139915W +###### \java\seedu\savvytasker\commons\events\ui\TaskPanelSelectionChangedEvent.java +``` java + +/** + * Represents a selection change in the Task List Panel + */ +public class TaskPanelSelectionChangedEvent extends BaseEvent { + + + private final ReadOnlyTask newSelection; + + public TaskPanelSelectionChangedEvent(ReadOnlyTask newSelection){ + this.newSelection = newSelection; + } + + @Override + public String toString() { + return this.getClass().getSimpleName(); + } + + public ReadOnlyTask getNewSelection() { + return newSelection; + } +} +``` +###### \java\seedu\savvytasker\commons\util\SmartDefaultDates.java +``` java +/** + * Helper functions for handling dates. + * @author A0139915W + */ + +public class SmartDefaultDates { + + private Date startDateTime; + private Date endDateTime; + private final Calendar calendar; + private final Calendar today; + + /** + * + * @param startDateTime Starting date time + * @param endDateTime Ending date time + * @throws InvalidDateException If endDateTime is earlier than startDateTime + */ + public SmartDefaultDates(InferredDate startDateTime, InferredDate endDateTime) { + calendar = Calendar.getInstance(); + today = Calendar.getInstance(); + today.setTime(new Date()); + if (startDateTime == null && endDateTime == null) { + // dates not being supplied, nothing to parse + } else if (startDateTime == null && endDateTime != null) { + // apply smart default for endDateTime only + parseEnd(endDateTime); + } else if (startDateTime != null && endDateTime == null) { + // apply smart default for startDateTime only + parseStart(startDateTime); + } else { + parseStartAndEnd(startDateTime, endDateTime); + } + } + + /** + * Gets the smart default for end date + * @param today the time now + * @param endDateTime the end time to parse + * @return + */ + public Date getEnd(InferredDate endDateTime) { + if (endDateTime == null) return null; + calendar.setTime(endDateTime.getInferredDateTime()); + if (endDateTime.isDateInferred()) { + // date not supplied + // defaults to today + calendar.set(Calendar.DATE, today.get(Calendar.DATE)); + calendar.set(Calendar.MONTH, today.get(Calendar.MONTH)); + calendar.set(Calendar.YEAR, today.get(Calendar.YEAR)); + } else if (endDateTime.isTimeInferred()) { + // time not supplied + // defaults to 2359 + calendar.set(Calendar.HOUR_OF_DAY, 23); + calendar.set(Calendar.MINUTE, 59); + calendar.set(Calendar.SECOND, 59); + } + return calendar.getTime(); + } + + /** + * Sets the starting and ending date/time based on defaults for providing only + * the end time + * @param endDateTime end time supplied + */ + private void parseEnd(InferredDate endDateTime) { + assert endDateTime.getInferredDateTime() != null; + Date start = new Date(); + this.endDateTime = getEnd(endDateTime); + + // Since only end date is supplied, the task is considered to start at 12am today + calendar.setTime(start); + calendar.set(Calendar.HOUR_OF_DAY, 0); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.SECOND, 0); + this.startDateTime = calendar.getTime(); + } + + + /** + * Gets the smart default for start date + * @param today the time now + * @param startDateTime the start time to parse + * @return + */ + public Date getStart(InferredDate startDateTime) { + if (startDateTime == null) return null; + calendar.setTime(startDateTime.getInferredDateTime()); + if (startDateTime.isDateInferred()) { + // date not supplied + // defaults to today + calendar.set(Calendar.DATE, today.get(Calendar.DATE)); + calendar.set(Calendar.MONTH, today.get(Calendar.MONTH)); + calendar.set(Calendar.YEAR, today.get(Calendar.YEAR)); + } else if (startDateTime.isTimeInferred()) { + // time not supplied + // defaults to 0000 + calendar.set(Calendar.HOUR_OF_DAY, 0); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.SECOND, 0); + } + return calendar.getTime(); + } + + + /** + * Sets the starting and ending date/time based on defaults for providing only + * the start time + * @param startDateTime start time supplied + */ + private void parseStart(InferredDate startDateTime) { + assert startDateTime.getInferredDateTime() != null; + Date end = (Date)startDateTime.getInferredDateTime().clone(); + this.startDateTime = getStart(startDateTime); + + // Since only the start time is supplied, the task is considered to end today 2359 on the same day as start. + calendar.setTime(end); + calendar.set(Calendar.HOUR_OF_DAY, 23); + calendar.set(Calendar.MINUTE, 59); + calendar.set(Calendar.SECOND, 59); + this.endDateTime = calendar.getTime(); + } + + /** + * Sets the starting and ending date/time based on defaults for providing both + * start and end times + * @param startDateTime start time supplied + */ + private void parseStartAndEnd(InferredDate startDateTime, InferredDate endDateTime) { + assert endDateTime.getInferredDateTime() != null; + assert startDateTime.getInferredDateTime() != null; + Date start = getStart(startDateTime); + Date end = getEnd(endDateTime); + this.startDateTime = start; + this.endDateTime = end; + if (this.startDateTime.compareTo(this.endDateTime) > 0) { + calendar.setTime(this.endDateTime); + calendar.add(Calendar.DATE, 7); + this.endDateTime = calendar.getTime(); + } + } + + public Date getStartDate() { + return startDateTime; + } + + public Date getEndDate() { + return endDateTime; + } +} +``` +###### \java\seedu\savvytasker\commons\util\SmartDefaultDates.java +``` java + +``` +###### \java\seedu\savvytasker\commons\util\StringUtil.java +``` java + // reused original implementation of 'containsIgnoreCase' to find exact matches + public static boolean containsExactIgnoreCase(String source, String query) { + List strings = Arrays.asList(source); + return strings.stream().filter(s -> s.equalsIgnoreCase(query)).count() > 0; + } + + // reused original implementation of 'containsIgnoreCase' to find partial matches + public static boolean containsPartialIgnoreCase(String source, String query) { + if (source == null) return false; + String[] split = source.toLowerCase().split("\\s+"); + List strings = Arrays.asList(split); + return strings.stream().filter(s -> s.contains(query.toLowerCase())).count() > 0; + } +``` +###### \java\seedu\savvytasker\commons\util\StringUtil.java +``` java + + public static boolean containsIgnoreCase(String source, String query) { + String[] split = source.toLowerCase().split("\\s+"); + List strings = Arrays.asList(split); + return strings.stream().filter(s -> s.equals(query.toLowerCase())).count() > 0; + } + + /** + * Returns a detailed message of the t, including the stack trace. + */ + public static String getDetails(Throwable t){ + assert t != null; + StringWriter sw = new StringWriter(); + t.printStackTrace(new PrintWriter(sw)); + return t.getMessage() + "\n" + sw.toString(); + } + + /** + * Returns true if s represents an unsigned integer e.g. 1, 2, 3, ...
+ * Will return false for null, empty string, "-1", "0", "+1", and " 2 " (untrimmed) "3 0" (contains whitespace). + * @param s Should be trimmed. + */ + public static boolean isUnsignedInteger(String s){ + return s != null && s.matches("^0*[1-9]\\d*$"); + } +} +``` +###### \java\seedu\savvytasker\logic\commands\AddCommand.java +``` java + /** + * Creates an add command. + */ + public AddCommand(String taskName, InferredDate startDateTime, InferredDate endDateTime, + String location, PriorityLevel priority, RecurrenceType recurringType, + Integer numberOfRecurrence, String category, String description) { + this.taskName = taskName; + this.startDateTime = startDateTime; + this.endDateTime = endDateTime; + this.location = location; + this.priority = priority; + this.recurringType = recurringType; + this.numberOfRecurrence = numberOfRecurrence; + this.category = category; + this.description = description; + } + + private void createTask() { + final boolean isArchived = false; // all tasks are first added as active tasks + final int taskId = 0; // taskId to be assigned by ModelManager, leave as 0 + + SmartDefaultDates sdd = new SmartDefaultDates(startDateTime, endDateTime); + this.toAdd = new Task(taskId, taskName, sdd.getStartDate(), sdd.getEndDate(), + location, priority, recurringType, numberOfRecurrence, + category, description, isArchived); + } + + @Override + public CommandResult execute() { + assert model != null; + createTask(); + + try { + model.addTask(toAdd); + return new CommandResult(String.format(MESSAGE_SUCCESS, toAdd)); + } catch (DuplicateTaskException e) { + return new CommandResult(MESSAGE_DUPLICATE_TASK); + } catch (InvalidDateException ex) { + return new CommandResult(MESSAGE_INVALID_START_END); + } + + } +``` +###### \java\seedu\savvytasker\logic\commands\AddCommand.java +``` java + + /** + * Checks if a command can perform undo operations + * @return true if the command supports undo, false otherwise + */ + @Override + public boolean canUndo() { + return true; + } + + /** + * Redo the add command + * @return true if the operation completed successfully, false otherwise + */ + @Override + public boolean redo() { + execute(); + return false; + } + + /** + * Undo the add command + * @return true if the operation completed successfully, false otherwise + */ + @Override + public boolean undo() { + + UnmodifiableObservableList lastShownList = model.getFilteredTaskListTask(); + + for (int i = 0; i < lastShownList.size(); i++) { + if (lastShownList.get(i) == toAdd){ + ReadOnlyTask taskToDelete = lastShownList.get(i); + try { + model.deleteTask(taskToDelete); + } catch (TaskNotFoundException e) { + e.printStackTrace(); + } + } + } + return false; + } + + /** + * Check if command is an undo command + * @return true if the command is an undo operation, false otherwise + */ + @Override + public boolean isUndo() { + return false; + } + + /** + * Check if command is a redo command + * @return true if the command is a redo operation, false otherwise + */ + @Override + public boolean isRedo(){ + return false; + } +} +``` +###### \java\seedu\savvytasker\logic\commands\DeleteCommand.java +``` java + public DeleteCommand(int[] targetIndices) { + this.targetIndices = targetIndices; + } + + @Override + public CommandResult execute() { + + UnmodifiableObservableList lastShownList = model.getFilteredTaskList(); + + LinkedList tasksToDelete = new LinkedList(); + for(int targetIndex : this.targetIndices) { + if (lastShownList.size() < targetIndex || targetIndex <= 0) { + indicateAttemptToExecuteIncorrectCommand(); + return new CommandResult(Messages.MESSAGE_INVALID_TASK_DISPLAYED_INDEX); + } + tasksToDelete.add(lastShownList.get(targetIndex - 1)); + } + + original = new SavvyTasker(model.getSavvyTasker()); + + StringBuilder resultSb = new StringBuilder(); + try { + for(ReadOnlyTask taskToDelete : tasksToDelete) { + model.deleteTask(taskToDelete); + //tasksToUndo.add((Task)taskToDelete); + resultSb.append(String.format(MESSAGE_DELETE_TASK_SUCCESS, taskToDelete)); + } + } catch (TaskNotFoundException pnfe) { + assert false : "The target task cannot be missing"; + } + + return new CommandResult(resultSb.toString()); + } +``` +###### \java\seedu\savvytasker\logic\commands\DeleteCommand.java +``` java + + /** + * Checks if a command can perform undo operations + * @return true if the command supports undo, false otherwise + */ + @Override + public boolean canUndo() { + return true; + } + + /** + * Redo the delete command + * @return true if the operation completed successfully, false otherwise + */ + @Override + public boolean redo() { + execute(); + + /* + * METHOD 2 + UnmodifiableObservableList lastShownList = model.getFilteredTaskListTask(); + + for(Task toUndo : tasksToUndo){ + for (int i = 0; i < lastShownList.size(); i++) { + if (lastShownList.get(i) == toUndo){ + ReadOnlyTask taskToDelete = lastShownList.get(i); + try { + model.deleteTask(taskToDelete); + } catch (TaskNotFoundException e) { + e.printStackTrace(); + } + } + } + } + */ + return true; + } + + /** + * Undo the delete command + * @return true if the operation completed successfully, false otherwise + */ + @Override + public boolean undo() { + + assert model != null; + model.resetData(original); + + /* + * METHOD 2 + assert model != null; + + for(Task deleted : tasksToUndo) + try { + model.addTask(deleted); + } catch (DuplicateTaskException e) { + e.printStackTrace(); + } + */ + return true; + } + + /** + * Check if command is an undo command + * @return true if the command is an undo operation, false otherwise + */ + @Override + public boolean isUndo() { + return false; + } + + /** + * Check if command is a redo command + * @return true if the command is a redo operation, false otherwise + */ + @Override + public boolean isRedo(){ + return false; + } +} +``` +###### \java\seedu\savvytasker\logic\commands\ListCommand.java +``` java + /** + * Creates the List command to list the specified tasks + * @author A0139915W + * @param commandModel Arguments for the List command, must not be null + */ + public ListCommand(ListType listType) { + this.listType = listType; + } + + @Override + public CommandResult execute() { + ListType _listType = listType; + if (listType == null) { + // use default, sort by due date + _listType = ListType.DueDate; + } + switch (_listType) + { + case DueDate: + model.updateFilteredListToShowActiveSortedByDueDate(); + break; + case PriorityLevel: + model.updateFilteredListToShowActiveSortedByPriorityLevel(); + break; + case Archived: + model.updateFilteredListToShowArchived(); + break; + default: + assert false; // should not reach here + } + return new CommandResult(getMessageForTaskListShownSummary(model.getFilteredTaskList().size())); + } +``` +###### \java\seedu\savvytasker\logic\commands\ListCommand.java +``` java + + /** + * Checks if a command can perform undo operations + * @return true if the command supports undo, false otherwise + */ + @Override + public boolean canUndo() { + return false; + } + + /** + * Redo the list command + * @return true if the operation completed successfully, false otherwise + */ + @Override + public boolean redo() { + // nothing required to be done + return false; + } + + + /** + * Undo the list command + * @return true if the operation completed successfully, false otherwise + */ + @Override + public boolean undo() { + // nothing required to be done + return false; + } + + /** + * Check if command is an undo command + * @return true if the command is an undo operation, false otherwise + */ + @Override + public boolean isUndo() { + return false; + } + + /** + * Check if command is a redo command + * @return true if the command is a redo operation, false otherwise + */ + @Override + public boolean isRedo(){ + return false; + } +} + +``` +###### \java\seedu\savvytasker\model\Model.java +``` java + /** Deletes the given Task. */ + void deleteTask(ReadOnlyTask target) throws TaskNotFoundException; + + /** Modifies the given Task. */ + void modifyTask(ReadOnlyTask target, Task replacement) throws TaskNotFoundException, InvalidDateException; + + /** Adds the given Task. + * @throws {@link DuplicateTaskException} if a duplicate is found + * */ + void addTask(Task task) throws DuplicateTaskException, InvalidDateException; + + /** Returns the filtered task list as an {@code UnmodifiableObservableList} */ + UnmodifiableObservableList getFilteredTaskList(); + + /** Returns the filtered task list as an {@code UnmodifiableObservableList} */ + UnmodifiableObservableList getFilteredTaskListTask(); + + /** Updates the filter of the filtered task list to show all active tasks sorted by due date */ + void updateFilteredListToShowActiveSortedByDueDate(); + + /** Updates the filter of the filtered task list to show all active tasks sorted by priority level */ + void updateFilteredListToShowActiveSortedByPriorityLevel(); + + /** Updates the filter of the filtered task list to show all active tasks */ + void updateFilteredListToShowActive(); + + /** Updates the filter of the filtered task list to show all archived tasks */ + void updateFilteredListToShowArchived(); + + /** Updates the filter of the filtered task list to filter by the given keywords*/ + void updateFilteredTaskList(FindType findType, String[] keywords); +``` +###### \java\seedu\savvytasker\model\Model.java +``` java + + /** Adds the given AliasSymbol */ + void addAliasSymbol(AliasSymbol symbol) throws DuplicateSymbolKeywordException; + + /** Removes an the given AliasSymbol. */ + void removeAliasSymbol(AliasSymbol symbol) throws SymbolKeywordNotFoundException; +} +``` +###### \java\seedu\savvytasker\model\ModelManager.java +``` java + private final SavvyTasker savvyTasker; + private final FilteredList filteredTasks; + private final SortedList sortedAndFilteredTasks; +``` +###### \java\seedu\savvytasker\model\ModelManager.java +``` java + +``` +###### \java\seedu\savvytasker\model\ModelManager.java +``` java + /** + * Initializes a ModelManager with the given SavvyTasker + * and its variables should not be null + */ + public ModelManager(SavvyTasker src) { + super(); + assert src != null; + + logger.fine("Initializing with savvy tasker: " + src); + + savvyTasker = new SavvyTasker(src); + filteredTasks = new FilteredList<>(savvyTasker.getTasks()); + sortedAndFilteredTasks = new SortedList<>(filteredTasks, new TaskSortedByDefault()); + updateFilteredListToShowActive(); // shows only active tasks on start + } + + public ModelManager() { + this(new SavvyTasker()); + } + + public ModelManager(ReadOnlySavvyTasker initialData) { + savvyTasker = new SavvyTasker(initialData); + filteredTasks = new FilteredList<>(savvyTasker.getTasks()); + sortedAndFilteredTasks = new SortedList<>(filteredTasks, new TaskSortedByDefault()); + updateFilteredListToShowActive(); // shows only active tasks on start + } + + @Override + public void resetData(ReadOnlySavvyTasker newData) { + savvyTasker.resetData(newData); + indicateSavvyTaskerChanged(); + } + + @Override + public ReadOnlySavvyTasker getSavvyTasker() { + return savvyTasker; + } + + /** Raises an event to indicate the model has changed */ + private void indicateSavvyTaskerChanged() { + raise(new SavvyTaskerChangedEvent(savvyTasker)); + } +``` +###### \java\seedu\savvytasker\model\ModelManager.java +``` java + + private void indicateAliasSymbolAdded(AliasSymbol symbol) { + raise(new AliasSymbolChangedEvent(symbol, AliasSymbolChangedEvent.Action.Added)); + } + + private void indicateAliasSymbolRemoved(AliasSymbol symbol) { + raise(new AliasSymbolChangedEvent(symbol, AliasSymbolChangedEvent.Action.Removed)); + } + + +``` +###### \java\seedu\savvytasker\model\ModelManager.java +``` java + @Override + public synchronized void deleteTask(ReadOnlyTask target) throws TaskNotFoundException { + savvyTasker.removeTask(target); + indicateSavvyTaskerChanged(); + } + + @Override + public void modifyTask(ReadOnlyTask target, Task replacement) throws TaskNotFoundException, InvalidDateException { + savvyTasker.replaceTask(target, replacement); + indicateSavvyTaskerChanged(); + } + + @Override + public synchronized void addTask(Task t) throws DuplicateTaskException, InvalidDateException { + t.setId(savvyTasker.getNextTaskId()); + savvyTasker.addTask(t); + updateFilteredListToShowActive(); + indicateSavvyTaskerChanged(); + } +``` +###### \java\seedu\savvytasker\model\ModelManager.java +``` java + + @Override + public synchronized void addAliasSymbol(AliasSymbol symbol) throws DuplicateSymbolKeywordException { + savvyTasker.addAliasSymbol(symbol); + indicateSavvyTaskerChanged(); + indicateAliasSymbolAdded(symbol); + } + + @Override + public synchronized void removeAliasSymbol(AliasSymbol symbol) throws SymbolKeywordNotFoundException { + savvyTasker.removeAliasSymbol(symbol); + indicateSavvyTaskerChanged(); + indicateAliasSymbolRemoved(symbol); + } + + //=========== Filtered/Sorted Task List Accessors =============================================================== + +``` +###### \java\seedu\savvytasker\model\ModelManager.java +``` java + @Override + public UnmodifiableObservableList getFilteredTaskList() { + return new UnmodifiableObservableList(sortedAndFilteredTasks); + } + + @Override + public UnmodifiableObservableList getFilteredTaskListTask() { + return new UnmodifiableObservableList(sortedAndFilteredTasks); + } + + @Override + public void updateFilteredListToShowActiveSortedByDueDate() { + updateFilteredListToShowActive(new TaskSortedByDueDate()); + } + + @Override + public void updateFilteredListToShowActiveSortedByPriorityLevel() { + updateFilteredListToShowActive(new TaskSortedByPriorityLevel()); + } + + @Override + public void updateFilteredListToShowActive() { + updateFilteredTaskList(new PredicateExpression(new TaskIsActiveQualifier())); + } + private void updateFilteredListToShowActive(Comparator comparator) { + updateFilteredTaskList( + new PredicateExpression(new TaskIsActiveQualifier()), + comparator); + } + + @Override + public void updateFilteredListToShowArchived() { + updateFilteredTaskList(new PredicateExpression(new TaskIsArchivedQualifier())); + } + + @Override + public void updateFilteredTaskList(FindType findType, String[] keywords) { + assert findType != null; + Qualifier qualifier = null; + switch (findType) + { + case Partial: + qualifier = new TaskNamePartialMatchQualifier(keywords); + break; + case Full: + qualifier = new TaskNameFullMatchQualifier(keywords); + break; + case Exact: + qualifier = new TaskNameExactMatchQualifier(keywords); + break; + case Category: + qualifier = new CategoryPartialMatchQualifier(keywords); + break; + default: + assert false; // should never get here. + } + updateFilteredTaskList(new PredicateExpression(qualifier)); + } + + private void updateFilteredTaskList(Expression expression) { + updateFilteredTaskList(expression, new TaskSortedByDefault()); + } + + private void updateFilteredTaskList(Expression expression, Comparator comparator) { + filteredTasks.setPredicate(expression::satisfies); + sortedAndFilteredTasks.setComparator(comparator); + } +``` +###### \java\seedu\savvytasker\model\ModelManager.java +``` java + + //========== Inner classes/interfaces used for filtering ================================================== + + interface Expression { + boolean satisfies(ReadOnlyTask task); + String toString(); + } + + private class PredicateExpression implements Expression { + + private final Qualifier qualifier; + + PredicateExpression(Qualifier qualifier) { + this.qualifier = qualifier; + } + + @Override + public boolean satisfies(ReadOnlyTask task) { + return qualifier.run(task); + } + + @Override + public String toString() { + return qualifier.toString(); + } + } + + interface Qualifier { + boolean run(ReadOnlyTask task); + String toString(); + + /** + * Helper method to build Set from String[] + * @param keywords list of keywords + */ + default Set createSet(String[] keywords) { + HashSet _keywords = new HashSet(); + for (String keyword : keywords) { + _keywords.add(keyword); + } + return _keywords; + } + } + +``` +###### \java\seedu\savvytasker\model\ModelManager.java +``` java + /** + * Qualifier matching a partial word from the set of keywords + * @author A0139915W + */ + private class CategoryPartialMatchQualifier implements Qualifier { + private Set keyWordsToMatch; + + CategoryPartialMatchQualifier(String[] keyWordsToMatch) { + this.keyWordsToMatch = createSet(keyWordsToMatch); + } + + @Override + public boolean run(ReadOnlyTask task) { + return keyWordsToMatch.stream() + .filter(keyword -> StringUtil.containsPartialIgnoreCase(task.getCategory(), keyword)) + .findAny() + .isPresent(); + } + + @Override + public String toString() { + return "category(PartialMatch)=" + String.join(", ", keyWordsToMatch); + } + } + + /** + * Qualifier matching a partial word from the set of keywords + * @author A0139915W + */ + private class TaskNamePartialMatchQualifier implements Qualifier { + private Set keyWordsToMatch; + + TaskNamePartialMatchQualifier(String[] keyWordsToMatch) { + this.keyWordsToMatch = createSet(keyWordsToMatch); + } + + @Override + public boolean run(ReadOnlyTask task) { + return keyWordsToMatch.stream() + .filter(keyword -> StringUtil.containsPartialIgnoreCase(task.getTaskName(), keyword)) + .findAny() + .isPresent(); + } + + @Override + public String toString() { + return "taskName(PartialMatch)=" + String.join(", ", keyWordsToMatch); + } + } + + /** + * Qualifier matching a full word from the set of keywords + * @author A0139915W + */ + private class TaskNameFullMatchQualifier implements Qualifier { + private Set keyWordsToMatch; + + TaskNameFullMatchQualifier(String[] keyWordsToMatch) { + this.keyWordsToMatch = createSet(keyWordsToMatch); + } + + @Override + public boolean run(ReadOnlyTask task) { + return keyWordsToMatch.stream() + .filter(keyword -> StringUtil.containsIgnoreCase(task.getTaskName(), keyword)) + .findAny() + .isPresent(); + } + + @Override + public String toString() { + return "taskName(FullMatch)=" + String.join(", ", keyWordsToMatch); + } + } + + /** + * Qualifier matching a exactly from the set of keywords + * @author A0139915W + */ + private class TaskNameExactMatchQualifier implements Qualifier { + private Set keyWordsToMatch; + + TaskNameExactMatchQualifier(String[] keyWordsToMatch) { + this.keyWordsToMatch = new HashSet(); + this.keyWordsToMatch.add(buildSingleString(keyWordsToMatch)); + } + + /** + * Builds a single string to be matched exactly against the task name. + * @param keyWordsToMatch list of keywords to match. + * @return A single string built from the list of keywords. + */ + private String buildSingleString(String[] keyWordsToMatch) { + StringBuilder sb = new StringBuilder(); + List keywords = Arrays.asList(keyWordsToMatch); + Iterator itr = keywords.iterator(); + while (itr.hasNext()) { + sb.append(itr.next()); + if (itr.hasNext()) { + sb.append(" "); + } + } + return sb.toString(); + } + + @Override + public boolean run(ReadOnlyTask task) { + return keyWordsToMatch.stream() + .filter(keyword -> StringUtil.containsExactIgnoreCase(task.getTaskName(), keyword)) + .findAny() + .isPresent(); + } + + @Override + public String toString() { + return "taskName(ExactMatch)=" + String.join(", ", keyWordsToMatch); + } + } + + /** + * Qualifier for checking if {@link Task} is active. Tasks that are not archived are active. + * @author A0139915W + * + */ + private class TaskIsActiveQualifier implements Qualifier { + + @Override + public boolean run(ReadOnlyTask task) { + return task.isArchived() == false; + } + + @Override + public String toString() { + return "isArchived=false"; + } + } + + /** + * Qualifier for checking if {@link Task} is archived + * @author A0139915W + * + */ + private class TaskIsArchivedQualifier implements Qualifier { + + @Override + public boolean run(ReadOnlyTask task) { + return task.isArchived() == true; + } + + @Override + public String toString() { + return "isArchived=true"; + } + } + + //========== Inner classes/interfaces used for sorting ================================================== + + /** + * Compares {@link Task} by their default field, id + * @author A0139915W + * + */ + private class TaskSortedByDefault implements Comparator { + + @Override + public int compare(Task task1, Task task2) { + if (task1 == null && task2 == null) return 0; + else if (task1 == null) return 1; + else if (task2 == null) return -1; + else return task1.getId() - task2.getId(); + } + + } + + /** + * Compares {@link Task} by their DueDate + * @author A0139915W + * + */ + private class TaskSortedByDueDate implements Comparator { + + @Override + public int compare(Task task1, Task task2) { + if (task1 == null && task2 == null) return 0; + else if (task1 == null) return 1; + else if (task2 == null) return -1; + else { + // End dates can be nulls (floating tasks) + // Check for existence of endDateTime before comparing + if (task1.getEndDateTime() == null && + task2.getEndDateTime() == null) { + return 0; + } else if (task1.getEndDateTime() == null) { + return 1; + } else if (task2.getEndDateTime() == null) { + return -1; + } else { + return task1.getEndDateTime().compareTo(task2.getEndDateTime()); + } + } + } + + } + + /** + * Compares {@link Task} by their PriorityLevel + * @author A0139915W + * + */ + private class TaskSortedByPriorityLevel implements Comparator { + + @Override + public int compare(Task task1, Task task2) { + if (task1 == null && task2 == null) return 0; + else if (task1 == null) return 1; + else if (task2 == null) return -1; + else { + // Priority Level can be nulls + // Check for existence of priorityLevel before comparing + if (task1.getPriority() == null && + task2.getPriority() == null) { + return 0; + } else if (task1.getPriority() == null) { + return 1; + } else if (task2.getPriority() == null) { + return -1; + } else { + return task2.getPriority().compareTo(task1.getPriority()); + } + } + } + + } +``` +###### \java\seedu\savvytasker\model\ModelManager.java +``` java + +} +``` +###### \java\seedu\savvytasker\model\ReadOnlySavvyTasker.java +``` java + /** + * Returns a defensively copied task list. + */ + TaskList getTaskList(); +``` +###### \java\seedu\savvytasker\model\ReadOnlySavvyTasker.java +``` java + + /** + * Returns a defensively copied alias symbol list. + */ + + AliasSymbolList getAliasSymbolList(); +``` +###### \java\seedu\savvytasker\model\ReadOnlySavvyTasker.java +``` java + /** + * Returns an unmodifiable view of task list + */ + List getReadOnlyListOfTasks(); +``` +###### \java\seedu\savvytasker\model\ReadOnlySavvyTasker.java +``` java + + /** + * Returns unmodifiable view of symbols list + */ + List getReadOnlyListOfAliasSymbols(); +} +``` +###### \java\seedu\savvytasker\model\SavvyTasker.java +``` java + private final TaskList tasks; +``` +###### \java\seedu\savvytasker\model\SavvyTasker.java +``` java + private final AliasSymbolList symbols; + +``` +###### \java\seedu\savvytasker\model\SavvyTasker.java +``` java + public SavvyTasker() { + this.tasks = new TaskList(); + this.symbols = new AliasSymbolList(); + } + + public SavvyTasker(ReadOnlySavvyTasker toBeCopied) { + this(toBeCopied.getTaskList(), toBeCopied.getAliasSymbolList()); + } + + public SavvyTasker(TaskList tasks, AliasSymbolList symbols) { + this(); + resetData(tasks.getInternalList()); + this.symbols.reset(symbols); + } + + public static ReadOnlySavvyTasker getEmptySavvyTasker() { + return new SavvyTasker(); + } + +//// task list overwrite operations + + public ObservableList getTasks() { + return tasks.getInternalList(); + } + + public void setTasks(List tasks) { + this.tasks.getInternalList().setAll(tasks); + } + + public void resetData(Collection newTasks) { + setTasks(newTasks.stream().map(Task::new).collect(Collectors.toList())); + } + + public void resetData(ReadOnlySavvyTasker newData) { + resetData(newData.getReadOnlyListOfTasks()); + } +``` +###### \java\seedu\savvytasker\model\SavvyTasker.java +``` java + +//// symbol/task-level operations + +``` +###### \java\seedu\savvytasker\model\SavvyTasker.java +``` java + /** + * Returns the next available id for use to uniquely identify a task. + * @author A0139915W + * @return The next available id. + */ + public int getNextTaskId() { + return tasks.getNextId(); + } + + /** + * Adds a task to savvy tasker. + * @throws TaskList.DuplicateTaskException if an equivalent task already exists. + */ + public void addTask(Task t) throws DuplicateTaskException, InvalidDateException { + tasks.add(t); + } + + /** + * Removes a task from savvy tasker. + * @param key the task to be removed + * @return true if the task is removed successfully + * @throws TaskNotFoundException if the task to be removed does not exist + */ + public boolean removeTask(ReadOnlyTask key) throws TaskNotFoundException { + return tasks.remove(key); + } + + /** + * Replaces a task from savvy tasker. + * @param key the task to be replaced + * @return true if the task is removed successfully + * @throws TaskNotFoundException if the task to be removed does not exist + */ + public boolean replaceTask(ReadOnlyTask key, Task replacement) throws TaskNotFoundException, InvalidDateException { + return tasks.replace(key, replacement); + } +``` +###### \java\seedu\savvytasker\model\SavvyTasker.java +``` java + + /** + * Adds an alias symbol to savvy tasker. + * @param symbol the symbol to add + * @throws DuplicateSymbolKeywordException if another symbol with the same keyword already exists + */ + public void addAliasSymbol(AliasSymbol symbol) throws DuplicateSymbolKeywordException { + symbols.addAliasSymbol(symbol); + } + + /** + * Removes an alias symbol from savvy tasker. + * @param symbol the symbol to remove + * @throws SymbolKeywordNotFoundException if there is no such symbol + */ + public void removeAliasSymbol(AliasSymbol symbol) throws SymbolKeywordNotFoundException { + symbols.removeAliasSymbol(symbol); + } + + +//// util methods + + @Override + public String toString() { + return tasks.getInternalList().size() + " tasks, " + symbols.size() + " symbols"; + // TODO: refine later + } + + @Override + public List getReadOnlyListOfTasks() { + return Collections.unmodifiableList(tasks.getInternalList()); + } + + @Override + public TaskList getTaskList() { + TaskList defensiveCopy = new TaskList(); + defensiveCopy.getInternalList().addAll(tasks.getInternalList()); + return defensiveCopy; + } + + @Override + public List getReadOnlyListOfAliasSymbols() { + return symbols.asReadonly(); + } + + @Override + public AliasSymbolList getAliasSymbolList() { + return new AliasSymbolList(symbols); + } + + @Override + public boolean equals(Object other) { + return other == this // short circuit if same object + || (other instanceof SavvyTasker // instanceof handles nulls + && this.tasks.equals(((SavvyTasker) other).tasks) + && this.symbols.equals(((SavvyTasker) other).symbols)); + } + + @Override + public int hashCode() { + // use this method for custom fields hashing instead of implementing your own + return Objects.hash(tasks, symbols); + } +} +``` +###### \java\seedu\savvytasker\model\task\TaskList.java +``` java +/** + * A list of tasks that enforces uniqueness between its elements and does not allow nulls. + * + * Supports a minimal set of list operations. + * + * @see Task#equals(Object) + */ +public class TaskList implements Iterable { + + /** + * Signals that an operation would have violated the 'end time earlier than start time' property of the list. + */ + public static class InvalidDateException extends IllegalValueException { + + /** + * Generated serial ID + */ + private static final long serialVersionUID = 8933810750762846403L; + + protected InvalidDateException() { + super("Operation would result in invalid start/end dates"); + } + } + + /** + * Signals that an operation would have violated the 'no duplicates' property of the list. + */ + public static class DuplicateTaskException extends DuplicateDataException { + + /** + * Generated serial ID + */ + private static final long serialVersionUID = 8933810750762846403L; + + protected DuplicateTaskException() { + super("Operation would result in duplicate tasks"); + } + } + + /** + * Signals that an operation targeting a specified task in the list would fail because + * there is no such matching task in the list. + */ + public static class TaskNotFoundException extends Exception { + + /** + * Generated serial ID + */ + private static final long serialVersionUID = -7591982407764643511L; + } + + private final ObservableList internalList = FXCollections.observableArrayList(); + private int nextId = 0; + private boolean isNextIdInitialized = false; + + /** + * Constructs empty TaskList. + */ + public TaskList() {} + + /** + * Gets the next available id for uniquely identifying a task in + * Savvy Tasker. + * @return The next available id; + */ + public int getNextId() { + if (!isNextIdInitialized) { + int nextLowest = -1; // first id to be used is 0. Start finding with -1 + LinkedList usedIds = new LinkedList(); + for (Task t : internalList) { + usedIds.add(t.getId()); + if (t.getId() > nextLowest) { + nextLowest = t.getId(); + } + } + // assumption that the number of tasks < 2^31 + // implementation will be buggy if nextId exceeds 2^31 + nextId = nextLowest; + assert nextId < Integer.MAX_VALUE; + isNextIdInitialized = true; + } + nextId++; + return nextId; + } + + /** + * Returns true if the list contains an equivalent task as the given argument. + */ + public boolean contains(ReadOnlyTask toCheck) { + assert toCheck != null; + return internalList.contains(toCheck); + } + + /** + * Returns true if the end time is not earlier than the start time. + */ + public boolean isValidStartEnd(ReadOnlyTask toCheck) { + assert toCheck != null; + if (toCheck.getStartDateTime() != null && toCheck.getEndDateTime() != null && + toCheck.getStartDateTime().compareTo(toCheck.getEndDateTime()) >= 0) { + return false; + } + return true; + } + + /** + * Adds a task to the list. + * + * @throws DuplicateTaskException if the person to add is a duplicate of an existing task in the list. + */ + public void add(Task toAdd) throws DuplicateTaskException, InvalidDateException { + assert toAdd != null; + if (contains(toAdd)) { + throw new DuplicateTaskException(); + } + if (!isValidStartEnd(toAdd)) { + throw new InvalidDateException(); + } + internalList.add(toAdd); + } + + /** + * Removes the equivalent task from the list. + * + * @throws TaskNotFoundException if no such task could be found in the list. + */ + public boolean remove(ReadOnlyTask toRemove) throws TaskNotFoundException { + assert toRemove != null; + final boolean taskFoundAndDeleted = internalList.remove(toRemove); + if (!taskFoundAndDeleted) { + throw new TaskNotFoundException(); + } + return taskFoundAndDeleted; + } + + /** + * Replaces the equivalent task from the list. + * + * @throws TaskNotFoundException if no such task could be found in the list. + */ + public boolean replace(ReadOnlyTask toReplace, Task replacement) throws TaskNotFoundException, InvalidDateException { + assert toReplace != null; + assert replacement != null; + if (internalList.contains(toReplace)) { + if (!isValidStartEnd(replacement)) { + throw new InvalidDateException(); + } + internalList.set(internalList.indexOf(toReplace), replacement); + return true; + } + else { + throw new TaskNotFoundException(); + } + } + + public ObservableList getInternalList() { + return internalList; + } + + @Override + public Iterator iterator() { + return internalList.iterator(); + } + + @Override + public boolean equals(Object other) { + return other == this // short circuit if same object + || (other instanceof TaskList // instanceof handles nulls + && this.internalList.equals( ((TaskList) other).internalList)); + } + + @Override + public int hashCode() { + return internalList.hashCode(); + } +} +``` +###### \java\seedu\savvytasker\model\task\TaskList.java +``` java + +``` diff --git a/collated/test/A0139915W.md b/collated/test/A0139915W.md new file mode 100644 index 000000000000..b023e9452f3e --- /dev/null +++ b/collated/test/A0139915W.md @@ -0,0 +1,660 @@ +# A0139915W +###### \java\guitests\AddCommandTest.java +``` java +public class AddCommandTest extends SavvyTaskerGuiTest { + + @Test + public void add() { + //add one task + TestTask[] currentList = td.getTypicalTasks(); + TestTask taskToAdd = td.happy; + assertAddSuccess(taskToAdd, currentList); + currentList = TestUtil.addTasksToList(currentList, taskToAdd); + + //add another task + taskToAdd = td.haloween; + assertAddSuccess(taskToAdd, currentList); + currentList = TestUtil.addTasksToList(currentList, taskToAdd); + + //add to empty list + commandBox.runCommand("clear"); + assertAddSuccess(td.highPriority); + + //invalid command + commandBox.runCommand("adds Bad Command Task"); + assertResultMessage(Messages.MESSAGE_UNKNOWN_COMMAND); + } + + private void assertAddSuccess(TestTask taskToAdd, TestTask... currentList) { + commandBox.runCommand(taskToAdd.getAddCommand()); + + //confirm the new card contains the right data + TaskCardHandle addedCard = taskListPanel.navigateToTask(taskToAdd.getTaskName()); + assertMatching(taskToAdd, addedCard); + + //confirm the list now contains all previous persons plus the new person + TestTask[] expectedList = TestUtil.addTasksToList(currentList, taskToAdd); + assertTrue(taskListPanel.isListMatching(expectedList)); + } + +} +``` +###### \java\guitests\AddCommandTest.java +``` java + +``` +###### \java\guitests\guihandles\TaskListPanelHandle.java +``` java +/** + * Provides a handle for the panel containing the person list. + */ +public class TaskListPanelHandle extends GuiHandle { + + public static final int NOT_FOUND = -1; + public static final String CARD_PANE_ID = "#cardPane"; + + private static final String TASK_LIST_VIEW_ID = "#taskListView"; + + public TaskListPanelHandle(GuiRobot guiRobot, Stage primaryStage) { + super(guiRobot, primaryStage, TestApp.APP_TITLE); + } + + public List getSelectedTasks() { + ListView taskList = getListView(); + return taskList.getSelectionModel().getSelectedItems(); + } + + @SuppressWarnings("unchecked") + public ListView getListView() { + // Should be a listview of readonlytask only. + return (ListView) getNode(TASK_LIST_VIEW_ID); + } + + /** + * Returns true if the list is showing the person details correctly and in correct order. + * @param persons A list of person in the correct order. + */ + public boolean isListMatching(ReadOnlyTask... tasks) { + return this.isListMatching(0, tasks); + } + + /** + * Clicks on the ListView. + */ + public void clickOnListView() { + Point2D point= TestUtil.getScreenMidPoint(getListView()); + guiRobot.clickOn(point.getX(), point.getY()); + } + + /** + * Returns true if the {@code persons} appear as the sub list (in that order) at position {@code startPosition}. + */ + public boolean containsInOrder(int startPosition, ReadOnlyTask... tasks) { + List tasksInList = getListView().getItems(); + + // Return false if the list in panel is too short to contain the given list + if (startPosition + tasks.length > tasksInList.size()){ + return false; + } + + // Return false if any of the persons doesn't match + for (int i = 0; i < tasks.length; i++) { + if (!tasksInList.get(startPosition + i).getTaskName().equals(tasks[i].getTaskName())){ + return false; + } + } + + return true; + } + + /** + * Returns true if the list is showing the person details correctly and in correct order. + * @param startPosition The starting position of the sub list. + * @param persons A list of person in the correct order. + */ + public boolean isListMatching(int startPosition, ReadOnlyTask... tasks) throws IllegalArgumentException { + if (tasks.length + startPosition != getListView().getItems().size()) { + throw new IllegalArgumentException("List size mismatched\n" + + "Expected " + (getListView().getItems().size()) + " tasks"); + } + assertTrue(this.containsInOrder(startPosition, tasks)); + for (int i = 0; i < tasks.length; i++) { + final int scrollTo = i + startPosition; + guiRobot.interact(() -> getListView().scrollTo(scrollTo)); + guiRobot.sleep(200); + if (!TestUtil.compareCardAndTask(getTaskCardHandle(startPosition + i), tasks[i])) { + return false; + } + } + return true; + } + + + public TaskCardHandle navigateToTask(String name) { + guiRobot.sleep(500); //Allow a bit of time for the list to be updated + final Optional task = getListView().getItems().stream().filter(p -> p.getTaskName().equals(name)).findAny(); + if (!task.isPresent()) { + throw new IllegalStateException("Name not found: " + name); + } + + return navigateToTask(task.get()); + } + + /** + * Navigates the listview to display and select the person. + */ + public TaskCardHandle navigateToTask(ReadOnlyTask task) { + int index = getTaskIndex(task); + + guiRobot.interact(() -> { + getListView().scrollTo(index); + guiRobot.sleep(150); + getListView().getSelectionModel().select(index); + }); + guiRobot.sleep(100); + return getTaskCardHandle(task); + } + + + /** + * Returns the position of the person given, {@code NOT_FOUND} if not found in the list. + */ + public int getTaskIndex(ReadOnlyTask targetTask) { + List tasksInList = getListView().getItems(); + for (int i = 0; i < tasksInList.size(); i++) { + if(tasksInList.get(i).getTaskName().equals(targetTask.getTaskName())){ + return i; + } + } + return NOT_FOUND; + } + + /** + * Gets a person from the list by index + */ + public ReadOnlyTask getTask(int index) { + return getListView().getItems().get(index); + } + + public TaskCardHandle getTaskCardHandle(int index) { + return getTaskCardHandle(new Task(getListView().getItems().get(index))); + } + + public TaskCardHandle getTaskCardHandle(ReadOnlyTask task) { + Set nodes = getAllCardNodes(); + Optional taskCardNode = nodes.stream() + .filter(n -> new TaskCardHandle(guiRobot, primaryStage, n).isSameTask(task)) + .findFirst(); + if (taskCardNode.isPresent()) { + return new TaskCardHandle(guiRobot, primaryStage, taskCardNode.get()); + } else { + return null; + } + } + + protected Set getAllCardNodes() { + return guiRobot.lookup(CARD_PANE_ID).queryAll(); + } + + public int getNumberOfTasks() { + return getListView().getItems().size(); + } +} +``` +###### \java\guitests\guihandles\TaskListPanelHandle.java +``` java + +``` +###### \java\seedu\savvytasker\testutil\SavvyTaskerBuilder.java +``` java +/** + * A utility class to help with building SavvyTasker objects. + * Example usage:
+ * {@code SavvyTasker st = new SavvyTaskerBuilder().withTask("Hello Task").build();} + */ +public class SavvyTaskerBuilder { + + private SavvyTasker savvyTasker; + + public SavvyTaskerBuilder(SavvyTasker savvyTasker){ + this.savvyTasker = savvyTasker; + } + + public SavvyTaskerBuilder withTask(Task task) throws DuplicateTaskException, InvalidDateException { + savvyTasker.addTask(task); + return this; + } + + public SavvyTasker build(){ + return savvyTasker; + } +} +``` +###### \java\seedu\savvytasker\testutil\SavvyTaskerBuilder.java +``` java + +``` +###### \java\seedu\savvytasker\testutil\TaskBuilder.java +``` java +/** + * Helper to build Task objects + */ +public class TaskBuilder { + + private TestTask task; + + public TaskBuilder() { + this.task = new TestTask(); + } + + public TaskBuilder withId(int id) { + this.task.setId(id); + return this; + } + + public TaskBuilder withTaskName(String taskName) throws IllegalValueException { + this.task.setTaskName(taskName); + return this; + } + + public TaskBuilder withStartDateTime(Date startDateTime) { + this.task.setStartDateTime(startDateTime); + return this; + } + + public TaskBuilder withEndDateTime(Date endDateTime) { + this.task.setEndDateTime(endDateTime); + return this; + } + + public TaskBuilder withLocation(String location) { + this.task.setLocation(location); + return this; + } + + public TaskBuilder withPriority(PriorityLevel priority) { + this.task.setPriority(priority); + return this; + } + + public TaskBuilder withRecurringType(RecurrenceType recurringType) { + this.task.setRecurringType(recurringType); + return this; + } + + public TaskBuilder withNumberOfRecurrence(int numberOfRecurrence) { + this.task.setNumberOfRecurrence(numberOfRecurrence); + return this; + } + + public TaskBuilder withCategory(String category) { + this.task.setCategory(category); + return this; + } + + public TaskBuilder withDescription(String description) { + this.task.setDescription(description); + return this; + } + + public TaskBuilder withArchived(boolean isArchived) { + this.task.setArchived(isArchived); + return this; + } + + public TestTask build() { + return this.task; + } + +} +``` +###### \java\seedu\savvytasker\testutil\TaskBuilder.java +``` java + +``` +###### \java\seedu\savvytasker\testutil\TestUtil.java +``` java + public static final Task[] sampleTaskData = getSampleTaskData(); + + private static Task[] getSampleTaskData() { + return new Task[]{ + new Task("Sample Task Leh"), + new Task("Sample Task La"), + new Task("Sample Task Lo"), + new Task("Sample Task Ah") + }; + } +``` +###### \java\seedu\savvytasker\testutil\TestUtil.java +``` java + + public static List generateSampleTaskData() { + return Arrays.asList(sampleTaskData); + } + + /** + * Appends the file name to the sandbox folder path. + * Creates the sandbox folder if it doesn't exist. + * @param fileName + * @return + */ + public static String getFilePathInSandboxFolder(String fileName) { + try { + FileUtil.createDirs(new File(SANDBOX_FOLDER)); + } catch (IOException e) { + throw new RuntimeException(e); + } + return SANDBOX_FOLDER + fileName; + } + + public static void createDataFileWithSampleData(String filePath) { + createDataFileWithData(generateSampleStorageSavvyTasker(), filePath); + } + + public static void createDataFileWithData(T data, String filePath) { + try { + File saveFileForTesting = new File(filePath); + FileUtil.createIfMissing(saveFileForTesting); + XmlUtil.saveDataToFile(saveFileForTesting, data); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + public static void main(String... s) { + createDataFileWithSampleData(TestApp.SAVE_LOCATION_FOR_TESTING); + } + + public static SavvyTasker generateEmptySavvyTasker() { + return new SavvyTasker(new TaskList(), new AliasSymbolList()); + } + + public static XmlSerializableSavvyTasker generateSampleStorageSavvyTasker() { + return new XmlSerializableSavvyTasker(generateEmptySavvyTasker()); + } + + /** + * Tweaks the {@code keyCodeCombination} to resolve the {@code KeyCode.SHORTCUT} to their + * respective platform-specific keycodes + */ + public static KeyCode[] scrub(KeyCodeCombination keyCodeCombination) { + List keys = new ArrayList<>(); + if (keyCodeCombination.getAlt() == KeyCombination.ModifierValue.DOWN) { + keys.add(KeyCode.ALT); + } + if (keyCodeCombination.getShift() == KeyCombination.ModifierValue.DOWN) { + keys.add(KeyCode.SHIFT); + } + if (keyCodeCombination.getMeta() == KeyCombination.ModifierValue.DOWN) { + keys.add(KeyCode.META); + } + if (keyCodeCombination.getControl() == KeyCombination.ModifierValue.DOWN) { + keys.add(KeyCode.CONTROL); + } + keys.add(keyCodeCombination.getCode()); + return keys.toArray(new KeyCode[]{}); + } + + public static boolean isHeadlessEnvironment() { + String headlessProperty = System.getProperty("testfx.headless"); + return headlessProperty != null && headlessProperty.equals("true"); + } + + public static void captureScreenShot(String fileName) { + File file = GuiTest.captureScreenshot(); + try { + Files.copy(file, new File(fileName + ".png")); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public static String descOnFail(Object... comparedObjects) { + return "Comparison failed \n" + + Arrays.asList(comparedObjects).stream() + .map(Object::toString) + .collect(Collectors.joining("\n")); + } + + public static void setFinalStatic(Field field, Object newValue) throws NoSuchFieldException, IllegalAccessException{ + field.setAccessible(true); + // remove final modifier from field + Field modifiersField = Field.class.getDeclaredField("modifiers"); + modifiersField.setAccessible(true); + // ~Modifier.FINAL is used to remove the final modifier from field so that its value is no longer + // final and can be changed + modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL); + field.set(null, newValue); + } + + public static void initRuntime() throws TimeoutException { + FxToolkit.registerPrimaryStage(); + FxToolkit.hideStage(); + } + + public static void tearDownRuntime() throws Exception { + FxToolkit.cleanupStages(); + } + + /** + * Gets private method of a class + * Invoke the method using method.invoke(objectInstance, params...) + * + * Caveat: only find method declared in the current Class, not inherited from supertypes + */ + @SuppressWarnings({ "unchecked", "rawtypes" }) + public static Method getPrivateMethod(Class objectClass, String methodName) throws NoSuchMethodException { + Method method = objectClass.getDeclaredMethod(methodName); + method.setAccessible(true); + return method; + } + + public static void renameFile(File file, String newFileName) { + try { + Files.copy(file, new File(newFileName)); + } catch (IOException e1) { + e1.printStackTrace(); + } + } + + /** + * Gets mid point of a node relative to the screen. + * @param node + * @return + */ + public static Point2D getScreenMidPoint(Node node) { + double x = getScreenPos(node).getMinX() + node.getLayoutBounds().getWidth() / 2; + double y = getScreenPos(node).getMinY() + node.getLayoutBounds().getHeight() / 2; + return new Point2D(x,y); + } + + /** + * Gets mid point of a node relative to its scene. + * @param node + * @return + */ + public static Point2D getSceneMidPoint(Node node) { + double x = getScenePos(node).getMinX() + node.getLayoutBounds().getWidth() / 2; + double y = getScenePos(node).getMinY() + node.getLayoutBounds().getHeight() / 2; + return new Point2D(x,y); + } + + /** + * Gets the bound of the node relative to the parent scene. + * @param node + * @return + */ + public static Bounds getScenePos(Node node) { + return node.localToScene(node.getBoundsInLocal()); + } + + public static Bounds getScreenPos(Node node) { + return node.localToScreen(node.getBoundsInLocal()); + } + + public static double getSceneMaxX(Scene scene) { + return scene.getX() + scene.getWidth(); + } + + public static double getSceneMaxY(Scene scene) { + return scene.getX() + scene.getHeight(); + } + + public static Object getLastElement(List list) { + return list.get(list.size() - 1); + } + +``` +###### \java\seedu\savvytasker\testutil\TestUtil.java +``` java + /** + * Removes a subset from the list of tasks. + * @param tasks The list of tasks + * @param tasksToRemove The subset of tasjs. + * @return The modified tasks after removal of the subset from tasks. + */ + public static TestTask[] removeTasksFromList(final TestTask[] tasks, TestTask... tasksToRemove) { + List listOfTasks = asList(tasks); + listOfTasks.removeAll(asList(tasksToRemove)); + return listOfTasks.toArray(new TestTask[listOfTasks.size()]); + } + + + /** + * Returns a copy of the list with the task at specified index removed. + * @param list original list to copy from + * @param targetIndexInOneIndexedFormat e.g. if the first element to be removed, 1 should be given as index. + */ + public static TestTask[] removeTaskFromList(final TestTask[] list, int targetIndexInOneIndexedFormat) { + return removeTasksFromList(list, list[targetIndexInOneIndexedFormat-1]); + } + + /** + * Replaces tasks[i] with a task. + * @param tasks The array of tasks. + * @param task The replacement task + * @param index The index of the task to be replaced. + * @return + */ + public static TestTask[] replaceTaskFromList(TestTask[] tasks, TestTask task, int index) { + tasks[index] = task; + return tasks; + } + + /** + * Appends tasks to the array of tasks. + * @param tasks A array of tasks. + * @param tasksToAdd The tasks that are to be appended behind the original array. + * @return The modified array of tasks. + */ + public static TestTask[] addTasksToList(final TestTask[] tasks, TestTask... tasksToAdd) { + List listOfTasks = asList(tasks); + listOfTasks.addAll(asList(tasksToAdd)); + return listOfTasks.toArray(new TestTask[listOfTasks.size()]); + } +``` +###### \java\seedu\savvytasker\testutil\TestUtil.java +``` java + + private static List asList(T[] objs) { + List list = new ArrayList<>(); + for(T obj : objs) { + list.add(obj); + } + return list; + } + +``` +###### \java\seedu\savvytasker\testutil\TestUtil.java +``` java + public static boolean compareCardAndTask(TaskCardHandle card, ReadOnlyTask task) { + return card.isSameTask(task); + } +``` +###### \java\seedu\savvytasker\testutil\TestUtil.java +``` java + +} +``` +###### \java\seedu\savvytasker\testutil\TypicalTestTasks.java +``` java +/** + * Test tasks used to test cases + */ +public class TypicalTestTasks { + + public TestTask highPriority, medPriority, lowPriority, furthestDue, + nearerDue, notSoNearerDue, earliestDue, longDue, happy, haloween; + private SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy"); + + public TypicalTestTasks() { + try { + highPriority = new TaskBuilder().withId(0).withTaskName("High Priority Task") + .withPriority(PriorityLevel.High).build(); + medPriority = new TaskBuilder().withId(1).withTaskName("Medium Priority Task") + .withPriority(PriorityLevel.Medium).build(); + lowPriority = new TaskBuilder().withId(2).withTaskName("Low Priority Task") + .withPriority(PriorityLevel.Low).build(); + furthestDue = new TaskBuilder().withId(3).withTaskName("Furthest Due Task") + .withEndDateTime(getDate("01/12/2016")).build(); + nearerDue = new TaskBuilder().withId(4).withTaskName("Nearer Due Task") + .withEndDateTime(getDate("01/11/2016")).build(); + notSoNearerDue = new TaskBuilder().withId(5).withTaskName("Not So Nearer Due Task") + .withEndDateTime(getDate("02/11/2016")).build(); + earliestDue = new TaskBuilder().withId(6).withTaskName("Earliest Due Task") + .withEndDateTime(getDate("01/10/2016")).build(); + longDue = new TaskBuilder().withId(7).withTaskName("Long Due Task") + .withEndDateTime(getDate("01/1/2016")).withArchived(true).build(); + + //Manually added + happy = new TaskBuilder().withId(8).withTaskName("Happy Task").build(); + haloween = new TaskBuilder().withId(9).withTaskName("Haloween Task").build(); + } catch (IllegalValueException e) { + e.printStackTrace(); + assert false : "not possible"; + } + } + + public static void loadSavvyTaskerWithSampleData(SavvyTasker st) { + TypicalTestTasks td = new TypicalTestTasks(); + try { + st.addTask(new Task(td.highPriority)); + st.addTask(new Task(td.medPriority)); + st.addTask(new Task(td.lowPriority)); + st.addTask(new Task(td.furthestDue)); + st.addTask(new Task(td.nearerDue)); + st.addTask(new Task(td.notSoNearerDue)); + st.addTask(new Task(td.earliestDue)); + st.addTask(new Task(td.longDue)); + } catch (DuplicateTaskException e) { + assert false : "not possible"; + } catch (InvalidDateException e) { + assert false : "not possible"; + } + } + + public TestTask[] getTypicalTasks() { + return new TestTask[]{ highPriority, medPriority, lowPriority, + furthestDue, nearerDue, notSoNearerDue, earliestDue }; + } + + public SavvyTasker getTypicalSavvyTasker(){ + SavvyTasker st = new SavvyTasker(); + loadSavvyTaskerWithSampleData(st); + return st; + } + + private Date getDate(String ddmmyyyy) { + try { + return format.parse(ddmmyyyy); + } catch (Exception e) { + assert false; //should not get an invalid date.... + } + return null; + } +} +``` +###### \java\seedu\savvytasker\testutil\TypicalTestTasks.java +``` java + +``` diff --git a/src/main/java/seedu/savvytasker/commons/events/ui/TaskPanelSelectionChangedEvent.java b/src/main/java/seedu/savvytasker/commons/events/ui/TaskPanelSelectionChangedEvent.java index 89caab54a44f..317fa9e493ba 100644 --- a/src/main/java/seedu/savvytasker/commons/events/ui/TaskPanelSelectionChangedEvent.java +++ b/src/main/java/seedu/savvytasker/commons/events/ui/TaskPanelSelectionChangedEvent.java @@ -3,8 +3,10 @@ import seedu.savvytasker.commons.events.BaseEvent; import seedu.savvytasker.model.task.ReadOnlyTask; +//@@author A0139915W + /** - * Represents a selection change in the Person List Panel + * Represents a selection change in the Task List Panel */ public class TaskPanelSelectionChangedEvent extends BaseEvent { @@ -24,3 +26,4 @@ public ReadOnlyTask getNewSelection() { return newSelection; } } +//@@author \ No newline at end of file diff --git a/src/main/java/seedu/savvytasker/commons/util/SmartDefaultDates.java b/src/main/java/seedu/savvytasker/commons/util/SmartDefaultDates.java index d23b4ed64516..2ca8133d63dd 100644 --- a/src/main/java/seedu/savvytasker/commons/util/SmartDefaultDates.java +++ b/src/main/java/seedu/savvytasker/commons/util/SmartDefaultDates.java @@ -5,6 +5,7 @@ import seedu.savvytasker.logic.parser.DateParser.InferredDate; +//@@author A0139915W /** * Helper functions for handling dates. * @author A0139915W @@ -127,7 +128,12 @@ private void parseStart(InferredDate startDateTime) { calendar.set(Calendar.SECOND, 59); this.endDateTime = calendar.getTime(); } - + + /** + * Sets the starting and ending date/time based on defaults for providing both + * start and end times + * @param startDateTime start time supplied + */ private void parseStartAndEnd(InferredDate startDateTime, InferredDate endDateTime) { assert endDateTime.getInferredDateTime() != null; assert startDateTime.getInferredDateTime() != null; @@ -149,4 +155,5 @@ public Date getStartDate() { public Date getEndDate() { return endDateTime; } -} \ No newline at end of file +} +//@@author A0139915W \ No newline at end of file diff --git a/src/main/java/seedu/savvytasker/commons/util/StringUtil.java b/src/main/java/seedu/savvytasker/commons/util/StringUtil.java index 8a7355cdec6b..d9345fe3a922 100644 --- a/src/main/java/seedu/savvytasker/commons/util/StringUtil.java +++ b/src/main/java/seedu/savvytasker/commons/util/StringUtil.java @@ -9,17 +9,21 @@ * Helper functions for handling strings. */ public class StringUtil { + //@@author A0139915W + // reused original implementation of 'containsIgnoreCase' to find exact matches public static boolean containsExactIgnoreCase(String source, String query) { List strings = Arrays.asList(source); return strings.stream().filter(s -> s.equalsIgnoreCase(query)).count() > 0; } - + + // reused original implementation of 'containsIgnoreCase' to find partial matches public static boolean containsPartialIgnoreCase(String source, String query) { if (source == null) return false; String[] split = source.toLowerCase().split("\\s+"); List strings = Arrays.asList(split); return strings.stream().filter(s -> s.contains(query.toLowerCase())).count() > 0; } + //@@author A0139915W public static boolean containsIgnoreCase(String source, String query) { String[] split = source.toLowerCase().split("\\s+"); diff --git a/src/main/java/seedu/savvytasker/logic/commands/AddCommand.java b/src/main/java/seedu/savvytasker/logic/commands/AddCommand.java index 07d16272c5d8..3c13f604c26d 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/AddCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/AddCommand.java @@ -40,6 +40,7 @@ public class AddCommand extends ModelRequiringCommand { private Task toAdd; + //@@author A0139915W /** * Creates an add command. */ @@ -61,7 +62,6 @@ private void createTask() { final boolean isArchived = false; // all tasks are first added as active tasks final int taskId = 0; // taskId to be assigned by ModelManager, leave as 0 - //TODO: Smart defaults for date SmartDefaultDates sdd = new SmartDefaultDates(startDateTime, endDateTime); this.toAdd = new Task(taskId, taskName, sdd.getStartDate(), sdd.getEndDate(), location, priority, recurringType, numberOfRecurrence, @@ -83,6 +83,7 @@ public CommandResult execute() { } } + //@@author A0139915W /** * Checks if a command can perform undo operations diff --git a/src/main/java/seedu/savvytasker/logic/commands/DeleteCommand.java b/src/main/java/seedu/savvytasker/logic/commands/DeleteCommand.java index a5161fc96845..acfefd6873d4 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/DeleteCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/DeleteCommand.java @@ -29,7 +29,8 @@ public class DeleteCommand extends ModelRequiringCommand { //private LinkedList tasksToUndo = new LinkedList(); private ReadOnlySavvyTasker original; private final int[] targetIndices; - + + //@@author A0139915W public DeleteCommand(int[] targetIndices) { this.targetIndices = targetIndices; } @@ -63,6 +64,7 @@ public CommandResult execute() { return new CommandResult(resultSb.toString()); } + //@@author A0139915W /** * Checks if a command can perform undo operations diff --git a/src/main/java/seedu/savvytasker/logic/commands/ListCommand.java b/src/main/java/seedu/savvytasker/logic/commands/ListCommand.java index ac5d7f0a675f..160f1630c047 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/ListCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/ListCommand.java @@ -17,7 +17,8 @@ public class ListCommand extends ModelRequiringCommand { public static final String MESSAGE_SUCCESS = "Listed all tasks"; private final ListType listType; - + + //@@author A0139915W /** * Creates the List command to list the specified tasks * @author A0139915W @@ -50,6 +51,7 @@ public CommandResult execute() { } return new CommandResult(getMessageForTaskListShownSummary(model.getFilteredTaskList().size())); } + //@@author A0139915W /** * Checks if a command can perform undo operations diff --git a/src/main/java/seedu/savvytasker/model/Model.java b/src/main/java/seedu/savvytasker/model/Model.java index 9eaef9cd7905..b5da015385a6 100644 --- a/src/main/java/seedu/savvytasker/model/Model.java +++ b/src/main/java/seedu/savvytasker/model/Model.java @@ -21,6 +21,7 @@ public interface Model { /** Returns Savvy Tasker */ ReadOnlySavvyTasker getSavvyTasker(); + //@@author A0139915W /** Deletes the given Task. */ void deleteTask(ReadOnlyTask target) throws TaskNotFoundException; @@ -52,6 +53,7 @@ public interface Model { /** Updates the filter of the filtered task list to filter by the given keywords*/ void updateFilteredTaskList(FindType findType, String[] keywords); + //@@author A0139915W /** Adds the given AliasSymbol */ void addAliasSymbol(AliasSymbol symbol) throws DuplicateSymbolKeywordException; diff --git a/src/main/java/seedu/savvytasker/model/ModelManager.java b/src/main/java/seedu/savvytasker/model/ModelManager.java index f7dd384fc7cf..41beb7878dc4 100644 --- a/src/main/java/seedu/savvytasker/model/ModelManager.java +++ b/src/main/java/seedu/savvytasker/model/ModelManager.java @@ -33,10 +33,13 @@ public class ModelManager extends ComponentManager implements Model { private static final Logger logger = LogsCenter.getLogger(ModelManager.class); + //@@author A0139915W private final SavvyTasker savvyTasker; private final FilteredList filteredTasks; private final SortedList sortedAndFilteredTasks; + //@@author A0139915W + //@@author A0139915W /** * Initializes a ModelManager with the given SavvyTasker * and its variables should not be null @@ -79,6 +82,7 @@ public ReadOnlySavvyTasker getSavvyTasker() { private void indicateSavvyTaskerChanged() { raise(new SavvyTaskerChangedEvent(savvyTasker)); } + //@@author A0139915W private void indicateAliasSymbolAdded(AliasSymbol symbol) { raise(new AliasSymbolChangedEvent(symbol, AliasSymbolChangedEvent.Action.Added)); @@ -89,6 +93,7 @@ private void indicateAliasSymbolRemoved(AliasSymbol symbol) { } + //@@author A0139915W @Override public synchronized void deleteTask(ReadOnlyTask target) throws TaskNotFoundException { savvyTasker.removeTask(target); @@ -108,6 +113,7 @@ public synchronized void addTask(Task t) throws DuplicateTaskException, InvalidD updateFilteredListToShowActive(); indicateSavvyTaskerChanged(); } + //@@author A0139915W @Override public synchronized void addAliasSymbol(AliasSymbol symbol) throws DuplicateSymbolKeywordException { @@ -125,6 +131,7 @@ public synchronized void removeAliasSymbol(AliasSymbol symbol) throws SymbolKeyw //=========== Filtered/Sorted Task List Accessors =============================================================== + //@@author A0139915W @Override public UnmodifiableObservableList getFilteredTaskList() { return new UnmodifiableObservableList(sortedAndFilteredTasks); @@ -144,12 +151,11 @@ public void updateFilteredListToShowActiveSortedByDueDate() { public void updateFilteredListToShowActiveSortedByPriorityLevel() { updateFilteredListToShowActive(new TaskSortedByPriorityLevel()); } - + @Override public void updateFilteredListToShowActive() { updateFilteredTaskList(new PredicateExpression(new TaskIsActiveQualifier())); } - private void updateFilteredListToShowActive(Comparator comparator) { updateFilteredTaskList( new PredicateExpression(new TaskIsActiveQualifier()), @@ -160,7 +166,7 @@ private void updateFilteredListToShowActive(Comparator comparator) { public void updateFilteredListToShowArchived() { updateFilteredTaskList(new PredicateExpression(new TaskIsArchivedQualifier())); } - + @Override public void updateFilteredTaskList(FindType findType, String[] keywords) { assert findType != null; @@ -193,6 +199,7 @@ private void updateFilteredTaskList(Expression expression, Comparator comp filteredTasks.setPredicate(expression::satisfies); sortedAndFilteredTasks.setComparator(comparator); } + //@@author A0139915W //========== Inner classes/interfaces used for filtering ================================================== @@ -237,6 +244,7 @@ default Set createSet(String[] keywords) { } } + //@@author A0139915W /** * Qualifier matching a partial word from the set of keywords * @author A0139915W @@ -470,5 +478,6 @@ public int compare(Task task1, Task task2) { } } + //@@author A0139915W } diff --git a/src/main/java/seedu/savvytasker/model/ReadOnlySavvyTasker.java b/src/main/java/seedu/savvytasker/model/ReadOnlySavvyTasker.java index 8b4a456b44b7..c9078435f4a6 100644 --- a/src/main/java/seedu/savvytasker/model/ReadOnlySavvyTasker.java +++ b/src/main/java/seedu/savvytasker/model/ReadOnlySavvyTasker.java @@ -11,20 +11,24 @@ * Unmodifiable view of a task list */ public interface ReadOnlySavvyTasker { + //@@author A0139915W /** * Returns a defensively copied task list. */ TaskList getTaskList(); + //@@author A0139915W /** * Returns a defensively copied alias symbol list. */ AliasSymbolList getAliasSymbolList(); + //@@author A0139915W /** * Returns an unmodifiable view of task list */ List getReadOnlyListOfTasks(); + //@@author A0139915W /** * Returns unmodifiable view of symbols list diff --git a/src/main/java/seedu/savvytasker/model/SavvyTasker.java b/src/main/java/seedu/savvytasker/model/SavvyTasker.java index d11aef04d442..5c03abca8623 100644 --- a/src/main/java/seedu/savvytasker/model/SavvyTasker.java +++ b/src/main/java/seedu/savvytasker/model/SavvyTasker.java @@ -24,9 +24,12 @@ */ public class SavvyTasker implements ReadOnlySavvyTasker { + //@@author A0139915W private final TaskList tasks; + //@@author A0139915W private final AliasSymbolList symbols; + //@@author A0139915W public SavvyTasker() { this.tasks = new TaskList(); this.symbols = new AliasSymbolList(); @@ -63,9 +66,11 @@ public void resetData(Collection newTasks) { public void resetData(ReadOnlySavvyTasker newData) { resetData(newData.getReadOnlyListOfTasks()); } + //@@author A0139915W //// symbol/task-level operations - + + //@@author A0139915W /** * Returns the next available id for use to uniquely identify a task. * @author A0139915W @@ -90,11 +95,7 @@ public void addTask(Task t) throws DuplicateTaskException, InvalidDateException * @throws TaskNotFoundException if the task to be removed does not exist */ public boolean removeTask(ReadOnlyTask key) throws TaskNotFoundException { - if (tasks.remove(key)) { - return true; - } else { - throw new TaskList.TaskNotFoundException(); - } + return tasks.remove(key); } /** @@ -104,12 +105,9 @@ public boolean removeTask(ReadOnlyTask key) throws TaskNotFoundException { * @throws TaskNotFoundException if the task to be removed does not exist */ public boolean replaceTask(ReadOnlyTask key, Task replacement) throws TaskNotFoundException, InvalidDateException { - if (tasks.contains(key)) { - return tasks.replace(key, replacement); - } else { - throw new TaskList.TaskNotFoundException(); - } + return tasks.replace(key, replacement); } + //@@author A0139915W /** * Adds an alias symbol to savvy tasker. diff --git a/src/main/java/seedu/savvytasker/model/task/TaskList.java b/src/main/java/seedu/savvytasker/model/task/TaskList.java index 61445730e98d..ad49ab128afc 100644 --- a/src/main/java/seedu/savvytasker/model/task/TaskList.java +++ b/src/main/java/seedu/savvytasker/model/task/TaskList.java @@ -8,6 +8,7 @@ import seedu.savvytasker.commons.exceptions.DuplicateDataException; import seedu.savvytasker.commons.exceptions.IllegalValueException; +//@@author A0139915W /** * A list of tasks that enforces uniqueness between its elements and does not allow nulls. * @@ -184,3 +185,4 @@ public int hashCode() { return internalList.hashCode(); } } +//@@author A0139915W diff --git a/src/test/java/guitests/AddCommandTest.java b/src/test/java/guitests/AddCommandTest.java index d845d6939c8d..b7025a837241 100644 --- a/src/test/java/guitests/AddCommandTest.java +++ b/src/test/java/guitests/AddCommandTest.java @@ -10,6 +10,7 @@ import static org.junit.Assert.assertTrue; +//@@author A0139915W public class AddCommandTest extends SavvyTaskerGuiTest { @Test @@ -47,3 +48,4 @@ private void assertAddSuccess(TestTask taskToAdd, TestTask... currentList) { } } +//@@author A0139915W diff --git a/src/test/java/guitests/guihandles/TaskListPanelHandle.java b/src/test/java/guitests/guihandles/TaskListPanelHandle.java index 787b7715a43e..b2cfeb50398e 100644 --- a/src/test/java/guitests/guihandles/TaskListPanelHandle.java +++ b/src/test/java/guitests/guihandles/TaskListPanelHandle.java @@ -17,6 +17,7 @@ import static org.junit.Assert.assertTrue; +//@@author A0139915W /** * Provides a handle for the panel containing the person list. */ @@ -172,3 +173,4 @@ public int getNumberOfTasks() { return getListView().getItems().size(); } } +//@@author A0139915W diff --git a/src/test/java/seedu/savvytasker/testutil/SavvyTaskerBuilder.java b/src/test/java/seedu/savvytasker/testutil/SavvyTaskerBuilder.java index db6af1cab618..f2c3c28fd268 100644 --- a/src/test/java/seedu/savvytasker/testutil/SavvyTaskerBuilder.java +++ b/src/test/java/seedu/savvytasker/testutil/SavvyTaskerBuilder.java @@ -5,6 +5,7 @@ import seedu.savvytasker.model.task.TaskList.DuplicateTaskException; import seedu.savvytasker.model.task.TaskList.InvalidDateException; +//@@author A0139915W /** * A utility class to help with building SavvyTasker objects. * Example usage:
@@ -27,3 +28,4 @@ public SavvyTasker build(){ return savvyTasker; } } +//@@author A0139915W diff --git a/src/test/java/seedu/savvytasker/testutil/TaskBuilder.java b/src/test/java/seedu/savvytasker/testutil/TaskBuilder.java index b964b46ff4c9..1934740e1622 100644 --- a/src/test/java/seedu/savvytasker/testutil/TaskBuilder.java +++ b/src/test/java/seedu/savvytasker/testutil/TaskBuilder.java @@ -6,8 +6,9 @@ import seedu.savvytasker.model.task.PriorityLevel; import seedu.savvytasker.model.task.RecurrenceType; +//@@author A0139915W /** - * + * Helper to build Task objects */ public class TaskBuilder { @@ -77,3 +78,4 @@ public TestTask build() { } } +//@@author A0139915W diff --git a/src/test/java/seedu/savvytasker/testutil/TestUtil.java b/src/test/java/seedu/savvytasker/testutil/TestUtil.java index 45fd0ba223cd..02b95a34ab2f 100644 --- a/src/test/java/seedu/savvytasker/testutil/TestUtil.java +++ b/src/test/java/seedu/savvytasker/testutil/TestUtil.java @@ -61,6 +61,7 @@ public static void assertThrows(Class expected, Runnable ex */ public static String SANDBOX_FOLDER = FileUtil.getPath("./src/test/data/sandbox/"); + //@@author A0139915W public static final Task[] sampleTaskData = getSampleTaskData(); private static Task[] getSampleTaskData() { @@ -71,6 +72,7 @@ private static Task[] getSampleTaskData() { new Task("Sample Task Ah") }; } + //@@author A0139915W public static List generateSampleTaskData() { return Arrays.asList(sampleTaskData); @@ -248,11 +250,12 @@ public static Object getLastElement(List list) { return list.get(list.size() - 1); } + //@@author A0139915W /** - * Removes a subset from the list of persons. - * @param persons The list of persons - * @param personsToRemove The subset of persons. - * @return The modified persons after removal of the subset from persons. + * Removes a subset from the list of tasks. + * @param tasks The list of tasks + * @param tasksToRemove The subset of tasjs. + * @return The modified tasks after removal of the subset from tasks. */ public static TestTask[] removeTasksFromList(final TestTask[] tasks, TestTask... tasksToRemove) { List listOfTasks = asList(tasks); @@ -262,7 +265,7 @@ public static TestTask[] removeTasksFromList(final TestTask[] tasks, TestTask... /** - * Returns a copy of the list with the person at specified index removed. + * Returns a copy of the list with the task at specified index removed. * @param list original list to copy from * @param targetIndexInOneIndexedFormat e.g. if the first element to be removed, 1 should be given as index. */ @@ -293,6 +296,7 @@ public static TestTask[] addTasksToList(final TestTask[] tasks, TestTask... task listOfTasks.addAll(asList(tasksToAdd)); return listOfTasks.toArray(new TestTask[listOfTasks.size()]); } + //@@author A0139915W private static List asList(T[] objs) { List list = new ArrayList<>(); @@ -302,8 +306,10 @@ private static List asList(T[] objs) { return list; } + //@@author A0139915W public static boolean compareCardAndTask(TaskCardHandle card, ReadOnlyTask task) { return card.isSameTask(task); } + //@@author A0139915W } diff --git a/src/test/java/seedu/savvytasker/testutil/TypicalTestTasks.java b/src/test/java/seedu/savvytasker/testutil/TypicalTestTasks.java index a89ccf000d95..9b49d7d50437 100644 --- a/src/test/java/seedu/savvytasker/testutil/TypicalTestTasks.java +++ b/src/test/java/seedu/savvytasker/testutil/TypicalTestTasks.java @@ -10,8 +10,9 @@ import seedu.savvytasker.model.task.TaskList.DuplicateTaskException; import seedu.savvytasker.model.task.TaskList.InvalidDateException; +//@@author A0139915W /** - * + * Test tasks used to test cases */ public class TypicalTestTasks { @@ -85,3 +86,4 @@ private Date getDate(String ddmmyyyy) { return null; } } +//@@author A0139915W From ecfaeda1f1345a2214dcda803e509cf6ce67b3b9 Mon Sep 17 00:00:00 2001 From: qhng Date: Wed, 26 Oct 2016 17:20:09 +0800 Subject: [PATCH 47/55] Collate update --- collated/main/A0139915W.md | 693 ++++++++++++++++-- collated/main/A0139915Wreused.md | 46 ++ collated/test/A0139915W.md | 354 +++++++++ .../ui/TaskPanelSelectionChangedEvent.java | 2 +- .../savvytasker/commons/util/StringUtil.java | 4 +- .../logic/commands/FindCommand.java | 2 + .../logic/commands/ModifyCommand.java | 4 +- .../logic/commands/SelectCommand.java | 2 +- .../logic/parser/FindCommandParser.java | 2 + .../seedu/savvytasker/model/ModelManager.java | 2 - .../seedu/savvytasker/model/SavvyTasker.java | 2 - .../savvytasker/model/task/ReadOnlyTask.java | 2 + .../seedu/savvytasker/model/task/Task.java | 2 + .../savvytasker/storage/XmlAdaptedTask.java | 2 + src/test/java/guitests/DeleteCommandTest.java | 2 + src/test/java/guitests/FindCommandTest.java | 2 + src/test/java/guitests/ListCommandTest.java | 2 + .../guitests/guihandles/TaskCardHandle.java | 2 + .../seedu/savvytasker/testutil/TestTask.java | 2 + 19 files changed, 1063 insertions(+), 66 deletions(-) create mode 100644 collated/main/A0139915Wreused.md diff --git a/collated/main/A0139915W.md b/collated/main/A0139915W.md index 773f4c1a3a22..ec1b02d09826 100644 --- a/collated/main/A0139915W.md +++ b/collated/main/A0139915W.md @@ -23,6 +23,10 @@ public class TaskPanelSelectionChangedEvent extends BaseEvent { return newSelection; } } +``` +###### \java\seedu\savvytasker\commons\events\ui\TaskPanelSelectionChangedEvent.java +``` java + ``` ###### \java\seedu\savvytasker\commons\util\SmartDefaultDates.java ``` java @@ -180,51 +184,6 @@ public class SmartDefaultDates { ###### \java\seedu\savvytasker\commons\util\SmartDefaultDates.java ``` java -``` -###### \java\seedu\savvytasker\commons\util\StringUtil.java -``` java - // reused original implementation of 'containsIgnoreCase' to find exact matches - public static boolean containsExactIgnoreCase(String source, String query) { - List strings = Arrays.asList(source); - return strings.stream().filter(s -> s.equalsIgnoreCase(query)).count() > 0; - } - - // reused original implementation of 'containsIgnoreCase' to find partial matches - public static boolean containsPartialIgnoreCase(String source, String query) { - if (source == null) return false; - String[] split = source.toLowerCase().split("\\s+"); - List strings = Arrays.asList(split); - return strings.stream().filter(s -> s.contains(query.toLowerCase())).count() > 0; - } -``` -###### \java\seedu\savvytasker\commons\util\StringUtil.java -``` java - - public static boolean containsIgnoreCase(String source, String query) { - String[] split = source.toLowerCase().split("\\s+"); - List strings = Arrays.asList(split); - return strings.stream().filter(s -> s.equals(query.toLowerCase())).count() > 0; - } - - /** - * Returns a detailed message of the t, including the stack trace. - */ - public static String getDetails(Throwable t){ - assert t != null; - StringWriter sw = new StringWriter(); - t.printStackTrace(new PrintWriter(sw)); - return t.getMessage() + "\n" + sw.toString(); - } - - /** - * Returns true if s represents an unsigned integer e.g. 1, 2, 3, ...
- * Will return false for null, empty string, "-1", "0", "+1", and " 2 " (untrimmed) "3 0" (contains whitespace). - * @param s Should be trimmed. - */ - public static boolean isUnsignedInteger(String s){ - return s != null && s.matches("^0*[1-9]\\d*$"); - } -} ``` ###### \java\seedu\savvytasker\logic\commands\AddCommand.java ``` java @@ -453,6 +412,75 @@ public class SmartDefaultDates { } } ``` +###### \java\seedu\savvytasker\logic\commands\FindCommand.java +``` java + public FindCommand(FindType findType, String[] keywords) { + this.findType = findType; + this.keywords = keywords; + } + + @Override + public CommandResult execute() { + FindType _findType = findType; + if (_findType == null) { + // use default find type, partial. + _findType = FindType.Partial; + } + model.updateFilteredTaskList(_findType, keywords); + return new CommandResult(getMessageForTaskListShownSummary(model.getFilteredTaskList().size())); + } +``` +###### \java\seedu\savvytasker\logic\commands\FindCommand.java +``` java + + /** + * Checks if a command can perform undo operations + * @return true if the command supports undo, false otherwise + */ + @Override + public boolean canUndo() { + return false; + } + + /** + * Redo the find command + * @return true if the operation completed successfully, false otherwise + */ + @Override + public boolean redo() { + // nothing required to be done + return false; + } + + /** + * Undo the find command + * @return true if the operation completed successfully, false otherwise + */ + @Override + public boolean undo() { + // nothing required to be done + return false; + } + + /** + * Check if command is an undo command + * @return true if the command is an undo operation, false otherwise + */ + @Override + public boolean isUndo() { + return false; + } + + /** + * Check if command is a redo command + * @return true if the command is a redo operation, false otherwise + */ + @Override + public boolean isRedo(){ + return false; + } +} +``` ###### \java\seedu\savvytasker\logic\commands\ListCommand.java ``` java /** @@ -540,6 +568,186 @@ public class SmartDefaultDates { } } +``` +###### \java\seedu\savvytasker\logic\commands\ModifyCommand.java +``` java + /** + * Creates an add command. + */ + public ModifyCommand(int index, String taskName, InferredDate startDateTime, InferredDate endDateTime, String location, + PriorityLevel priority, RecurrenceType recurringType, Integer numberOfRecurrence, String category, + String description) { + this.index = index; + this.taskName = taskName; + this.startDateTime = startDateTime; + this.endDateTime = endDateTime; + this.location = location; + this.priority = priority; + this.recurringType = recurringType; + this.numberOfRecurrence = numberOfRecurrence; + this.category = category; + this.description = description; + this.originalTask = null; + } + + @Override + public CommandResult execute() { + assert model != null; + + UnmodifiableObservableList lastShownList = model.getFilteredTaskList(); + + if (lastShownList.size() < index) { + indicateAttemptToExecuteIncorrectCommand(); + return new CommandResult(Messages.MESSAGE_INVALID_TASK_DISPLAYED_INDEX); + } + + + SmartDefaultDates sdd = new SmartDefaultDates(null, null); + + ReadOnlyTask taskToModify = lastShownList.get(index - 1); + replacement = new Task(taskToModify, taskName, sdd.getStart(startDateTime), + sdd.getEnd(endDateTime), location, priority, + recurringType, numberOfRecurrence, + category, description); + + try { + originalTask = (Task)taskToModify; + model.modifyTask(taskToModify, replacement); + } catch (TaskNotFoundException e) { + assert false : "The target task cannot be missing"; + } catch (InvalidDateException ex) { + return new CommandResult(Messages.MESSAGE_INVALID_START_END); + } + + return new CommandResult(String.format(MESSAGE_SUCCESS, replacement)); + } +``` +###### \java\seedu\savvytasker\logic\commands\ModifyCommand.java +``` java + + /** + * Checks if a command can perform undo operations + * @return true if the command supports undo, false otherwise + */ + @Override + public boolean canUndo() { + return true; + } + + /** + * Redo the add command + * @return true if the operation completed successfully, false otherwise + */ + @Override + public boolean redo() { + execute(); + return true; + } + + /** + * Undo the add command + * @return true if the operation completed successfully, false otherwise + */ + @Override + public boolean undo() { + + assert model != null; + + UnmodifiableObservableList lastShownList = model.getFilteredTaskList(); + ReadOnlyTask taskToModify = lastShownList.get(index - 1); + + try { + model.modifyTask(taskToModify, originalTask); + } catch (TaskNotFoundException e) { + assert false : "The target task cannot be missing"; + } catch (InvalidDateException ex) { + //TODO: Verify branch + //assert false : "The target task cannot be having an invalid start end "; + //return new CommandResult(Messages.MESSAGE_INVALID_START_END); + } + + return true; + } + + /** + * Check if command is an undo command + * @return true if the command is an undo operation, false otherwise + */ + @Override + public boolean isUndo() { + return false; + } + + /** + * Check if command is a redo command + * @return true if the command is a redo operation, false otherwise + */ + @Override + public boolean isRedo(){ + return false; + } +} +``` +###### \java\seedu\savvytasker\logic\parser\FindCommandParser.java +``` java + @Override + public FindCommand parse(String commandText) throws ParseException { + Matcher matcher = REGEX_PATTERN.matcher(commandText); + if (matcher.matches()) { + FindType findType = parseFindType(matcher.group(REGEX_REF_FIND_TYPE)); + String[] keywords = parseKeywords(matcher.group(REGEX_REF_KEYWORDS_BEFORE_TYPE), + matcher.group(REGEX_REF_KEYWORDS_AFTER_TYPE)); + + return new FindCommand(findType, keywords); + } + + throw new ParseException(commandText, String.format(Messages.MESSAGE_INVALID_COMMAND_FORMAT, getRequiredFormat())); + } +``` +###### \java\seedu\savvytasker\logic\parser\FindCommandParser.java +``` java + + private FindType parseFindType(String findTypeText) throws ParseException { + if (findTypeText == null) + return null; + + String trimmedFindTypeText = findTypeText.trim(); + try { + return FindType.valueOfIgnoreCase(trimmedFindTypeText); + } catch (IllegalArgumentException ex) { + throw new ParseException(trimmedFindTypeText, "FIND_TYPE: Unknown type '" + findTypeText + "'"); + } + } + + private String[] parseKeywords(String keywordsBefore, String keywordsAfter) throws ParseException { + String trimmedKeywordsBefore = keywordsBefore.trim(); + String trimmedKeywordsAfter = keywordsAfter.trim(); + + String[] keywordsArr1 = new String[0]; + String[] keywordsArr2 = new String[0]; + if (!trimmedKeywordsBefore.isEmpty()) keywordsArr1 = trimmedKeywordsBefore.split("\\s+"); + if (!trimmedKeywordsAfter.isEmpty()) keywordsArr2 = trimmedKeywordsAfter.split("\\s+"); + + if (keywordsArr1.length == 0 && keywordsArr2.length == 0) + throw new ParseException(trimmedKeywordsBefore + " ... " + trimmedKeywordsAfter, + "KEYWORD: Need to specify at least one keyword!"); + + return concatArray(keywordsArr1, keywordsArr2); + } + + /** + * Concatenates 2 arrays into 1 array, in the order the arrays are given. + * + * @param array1 the first array + * @param array2 the second array + * @return the new array with the values from each of the given array added into it in order + */ + private String[] concatArray(String[] array1, String[] array2) { + String[] newArray = Arrays.copyOf(array1, array1.length + array2.length); + System.arraycopy(array2, 0, newArray, array1.length, array2.length); + return newArray; + } +} ``` ###### \java\seedu\savvytasker\model\Model.java ``` java @@ -590,13 +798,7 @@ public class SmartDefaultDates { private final SavvyTasker savvyTasker; private final FilteredList filteredTasks; private final SortedList sortedAndFilteredTasks; -``` -###### \java\seedu\savvytasker\model\ModelManager.java -``` java -``` -###### \java\seedu\savvytasker\model\ModelManager.java -``` java /** * Initializes a ModelManager with the given SavvyTasker * and its variables should not be null @@ -1093,9 +1295,6 @@ public class SmartDefaultDates { ``` java private final AliasSymbolList symbols; -``` -###### \java\seedu\savvytasker\model\SavvyTasker.java -``` java public SavvyTasker() { this.tasks = new TaskList(); this.symbols = new AliasSymbolList(); @@ -1132,9 +1331,6 @@ public class SmartDefaultDates { public void resetData(ReadOnlySavvyTasker newData) { resetData(newData.getReadOnlyListOfTasks()); } -``` -###### \java\seedu\savvytasker\model\SavvyTasker.java -``` java //// symbol/task-level operations @@ -1244,6 +1440,308 @@ public class SmartDefaultDates { return Objects.hash(tasks, symbols); } } +``` +###### \java\seedu\savvytasker\model\task\ReadOnlyTask.java +``` java +/** + * A read-only immutable interface for a Task in the TaskList. + * Implementations should guarantee: details are present and not null, field values are validated. + */ +public interface ReadOnlyTask { + + int getId(); + boolean isMarked(); + boolean isArchived(); + String getTaskName(); + Date getStartDateTime(); + Date getEndDateTime(); + String getLocation(); + PriorityLevel getPriority(); + RecurrenceType getRecurringType(); + int getNumberOfRecurrence(); + String getCategory(); + String getDescription(); + + /** + * Returns true if both tasks have the same state. (interfaces cannot override .equals) + */ + default boolean isSameStateAs(ReadOnlyTask other) { + return getId() == other.getId(); + } + + /** + * Formats the task as text, showing all task details. + */ + default String getAsText() { + final StringBuilder builder = new StringBuilder(); + builder.append(" Id: ") + .append(getId()) + .append(" Task Name: ") + .append(getTaskName()) + .append(" Archived: ") + .append(isArchived()) + .append(" Start: ") + .append(getStartDateTime()) + .append(" End: ") + .append(getEndDateTime()) + .append(" Location: ") + .append(getLocation()) + .append(" Priority: ") + .append(getPriority()) + .append(" Recurring Type: ") + .append(getRecurringType()) + .append(" Nr. Recurrence: ") + .append(getNumberOfRecurrence()) + .append(" Category: ") + .append(getCategory()) + .append(" Description: ") + .append(getDescription()); + return builder.toString(); + } + +} +``` +###### \java\seedu\savvytasker\model\task\ReadOnlyTask.java +``` java + +``` +###### \java\seedu\savvytasker\model\task\Task.java +``` java +/** + * Represents a Task in the task list. + */ +public class Task implements ReadOnlyTask { + + private int id; + private String taskName; + private Date startDateTime; + private Date endDateTime; + private String location; + private PriorityLevel priority; + private RecurrenceType recurringType; + private int numberOfRecurrence; + private String category; + private String description; + private boolean isArchived; + + public Task(int id, String taskName, Date startDateTime, Date endDateTime, String location, + PriorityLevel priority, RecurrenceType recurringType, Integer numberOfRecurrence, + String category, String description, boolean isArchived) { + this.id = id; + this.taskName = taskName; + this.startDateTime = startDateTime; + this.endDateTime = endDateTime; + this.location = location; + if (priority == null) { + this.priority = PriorityLevel.Medium; + } else { + this.priority = priority; + } + if (recurringType == null) { + this.recurringType = RecurrenceType.None; + } else { + this.recurringType = recurringType; + } + if (numberOfRecurrence == null) { + this.numberOfRecurrence = 0; + } else { + this.numberOfRecurrence = numberOfRecurrence.intValue(); + } + this.category = category; + this.description = description; + this.isArchived = isArchived; + } + + public Task(String taskName) { + this.taskName = taskName; + // sets initial default values + this.priority = PriorityLevel.Medium; + this.recurringType = RecurrenceType.None; + this.numberOfRecurrence = 0; + } + + /** + * Copy constructor. + */ + public Task(ReadOnlyTask source) { + this(source.getId(), source.getTaskName(), source.getStartDateTime(), + source.getEndDateTime(), source.getLocation(), source.getPriority(), + source.getRecurringType(), source.getNumberOfRecurrence(), + source.getCategory(), source.getDescription(), source.isArchived()); + } + + /** + * Copy and modify constructor + */ + public Task(ReadOnlyTask source, String taskName, Date startDateTime, Date endDateTime, String location, + PriorityLevel priority, RecurrenceType recurringType, Integer numberOfRecurrence, String category, + String description) { + this(source.getId(), source.getTaskName(), source.getStartDateTime(), + source.getEndDateTime(), source.getLocation(), source.getPriority(), + source.getRecurringType(), source.getNumberOfRecurrence(), + source.getCategory(), source.getDescription(), source.isArchived()); + + //this.id should follow that of the source. + //this.isArchived should follow that of the source. + this.taskName = taskName == null ? this.taskName : taskName; + this.startDateTime = startDateTime == null ? this.startDateTime : startDateTime; + this.endDateTime = endDateTime == null ? this.endDateTime : endDateTime; + this.location = location == null ? this.location : location; + this.priority = priority == null ? this.priority : priority; + this.recurringType = recurringType == null ? this.recurringType : recurringType; + this.numberOfRecurrence = numberOfRecurrence == null ? this.numberOfRecurrence : numberOfRecurrence.intValue(); + this.category = category == null ? this.category : category; + this.description = description == null ? this.description : description; + } + + @Override + public int getId() { + return this.id; + } + + @Override + public boolean isMarked() { + return isArchived(); // all marked tasks are archived + } + + @Override + public boolean isArchived() { + return this.isArchived; + } + + @Override + public String getTaskName() { + return taskName; + } + + @Override + public Date getStartDateTime() { + return startDateTime; + } + + @Override + public Date getEndDateTime() { + return endDateTime; + } + + @Override + public String getLocation() { + return location; + } + + @Override + public PriorityLevel getPriority() { + return priority; + } + + @Override + public RecurrenceType getRecurringType() { + return recurringType; + } + + @Override + public int getNumberOfRecurrence() { + return numberOfRecurrence; + } + + @Override + public String getCategory() { + return category; + } + + @Override + public String getDescription() { + return description; + } + + public void setId(int id) { + this.id = id; + } + + public void setTaskName(String taskName) { + this.taskName = taskName; + } + + public void setStartDateTime(Date startDateTime) { + this.startDateTime = startDateTime; + } + + public void setEndDateTime(Date endDateTime) { + this.endDateTime = endDateTime; + } + + public void setLocation(String location) { + this.location = location; + } + + public void setPriority(PriorityLevel priority) { + this.priority = priority; + } + + public void setRecurringType(RecurrenceType recurringType) { + this.recurringType = recurringType; + } + + public void setNumberOfRecurrence(int numberOfRecurrence) { + this.numberOfRecurrence = numberOfRecurrence; + } + + public void setCategory(String category) { + this.category = category; + } + + public void setDescription(String description) { + this.description = description; + } + + public void setArchived(boolean isArchived) { + if (isArchived) mark(); + else unmark(); + } + + /** + * Marks the task as complete, also moves this task from the active list + * to the archived list. + */ + public void mark() { + if (!isMarked()) { + this.isArchived = true; + } + } + + /** + * Unmarks the task as complete, also moves this task from the archived list + * to the active list. + */ + public void unmark() { + if (isMarked()) { + this.isArchived = false; + } + } + + @Override + public boolean equals(Object other) { + return other == this // short circuit if same object + || (other instanceof ReadOnlyTask // instanceof handles nulls + && this.isSameStateAs((ReadOnlyTask) other)); + } + + @Override + public int hashCode() { + // use this method for custom fields hashing instead of implementing your own + return Objects.hash(taskName); + } + + @Override + public String toString() { + return getAsText(); + } + +} +``` +###### \java\seedu\savvytasker\model\task\Task.java +``` java + ``` ###### \java\seedu\savvytasker\model\task\TaskList.java ``` java @@ -1428,3 +1926,84 @@ public class TaskList implements Iterable { ``` java ``` +###### \java\seedu\savvytasker\storage\XmlAdaptedTask.java +``` java +/** + * JAXB-friendly version of the Task. + */ +public class XmlAdaptedTask { + + @XmlElement(required = true) + private int id; + @XmlElement(required = true) + private String taskName; + @XmlElement(required = false) + private Date startDateTime; + @XmlElement(required = false) + private Date endDateTime; + @XmlElement(required = false) + private String location; + @XmlElement(required = false) + private PriorityLevel priority; + @XmlElement(required = false) + private RecurrenceType recurringType; + @XmlElement(required = false) + private int numberOfRecurrence; + @XmlElement(required = false) + private String category; + @XmlElement(required = false) + private String description; + @XmlElement(required = true) + private boolean isArchived; + + /** + * No-arg constructor for JAXB use. + */ + public XmlAdaptedTask() {} + + + /** + * Converts a given Task into this class for JAXB use. + * + * @param source future changes to this will not affect the created XmlAdaptedTask + */ + public XmlAdaptedTask(ReadOnlyTask source) { + id = source.getId(); + taskName = source.getTaskName(); + startDateTime = source.getStartDateTime(); + endDateTime = source.getEndDateTime(); + location = source.getLocation(); + priority = source.getPriority(); + recurringType = source.getRecurringType(); + numberOfRecurrence = source.getNumberOfRecurrence(); + category = source.getCategory(); + description = source.getDescription(); + isArchived = source.isArchived(); + } + + /** + * Converts this jaxb-friendly adapted task object into the model's Task object. + * + * @throws IllegalValueException if there were any data constraints violated in the adapted Task + */ + public Task toModelType() throws IllegalValueException { + final int id = this.id; + final String taskName = this.taskName; + final Date startDateTime = this.startDateTime; + final Date endDateTime = this.endDateTime; + final String location = this.location; + final PriorityLevel priority = this.priority; + final RecurrenceType recurringType = this.recurringType; + final int numberOfRecurrence = this.numberOfRecurrence; + final String category = this.category; + final String description = this.description; + final boolean isArchived = this.isArchived; + return new Task(id, taskName, startDateTime, endDateTime, location, priority, + recurringType, numberOfRecurrence, category, description, isArchived); + } +} +``` +###### \java\seedu\savvytasker\storage\XmlAdaptedTask.java +``` java + +``` diff --git a/collated/main/A0139915Wreused.md b/collated/main/A0139915Wreused.md new file mode 100644 index 000000000000..f3b0f9c8b730 --- /dev/null +++ b/collated/main/A0139915Wreused.md @@ -0,0 +1,46 @@ +# A0139915Wreused +###### \java\seedu\savvytasker\commons\util\StringUtil.java +``` java + // reused original implementation of 'containsIgnoreCase' to find exact matches + public static boolean containsExactIgnoreCase(String source, String query) { + List strings = Arrays.asList(source); + return strings.stream().filter(s -> s.equalsIgnoreCase(query)).count() > 0; + } + + // reused original implementation of 'containsIgnoreCase' to find partial matches + public static boolean containsPartialIgnoreCase(String source, String query) { + if (source == null) return false; + String[] split = source.toLowerCase().split("\\s+"); + List strings = Arrays.asList(split); + return strings.stream().filter(s -> s.contains(query.toLowerCase())).count() > 0; + } +``` +###### \java\seedu\savvytasker\commons\util\StringUtil.java +``` java + + public static boolean containsIgnoreCase(String source, String query) { + String[] split = source.toLowerCase().split("\\s+"); + List strings = Arrays.asList(split); + return strings.stream().filter(s -> s.equals(query.toLowerCase())).count() > 0; + } + + /** + * Returns a detailed message of the t, including the stack trace. + */ + public static String getDetails(Throwable t){ + assert t != null; + StringWriter sw = new StringWriter(); + t.printStackTrace(new PrintWriter(sw)); + return t.getMessage() + "\n" + sw.toString(); + } + + /** + * Returns true if s represents an unsigned integer e.g. 1, 2, 3, ...
+ * Will return false for null, empty string, "-1", "0", "+1", and " 2 " (untrimmed) "3 0" (contains whitespace). + * @param s Should be trimmed. + */ + public static boolean isUnsignedInteger(String s){ + return s != null && s.matches("^0*[1-9]\\d*$"); + } +} +``` diff --git a/collated/test/A0139915W.md b/collated/test/A0139915W.md index b023e9452f3e..e4e1b66b7d6b 100644 --- a/collated/test/A0139915W.md +++ b/collated/test/A0139915W.md @@ -42,6 +42,160 @@ public class AddCommandTest extends SavvyTaskerGuiTest { ###### \java\guitests\AddCommandTest.java ``` java +``` +###### \java\guitests\DeleteCommandTest.java +``` java +public class DeleteCommandTest extends SavvyTaskerGuiTest { + + @Test + public void delete() { + + //delete the first in the list + TestTask[] currentList = td.getTypicalTasks(); + int targetIndex = 1; + + assertDeleteSuccess(targetIndex, currentList); + + //delete the last in the list + + currentList = TestUtil.removeTaskFromList(currentList, targetIndex); + targetIndex = currentList.length; + assertDeleteSuccess(targetIndex, currentList); + + //delete from the middle of the list + currentList = TestUtil.removeTaskFromList(currentList, targetIndex); + targetIndex = currentList.length/2; + assertDeleteSuccess(targetIndex, currentList); + + //invalid index + commandBox.runCommand("delete " + currentList.length + 1); + assertResultMessage("The task index provided is invalid"); + + } + + /** + * Runs the delete command to delete the person at specified index and confirms the result is correct. + * @param targetIndexOneIndexed e.g. to delete the first person in the list, 1 should be given as the target index. + * @param currentList A copy of the current list of persons (before deletion). + */ + private void assertDeleteSuccess(int targetIndexOneIndexed, final TestTask[] currentList) { + TestTask taskToDelete = currentList[targetIndexOneIndexed-1]; //-1 because array uses zero indexing + TestTask[] expectedRemainder = TestUtil.removeTaskFromList(currentList, targetIndexOneIndexed); + + commandBox.runCommand("delete " + targetIndexOneIndexed); + + //confirm the list now contains all previous persons except the deleted person + assertTrue(taskListPanel.isListMatching(expectedRemainder)); + + //confirm the result message is correct + assertResultMessage(String.format(MESSAGE_DELETE_TASK_SUCCESS, taskToDelete)); + } + +} +``` +###### \java\guitests\DeleteCommandTest.java +``` java + +``` +###### \java\guitests\FindCommandTest.java +``` java +public class FindCommandTest extends SavvyTaskerGuiTest { + + @Test + public void find_nonEmptyList() { + assertFindResult("find Zoo"); //no results + assertFindResult("find Priority", td.highPriority, td.medPriority, td.lowPriority); //multiple results + + //find after deleting one result + commandBox.runCommand("delete 1"); + assertFindResult("find Priority", td.medPriority, td.lowPriority); + } + + @Test + public void find_nonEmptyList_byPartialMatch() { + // covered by find_nonEmptyList() + } + + @Test + public void find_nonEmptyList_byFullMatch() { + assertFindResult("find t/full Due", td.furthestDue, td.nearerDue, + td.notSoNearerDue, td.earliestDue, td.longDue); //multiple results + } + + @Test + public void find_nonEmptyList_byExactMatch() { + assertFindResult("find t/exact Nearer Due Task", td.nearerDue); // one matching result only + } + + @Test + public void find_emptyList(){ + commandBox.runCommand("clear"); + assertFindResult("find Shopping"); //no results + } + + @Test + public void find_invalidCommand_fail() { + commandBox.runCommand("findmyring"); + assertResultMessage(Messages.MESSAGE_UNKNOWN_COMMAND); + } + + private void assertFindResult(String command, TestTask... expectedHits) { + commandBox.runCommand(command); + assertListSize(expectedHits.length); + assertResultMessage(expectedHits.length + " tasks listed!"); + assertTrue(taskListPanel.isListMatching(expectedHits)); + } +} +``` +###### \java\guitests\FindCommandTest.java +``` java + +``` +###### \java\guitests\guihandles\TaskCardHandle.java +``` java +/** + * Provides a handle to a person card in the person list panel. + */ +public class TaskCardHandle extends GuiHandle { + private static final String TASKNAME_FIELD_ID = "#taskName"; + + private Node node; + + public TaskCardHandle(GuiRobot guiRobot, Stage primaryStage, Node node){ + super(guiRobot, primaryStage, null); + this.node = node; + } + + protected String getTextFromLabel(String fieldId) { + return getTextFromLabel(fieldId, node); + } + + public String getTaskName() { + return getTextFromLabel(TASKNAME_FIELD_ID); + } + + public boolean isSameTask(ReadOnlyTask task) { + return getTaskName().equals(task.getTaskName()); + } + + @Override + public boolean equals(Object obj) { + if(obj instanceof TaskCardHandle) { + TaskCardHandle handle = (TaskCardHandle) obj; + return getTaskName().equals(handle.getTaskName()); //TODO: compare the rest + } + return super.equals(obj); + } + + @Override + public String toString() { + return getTaskName(); + } +} +``` +###### \java\guitests\guihandles\TaskCardHandle.java +``` java + ``` ###### \java\guitests\guihandles\TaskListPanelHandle.java ``` java @@ -204,6 +358,61 @@ public class TaskListPanelHandle extends GuiHandle { ###### \java\guitests\guihandles\TaskListPanelHandle.java ``` java +``` +###### \java\guitests\ListCommandTest.java +``` java +public class ListCommandTest extends SavvyTaskerGuiTest { + + @Test + public void list_nonEmptyList() { + assertListResult("list", td.earliestDue, td.nearerDue, td.notSoNearerDue, td.furthestDue, + td.highPriority, td.medPriority, td.lowPriority); //multiple results + + //list after deleting one result + commandBox.runCommand("delete 1"); + assertListResult("list", td.nearerDue, td.notSoNearerDue, td.furthestDue, + td.highPriority, td.medPriority, td.lowPriority); + } + + @Test + public void list_nonEmptyList_byDueDate() { + // covered by list_nonEmptyList() + } + + @Test + public void list_nonEmptyList_byPriority() { + assertListResult("list t/PriorityLevel", td.highPriority, td.medPriority, + td.furthestDue, td.nearerDue, td.notSoNearerDue, td.earliestDue, td.lowPriority); //multiple results + } + + @Test + public void list_nonEmptyList_byArchived() { + assertListResult("list t/Archived", td.longDue); // one matching result only + } + + @Test + public void list_emptyList(){ + commandBox.runCommand("clear"); + assertListResult("list"); //no results + } + + @Test + public void find_invalidCommand_fail() { + commandBox.runCommand("listmytasks"); + assertResultMessage(Messages.MESSAGE_UNKNOWN_COMMAND); + } + + private void assertListResult(String command, TestTask... expectedHits ) { + commandBox.runCommand(command); + assertListSize(expectedHits.length); + assertResultMessage(expectedHits.length + " tasks listed!"); + assertTrue(taskListPanel.isListMatching(expectedHits)); + } +} +``` +###### \java\guitests\ListCommandTest.java +``` java + ``` ###### \java\seedu\savvytasker\testutil\SavvyTaskerBuilder.java ``` java @@ -311,6 +520,151 @@ public class TaskBuilder { ###### \java\seedu\savvytasker\testutil\TaskBuilder.java ``` java +``` +###### \java\seedu\savvytasker\testutil\TestTask.java +``` java +/** + * A mutable task object. For testing only. + */ +public class TestTask implements ReadOnlyTask { + + private int id; + private String taskName; + private Date startDateTime; + private Date endDateTime; + private String location; + private PriorityLevel priority; + private RecurrenceType recurringType; + private int numberOfRecurrence; + private String category; + private String description; + private boolean isArchived; + + public TestTask() { + // sets initial default values + this.priority = PriorityLevel.Medium; + this.recurringType = RecurrenceType.None; + this.numberOfRecurrence = 0; + } + + public int getId() { + return id; + } + + @Override + public String getTaskName() { + return taskName; + } + + @Override + public Date getStartDateTime() { + return startDateTime; + } + + @Override + public Date getEndDateTime() { + return endDateTime; + } + + @Override + public String getLocation() { + return location; + } + + @Override + public PriorityLevel getPriority() { + return priority; + } + + @Override + public RecurrenceType getRecurringType() { + return recurringType; + } + + @Override + public int getNumberOfRecurrence() { + return numberOfRecurrence; + } + + @Override + public String getCategory() { + return category; + } + + @Override + public String getDescription() { + return description; + } + + @Override + public boolean isMarked() { + return isArchived(); // all marked tasks are archived + } + + @Override + public boolean isArchived() { + return isArchived; + } + + public void setId(int id) { + this.id = id; + } + + public void setTaskName(String taskName) { + this.taskName = taskName; + } + + public void setStartDateTime(Date startDateTime) { + this.startDateTime = startDateTime; + } + + public void setEndDateTime(Date endDateTime) { + this.endDateTime = endDateTime; + } + + public void setLocation(String location) { + this.location = location; + } + + public void setPriority(PriorityLevel priority) { + this.priority = priority; + } + + public void setRecurringType(RecurrenceType recurringType) { + this.recurringType = recurringType; + } + + public void setNumberOfRecurrence(int numberOfRecurrence) { + this.numberOfRecurrence = numberOfRecurrence; + } + + public void setCategory(String category) { + this.category = category; + } + + public void setDescription(String description) { + this.description = description; + } + + public void setArchived(boolean isArchived) { + this.isArchived = isArchived; + } + + @Override + public String toString() { + return getAsText(); + } + + public String getAddCommand() { + StringBuilder sb = new StringBuilder(); + sb.append("add " + this.getTaskName()); + return sb.toString(); + } +} +``` +###### \java\seedu\savvytasker\testutil\TestTask.java +``` java + ``` ###### \java\seedu\savvytasker\testutil\TestUtil.java ``` java diff --git a/src/main/java/seedu/savvytasker/commons/events/ui/TaskPanelSelectionChangedEvent.java b/src/main/java/seedu/savvytasker/commons/events/ui/TaskPanelSelectionChangedEvent.java index 317fa9e493ba..613feb7a8c66 100644 --- a/src/main/java/seedu/savvytasker/commons/events/ui/TaskPanelSelectionChangedEvent.java +++ b/src/main/java/seedu/savvytasker/commons/events/ui/TaskPanelSelectionChangedEvent.java @@ -26,4 +26,4 @@ public ReadOnlyTask getNewSelection() { return newSelection; } } -//@@author \ No newline at end of file +//@@author A0139915W \ No newline at end of file diff --git a/src/main/java/seedu/savvytasker/commons/util/StringUtil.java b/src/main/java/seedu/savvytasker/commons/util/StringUtil.java index d9345fe3a922..4e112a55bbe1 100644 --- a/src/main/java/seedu/savvytasker/commons/util/StringUtil.java +++ b/src/main/java/seedu/savvytasker/commons/util/StringUtil.java @@ -9,7 +9,7 @@ * Helper functions for handling strings. */ public class StringUtil { - //@@author A0139915W + //@@author A0139915W-reused // reused original implementation of 'containsIgnoreCase' to find exact matches public static boolean containsExactIgnoreCase(String source, String query) { List strings = Arrays.asList(source); @@ -23,7 +23,7 @@ public static boolean containsPartialIgnoreCase(String source, String query) { List strings = Arrays.asList(split); return strings.stream().filter(s -> s.contains(query.toLowerCase())).count() > 0; } - //@@author A0139915W + //@@author A0139915W-reused public static boolean containsIgnoreCase(String source, String query) { String[] split = source.toLowerCase().split("\\s+"); diff --git a/src/main/java/seedu/savvytasker/logic/commands/FindCommand.java b/src/main/java/seedu/savvytasker/logic/commands/FindCommand.java index 9d07d32e2cc1..703ce07dd5b0 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/FindCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/FindCommand.java @@ -20,6 +20,7 @@ public class FindCommand extends ModelRequiringCommand { private final FindType findType; private final String[] keywords; + //@@author A0139915W public FindCommand(FindType findType, String[] keywords) { this.findType = findType; this.keywords = keywords; @@ -35,6 +36,7 @@ public CommandResult execute() { model.updateFilteredTaskList(_findType, keywords); return new CommandResult(getMessageForTaskListShownSummary(model.getFilteredTaskList().size())); } + //@@author A0139915W /** * Checks if a command can perform undo operations diff --git a/src/main/java/seedu/savvytasker/logic/commands/ModifyCommand.java b/src/main/java/seedu/savvytasker/logic/commands/ModifyCommand.java index 1d7d1be6a74f..368baaa938ec 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/ModifyCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/ModifyCommand.java @@ -39,7 +39,8 @@ public class ModifyCommand extends ModelRequiringCommand { private final Integer numberOfRecurrence; private final String category; private final String description; - + + //@@author A0139915W /** * Creates an add command. */ @@ -90,6 +91,7 @@ public CommandResult execute() { return new CommandResult(String.format(MESSAGE_SUCCESS, replacement)); } + //@@author A0139915W /** * Checks if a command can perform undo operations diff --git a/src/main/java/seedu/savvytasker/logic/commands/SelectCommand.java b/src/main/java/seedu/savvytasker/logic/commands/SelectCommand.java index 1478b31f11fc..1497549c6821 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/SelectCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/SelectCommand.java @@ -1,4 +1,4 @@ -package seedu.savvytasker.logic.commands; + package seedu.savvytasker.logic.commands; import seedu.savvytasker.commons.core.EventsCenter; import seedu.savvytasker.commons.core.Messages; diff --git a/src/main/java/seedu/savvytasker/logic/parser/FindCommandParser.java b/src/main/java/seedu/savvytasker/logic/parser/FindCommandParser.java index de681a8c61a5..8a65a86e43f7 100644 --- a/src/main/java/seedu/savvytasker/logic/parser/FindCommandParser.java +++ b/src/main/java/seedu/savvytasker/logic/parser/FindCommandParser.java @@ -32,6 +32,7 @@ public String getRequiredFormat() { return READABLE_FORMAT; } + //@@author A0139915W @Override public FindCommand parse(String commandText) throws ParseException { Matcher matcher = REGEX_PATTERN.matcher(commandText); @@ -45,6 +46,7 @@ public FindCommand parse(String commandText) throws ParseException { throw new ParseException(commandText, String.format(Messages.MESSAGE_INVALID_COMMAND_FORMAT, getRequiredFormat())); } + //@@author A0139915W private FindType parseFindType(String findTypeText) throws ParseException { if (findTypeText == null) diff --git a/src/main/java/seedu/savvytasker/model/ModelManager.java b/src/main/java/seedu/savvytasker/model/ModelManager.java index 41beb7878dc4..39f1eae51f0e 100644 --- a/src/main/java/seedu/savvytasker/model/ModelManager.java +++ b/src/main/java/seedu/savvytasker/model/ModelManager.java @@ -37,9 +37,7 @@ public class ModelManager extends ComponentManager implements Model { private final SavvyTasker savvyTasker; private final FilteredList filteredTasks; private final SortedList sortedAndFilteredTasks; - //@@author A0139915W - //@@author A0139915W /** * Initializes a ModelManager with the given SavvyTasker * and its variables should not be null diff --git a/src/main/java/seedu/savvytasker/model/SavvyTasker.java b/src/main/java/seedu/savvytasker/model/SavvyTasker.java index 5c03abca8623..5d9a3fe81c94 100644 --- a/src/main/java/seedu/savvytasker/model/SavvyTasker.java +++ b/src/main/java/seedu/savvytasker/model/SavvyTasker.java @@ -29,7 +29,6 @@ public class SavvyTasker implements ReadOnlySavvyTasker { //@@author A0139915W private final AliasSymbolList symbols; - //@@author A0139915W public SavvyTasker() { this.tasks = new TaskList(); this.symbols = new AliasSymbolList(); @@ -66,7 +65,6 @@ public void resetData(Collection newTasks) { public void resetData(ReadOnlySavvyTasker newData) { resetData(newData.getReadOnlyListOfTasks()); } - //@@author A0139915W //// symbol/task-level operations diff --git a/src/main/java/seedu/savvytasker/model/task/ReadOnlyTask.java b/src/main/java/seedu/savvytasker/model/task/ReadOnlyTask.java index c69fb332fae8..9dc927a534b4 100644 --- a/src/main/java/seedu/savvytasker/model/task/ReadOnlyTask.java +++ b/src/main/java/seedu/savvytasker/model/task/ReadOnlyTask.java @@ -2,6 +2,7 @@ import java.util.Date; +//@@author A0139915W /** * A read-only immutable interface for a Task in the TaskList. * Implementations should guarantee: details are present and not null, field values are validated. @@ -59,3 +60,4 @@ default String getAsText() { } } +//@@author A0139915W diff --git a/src/main/java/seedu/savvytasker/model/task/Task.java b/src/main/java/seedu/savvytasker/model/task/Task.java index 006bb51a56e3..5166bf22ea74 100644 --- a/src/main/java/seedu/savvytasker/model/task/Task.java +++ b/src/main/java/seedu/savvytasker/model/task/Task.java @@ -3,6 +3,7 @@ import java.util.Date; import java.util.Objects; +//@@author A0139915W /** * Represents a Task in the task list. */ @@ -234,3 +235,4 @@ public String toString() { } } +//@@author A0139915W diff --git a/src/main/java/seedu/savvytasker/storage/XmlAdaptedTask.java b/src/main/java/seedu/savvytasker/storage/XmlAdaptedTask.java index b887f3a7ddb1..c2986b2d2101 100644 --- a/src/main/java/seedu/savvytasker/storage/XmlAdaptedTask.java +++ b/src/main/java/seedu/savvytasker/storage/XmlAdaptedTask.java @@ -10,6 +10,7 @@ import seedu.savvytasker.model.task.RecurrenceType; import seedu.savvytasker.model.task.Task; +//@@author A0139915W /** * JAXB-friendly version of the Task. */ @@ -84,3 +85,4 @@ public Task toModelType() throws IllegalValueException { recurringType, numberOfRecurrence, category, description, isArchived); } } +//@@author A0139915W diff --git a/src/test/java/guitests/DeleteCommandTest.java b/src/test/java/guitests/DeleteCommandTest.java index 8a1d371f2841..67ce599dabb2 100644 --- a/src/test/java/guitests/DeleteCommandTest.java +++ b/src/test/java/guitests/DeleteCommandTest.java @@ -8,6 +8,7 @@ import static org.junit.Assert.assertTrue; import static seedu.savvytasker.logic.commands.DeleteCommand.MESSAGE_DELETE_TASK_SUCCESS; +//@@author A0139915W public class DeleteCommandTest extends SavvyTaskerGuiTest { @Test @@ -55,3 +56,4 @@ private void assertDeleteSuccess(int targetIndexOneIndexed, final TestTask[] cur } } +//@@author A0139915W diff --git a/src/test/java/guitests/FindCommandTest.java b/src/test/java/guitests/FindCommandTest.java index 57f8aae9ce6c..b85c93978a5e 100644 --- a/src/test/java/guitests/FindCommandTest.java +++ b/src/test/java/guitests/FindCommandTest.java @@ -7,6 +7,7 @@ import static org.junit.Assert.assertTrue; +//@@author A0139915W public class FindCommandTest extends SavvyTaskerGuiTest { @Test @@ -54,3 +55,4 @@ private void assertFindResult(String command, TestTask... expectedHits) { assertTrue(taskListPanel.isListMatching(expectedHits)); } } +//@@author A0139915W diff --git a/src/test/java/guitests/ListCommandTest.java b/src/test/java/guitests/ListCommandTest.java index d068b12b5855..f42757d2f532 100644 --- a/src/test/java/guitests/ListCommandTest.java +++ b/src/test/java/guitests/ListCommandTest.java @@ -7,6 +7,7 @@ import static org.junit.Assert.assertTrue; +//@@author A0139915W public class ListCommandTest extends SavvyTaskerGuiTest { @Test @@ -55,3 +56,4 @@ private void assertListResult(String command, TestTask... expectedHits ) { assertTrue(taskListPanel.isListMatching(expectedHits)); } } +//@@author A0139915W diff --git a/src/test/java/guitests/guihandles/TaskCardHandle.java b/src/test/java/guitests/guihandles/TaskCardHandle.java index 0eb1d2b9114b..e2d85795df11 100644 --- a/src/test/java/guitests/guihandles/TaskCardHandle.java +++ b/src/test/java/guitests/guihandles/TaskCardHandle.java @@ -5,6 +5,7 @@ import javafx.stage.Stage; import seedu.savvytasker.model.task.ReadOnlyTask; +//@@author A0139915W /** * Provides a handle to a person card in the person list panel. */ @@ -44,3 +45,4 @@ public String toString() { return getTaskName(); } } +//@@author A0139915W diff --git a/src/test/java/seedu/savvytasker/testutil/TestTask.java b/src/test/java/seedu/savvytasker/testutil/TestTask.java index d47f7ee3bee0..ad77c6b8be3b 100644 --- a/src/test/java/seedu/savvytasker/testutil/TestTask.java +++ b/src/test/java/seedu/savvytasker/testutil/TestTask.java @@ -6,6 +6,7 @@ import seedu.savvytasker.model.task.ReadOnlyTask; import seedu.savvytasker.model.task.RecurrenceType; +//@@author A0139915W /** * A mutable task object. For testing only. */ @@ -144,3 +145,4 @@ public String getAddCommand() { return sb.toString(); } } +//@@author A0139915W From 570ccb6bd648952c842147121b59a5dbfed17bda Mon Sep 17 00:00:00 2001 From: Qing Hua Date: Wed, 26 Oct 2016 17:40:46 +0800 Subject: [PATCH 48/55] Update DeveloperGuide.md --- docs/DeveloperGuide.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 0edce898baca..3c4c7d6661a2 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -581,3 +581,29 @@ Use case ends. 4. Auto sync with Gmail (Firefox plugin), Google Calendar, Twitter (direct integration), Atom/RSS, IM (feed) 5. Email notifications, autoprocess 6. API
+ + +#### Competing product: MIUI Calendar + +**Pros:** + +1. Able to sync to different devices +2. Able to set privacy to private or public +3. Able to set 2 reminders +4. Able to set reminder as a notification popup or an alarm + +**Cons:** + +1. Unable to check(tick) completed event +2. Does not cater for tasks, only events + + +#### Competing product: WunderList + +**Pros:** + +1. + +**Cons:** + +1. From a37fa41e1405a56047710ed6aa621035f6998241 Mon Sep 17 00:00:00 2001 From: Qing Hua Date: Wed, 26 Oct 2016 17:48:03 +0800 Subject: [PATCH 49/55] Update DeveloperGuide.md --- docs/DeveloperGuide.md | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 3c4c7d6661a2..b59179c4107c 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -602,8 +602,14 @@ Use case ends. **Pros:** -1. +1. Allows creation of subtasks within a task. +2. Allows local storage, in case there isn't internet access. +3. Can sync across devices by signing in. +4. Allows the grouping of tasks as a list and even grouping into folders. +5. Can invite other person(s), sharing the tasks with them. **Cons:** -1. +1. Doesn't allow adding of tasks through the command line (one-shot). +2. Cannot block slots. +3. No calendar view. From 80637080de2f5f31117122bd851f4c5714fd0c34 Mon Sep 17 00:00:00 2001 From: "Henry\\Henry" Date: Wed, 26 Oct 2016 19:51:05 +0800 Subject: [PATCH 50/55] Add //@@author --- .../commons/events/model/AliasSymbolChangedEvent.java | 1 + src/main/java/seedu/savvytasker/logic/LogicManager.java | 1 + .../seedu/savvytasker/logic/commands/AliasCommand.java | 2 ++ .../java/seedu/savvytasker/logic/commands/Command.java | 4 +++- .../seedu/savvytasker/logic/commands/UnaliasCommand.java | 3 ++- .../seedu/savvytasker/logic/parser/AddCommandParser.java | 1 + .../seedu/savvytasker/logic/parser/AliasCommandParser.java | 1 + .../seedu/savvytasker/logic/parser/ClearCommandParser.java | 1 + .../java/seedu/savvytasker/logic/parser/CommandParser.java | 1 + .../java/seedu/savvytasker/logic/parser/DateParser.java | 1 + .../savvytasker/logic/parser/DeleteCommandParser.java | 1 + .../seedu/savvytasker/logic/parser/ExitCommandParser.java | 1 + .../seedu/savvytasker/logic/parser/FindCommandParser.java | 1 + .../seedu/savvytasker/logic/parser/HelpCommandParser.java | 1 + .../java/seedu/savvytasker/logic/parser/IndexParser.java | 1 + .../seedu/savvytasker/logic/parser/ListCommandParser.java | 1 + .../seedu/savvytasker/logic/parser/MarkCommandParser.java | 1 + .../java/seedu/savvytasker/logic/parser/MasterParser.java | 1 + .../savvytasker/logic/parser/ModifyCommandParser.java | 1 + .../seedu/savvytasker/logic/parser/ParseException.java | 1 + .../seedu/savvytasker/logic/parser/RedoCommandParser.java | 1 + .../seedu/savvytasker/logic/parser/TaskFieldParser.java | 1 + .../savvytasker/logic/parser/UnaliasCommandParser.java | 1 + .../seedu/savvytasker/logic/parser/UndoCommandParser.java | 1 + .../savvytasker/logic/parser/UnmarkCommandParser.java | 1 + src/main/java/seedu/savvytasker/model/Model.java | 2 +- src/main/java/seedu/savvytasker/model/ModelManager.java | 4 ++-- .../java/seedu/savvytasker/model/ReadOnlySavvyTasker.java | 4 ++-- src/main/java/seedu/savvytasker/model/SavvyTasker.java | 7 ++++--- .../java/seedu/savvytasker/model/alias/AliasSymbol.java | 1 + .../seedu/savvytasker/model/alias/AliasSymbolList.java | 1 + .../model/alias/DuplicateSymbolKeywordException.java | 1 + .../model/alias/SymbolKeywordNotFoundException.java | 1 + src/main/java/seedu/savvytasker/model/task/FindType.java | 1 + src/main/java/seedu/savvytasker/model/task/ListType.java | 1 + .../java/seedu/savvytasker/model/task/PriorityLevel.java | 1 + .../java/seedu/savvytasker/model/task/RecurrenceType.java | 1 + .../seedu/savvytasker/storage/XmlAdaptedAliasSymbol.java | 1 + .../java/seedu/savvytasker/logic/parser/ParserTest.java | 1 + 39 files changed, 48 insertions(+), 10 deletions(-) diff --git a/src/main/java/seedu/savvytasker/commons/events/model/AliasSymbolChangedEvent.java b/src/main/java/seedu/savvytasker/commons/events/model/AliasSymbolChangedEvent.java index aa035335d976..3db6aaa27df1 100644 --- a/src/main/java/seedu/savvytasker/commons/events/model/AliasSymbolChangedEvent.java +++ b/src/main/java/seedu/savvytasker/commons/events/model/AliasSymbolChangedEvent.java @@ -1,3 +1,4 @@ +//@@author A0139916U package seedu.savvytasker.commons.events.model; import seedu.savvytasker.commons.events.BaseEvent; diff --git a/src/main/java/seedu/savvytasker/logic/LogicManager.java b/src/main/java/seedu/savvytasker/logic/LogicManager.java index 69d1acd5dbe9..6f19cf7a05b4 100644 --- a/src/main/java/seedu/savvytasker/logic/LogicManager.java +++ b/src/main/java/seedu/savvytasker/logic/LogicManager.java @@ -85,6 +85,7 @@ public ObservableList getFilteredTaskList() { return model.getFilteredTaskList(); } + //@@author A0139916U private void registerAllDefaultCommandParsers() { parser.registerCommandParser(new AddCommandParser()); parser.registerCommandParser(new DeleteCommandParser()); diff --git a/src/main/java/seedu/savvytasker/logic/commands/AliasCommand.java b/src/main/java/seedu/savvytasker/logic/commands/AliasCommand.java index d3cc9854c612..f5666df04465 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/AliasCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/AliasCommand.java @@ -1,3 +1,4 @@ +//@@author A0139916U package seedu.savvytasker.logic.commands; import seedu.savvytasker.logic.Logic; @@ -61,6 +62,7 @@ public void setLogic(Logic logic) { this.logic = logic; } + //@@author A0139916U /** * Checks if a command can perform undo operations * @return true if the command supports undo, false otherwise diff --git a/src/main/java/seedu/savvytasker/logic/commands/Command.java b/src/main/java/seedu/savvytasker/logic/commands/Command.java index 251dbcc4423d..38301ab0deb3 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/Command.java +++ b/src/main/java/seedu/savvytasker/logic/commands/Command.java @@ -48,6 +48,7 @@ protected void indicateAttemptToExecuteIncorrectCommand() { EventsCenter.getInstance().post(new IncorrectCommandAttemptedEvent(this)); } + //@@author A0139916U /** * Checks if a command can perform undo operations * @return true if the command supports undo, false otherwise @@ -65,7 +66,8 @@ protected void indicateAttemptToExecuteIncorrectCommand() { * @return true if the operation completed successfully, false otherwise */ public abstract boolean undo(); - + + //@@author /** * Check if command is an undo command * @return true if the command is an undo operation, false otherwise diff --git a/src/main/java/seedu/savvytasker/logic/commands/UnaliasCommand.java b/src/main/java/seedu/savvytasker/logic/commands/UnaliasCommand.java index 4f9e18c1e3ef..eb18e3876aa5 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/UnaliasCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/UnaliasCommand.java @@ -1,3 +1,4 @@ +//@@author A0139916U package seedu.savvytasker.logic.commands; import seedu.savvytasker.commons.exceptions.IllegalValueException; @@ -55,7 +56,7 @@ public CommandResult execute() { return new CommandResult(MESSAGE_UNREGOGNIZED_ALIAS); } } - + //@@author /** * Checks if a command can perform undo operations * @return true if the command supports undo, false otherwise diff --git a/src/main/java/seedu/savvytasker/logic/parser/AddCommandParser.java b/src/main/java/seedu/savvytasker/logic/parser/AddCommandParser.java index cd16976d29dd..7301ce70e1e9 100644 --- a/src/main/java/seedu/savvytasker/logic/parser/AddCommandParser.java +++ b/src/main/java/seedu/savvytasker/logic/parser/AddCommandParser.java @@ -1,3 +1,4 @@ +//@@author A0139916U package seedu.savvytasker.logic.parser; import java.util.regex.Matcher; diff --git a/src/main/java/seedu/savvytasker/logic/parser/AliasCommandParser.java b/src/main/java/seedu/savvytasker/logic/parser/AliasCommandParser.java index 3011836487bc..c54280d6ed9c 100644 --- a/src/main/java/seedu/savvytasker/logic/parser/AliasCommandParser.java +++ b/src/main/java/seedu/savvytasker/logic/parser/AliasCommandParser.java @@ -1,3 +1,4 @@ +//@@author A0139916U package seedu.savvytasker.logic.parser; import java.util.regex.Matcher; diff --git a/src/main/java/seedu/savvytasker/logic/parser/ClearCommandParser.java b/src/main/java/seedu/savvytasker/logic/parser/ClearCommandParser.java index 84d2990a37af..71526b7cb365 100644 --- a/src/main/java/seedu/savvytasker/logic/parser/ClearCommandParser.java +++ b/src/main/java/seedu/savvytasker/logic/parser/ClearCommandParser.java @@ -1,3 +1,4 @@ +//@@author A0139916U package seedu.savvytasker.logic.parser; import seedu.savvytasker.commons.core.Messages; diff --git a/src/main/java/seedu/savvytasker/logic/parser/CommandParser.java b/src/main/java/seedu/savvytasker/logic/parser/CommandParser.java index e79ef128fb8a..cb7d0e5b19ee 100644 --- a/src/main/java/seedu/savvytasker/logic/parser/CommandParser.java +++ b/src/main/java/seedu/savvytasker/logic/parser/CommandParser.java @@ -1,3 +1,4 @@ +//@@author A0139916U package seedu.savvytasker.logic.parser; import seedu.savvytasker.logic.commands.Command; diff --git a/src/main/java/seedu/savvytasker/logic/parser/DateParser.java b/src/main/java/seedu/savvytasker/logic/parser/DateParser.java index 7d55e0c69659..f2785ce443e9 100644 --- a/src/main/java/seedu/savvytasker/logic/parser/DateParser.java +++ b/src/main/java/seedu/savvytasker/logic/parser/DateParser.java @@ -1,3 +1,4 @@ +//@@author A0139916U package seedu.savvytasker.logic.parser; import java.util.Date; diff --git a/src/main/java/seedu/savvytasker/logic/parser/DeleteCommandParser.java b/src/main/java/seedu/savvytasker/logic/parser/DeleteCommandParser.java index 439fae24d8b2..53a5ae195b96 100644 --- a/src/main/java/seedu/savvytasker/logic/parser/DeleteCommandParser.java +++ b/src/main/java/seedu/savvytasker/logic/parser/DeleteCommandParser.java @@ -1,3 +1,4 @@ +//@@author A0139916U package seedu.savvytasker.logic.parser; import java.util.regex.Matcher; diff --git a/src/main/java/seedu/savvytasker/logic/parser/ExitCommandParser.java b/src/main/java/seedu/savvytasker/logic/parser/ExitCommandParser.java index 34a678d81055..6a3d432283c0 100644 --- a/src/main/java/seedu/savvytasker/logic/parser/ExitCommandParser.java +++ b/src/main/java/seedu/savvytasker/logic/parser/ExitCommandParser.java @@ -1,3 +1,4 @@ +//@@author A0139916U package seedu.savvytasker.logic.parser; import seedu.savvytasker.commons.core.Messages; diff --git a/src/main/java/seedu/savvytasker/logic/parser/FindCommandParser.java b/src/main/java/seedu/savvytasker/logic/parser/FindCommandParser.java index 8a65a86e43f7..508ca323175d 100644 --- a/src/main/java/seedu/savvytasker/logic/parser/FindCommandParser.java +++ b/src/main/java/seedu/savvytasker/logic/parser/FindCommandParser.java @@ -1,3 +1,4 @@ +//@@author A0139916U package seedu.savvytasker.logic.parser; import java.util.Arrays; diff --git a/src/main/java/seedu/savvytasker/logic/parser/HelpCommandParser.java b/src/main/java/seedu/savvytasker/logic/parser/HelpCommandParser.java index 4497389d5104..0b5e16eda059 100644 --- a/src/main/java/seedu/savvytasker/logic/parser/HelpCommandParser.java +++ b/src/main/java/seedu/savvytasker/logic/parser/HelpCommandParser.java @@ -1,3 +1,4 @@ +//@@author A0139916U package seedu.savvytasker.logic.parser; import seedu.savvytasker.commons.core.Messages; diff --git a/src/main/java/seedu/savvytasker/logic/parser/IndexParser.java b/src/main/java/seedu/savvytasker/logic/parser/IndexParser.java index efe41688f339..3bdfebaea962 100644 --- a/src/main/java/seedu/savvytasker/logic/parser/IndexParser.java +++ b/src/main/java/seedu/savvytasker/logic/parser/IndexParser.java @@ -1,3 +1,4 @@ +//@@author A0139916U package seedu.savvytasker.logic.parser; import java.util.Arrays; diff --git a/src/main/java/seedu/savvytasker/logic/parser/ListCommandParser.java b/src/main/java/seedu/savvytasker/logic/parser/ListCommandParser.java index a0d69d5db143..af95bce78bff 100644 --- a/src/main/java/seedu/savvytasker/logic/parser/ListCommandParser.java +++ b/src/main/java/seedu/savvytasker/logic/parser/ListCommandParser.java @@ -1,3 +1,4 @@ +//@@author A0139916U package seedu.savvytasker.logic.parser; import java.util.regex.Matcher; diff --git a/src/main/java/seedu/savvytasker/logic/parser/MarkCommandParser.java b/src/main/java/seedu/savvytasker/logic/parser/MarkCommandParser.java index bb3a682bebbb..465921f73759 100644 --- a/src/main/java/seedu/savvytasker/logic/parser/MarkCommandParser.java +++ b/src/main/java/seedu/savvytasker/logic/parser/MarkCommandParser.java @@ -1,3 +1,4 @@ +//@@author A0139916U package seedu.savvytasker.logic.parser; import java.util.regex.Matcher; diff --git a/src/main/java/seedu/savvytasker/logic/parser/MasterParser.java b/src/main/java/seedu/savvytasker/logic/parser/MasterParser.java index e0baa0f26bd1..2d2cb57188a8 100644 --- a/src/main/java/seedu/savvytasker/logic/parser/MasterParser.java +++ b/src/main/java/seedu/savvytasker/logic/parser/MasterParser.java @@ -1,3 +1,4 @@ +//@@author A0139916U package seedu.savvytasker.logic.parser; import static seedu.savvytasker.commons.core.Messages.MESSAGE_INVALID_COMMAND_FORMAT; diff --git a/src/main/java/seedu/savvytasker/logic/parser/ModifyCommandParser.java b/src/main/java/seedu/savvytasker/logic/parser/ModifyCommandParser.java index 8010b505c490..784c2443587f 100644 --- a/src/main/java/seedu/savvytasker/logic/parser/ModifyCommandParser.java +++ b/src/main/java/seedu/savvytasker/logic/parser/ModifyCommandParser.java @@ -1,3 +1,4 @@ +//@@author A0139916U package seedu.savvytasker.logic.parser; import java.util.regex.Matcher; diff --git a/src/main/java/seedu/savvytasker/logic/parser/ParseException.java b/src/main/java/seedu/savvytasker/logic/parser/ParseException.java index b34143b44f9f..6c859022d159 100644 --- a/src/main/java/seedu/savvytasker/logic/parser/ParseException.java +++ b/src/main/java/seedu/savvytasker/logic/parser/ParseException.java @@ -1,3 +1,4 @@ +//@@author A0139916U package seedu.savvytasker.logic.parser; /** diff --git a/src/main/java/seedu/savvytasker/logic/parser/RedoCommandParser.java b/src/main/java/seedu/savvytasker/logic/parser/RedoCommandParser.java index 7bc1d512878d..4ac4554f2828 100644 --- a/src/main/java/seedu/savvytasker/logic/parser/RedoCommandParser.java +++ b/src/main/java/seedu/savvytasker/logic/parser/RedoCommandParser.java @@ -1,3 +1,4 @@ +//@@author A0139916U package seedu.savvytasker.logic.parser; import seedu.savvytasker.commons.core.Messages; diff --git a/src/main/java/seedu/savvytasker/logic/parser/TaskFieldParser.java b/src/main/java/seedu/savvytasker/logic/parser/TaskFieldParser.java index 8521d48e0320..2c8612366fdd 100644 --- a/src/main/java/seedu/savvytasker/logic/parser/TaskFieldParser.java +++ b/src/main/java/seedu/savvytasker/logic/parser/TaskFieldParser.java @@ -1,3 +1,4 @@ +//@@author A0139916U package seedu.savvytasker.logic.parser; import seedu.savvytasker.logic.parser.DateParser.InferredDate; diff --git a/src/main/java/seedu/savvytasker/logic/parser/UnaliasCommandParser.java b/src/main/java/seedu/savvytasker/logic/parser/UnaliasCommandParser.java index 5fc61f5d5947..96e63e82adf2 100644 --- a/src/main/java/seedu/savvytasker/logic/parser/UnaliasCommandParser.java +++ b/src/main/java/seedu/savvytasker/logic/parser/UnaliasCommandParser.java @@ -1,3 +1,4 @@ +//@@author A0139916U package seedu.savvytasker.logic.parser; import java.util.regex.Matcher; diff --git a/src/main/java/seedu/savvytasker/logic/parser/UndoCommandParser.java b/src/main/java/seedu/savvytasker/logic/parser/UndoCommandParser.java index f620ba4ab208..a668f65157b5 100644 --- a/src/main/java/seedu/savvytasker/logic/parser/UndoCommandParser.java +++ b/src/main/java/seedu/savvytasker/logic/parser/UndoCommandParser.java @@ -1,3 +1,4 @@ +//@@author A0139916U package seedu.savvytasker.logic.parser; import seedu.savvytasker.commons.core.Messages; diff --git a/src/main/java/seedu/savvytasker/logic/parser/UnmarkCommandParser.java b/src/main/java/seedu/savvytasker/logic/parser/UnmarkCommandParser.java index 7261d671482a..26499b9accbb 100644 --- a/src/main/java/seedu/savvytasker/logic/parser/UnmarkCommandParser.java +++ b/src/main/java/seedu/savvytasker/logic/parser/UnmarkCommandParser.java @@ -1,3 +1,4 @@ +//@@author A0139916U package seedu.savvytasker.logic.parser; import java.util.regex.Matcher; diff --git a/src/main/java/seedu/savvytasker/model/Model.java b/src/main/java/seedu/savvytasker/model/Model.java index b5da015385a6..bd4806b33bf4 100644 --- a/src/main/java/seedu/savvytasker/model/Model.java +++ b/src/main/java/seedu/savvytasker/model/Model.java @@ -53,7 +53,7 @@ public interface Model { /** Updates the filter of the filtered task list to filter by the given keywords*/ void updateFilteredTaskList(FindType findType, String[] keywords); - //@@author A0139915W + //@@author A0139916U /** Adds the given AliasSymbol */ void addAliasSymbol(AliasSymbol symbol) throws DuplicateSymbolKeywordException; diff --git a/src/main/java/seedu/savvytasker/model/ModelManager.java b/src/main/java/seedu/savvytasker/model/ModelManager.java index 39f1eae51f0e..9fcc899102a5 100644 --- a/src/main/java/seedu/savvytasker/model/ModelManager.java +++ b/src/main/java/seedu/savvytasker/model/ModelManager.java @@ -80,7 +80,7 @@ public ReadOnlySavvyTasker getSavvyTasker() { private void indicateSavvyTaskerChanged() { raise(new SavvyTaskerChangedEvent(savvyTasker)); } - //@@author A0139915W + //@@author A0139916U private void indicateAliasSymbolAdded(AliasSymbol symbol) { raise(new AliasSymbolChangedEvent(symbol, AliasSymbolChangedEvent.Action.Added)); @@ -111,7 +111,7 @@ public synchronized void addTask(Task t) throws DuplicateTaskException, InvalidD updateFilteredListToShowActive(); indicateSavvyTaskerChanged(); } - //@@author A0139915W + //@@author A0139916U @Override public synchronized void addAliasSymbol(AliasSymbol symbol) throws DuplicateSymbolKeywordException { diff --git a/src/main/java/seedu/savvytasker/model/ReadOnlySavvyTasker.java b/src/main/java/seedu/savvytasker/model/ReadOnlySavvyTasker.java index c9078435f4a6..184777c4997a 100644 --- a/src/main/java/seedu/savvytasker/model/ReadOnlySavvyTasker.java +++ b/src/main/java/seedu/savvytasker/model/ReadOnlySavvyTasker.java @@ -16,7 +16,7 @@ public interface ReadOnlySavvyTasker { * Returns a defensively copied task list. */ TaskList getTaskList(); - //@@author A0139915W + //@@author A0139916U /** * Returns a defensively copied alias symbol list. @@ -28,7 +28,7 @@ public interface ReadOnlySavvyTasker { * Returns an unmodifiable view of task list */ List getReadOnlyListOfTasks(); - //@@author A0139915W + //@@author A0139916U /** * Returns unmodifiable view of symbols list diff --git a/src/main/java/seedu/savvytasker/model/SavvyTasker.java b/src/main/java/seedu/savvytasker/model/SavvyTasker.java index 5d9a3fe81c94..3e8107c21d3c 100644 --- a/src/main/java/seedu/savvytasker/model/SavvyTasker.java +++ b/src/main/java/seedu/savvytasker/model/SavvyTasker.java @@ -26,7 +26,6 @@ public class SavvyTasker implements ReadOnlySavvyTasker { //@@author A0139915W private final TaskList tasks; - //@@author A0139915W private final AliasSymbolList symbols; public SavvyTasker() { @@ -105,7 +104,7 @@ public boolean removeTask(ReadOnlyTask key) throws TaskNotFoundException { public boolean replaceTask(ReadOnlyTask key, Task replacement) throws TaskNotFoundException, InvalidDateException { return tasks.replace(key, replacement); } - //@@author A0139915W + //@@author A0139916U /** * Adds an alias symbol to savvy tasker. @@ -124,7 +123,7 @@ public void addAliasSymbol(AliasSymbol symbol) throws DuplicateSymbolKeywordExce public void removeAliasSymbol(AliasSymbol symbol) throws SymbolKeywordNotFoundException { symbols.removeAliasSymbol(symbol); } - + //@@author A0139915W //// util methods @@ -146,6 +145,7 @@ public TaskList getTaskList() { return defensiveCopy; } + //@@author A0139916U @Override public List getReadOnlyListOfAliasSymbols() { return symbols.asReadonly(); @@ -156,6 +156,7 @@ public AliasSymbolList getAliasSymbolList() { return new AliasSymbolList(symbols); } + //@@author A0139915W @Override public boolean equals(Object other) { return other == this // short circuit if same object diff --git a/src/main/java/seedu/savvytasker/model/alias/AliasSymbol.java b/src/main/java/seedu/savvytasker/model/alias/AliasSymbol.java index 1139898274a3..afd67350f3b1 100644 --- a/src/main/java/seedu/savvytasker/model/alias/AliasSymbol.java +++ b/src/main/java/seedu/savvytasker/model/alias/AliasSymbol.java @@ -1,3 +1,4 @@ +//@@author A0139916U package seedu.savvytasker.model.alias; import java.util.Objects; diff --git a/src/main/java/seedu/savvytasker/model/alias/AliasSymbolList.java b/src/main/java/seedu/savvytasker/model/alias/AliasSymbolList.java index 75b89017d2b7..13e87673adc9 100644 --- a/src/main/java/seedu/savvytasker/model/alias/AliasSymbolList.java +++ b/src/main/java/seedu/savvytasker/model/alias/AliasSymbolList.java @@ -1,3 +1,4 @@ +//@@author A0139916U package seedu.savvytasker.model.alias; import java.util.Iterator; diff --git a/src/main/java/seedu/savvytasker/model/alias/DuplicateSymbolKeywordException.java b/src/main/java/seedu/savvytasker/model/alias/DuplicateSymbolKeywordException.java index 6328a85e3d6d..72d933bd4063 100644 --- a/src/main/java/seedu/savvytasker/model/alias/DuplicateSymbolKeywordException.java +++ b/src/main/java/seedu/savvytasker/model/alias/DuplicateSymbolKeywordException.java @@ -1,3 +1,4 @@ +//@@author A0139916U package seedu.savvytasker.model.alias; import seedu.savvytasker.commons.exceptions.IllegalValueException; diff --git a/src/main/java/seedu/savvytasker/model/alias/SymbolKeywordNotFoundException.java b/src/main/java/seedu/savvytasker/model/alias/SymbolKeywordNotFoundException.java index 3d6b84feb5d0..f37dbd7a871e 100644 --- a/src/main/java/seedu/savvytasker/model/alias/SymbolKeywordNotFoundException.java +++ b/src/main/java/seedu/savvytasker/model/alias/SymbolKeywordNotFoundException.java @@ -1,3 +1,4 @@ +//@@author A0139916U package seedu.savvytasker.model.alias; import seedu.savvytasker.commons.exceptions.IllegalValueException; diff --git a/src/main/java/seedu/savvytasker/model/task/FindType.java b/src/main/java/seedu/savvytasker/model/task/FindType.java index b196e242eaea..49e69023a5f8 100644 --- a/src/main/java/seedu/savvytasker/model/task/FindType.java +++ b/src/main/java/seedu/savvytasker/model/task/FindType.java @@ -1,3 +1,4 @@ +//@@author A0139916U package seedu.savvytasker.model.task; /** diff --git a/src/main/java/seedu/savvytasker/model/task/ListType.java b/src/main/java/seedu/savvytasker/model/task/ListType.java index e188d5728b3f..cca1a5d58472 100644 --- a/src/main/java/seedu/savvytasker/model/task/ListType.java +++ b/src/main/java/seedu/savvytasker/model/task/ListType.java @@ -1,3 +1,4 @@ +//@@author A0139916U package seedu.savvytasker.model.task; /** diff --git a/src/main/java/seedu/savvytasker/model/task/PriorityLevel.java b/src/main/java/seedu/savvytasker/model/task/PriorityLevel.java index f4f556d56e16..16db6b967ea6 100644 --- a/src/main/java/seedu/savvytasker/model/task/PriorityLevel.java +++ b/src/main/java/seedu/savvytasker/model/task/PriorityLevel.java @@ -1,3 +1,4 @@ +//@@author A0139916U package seedu.savvytasker.model.task; /** diff --git a/src/main/java/seedu/savvytasker/model/task/RecurrenceType.java b/src/main/java/seedu/savvytasker/model/task/RecurrenceType.java index bb336f3237a2..4d3fa8f4aca3 100644 --- a/src/main/java/seedu/savvytasker/model/task/RecurrenceType.java +++ b/src/main/java/seedu/savvytasker/model/task/RecurrenceType.java @@ -1,3 +1,4 @@ +//@@author A0139916U package seedu.savvytasker.model.task; /** diff --git a/src/main/java/seedu/savvytasker/storage/XmlAdaptedAliasSymbol.java b/src/main/java/seedu/savvytasker/storage/XmlAdaptedAliasSymbol.java index 9f6ca2e6a139..2292a5e39494 100644 --- a/src/main/java/seedu/savvytasker/storage/XmlAdaptedAliasSymbol.java +++ b/src/main/java/seedu/savvytasker/storage/XmlAdaptedAliasSymbol.java @@ -1,3 +1,4 @@ +//@@author A0139916U package seedu.savvytasker.storage; import javax.xml.bind.annotation.XmlElement; diff --git a/src/test/java/seedu/savvytasker/logic/parser/ParserTest.java b/src/test/java/seedu/savvytasker/logic/parser/ParserTest.java index eea24cb41cab..13c9bbd30247 100644 --- a/src/test/java/seedu/savvytasker/logic/parser/ParserTest.java +++ b/src/test/java/seedu/savvytasker/logic/parser/ParserTest.java @@ -1,3 +1,4 @@ +//@@author A0139916U package seedu.savvytasker.logic.parser; import static org.junit.Assert.assertFalse; From c13abd21b1f39e2af8a81cc555ecd8c15538f9d0 Mon Sep 17 00:00:00 2001 From: qhng Date: Wed, 26 Oct 2016 20:16:41 +0800 Subject: [PATCH 51/55] Update collate --- collated/main/A0139915W.md | 605 +---- collated/main/A0139915Wreused.md | 29 - collated/main/A0139916U.md | 2151 +++++++++++++++++ collated/test/A0139915W.md | 237 -- collated/test/A0139916U.md | 507 ++++ .../ui/TaskPanelSelectionChangedEvent.java | 2 +- .../commons/util/SmartDefaultDates.java | 2 +- .../savvytasker/commons/util/StringUtil.java | 2 +- .../logic/commands/AddCommand.java | 2 +- .../logic/commands/DeleteCommand.java | 2 +- .../logic/commands/FindCommand.java | 2 +- .../logic/commands/ListCommand.java | 2 +- .../logic/commands/ModifyCommand.java | 2 +- .../logic/commands/SelectCommand.java | 2 +- .../logic/parser/FindCommandParser.java | 2 +- .../java/seedu/savvytasker/model/Model.java | 2 +- .../seedu/savvytasker/model/ModelManager.java | 10 +- .../model/ReadOnlySavvyTasker.java | 4 + .../seedu/savvytasker/model/SavvyTasker.java | 10 +- .../savvytasker/model/task/ReadOnlyTask.java | 2 +- .../seedu/savvytasker/model/task/Task.java | 2 +- .../savvytasker/model/task/TaskList.java | 2 +- .../savvytasker/storage/XmlAdaptedTask.java | 2 +- src/test/java/guitests/AddCommandTest.java | 2 +- src/test/java/guitests/DeleteCommandTest.java | 2 +- src/test/java/guitests/FindCommandTest.java | 2 +- src/test/java/guitests/ListCommandTest.java | 2 +- .../guitests/guihandles/TaskCardHandle.java | 2 +- .../guihandles/TaskListPanelHandle.java | 2 +- .../testutil/SavvyTaskerBuilder.java | 2 +- .../savvytasker/testutil/TaskBuilder.java | 2 +- .../seedu/savvytasker/testutil/TestTask.java | 2 +- .../seedu/savvytasker/testutil/TestUtil.java | 6 +- .../testutil/TypicalTestTasks.java | 2 +- 34 files changed, 2707 insertions(+), 902 deletions(-) create mode 100644 collated/main/A0139916U.md create mode 100644 collated/test/A0139916U.md diff --git a/collated/main/A0139915W.md b/collated/main/A0139915W.md index ec1b02d09826..8d2a359c949e 100644 --- a/collated/main/A0139915W.md +++ b/collated/main/A0139915W.md @@ -23,10 +23,6 @@ public class TaskPanelSelectionChangedEvent extends BaseEvent { return newSelection; } } -``` -###### \java\seedu\savvytasker\commons\events\ui\TaskPanelSelectionChangedEvent.java -``` java - ``` ###### \java\seedu\savvytasker\commons\util\SmartDefaultDates.java ``` java @@ -180,10 +176,6 @@ public class SmartDefaultDates { return endDateTime; } } -``` -###### \java\seedu\savvytasker\commons\util\SmartDefaultDates.java -``` java - ``` ###### \java\seedu\savvytasker\logic\commands\AddCommand.java ``` java @@ -230,69 +222,6 @@ public class SmartDefaultDates { } ``` -###### \java\seedu\savvytasker\logic\commands\AddCommand.java -``` java - - /** - * Checks if a command can perform undo operations - * @return true if the command supports undo, false otherwise - */ - @Override - public boolean canUndo() { - return true; - } - - /** - * Redo the add command - * @return true if the operation completed successfully, false otherwise - */ - @Override - public boolean redo() { - execute(); - return false; - } - - /** - * Undo the add command - * @return true if the operation completed successfully, false otherwise - */ - @Override - public boolean undo() { - - UnmodifiableObservableList lastShownList = model.getFilteredTaskListTask(); - - for (int i = 0; i < lastShownList.size(); i++) { - if (lastShownList.get(i) == toAdd){ - ReadOnlyTask taskToDelete = lastShownList.get(i); - try { - model.deleteTask(taskToDelete); - } catch (TaskNotFoundException e) { - e.printStackTrace(); - } - } - } - return false; - } - - /** - * Check if command is an undo command - * @return true if the command is an undo operation, false otherwise - */ - @Override - public boolean isUndo() { - return false; - } - - /** - * Check if command is a redo command - * @return true if the command is a redo operation, false otherwise - */ - @Override - public boolean isRedo(){ - return false; - } -} -``` ###### \java\seedu\savvytasker\logic\commands\DeleteCommand.java ``` java public DeleteCommand(int[] targetIndices) { @@ -329,89 +258,6 @@ public class SmartDefaultDates { return new CommandResult(resultSb.toString()); } ``` -###### \java\seedu\savvytasker\logic\commands\DeleteCommand.java -``` java - - /** - * Checks if a command can perform undo operations - * @return true if the command supports undo, false otherwise - */ - @Override - public boolean canUndo() { - return true; - } - - /** - * Redo the delete command - * @return true if the operation completed successfully, false otherwise - */ - @Override - public boolean redo() { - execute(); - - /* - * METHOD 2 - UnmodifiableObservableList lastShownList = model.getFilteredTaskListTask(); - - for(Task toUndo : tasksToUndo){ - for (int i = 0; i < lastShownList.size(); i++) { - if (lastShownList.get(i) == toUndo){ - ReadOnlyTask taskToDelete = lastShownList.get(i); - try { - model.deleteTask(taskToDelete); - } catch (TaskNotFoundException e) { - e.printStackTrace(); - } - } - } - } - */ - return true; - } - - /** - * Undo the delete command - * @return true if the operation completed successfully, false otherwise - */ - @Override - public boolean undo() { - - assert model != null; - model.resetData(original); - - /* - * METHOD 2 - assert model != null; - - for(Task deleted : tasksToUndo) - try { - model.addTask(deleted); - } catch (DuplicateTaskException e) { - e.printStackTrace(); - } - */ - return true; - } - - /** - * Check if command is an undo command - * @return true if the command is an undo operation, false otherwise - */ - @Override - public boolean isUndo() { - return false; - } - - /** - * Check if command is a redo command - * @return true if the command is a redo operation, false otherwise - */ - @Override - public boolean isRedo(){ - return false; - } -} -``` ###### \java\seedu\savvytasker\logic\commands\FindCommand.java ``` java public FindCommand(FindType findType, String[] keywords) { @@ -430,57 +276,6 @@ public class SmartDefaultDates { return new CommandResult(getMessageForTaskListShownSummary(model.getFilteredTaskList().size())); } ``` -###### \java\seedu\savvytasker\logic\commands\FindCommand.java -``` java - - /** - * Checks if a command can perform undo operations - * @return true if the command supports undo, false otherwise - */ - @Override - public boolean canUndo() { - return false; - } - - /** - * Redo the find command - * @return true if the operation completed successfully, false otherwise - */ - @Override - public boolean redo() { - // nothing required to be done - return false; - } - - /** - * Undo the find command - * @return true if the operation completed successfully, false otherwise - */ - @Override - public boolean undo() { - // nothing required to be done - return false; - } - - /** - * Check if command is an undo command - * @return true if the command is an undo operation, false otherwise - */ - @Override - public boolean isUndo() { - return false; - } - - /** - * Check if command is a redo command - * @return true if the command is a redo operation, false otherwise - */ - @Override - public boolean isRedo(){ - return false; - } -} -``` ###### \java\seedu\savvytasker\logic\commands\ListCommand.java ``` java /** @@ -515,59 +310,6 @@ public class SmartDefaultDates { } return new CommandResult(getMessageForTaskListShownSummary(model.getFilteredTaskList().size())); } -``` -###### \java\seedu\savvytasker\logic\commands\ListCommand.java -``` java - - /** - * Checks if a command can perform undo operations - * @return true if the command supports undo, false otherwise - */ - @Override - public boolean canUndo() { - return false; - } - - /** - * Redo the list command - * @return true if the operation completed successfully, false otherwise - */ - @Override - public boolean redo() { - // nothing required to be done - return false; - } - - - /** - * Undo the list command - * @return true if the operation completed successfully, false otherwise - */ - @Override - public boolean undo() { - // nothing required to be done - return false; - } - - /** - * Check if command is an undo command - * @return true if the command is an undo operation, false otherwise - */ - @Override - public boolean isUndo() { - return false; - } - - /** - * Check if command is a redo command - * @return true if the command is a redo operation, false otherwise - */ - @Override - public boolean isRedo(){ - return false; - } -} - ``` ###### \java\seedu\savvytasker\logic\commands\ModifyCommand.java ``` java @@ -622,72 +364,6 @@ public class SmartDefaultDates { return new CommandResult(String.format(MESSAGE_SUCCESS, replacement)); } ``` -###### \java\seedu\savvytasker\logic\commands\ModifyCommand.java -``` java - - /** - * Checks if a command can perform undo operations - * @return true if the command supports undo, false otherwise - */ - @Override - public boolean canUndo() { - return true; - } - - /** - * Redo the add command - * @return true if the operation completed successfully, false otherwise - */ - @Override - public boolean redo() { - execute(); - return true; - } - - /** - * Undo the add command - * @return true if the operation completed successfully, false otherwise - */ - @Override - public boolean undo() { - - assert model != null; - - UnmodifiableObservableList lastShownList = model.getFilteredTaskList(); - ReadOnlyTask taskToModify = lastShownList.get(index - 1); - - try { - model.modifyTask(taskToModify, originalTask); - } catch (TaskNotFoundException e) { - assert false : "The target task cannot be missing"; - } catch (InvalidDateException ex) { - //TODO: Verify branch - //assert false : "The target task cannot be having an invalid start end "; - //return new CommandResult(Messages.MESSAGE_INVALID_START_END); - } - - return true; - } - - /** - * Check if command is an undo command - * @return true if the command is an undo operation, false otherwise - */ - @Override - public boolean isUndo() { - return false; - } - - /** - * Check if command is a redo command - * @return true if the command is a redo operation, false otherwise - */ - @Override - public boolean isRedo(){ - return false; - } -} -``` ###### \java\seedu\savvytasker\logic\parser\FindCommandParser.java ``` java @Override @@ -704,51 +380,6 @@ public class SmartDefaultDates { throw new ParseException(commandText, String.format(Messages.MESSAGE_INVALID_COMMAND_FORMAT, getRequiredFormat())); } ``` -###### \java\seedu\savvytasker\logic\parser\FindCommandParser.java -``` java - - private FindType parseFindType(String findTypeText) throws ParseException { - if (findTypeText == null) - return null; - - String trimmedFindTypeText = findTypeText.trim(); - try { - return FindType.valueOfIgnoreCase(trimmedFindTypeText); - } catch (IllegalArgumentException ex) { - throw new ParseException(trimmedFindTypeText, "FIND_TYPE: Unknown type '" + findTypeText + "'"); - } - } - - private String[] parseKeywords(String keywordsBefore, String keywordsAfter) throws ParseException { - String trimmedKeywordsBefore = keywordsBefore.trim(); - String trimmedKeywordsAfter = keywordsAfter.trim(); - - String[] keywordsArr1 = new String[0]; - String[] keywordsArr2 = new String[0]; - if (!trimmedKeywordsBefore.isEmpty()) keywordsArr1 = trimmedKeywordsBefore.split("\\s+"); - if (!trimmedKeywordsAfter.isEmpty()) keywordsArr2 = trimmedKeywordsAfter.split("\\s+"); - - if (keywordsArr1.length == 0 && keywordsArr2.length == 0) - throw new ParseException(trimmedKeywordsBefore + " ... " + trimmedKeywordsAfter, - "KEYWORD: Need to specify at least one keyword!"); - - return concatArray(keywordsArr1, keywordsArr2); - } - - /** - * Concatenates 2 arrays into 1 array, in the order the arrays are given. - * - * @param array1 the first array - * @param array2 the second array - * @return the new array with the values from each of the given array added into it in order - */ - private String[] concatArray(String[] array1, String[] array2) { - String[] newArray = Arrays.copyOf(array1, array1.length + array2.length); - System.arraycopy(array2, 0, newArray, array1.length, array2.length); - return newArray; - } -} -``` ###### \java\seedu\savvytasker\model\Model.java ``` java /** Deletes the given Task. */ @@ -783,16 +414,6 @@ public class SmartDefaultDates { /** Updates the filter of the filtered task list to filter by the given keywords*/ void updateFilteredTaskList(FindType findType, String[] keywords); ``` -###### \java\seedu\savvytasker\model\Model.java -``` java - - /** Adds the given AliasSymbol */ - void addAliasSymbol(AliasSymbol symbol) throws DuplicateSymbolKeywordException; - - /** Removes an the given AliasSymbol. */ - void removeAliasSymbol(AliasSymbol symbol) throws SymbolKeywordNotFoundException; -} -``` ###### \java\seedu\savvytasker\model\ModelManager.java ``` java private final SavvyTasker savvyTasker; @@ -825,35 +446,6 @@ public class SmartDefaultDates { sortedAndFilteredTasks = new SortedList<>(filteredTasks, new TaskSortedByDefault()); updateFilteredListToShowActive(); // shows only active tasks on start } - - @Override - public void resetData(ReadOnlySavvyTasker newData) { - savvyTasker.resetData(newData); - indicateSavvyTaskerChanged(); - } - - @Override - public ReadOnlySavvyTasker getSavvyTasker() { - return savvyTasker; - } - - /** Raises an event to indicate the model has changed */ - private void indicateSavvyTaskerChanged() { - raise(new SavvyTaskerChangedEvent(savvyTasker)); - } -``` -###### \java\seedu\savvytasker\model\ModelManager.java -``` java - - private void indicateAliasSymbolAdded(AliasSymbol symbol) { - raise(new AliasSymbolChangedEvent(symbol, AliasSymbolChangedEvent.Action.Added)); - } - - private void indicateAliasSymbolRemoved(AliasSymbol symbol) { - raise(new AliasSymbolChangedEvent(symbol, AliasSymbolChangedEvent.Action.Removed)); - } - - ``` ###### \java\seedu\savvytasker\model\ModelManager.java ``` java @@ -878,26 +470,6 @@ public class SmartDefaultDates { } ``` ###### \java\seedu\savvytasker\model\ModelManager.java -``` java - - @Override - public synchronized void addAliasSymbol(AliasSymbol symbol) throws DuplicateSymbolKeywordException { - savvyTasker.addAliasSymbol(symbol); - indicateSavvyTaskerChanged(); - indicateAliasSymbolAdded(symbol); - } - - @Override - public synchronized void removeAliasSymbol(AliasSymbol symbol) throws SymbolKeywordNotFoundException { - savvyTasker.removeAliasSymbol(symbol); - indicateSavvyTaskerChanged(); - indicateAliasSymbolRemoved(symbol); - } - - //=========== Filtered/Sorted Task List Accessors =============================================================== - -``` -###### \java\seedu\savvytasker\model\ModelManager.java ``` java @Override public UnmodifiableObservableList getFilteredTaskList() { @@ -968,53 +540,6 @@ public class SmartDefaultDates { } ``` ###### \java\seedu\savvytasker\model\ModelManager.java -``` java - - //========== Inner classes/interfaces used for filtering ================================================== - - interface Expression { - boolean satisfies(ReadOnlyTask task); - String toString(); - } - - private class PredicateExpression implements Expression { - - private final Qualifier qualifier; - - PredicateExpression(Qualifier qualifier) { - this.qualifier = qualifier; - } - - @Override - public boolean satisfies(ReadOnlyTask task) { - return qualifier.run(task); - } - - @Override - public String toString() { - return qualifier.toString(); - } - } - - interface Qualifier { - boolean run(ReadOnlyTask task); - String toString(); - - /** - * Helper method to build Set from String[] - * @param keywords list of keywords - */ - default Set createSet(String[] keywords) { - HashSet _keywords = new HashSet(); - for (String keyword : keywords) { - _keywords.add(keyword); - } - return _keywords; - } - } - -``` -###### \java\seedu\savvytasker\model\ModelManager.java ``` java /** * Qualifier matching a partial word from the set of keywords @@ -1250,11 +775,6 @@ public class SmartDefaultDates { } ``` -###### \java\seedu\savvytasker\model\ModelManager.java -``` java - -} -``` ###### \java\seedu\savvytasker\model\ReadOnlySavvyTasker.java ``` java /** @@ -1263,77 +783,11 @@ public class SmartDefaultDates { TaskList getTaskList(); ``` ###### \java\seedu\savvytasker\model\ReadOnlySavvyTasker.java -``` java - - /** - * Returns a defensively copied alias symbol list. - */ - - AliasSymbolList getAliasSymbolList(); -``` -###### \java\seedu\savvytasker\model\ReadOnlySavvyTasker.java ``` java /** * Returns an unmodifiable view of task list */ List getReadOnlyListOfTasks(); -``` -###### \java\seedu\savvytasker\model\ReadOnlySavvyTasker.java -``` java - - /** - * Returns unmodifiable view of symbols list - */ - List getReadOnlyListOfAliasSymbols(); -} -``` -###### \java\seedu\savvytasker\model\SavvyTasker.java -``` java - private final TaskList tasks; -``` -###### \java\seedu\savvytasker\model\SavvyTasker.java -``` java - private final AliasSymbolList symbols; - - public SavvyTasker() { - this.tasks = new TaskList(); - this.symbols = new AliasSymbolList(); - } - - public SavvyTasker(ReadOnlySavvyTasker toBeCopied) { - this(toBeCopied.getTaskList(), toBeCopied.getAliasSymbolList()); - } - - public SavvyTasker(TaskList tasks, AliasSymbolList symbols) { - this(); - resetData(tasks.getInternalList()); - this.symbols.reset(symbols); - } - - public static ReadOnlySavvyTasker getEmptySavvyTasker() { - return new SavvyTasker(); - } - -//// task list overwrite operations - - public ObservableList getTasks() { - return tasks.getInternalList(); - } - - public void setTasks(List tasks) { - this.tasks.getInternalList().setAll(tasks); - } - - public void resetData(Collection newTasks) { - setTasks(newTasks.stream().map(Task::new).collect(Collectors.toList())); - } - - public void resetData(ReadOnlySavvyTasker newData) { - resetData(newData.getReadOnlyListOfTasks()); - } - -//// symbol/task-level operations - ``` ###### \java\seedu\savvytasker\model\SavvyTasker.java ``` java @@ -1376,34 +830,6 @@ public class SmartDefaultDates { ``` ###### \java\seedu\savvytasker\model\SavvyTasker.java ``` java - - /** - * Adds an alias symbol to savvy tasker. - * @param symbol the symbol to add - * @throws DuplicateSymbolKeywordException if another symbol with the same keyword already exists - */ - public void addAliasSymbol(AliasSymbol symbol) throws DuplicateSymbolKeywordException { - symbols.addAliasSymbol(symbol); - } - - /** - * Removes an alias symbol from savvy tasker. - * @param symbol the symbol to remove - * @throws SymbolKeywordNotFoundException if there is no such symbol - */ - public void removeAliasSymbol(AliasSymbol symbol) throws SymbolKeywordNotFoundException { - symbols.removeAliasSymbol(symbol); - } - - -//// util methods - - @Override - public String toString() { - return tasks.getInternalList().size() + " tasks, " + symbols.size() + " symbols"; - // TODO: refine later - } - @Override public List getReadOnlyListOfTasks() { return Collections.unmodifiableList(tasks.getInternalList()); @@ -1415,17 +841,9 @@ public class SmartDefaultDates { defensiveCopy.getInternalList().addAll(tasks.getInternalList()); return defensiveCopy; } - - @Override - public List getReadOnlyListOfAliasSymbols() { - return symbols.asReadonly(); - } - - @Override - public AliasSymbolList getAliasSymbolList() { - return new AliasSymbolList(symbols); - } - +``` +###### \java\seedu\savvytasker\model\SavvyTasker.java +``` java @Override public boolean equals(Object other) { return other == this // short circuit if same object @@ -1439,7 +857,6 @@ public class SmartDefaultDates { // use this method for custom fields hashing instead of implementing your own return Objects.hash(tasks, symbols); } -} ``` ###### \java\seedu\savvytasker\model\task\ReadOnlyTask.java ``` java @@ -1500,10 +917,6 @@ public interface ReadOnlyTask { } } -``` -###### \java\seedu\savvytasker\model\task\ReadOnlyTask.java -``` java - ``` ###### \java\seedu\savvytasker\model\task\Task.java ``` java @@ -1738,10 +1151,6 @@ public class Task implements ReadOnlyTask { } } -``` -###### \java\seedu\savvytasker\model\task\Task.java -``` java - ``` ###### \java\seedu\savvytasker\model\task\TaskList.java ``` java @@ -1921,10 +1330,6 @@ public class TaskList implements Iterable { return internalList.hashCode(); } } -``` -###### \java\seedu\savvytasker\model\task\TaskList.java -``` java - ``` ###### \java\seedu\savvytasker\storage\XmlAdaptedTask.java ``` java @@ -2003,7 +1408,3 @@ public class XmlAdaptedTask { } } ``` -###### \java\seedu\savvytasker\storage\XmlAdaptedTask.java -``` java - -``` diff --git a/collated/main/A0139915Wreused.md b/collated/main/A0139915Wreused.md index f3b0f9c8b730..34a4b0d4c6d1 100644 --- a/collated/main/A0139915Wreused.md +++ b/collated/main/A0139915Wreused.md @@ -15,32 +15,3 @@ return strings.stream().filter(s -> s.contains(query.toLowerCase())).count() > 0; } ``` -###### \java\seedu\savvytasker\commons\util\StringUtil.java -``` java - - public static boolean containsIgnoreCase(String source, String query) { - String[] split = source.toLowerCase().split("\\s+"); - List strings = Arrays.asList(split); - return strings.stream().filter(s -> s.equals(query.toLowerCase())).count() > 0; - } - - /** - * Returns a detailed message of the t, including the stack trace. - */ - public static String getDetails(Throwable t){ - assert t != null; - StringWriter sw = new StringWriter(); - t.printStackTrace(new PrintWriter(sw)); - return t.getMessage() + "\n" + sw.toString(); - } - - /** - * Returns true if s represents an unsigned integer e.g. 1, 2, 3, ...
- * Will return false for null, empty string, "-1", "0", "+1", and " 2 " (untrimmed) "3 0" (contains whitespace). - * @param s Should be trimmed. - */ - public static boolean isUnsignedInteger(String s){ - return s != null && s.matches("^0*[1-9]\\d*$"); - } -} -``` diff --git a/collated/main/A0139916U.md b/collated/main/A0139916U.md new file mode 100644 index 000000000000..4fef222c232d --- /dev/null +++ b/collated/main/A0139916U.md @@ -0,0 +1,2151 @@ +# A0139916U +###### \java\seedu\savvytasker\commons\events\model\AliasSymbolChangedEvent.java +``` java +package seedu.savvytasker.commons.events.model; + +import seedu.savvytasker.commons.events.BaseEvent; +import seedu.savvytasker.model.alias.AliasSymbol; + +/** + * Represents an event where the user has added an alias symbol. + */ +public class AliasSymbolChangedEvent extends BaseEvent { + /** + * The action that was performed, i.e. the symbol was added or removed. + */ + public enum Action { + Added, + Removed; + } + + public final AliasSymbol symbol; + public final Action action; + + public AliasSymbolChangedEvent(AliasSymbol symbol, Action action) { + assert symbol != null; + assert action != null; + + this.symbol = symbol; + this.action = action; + } + + @Override + public String toString() { + return "Alias symbol " + action.toString() + ": " + symbol.toString(); + } + +} +``` +###### \java\seedu\savvytasker\logic\commands\AliasCommand.java +``` java +package seedu.savvytasker.logic.commands; + +import seedu.savvytasker.logic.Logic; +import seedu.savvytasker.model.alias.AliasSymbol; +import seedu.savvytasker.model.alias.DuplicateSymbolKeywordException; +import seedu.savvytasker.model.alias.SymbolKeywordNotFoundException; + +/** + * Command to create aliases + */ +public class AliasCommand extends ModelRequiringCommand { + + public static final String COMMAND_WORD = "alias"; + + public static final String MESSAGE_USAGE = COMMAND_WORD + ": Creates an alias for a command or parameter. " + + "Parameters: k/KEYWORD s/SHORT_KEYWORD\n" + + "Example: " + COMMAND_WORD + + " k/Project Meeting s/pjm"; + + public static final String MESSAGE_SUCCESS = "New alias added: %1$s"; + public static final String MESSAGE_DUPLICATE_ALIAS = "This alias is already in use"; + public static final String MESSAGE_INVALID_KEYWORD = "Unable to use a command name as a keyword!"; + + private Logic logic; + private final String keyword; + private final String representingText; + /** + * Creates an alias command + */ + public AliasCommand(String keyword, String representingText) { + assert keyword != null; + assert representingText != null; + this.keyword = keyword; + this.representingText = representingText; + } + + @Override + public CommandResult execute() { + assert model != null; + + AliasSymbol toAdd = new AliasSymbol(keyword, representingText); + + if (logic.canParseHeader(toAdd.getKeyword())) { + return new CommandResult(MESSAGE_INVALID_KEYWORD); + } + + try { + model.addAliasSymbol(toAdd); + return new CommandResult(String.format(MESSAGE_SUCCESS, toAdd)); + } catch (DuplicateSymbolKeywordException e) { + return new CommandResult(MESSAGE_DUPLICATE_ALIAS); + } + } + + /** + * Provides logic related dependencies to the alias command. + */ + @Override + public void setLogic(Logic logic) { + assert logic != null; + this.logic = logic; + } + +``` +###### \java\seedu\savvytasker\logic\commands\AliasCommand.java +``` java + /** + * Checks if a command can perform undo operations + * @return true if the command supports undo, false otherwise + */ + @Override + public boolean canUndo() { + return true; + } + + /** + * Redo the alias command + * @return true if the operation completed successfully, false otherwise + */ + @Override + public boolean redo() { + execute(); + return true; + } + /** + * Undo the alias command + * @return true if the operation completed successfully, false otherwise + */ + @Override + public boolean undo() { + // TODO Auto-generated method stub + + assert model != null; + + AliasSymbol toRemove = null; + for(AliasSymbol symbol : model.getSavvyTasker().getReadOnlyListOfAliasSymbols()) { + if (symbol.getKeyword().equals(this.keyword)) { + toRemove = symbol; + break; + } + } + try { + model.removeAliasSymbol(toRemove); + } catch (SymbolKeywordNotFoundException e) { + e.printStackTrace(); + } + + return true; + } + + /** + * Check if command is an undo command + * @return true if the command is an undo operation, false otherwise + */ + @Override + public boolean isUndo() { + return false; + } + + /** + * Check if command is a redo command + * @return true if the command is a redo operation, false otherwise + */ + @Override + public boolean isRedo(){ + return false; + } +} +``` +###### \java\seedu\savvytasker\logic\commands\Command.java +``` java + /** + * Checks if a command can perform undo operations + * @return true if the command supports undo, false otherwise + */ + public abstract boolean canUndo(); + + /** + * Redo the command. + * @return true if the operation completed successfully, false otherwise + */ + public abstract boolean redo(); + + /** + * Undo the command + * @return true if the operation completed successfully, false otherwise + */ + public abstract boolean undo(); + +``` +###### \java\seedu\savvytasker\logic\commands\UnaliasCommand.java +``` java +package seedu.savvytasker.logic.commands; + +import seedu.savvytasker.commons.exceptions.IllegalValueException; +import seedu.savvytasker.model.alias.AliasSymbol; +import seedu.savvytasker.model.alias.DuplicateSymbolKeywordException; +import seedu.savvytasker.model.alias.SymbolKeywordNotFoundException; + +/** + * Command to remove aliases + */ +public class UnaliasCommand extends ModelRequiringCommand { + + public static final String COMMAND_WORD = "unalias"; + + public static final String MESSAGE_USAGE = COMMAND_WORD + ": Removes an alias for a command or parameter. " + + "Parameters: s/SHORT_KEYWORD\n" + + "Example: " + COMMAND_WORD + + " s/pjm"; + + public static final String MESSAGE_SUCCESS = "Alias removed: %1$s"; + public static final String MESSAGE_UNREGOGNIZED_ALIAS = "This alias is not in use"; + + private final String keyword; + private AliasSymbol toUndo; + + /** + * Convenience constructor using raw values. + * + * @throws IllegalValueException if any of the raw values are invalid + */ + public UnaliasCommand(String keyword) { + this.keyword = keyword; + this.toUndo = null; + } + + @Override + public CommandResult execute() { + assert model != null; + + AliasSymbol toRemove = null; + for(AliasSymbol symbol : model.getSavvyTasker().getReadOnlyListOfAliasSymbols()) { + if (symbol.getKeyword().equals(this.keyword)) { + toRemove = symbol; + break; + } + } + + try { + if (toRemove == null) + return new CommandResult(MESSAGE_UNREGOGNIZED_ALIAS); + toUndo = toRemove; + model.removeAliasSymbol(toRemove); + return new CommandResult(String.format(MESSAGE_SUCCESS, toRemove)); + } catch (SymbolKeywordNotFoundException e) { + return new CommandResult(MESSAGE_UNREGOGNIZED_ALIAS); + } + } +``` +###### \java\seedu\savvytasker\logic\LogicManager.java +``` java + private void registerAllDefaultCommandParsers() { + parser.registerCommandParser(new AddCommandParser()); + parser.registerCommandParser(new DeleteCommandParser()); + parser.registerCommandParser(new FindCommandParser()); + parser.registerCommandParser(new ListCommandParser()); + parser.registerCommandParser(new ModifyCommandParser()); + parser.registerCommandParser(new HelpCommandParser()); + parser.registerCommandParser(new ClearCommandParser()); + parser.registerCommandParser(new ExitCommandParser()); + parser.registerCommandParser(new MarkCommandParser()); + parser.registerCommandParser(new UnmarkCommandParser()); + parser.registerCommandParser(new UndoCommandParser()); + parser.registerCommandParser(new RedoCommandParser()); + parser.registerCommandParser(new AliasCommandParser()); + parser.registerCommandParser(new UnaliasCommandParser()); + } + + private void loadAllAliasSymbols() { + List allSynbols = model.getSavvyTasker().getReadOnlyListOfAliasSymbols(); + for (AliasSymbol symbol : allSynbols) { + parser.addAliasSymbol(symbol); + } + } + + private boolean undo() { + boolean undone = false; + + if (!undoStack.isEmpty()) { + Command command = undoStack.pop(); + command.undo(); + redoStack.push(command); + undone = true; + } + + return undone; + } + + private boolean redo() { + boolean redone = false; + + if (!redoStack.isEmpty()) { + Command command = redoStack.pop(); + command.redo(); + undoStack.push(command); + redone = true; + } + + return redone; + } + + @Subscribe + public void handleAliasSymbolChangedEvent(AliasSymbolChangedEvent event) { + logger.info(LogsCenter.getEventHandlingLogMessage( + event, "Alias symbol " + event.action.toString().toLowerCase())); + if (event.action.equals(AliasSymbolChangedEvent.Action.Added)) { + boolean success = parser.addAliasSymbol(event.symbol); + if (success) { + logger.info("Added alias symbol '"+event.symbol.getKeyword()+"' to parser"); + } else { + logger.warning("Failed to add alias symbol '"+event.symbol.getKeyword()+" to parser"); + } + } else { + boolean success = parser.removeAliasSymbol(event.symbol.getKeyword()); + if (success) { + logger.info("Removed alias symbol '"+event.symbol.getKeyword()+"' from parser"); + } else { + logger.warning("Failed to remove alias symbol '"+event.symbol.getKeyword()+" from parser"); + } + } + } + + @Override + public boolean canParseHeader(String header) { + return parser.isCommandParserRegistered(header); + } +} +``` +###### \java\seedu\savvytasker\logic\parser\AddCommandParser.java +``` java +package seedu.savvytasker.logic.parser; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import seedu.savvytasker.commons.core.Messages; +import seedu.savvytasker.logic.commands.AddCommand; +import seedu.savvytasker.logic.parser.DateParser.InferredDate; +import seedu.savvytasker.model.task.PriorityLevel; +import seedu.savvytasker.model.task.RecurrenceType; + +public class AddCommandParser implements CommandParser { + private static final String HEADER = "add"; + private static final String READABLE_FORMAT = HEADER+" TASK_NAME [s/START_DATE] " + + "[e/END_DATE] [l/LOCATION] [p/PRIORITY_LEVEL] [r/RECURRING_TYPE] " + + "[n/NUMBER_OF_RECURRENCE] [c/CATEGORY] [d/DESCRIPTION]"; + + private static final String REGEX_REF_TASK_NAME = "TaskName"; + private static final String REGEX_REF_START_DATE = "StartDate"; + private static final String REGEX_REF_END_DATE = "EndDate"; + private static final String REGEX_REF_LOCATION = "Location"; + private static final String REGEX_REF_PRIORITY_LEVEL = "Priority"; + private static final String REGEX_REF_RECURRING_TYPE = "RecurringType"; + private static final String REGEX_REF_NUMBER_OF_RECURRENCE = "RecurringNumber"; + private static final String REGEX_REF_CATEGORY = "Category"; + private static final String REGEX_REF_DESCRIPTION = "Description"; + + private static final Pattern REGEX_PATTERN = Pattern.compile( + HEADER+"\\s+(?<"+REGEX_REF_TASK_NAME+">([^/]+?(\\s+|$))+)((?<=\\s)(" + + "(s/(?<"+REGEX_REF_START_DATE+">[^/]+)(?!.*\\ss/))|" + + "(e/(?<"+REGEX_REF_END_DATE+">[^/]+)(?!.*\\se/))|" + + "(l/(?<"+REGEX_REF_LOCATION+">[^/]+)(?!.*\\sl/))|" + + "(p/(?<"+REGEX_REF_PRIORITY_LEVEL+">[^/]+)(?!.*\\sp/))|" + + "(r/(?<"+REGEX_REF_RECURRING_TYPE+">[^/]+)(?!.*\\sr/))|" + + "(n/(?<"+REGEX_REF_NUMBER_OF_RECURRENCE+">[^/]+)(?!.*\\sn/))|" + + "(c/(?<"+REGEX_REF_CATEGORY+">[^/]+)(?!.*\\sc/))|" + + "(d/(?<"+REGEX_REF_DESCRIPTION+">[^/]+)(?!.*\\sd/))" + + ")(\\s|$)){0,10}", Pattern.CASE_INSENSITIVE); + + private static final TaskFieldParser TASK_PARSER = new TaskFieldParser(); + + @Override + public String getHeader() { + return HEADER; + } + + @Override + public String getRequiredFormat() { + return READABLE_FORMAT; + } + + @Override + public AddCommand parse(String commandText) throws ParseException { + Matcher matcher = REGEX_PATTERN.matcher(commandText); + if (matcher.matches()) { + InferredDate startDate = TASK_PARSER.parseStartDate(matcher.group(REGEX_REF_START_DATE)); + InferredDate endDate = TASK_PARSER.parseEndDate(matcher.group(REGEX_REF_END_DATE)); + String taskName = TASK_PARSER.parseTaskName(matcher.group(REGEX_REF_TASK_NAME)); + String location = TASK_PARSER.parseLocation(matcher.group(REGEX_REF_LOCATION)); + PriorityLevel priority = TASK_PARSER.parsePriorityLevel(matcher.group(REGEX_REF_PRIORITY_LEVEL)); + RecurrenceType recurrence = TASK_PARSER.parseRecurrenceType(matcher.group(REGEX_REF_RECURRING_TYPE)); + Integer nrOfRecurrence = TASK_PARSER.parseNumberOfRecurrence(matcher.group(REGEX_REF_NUMBER_OF_RECURRENCE)); + String category = TASK_PARSER.parseCategory(matcher.group(REGEX_REF_CATEGORY)); + String description = TASK_PARSER.parseDescription(matcher.group(REGEX_REF_DESCRIPTION)); + + return new AddCommand(taskName, startDate, + endDate, location, priority, + recurrence, nrOfRecurrence, + category, description); + } + + throw new ParseException(commandText, String.format( + Messages.MESSAGE_INVALID_COMMAND_FORMAT, getRequiredFormat())); + } + +} +``` +###### \java\seedu\savvytasker\logic\parser\AliasCommandParser.java +``` java +package seedu.savvytasker.logic.parser; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import seedu.savvytasker.commons.core.Messages; +import seedu.savvytasker.logic.commands.AliasCommand; + +public class AliasCommandParser implements CommandParser { + private static final String HEADER = "alias"; + private static final String READABLE_FORMAT = HEADER+" k/KEYWORD r/REPRESENTATION"; + + private static final String REGEX_REF_REPRESENTATION = "Text"; + private static final String REGEX_REF_KEYWORD = "Keyword"; + + private static final Pattern REGEX_PATTERN = Pattern.compile( + HEADER+"\\s+((?<=\\s)(" + + "(r/(?<"+REGEX_REF_REPRESENTATION+">[^/]+)(?!.*\\sr/))|" + + "(k/(?<"+REGEX_REF_KEYWORD+">[^/]+)(?!.*\\sk/))" + + ")(\\s|$)){2}" + ); + + @Override + public String getHeader() { + return HEADER; + } + + @Override + public String getRequiredFormat() { + return READABLE_FORMAT; + } + + @Override + public boolean shouldPreprocess() { + return false; + } + + @Override + public AliasCommand parse(String commandText) throws ParseException { + Matcher matcher = REGEX_PATTERN.matcher(commandText); + if (matcher.matches()) { + String representation = parseRepresentation(matcher.group(REGEX_REF_REPRESENTATION)); + String keyword = parseKeyword(matcher.group(REGEX_REF_KEYWORD)); + return new AliasCommand(keyword, representation); + } + + throw new ParseException(commandText, String.format( + Messages.MESSAGE_INVALID_COMMAND_FORMAT, getRequiredFormat())); + } + + private String parseRepresentation(String originalText) throws ParseException { + String trimmedText = originalText.trim(); + + if (trimmedText.isEmpty()) + throw new ParseException(trimmedText, "REPRESENTATION: Needs to be at least one character!"); + + return trimmedText; + } + + private String parseKeyword(String keywordText) throws ParseException { + String trimmedKeywordText = keywordText.trim(); + if (trimmedKeywordText.length() < 2) { + throw new ParseException(trimmedKeywordText, "KEYWORD: Needs to consist at least 2 character."); + } + if (trimmedKeywordText.matches(".*\\s+.*")) { + throw new ParseException(trimmedKeywordText, "KEYWORD: Needs to be a single word without spaces."); + } + return trimmedKeywordText; + } +} +``` +###### \java\seedu\savvytasker\logic\parser\ClearCommandParser.java +``` java +package seedu.savvytasker.logic.parser; + +import seedu.savvytasker.commons.core.Messages; +import seedu.savvytasker.logic.commands.ClearCommand; + +public class ClearCommandParser implements CommandParser { + private static final String HEADER = "clear"; + private static final String READABLE_FORMAT = HEADER; + + @Override + public String getHeader() { + return HEADER; + } + + @Override + public String getRequiredFormat() { + return READABLE_FORMAT; + } + + @Override + public ClearCommand parse(String commandText) throws ParseException { + if (commandText.trim().equalsIgnoreCase(HEADER)) { + return new ClearCommand(); + } + + throw new ParseException(commandText, String.format( + Messages.MESSAGE_INVALID_COMMAND_FORMAT, getRequiredFormat())); + } + +} +``` +###### \java\seedu\savvytasker\logic\parser\CommandParser.java +``` java +package seedu.savvytasker.logic.parser; + +import seedu.savvytasker.logic.commands.Command; + +/** + * This interface should be implemented by specialized parsers that want to + * parse a specific command. The text passed to such a parser will be + * guaranteed to have its header (the leading word) matching the String + * returned by the abstract getHeader() method supplied by its implementation. + * + * @param A Command that this Parser is going to produce upon successful parsing + */ +public interface CommandParser { + /** + * Indicates whether this parser would like to have the text supplied to it + * preprocessed. The default behaviour is to allow preprocessing. + * Subclasses should override this method to return false if they do not want + * the text to be preprocessed. + * + * @return true if preprocessing is desired, false otherwise + */ + public default boolean shouldPreprocess() { + return true; + } + + /** + * Gets the header of this command parser. + * The header is the first token of a command text, used to identify which + * CommandParser the command text will be dispatched to. Subclasses should + * implement this method to indicate their header so that any command text that + * starts with such a header will be given to them. This method should always + * return the same value, must return a string as a single token with no whitespaces + * in between, and must not return null or empty string. + * + * @return header string + */ + public String getHeader(); + + /** + * Gets the human-readable format of the string required by this command parser to + * parse correctly. Subclasses should implement this method to provide the above described. + * This method should not return null, and should return the same value every time. + * + * @return a human-readable format required by this parser + */ + public String getRequiredFormat(); + + /** + * Parses the command text and returns the resulting command built from the parse. + * Subclasses should implement this method to do their parsing. If the command text + * is not as what they expect, subclasses should throw a ParseException. + * + * @param commandText the full command text, including the header + * @return the resulting command object which can then be executed + * @throws ParseException if the commandText has an incorrect syntax + */ + public T parse(String commandText) throws ParseException; + +} +``` +###### \java\seedu\savvytasker\logic\parser\DateParser.java +``` java +package seedu.savvytasker.logic.parser; + +import java.util.Date; +import java.util.List; + +import com.joestelmach.natty.DateGroup; + +public class DateParser { + /** + * Represents a date-time that may be partially inferred on its + * date component or time component. If both components are not + * inferred, then the date-time is exactly as the user has specified + * it to be. + */ + public class InferredDate { + private final Date inferredDateTime; + private final boolean dateInferred; + private final boolean timeInferred; + + private InferredDate(Date inferredDateTime, boolean dateInferred, boolean timeInferred) { + this.inferredDateTime = inferredDateTime; + this.dateInferred = dateInferred; + this.timeInferred = timeInferred; + } + + /** + * Gets the inferred date-time. + * @return the inferred date-time + */ + public Date getInferredDateTime() { + return this.inferredDateTime; + } + + /** + * Checks if the date component is inferred + * @return true if inferred, false otherwise + */ + public boolean isDateInferred() { + return this.dateInferred; + } + + /** + * Checks if the time component is inferred + * @return true if inferred, false otherwise + */ + public boolean isTimeInferred() { + return this.timeInferred; + } + } + + private com.joestelmach.natty.Parser nattyParser; + + public DateParser() { + this.nattyParser = new com.joestelmach.natty.Parser(); + } + + /** + * Parses an input for a single date. It is considered a parsing error + * if multiple dates are specified in the given input. + * + * @param input the input to be parsed + * @return an InferredDate object resulting from the parsing + * @throws ParseException if the input contains multiple dates or no dates. + */ + public InferredDate parseSingle(String input) throws ParseException { + assert input != null; + List dateGroups = this.nattyParser.parse(input); + int totalDates = countDates(dateGroups); + + if (totalDates == 0) + throw new ParseException(input, "Failed to understand given date."); + + if (totalDates > 1) + throw new ParseException(input, "Too many dates entered."); + + DateGroup group = dateGroups.get(0); + return new InferredDate( + group.getDates().get(0), + group.isDateInferred(), + group.isTimeInferred()); + + } + + private int countDates(List dateGroups) { + int totalNumOfDates = 0; + for(DateGroup group : dateGroups) { + totalNumOfDates += group.getDates().size(); + } + return totalNumOfDates; + } +} +``` +###### \java\seedu\savvytasker\logic\parser\DeleteCommandParser.java +``` java +package seedu.savvytasker.logic.parser; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import seedu.savvytasker.commons.core.Messages; +import seedu.savvytasker.logic.commands.DeleteCommand; + +public class DeleteCommandParser implements CommandParser { + private static final String HEADER = "delete"; + private static final String READABLE_FORMAT = HEADER+" INDEX [MORE_INDEX]"; + + private static final String REGEX_REF_INDICES = "Indices"; + + private static final Pattern REGEX_PATTERN = Pattern.compile( + HEADER+"\\s+(?<"+REGEX_REF_INDICES+">[^/]+)", Pattern.CASE_INSENSITIVE); + + private static final IndexParser INDEX_PARSER = new IndexParser(); + + @Override + public String getHeader() { + return HEADER; + } + + @Override + public String getRequiredFormat() { + return READABLE_FORMAT; + } + + @Override + public DeleteCommand parse(String commandText) throws ParseException { + Matcher matcher = REGEX_PATTERN.matcher(commandText); + if (matcher.matches()) { + int[] indices = parseIndices(matcher.group(REGEX_REF_INDICES)); + return new DeleteCommand(indices); + } + + throw new ParseException(commandText, String.format( + Messages.MESSAGE_INVALID_COMMAND_FORMAT, getRequiredFormat())); + } + + private int[] parseIndices(String indicesText) throws ParseException { + try { + return INDEX_PARSER.parseMultiple(indicesText); + } catch (ParseException ex) { + throw new ParseException(indicesText, String.format(Messages.MESSAGE_INVALID_COMMAND_FORMAT, getRequiredFormat() + ": " + ex.getFailureDetails())); + } + } + +} +``` +###### \java\seedu\savvytasker\logic\parser\ExitCommandParser.java +``` java +package seedu.savvytasker.logic.parser; + +import seedu.savvytasker.commons.core.Messages; +import seedu.savvytasker.logic.commands.ExitCommand; + +public class ExitCommandParser implements CommandParser { + private static final String HEADER = "exit"; + private static final String READABLE_FORMAT = HEADER; + + @Override + public String getHeader() { + return HEADER; + } + + @Override + public String getRequiredFormat() { + return READABLE_FORMAT; + } + + @Override + public ExitCommand parse(String commandText) throws ParseException { + if (commandText.trim().equalsIgnoreCase(HEADER)) { + return new ExitCommand(); + } + + throw new ParseException(commandText, String.format( + Messages.MESSAGE_INVALID_COMMAND_FORMAT, getRequiredFormat())); + } + +} +``` +###### \java\seedu\savvytasker\logic\parser\FindCommandParser.java +``` java +package seedu.savvytasker.logic.parser; + +import java.util.Arrays; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import seedu.savvytasker.commons.core.Messages; +import seedu.savvytasker.logic.commands.FindCommand; +import seedu.savvytasker.model.task.FindType; + +public class FindCommandParser implements CommandParser { + private static final String HEADER = "find"; + private static final String READABLE_FORMAT = "find [t/FIND_TYPE] KEYWORD [MORE_KEYWORDS]"; + + private static final String REGEX_REF_KEYWORDS_BEFORE_TYPE = "Before"; + private static final String REGEX_REF_FIND_TYPE = "FindType"; + private static final String REGEX_REF_KEYWORDS_AFTER_TYPE = "After"; + + private static final Pattern REGEX_PATTERN = Pattern.compile( + HEADER+"\\s+(?<"+REGEX_REF_KEYWORDS_BEFORE_TYPE+">([^/]+(\\s+|$))*)" + + "(t/(?<"+REGEX_REF_FIND_TYPE+">[^/]+?)(?!.*\\st/)(\\s+|$))?" + + "(?<"+REGEX_REF_KEYWORDS_AFTER_TYPE+">([^/]+(\\s+|$))*)" + , Pattern.CASE_INSENSITIVE); + + @Override + public String getHeader() { + return HEADER; + } + + @Override + public String getRequiredFormat() { + return READABLE_FORMAT; + } + +``` +###### \java\seedu\savvytasker\logic\parser\HelpCommandParser.java +``` java +package seedu.savvytasker.logic.parser; + +import seedu.savvytasker.commons.core.Messages; +import seedu.savvytasker.logic.commands.HelpCommand; + +public class HelpCommandParser implements CommandParser { + private static final String HEADER = "help"; + private static final String READABLE_FORMAT = HEADER; + + @Override + public String getHeader() { + return HEADER; + } + + @Override + public String getRequiredFormat() { + return READABLE_FORMAT; + } + + @Override + public HelpCommand parse(String commandText) throws ParseException { + if (commandText.trim().equalsIgnoreCase(HEADER)) { + return new HelpCommand(); + } + + throw new ParseException(commandText, String.format( + Messages.MESSAGE_INVALID_COMMAND_FORMAT, getRequiredFormat())); + } + +} +``` +###### \java\seedu\savvytasker\logic\parser\IndexParser.java +``` java +package seedu.savvytasker.logic.parser; + +import java.util.Arrays; + +/** + * A class for parsing a single index or multiple indices. An index is + * a positive integer that may be used by commands to indicate which task + * they act on. + */ +public class IndexParser { + public static String INDEX_MUST_BE_POSITIVE = "Must be positive whole numbers."; + /** + * Parses a single index. + * + * @param indexText the text to parse + * @return the resulting index + * @throws ParseException if there are more than one integer in the text, or if + * the integer given is not positive + */ + public int parseSingle(String indexText) throws ParseException { + boolean parseError = false; + + String trimmedIndexText = indexText.trim(); + int index = 0; + try { + index = Integer.parseInt(trimmedIndexText); + + if (index <= 0) + parseError = true; + } catch (NumberFormatException ex) { + parseError = true; + } + + if (parseError) + throw new ParseException(trimmedIndexText, "Must be a positive whole number."); + + return index; + } + + /** + * Parses multiple indices, delimited by space. + * + * @param indicesText the text to parse + * @return an array of the resulting indices + * @throws ParseException if any of the indices is not a positive integer + */ + public int[] parseMultiple(String indicesText) throws ParseException { + boolean parseError = false; + + String trimmedIndicesText = indicesText.trim(); + int[] indices = null; + try { + indices = Arrays + .stream(trimmedIndicesText.split("\\s+")) + .mapToInt(Integer::parseInt) + .toArray(); + + for(int index : indices) { + if (index <= 0) { + parseError = true; + break; + } + } + } catch (NumberFormatException ex) { + parseError = true; + } + + if (parseError) + throw new ParseException(trimmedIndicesText, INDEX_MUST_BE_POSITIVE); + + return indices; + } +} +``` +###### \java\seedu\savvytasker\logic\parser\ListCommandParser.java +``` java +package seedu.savvytasker.logic.parser; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import seedu.savvytasker.commons.core.Messages; +import seedu.savvytasker.logic.commands.ListCommand; +import seedu.savvytasker.model.task.ListType; + +public class ListCommandParser implements CommandParser { + private static final String HEADER = "list"; + private static final String READABLE_FORMAT = HEADER+" [t/LIST_TYPE]"; + + private static final String REGEX_REF_LIST_TYPE = "ListType"; + + private static final Pattern REGEX_PATTERN = Pattern.compile( + HEADER+"\\s*((?<=\\s)t/(?<"+REGEX_REF_LIST_TYPE+">[^/]+))?", + Pattern.CASE_INSENSITIVE); + + @Override + public String getHeader() { + return HEADER; + } + + @Override + public String getRequiredFormat() { + return READABLE_FORMAT; + } + + @Override + public ListCommand parse(String commandText) throws ParseException { + Matcher matcher = REGEX_PATTERN.matcher(commandText); + if (matcher.matches()) { + ListType listType = parseListType(matcher.group(REGEX_REF_LIST_TYPE)); + + return new ListCommand(listType); + } + + throw new ParseException(commandText, String.format( + Messages.MESSAGE_INVALID_COMMAND_FORMAT, getRequiredFormat())); + } + + private ListType parseListType(String listTypeText) throws ParseException { + if (listTypeText == null) + return null; + + try { + listTypeText = listTypeText.trim(); + return ListType.valueOfIgnoreCase(listTypeText.replaceAll("\\s", "")); + } catch (IllegalArgumentException ex) { + throw new ParseException(listTypeText, "LIST_TYPE: Unknown type '" + listTypeText + "'"); + } + } +} +``` +###### \java\seedu\savvytasker\logic\parser\MarkCommandParser.java +``` java +package seedu.savvytasker.logic.parser; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import seedu.savvytasker.commons.core.Messages; +import seedu.savvytasker.logic.commands.MarkCommand; + +public class MarkCommandParser implements CommandParser { + private static final String HEADER = "mark"; + private static final String READABLE_FORMAT = HEADER+" INDEX [MORE_INDEX]"; + + private static final String REGEX_REF_INDICES = "Indices"; + + private static final Pattern REGEX_PATTERN = Pattern.compile( + HEADER+"\\s+(?<"+REGEX_REF_INDICES+">[^/]+)", Pattern.CASE_INSENSITIVE); + + private static final IndexParser INDEX_PARSER = new IndexParser(); + + @Override + public String getHeader() { + return HEADER; + } + + @Override + public String getRequiredFormat() { + return READABLE_FORMAT; + } + + @Override + public MarkCommand parse(String commandText) throws ParseException { + Matcher matcher = REGEX_PATTERN.matcher(commandText); + if (matcher.matches()) { + int[] indices = parseIndices(matcher.group(REGEX_REF_INDICES)); + return new MarkCommand(indices); + } + + throw new ParseException(commandText, String.format( + Messages.MESSAGE_INVALID_COMMAND_FORMAT, getRequiredFormat())); + } + + private int[] parseIndices(String indicesText) throws ParseException { + try { + return INDEX_PARSER.parseMultiple(indicesText); + } catch (ParseException ex) { + throw new ParseException(indicesText, "INDEX [MORE_INDEX]: " + ex.getFailureDetails()); + } + } + +} +``` +###### \java\seedu\savvytasker\logic\parser\MasterParser.java +``` java +package seedu.savvytasker.logic.parser; + +import static seedu.savvytasker.commons.core.Messages.MESSAGE_INVALID_COMMAND_FORMAT; +import static seedu.savvytasker.commons.core.Messages.MESSAGE_UNKNOWN_COMMAND; + +import java.util.HashMap; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import seedu.savvytasker.logic.commands.Command; +import seedu.savvytasker.logic.commands.HelpCommand; +import seedu.savvytasker.logic.commands.IncorrectCommand; +import seedu.savvytasker.model.alias.AliasSymbol; + +public class MasterParser { + private static final Pattern KEYWORD_PATTERN = + Pattern.compile("(\\S+)(\\s+|$)"); + + private final Map> commandParsers; + private final Map aliasingSymbols; + + public MasterParser() { + this.commandParsers = new HashMap>(); + this.aliasingSymbols = new HashMap(); + } + + public Command parse(String userInput) { + String[] pieces = preprocessInitial(userInput.trim()); + if (pieces == null) + return new IncorrectCommand(userInput, String.format(MESSAGE_INVALID_COMMAND_FORMAT, HelpCommand.MESSAGE_USAGE)); + + String header = pieces[0]; + String body = pieces[1]; + String trueHeader = extractHeader(header); + CommandParser parser = commandParsers.get(trueHeader); + if (parser == null) + return new IncorrectCommand(header + body, MESSAGE_UNKNOWN_COMMAND); + if (parser.shouldPreprocess()) + body = preprocessBody(body); + + String combined = header + body; + try { + return parser.parse(combined); + } catch (ParseException pe) { + return new IncorrectCommand(combined, String.format(pe.getFailureDetails())); + } + } + + /** + * Does an initial preprocessing of a command text in case the header is aliased. + * Returns a string array with 2 elements: the first is the header which is possibly aliased, + * which will be replaced with the representation of the aliasing, whereas the + * second is the body. If no header is found, this method returns null. + * + * @param commandText the command text + * @return a string array containing 2 elements, first is the header, second is the body; or null if + * there is no header in the command text + */ + private String[] preprocessInitial(String commandText) { + Matcher matcher = KEYWORD_PATTERN.matcher(commandText); + + if (matcher.find()) { + String header = matcher.group(1); + String spaces = matcher.group(2); + + AliasSymbol symbol = aliasingSymbols.get(header); + if (symbol != null) { + header = symbol.getRepresentation(); + } + + String body = commandText.substring(matcher.end()); + return new String[] {header + spaces, body}; + } + + return null; + } + + /** + * Gets the header from the preprocessed header as a preprocessed header may contain + * several tokens. + * + * @param preprocessedHeader the preprocessed header + * @return the true header + */ + private String extractHeader(String preprocessedHeader) { + Matcher matcher = KEYWORD_PATTERN.matcher(preprocessedHeader); + + if (matcher.find()) { + return matcher.group(1); + } + + return null; + } + + /** + * Preprocess the body to replace keywords with their replacement if they are aliased. + * @param bodyText the body text + * @return the preprocessed body text + */ + private String preprocessBody(String bodyText) { + StringBuilder builder = new StringBuilder(); + Matcher matcher = KEYWORD_PATTERN.matcher(bodyText); + + while (matcher.find()) { + String keyword = matcher.group(1); + String spaces = matcher.group(2); // Preserves the amount of spaces as that may be what user wants + + AliasSymbol symbol = aliasingSymbols.get(keyword); + if (symbol != null) + keyword = symbol.getRepresentation(); + + builder.append(keyword); + builder.append(spaces); + } + + return builder.toString(); + } + + /** + * Registers a command parser that will be used by the master parser, and return true if it + * is successfully registered. The header of this command parser should not be used by any + * other registered command parsers or used by any AliasSymbol whose keyword is the registered + * with the same name, or false will be return and the parser will not be added. Use + * {@link #isCommandParserRegistered(String) isCommandParserRegistered } method to check if + * a command parser is already registered, and {@link #doesAliasSymbolExist(String) doesAliasSymbolExist} + * + * Parameter commandParser should not be null. + * + * @param commandParser the command parser + * @return true if successfully registered, false if there is an parser with the same header + * already registered or if an alias with the same keyword is previously added. + */ + public boolean registerCommandParser(CommandParser commandParser) { + assert commandParser != null; + + if (commandParsers.containsKey(commandParser.getHeader())) + return false; + if (aliasingSymbols.containsKey(commandParser.getHeader())) + return false; + + commandParsers.put(commandParser.getHeader(), commandParser); + return true; + } + + /** + * Checks if a command parser with the specified header is already + * registered into the master parser. + * + * @param header the header to check against + * @return true if such a command parser is registered, false otherwise + */ + public boolean isCommandParserRegistered(String header) { + return commandParsers.containsKey(header); + } + + /** + * Unregisters and returns the command parser that uses the specified header. + * If such a parser is not registered, null is returned. + * + * @param header the header to check against + * @return the CommandParser object that uses the specified header. + */ + public CommandParser unregisterCommandParser(String header) { + return commandParsers.remove(header); + } + + /** + * Adds an aliasing symbol to be used by the parser to replace all such the symbol's keyword with + * its representation before parsing. If a symbol with an identical keyword exists, calling this + * method has no effect and just returns false. + * + * @param symbol the symbol, cannot be null. + * @return true if this symbol is added successfully, false if another symbol with the same keyword + * already exists or the keyword is used by a command and this symbol cannot be added. + */ + public boolean addAliasSymbol(AliasSymbol symbol) { + assert symbol != null; + + if (aliasingSymbols.containsKey(symbol.getKeyword())) + return false; + if (isCommandParserRegistered(symbol.getKeyword())) + return false; + + aliasingSymbols.put(symbol.getKeyword(), symbol); + return true; + } + + /** + * Removes an aliasing symbol, identified by its keyword. The parser will no longer replace the + * keyword of this symbol with its representation before parsing. + * + * @param symbol the symbol to remove, cannot be null + * @return true if the symbol exists and is removed, false otherwise + */ + public boolean removeAliasSymbol(String symbolKeyword) { + assert symbolKeyword != null; + + return aliasingSymbols.remove(symbolKeyword) != null; + } + + /** + * Returns true if a symbol with the specified keyword exists, false otherwise. + * @param symbolKeyword the keyword to check for, cannot be null + * @return true if the symbol exists, false otherwise + */ + public boolean doesAliasSymbolExist(String symbolKeyword) { + assert symbolKeyword != null; + + return aliasingSymbols.containsKey(symbolKeyword); + } + + /** + * Clears all existing symbols. + * @see #removeAliasSymbol + */ + public void clearAllAliasSymbols() { + aliasingSymbols.clear(); + } +} +``` +###### \java\seedu\savvytasker\logic\parser\ModifyCommandParser.java +``` java +package seedu.savvytasker.logic.parser; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import seedu.savvytasker.commons.core.Messages; +import seedu.savvytasker.logic.commands.ModifyCommand; +import seedu.savvytasker.logic.parser.DateParser.InferredDate; +import seedu.savvytasker.model.task.PriorityLevel; +import seedu.savvytasker.model.task.RecurrenceType; + +public class ModifyCommandParser implements CommandParser { + private static final String HEADER = "modify"; + private static final String READABLE_FORMAT = HEADER+" INDEX [t/TASK_NAME] [s/START_DATE] " + + "[e/END_DATE] [l/LOCATION] [p/PRIORITY_LEVEL] [r/RECURRING_TYPE] " + + "[n/NUMBER_OF_RECURRENCE] [c/CATEGORY] [d/DESCRIPTION]"; + + private static final String REGEX_REF_INDEX = "Index"; + private static final String REGEX_REF_TASK_NAME = "TaskName"; + private static final String REGEX_REF_START_DATE = "StartDate"; + private static final String REGEX_REF_END_DATE = "EndDate"; + private static final String REGEX_REF_LOCATION = "Location"; + private static final String REGEX_REF_PRIORITY_LEVEL = "Priority"; + private static final String REGEX_REF_RECURRING_TYPE = "RecurringType"; + private static final String REGEX_REF_NUMBER_OF_RECURRENCE = "RecurringNumber"; + private static final String REGEX_REF_CATEGORY = "Category"; + private static final String REGEX_REF_DESCRIPTION = "Description"; + + private static final Pattern REGEX_PATTERN = Pattern.compile( + HEADER+"\\s+(?<"+REGEX_REF_INDEX+">([^/]+?(\\s+|$))+)((?<=\\s)(" + + "(t/(?<"+REGEX_REF_TASK_NAME+">[^/]+)(?!.*\\st/))|" + + "(s/(?<"+REGEX_REF_START_DATE+">[^/]+)(?!.*\\ss/))|" + + "(e/(?<"+REGEX_REF_END_DATE+">[^/]+)(?!.*\\se/))|" + + "(l/(?<"+REGEX_REF_LOCATION+">[^/]+)(?!.*\\sl/))|" + + "(p/(?<"+REGEX_REF_PRIORITY_LEVEL+">[^/]+)(?!.*\\sp/))|" + + "(r/(?<"+REGEX_REF_RECURRING_TYPE+">[^/]+)(?!.*\\sr/))|" + + "(n/(?<"+REGEX_REF_NUMBER_OF_RECURRENCE+">[^/]+?)(?!.*\\sn/))|" + + "(c/(?<"+REGEX_REF_CATEGORY+">[^/]+)(?!.*\\sc/))|" + + "(d/(?<"+REGEX_REF_DESCRIPTION+">[^/]+)(?!.*\\sd/))" + + ")(\\s|$)){0,11}", Pattern.CASE_INSENSITIVE); + + private static final TaskFieldParser TASK_PARSER = new TaskFieldParser(); + private static final IndexParser INDEX_PARSER = new IndexParser(); + + @Override + public String getHeader() { + return HEADER; + } + + @Override + public String getRequiredFormat() { + return READABLE_FORMAT; + } + + @Override + public ModifyCommand parse(String commandText) throws ParseException { + Matcher matcher = REGEX_PATTERN.matcher(commandText); + if (matcher.matches()) { + + int index = parseIndex(matcher.group(REGEX_REF_INDEX)); + InferredDate startDate = TASK_PARSER.parseStartDate(matcher.group(REGEX_REF_START_DATE)); + InferredDate endDate = TASK_PARSER.parseEndDate(matcher.group(REGEX_REF_END_DATE)); + String taskName = TASK_PARSER.parseTaskName(matcher.group(REGEX_REF_TASK_NAME)); + String location = TASK_PARSER.parseLocation(matcher.group(REGEX_REF_LOCATION)); + PriorityLevel priority = TASK_PARSER.parsePriorityLevel(matcher.group(REGEX_REF_PRIORITY_LEVEL)); + RecurrenceType recurrence = TASK_PARSER.parseRecurrenceType(matcher.group(REGEX_REF_RECURRING_TYPE)); + Integer nrOfRecurrence = TASK_PARSER.parseNumberOfRecurrence(matcher.group(REGEX_REF_NUMBER_OF_RECURRENCE)); + String category = TASK_PARSER.parseCategory(matcher.group(REGEX_REF_CATEGORY)); + String description = TASK_PARSER.parseDescription(matcher.group(REGEX_REF_DESCRIPTION)); + + return new ModifyCommand(index, taskName, startDate, + endDate, location, priority, + recurrence, nrOfRecurrence, + category, description); + } + + throw new ParseException(commandText, String.format( + Messages.MESSAGE_INVALID_COMMAND_FORMAT, getRequiredFormat())); + } + + private int parseIndex(String indexText) throws ParseException { + try { + return INDEX_PARSER.parseSingle(indexText); + } catch (ParseException ex) { + throw new ParseException(indexText, "INDEX: " + ex.getFailureDetails()); + } + } +} +``` +###### \java\seedu\savvytasker\logic\parser\ParseException.java +``` java +package seedu.savvytasker.logic.parser; + +/** + * This exception should be thrown by parsers when they are unable to + * parse a string of tokens. + */ +public class ParseException extends Exception { + private static final long serialVersionUID = -1157747299012674373L; + private final String parsedString; + private final String failureDetails; + + /** + * Constructs a ParseException object with the original string that + * the parser failed to parse, with no further details to why the + * parser failed to parse the string + * + * @param parsedString the erroneous string + */ + public ParseException(String parsedString) { + this(parsedString, ""); + } + + /** + * Constructs a ParseException object with the original string that + * the parser failed to parse, and further details to why the parser + * failed to parse the string. + * + * @param parsedString the erroneous string + * @param failureDetails the failure details + */ + public ParseException(String parsedString, String failureDetails) { + super("Failed to parse " + parsedString + ". " + failureDetails); + this.parsedString = parsedString; + this.failureDetails = failureDetails; + } + + public String getParsedString() { + return this.parsedString; + } + + public String getFailureDetails() { + return this.failureDetails; + } +} +``` +###### \java\seedu\savvytasker\logic\parser\RedoCommandParser.java +``` java +package seedu.savvytasker.logic.parser; + +import seedu.savvytasker.commons.core.Messages; +import seedu.savvytasker.logic.commands.RedoCommand; + +public class RedoCommandParser implements CommandParser { + private static final String HEADER = "redo"; + private static final String READABLE_FORMAT = HEADER; + + @Override + public String getHeader() { + return HEADER; + } + + @Override + public String getRequiredFormat() { + return READABLE_FORMAT; + } + + @Override + public RedoCommand parse(String commandText) throws ParseException { + if (commandText.trim().equalsIgnoreCase(HEADER)) { + return new RedoCommand(); + } + + throw new ParseException(commandText, String.format( + Messages.MESSAGE_INVALID_COMMAND_FORMAT, getRequiredFormat())); + } + +} +``` +###### \java\seedu\savvytasker\logic\parser\TaskFieldParser.java +``` java +package seedu.savvytasker.logic.parser; + +import seedu.savvytasker.logic.parser.DateParser.InferredDate; +import seedu.savvytasker.model.task.PriorityLevel; +import seedu.savvytasker.model.task.RecurrenceType; + +/** + * This class contains common parsing methods for parsing Task fields. + */ +public class TaskFieldParser { + private DateParser dateParser; + + public TaskFieldParser() { + this.dateParser = new DateParser(); + } + + public String parseTaskName(String taskNameText) throws ParseException { + if (taskNameText == null) + return null; + return taskNameText.trim(); + } + + public InferredDate parseStartDate(String dateText) throws ParseException { + return parseDate(dateText, "START_DATE: "); + } + + public InferredDate parseEndDate(String dateText) throws ParseException { + return parseDate(dateText, "END_DATE: "); + } + + private InferredDate parseDate(String dateText, String errorField) throws ParseException { + if (dateText == null) + return null; + + String trimmedDateText = dateText.trim(); + try { + return dateParser.parseSingle(trimmedDateText); + } catch (ParseException ex) { + throw new ParseException(trimmedDateText, errorField + ex.getFailureDetails()); + } + } + + public String parseLocation(String locationText) throws ParseException { + if (locationText == null) + return null; + return locationText.trim(); + } + + public PriorityLevel parsePriorityLevel(String priorityLevelText) throws ParseException { + if (priorityLevelText == null) + return null; + + String trimmedPriorityLevelText = priorityLevelText.trim(); + try { + return PriorityLevel.valueOfIgnoreCase(trimmedPriorityLevelText); + } catch (IllegalArgumentException ex) { + throw new ParseException(trimmedPriorityLevelText, "PRIORITY_LEVEL: Unknown type '" + priorityLevelText + "'"); + } + } + + public RecurrenceType parseRecurrenceType(String recurrenceTypeText) throws ParseException { + if (recurrenceTypeText == null) + return null; + + String trimmedRecurrenceTypeText = recurrenceTypeText.trim(); + try { + return RecurrenceType.valueOfIgnoreCase(trimmedRecurrenceTypeText); + } catch (IllegalArgumentException ex) { + throw new ParseException(trimmedRecurrenceTypeText, "RECURRING_TYPE: Unknown type '" + recurrenceTypeText + "'"); + } + } + + public Integer parseNumberOfRecurrence(String numRecurrenceText) throws ParseException { + if (numRecurrenceText == null) + return null; + + String trimmedNumRecurrenceText = numRecurrenceText.trim(); + int numRecurrence = 0; + boolean parseError = false; + + try { + numRecurrence = Integer.parseInt(trimmedNumRecurrenceText); + if (numRecurrence < 0) + parseError = true; + } catch (NumberFormatException ex) { + parseError = true; + } + + if (parseError) + throw new ParseException(trimmedNumRecurrenceText, "NUMBER_OF_RECURRENCE: Must be a nonnegative whole number!"); + + return numRecurrence; + } + + public String parseCategory(String categoryText) throws ParseException { + if (categoryText == null) + return null; + return categoryText.trim(); + } + + public String parseDescription(String descriptionText) throws ParseException { + if (descriptionText == null) + return null; + return descriptionText.trim(); + } +} +``` +###### \java\seedu\savvytasker\logic\parser\UnaliasCommandParser.java +``` java +package seedu.savvytasker.logic.parser; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import seedu.savvytasker.commons.core.Messages; +import seedu.savvytasker.logic.commands.UnaliasCommand; + +public class UnaliasCommandParser implements CommandParser { + private static final String HEADER = "unalias"; + private static final String READABLE_FORMAT = HEADER+" KEYWORD"; + + private static final String REGEX_REF_KEYWORD = "Keyword"; + + private static final Pattern REGEX_PATTERN = Pattern.compile( + HEADER+"\\s+(?<"+REGEX_REF_KEYWORD+">[^/]+)" + ); + + @Override + public String getHeader() { + return HEADER; + } + + @Override + public String getRequiredFormat() { + return READABLE_FORMAT; + } + + @Override + public boolean shouldPreprocess() { + return false; + } + + @Override + public UnaliasCommand parse(String commandText) throws ParseException { + Matcher matcher = REGEX_PATTERN.matcher(commandText); + if (matcher.matches()) { + String keyword = parseKeyword(matcher.group(REGEX_REF_KEYWORD)); + return new UnaliasCommand(keyword); + } + + throw new ParseException(commandText, String.format( + Messages.MESSAGE_INVALID_COMMAND_FORMAT, getRequiredFormat())); + } + + private String parseKeyword(String keywordText) throws ParseException { + String trimmedKeywordText = keywordText.trim(); + if (trimmedKeywordText.isEmpty()) { + throw new ParseException(trimmedKeywordText, "KEYWORD: Cannot be empty."); + } + return trimmedKeywordText; + } + +} +``` +###### \java\seedu\savvytasker\logic\parser\UndoCommandParser.java +``` java +package seedu.savvytasker.logic.parser; + +import seedu.savvytasker.commons.core.Messages; +import seedu.savvytasker.logic.commands.UndoCommand; + +public class UndoCommandParser implements CommandParser { + private static final String HEADER = "undo"; + private static final String READABLE_FORMAT = HEADER; + + @Override + public String getHeader() { + return HEADER; + } + + @Override + public String getRequiredFormat() { + return READABLE_FORMAT; + } + + @Override + public UndoCommand parse(String commandText) throws ParseException { + if (commandText.trim().equalsIgnoreCase(HEADER)) { + return new UndoCommand(); + } + + throw new ParseException(commandText, String.format( + Messages.MESSAGE_INVALID_COMMAND_FORMAT, getRequiredFormat())); + } + +} +``` +###### \java\seedu\savvytasker\logic\parser\UnmarkCommandParser.java +``` java +package seedu.savvytasker.logic.parser; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import seedu.savvytasker.commons.core.Messages; +import seedu.savvytasker.logic.commands.UnmarkCommand; + +public class UnmarkCommandParser implements CommandParser { + private static final String HEADER = "unmark"; + private static final String READABLE_FORMAT = HEADER+" INDEX [MORE_INDEX]"; + + private static final String REGEX_REF_INDICES = "Indices"; + + private static final Pattern REGEX_PATTERN = Pattern.compile( + HEADER+"\\s+(?<"+REGEX_REF_INDICES+">[^/]+)", Pattern.CASE_INSENSITIVE); + + private static final IndexParser INDEX_PARSER = new IndexParser(); + + @Override + public String getHeader() { + return HEADER; + } + + @Override + public String getRequiredFormat() { + return READABLE_FORMAT; + } + + @Override + public UnmarkCommand parse(String commandText) throws ParseException { + Matcher matcher = REGEX_PATTERN.matcher(commandText); + if (matcher.matches()) { + int[] indices = parseIndices(matcher.group(REGEX_REF_INDICES)); + + // TODO: Integrate UnmarkCommand properly! + return new UnmarkCommand(indices); + } + + throw new ParseException(commandText, String.format( + Messages.MESSAGE_INVALID_COMMAND_FORMAT, getRequiredFormat())); + } + + private int[] parseIndices(String indicesText) throws ParseException { + try { + return INDEX_PARSER.parseMultiple(indicesText); + } catch (ParseException ex) { + throw new ParseException(indicesText, "INDEX [MORE_INDEX]: " + ex.getFailureDetails()); + } + } + +} +``` +###### \java\seedu\savvytasker\model\alias\AliasSymbol.java +``` java +package seedu.savvytasker.model.alias; + +import java.util.Objects; + +/** + * A class that represents a keyword-representation pair. This pair can be used + * by the parser for substituting keywords found in a commandText with its + * representation. Instances of this class are immutable. + */ +public class AliasSymbol { + private final String keyword; + private final String representation; + + /** + * Creates a Symbol object with the specified keyword and its representation. + * The keyword must be a single word without spaces while the representation + * can be any non-empty string. Both parameters cannot be null. + * + * @param keyword + * @param representation + */ + public AliasSymbol(String keyword, String representation) { + assert keyword != null && !keyword.matches(".*\\s+.*"); + assert representation != null && !representation.isEmpty(); + + this.keyword = keyword; + this.representation = representation; + } + + public String getKeyword() { + return this.keyword; + } + + public String getRepresentation() { + return this.representation; + } + + @Override + public String toString() { + return "[Keyword: " + this.keyword + ", Representation: " + this.representation + "]"; + } + + @Override + public boolean equals(Object object) { + return this == object || (object instanceof AliasSymbol && + this.keyword.equals(((AliasSymbol)object).keyword) && + this.representation.equals(((AliasSymbol)object).representation)); + } + + @Override + public int hashCode() { + return Objects.hash(keyword, representation); + } +} +``` +###### \java\seedu\savvytasker\model\alias\AliasSymbolList.java +``` java +package seedu.savvytasker.model.alias; + +import java.util.Iterator; +import java.util.List; + +import edu.emory.mathcs.backport.java.util.Collections; +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; + +public class AliasSymbolList implements Iterable { + private final ObservableList internalList = FXCollections.observableArrayList(); + + /** Default constructor */ + public AliasSymbolList() {} + + /** + * Copy constructor + * @param src the list to copy from, cannot be null + */ + public AliasSymbolList(AliasSymbolList src) { + assert src != null; + internalList.addAll(src.internalList); + } + + @Override + public Iterator iterator() { + return internalList.iterator(); + } + + /** + * Returns true if a symbol with the specified symbolKeyword exists in the list + * @param symbolKeyword the symbolKeyword to check for + * @return true if exists, false otherwise + */ + public boolean contains(String symbolKeyword) { + for (AliasSymbol symbol : internalList) { + if (symbol.getKeyword().equals(symbolKeyword)) + return true; + } + + return false; + } + + /** + * Returns true if the symbol exists in the list. Both keyword and representation must match. + * @param symbol the symol to check for + * @return true if exists, false otherwise + */ + public boolean contains(AliasSymbol symbol) { + return internalList.contains(symbol); + } + + /** + * Adds a symbol to the list. The symbol being added must not have a keyword that clashes with another + * symbol in the list. + * @param symbol the symbol to add, cannot be null + * @throws DuplicateSymbolKeywordException if a symbol with the same keyword already exists + */ + public void addAliasSymbol(AliasSymbol symbol) throws DuplicateSymbolKeywordException { + assert symbol != null; + if (contains(symbol.getKeyword())) + throw new DuplicateSymbolKeywordException(); + internalList.add(symbol); + } + + /** + * Removes a symbol from the list. + * @param symbol the symbol to remove, cannot be null + * @throws SymbolKeywordNotFoundException if no such symbol can be found. + */ + public void removeAliasSymbol(AliasSymbol symbol) throws SymbolKeywordNotFoundException { + assert symbol != null; + if (!contains(symbol)) + throw new SymbolKeywordNotFoundException(); + internalList.remove(symbol); + } + + /** + * Replace an old symbol with a new symbol. The new symbol's keyword must equal to the old + * symbol's keyword. + * + * @param oldSymbol the old symbol to be replaced, cannot be null + * @param newSymbol the new symbol to used to replace, cannot be null + * @throws SymbolKeywordNotFoundException if an old symbol with the keyword is not found. + */ + public void replaceAliasSymbol(AliasSymbol oldSymbol, AliasSymbol newSymbol) throws SymbolKeywordNotFoundException { + assert oldSymbol != null && newSymbol != null; + assert oldSymbol.getKeyword().equals(newSymbol.getKeyword()); + + removeAliasSymbol(oldSymbol); + internalList.add(newSymbol); + } + + /** + * Clears this list and copy all elements from the other list to this. + * @param other the other list + */ + public void reset(AliasSymbolList other) { + assert other != null; + internalList.addAll(other.internalList); // AliasSymbol is immutable, no need for deep copy. + } + + /** + * Gets the size of this list. + * @return the size of this list + */ + public int size() { + return internalList.size(); + } + + public List asReadonly() { + return Collections.unmodifiableList(internalList); + } + + @Override + public boolean equals(Object other) { + return other == this // short circuit if same object + || (other instanceof AliasSymbolList // instanceof handles nulls + && this.internalList.equals( ((AliasSymbolList) other).internalList)); + } + + @Override + public int hashCode() { + return internalList.hashCode(); + } +} +``` +###### \java\seedu\savvytasker\model\alias\DuplicateSymbolKeywordException.java +``` java +package seedu.savvytasker.model.alias; + +import seedu.savvytasker.commons.exceptions.IllegalValueException; + +public class DuplicateSymbolKeywordException extends IllegalValueException { + private static final long serialVersionUID = -5516547118656055929L; + + public DuplicateSymbolKeywordException() { + super("Operation will result in two symbols with the same keyword defined."); + } +} +``` +###### \java\seedu\savvytasker\model\alias\SymbolKeywordNotFoundException.java +``` java +package seedu.savvytasker.model.alias; + +import seedu.savvytasker.commons.exceptions.IllegalValueException; + +public class SymbolKeywordNotFoundException extends IllegalValueException { + private static final long serialVersionUID = -5516547118656055929L; + + public SymbolKeywordNotFoundException() { + super("Unable to find a symbol with the specified keyword."); + } +} +``` +###### \java\seedu\savvytasker\model\ModelManager.java +``` java + + private void indicateAliasSymbolAdded(AliasSymbol symbol) { + raise(new AliasSymbolChangedEvent(symbol, AliasSymbolChangedEvent.Action.Added)); + } + + private void indicateAliasSymbolRemoved(AliasSymbol symbol) { + raise(new AliasSymbolChangedEvent(symbol, AliasSymbolChangedEvent.Action.Removed)); + } +``` +###### \java\seedu\savvytasker\model\ModelManager.java +``` java + @Override + public synchronized void addAliasSymbol(AliasSymbol symbol) throws DuplicateSymbolKeywordException { + savvyTasker.addAliasSymbol(symbol); + indicateSavvyTaskerChanged(); + indicateAliasSymbolAdded(symbol); + } + + @Override + public synchronized void removeAliasSymbol(AliasSymbol symbol) throws SymbolKeywordNotFoundException { + savvyTasker.removeAliasSymbol(symbol); + indicateSavvyTaskerChanged(); + indicateAliasSymbolRemoved(symbol); + } +``` +###### \java\seedu\savvytasker\model\ReadOnlySavvyTasker.java +``` java + + /** + * Returns a defensively copied alias symbol list. + */ + + AliasSymbolList getAliasSymbolList(); +``` +###### \java\seedu\savvytasker\model\ReadOnlySavvyTasker.java +``` java + + /** + * Returns unmodifiable view of symbols list + */ + List getReadOnlyListOfAliasSymbols(); +``` +###### \java\seedu\savvytasker\model\SavvyTasker.java +``` java + + /** + * Adds an alias symbol to savvy tasker. + * @param symbol the symbol to add + * @throws DuplicateSymbolKeywordException if another symbol with the same keyword already exists + */ + public void addAliasSymbol(AliasSymbol symbol) throws DuplicateSymbolKeywordException { + symbols.addAliasSymbol(symbol); + } + + /** + * Removes an alias symbol from savvy tasker. + * @param symbol the symbol to remove + * @throws SymbolKeywordNotFoundException if there is no such symbol + */ + public void removeAliasSymbol(AliasSymbol symbol) throws SymbolKeywordNotFoundException { + symbols.removeAliasSymbol(symbol); + } +``` +###### \java\seedu\savvytasker\model\SavvyTasker.java +``` java + @Override + public List getReadOnlyListOfAliasSymbols() { + return symbols.asReadonly(); + } + + @Override + public AliasSymbolList getAliasSymbolList() { + return new AliasSymbolList(symbols); + } +``` +###### \java\seedu\savvytasker\model\task\FindType.java +``` java +package seedu.savvytasker.model.task; + +/** + * This enum represents the type of matching used when trying to find tasks + * from keywords. + */ +public enum FindType { + /** + * Specifies partial matching of a single keyword. + * Searches by Task's name. + * E.g. 'ap' matches 'happy' + */ + Partial, + /** + * Specifies full matching of a single keyword. + * Searches by Task's name. + * E.g. 'ap' does not match 'happy', 'happy' matches 'very happy' + */ + Full, + /** + * Specifies full matching of all keywords in a set of keywords. + * Searches by Task's name. + * E.g. 'happy' does not match 'very happy', 'very happy' matches 'very happy' + */ + Exact, + /** + * Specifies partial matching of all keywords in a set of keywords. + * Searches by Task's category. + * E.g. 'happy' does not match 'very happy', 'very happy' matches 'very happy' + */ + Category; + + /** + * Gets a FindType enum object from its enum name, ignoring cases. + * @param name the name of the FindType enum object + * @return the corresponding FindType enum object + */ + public static FindType valueOfIgnoreCase(String name) { + for (FindType type : FindType.values()) { + if (type.toString().equalsIgnoreCase(name)) + return type; + } + + throw new IllegalArgumentException("Unknown find type: " + name); + } +} +``` +###### \java\seedu\savvytasker\model\task\ListType.java +``` java +package seedu.savvytasker.model.task; + +/** + * This enum represents the different ways to list tasks. + */ +public enum ListType { + /** + * List tasks by due date. + */ + DueDate, + + /** + * List tasks by priority level. + */ + PriorityLevel, + + /** + * List archived tasks. + */ + Archived; + + /** + * Gets a ListType enum object from its enum name, ignoring cases. + * @param name the name of the ListType enum object + * @return the corresponding ListType enum object + */ + public static ListType valueOfIgnoreCase(String name) { + for (ListType type : ListType.values()) { + if (type.toString().equalsIgnoreCase(name)) + return type; + } + + throw new IllegalArgumentException("Unknown list type: " + name); + } +} +``` +###### \java\seedu\savvytasker\model\task\PriorityLevel.java +``` java +package seedu.savvytasker.model.task; + +/** + * This enum represents the priority level of tasks. + */ +public enum PriorityLevel { + Low, + Medium, + High; + + /** + * Gets a PriorityLevel enum object from its enum name, ignoring cases. + * @param name the name of the PriorityLevel enum object + * @return the corresponding PriorityLevel enum object + */ + public static PriorityLevel valueOfIgnoreCase(String name) { + for (PriorityLevel type : PriorityLevel.values()) { + if (type.toString().equalsIgnoreCase(name)) + return type; + } + + throw new IllegalArgumentException("Unknown priority level: " + name); + } +} +``` +###### \java\seedu\savvytasker\model\task\RecurrenceType.java +``` java +package seedu.savvytasker.model.task; + +/** + * This enum represents the type of recurrence of a recurring task. + */ +public enum RecurrenceType { + /** + * Specifies no recurrence i.e. the task is a one-time task. + */ + None, + /** + * Specifies daily recurrence. + */ + Daily, + /** + * Specifies weekly recurrence. + */ + Weekly, + /** + * Specifies monthly recurrence. + */ + Monthly, + /** + * Specifies yearly recurrence. + */ + Yearly; + + /** + * Gets a RecurrenceType enum object from its enum name, ignoring cases. + * @param name the name of the RecurrenceType enum object + * @return the corresponding RecurrenceType enum object + */ + public static RecurrenceType valueOfIgnoreCase(String name) { + for (RecurrenceType type : RecurrenceType.values()) { + if (type.toString().equalsIgnoreCase(name)) + return type; + } + + throw new IllegalArgumentException("Unknown recurrence type: " + name); + } +} +``` +###### \java\seedu\savvytasker\storage\XmlAdaptedAliasSymbol.java +``` java +package seedu.savvytasker.storage; + +import javax.xml.bind.annotation.XmlElement; + +import seedu.savvytasker.commons.exceptions.IllegalValueException; +import seedu.savvytasker.model.alias.AliasSymbol; + +public class XmlAdaptedAliasSymbol { + + @XmlElement(required = true) + private String keyword; + @XmlElement(required = true) + private String representation; + + /** + * No-arg constructor for JAXB use. + */ + public XmlAdaptedAliasSymbol() {} + + + /** + * Converts a given AliasSymbol into this class for JAXB use. + * + * @param source future changes to this will not affect the created XmlAdaptedAliasSymbol + */ + public XmlAdaptedAliasSymbol(AliasSymbol source) { + keyword = source.getKeyword(); + representation = source.getRepresentation(); + } + + /** + * Converts this jaxb-friendly adapted alias symbol object into the model's AliasSymbol object. + * + * @throws IllegalValueException if there were any data constraints violated in the adapted AliasSymbol + */ + public AliasSymbol toModelType() throws IllegalValueException { + return new AliasSymbol(keyword, representation); + } +} +``` diff --git a/collated/test/A0139915W.md b/collated/test/A0139915W.md index e4e1b66b7d6b..5736483316e4 100644 --- a/collated/test/A0139915W.md +++ b/collated/test/A0139915W.md @@ -38,10 +38,6 @@ public class AddCommandTest extends SavvyTaskerGuiTest { } } -``` -###### \java\guitests\AddCommandTest.java -``` java - ``` ###### \java\guitests\DeleteCommandTest.java ``` java @@ -92,10 +88,6 @@ public class DeleteCommandTest extends SavvyTaskerGuiTest { } } -``` -###### \java\guitests\DeleteCommandTest.java -``` java - ``` ###### \java\guitests\FindCommandTest.java ``` java @@ -146,10 +138,6 @@ public class FindCommandTest extends SavvyTaskerGuiTest { assertTrue(taskListPanel.isListMatching(expectedHits)); } } -``` -###### \java\guitests\FindCommandTest.java -``` java - ``` ###### \java\guitests\guihandles\TaskCardHandle.java ``` java @@ -192,10 +180,6 @@ public class TaskCardHandle extends GuiHandle { return getTaskName(); } } -``` -###### \java\guitests\guihandles\TaskCardHandle.java -``` java - ``` ###### \java\guitests\guihandles\TaskListPanelHandle.java ``` java @@ -354,10 +338,6 @@ public class TaskListPanelHandle extends GuiHandle { return getListView().getItems().size(); } } -``` -###### \java\guitests\guihandles\TaskListPanelHandle.java -``` java - ``` ###### \java\guitests\ListCommandTest.java ``` java @@ -409,10 +389,6 @@ public class ListCommandTest extends SavvyTaskerGuiTest { assertTrue(taskListPanel.isListMatching(expectedHits)); } } -``` -###### \java\guitests\ListCommandTest.java -``` java - ``` ###### \java\seedu\savvytasker\testutil\SavvyTaskerBuilder.java ``` java @@ -438,10 +414,6 @@ public class SavvyTaskerBuilder { return savvyTasker; } } -``` -###### \java\seedu\savvytasker\testutil\SavvyTaskerBuilder.java -``` java - ``` ###### \java\seedu\savvytasker\testutil\TaskBuilder.java ``` java @@ -516,10 +488,6 @@ public class TaskBuilder { } } -``` -###### \java\seedu\savvytasker\testutil\TaskBuilder.java -``` java - ``` ###### \java\seedu\savvytasker\testutil\TestTask.java ``` java @@ -661,10 +629,6 @@ public class TestTask implements ReadOnlyTask { return sb.toString(); } } -``` -###### \java\seedu\savvytasker\testutil\TestTask.java -``` java - ``` ###### \java\seedu\savvytasker\testutil\TestUtil.java ``` java @@ -680,186 +644,6 @@ public class TestTask implements ReadOnlyTask { } ``` ###### \java\seedu\savvytasker\testutil\TestUtil.java -``` java - - public static List generateSampleTaskData() { - return Arrays.asList(sampleTaskData); - } - - /** - * Appends the file name to the sandbox folder path. - * Creates the sandbox folder if it doesn't exist. - * @param fileName - * @return - */ - public static String getFilePathInSandboxFolder(String fileName) { - try { - FileUtil.createDirs(new File(SANDBOX_FOLDER)); - } catch (IOException e) { - throw new RuntimeException(e); - } - return SANDBOX_FOLDER + fileName; - } - - public static void createDataFileWithSampleData(String filePath) { - createDataFileWithData(generateSampleStorageSavvyTasker(), filePath); - } - - public static void createDataFileWithData(T data, String filePath) { - try { - File saveFileForTesting = new File(filePath); - FileUtil.createIfMissing(saveFileForTesting); - XmlUtil.saveDataToFile(saveFileForTesting, data); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - public static void main(String... s) { - createDataFileWithSampleData(TestApp.SAVE_LOCATION_FOR_TESTING); - } - - public static SavvyTasker generateEmptySavvyTasker() { - return new SavvyTasker(new TaskList(), new AliasSymbolList()); - } - - public static XmlSerializableSavvyTasker generateSampleStorageSavvyTasker() { - return new XmlSerializableSavvyTasker(generateEmptySavvyTasker()); - } - - /** - * Tweaks the {@code keyCodeCombination} to resolve the {@code KeyCode.SHORTCUT} to their - * respective platform-specific keycodes - */ - public static KeyCode[] scrub(KeyCodeCombination keyCodeCombination) { - List keys = new ArrayList<>(); - if (keyCodeCombination.getAlt() == KeyCombination.ModifierValue.DOWN) { - keys.add(KeyCode.ALT); - } - if (keyCodeCombination.getShift() == KeyCombination.ModifierValue.DOWN) { - keys.add(KeyCode.SHIFT); - } - if (keyCodeCombination.getMeta() == KeyCombination.ModifierValue.DOWN) { - keys.add(KeyCode.META); - } - if (keyCodeCombination.getControl() == KeyCombination.ModifierValue.DOWN) { - keys.add(KeyCode.CONTROL); - } - keys.add(keyCodeCombination.getCode()); - return keys.toArray(new KeyCode[]{}); - } - - public static boolean isHeadlessEnvironment() { - String headlessProperty = System.getProperty("testfx.headless"); - return headlessProperty != null && headlessProperty.equals("true"); - } - - public static void captureScreenShot(String fileName) { - File file = GuiTest.captureScreenshot(); - try { - Files.copy(file, new File(fileName + ".png")); - } catch (IOException e) { - e.printStackTrace(); - } - } - - public static String descOnFail(Object... comparedObjects) { - return "Comparison failed \n" - + Arrays.asList(comparedObjects).stream() - .map(Object::toString) - .collect(Collectors.joining("\n")); - } - - public static void setFinalStatic(Field field, Object newValue) throws NoSuchFieldException, IllegalAccessException{ - field.setAccessible(true); - // remove final modifier from field - Field modifiersField = Field.class.getDeclaredField("modifiers"); - modifiersField.setAccessible(true); - // ~Modifier.FINAL is used to remove the final modifier from field so that its value is no longer - // final and can be changed - modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL); - field.set(null, newValue); - } - - public static void initRuntime() throws TimeoutException { - FxToolkit.registerPrimaryStage(); - FxToolkit.hideStage(); - } - - public static void tearDownRuntime() throws Exception { - FxToolkit.cleanupStages(); - } - - /** - * Gets private method of a class - * Invoke the method using method.invoke(objectInstance, params...) - * - * Caveat: only find method declared in the current Class, not inherited from supertypes - */ - @SuppressWarnings({ "unchecked", "rawtypes" }) - public static Method getPrivateMethod(Class objectClass, String methodName) throws NoSuchMethodException { - Method method = objectClass.getDeclaredMethod(methodName); - method.setAccessible(true); - return method; - } - - public static void renameFile(File file, String newFileName) { - try { - Files.copy(file, new File(newFileName)); - } catch (IOException e1) { - e1.printStackTrace(); - } - } - - /** - * Gets mid point of a node relative to the screen. - * @param node - * @return - */ - public static Point2D getScreenMidPoint(Node node) { - double x = getScreenPos(node).getMinX() + node.getLayoutBounds().getWidth() / 2; - double y = getScreenPos(node).getMinY() + node.getLayoutBounds().getHeight() / 2; - return new Point2D(x,y); - } - - /** - * Gets mid point of a node relative to its scene. - * @param node - * @return - */ - public static Point2D getSceneMidPoint(Node node) { - double x = getScenePos(node).getMinX() + node.getLayoutBounds().getWidth() / 2; - double y = getScenePos(node).getMinY() + node.getLayoutBounds().getHeight() / 2; - return new Point2D(x,y); - } - - /** - * Gets the bound of the node relative to the parent scene. - * @param node - * @return - */ - public static Bounds getScenePos(Node node) { - return node.localToScene(node.getBoundsInLocal()); - } - - public static Bounds getScreenPos(Node node) { - return node.localToScreen(node.getBoundsInLocal()); - } - - public static double getSceneMaxX(Scene scene) { - return scene.getX() + scene.getWidth(); - } - - public static double getSceneMaxY(Scene scene) { - return scene.getX() + scene.getHeight(); - } - - public static Object getLastElement(List list) { - return list.get(list.size() - 1); - } - -``` -###### \java\seedu\savvytasker\testutil\TestUtil.java ``` java /** * Removes a subset from the list of tasks. @@ -908,28 +692,11 @@ public class TestTask implements ReadOnlyTask { } ``` ###### \java\seedu\savvytasker\testutil\TestUtil.java -``` java - - private static List asList(T[] objs) { - List list = new ArrayList<>(); - for(T obj : objs) { - list.add(obj); - } - return list; - } - -``` -###### \java\seedu\savvytasker\testutil\TestUtil.java ``` java public static boolean compareCardAndTask(TaskCardHandle card, ReadOnlyTask task) { return card.isSameTask(task); } ``` -###### \java\seedu\savvytasker\testutil\TestUtil.java -``` java - -} -``` ###### \java\seedu\savvytasker\testutil\TypicalTestTasks.java ``` java /** @@ -1008,7 +775,3 @@ public class TypicalTestTasks { } } ``` -###### \java\seedu\savvytasker\testutil\TypicalTestTasks.java -``` java - -``` diff --git a/collated/test/A0139916U.md b/collated/test/A0139916U.md new file mode 100644 index 000000000000..aef3ff61c827 --- /dev/null +++ b/collated/test/A0139916U.md @@ -0,0 +1,507 @@ +# A0139916U +###### \java\seedu\savvytasker\logic\parser\ParserTest.java +``` java +package seedu.savvytasker.logic.parser; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; + +import seedu.savvytasker.logic.commands.AddCommand; +import seedu.savvytasker.logic.commands.Command; +import seedu.savvytasker.logic.commands.IncorrectCommand; +import seedu.savvytasker.model.alias.AliasSymbol; + +public class ParserTest { + private AddCommandParser addParser; + private DeleteCommandParser deleteParser; + private ModifyCommandParser modifyParser; + private ClearCommandParser clearParser; + private ListCommandParser listParser; + private FindCommandParser findParser; + private HelpCommandParser helpParser; + private ExitCommandParser exitParser; + private MarkCommandParser markParser; + private UnmarkCommandParser unmarkParser; + private UndoCommandParser undoParser; + private RedoCommandParser redoParser; + private AliasCommandParser aliasParser; + private UnaliasCommandParser unaliasParser; + + @Rule + public ExpectedException thrown = ExpectedException.none(); + + @Before + public void setup() { + addParser = new AddCommandParser(); + deleteParser = new DeleteCommandParser(); + modifyParser = new ModifyCommandParser(); + clearParser = new ClearCommandParser(); + listParser = new ListCommandParser(); + findParser = new FindCommandParser(); + helpParser = new HelpCommandParser(); + exitParser = new ExitCommandParser(); + markParser = new MarkCommandParser(); + unmarkParser = new UnmarkCommandParser(); + undoParser = new UndoCommandParser(); + redoParser = new RedoCommandParser(); + aliasParser = new AliasCommandParser(); + unaliasParser = new UnaliasCommandParser(); + } + + @Test + public void parse_add_reorder() throws ParseException { + assertNotNull(addParser.parse("add task l/ comp e/ tomorrow, 3pm s/ today, 2pm n/ 2")); + } + + @Test + public void parse_add_multipleSpaces() throws ParseException { + assertNotNull(addParser.parse("add Multiple Spaces s/ 2pm")); + } + + @Test + public void parse_add_sameOptionMultipleTimes() throws ParseException { + thrown.expect(ParseException.class); + addParser.parse("add task s/ tomorrow 3pm s/ tomorrow 10pm"); + } + + @Test + public void parse_add_missingTaskName() throws ParseException { + thrown.expect(ParseException.class); + addParser.parse("add s/ tomorrow 3pm"); + } + + @Test + public void parse_add_arbitrarySlash() throws ParseException { + thrown.expect(ParseException.class); + addParser.parse("add task s/ tomorrow 2pm/3pm e/ sunday"); + } + + @Test + public void parse_add_fullValid() throws ParseException { + assertNotNull(addParser.parse("add task s/wednesday e/thursday l/ comp p/ high r/ none n/ 1 c/ test d/ test")); + } + + @Test + public void parse_add_invalidRecurrenceType() throws ParseException { + thrown.expect(ParseException.class); + addParser.parse("add task r/ Error "); + } + + @Test + public void parse_add_invalidPriorityLevel() throws ParseException { + thrown.expect(ParseException.class); + addParser.parse("add task p/ Error "); + } + + //================================================================================== + + @Test + public void parse_delete_noIndexSpecified() throws ParseException { + thrown.expect(ParseException.class); + deleteParser.parse("delete"); + } + + @Test + public void parse_delete_oneIndex() throws ParseException { + assertNotNull(deleteParser.parse("delete 1")); + } + + @Test + public void parse_delete_multipleIndices() throws ParseException { + assertNotNull(deleteParser.parse("delete 1 2 3")); + } + + @Test + public void parse_delete_multipleSpacesIndices() throws ParseException { + assertNotNull(deleteParser.parse("delete 1 2 3")); + } + + @Test + public void parse_delete_negativeIndex() throws ParseException { + thrown.expect(ParseException.class); + deleteParser.parse("delete -1"); + } + + @Test + public void parse_delete_zeroIndex() throws ParseException { + thrown.expect(ParseException.class); + deleteParser.parse("delete 0"); + } + + //================================================================================== + + @Test + public void parse_modify_noIndex() throws ParseException { + thrown.expect(ParseException.class); + modifyParser.parse("modify t/ newtask"); + } + + @Test + public void parse_modify_multipleIndex() throws ParseException { + thrown.expect(ParseException.class); + modifyParser.parse("modify 1 2 3 t/ newtask"); + } + + @Test + public void parse_modify_negativeIndex() throws ParseException { + thrown.expect(ParseException.class); + modifyParser.parse("modify -1 t/ newtask"); + } + + @Test + public void parse_modify_zeroIndex() throws ParseException { + thrown.expect(ParseException.class); + modifyParser.parse("modify 0 t/ newtask"); + } + + @Test + public void parse_modify_onlySpecifyIndex() throws ParseException { + assertNotNull(modifyParser.parse("modify 1")); + } + + @Test + public void parse_modify_fullValid() throws ParseException { + assertNotNull(modifyParser.parse("modify 3 t/ newtask s/wednesday e/thursday l/ comp p/ high r/ none n/ 1 c/ test d/ test")); + } + + @Test + public void parse_modify_reorder() throws ParseException { + assertNotNull(modifyParser.parse("modify 1 l/ comp e/ tomorrow, 3pm s/ today, 2pm n/ 2")); + } + + @Test + public void parse_modify_multipleSpaces() throws ParseException { + assertNotNull(modifyParser.parse("modify 1 t/ Multiple Spaces s/ 2pm")); + } + + //================================================================================== + + @Test + public void parse_clear_spaces() throws ParseException { + assertNotNull(clearParser.parse("clear ")); + } + + @Test + public void parse_clear_invalid() throws ParseException { + thrown.expect(ParseException.class); + clearParser.parse("clear 1"); + } + + @Test + public void parse_clear_valid() throws ParseException { + assertNotNull(clearParser.parse("clear")); + } + + //================================================================================== + + @Test + public void parse_list_noParameters() throws ParseException { + assertNotNull(listParser.parse("list")); + } + + @Test + public void parse_list_noParametersSpaces() throws ParseException { + assertNotNull(listParser.parse("list ")); + } + + @Test + public void parse_list_valid() throws ParseException { + assertNotNull(listParser.parse("list t/ Priority Level ")); + } + + @Test + public void parse_list_invalidType() throws ParseException { + thrown.expect(ParseException.class); + listParser.parse("list t/ Error "); + } + + //================================================================================== + + @Test + public void parse_find_noKeywords() throws ParseException { + thrown.expect(ParseException.class); + findParser.parse("find"); + } + + @Test + public void parse_find_noKeywordsSpaces() throws ParseException { + thrown.expect(ParseException.class); + findParser.parse("find "); + } + + @Test + public void parse_find_noKeywordsButWithType() throws ParseException { + thrown.expect(ParseException.class); + findParser.parse("find t/ Exact "); + } + + @Test + public void parse_find_invalidType() throws ParseException { + thrown.expect(ParseException.class); + findParser.parse("find t/ Error some words"); + } + + @Test + public void parse_find_validAfter() throws ParseException { + assertNotNull(findParser.parse("find t/ Exact this word ")); + } + + @Test + public void parse_find_validBefore() throws ParseException { + assertNotNull(findParser.parse("find some words t/ Partial ")); + } + + @Test + public void parse_find_validBeforeAndAfter() throws ParseException { + assertNotNull(findParser.parse("find some words t/ Full some words after ")); + } + + //================================================================================== + + @Test + public void parse_help_spaces() throws ParseException { + assertNotNull(helpParser.parse("help ")); + } + + @Test + public void parse_help_invalid() throws ParseException { + thrown.expect(ParseException.class); + helpParser.parse("help 1"); + } + + @Test + public void parse_help_valid() throws ParseException { + assertNotNull(helpParser.parse("help")); + } + + //================================================================================== + + @Test + public void parse_exit_spaces() throws ParseException { + assertNotNull(exitParser.parse("exit ")); + } + + @Test + public void parse_exit_invalid() throws ParseException { + thrown.expect(ParseException.class); + helpParser.parse("exit 1"); + } + + @Test + public void parse_exit_valid() throws ParseException { + assertNotNull(exitParser.parse("exit")); + } + + //================================================================================== + + @Test + public void parse_mark_noIndexSpecified() throws ParseException { + thrown.expect(ParseException.class); + markParser.parse("mark"); + } + + @Test + public void parse_mark_oneIndex() throws ParseException { + assertNotNull(markParser.parse("mark 1")); + } + + @Test + public void parse_mark_multipleIndices() throws ParseException { + assertNotNull(markParser.parse("mark 1 2 3")); + } + + @Test + public void parse_mark_multipleSpacesIndices() throws ParseException { + assertNotNull(markParser.parse("mark 1 2 3")); + } + + @Test + public void parse_mark_negativeIndex() throws ParseException { + thrown.expect(ParseException.class); + markParser.parse("mark -1"); + } + + @Test + public void parse_mark_zeroIndex() throws ParseException { + thrown.expect(ParseException.class); + markParser.parse("mark 0"); + } + + //================================================================================== + + @Test + public void parse_unmark_noIndexSpecified() throws ParseException { + thrown.expect(ParseException.class); + unmarkParser.parse("unmark"); + } + + @Test + public void parse_unmark_oneIndex() throws ParseException { + assertNotNull(unmarkParser.parse("unmark 1")); + } + + @Test + public void parse_unmark_multipleIndices() throws ParseException { + assertNotNull(unmarkParser.parse("unmark 1 2 3")); + } + + @Test + public void parse_unmark_multipleSpacesIndices() throws ParseException { + assertNotNull(unmarkParser.parse("unmark 1 2 3")); + } + + @Test + public void parse_unmark_negativeIndex() throws ParseException { + thrown.expect(ParseException.class); + unmarkParser.parse("unmark -1"); + } + + @Test + public void parse_unmark_zeroIndex() throws ParseException { + thrown.expect(ParseException.class); + unmarkParser.parse("unmark 0"); + } + + //================================================================================== + + @Test + public void parse_undo_spaces() throws ParseException { + assertNotNull(undoParser.parse("undo ")); + } + + @Test + public void parse_undo_invalid() throws ParseException { + thrown.expect(ParseException.class); + helpParser.parse("undo 1"); + } + + @Test + public void parse_undo_valid() throws ParseException { + assertNotNull(undoParser.parse("undo")); + } + + //================================================================================== + + @Test + public void parse_redo_spaces() throws ParseException { + assertNotNull(redoParser.parse("redo ")); + } + + @Test + public void parse_redo_invalid() throws ParseException { + thrown.expect(ParseException.class); + helpParser.parse("redo 1"); + } + + @Test + public void parse_redo_valid() throws ParseException { + assertNotNull(redoParser.parse("redo")); + } + + //================================================================================== + + @Test + public void parse_alias_keywordUnspecified() throws ParseException { + thrown.expect(ParseException.class); + aliasParser.parse("alias r/ a string of things"); + } + + @Test + public void parse_alias_textUnspecified() throws ParseException { + thrown.expect(ParseException.class); + aliasParser.parse("alias k/ xyz"); + } + + @Test + public void parse_alias_noSwitchesSpecified() throws ParseException { + thrown.expect(ParseException.class); + aliasParser.parse("alias power overwhelming"); + } + + @Test + public void parse_alias_keywordTooLong() throws ParseException { + thrown.expect(ParseException.class); + aliasParser.parse("alias k/ not a single word r/ project management"); + } + + @Test + public void parse_alias_keywordEmpty() throws ParseException { + thrown.expect(ParseException.class); + aliasParser.parse("alias k/ r/ project management"); + } + + @Test + public void parse_alias_textEmpty() throws ParseException { + thrown.expect(ParseException.class); + aliasParser.parse("alias k/ pjm r/ "); + } + + @Test + public void parse_alias_fullValid() throws ParseException { + assertNotNull(aliasParser.parse("alias k/ pjm r/ project management ")); + } + + //================================================================================== + + @Test + public void parse_unalias_emptyKeyword() throws ParseException { + thrown.expect(ParseException.class); + unaliasParser.parse("unalias "); + } + + @Test + public void parse_unalias_valid() throws ParseException { + assertNotNull(unaliasParser.parse("unalias something ")); + } + + //================================================================================== + + @Test + public void parse_master_subparser() throws ParseException { + MasterParser parser = new MasterParser(); + parser.registerCommandParser(new AddCommandParser()); + assertTrue(parser.parse(" add A New Task s/ tomorrow e/ the day after tomorrow, l/ SR10 ") instanceof AddCommand); + } + + @Test + public void parse_master_subparserRemoved() throws ParseException { + MasterParser parser = new MasterParser(); + parser.registerCommandParser(new AddCommandParser()); + parser.unregisterCommandParser("add"); + assertTrue(parser.parse(" add A New Task s/ tomorrow e/ the day after tomorrow, l/ SR10 ") instanceof IncorrectCommand); + } + + @Test + public void parse_master_alias() throws ParseException { + MasterParser parser = new MasterParser(); + parser.registerCommandParser(new AddCommandParser()); + parser.addAliasSymbol(new AliasSymbol("xyz", "add A New Task")); + parser.addAliasSymbol(new AliasSymbol("pqr", "s/ tomorrow e/ 30 september 3pm")); + assertTrue(parser.parse("xyz pqr") instanceof AddCommand); + } + + @Test + public void parse_master_invalidAlias() throws ParseException { + MasterParser parser = new MasterParser(); + parser.registerCommandParser(new AddCommandParser()); + assertFalse(parser.addAliasSymbol(new AliasSymbol("add", "add A New Task"))); + } + + @Test + public void parse_master_removedAlias() throws ParseException { + MasterParser parser = new MasterParser(); + parser.registerCommandParser(new AddCommandParser()); + parser.addAliasSymbol(new AliasSymbol("xyz", "add A New Task")); + parser.removeAliasSymbol("xyz"); + assertTrue(parser.parse("xyz pqr") instanceof IncorrectCommand); + } +} +``` diff --git a/src/main/java/seedu/savvytasker/commons/events/ui/TaskPanelSelectionChangedEvent.java b/src/main/java/seedu/savvytasker/commons/events/ui/TaskPanelSelectionChangedEvent.java index 613feb7a8c66..317fa9e493ba 100644 --- a/src/main/java/seedu/savvytasker/commons/events/ui/TaskPanelSelectionChangedEvent.java +++ b/src/main/java/seedu/savvytasker/commons/events/ui/TaskPanelSelectionChangedEvent.java @@ -26,4 +26,4 @@ public ReadOnlyTask getNewSelection() { return newSelection; } } -//@@author A0139915W \ No newline at end of file +//@@author \ No newline at end of file diff --git a/src/main/java/seedu/savvytasker/commons/util/SmartDefaultDates.java b/src/main/java/seedu/savvytasker/commons/util/SmartDefaultDates.java index 2ca8133d63dd..387916024f48 100644 --- a/src/main/java/seedu/savvytasker/commons/util/SmartDefaultDates.java +++ b/src/main/java/seedu/savvytasker/commons/util/SmartDefaultDates.java @@ -156,4 +156,4 @@ public Date getEndDate() { return endDateTime; } } -//@@author A0139915W \ No newline at end of file +//@@author \ No newline at end of file diff --git a/src/main/java/seedu/savvytasker/commons/util/StringUtil.java b/src/main/java/seedu/savvytasker/commons/util/StringUtil.java index 4e112a55bbe1..3c0fc9ea185e 100644 --- a/src/main/java/seedu/savvytasker/commons/util/StringUtil.java +++ b/src/main/java/seedu/savvytasker/commons/util/StringUtil.java @@ -23,7 +23,7 @@ public static boolean containsPartialIgnoreCase(String source, String query) { List strings = Arrays.asList(split); return strings.stream().filter(s -> s.contains(query.toLowerCase())).count() > 0; } - //@@author A0139915W-reused + //@@author public static boolean containsIgnoreCase(String source, String query) { String[] split = source.toLowerCase().split("\\s+"); diff --git a/src/main/java/seedu/savvytasker/logic/commands/AddCommand.java b/src/main/java/seedu/savvytasker/logic/commands/AddCommand.java index 3c13f604c26d..15223526e149 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/AddCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/AddCommand.java @@ -83,7 +83,7 @@ public CommandResult execute() { } } - //@@author A0139915W + //@@author /** * Checks if a command can perform undo operations diff --git a/src/main/java/seedu/savvytasker/logic/commands/DeleteCommand.java b/src/main/java/seedu/savvytasker/logic/commands/DeleteCommand.java index acfefd6873d4..a2721d5e7a71 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/DeleteCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/DeleteCommand.java @@ -64,7 +64,7 @@ public CommandResult execute() { return new CommandResult(resultSb.toString()); } - //@@author A0139915W + //@@author /** * Checks if a command can perform undo operations diff --git a/src/main/java/seedu/savvytasker/logic/commands/FindCommand.java b/src/main/java/seedu/savvytasker/logic/commands/FindCommand.java index 703ce07dd5b0..fc533b8e2d8a 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/FindCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/FindCommand.java @@ -36,7 +36,7 @@ public CommandResult execute() { model.updateFilteredTaskList(_findType, keywords); return new CommandResult(getMessageForTaskListShownSummary(model.getFilteredTaskList().size())); } - //@@author A0139915W + //@@author /** * Checks if a command can perform undo operations diff --git a/src/main/java/seedu/savvytasker/logic/commands/ListCommand.java b/src/main/java/seedu/savvytasker/logic/commands/ListCommand.java index 160f1630c047..5b5e57591ed4 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/ListCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/ListCommand.java @@ -51,7 +51,7 @@ public CommandResult execute() { } return new CommandResult(getMessageForTaskListShownSummary(model.getFilteredTaskList().size())); } - //@@author A0139915W + //@@author /** * Checks if a command can perform undo operations diff --git a/src/main/java/seedu/savvytasker/logic/commands/ModifyCommand.java b/src/main/java/seedu/savvytasker/logic/commands/ModifyCommand.java index 368baaa938ec..53405f7fe77a 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/ModifyCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/ModifyCommand.java @@ -91,7 +91,7 @@ public CommandResult execute() { return new CommandResult(String.format(MESSAGE_SUCCESS, replacement)); } - //@@author A0139915W + //@@author /** * Checks if a command can perform undo operations diff --git a/src/main/java/seedu/savvytasker/logic/commands/SelectCommand.java b/src/main/java/seedu/savvytasker/logic/commands/SelectCommand.java index 1497549c6821..1478b31f11fc 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/SelectCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/SelectCommand.java @@ -1,4 +1,4 @@ - package seedu.savvytasker.logic.commands; +package seedu.savvytasker.logic.commands; import seedu.savvytasker.commons.core.EventsCenter; import seedu.savvytasker.commons.core.Messages; diff --git a/src/main/java/seedu/savvytasker/logic/parser/FindCommandParser.java b/src/main/java/seedu/savvytasker/logic/parser/FindCommandParser.java index 508ca323175d..613378b1a794 100644 --- a/src/main/java/seedu/savvytasker/logic/parser/FindCommandParser.java +++ b/src/main/java/seedu/savvytasker/logic/parser/FindCommandParser.java @@ -47,7 +47,7 @@ public FindCommand parse(String commandText) throws ParseException { throw new ParseException(commandText, String.format(Messages.MESSAGE_INVALID_COMMAND_FORMAT, getRequiredFormat())); } - //@@author A0139915W + //@@author private FindType parseFindType(String findTypeText) throws ParseException { if (findTypeText == null) diff --git a/src/main/java/seedu/savvytasker/model/Model.java b/src/main/java/seedu/savvytasker/model/Model.java index bd4806b33bf4..eaff64142432 100644 --- a/src/main/java/seedu/savvytasker/model/Model.java +++ b/src/main/java/seedu/savvytasker/model/Model.java @@ -53,7 +53,7 @@ public interface Model { /** Updates the filter of the filtered task list to filter by the given keywords*/ void updateFilteredTaskList(FindType findType, String[] keywords); - //@@author A0139916U + //@@author /** Adds the given AliasSymbol */ void addAliasSymbol(AliasSymbol symbol) throws DuplicateSymbolKeywordException; diff --git a/src/main/java/seedu/savvytasker/model/ModelManager.java b/src/main/java/seedu/savvytasker/model/ModelManager.java index 9fcc899102a5..98c5fbb87b84 100644 --- a/src/main/java/seedu/savvytasker/model/ModelManager.java +++ b/src/main/java/seedu/savvytasker/model/ModelManager.java @@ -64,6 +64,7 @@ public ModelManager(ReadOnlySavvyTasker initialData) { sortedAndFilteredTasks = new SortedList<>(filteredTasks, new TaskSortedByDefault()); updateFilteredListToShowActive(); // shows only active tasks on start } + //@@author @Override public void resetData(ReadOnlySavvyTasker newData) { @@ -89,6 +90,7 @@ private void indicateAliasSymbolAdded(AliasSymbol symbol) { private void indicateAliasSymbolRemoved(AliasSymbol symbol) { raise(new AliasSymbolChangedEvent(symbol, AliasSymbolChangedEvent.Action.Removed)); } + //@@author //@@author A0139915W @@ -111,8 +113,9 @@ public synchronized void addTask(Task t) throws DuplicateTaskException, InvalidD updateFilteredListToShowActive(); indicateSavvyTaskerChanged(); } + //@@author + //@@author A0139916U - @Override public synchronized void addAliasSymbol(AliasSymbol symbol) throws DuplicateSymbolKeywordException { savvyTasker.addAliasSymbol(symbol); @@ -126,6 +129,7 @@ public synchronized void removeAliasSymbol(AliasSymbol symbol) throws SymbolKeyw indicateSavvyTaskerChanged(); indicateAliasSymbolRemoved(symbol); } + //@@author //=========== Filtered/Sorted Task List Accessors =============================================================== @@ -197,7 +201,7 @@ private void updateFilteredTaskList(Expression expression, Comparator comp filteredTasks.setPredicate(expression::satisfies); sortedAndFilteredTasks.setComparator(comparator); } - //@@author A0139915W + //@@author //========== Inner classes/interfaces used for filtering ================================================== @@ -476,6 +480,6 @@ public int compare(Task task1, Task task2) { } } - //@@author A0139915W + //@@author } diff --git a/src/main/java/seedu/savvytasker/model/ReadOnlySavvyTasker.java b/src/main/java/seedu/savvytasker/model/ReadOnlySavvyTasker.java index 184777c4997a..be6e6cdc8719 100644 --- a/src/main/java/seedu/savvytasker/model/ReadOnlySavvyTasker.java +++ b/src/main/java/seedu/savvytasker/model/ReadOnlySavvyTasker.java @@ -16,6 +16,7 @@ public interface ReadOnlySavvyTasker { * Returns a defensively copied task list. */ TaskList getTaskList(); + //@@author //@@author A0139916U /** @@ -23,15 +24,18 @@ public interface ReadOnlySavvyTasker { */ AliasSymbolList getAliasSymbolList(); + //@@author //@@author A0139915W /** * Returns an unmodifiable view of task list */ List getReadOnlyListOfTasks(); + //@@author //@@author A0139916U /** * Returns unmodifiable view of symbols list */ List getReadOnlyListOfAliasSymbols(); + //@@author } diff --git a/src/main/java/seedu/savvytasker/model/SavvyTasker.java b/src/main/java/seedu/savvytasker/model/SavvyTasker.java index 3e8107c21d3c..a58381cf4ab5 100644 --- a/src/main/java/seedu/savvytasker/model/SavvyTasker.java +++ b/src/main/java/seedu/savvytasker/model/SavvyTasker.java @@ -24,7 +24,6 @@ */ public class SavvyTasker implements ReadOnlySavvyTasker { - //@@author A0139915W private final TaskList tasks; private final AliasSymbolList symbols; @@ -104,6 +103,7 @@ public boolean removeTask(ReadOnlyTask key) throws TaskNotFoundException { public boolean replaceTask(ReadOnlyTask key, Task replacement) throws TaskNotFoundException, InvalidDateException { return tasks.replace(key, replacement); } + //@@author //@@author A0139916U /** @@ -123,8 +123,8 @@ public void addAliasSymbol(AliasSymbol symbol) throws DuplicateSymbolKeywordExce public void removeAliasSymbol(AliasSymbol symbol) throws SymbolKeywordNotFoundException { symbols.removeAliasSymbol(symbol); } - //@@author A0139915W - + //@@author + //// util methods @Override @@ -133,6 +133,7 @@ public String toString() { // TODO: refine later } + //@@author A0139915W @Override public List getReadOnlyListOfTasks() { return Collections.unmodifiableList(tasks.getInternalList()); @@ -144,6 +145,7 @@ public TaskList getTaskList() { defensiveCopy.getInternalList().addAll(tasks.getInternalList()); return defensiveCopy; } + //@@author //@@author A0139916U @Override @@ -155,6 +157,7 @@ public List getReadOnlyListOfAliasSymbols() { public AliasSymbolList getAliasSymbolList() { return new AliasSymbolList(symbols); } + //@@author //@@author A0139915W @Override @@ -170,4 +173,5 @@ public int hashCode() { // use this method for custom fields hashing instead of implementing your own return Objects.hash(tasks, symbols); } + //@@author } diff --git a/src/main/java/seedu/savvytasker/model/task/ReadOnlyTask.java b/src/main/java/seedu/savvytasker/model/task/ReadOnlyTask.java index 9dc927a534b4..7b0c9d7b3444 100644 --- a/src/main/java/seedu/savvytasker/model/task/ReadOnlyTask.java +++ b/src/main/java/seedu/savvytasker/model/task/ReadOnlyTask.java @@ -60,4 +60,4 @@ default String getAsText() { } } -//@@author A0139915W +//@@author diff --git a/src/main/java/seedu/savvytasker/model/task/Task.java b/src/main/java/seedu/savvytasker/model/task/Task.java index 5166bf22ea74..d3aa92c7be22 100644 --- a/src/main/java/seedu/savvytasker/model/task/Task.java +++ b/src/main/java/seedu/savvytasker/model/task/Task.java @@ -235,4 +235,4 @@ public String toString() { } } -//@@author A0139915W +//@@author diff --git a/src/main/java/seedu/savvytasker/model/task/TaskList.java b/src/main/java/seedu/savvytasker/model/task/TaskList.java index ad49ab128afc..e56a2a0e2502 100644 --- a/src/main/java/seedu/savvytasker/model/task/TaskList.java +++ b/src/main/java/seedu/savvytasker/model/task/TaskList.java @@ -185,4 +185,4 @@ public int hashCode() { return internalList.hashCode(); } } -//@@author A0139915W +//@@author diff --git a/src/main/java/seedu/savvytasker/storage/XmlAdaptedTask.java b/src/main/java/seedu/savvytasker/storage/XmlAdaptedTask.java index c2986b2d2101..2598075ab531 100644 --- a/src/main/java/seedu/savvytasker/storage/XmlAdaptedTask.java +++ b/src/main/java/seedu/savvytasker/storage/XmlAdaptedTask.java @@ -85,4 +85,4 @@ public Task toModelType() throws IllegalValueException { recurringType, numberOfRecurrence, category, description, isArchived); } } -//@@author A0139915W +//@@author diff --git a/src/test/java/guitests/AddCommandTest.java b/src/test/java/guitests/AddCommandTest.java index b7025a837241..90c915061984 100644 --- a/src/test/java/guitests/AddCommandTest.java +++ b/src/test/java/guitests/AddCommandTest.java @@ -48,4 +48,4 @@ private void assertAddSuccess(TestTask taskToAdd, TestTask... currentList) { } } -//@@author A0139915W +//@@author diff --git a/src/test/java/guitests/DeleteCommandTest.java b/src/test/java/guitests/DeleteCommandTest.java index 67ce599dabb2..7dfe77dbc734 100644 --- a/src/test/java/guitests/DeleteCommandTest.java +++ b/src/test/java/guitests/DeleteCommandTest.java @@ -56,4 +56,4 @@ private void assertDeleteSuccess(int targetIndexOneIndexed, final TestTask[] cur } } -//@@author A0139915W +//@@author diff --git a/src/test/java/guitests/FindCommandTest.java b/src/test/java/guitests/FindCommandTest.java index b85c93978a5e..66db1b19546f 100644 --- a/src/test/java/guitests/FindCommandTest.java +++ b/src/test/java/guitests/FindCommandTest.java @@ -55,4 +55,4 @@ private void assertFindResult(String command, TestTask... expectedHits) { assertTrue(taskListPanel.isListMatching(expectedHits)); } } -//@@author A0139915W +//@@author diff --git a/src/test/java/guitests/ListCommandTest.java b/src/test/java/guitests/ListCommandTest.java index f42757d2f532..5ea0310418ac 100644 --- a/src/test/java/guitests/ListCommandTest.java +++ b/src/test/java/guitests/ListCommandTest.java @@ -56,4 +56,4 @@ private void assertListResult(String command, TestTask... expectedHits ) { assertTrue(taskListPanel.isListMatching(expectedHits)); } } -//@@author A0139915W +//@@author diff --git a/src/test/java/guitests/guihandles/TaskCardHandle.java b/src/test/java/guitests/guihandles/TaskCardHandle.java index e2d85795df11..fe32021d1b5f 100644 --- a/src/test/java/guitests/guihandles/TaskCardHandle.java +++ b/src/test/java/guitests/guihandles/TaskCardHandle.java @@ -45,4 +45,4 @@ public String toString() { return getTaskName(); } } -//@@author A0139915W +//@@author diff --git a/src/test/java/guitests/guihandles/TaskListPanelHandle.java b/src/test/java/guitests/guihandles/TaskListPanelHandle.java index b2cfeb50398e..f94f5a0aebc8 100644 --- a/src/test/java/guitests/guihandles/TaskListPanelHandle.java +++ b/src/test/java/guitests/guihandles/TaskListPanelHandle.java @@ -173,4 +173,4 @@ public int getNumberOfTasks() { return getListView().getItems().size(); } } -//@@author A0139915W +//@@author diff --git a/src/test/java/seedu/savvytasker/testutil/SavvyTaskerBuilder.java b/src/test/java/seedu/savvytasker/testutil/SavvyTaskerBuilder.java index f2c3c28fd268..3e5851de46cc 100644 --- a/src/test/java/seedu/savvytasker/testutil/SavvyTaskerBuilder.java +++ b/src/test/java/seedu/savvytasker/testutil/SavvyTaskerBuilder.java @@ -28,4 +28,4 @@ public SavvyTasker build(){ return savvyTasker; } } -//@@author A0139915W +//@@author diff --git a/src/test/java/seedu/savvytasker/testutil/TaskBuilder.java b/src/test/java/seedu/savvytasker/testutil/TaskBuilder.java index 1934740e1622..600b424a41c8 100644 --- a/src/test/java/seedu/savvytasker/testutil/TaskBuilder.java +++ b/src/test/java/seedu/savvytasker/testutil/TaskBuilder.java @@ -78,4 +78,4 @@ public TestTask build() { } } -//@@author A0139915W +//@@author diff --git a/src/test/java/seedu/savvytasker/testutil/TestTask.java b/src/test/java/seedu/savvytasker/testutil/TestTask.java index ad77c6b8be3b..56f03a4e97cb 100644 --- a/src/test/java/seedu/savvytasker/testutil/TestTask.java +++ b/src/test/java/seedu/savvytasker/testutil/TestTask.java @@ -145,4 +145,4 @@ public String getAddCommand() { return sb.toString(); } } -//@@author A0139915W +//@@author diff --git a/src/test/java/seedu/savvytasker/testutil/TestUtil.java b/src/test/java/seedu/savvytasker/testutil/TestUtil.java index 02b95a34ab2f..a6ca044f7c42 100644 --- a/src/test/java/seedu/savvytasker/testutil/TestUtil.java +++ b/src/test/java/seedu/savvytasker/testutil/TestUtil.java @@ -72,7 +72,7 @@ private static Task[] getSampleTaskData() { new Task("Sample Task Ah") }; } - //@@author A0139915W + //@@author public static List generateSampleTaskData() { return Arrays.asList(sampleTaskData); @@ -296,7 +296,7 @@ public static TestTask[] addTasksToList(final TestTask[] tasks, TestTask... task listOfTasks.addAll(asList(tasksToAdd)); return listOfTasks.toArray(new TestTask[listOfTasks.size()]); } - //@@author A0139915W + //@@author private static List asList(T[] objs) { List list = new ArrayList<>(); @@ -310,6 +310,6 @@ private static List asList(T[] objs) { public static boolean compareCardAndTask(TaskCardHandle card, ReadOnlyTask task) { return card.isSameTask(task); } - //@@author A0139915W + //@@author } diff --git a/src/test/java/seedu/savvytasker/testutil/TypicalTestTasks.java b/src/test/java/seedu/savvytasker/testutil/TypicalTestTasks.java index 9b49d7d50437..da6b3a91cb1e 100644 --- a/src/test/java/seedu/savvytasker/testutil/TypicalTestTasks.java +++ b/src/test/java/seedu/savvytasker/testutil/TypicalTestTasks.java @@ -86,4 +86,4 @@ private Date getDate(String ddmmyyyy) { return null; } } -//@@author A0139915W +//@@author From 2c0982f58f63bd02f9247c27c205d94fc14892d5 Mon Sep 17 00:00:00 2001 From: "Henry\\Henry" Date: Wed, 26 Oct 2016 20:31:58 +0800 Subject: [PATCH 52/55] Temporarily Fixes #82 --- .../seedu/savvytasker/logic/parser/DateParser.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/main/java/seedu/savvytasker/logic/parser/DateParser.java b/src/main/java/seedu/savvytasker/logic/parser/DateParser.java index f2785ce443e9..a1da821738b8 100644 --- a/src/main/java/seedu/savvytasker/logic/parser/DateParser.java +++ b/src/main/java/seedu/savvytasker/logic/parser/DateParser.java @@ -3,6 +3,7 @@ import java.util.Date; import java.util.List; +import java.util.Locale; import com.joestelmach.natty.DateGroup; @@ -65,6 +66,13 @@ public DateParser() { */ public InferredDate parseSingle(String input) throws ParseException { assert input != null; + + // Temporary workaround for natty's failure at adapting to locales dd-mm-yyyy, until + // their issue is closed. + if (!Locale.getDefault().equals(Locale.US)) { + input = input.replaceAll("(\\d{1,2})-(\\d{1,2})-((?:\\d\\d){1,2})", "$2-$1-$3"); + } + List dateGroups = this.nattyParser.parse(input); int totalDates = countDates(dateGroups); @@ -75,6 +83,9 @@ public InferredDate parseSingle(String input) throws ParseException { throw new ParseException(input, "Too many dates entered."); DateGroup group = dateGroups.get(0); + + + return new InferredDate( group.getDates().get(0), group.isDateInferred(), From ecf563679fc5a197854dc1a14244ff37c394f379 Mon Sep 17 00:00:00 2001 From: "Henry\\Henry" Date: Wed, 26 Oct 2016 21:37:46 +0800 Subject: [PATCH 53/55] Fix modify command parser not accepting empty values --- .../savvytasker/logic/parser/DateParser.java | 2 +- .../logic/parser/ModifyCommandParser.java | 27 ++++++++++++------- .../logic/parser/TaskFieldParser.java | 2 +- 3 files changed, 20 insertions(+), 11 deletions(-) diff --git a/src/main/java/seedu/savvytasker/logic/parser/DateParser.java b/src/main/java/seedu/savvytasker/logic/parser/DateParser.java index a1da821738b8..66549fd40200 100644 --- a/src/main/java/seedu/savvytasker/logic/parser/DateParser.java +++ b/src/main/java/seedu/savvytasker/logic/parser/DateParser.java @@ -19,7 +19,7 @@ public class InferredDate { private final boolean dateInferred; private final boolean timeInferred; - private InferredDate(Date inferredDateTime, boolean dateInferred, boolean timeInferred) { + public InferredDate(Date inferredDateTime, boolean dateInferred, boolean timeInferred) { this.inferredDateTime = inferredDateTime; this.dateInferred = dateInferred; this.timeInferred = timeInferred; diff --git a/src/main/java/seedu/savvytasker/logic/parser/ModifyCommandParser.java b/src/main/java/seedu/savvytasker/logic/parser/ModifyCommandParser.java index 784c2443587f..17bec39e9e0b 100644 --- a/src/main/java/seedu/savvytasker/logic/parser/ModifyCommandParser.java +++ b/src/main/java/seedu/savvytasker/logic/parser/ModifyCommandParser.java @@ -1,6 +1,7 @@ //@@author A0139916U package seedu.savvytasker.logic.parser; +import java.util.Date; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -29,15 +30,15 @@ public class ModifyCommandParser implements CommandParser { private static final Pattern REGEX_PATTERN = Pattern.compile( HEADER+"\\s+(?<"+REGEX_REF_INDEX+">([^/]+?(\\s+|$))+)((?<=\\s)(" + - "(t/(?<"+REGEX_REF_TASK_NAME+">[^/]+)(?!.*\\st/))|" + - "(s/(?<"+REGEX_REF_START_DATE+">[^/]+)(?!.*\\ss/))|" + - "(e/(?<"+REGEX_REF_END_DATE+">[^/]+)(?!.*\\se/))|" + - "(l/(?<"+REGEX_REF_LOCATION+">[^/]+)(?!.*\\sl/))|" + + "(t/(?<"+REGEX_REF_TASK_NAME+">[^/]*)(?!.*\\st/))|" + + "(s/(?<"+REGEX_REF_START_DATE+">[^/]*)(?!.*\\ss/))|" + + "(e/(?<"+REGEX_REF_END_DATE+">[^/]*)(?!.*\\se/))|" + + "(l/(?<"+REGEX_REF_LOCATION+">[^/]*)(?!.*\\sl/))|" + "(p/(?<"+REGEX_REF_PRIORITY_LEVEL+">[^/]+)(?!.*\\sp/))|" + "(r/(?<"+REGEX_REF_RECURRING_TYPE+">[^/]+)(?!.*\\sr/))|" + - "(n/(?<"+REGEX_REF_NUMBER_OF_RECURRENCE+">[^/]+?)(?!.*\\sn/))|" + - "(c/(?<"+REGEX_REF_CATEGORY+">[^/]+)(?!.*\\sc/))|" + - "(d/(?<"+REGEX_REF_DESCRIPTION+">[^/]+)(?!.*\\sd/))" + + "(n/(?<"+REGEX_REF_NUMBER_OF_RECURRENCE+">[^/]+)(?!.*\\sn/))|" + + "(c/(?<"+REGEX_REF_CATEGORY+">[^/]*)(?!.*\\sc/))|" + + "(d/(?<"+REGEX_REF_DESCRIPTION+">[^/]*)(?!.*\\sd/))" + ")(\\s|$)){0,11}", Pattern.CASE_INSENSITIVE); private static final TaskFieldParser TASK_PARSER = new TaskFieldParser(); @@ -59,8 +60,8 @@ public ModifyCommand parse(String commandText) throws ParseException { if (matcher.matches()) { int index = parseIndex(matcher.group(REGEX_REF_INDEX)); - InferredDate startDate = TASK_PARSER.parseStartDate(matcher.group(REGEX_REF_START_DATE)); - InferredDate endDate = TASK_PARSER.parseEndDate(matcher.group(REGEX_REF_END_DATE)); + InferredDate startDate = parseDate(matcher.group(REGEX_REF_START_DATE)); + InferredDate endDate = parseDate(matcher.group(REGEX_REF_END_DATE)); String taskName = TASK_PARSER.parseTaskName(matcher.group(REGEX_REF_TASK_NAME)); String location = TASK_PARSER.parseLocation(matcher.group(REGEX_REF_LOCATION)); PriorityLevel priority = TASK_PARSER.parsePriorityLevel(matcher.group(REGEX_REF_PRIORITY_LEVEL)); @@ -86,4 +87,12 @@ private int parseIndex(String indexText) throws ParseException { throw new ParseException(indexText, "INDEX: " + ex.getFailureDetails()); } } + + private InferredDate parseDate(String dateText) throws ParseException { + if (dateText.trim().isEmpty()) { + return TASK_PARSER.dateParser.new InferredDate(new Date(), true, true); + } + + return TASK_PARSER.parseStartDate(dateText); + } } diff --git a/src/main/java/seedu/savvytasker/logic/parser/TaskFieldParser.java b/src/main/java/seedu/savvytasker/logic/parser/TaskFieldParser.java index 2c8612366fdd..4e981b3dd4ba 100644 --- a/src/main/java/seedu/savvytasker/logic/parser/TaskFieldParser.java +++ b/src/main/java/seedu/savvytasker/logic/parser/TaskFieldParser.java @@ -9,7 +9,7 @@ * This class contains common parsing methods for parsing Task fields. */ public class TaskFieldParser { - private DateParser dateParser; + protected final DateParser dateParser; public TaskFieldParser() { this.dateParser = new DateParser(); From 0d0d0e80172320835a85975d112fb74b96201d16 Mon Sep 17 00:00:00 2001 From: qhng Date: Wed, 26 Oct 2016 22:50:19 +0800 Subject: [PATCH 54/55] Fix removing fields that were setted previously and needs to be "unset" --- .../commons/util/SmartDefaultDates.java | 16 +++- .../logic/commands/AddCommand.java | 4 +- .../logic/commands/ModifyCommand.java | 8 +- .../logic/parser/ModifyCommandParser.java | 2 +- .../seedu/savvytasker/model/task/Task.java | 82 ++++++++++++++++++- 5 files changed, 95 insertions(+), 17 deletions(-) diff --git a/src/main/java/seedu/savvytasker/commons/util/SmartDefaultDates.java b/src/main/java/seedu/savvytasker/commons/util/SmartDefaultDates.java index 387916024f48..cf6133f1c763 100644 --- a/src/main/java/seedu/savvytasker/commons/util/SmartDefaultDates.java +++ b/src/main/java/seedu/savvytasker/commons/util/SmartDefaultDates.java @@ -19,10 +19,10 @@ public class SmartDefaultDates { private final Calendar today; /** - * + * Determines the smart defaults for the dates provided. Can set both + * start and end dates as null to get a basic smart default. * @param startDateTime Starting date time * @param endDateTime Ending date time - * @throws InvalidDateException If endDateTime is earlier than startDateTime */ public SmartDefaultDates(InferredDate startDateTime, InferredDate endDateTime) { calendar = Calendar.getInstance(); @@ -50,7 +50,11 @@ public SmartDefaultDates(InferredDate startDateTime, InferredDate endDateTime) { public Date getEnd(InferredDate endDateTime) { if (endDateTime == null) return null; calendar.setTime(endDateTime.getInferredDateTime()); - if (endDateTime.isDateInferred()) { + if (endDateTime.isDateInferred() && endDateTime.isTimeInferred()) { + // user didn't specify anything + // remove date field + return null; + } else if (endDateTime.isDateInferred()) { // date not supplied // defaults to today calendar.set(Calendar.DATE, today.get(Calendar.DATE)); @@ -94,7 +98,11 @@ private void parseEnd(InferredDate endDateTime) { public Date getStart(InferredDate startDateTime) { if (startDateTime == null) return null; calendar.setTime(startDateTime.getInferredDateTime()); - if (startDateTime.isDateInferred()) { + if (startDateTime.isDateInferred() && startDateTime.isTimeInferred()) { + // user didn't specify anything + // remove date field + return null; + } else if (startDateTime.isDateInferred()) { // date not supplied // defaults to today calendar.set(Calendar.DATE, today.get(Calendar.DATE)); diff --git a/src/main/java/seedu/savvytasker/logic/commands/AddCommand.java b/src/main/java/seedu/savvytasker/logic/commands/AddCommand.java index 15223526e149..67c1a948db24 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/AddCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/AddCommand.java @@ -1,7 +1,6 @@ package seedu.savvytasker.logic.commands; import seedu.savvytasker.commons.core.UnmodifiableObservableList; -import seedu.savvytasker.commons.util.SmartDefaultDates; import seedu.savvytasker.logic.parser.DateParser.InferredDate; import seedu.savvytasker.model.task.PriorityLevel; import seedu.savvytasker.model.task.ReadOnlyTask; @@ -62,8 +61,7 @@ private void createTask() { final boolean isArchived = false; // all tasks are first added as active tasks final int taskId = 0; // taskId to be assigned by ModelManager, leave as 0 - SmartDefaultDates sdd = new SmartDefaultDates(startDateTime, endDateTime); - this.toAdd = new Task(taskId, taskName, sdd.getStartDate(), sdd.getEndDate(), + this.toAdd = new Task(taskId, taskName, startDateTime, endDateTime, location, priority, recurringType, numberOfRecurrence, category, description, isArchived); } diff --git a/src/main/java/seedu/savvytasker/logic/commands/ModifyCommand.java b/src/main/java/seedu/savvytasker/logic/commands/ModifyCommand.java index 53405f7fe77a..6deea98ad6c2 100644 --- a/src/main/java/seedu/savvytasker/logic/commands/ModifyCommand.java +++ b/src/main/java/seedu/savvytasker/logic/commands/ModifyCommand.java @@ -2,7 +2,6 @@ import seedu.savvytasker.commons.core.Messages; import seedu.savvytasker.commons.core.UnmodifiableObservableList; -import seedu.savvytasker.commons.util.SmartDefaultDates; import seedu.savvytasker.logic.parser.DateParser.InferredDate; import seedu.savvytasker.model.task.PriorityLevel; import seedu.savvytasker.model.task.ReadOnlyTask; @@ -70,13 +69,10 @@ public CommandResult execute() { indicateAttemptToExecuteIncorrectCommand(); return new CommandResult(Messages.MESSAGE_INVALID_TASK_DISPLAYED_INDEX); } - - - SmartDefaultDates sdd = new SmartDefaultDates(null, null); ReadOnlyTask taskToModify = lastShownList.get(index - 1); - replacement = new Task(taskToModify, taskName, sdd.getStart(startDateTime), - sdd.getEnd(endDateTime), location, priority, + replacement = new Task(taskToModify, taskName, startDateTime, + endDateTime, location, priority, recurringType, numberOfRecurrence, category, description); diff --git a/src/main/java/seedu/savvytasker/logic/parser/ModifyCommandParser.java b/src/main/java/seedu/savvytasker/logic/parser/ModifyCommandParser.java index 17bec39e9e0b..4bb317bdbde2 100644 --- a/src/main/java/seedu/savvytasker/logic/parser/ModifyCommandParser.java +++ b/src/main/java/seedu/savvytasker/logic/parser/ModifyCommandParser.java @@ -89,7 +89,7 @@ private int parseIndex(String indexText) throws ParseException { } private InferredDate parseDate(String dateText) throws ParseException { - if (dateText.trim().isEmpty()) { + if (dateText != null && dateText.trim().isEmpty()) { return TASK_PARSER.dateParser.new InferredDate(new Date(), true, true); } diff --git a/src/main/java/seedu/savvytasker/model/task/Task.java b/src/main/java/seedu/savvytasker/model/task/Task.java index d3aa92c7be22..e70d8763336c 100644 --- a/src/main/java/seedu/savvytasker/model/task/Task.java +++ b/src/main/java/seedu/savvytasker/model/task/Task.java @@ -3,6 +3,9 @@ import java.util.Date; import java.util.Objects; +import seedu.savvytasker.commons.util.SmartDefaultDates; +import seedu.savvytasker.logic.parser.DateParser.InferredDate; + //@@author A0139915W /** * Represents a Task in the task list. @@ -21,9 +24,46 @@ public class Task implements ReadOnlyTask { private String description; private boolean isArchived; + /** + * Constructor with smart defaults + */ + public Task(int id, String taskName, InferredDate startDateTime, InferredDate endDateTime, String location, + PriorityLevel priority, RecurrenceType recurringType, Integer numberOfRecurrence, + String category, String description, boolean isArchived) { + + SmartDefaultDates sdd = new SmartDefaultDates(startDateTime, endDateTime); + this.id = id; + this.taskName = taskName; + this.startDateTime = sdd.getStartDate(); + this.endDateTime = sdd.getEndDate(); + this.location = location; + if (priority == null) { + this.priority = PriorityLevel.Medium; + } else { + this.priority = priority; + } + if (recurringType == null) { + this.recurringType = RecurrenceType.None; + } else { + this.recurringType = recurringType; + } + if (numberOfRecurrence == null) { + this.numberOfRecurrence = 0; + } else { + this.numberOfRecurrence = numberOfRecurrence.intValue(); + } + this.category = category; + this.description = description; + this.isArchived = isArchived; + } + + /** + * Constructor without smart defaults + */ public Task(int id, String taskName, Date startDateTime, Date endDateTime, String location, PriorityLevel priority, RecurrenceType recurringType, Integer numberOfRecurrence, String category, String description, boolean isArchived) { + this.id = id; this.taskName = taskName; this.startDateTime = startDateTime; @@ -70,7 +110,7 @@ public Task(ReadOnlyTask source) { /** * Copy and modify constructor */ - public Task(ReadOnlyTask source, String taskName, Date startDateTime, Date endDateTime, String location, + public Task(ReadOnlyTask source, String taskName, InferredDate startDateTime, InferredDate endDateTime, String location, PriorityLevel priority, RecurrenceType recurringType, Integer numberOfRecurrence, String category, String description) { this(source.getId(), source.getTaskName(), source.getStartDateTime(), @@ -81,8 +121,8 @@ public Task(ReadOnlyTask source, String taskName, Date startDateTime, Date endDa //this.id should follow that of the source. //this.isArchived should follow that of the source. this.taskName = taskName == null ? this.taskName : taskName; - this.startDateTime = startDateTime == null ? this.startDateTime : startDateTime; - this.endDateTime = endDateTime == null ? this.endDateTime : endDateTime; + setStartDate(startDateTime); + setEndDate(endDateTime); this.location = location == null ? this.location : location; this.priority = priority == null ? this.priority : priority; this.recurringType = recurringType == null ? this.recurringType : recurringType; @@ -90,6 +130,42 @@ public Task(ReadOnlyTask source, String taskName, Date startDateTime, Date endDa this.category = category == null ? this.category : category; this.description = description == null ? this.description : description; } + + private void setStartDate(InferredDate inferredDate) { + if (inferredDate == null) { + // user didn't specify s/ + // keep existing start date + } else { + if (inferredDate.isDateInferred() && inferredDate.isTimeInferred()) { + // user specified s/ but with nothing tagged to it + // remove existing start date + this.startDateTime = null; + } else { + // user specified s/ with something tagged to it + // update existing start date + SmartDefaultDates sdd = new SmartDefaultDates(null, null); + this.startDateTime = sdd.getStart(inferredDate); + } + } + } + + private void setEndDate(InferredDate inferredDate) { + if (inferredDate == null) { + // user didn't specify e/ + // keep existing end date + } else { + if (inferredDate.isDateInferred() && inferredDate.isTimeInferred()) { + // user specified e/ but with nothing tagged to it + // remove existing end date + this.endDateTime = null; + } else { + // user specified e/ with something tagged to it + // update existing end date + SmartDefaultDates sdd = new SmartDefaultDates(null, null); + this.endDateTime = sdd.getStart(inferredDate); + } + } + } @Override public int getId() { From 6df335e0b4685cf42b61b3cce75d35d37f2c1a09 Mon Sep 17 00:00:00 2001 From: qhng Date: Wed, 26 Oct 2016 22:50:45 +0800 Subject: [PATCH 55/55] Update unknown command to show help message. Update SUT to reflect changes. --- .../java/seedu/savvytasker/logic/parser/MasterParser.java | 2 +- src/test/java/guitests/AddCommandTest.java | 4 +++- src/test/java/guitests/FindCommandTest.java | 4 +++- src/test/java/guitests/ListCommandTest.java | 4 +++- src/test/java/seedu/savvytasker/logic/LogicManagerTest.java | 2 +- 5 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/main/java/seedu/savvytasker/logic/parser/MasterParser.java b/src/main/java/seedu/savvytasker/logic/parser/MasterParser.java index 2d2cb57188a8..753b62808fe3 100644 --- a/src/main/java/seedu/savvytasker/logic/parser/MasterParser.java +++ b/src/main/java/seedu/savvytasker/logic/parser/MasterParser.java @@ -36,7 +36,7 @@ public Command parse(String userInput) { String trueHeader = extractHeader(header); CommandParser parser = commandParsers.get(trueHeader); if (parser == null) - return new IncorrectCommand(header + body, MESSAGE_UNKNOWN_COMMAND); + return new IncorrectCommand(header + body, String.format(MESSAGE_UNKNOWN_COMMAND, HelpCommand.MESSAGE_USAGE)); if (parser.shouldPreprocess()) body = preprocessBody(body); diff --git a/src/test/java/guitests/AddCommandTest.java b/src/test/java/guitests/AddCommandTest.java index 90c915061984..41984bea99f6 100644 --- a/src/test/java/guitests/AddCommandTest.java +++ b/src/test/java/guitests/AddCommandTest.java @@ -5,10 +5,12 @@ import org.junit.Test; import seedu.savvytasker.commons.core.Messages; +import seedu.savvytasker.logic.commands.HelpCommand; import seedu.savvytasker.testutil.TestTask; import seedu.savvytasker.testutil.TestUtil; import static org.junit.Assert.assertTrue; +import static seedu.savvytasker.commons.core.Messages.MESSAGE_UNKNOWN_COMMAND; //@@author A0139915W public class AddCommandTest extends SavvyTaskerGuiTest { @@ -32,7 +34,7 @@ public void add() { //invalid command commandBox.runCommand("adds Bad Command Task"); - assertResultMessage(Messages.MESSAGE_UNKNOWN_COMMAND); + assertResultMessage(String.format(MESSAGE_UNKNOWN_COMMAND, HelpCommand.MESSAGE_USAGE)); } private void assertAddSuccess(TestTask taskToAdd, TestTask... currentList) { diff --git a/src/test/java/guitests/FindCommandTest.java b/src/test/java/guitests/FindCommandTest.java index 66db1b19546f..fc884bb9e436 100644 --- a/src/test/java/guitests/FindCommandTest.java +++ b/src/test/java/guitests/FindCommandTest.java @@ -3,9 +3,11 @@ import org.junit.Test; import seedu.savvytasker.commons.core.Messages; +import seedu.savvytasker.logic.commands.HelpCommand; import seedu.savvytasker.testutil.TestTask; import static org.junit.Assert.assertTrue; +import static seedu.savvytasker.commons.core.Messages.MESSAGE_UNKNOWN_COMMAND; //@@author A0139915W public class FindCommandTest extends SavvyTaskerGuiTest { @@ -45,7 +47,7 @@ public void find_emptyList(){ @Test public void find_invalidCommand_fail() { commandBox.runCommand("findmyring"); - assertResultMessage(Messages.MESSAGE_UNKNOWN_COMMAND); + assertResultMessage(String.format(MESSAGE_UNKNOWN_COMMAND, HelpCommand.MESSAGE_USAGE)); } private void assertFindResult(String command, TestTask... expectedHits) { diff --git a/src/test/java/guitests/ListCommandTest.java b/src/test/java/guitests/ListCommandTest.java index 5ea0310418ac..990f475711c9 100644 --- a/src/test/java/guitests/ListCommandTest.java +++ b/src/test/java/guitests/ListCommandTest.java @@ -3,9 +3,11 @@ import org.junit.Test; import seedu.savvytasker.commons.core.Messages; +import seedu.savvytasker.logic.commands.HelpCommand; import seedu.savvytasker.testutil.TestTask; import static org.junit.Assert.assertTrue; +import static seedu.savvytasker.commons.core.Messages.MESSAGE_UNKNOWN_COMMAND; //@@author A0139915W public class ListCommandTest extends SavvyTaskerGuiTest { @@ -46,7 +48,7 @@ public void list_emptyList(){ @Test public void find_invalidCommand_fail() { commandBox.runCommand("listmytasks"); - assertResultMessage(Messages.MESSAGE_UNKNOWN_COMMAND); + assertResultMessage(String.format(MESSAGE_UNKNOWN_COMMAND, HelpCommand.MESSAGE_USAGE)); } private void assertListResult(String command, TestTask... expectedHits ) { diff --git a/src/test/java/seedu/savvytasker/logic/LogicManagerTest.java b/src/test/java/seedu/savvytasker/logic/LogicManagerTest.java index 30776f5af566..eec2e4ca6fd3 100644 --- a/src/test/java/seedu/savvytasker/logic/LogicManagerTest.java +++ b/src/test/java/seedu/savvytasker/logic/LogicManagerTest.java @@ -128,7 +128,7 @@ private void assertCommandBehavior(String inputCommand, String expectedMessage, @Test public void execute_unknownCommandWord() throws Exception { String unknownCommand = "uicfhmowqewca"; - assertCommandBehavior(unknownCommand, MESSAGE_UNKNOWN_COMMAND); + assertCommandBehavior(unknownCommand, String.format(MESSAGE_UNKNOWN_COMMAND, HelpCommand.MESSAGE_USAGE)); } @Test