diff --git a/src/main/java/duke/command/RescheduleCommand.java b/src/main/java/duke/command/RescheduleCommand.java new file mode 100644 index 0000000000..c82c17bb81 --- /dev/null +++ b/src/main/java/duke/command/RescheduleCommand.java @@ -0,0 +1,30 @@ +package duke.command; + +import duke.exception.DukeException; +import duke.list.TaskList; +import duke.storage.Storage; +import duke.task.Task; +import duke.ui.Ui; + +public class RescheduleCommand extends Command { + + public static final String COMMAND_WORD = "reschedule"; + + private int index; + private String deadline; + + public RescheduleCommand(int index, String deadline) { + this.index = index; + this.deadline = deadline; + } + + /** + * @inheritDoc + */ + @Override + public String execute(TaskList taskList, Ui ui, Storage storage) throws DukeException { + Task task = taskList.rescheduleTask(index, deadline); + storage.write(taskList); + return ui.showRescheduleMessage(task); + } +} diff --git a/src/main/java/duke/list/TaskList.java b/src/main/java/duke/list/TaskList.java index 085f3a545d..c808407670 100644 --- a/src/main/java/duke/list/TaskList.java +++ b/src/main/java/duke/list/TaskList.java @@ -81,6 +81,15 @@ public Task deleteTask(int index) throws DukeException { this.taskList.remove(index - 1); return task; } + + public Task rescheduleTask(int index, String deadline) throws DukeException { + if (index < 1 || index > this.taskList.size()) { + throw new DukeException("Index does not exist"); + } + Task task = this.taskList.get(index - 1); + task.rescheduleTask(deadline); + return task; + } public void add(Task task) { this.taskList.add(task); } diff --git a/src/main/java/duke/parser/Parser.java b/src/main/java/duke/parser/Parser.java index 94ffe381a4..38f6499397 100644 --- a/src/main/java/duke/parser/Parser.java +++ b/src/main/java/duke/parser/Parser.java @@ -9,6 +9,7 @@ import duke.command.DeleteCommand; import duke.command.ListCommand; import duke.command.ExitCommand; +import duke.command.RescheduleCommand; import duke.command.WrongCommand; import duke.command.FindCommand; import duke.exception.DukeException; @@ -47,6 +48,8 @@ public static Command parse(String input) throws DukeException { return createDeleteCommand(input); case FindCommand.COMMAND_WORD: return createFindCommand(input); + case RescheduleCommand.COMMAND_WORD: + return createRescheduleCommand(input); case ListCommand.COMMAND_WORD: return new ListCommand(); case ExitCommand.COMMAND_WORD: @@ -56,6 +59,21 @@ public static Command parse(String input) throws DukeException { } } + private static RescheduleCommand createRescheduleCommand(String input) throws DukeException { + String[] rescheduleData = input.split(" ", 3); + if (rescheduleData.length < 3) { + throw new DukeException("Provide the command as such:\nreschedule [index] [deadline]"); + } + try { + String newDeadline = LocalDate.parse(rescheduleData[2]).format(DateTimeFormatter.ofPattern("MMM d yyyy")); + return new RescheduleCommand(Integer.valueOf(rescheduleData[1]), newDeadline); + } catch (NumberFormatException e) { + throw new DukeException("Please specify the index of the task (Numbers only)"); + } catch (DateTimeException e) { + throw new DukeException("Please represent time in a proper time format of yyyy-mm-dd"); + } + } + private static FindCommand createFindCommand(String input) throws DukeException { String[] searchData = input.split(" ", 2); if (searchData.length < 2) { diff --git a/src/main/java/duke/task/Deadline.java b/src/main/java/duke/task/Deadline.java index d3aec80cf1..9e9a041d50 100644 --- a/src/main/java/duke/task/Deadline.java +++ b/src/main/java/duke/task/Deadline.java @@ -44,4 +44,10 @@ public void writeToFile(FileWriter fw) throws IOException { String storedRow = "D|" + (this.isDone ? "1|" : "0|") + this.getTask() + "|" + this.due; fw.write(storedRow); } + + @Override + public void rescheduleTask(String newDeadline) { + this.due = newDeadline; + } + } diff --git a/src/main/java/duke/task/Event.java b/src/main/java/duke/task/Event.java index e82de1cb15..2566d352e5 100644 --- a/src/main/java/duke/task/Event.java +++ b/src/main/java/duke/task/Event.java @@ -54,4 +54,9 @@ public void writeToFile(FileWriter fw) throws IOException { fw.write(storedRow); } + @Override + public void rescheduleTask(String newDeadline) { + this.to = newDeadline; + } + } diff --git a/src/main/java/duke/task/Task.java b/src/main/java/duke/task/Task.java index 9b70d4b755..e9866524e5 100644 --- a/src/main/java/duke/task/Task.java +++ b/src/main/java/duke/task/Task.java @@ -1,5 +1,7 @@ package duke.task; +import duke.exception.DukeException; + import java.io.FileWriter; import java.io.IOException; @@ -75,6 +77,7 @@ public boolean match(String search) { return this.task.contains(search); } + /** * Writes the task data to a FileWriter. * @@ -82,4 +85,6 @@ public boolean match(String search) { * @throws IOException If there is an issue writing the data. */ public abstract void writeToFile(FileWriter fw) throws IOException; + + public abstract void rescheduleTask(String newDeadline) throws DukeException; } diff --git a/src/main/java/duke/task/ToDo.java b/src/main/java/duke/task/ToDo.java index 8616812d51..e8bf629948 100644 --- a/src/main/java/duke/task/ToDo.java +++ b/src/main/java/duke/task/ToDo.java @@ -1,5 +1,7 @@ package duke.task; +import duke.exception.DukeException; + import java.io.FileWriter; import java.io.IOException; @@ -44,4 +46,9 @@ public void writeToFile(FileWriter fw) throws IOException { String storedRow = "T|" + (this.isDone ? "1|" : "0|") + this.getTask(); fw.write(storedRow); } + + @Override + public void rescheduleTask(String newDeadline) throws DukeException { + throw new DukeException("Chosen task has no time restriction"); + } } diff --git a/src/main/java/duke/ui/Ui.java b/src/main/java/duke/ui/Ui.java index 88ecab449c..b5748d08aa 100644 --- a/src/main/java/duke/ui/Ui.java +++ b/src/main/java/duke/ui/Ui.java @@ -141,7 +141,7 @@ public String showItems(TaskList taskList) { * @return Message containing the details on the deletion of the task */ public String showDeleteMessage(Task task, TaskList taskList) { - return "Noted. I've removed this duke.task:\n" + return "Noted. I've removed this task:\n" + "\t" + task + "\n" + "Now you have " + taskList.size() + " tasks in the list"; } @@ -160,6 +160,11 @@ public String showMatchingTasks(ArrayList tasks) { } } + public String showRescheduleMessage(Task task) { + return "Noted. I've rescheduled the deadline for this task as shown:\n" + + "\t" + task; + } + /** * Returns a goodbye message confirming the termination of the program. *