Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add personal tasks #34

Merged
merged 13 commits into from
Mar 15, 2024
25 changes: 22 additions & 3 deletions src/main/java/seedu/address/MainApp.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,16 @@
import seedu.address.model.ModelManager;
import seedu.address.model.ReadOnlyAddressBook;
import seedu.address.model.ReadOnlyUserPrefs;
import seedu.address.model.TaskList;
import seedu.address.model.UserPrefs;
import seedu.address.model.util.SampleDataUtil;
import seedu.address.storage.AddressBookStorage;
import seedu.address.storage.JsonAddressBookStorage;
import seedu.address.storage.JsonTaskListStorage;
import seedu.address.storage.JsonUserPrefsStorage;
import seedu.address.storage.Storage;
import seedu.address.storage.StorageManager;
import seedu.address.storage.TaskListStorage;
import seedu.address.storage.UserPrefsStorage;
import seedu.address.ui.Ui;
import seedu.address.ui.UiManager;
Expand Down Expand Up @@ -58,7 +61,8 @@
UserPrefsStorage userPrefsStorage = new JsonUserPrefsStorage(config.getUserPrefsFilePath());
UserPrefs userPrefs = initPrefs(userPrefsStorage);
AddressBookStorage addressBookStorage = new JsonAddressBookStorage(userPrefs.getAddressBookFilePath());
storage = new StorageManager(addressBookStorage, userPrefsStorage);
TaskListStorage taskListStorage = new JsonTaskListStorage(userPrefs.getTaskListFilePath());
storage = new StorageManager(addressBookStorage, taskListStorage, userPrefsStorage);

Check warning on line 65 in src/main/java/seedu/address/MainApp.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/seedu/address/MainApp.java#L64-L65

Added lines #L64 - L65 were not covered by tests

model = initModelManager(storage, userPrefs);

Expand All @@ -73,10 +77,13 @@
* or an empty address book will be used instead if errors occur when reading {@code storage}'s address book.
*/
private Model initModelManager(Storage storage, ReadOnlyUserPrefs userPrefs) {
logger.info("Using data file : " + storage.getAddressBookFilePath());
logger.info("Using data file : " + storage.getAddressBookFilePath() + ", "
+ storage.getTaskListFilePath());

Check warning on line 81 in src/main/java/seedu/address/MainApp.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/seedu/address/MainApp.java#L80-L81

Added lines #L80 - L81 were not covered by tests

Optional<ReadOnlyAddressBook> addressBookOptional;
ReadOnlyAddressBook initialData;
Optional<TaskList> taskListOptional;
TaskList initialTasks;
try {
addressBookOptional = storage.readAddressBook();
if (!addressBookOptional.isPresent()) {
Expand All @@ -90,7 +97,19 @@
initialData = new AddressBook();
}

return new ModelManager(initialData, userPrefs);
try {
taskListOptional = storage.readTaskList();

Check warning on line 101 in src/main/java/seedu/address/MainApp.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/seedu/address/MainApp.java#L101

Added line #L101 was not covered by tests
if (!taskListOptional.isPresent()) {
logger.info("Creating a new data file " + storage.getTaskListFilePath());

Check warning on line 103 in src/main/java/seedu/address/MainApp.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/seedu/address/MainApp.java#L103

Added line #L103 was not covered by tests
}
initialTasks = taskListOptional.orElseGet(SampleDataUtil::getSampleTaskList);
} catch (DataLoadingException e) {
logger.warning("Data file at " + storage.getTaskListFilePath() + " could not be loaded."

Check warning on line 107 in src/main/java/seedu/address/MainApp.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/seedu/address/MainApp.java#L105-L107

Added lines #L105 - L107 were not covered by tests
+ " Will be starting with an empty task list.");
initialTasks = new TaskList();
}

Check warning on line 110 in src/main/java/seedu/address/MainApp.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/seedu/address/MainApp.java#L109-L110

Added lines #L109 - L110 were not covered by tests

return new ModelManager(initialData, initialTasks, userPrefs);

Check warning on line 112 in src/main/java/seedu/address/MainApp.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/seedu/address/MainApp.java#L112

Added line #L112 was not covered by tests
}

private void initLogging(Config config) {
Expand Down
1 change: 1 addition & 0 deletions src/main/java/seedu/address/logic/LogicManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ public CommandResult execute(String commandText) throws CommandException, ParseE

try {
storage.saveAddressBook(model.getAddressBook());
storage.saveTaskList(model.getTaskList());
} catch (AccessDeniedException e) {
throw new CommandException(String.format(FILE_OPS_PERMISSION_ERROR_FORMAT, e.getMessage()), e);
} catch (IOException ioe) {
Expand Down
8 changes: 8 additions & 0 deletions src/main/java/seedu/address/logic/Messages.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

import seedu.address.logic.parser.Prefix;
import seedu.address.model.person.Person;
import seedu.address.model.task.Task;

/**
* Container for user visible messages.
Expand Down Expand Up @@ -48,4 +49,11 @@ public static String format(Person person) {
return builder.toString();
}

/**
* Formats the {@code task} for display to the user.
*/
public static String formatTask(Task task) {
Copy link

@chin-herng chin-herng Mar 15, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit-pick, might be better to just overload the format(Person) method and name this format as well?

return task.getDescription();
}

}
72 changes: 72 additions & 0 deletions src/main/java/seedu/address/logic/commands/AddTaskCommand.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
package seedu.address.logic.commands;

import static java.util.Objects.requireNonNull;

import seedu.address.commons.util.ToStringBuilder;
import seedu.address.logic.Messages;
import seedu.address.logic.commands.exceptions.CommandException;
import seedu.address.model.Model;
import seedu.address.model.task.Task;

/**
* Adds a task to the task list.
*/
public class AddTaskCommand extends Command {

public static final String COMMAND_WORD = "addtask";
public static final String MESSAGE_USAGE = COMMAND_WORD + ": Adds a task to the task list. "
+ "Parameter: <description> the description of the task.";
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;

/**
* Creates an AddTaskCommand to add the specified {@code Task}
*/
public AddTaskCommand(Task task) {
requireNonNull(task);
toAdd = task;
}

/**
* Executes the command and returns the result message.
*
* @param model {@code Model} which the command should operate on.
* @return feedback message of the operation result for display
* @throws CommandException If an error occurs during command execution.
*/
@Override
public CommandResult execute(Model model) throws CommandException {
requireNonNull(model);

if (model.hasTask(toAdd)) {
throw new CommandException(MESSAGE_DUPLICATE_TASK);
}

model.addTask(toAdd);
return new CommandResult(String.format(MESSAGE_SUCCESS, Messages.formatTask(toAdd)));
}

@Override
public boolean equals(Object other) {
if (other == this) {
return true;
}

// instanceof handles nulls
if (!(other instanceof AddCommand)) {
return false;
}

AddTaskCommand otherAddTaskCommand = (AddTaskCommand) other;
return toAdd.equals(otherAddTaskCommand.toAdd);

Check warning on line 63 in src/main/java/seedu/address/logic/commands/AddTaskCommand.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/seedu/address/logic/commands/AddTaskCommand.java#L62-L63

Added lines #L62 - L63 were not covered by tests
}

@Override
public String toString() {
return new ToStringBuilder(this)
.add("toAdd", toAdd)
.toString();
}
}
30 changes: 30 additions & 0 deletions src/main/java/seedu/address/logic/parser/AddTaskCommandParser.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package seedu.address.logic.parser;

import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;

import seedu.address.logic.commands.AddTaskCommand;
import seedu.address.logic.parser.exceptions.ParseException;
import seedu.address.model.task.Task;

/**
* Parses input arguments and creates a new AddTaskCommand object
*/
public class AddTaskCommandParser implements Parser<AddTaskCommand> {

/**
* Parses {@code userInput} into a command and returns it.
*
* @param userInput
* @throws ParseException if {@code userInput} does not conform the expected format
*/
@Override
public AddTaskCommand parse(String userInput) throws ParseException {
if (userInput.isEmpty()) {
throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddTaskCommand.MESSAGE_USAGE));
}

Task task = new Task(userInput);
return new AddTaskCommand(task);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@

import seedu.address.commons.core.LogsCenter;
import seedu.address.logic.commands.AddCommand;
import seedu.address.logic.commands.AddTaskCommand;
import seedu.address.logic.commands.ClearCommand;
import seedu.address.logic.commands.Command;
import seedu.address.logic.commands.DeleteCommand;
Expand Down Expand Up @@ -56,6 +57,9 @@ public Command parseCommand(String userInput) throws ParseException {
case AddCommand.COMMAND_WORD:
return new AddCommandParser().parse(arguments);

case AddTaskCommand.COMMAND_WORD:
return new AddTaskCommandParser().parse(arguments);

case EditCommand.COMMAND_WORD:
return new EditCommandParser().parse(arguments);

Expand Down
32 changes: 32 additions & 0 deletions src/main/java/seedu/address/model/Model.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import javafx.collections.ObservableList;
import seedu.address.commons.core.GuiSettings;
import seedu.address.model.person.Person;
import seedu.address.model.task.Task;

/**
* The API of the Model component.
Expand Down Expand Up @@ -76,6 +77,37 @@
*/
void setPerson(Person target, Person editedPerson);

/**
* Returns the user prefs' task list file path.
*/
Path getTaskListFilePath();

/**
* Sets the user prefs' task list file path.
*/
void setTaskListFilePath(Path addressBookFilePath);

/**
* Replaces task list data with the data in {@code taskList}.
*/
static void setTaskList(TaskList taskList) {}

Check warning on line 93 in src/main/java/seedu/address/model/Model.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/seedu/address/model/Model.java#L93

Added line #L93 was not covered by tests

/**
* Returns the task list.
*/
TaskList getTaskList();

/**
* Adds the given task.
* {@code task} must not already exist in the address book.
*/
void addTask(Task task);

/**
* Returns true if a task has the same description as a {@code task} in the task list.
*/
boolean hasTask(Task task);

/** Returns an unmodifiable view of the filtered person list */
ObservableList<Person> getFilteredPersonList();

Expand Down
62 changes: 57 additions & 5 deletions src/main/java/seedu/address/model/ModelManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,32 +12,35 @@
import seedu.address.commons.core.GuiSettings;
import seedu.address.commons.core.LogsCenter;
import seedu.address.model.person.Person;
import seedu.address.model.task.Task;

/**
* Represents the in-memory model of the address book data.
*/
public class ModelManager implements Model {
private static final Logger logger = LogsCenter.getLogger(ModelManager.class);

private final AddressBook addressBook;
private final TaskList taskList;
private final UserPrefs userPrefs;
private final FilteredList<Person> filteredPersons;

/**
* Initializes a ModelManager with the given addressBook and userPrefs.
*/
public ModelManager(ReadOnlyAddressBook addressBook, ReadOnlyUserPrefs userPrefs) {
requireAllNonNull(addressBook, userPrefs);
public ModelManager(ReadOnlyAddressBook addressBook, TaskList taskList, ReadOnlyUserPrefs userPrefs) {
requireAllNonNull(addressBook, taskList, userPrefs);

logger.fine("Initializing with address book: " + addressBook + " and user prefs " + userPrefs);
logger.fine("Initializing with address book: " + addressBook + ", task list: " + taskList
+ " and user prefs " + userPrefs);

this.addressBook = new AddressBook(addressBook);
this.taskList = taskList;
this.userPrefs = new UserPrefs(userPrefs);
filteredPersons = new FilteredList<>(this.addressBook.getPersonList());
}

public ModelManager() {
this(new AddressBook(), new UserPrefs());
this(new AddressBook(), new TaskList(), new UserPrefs());
}

//=========== UserPrefs ==================================================================================
Expand Down Expand Up @@ -69,12 +72,31 @@
return userPrefs.getAddressBookFilePath();
}

/**
* Returns the user prefs' task list file path.
*/
@Override
public Path getTaskListFilePath() {
return userPrefs.getTaskListFilePath();
}

@Override
public void setAddressBookFilePath(Path addressBookFilePath) {
requireNonNull(addressBookFilePath);
userPrefs.setAddressBookFilePath(addressBookFilePath);
}

/**
* Sets the user prefs' task list file path.
*
* @param taskListFilePath
*/
@Override
public void setTaskListFilePath(Path taskListFilePath) {
requireNonNull(taskListFilePath);
userPrefs.setTaskListFilePath(taskListFilePath);
}

//=========== AddressBook ================================================================================

@Override
Expand Down Expand Up @@ -111,6 +133,36 @@
addressBook.setPerson(target, editedPerson);
}

//=========== Task Manager ===============================================================================

@Override
public void addTask(Task task) {
taskList.addTask(task);
}

@Override
public boolean hasTask(Task task) {
requireNonNull(task);
return taskList.hasTask(task);
}

/**
* Replaces task list data with the data in {@code taskList}.
*
* @param tasks
*/
public void setTaskList(TaskList tasks) {
taskList.setTaskList(tasks);
}

Check warning on line 156 in src/main/java/seedu/address/model/ModelManager.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/seedu/address/model/ModelManager.java#L155-L156

Added lines #L155 - L156 were not covered by tests

/**
* Returns the task list.
*/
@Override
public TaskList getTaskList() {
return taskList;
}

//=========== Filtered Person List Accessors =============================================================

/**
Expand Down
2 changes: 2 additions & 0 deletions src/main/java/seedu/address/model/ReadOnlyUserPrefs.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,6 @@ public interface ReadOnlyUserPrefs {

Path getAddressBookFilePath();

Path getTaskListFilePath();

}
Loading
Loading