From 1e44177514d30c6b939da501c290bc3d88c362e2 Mon Sep 17 00:00:00 2001 From: kristianachwan Date: Thu, 26 Jan 2023 18:17:28 +0800 Subject: [PATCH 01/40] Update welcome message --- src/main/java/Duke.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 5d313334c..27f40478f 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -5,6 +5,12 @@ public static void main(String[] args) { + "| | | | | | | |/ / _ \\\n" + "| |_| | |_| | < __/\n" + "|____/ \\__,_|_|\\_\\___|\n"; - System.out.println("Hello from\n" + logo); + System.out.println("____________________________________________________________\n" + + logo + + "Hello! I'm Duke!\n" + + "What I can do for you?\n" + + "____________________________________________________________\n" + + "Bye. Hope to see you again soon!\n" + + "____________________________________________________________\n"); } } From d60470024bdde12561fee65fb6a493c32e114906 Mon Sep 17 00:00:00 2001 From: kristianachwan Date: Fri, 27 Jan 2023 23:10:32 +0800 Subject: [PATCH 02/40] Add greet, echo, and exit feature --- src/main/java/Duke.java | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 27f40478f..ad4fbec18 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -1,5 +1,8 @@ +import java.util.Scanner; + public class Duke { public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); String logo = " ____ _ \n" + "| _ \\ _ _| | _____ \n" + "| | | | | | | |/ / _ \\\n" @@ -10,7 +13,30 @@ public static void main(String[] args) { + "Hello! I'm Duke!\n" + "What I can do for you?\n" + "____________________________________________________________\n" - + "Bye. Hope to see you again soon!\n" - + "____________________________________________________________\n"); + ); + String userInput; + String outputMessage; + boolean exit = false; + while (true) { + userInput = scanner.nextLine(); + switch(userInput) { + case "bye": + exit = true; + outputMessage = "Bye. Hope to see you again soon!"; + break; + default: + outputMessage = userInput; + } + System.out.println("\t____________________________________________________________"); + System.out.println("\t" + outputMessage); + System.out.println("\t____________________________________________________________"); + if (exit) { + break; + } + } + } + + + } From ea350534cd20c0815923296013051385bfbe8cd2 Mon Sep 17 00:00:00 2001 From: kristianachwan Date: Fri, 27 Jan 2023 23:23:15 +0800 Subject: [PATCH 03/40] Add add and list feature --- src/main/java/Duke.java | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index ad4fbec18..2dc49f95d 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -14,18 +14,24 @@ public static void main(String[] args) { + "What I can do for you?\n" + "____________________________________________________________\n" ); - String userInput; + String inputText; String outputMessage; + String[] inputList = new String[100]; + int inputCount = 0; boolean exit = false; while (true) { - userInput = scanner.nextLine(); - switch(userInput) { + inputText = scanner.nextLine(); + switch(inputText) { + case "list": + outputMessage = getListInputs(inputList, inputCount); + break; case "bye": exit = true; outputMessage = "Bye. Hope to see you again soon!"; break; - default: - outputMessage = userInput; + default: + addInput(inputText, inputList, inputCount++); + outputMessage = "added: " + inputText; } System.out.println("\t____________________________________________________________"); System.out.println("\t" + outputMessage); @@ -36,7 +42,16 @@ public static void main(String[] args) { } } - + public static String getListInputs (String[] inputList, int inputCount){ + String listInputs = ""; + for (int i = 0; i < inputCount; i++) { + listInputs += String.format("%3d. ", (i+1)) + inputList[i] + "\n\t"; + } + return listInputs; + } + public static void addInput (String inputText, String[] inputList, int inputCount){ + inputList[inputCount] = inputText; + } } From 6c9b878aece636f8f4c042c96a143ea363312971 Mon Sep 17 00:00:00 2001 From: kristianachwan Date: Fri, 27 Jan 2023 23:54:11 +0800 Subject: [PATCH 04/40] Add mark as done feature and Task class --- src/main/java/Duke.java | 49 ++++++++++++++++------------------------- src/main/java/Task.java | 40 +++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 30 deletions(-) create mode 100644 src/main/java/Task.java diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 2dc49f95d..b2ac9ab1e 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -14,44 +14,33 @@ public static void main(String[] args) { + "What I can do for you?\n" + "____________________________________________________________\n" ); + Task[] tasks = new Task[100]; String inputText; String outputMessage; - String[] inputList = new String[100]; - int inputCount = 0; - boolean exit = false; while (true) { inputText = scanner.nextLine(); - switch(inputText) { - case "list": - outputMessage = getListInputs(inputList, inputCount); - break; - case "bye": - exit = true; - outputMessage = "Bye. Hope to see you again soon!"; - break; - default: - addInput(inputText, inputList, inputCount++); - outputMessage = "added: " + inputText; + if (inputText.equals("list")) { + outputMessage = Task.getListInputs(tasks); + } else if (inputText.startsWith("mark")) { + int taskIndex = Integer.parseInt(inputText.split(" ")[1]) - 1; + tasks[taskIndex].markAsDone(); + outputMessage = "Nice! I've marked this task as done: " + "\n\t\t" + + tasks[taskIndex].toString(); + } else if (inputText.startsWith("unmark")) { + int taskIndex = Integer.parseInt(inputText.split(" ")[1]) - 1; + tasks[taskIndex].unmarkAsDone(); + outputMessage = "Ok, I've marked this task as not done: " + "\n\t\t" + + tasks[taskIndex].toString(); + } else if (inputText.equals("bye")) { + outputMessage = "Bye. Hope to see you again soon!"; + break; + } else { + tasks[Task.numberOfTasks] = new Task(inputText); + outputMessage = "added: " + inputText; } System.out.println("\t____________________________________________________________"); System.out.println("\t" + outputMessage); System.out.println("\t____________________________________________________________"); - if (exit) { - break; - } } - } - public static String getListInputs (String[] inputList, int inputCount){ - String listInputs = ""; - for (int i = 0; i < inputCount; i++) { - listInputs += String.format("%3d. ", (i+1)) + inputList[i] + "\n\t"; - } - return listInputs; - } - public static void addInput (String inputText, String[] inputList, int inputCount){ - inputList[inputCount] = inputText; - } - - } diff --git a/src/main/java/Task.java b/src/main/java/Task.java new file mode 100644 index 000000000..5630c53a0 --- /dev/null +++ b/src/main/java/Task.java @@ -0,0 +1,40 @@ +public class Task { + protected String description; + protected boolean isDone; + static int numberOfTasks = 0; + public Task (String description) { + this.description = description; + this.isDone = false; + numberOfTasks++; + } + + public Task (String description, boolean isDone) { + this(description); + this.isDone = isDone; + } + + public static String getListInputs (Task[] tasks){ + String listInputs = ""; + for (int i = 0; i < numberOfTasks; i++) { + listInputs += String.format("%3d. ", (i+1)) + tasks[i].toString() + "\n\t"; + } + return listInputs; + } + + public void markAsDone () { + this.isDone = true; + } + public void unmarkAsDone (){ + this.isDone = false; + } + public String getStatusIcon (){ + return this.isDone ? "X" : " "; + } + + public String toString () { + return "[" + this.getStatusIcon() + "]" + "\t" + this.description; + } + + + +} From 76d2e4c8d0fb08a1b126976b3e19d26d481e2cb8 Mon Sep 17 00:00:00 2001 From: kristianachwan Date: Sat, 28 Jan 2023 00:03:13 +0800 Subject: [PATCH 05/40] Follow coding standard and refactor repeated code --- src/main/java/Duke.java | 10 +++++++--- src/main/java/Task.java | 8 ++++---- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index b2ac9ab1e..7526fbafa 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -20,14 +20,14 @@ public static void main(String[] args) { while (true) { inputText = scanner.nextLine(); if (inputText.equals("list")) { - outputMessage = Task.getListInputs(tasks); + outputMessage = Task.getTasksList(tasks); } else if (inputText.startsWith("mark")) { - int taskIndex = Integer.parseInt(inputText.split(" ")[1]) - 1; + int taskIndex = getTaskIndexFromInput(inputText); tasks[taskIndex].markAsDone(); outputMessage = "Nice! I've marked this task as done: " + "\n\t\t" + tasks[taskIndex].toString(); } else if (inputText.startsWith("unmark")) { - int taskIndex = Integer.parseInt(inputText.split(" ")[1]) - 1; + int taskIndex = getTaskIndexFromInput(inputText); tasks[taskIndex].unmarkAsDone(); outputMessage = "Ok, I've marked this task as not done: " + "\n\t\t" + tasks[taskIndex].toString(); @@ -43,4 +43,8 @@ public static void main(String[] args) { System.out.println("\t____________________________________________________________"); } } + + public static int getTaskIndexFromInput (String inputText) { + return Integer.parseInt(inputText.split(" ")[1]) - 1; + } } diff --git a/src/main/java/Task.java b/src/main/java/Task.java index 5630c53a0..db274ff41 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -13,12 +13,12 @@ public Task (String description, boolean isDone) { this.isDone = isDone; } - public static String getListInputs (Task[] tasks){ - String listInputs = ""; + public static String getTasksList(Task[] tasks){ + String tasksList = ""; for (int i = 0; i < numberOfTasks; i++) { - listInputs += String.format("%3d. ", (i+1)) + tasks[i].toString() + "\n\t"; + tasksList += String.format("%3d. ", (i+1)) + tasks[i].toString() + "\n\t"; } - return listInputs; + return tasksList; } public void markAsDone () { From 1c8a1eb147ade445755f3b0eb7266d9c8b267e4a Mon Sep 17 00:00:00 2001 From: kristianachwan Date: Wed, 1 Feb 2023 10:12:29 +0800 Subject: [PATCH 06/40] Create ToDo, Deadline, Event entities --- src/main/java/Deadline.java | 15 +++++++++++++++ src/main/java/Event.java | 19 +++++++++++++++++++ src/main/java/Task.java | 4 ++-- src/main/java/ToDo.java | 8 ++++++++ 4 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 src/main/java/Deadline.java create mode 100644 src/main/java/Event.java create mode 100644 src/main/java/ToDo.java diff --git a/src/main/java/Deadline.java b/src/main/java/Deadline.java new file mode 100644 index 000000000..510d2a353 --- /dev/null +++ b/src/main/java/Deadline.java @@ -0,0 +1,15 @@ +public class Deadline extends Task{ + protected String deadlineBy; + public Deadline(String description, String deadlineBy){ + super(description); + this.deadlineBy = deadlineBy; + } + + @Override + public String toString() { + String deadlinePrefix = "[D]"; + String taskString = super.toString(); + String deadlinePostfix = "(" + "by: " + this.deadlineBy + ")"; + return deadlinePrefix + taskString; + } +} diff --git a/src/main/java/Event.java b/src/main/java/Event.java new file mode 100644 index 000000000..3ed55e666 --- /dev/null +++ b/src/main/java/Event.java @@ -0,0 +1,19 @@ +public class Event extends Task{ + protected String eventStart; + protected String eventEnd; + + public Event (String description, String eventStart, String eventEnd) { + super(description); + this.eventStart = eventStart; + this.eventEnd = eventEnd; + } + + @Override + public String toString () { + String deadlinePrefix = "[E]"; + String taskString = super.toString(); + String eventPostfix = "(" + "from: " + this.eventStart + "to: " + this.eventEnd + ")"; + return deadlinePrefix + taskString + eventPostfix; + } +} + diff --git a/src/main/java/Task.java b/src/main/java/Task.java index db274ff41..126f0ccd4 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -24,8 +24,8 @@ public static String getTasksList(Task[] tasks){ public void markAsDone () { this.isDone = true; } - public void unmarkAsDone (){ - this.isDone = false; + public void unmarkAsDone () { + this.isDone = false; } public String getStatusIcon (){ return this.isDone ? "X" : " "; diff --git a/src/main/java/ToDo.java b/src/main/java/ToDo.java new file mode 100644 index 000000000..faafb3258 --- /dev/null +++ b/src/main/java/ToDo.java @@ -0,0 +1,8 @@ +public class ToDo { + @Override + public String toString() { + String todoPrefix = "[T]"; + String taskString = super.toString(); + return todoPrefix + taskString; + } +} From 5d62adfdae1d6070be943da70a89b6046584a9fa Mon Sep 17 00:00:00 2001 From: kristianachwan Date: Wed, 1 Feb 2023 10:44:32 +0800 Subject: [PATCH 07/40] Incorporate adding todo, deadline, event entity --- src/main/java/Deadline.java | 2 +- src/main/java/Duke.java | 39 +++++++++++++++++++++++++++++++++---- src/main/java/Event.java | 2 +- src/main/java/ToDo.java | 5 ++++- 4 files changed, 41 insertions(+), 7 deletions(-) diff --git a/src/main/java/Deadline.java b/src/main/java/Deadline.java index 510d2a353..7641197cc 100644 --- a/src/main/java/Deadline.java +++ b/src/main/java/Deadline.java @@ -9,7 +9,7 @@ public Deadline(String description, String deadlineBy){ public String toString() { String deadlinePrefix = "[D]"; String taskString = super.toString(); - String deadlinePostfix = "(" + "by: " + this.deadlineBy + ")"; + String deadlinePostfix = " (" + "by: " + this.deadlineBy + ")"; return deadlinePrefix + taskString; } } diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 7526fbafa..a541d21c1 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -1,6 +1,9 @@ +import java.util.Arrays; import java.util.Scanner; public class Duke { + static Task[] tasks = new Task[100]; + static final String TASK_ADDED_PREFIX = "Got it. I've added this task:\n\t"; public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String logo = " ____ _ \n" @@ -14,7 +17,6 @@ public static void main(String[] args) { + "What I can do for you?\n" + "____________________________________________________________\n" ); - Task[] tasks = new Task[100]; String inputText; String outputMessage; while (true) { @@ -31,20 +33,49 @@ public static void main(String[] args) { tasks[taskIndex].unmarkAsDone(); outputMessage = "Ok, I've marked this task as not done: " + "\n\t\t" + tasks[taskIndex].toString(); + } else if (inputText.startsWith("task")) { + String taskDescription = inputText.split("/")[0].split("task")[1].trim(); + Task newTask = new Task(taskDescription); + tasks[Task.numberOfTasks - 1] = newTask; + outputMessage = TASK_ADDED_PREFIX + newTask.toString() + "\n\t" + + getTaskAddedPostfix(); + } else if (inputText.startsWith("todo")) { + String toDoDescription = inputText.split("/")[0].split("todo")[1].trim(); + Task newTodo = new ToDo(toDoDescription); + tasks[Task.numberOfTasks - 1] = newTodo; + outputMessage = TASK_ADDED_PREFIX + newTodo.toString() + "\n\t" + + getTaskAddedPostfix(); + } else if (inputText.startsWith("deadline")) { + String deadlineDescription = inputText.split("/")[0].split("deadline")[1].trim(); + String deadlineBy = inputText.split("/")[1].trim(); + Task newDeadline = new Deadline(deadlineDescription, deadlineBy); + tasks[Task.numberOfTasks - 1] = newDeadline; + outputMessage = TASK_ADDED_PREFIX + newDeadline.toString() + "\n\t" + + getTaskAddedPostfix(); + } else if (inputText.startsWith("event")) { + String eventDescription = inputText.split("/")[0].split("event")[1].trim(); + String eventStart = inputText.split("/")[1].trim(); + String eventEnd = inputText.split("/")[2].trim(); + Task newEvent = new Event(eventDescription, eventStart, eventEnd); + tasks[Task.numberOfTasks - 1] = newEvent; + outputMessage = TASK_ADDED_PREFIX + newEvent.toString() + "\n\t" + + getTaskAddedPostfix(); } else if (inputText.equals("bye")) { outputMessage = "Bye. Hope to see you again soon!"; break; } else { - tasks[Task.numberOfTasks] = new Task(inputText); - outputMessage = "added: " + inputText; + outputMessage = "Sorry, I don't understand what you said. Can you say it again?"; } System.out.println("\t____________________________________________________________"); System.out.println("\t" + outputMessage); System.out.println("\t____________________________________________________________"); } } - + public static String getTaskAddedPostfix () { + return "Now you have " + Task.numberOfTasks + " tasks in the list."; + } public static int getTaskIndexFromInput (String inputText) { return Integer.parseInt(inputText.split(" ")[1]) - 1; } + } diff --git a/src/main/java/Event.java b/src/main/java/Event.java index 3ed55e666..a65fa7893 100644 --- a/src/main/java/Event.java +++ b/src/main/java/Event.java @@ -12,7 +12,7 @@ public Event (String description, String eventStart, String eventEnd) { public String toString () { String deadlinePrefix = "[E]"; String taskString = super.toString(); - String eventPostfix = "(" + "from: " + this.eventStart + "to: " + this.eventEnd + ")"; + String eventPostfix = " (" + "from: " + this.eventStart + " to: " + this.eventEnd + ")"; return deadlinePrefix + taskString + eventPostfix; } } diff --git a/src/main/java/ToDo.java b/src/main/java/ToDo.java index faafb3258..c9c0df4e4 100644 --- a/src/main/java/ToDo.java +++ b/src/main/java/ToDo.java @@ -1,4 +1,7 @@ -public class ToDo { +public class ToDo extends Task{ + public ToDo (String description) { + super(description); + } @Override public String toString() { String todoPrefix = "[T]"; From 9423d8ae8bc553370a6ddb9b80243358964ea1ef Mon Sep 17 00:00:00 2001 From: kristianachwan Date: Wed, 1 Feb 2023 14:34:24 +0800 Subject: [PATCH 08/40] Fix formatting --- src/main/java/Duke.java | 4 ++-- src/main/java/Task.java | 6 +++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index a541d21c1..ace2def17 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -26,12 +26,12 @@ public static void main(String[] args) { } else if (inputText.startsWith("mark")) { int taskIndex = getTaskIndexFromInput(inputText); tasks[taskIndex].markAsDone(); - outputMessage = "Nice! I've marked this task as done: " + "\n\t\t" + outputMessage = "Nice! I've marked this task as done: " + "\n\t" + tasks[taskIndex].toString(); } else if (inputText.startsWith("unmark")) { int taskIndex = getTaskIndexFromInput(inputText); tasks[taskIndex].unmarkAsDone(); - outputMessage = "Ok, I've marked this task as not done: " + "\n\t\t" + outputMessage = "Ok, I've marked this task as not done: " + "\n\t" + tasks[taskIndex].toString(); } else if (inputText.startsWith("task")) { String taskDescription = inputText.split("/")[0].split("task")[1].trim(); diff --git a/src/main/java/Task.java b/src/main/java/Task.java index 126f0ccd4..aadc3da0b 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -16,7 +16,11 @@ public Task (String description, boolean isDone) { public static String getTasksList(Task[] tasks){ String tasksList = ""; for (int i = 0; i < numberOfTasks; i++) { - tasksList += String.format("%3d. ", (i+1)) + tasks[i].toString() + "\n\t"; + tasksList += String.format("%3d. ", (i+1)) + tasks[i].toString(); + if (i < numberOfTasks - 1) { + tasksList += "\n\t"; + } + } return tasksList; } From aa5f8b540b3ed4bc41f3f7b89db1f03909664c58 Mon Sep 17 00:00:00 2001 From: kristianachwan Date: Wed, 1 Feb 2023 14:52:35 +0800 Subject: [PATCH 09/40] Bug fix empty line + add UI testing --- text-ui-test/EXPECTED.TXT | 50 ++++++++++++++++++++++++++++++++++++--- text-ui-test/input.txt | 9 +++++++ 2 files changed, 56 insertions(+), 3 deletions(-) diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index 657e74f6e..17a5a2faa 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -1,7 +1,51 @@ -Hello from - ____ _ -| _ \ _ _| | _____ +____________________________________________________________ + ____ _ +| _ \ _ _| | _____ | | | | | | | |/ / _ \ | |_| | |_| | < __/ |____/ \__,_|_|\_\___| +Hello! I'm Duke! +What I can do for you? +____________________________________________________________ + ____________________________________________________________ + Got it. I've added this task: + [T][ ] borrow book + Now you have 1 tasks in the list. + ____________________________________________________________ + ____________________________________________________________ + Got it. I've added this task: + [D][ ] return book + Now you have 2 tasks in the list. + ____________________________________________________________ + ____________________________________________________________ + 1. [T][ ] borrow book + 2. [D][ ] return book + ____________________________________________________________ + ____________________________________________________________ + Got it. I've added this task: + [E][ ] project meeting (from: from Mon 2pm to: to 4pm) + Now you have 3 tasks in the list. + ____________________________________________________________ + ____________________________________________________________ + Nice! I've marked this task as done: + [T][X] borrow book + ____________________________________________________________ + ____________________________________________________________ + Nice! I've marked this task as done: + [E][X] project meeting (from: from Mon 2pm to: to 4pm) + ____________________________________________________________ + ____________________________________________________________ + 1. [T][X] borrow book + 2. [D][ ] return book + 3. [E][X] project meeting (from: from Mon 2pm to: to 4pm) + ____________________________________________________________ + ____________________________________________________________ + Ok, I've marked this task as not done: + [T][ ] borrow book + ____________________________________________________________ + ____________________________________________________________ + 1. [T][ ] borrow book + 2. [D][ ] return book + 3. [E][X] project meeting (from: from Mon 2pm to: to 4pm) + ____________________________________________________________ diff --git a/text-ui-test/input.txt b/text-ui-test/input.txt index e69de29bb..2ef3861e6 100644 --- a/text-ui-test/input.txt +++ b/text-ui-test/input.txt @@ -0,0 +1,9 @@ +todo borrow book +deadline return book /by Sunday +list +event project meeting /from Mon 2pm /to 4pm +mark 1 +mark 3 +list +unmark 1 +list \ No newline at end of file From 4fffedab0298e027b23393f438ac6dd8cc3c5dc1 Mon Sep 17 00:00:00 2001 From: kristianachwan Date: Wed, 1 Feb 2023 14:55:29 +0800 Subject: [PATCH 10/40] Change linebreak into the safer linearSeparator --- src/main/java/Duke.java | 32 ++++++++++++++++---------------- src/main/java/Task.java | 2 +- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index ace2def17..1e69d9115 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -3,19 +3,19 @@ public class Duke { static Task[] tasks = new Task[100]; - static final String TASK_ADDED_PREFIX = "Got it. I've added this task:\n\t"; + static final String TASK_ADDED_PREFIX = "Got it. I've added this task:" + System.lineSeparator() + "\t"; public static void main(String[] args) { Scanner scanner = new Scanner(System.in); - String logo = " ____ _ \n" - + "| _ \\ _ _| | _____ \n" - + "| | | | | | | |/ / _ \\\n" - + "| |_| | |_| | < __/\n" - + "|____/ \\__,_|_|\\_\\___|\n"; - System.out.println("____________________________________________________________\n" + String logo = " ____ _" + System.lineSeparator() + + "| _ \\ _ _| | _____" + System.lineSeparator() + + "| | | | | | | |/ / _ \\" + System.lineSeparator() + + "| |_| | |_| | < __/" + System.lineSeparator() + + "|____/ \\__,_|_|\\_\\___|" + System.lineSeparator(); + System.out.println("____________________________________________________________" + System.lineSeparator() + logo - + "Hello! I'm Duke!\n" - + "What I can do for you?\n" - + "____________________________________________________________\n" + + "Hello! I'm Duke!" + System.lineSeparator() + + "What I can do for you?" + System.lineSeparator() + + "____________________________________________________________" + System.lineSeparator() ); String inputText; String outputMessage; @@ -26,31 +26,31 @@ public static void main(String[] args) { } else if (inputText.startsWith("mark")) { int taskIndex = getTaskIndexFromInput(inputText); tasks[taskIndex].markAsDone(); - outputMessage = "Nice! I've marked this task as done: " + "\n\t" + outputMessage = "Nice! I've marked this task as done:" + System.lineSeparator() +"\t" + tasks[taskIndex].toString(); } else if (inputText.startsWith("unmark")) { int taskIndex = getTaskIndexFromInput(inputText); tasks[taskIndex].unmarkAsDone(); - outputMessage = "Ok, I've marked this task as not done: " + "\n\t" + outputMessage = "Ok, I've marked this task as not done:" + System.lineSeparator() + "\t" + tasks[taskIndex].toString(); } else if (inputText.startsWith("task")) { String taskDescription = inputText.split("/")[0].split("task")[1].trim(); Task newTask = new Task(taskDescription); tasks[Task.numberOfTasks - 1] = newTask; - outputMessage = TASK_ADDED_PREFIX + newTask.toString() + "\n\t" + outputMessage = TASK_ADDED_PREFIX + newTask.toString() + System.lineSeparator() + "\t" + getTaskAddedPostfix(); } else if (inputText.startsWith("todo")) { String toDoDescription = inputText.split("/")[0].split("todo")[1].trim(); Task newTodo = new ToDo(toDoDescription); tasks[Task.numberOfTasks - 1] = newTodo; - outputMessage = TASK_ADDED_PREFIX + newTodo.toString() + "\n\t" + outputMessage = TASK_ADDED_PREFIX + newTodo.toString() + System.lineSeparator() + "\t" + getTaskAddedPostfix(); } else if (inputText.startsWith("deadline")) { String deadlineDescription = inputText.split("/")[0].split("deadline")[1].trim(); String deadlineBy = inputText.split("/")[1].trim(); Task newDeadline = new Deadline(deadlineDescription, deadlineBy); tasks[Task.numberOfTasks - 1] = newDeadline; - outputMessage = TASK_ADDED_PREFIX + newDeadline.toString() + "\n\t" + outputMessage = TASK_ADDED_PREFIX + newDeadline.toString() + System.lineSeparator() + "\t" + getTaskAddedPostfix(); } else if (inputText.startsWith("event")) { String eventDescription = inputText.split("/")[0].split("event")[1].trim(); @@ -58,7 +58,7 @@ public static void main(String[] args) { String eventEnd = inputText.split("/")[2].trim(); Task newEvent = new Event(eventDescription, eventStart, eventEnd); tasks[Task.numberOfTasks - 1] = newEvent; - outputMessage = TASK_ADDED_PREFIX + newEvent.toString() + "\n\t" + outputMessage = TASK_ADDED_PREFIX + newEvent.toString() + System.lineSeparator() + "\t" + getTaskAddedPostfix(); } else if (inputText.equals("bye")) { outputMessage = "Bye. Hope to see you again soon!"; diff --git a/src/main/java/Task.java b/src/main/java/Task.java index aadc3da0b..050b427aa 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -18,7 +18,7 @@ public static String getTasksList(Task[] tasks){ for (int i = 0; i < numberOfTasks; i++) { tasksList += String.format("%3d. ", (i+1)) + tasks[i].toString(); if (i < numberOfTasks - 1) { - tasksList += "\n\t"; + tasksList += System.lineSeparator()+ "\t"; } } From 3cb44ea4f8c23b45e492762050b1a4e7a383a673 Mon Sep 17 00:00:00 2001 From: kristianachwan Date: Wed, 1 Feb 2023 15:08:12 +0800 Subject: [PATCH 11/40] Fix bug for adding deadline --- src/main/java/Duke.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 1e69d9115..db95ef41b 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -48,7 +48,7 @@ public static void main(String[] args) { } else if (inputText.startsWith("deadline")) { String deadlineDescription = inputText.split("/")[0].split("deadline")[1].trim(); String deadlineBy = inputText.split("/")[1].trim(); - Task newDeadline = new Deadline(deadlineDescription, deadlineBy); + Deadline newDeadline = new Deadline(deadlineDescription, deadlineBy); tasks[Task.numberOfTasks - 1] = newDeadline; outputMessage = TASK_ADDED_PREFIX + newDeadline.toString() + System.lineSeparator() + "\t" + getTaskAddedPostfix(); From 02cb628bd22dff469bcd7d9c8080f90e699f2b8f Mon Sep 17 00:00:00 2001 From: kristianachwan Date: Wed, 1 Feb 2023 15:19:57 +0800 Subject: [PATCH 12/40] Reformat code --- src/main/java/Deadline.java | 2 +- src/main/java/Task.java | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/java/Deadline.java b/src/main/java/Deadline.java index 7641197cc..aeac9a367 100644 --- a/src/main/java/Deadline.java +++ b/src/main/java/Deadline.java @@ -1,6 +1,6 @@ public class Deadline extends Task{ protected String deadlineBy; - public Deadline(String description, String deadlineBy){ + public Deadline(String description, String deadlineBy) { super(description); this.deadlineBy = deadlineBy; } diff --git a/src/main/java/Task.java b/src/main/java/Task.java index 050b427aa..072355682 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -25,9 +25,7 @@ public static String getTasksList(Task[] tasks){ return tasksList; } - public void markAsDone () { - this.isDone = true; - } + public void markAsDone () { this.isDone = true; } public void unmarkAsDone () { this.isDone = false; } From 6f74566d5b81cd0de7e4c15894f72db73d55bf74 Mon Sep 17 00:00:00 2001 From: kristianachwan Date: Wed, 1 Feb 2023 15:22:07 +0800 Subject: [PATCH 13/40] Reformat code (2) --- src/main/java/Task.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/Task.java b/src/main/java/Task.java index 072355682..050b427aa 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -25,7 +25,9 @@ public static String getTasksList(Task[] tasks){ return tasksList; } - public void markAsDone () { this.isDone = true; } + public void markAsDone () { + this.isDone = true; + } public void unmarkAsDone () { this.isDone = false; } From f9c599b376c89652cb02478557d14d61d4546c99 Mon Sep 17 00:00:00 2001 From: kristianachwan Date: Wed, 1 Feb 2023 20:44:34 +0800 Subject: [PATCH 14/40] Refactor using case statement --- src/main/java/Deadline.java | 3 +- src/main/java/Duke.java | 131 ++++++++++++++++++++---------------- src/main/java/Event.java | 6 +- src/main/java/ToDo.java | 5 +- 4 files changed, 80 insertions(+), 65 deletions(-) diff --git a/src/main/java/Deadline.java b/src/main/java/Deadline.java index aeac9a367..0e2aaa2cb 100644 --- a/src/main/java/Deadline.java +++ b/src/main/java/Deadline.java @@ -1,5 +1,6 @@ -public class Deadline extends Task{ +public class Deadline extends Task { protected String deadlineBy; + public Deadline(String description, String deadlineBy) { super(description); this.deadlineBy = deadlineBy; diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index db95ef41b..c61212756 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -4,77 +4,90 @@ public class Duke { static Task[] tasks = new Task[100]; static final String TASK_ADDED_PREFIX = "Got it. I've added this task:" + System.lineSeparator() + "\t"; + public static void main(String[] args) { Scanner scanner = new Scanner(System.in); - String logo = " ____ _" + System.lineSeparator() - + "| _ \\ _ _| | _____" + System.lineSeparator() - + "| | | | | | | |/ / _ \\" + System.lineSeparator() - + "| |_| | |_| | < __/" + System.lineSeparator() - + "|____/ \\__,_|_|\\_\\___|" + System.lineSeparator(); - System.out.println("____________________________________________________________" + System.lineSeparator() - + logo - + "Hello! I'm Duke!" + System.lineSeparator() - + "What I can do for you?" + System.lineSeparator() - + "____________________________________________________________" + System.lineSeparator() - ); - String inputText; + printDuke(); + String input; + String command; String outputMessage; while (true) { - inputText = scanner.nextLine(); - if (inputText.equals("list")) { - outputMessage = Task.getTasksList(tasks); - } else if (inputText.startsWith("mark")) { - int taskIndex = getTaskIndexFromInput(inputText); - tasks[taskIndex].markAsDone(); - outputMessage = "Nice! I've marked this task as done:" + System.lineSeparator() +"\t" - + tasks[taskIndex].toString(); - } else if (inputText.startsWith("unmark")) { - int taskIndex = getTaskIndexFromInput(inputText); - tasks[taskIndex].unmarkAsDone(); - outputMessage = "Ok, I've marked this task as not done:" + System.lineSeparator() + "\t" - + tasks[taskIndex].toString(); - } else if (inputText.startsWith("task")) { - String taskDescription = inputText.split("/")[0].split("task")[1].trim(); - Task newTask = new Task(taskDescription); - tasks[Task.numberOfTasks - 1] = newTask; - outputMessage = TASK_ADDED_PREFIX + newTask.toString() + System.lineSeparator() + "\t" - + getTaskAddedPostfix(); - } else if (inputText.startsWith("todo")) { - String toDoDescription = inputText.split("/")[0].split("todo")[1].trim(); - Task newTodo = new ToDo(toDoDescription); - tasks[Task.numberOfTasks - 1] = newTodo; - outputMessage = TASK_ADDED_PREFIX + newTodo.toString() + System.lineSeparator() + "\t" - + getTaskAddedPostfix(); - } else if (inputText.startsWith("deadline")) { - String deadlineDescription = inputText.split("/")[0].split("deadline")[1].trim(); - String deadlineBy = inputText.split("/")[1].trim(); - Deadline newDeadline = new Deadline(deadlineDescription, deadlineBy); - tasks[Task.numberOfTasks - 1] = newDeadline; - outputMessage = TASK_ADDED_PREFIX + newDeadline.toString() + System.lineSeparator() + "\t" - + getTaskAddedPostfix(); - } else if (inputText.startsWith("event")) { - String eventDescription = inputText.split("/")[0].split("event")[1].trim(); - String eventStart = inputText.split("/")[1].trim(); - String eventEnd = inputText.split("/")[2].trim(); - Task newEvent = new Event(eventDescription, eventStart, eventEnd); - tasks[Task.numberOfTasks - 1] = newEvent; - outputMessage = TASK_ADDED_PREFIX + newEvent.toString() + System.lineSeparator() + "\t" - + getTaskAddedPostfix(); - } else if (inputText.equals("bye")) { - outputMessage = "Bye. Hope to see you again soon!"; - break; - } else { - outputMessage = "Sorry, I don't understand what you said. Can you say it again?"; + input = scanner.nextLine(); + command = input.split(" ")[0]; + int taskIndex; + switch (command) { + case "list": + outputMessage = Task.getTasksList(tasks); + case "mark": + taskIndex = getTaskIndexFromInput(input); + tasks[taskIndex].markAsDone(); + outputMessage = "Nice! I've marked this task as done:" + System.lineSeparator() + "\t" + + tasks[taskIndex].toString(); + case "unmark": + taskIndex = getTaskIndexFromInput(input); + tasks[taskIndex].unmarkAsDone(); + outputMessage = "Ok, I've marked this task as not done:" + System.lineSeparator() + "\t" + + tasks[taskIndex].toString(); + case "task": + String taskDescription = input.split("/")[0].split("task")[1].trim(); + Task newTask = new Task(taskDescription); + tasks[Task.numberOfTasks - 1] = newTask; + outputMessage = TASK_ADDED_PREFIX + newTask.toString() + System.lineSeparator() + "\t" + + getTaskAddedPostfix(); + case "todo": + String toDoDescription = input.split("/")[0].split("todo")[1].trim(); + Task newTodo = new ToDo(toDoDescription); + tasks[Task.numberOfTasks - 1] = newTodo; + outputMessage = TASK_ADDED_PREFIX + newTodo.toString() + System.lineSeparator() + "\t" + + getTaskAddedPostfix(); + case "deadline": + String deadlineDescription = input.split("/")[0].split("deadline")[1].trim(); + String deadlineBy = input.split("/")[1].trim(); + Deadline newDeadline = new Deadline(deadlineDescription, deadlineBy); + tasks[Task.numberOfTasks - 1] = newDeadline; + outputMessage = TASK_ADDED_PREFIX + newDeadline.toString() + System.lineSeparator() + "\t" + + getTaskAddedPostfix(); + case "event": + String eventDescription = input.split("/")[0].split("event")[1].trim(); + String eventStart = input.split("/")[1].trim(); + String eventEnd = input.split("/")[2].trim(); + Task newEvent = new Event(eventDescription, eventStart, eventEnd); + tasks[Task.numberOfTasks - 1] = newEvent; + outputMessage = TASK_ADDED_PREFIX + newEvent.toString() + System.lineSeparator() + "\t" + + getTaskAddedPostfix(); + case "bye": + outputMessage = "Bye. Hope to see you again soon!"; + System.exit(0); + default: + outputMessage = "Sorry, I don't understand what you said. Can you say it again"; } + System.out.println("\t____________________________________________________________"); System.out.println("\t" + outputMessage); System.out.println("\t____________________________________________________________"); } + } - public static String getTaskAddedPostfix () { + + private static void printDuke() { + String logo = " ____ _" + System.lineSeparator() + + "| _ \\ _ _| | _____" + System.lineSeparator() + + "| | | | | | | |/ / _ \\" + System.lineSeparator() + + "| |_| | |_| | < __/" + System.lineSeparator() + + "|____/ \\__,_|_|\\_\\___|" + System.lineSeparator(); + System.out.println("____________________________________________________________" + System.lineSeparator() + + logo + + "Hello! I'm Duke!" + System.lineSeparator() + + "What I can do for you?" + System.lineSeparator() + + "____________________________________________________________" + System.lineSeparator() + ); + } + + public static String getTaskAddedPostfix() { return "Now you have " + Task.numberOfTasks + " tasks in the list."; } - public static int getTaskIndexFromInput (String inputText) { + + public static int getTaskIndexFromInput(String inputText) { return Integer.parseInt(inputText.split(" ")[1]) - 1; } diff --git a/src/main/java/Event.java b/src/main/java/Event.java index a65fa7893..2a557c1a9 100644 --- a/src/main/java/Event.java +++ b/src/main/java/Event.java @@ -1,15 +1,15 @@ -public class Event extends Task{ +public class Event extends Task { protected String eventStart; protected String eventEnd; - public Event (String description, String eventStart, String eventEnd) { + public Event(String description, String eventStart, String eventEnd) { super(description); this.eventStart = eventStart; this.eventEnd = eventEnd; } @Override - public String toString () { + public String toString() { String deadlinePrefix = "[E]"; String taskString = super.toString(); String eventPostfix = " (" + "from: " + this.eventStart + " to: " + this.eventEnd + ")"; diff --git a/src/main/java/ToDo.java b/src/main/java/ToDo.java index c9c0df4e4..a3bb291ac 100644 --- a/src/main/java/ToDo.java +++ b/src/main/java/ToDo.java @@ -1,7 +1,8 @@ -public class ToDo extends Task{ - public ToDo (String description) { +public class ToDo extends Task { + public ToDo(String description) { super(description); } + @Override public String toString() { String todoPrefix = "[T]"; From 37eb12a7e843dc9c1292ae9adbd6fa27b82950ef Mon Sep 17 00:00:00 2001 From: kristianachwan Date: Wed, 1 Feb 2023 20:51:07 +0800 Subject: [PATCH 15/40] Fix bug not adding break in case --- src/main/java/Duke.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index c61212756..1f613717c 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -18,28 +18,33 @@ public static void main(String[] args) { switch (command) { case "list": outputMessage = Task.getTasksList(tasks); + break; case "mark": taskIndex = getTaskIndexFromInput(input); tasks[taskIndex].markAsDone(); outputMessage = "Nice! I've marked this task as done:" + System.lineSeparator() + "\t" + tasks[taskIndex].toString(); + break; case "unmark": taskIndex = getTaskIndexFromInput(input); tasks[taskIndex].unmarkAsDone(); outputMessage = "Ok, I've marked this task as not done:" + System.lineSeparator() + "\t" + tasks[taskIndex].toString(); + break; case "task": String taskDescription = input.split("/")[0].split("task")[1].trim(); Task newTask = new Task(taskDescription); tasks[Task.numberOfTasks - 1] = newTask; outputMessage = TASK_ADDED_PREFIX + newTask.toString() + System.lineSeparator() + "\t" + getTaskAddedPostfix(); + break; case "todo": - String toDoDescription = input.split("/")[0].split("todo")[1].trim(); + String toDoDescription = input.split("todo")[1].trim(); Task newTodo = new ToDo(toDoDescription); tasks[Task.numberOfTasks - 1] = newTodo; outputMessage = TASK_ADDED_PREFIX + newTodo.toString() + System.lineSeparator() + "\t" + getTaskAddedPostfix(); + break; case "deadline": String deadlineDescription = input.split("/")[0].split("deadline")[1].trim(); String deadlineBy = input.split("/")[1].trim(); @@ -47,6 +52,7 @@ public static void main(String[] args) { tasks[Task.numberOfTasks - 1] = newDeadline; outputMessage = TASK_ADDED_PREFIX + newDeadline.toString() + System.lineSeparator() + "\t" + getTaskAddedPostfix(); + break; case "event": String eventDescription = input.split("/")[0].split("event")[1].trim(); String eventStart = input.split("/")[1].trim(); @@ -55,11 +61,13 @@ public static void main(String[] args) { tasks[Task.numberOfTasks - 1] = newEvent; outputMessage = TASK_ADDED_PREFIX + newEvent.toString() + System.lineSeparator() + "\t" + getTaskAddedPostfix(); + break; case "bye": outputMessage = "Bye. Hope to see you again soon!"; System.exit(0); default: outputMessage = "Sorry, I don't understand what you said. Can you say it again"; + break; } System.out.println("\t____________________________________________________________"); From 85f757fa4f216959674a004c02b1124dfd00d1f3 Mon Sep 17 00:00:00 2001 From: kristianachwan Date: Wed, 8 Feb 2023 10:26:05 +0800 Subject: [PATCH 16/40] Add parser to each entity --- src/main/java/Deadline.java | 17 +++++++++++++---- src/main/java/Duke.java | 15 ++++++--------- src/main/java/Event.java | 16 ++++++++++++---- src/main/java/Task.java | 16 ++++++++++++---- src/main/java/ToDo.java | 4 ++-- 5 files changed, 45 insertions(+), 23 deletions(-) diff --git a/src/main/java/Deadline.java b/src/main/java/Deadline.java index 0e2aaa2cb..183f6dc4b 100644 --- a/src/main/java/Deadline.java +++ b/src/main/java/Deadline.java @@ -1,9 +1,18 @@ public class Deadline extends Task { protected String deadlineBy; - public Deadline(String description, String deadlineBy) { - super(description); - this.deadlineBy = deadlineBy; + public static String[] parseCommand (String command){ + String[] descriptionArray = new String[2]; + String[] descriptionAndDeadline = command.split("deadline")[1].split("/"); + for (int i = 0; i < 2; i++) { + descriptionArray[i] = descriptionAndDeadline[i].trim(); + } + + return descriptionArray; + } + public Deadline(String[] descriptionArray) { + super(descriptionArray); + this.deadlineBy = descriptionArray[1]; } @Override @@ -11,6 +20,6 @@ public String toString() { String deadlinePrefix = "[D]"; String taskString = super.toString(); String deadlinePostfix = " (" + "by: " + this.deadlineBy + ")"; - return deadlinePrefix + taskString; + return deadlinePrefix + taskString + deadlinePostfix; } } diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 1f613717c..7f42c93a4 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -32,32 +32,29 @@ public static void main(String[] args) { + tasks[taskIndex].toString(); break; case "task": - String taskDescription = input.split("/")[0].split("task")[1].trim(); + String[] taskDescription = Task.parseCommand(input); Task newTask = new Task(taskDescription); tasks[Task.numberOfTasks - 1] = newTask; outputMessage = TASK_ADDED_PREFIX + newTask.toString() + System.lineSeparator() + "\t" + getTaskAddedPostfix(); break; case "todo": - String toDoDescription = input.split("todo")[1].trim(); + String[] toDoDescription = ToDo.parseCommand(input); Task newTodo = new ToDo(toDoDescription); tasks[Task.numberOfTasks - 1] = newTodo; outputMessage = TASK_ADDED_PREFIX + newTodo.toString() + System.lineSeparator() + "\t" + getTaskAddedPostfix(); break; case "deadline": - String deadlineDescription = input.split("/")[0].split("deadline")[1].trim(); - String deadlineBy = input.split("/")[1].trim(); - Deadline newDeadline = new Deadline(deadlineDescription, deadlineBy); + String[] deadlineDescription = Deadline.parseCommand(input); + Deadline newDeadline = new Deadline(deadlineDescription); tasks[Task.numberOfTasks - 1] = newDeadline; outputMessage = TASK_ADDED_PREFIX + newDeadline.toString() + System.lineSeparator() + "\t" + getTaskAddedPostfix(); break; case "event": - String eventDescription = input.split("/")[0].split("event")[1].trim(); - String eventStart = input.split("/")[1].trim(); - String eventEnd = input.split("/")[2].trim(); - Task newEvent = new Event(eventDescription, eventStart, eventEnd); + String[] eventDescription = Event.parseCommand(input); + Task newEvent = new Event(eventDescription); tasks[Task.numberOfTasks - 1] = newEvent; outputMessage = TASK_ADDED_PREFIX + newEvent.toString() + System.lineSeparator() + "\t" + getTaskAddedPostfix(); diff --git a/src/main/java/Event.java b/src/main/java/Event.java index 2a557c1a9..385d2be90 100644 --- a/src/main/java/Event.java +++ b/src/main/java/Event.java @@ -2,10 +2,18 @@ public class Event extends Task { protected String eventStart; protected String eventEnd; - public Event(String description, String eventStart, String eventEnd) { - super(description); - this.eventStart = eventStart; - this.eventEnd = eventEnd; + public static String[] parseCommand (String command){ + String[] descriptionArray = new String[3]; + String[] descriptionAndEventInfo = command.split("event")[1].split("/"); + for (int i = 0; i < 3; i++){ + descriptionArray[i] = descriptionAndEventInfo[i].trim(); + } + return descriptionArray; + } + public Event(String[] descriptionArray) { + super(descriptionArray); + this.eventStart = descriptionArray[1]; + this.eventEnd = descriptionArray[2]; } @Override diff --git a/src/main/java/Task.java b/src/main/java/Task.java index 050b427aa..abcde9d2e 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -1,15 +1,23 @@ +import java.util.Arrays; + public class Task { protected String description; protected boolean isDone; static int numberOfTasks = 0; - public Task (String description) { - this.description = description; + + public static String[] parseCommand (String command) { + String[] commandArray = command.split(" "); + return Arrays.copyOfRange(commandArray, 1, commandArray.length); + } + + public Task (String[] descriptionArray) { + this.description = descriptionArray[0]; this.isDone = false; numberOfTasks++; } - public Task (String description, boolean isDone) { - this(description); + public Task (String[] descriptionArray, boolean isDone) { + this(descriptionArray); this.isDone = isDone; } diff --git a/src/main/java/ToDo.java b/src/main/java/ToDo.java index a3bb291ac..7f62eaa45 100644 --- a/src/main/java/ToDo.java +++ b/src/main/java/ToDo.java @@ -1,6 +1,6 @@ public class ToDo extends Task { - public ToDo(String description) { - super(description); + public ToDo(String[] descriptionArray) { + super(descriptionArray); } @Override From 374ac57d0b5d543c2baadc2715c2072bdbeabe23 Mon Sep 17 00:00:00 2001 From: kristianachwan Date: Wed, 8 Feb 2023 13:32:54 +0800 Subject: [PATCH 17/40] Add exceptions and error handling --- src/main/java/Deadline.java | 6 +- src/main/java/Duke.java | 105 +++++++++++---------- src/main/java/DukeException.java | 19 ++++ src/main/java/Event.java | 5 +- src/main/java/InvalidCommandException.java | 11 +++ src/main/java/Task.java | 5 +- src/main/java/ToDo.java | 9 ++ 7 files changed, 106 insertions(+), 54 deletions(-) create mode 100644 src/main/java/DukeException.java create mode 100644 src/main/java/InvalidCommandException.java diff --git a/src/main/java/Deadline.java b/src/main/java/Deadline.java index 183f6dc4b..96b2554bc 100644 --- a/src/main/java/Deadline.java +++ b/src/main/java/Deadline.java @@ -1,13 +1,15 @@ public class Deadline extends Task { protected String deadlineBy; - public static String[] parseCommand (String command){ + public static String[] parseCommand (String command) throws InvalidCommandException { String[] descriptionArray = new String[2]; String[] descriptionAndDeadline = command.split("deadline")[1].split("/"); + if (descriptionAndDeadline.length < 2){ + throw new InvalidCommandException("Incomplete deadline description!"); + } for (int i = 0; i < 2; i++) { descriptionArray[i] = descriptionAndDeadline[i].trim(); } - return descriptionArray; } public Deadline(String[] descriptionArray) { diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 7f42c93a4..f5bea8564 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -15,58 +15,63 @@ public static void main(String[] args) { input = scanner.nextLine(); command = input.split(" ")[0]; int taskIndex; - switch (command) { - case "list": - outputMessage = Task.getTasksList(tasks); - break; - case "mark": - taskIndex = getTaskIndexFromInput(input); - tasks[taskIndex].markAsDone(); - outputMessage = "Nice! I've marked this task as done:" + System.lineSeparator() + "\t" - + tasks[taskIndex].toString(); - break; - case "unmark": - taskIndex = getTaskIndexFromInput(input); - tasks[taskIndex].unmarkAsDone(); - outputMessage = "Ok, I've marked this task as not done:" + System.lineSeparator() + "\t" - + tasks[taskIndex].toString(); - break; - case "task": - String[] taskDescription = Task.parseCommand(input); - Task newTask = new Task(taskDescription); - tasks[Task.numberOfTasks - 1] = newTask; - outputMessage = TASK_ADDED_PREFIX + newTask.toString() + System.lineSeparator() + "\t" - + getTaskAddedPostfix(); - break; - case "todo": - String[] toDoDescription = ToDo.parseCommand(input); - Task newTodo = new ToDo(toDoDescription); - tasks[Task.numberOfTasks - 1] = newTodo; - outputMessage = TASK_ADDED_PREFIX + newTodo.toString() + System.lineSeparator() + "\t" - + getTaskAddedPostfix(); - break; - case "deadline": - String[] deadlineDescription = Deadline.parseCommand(input); - Deadline newDeadline = new Deadline(deadlineDescription); - tasks[Task.numberOfTasks - 1] = newDeadline; - outputMessage = TASK_ADDED_PREFIX + newDeadline.toString() + System.lineSeparator() + "\t" - + getTaskAddedPostfix(); - break; - case "event": - String[] eventDescription = Event.parseCommand(input); - Task newEvent = new Event(eventDescription); - tasks[Task.numberOfTasks - 1] = newEvent; - outputMessage = TASK_ADDED_PREFIX + newEvent.toString() + System.lineSeparator() + "\t" - + getTaskAddedPostfix(); - break; - case "bye": - outputMessage = "Bye. Hope to see you again soon!"; - System.exit(0); - default: - outputMessage = "Sorry, I don't understand what you said. Can you say it again"; - break; + try { + switch (command) { + case "list": + outputMessage = Task.getTasksList(tasks); + break; + case "mark": + taskIndex = getTaskIndexFromInput(input); + tasks[taskIndex].markAsDone(); + outputMessage = "Nice! I've marked this task as done:" + System.lineSeparator() + "\t" + + tasks[taskIndex].toString(); + break; + case "unmark": + taskIndex = getTaskIndexFromInput(input); + tasks[taskIndex].unmarkAsDone(); + outputMessage = "Ok, I've marked this task as not done:" + System.lineSeparator() + "\t" + + tasks[taskIndex].toString(); + break; + case "task": + String[] taskDescription = Task.parseCommand(input); + Task newTask = new Task(taskDescription); + tasks[Task.numberOfTasks - 1] = newTask; + outputMessage = TASK_ADDED_PREFIX + newTask.toString() + System.lineSeparator() + "\t" + + getTaskAddedPostfix(); + break; + case "todo": + String[] toDoDescription = ToDo.parseCommand(input); + Task newTodo = new ToDo(toDoDescription); + tasks[Task.numberOfTasks - 1] = newTodo; + outputMessage = TASK_ADDED_PREFIX + newTodo.toString() + System.lineSeparator() + "\t" + + getTaskAddedPostfix(); + break; + case "deadline": + String[] deadlineDescription = Deadline.parseCommand(input); + Deadline newDeadline = new Deadline(deadlineDescription); + tasks[Task.numberOfTasks - 1] = newDeadline; + outputMessage = TASK_ADDED_PREFIX + newDeadline.toString() + System.lineSeparator() + "\t" + + getTaskAddedPostfix(); + break; + case "event": + String[] eventDescription = Event.parseCommand(input); + Task newEvent = new Event(eventDescription); + tasks[Task.numberOfTasks - 1] = newEvent; + outputMessage = TASK_ADDED_PREFIX + newEvent.toString() + System.lineSeparator() + "\t" + + getTaskAddedPostfix(); + break; + case "bye": + outputMessage = "Bye. Hope to see you again soon!"; + System.exit(0); + default: + throw new InvalidCommandException(); + } + } catch (InvalidCommandException e) { + outputMessage = e.getMessage(); } + + System.out.println("\t____________________________________________________________"); System.out.println("\t" + outputMessage); System.out.println("\t____________________________________________________________"); diff --git a/src/main/java/DukeException.java b/src/main/java/DukeException.java new file mode 100644 index 000000000..2269ab15d --- /dev/null +++ b/src/main/java/DukeException.java @@ -0,0 +1,19 @@ +import java.util.Arrays; + +public class DukeException extends Exception { + private static final String DUKE_PREFIX = "Duke Error: "; + + + public static String[] parseCommand (String command) throws InvalidCommandException{ + String[] commandArray = command.split(" "); + if (commandArray.length < 2){ + throw new InvalidCommandException("Description of cannot be empty!"); + } + return Arrays.copyOfRange(commandArray, 1, commandArray.length); + } + + public DukeException(String message) { + super(DUKE_PREFIX + message); + } + +} diff --git a/src/main/java/Event.java b/src/main/java/Event.java index 385d2be90..71a443bfb 100644 --- a/src/main/java/Event.java +++ b/src/main/java/Event.java @@ -2,9 +2,12 @@ public class Event extends Task { protected String eventStart; protected String eventEnd; - public static String[] parseCommand (String command){ + public static String[] parseCommand (String command) throws InvalidCommandException{ String[] descriptionArray = new String[3]; String[] descriptionAndEventInfo = command.split("event")[1].split("/"); + if (descriptionAndEventInfo.length < 3) { + throw new InvalidCommandException("Incomplete event description!"); + } for (int i = 0; i < 3; i++){ descriptionArray[i] = descriptionAndEventInfo[i].trim(); } diff --git a/src/main/java/InvalidCommandException.java b/src/main/java/InvalidCommandException.java new file mode 100644 index 000000000..f0e7edc3c --- /dev/null +++ b/src/main/java/InvalidCommandException.java @@ -0,0 +1,11 @@ +public class InvalidCommandException extends DukeException{ + private static final String DEFAULT_MESSAGE = "I'm sorry but I couldn't understand you :("; + + public InvalidCommandException(String message){ + super(message); + } + + public InvalidCommandException () { + super(DEFAULT_MESSAGE); + } +} diff --git a/src/main/java/Task.java b/src/main/java/Task.java index abcde9d2e..5539c94b5 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -5,8 +5,11 @@ public class Task { protected boolean isDone; static int numberOfTasks = 0; - public static String[] parseCommand (String command) { + public static String[] parseCommand (String command) throws InvalidCommandException{ String[] commandArray = command.split(" "); + if (commandArray.length < 2){ + throw new InvalidCommandException("Description of task cannot be empty!"); + } return Arrays.copyOfRange(commandArray, 1, commandArray.length); } diff --git a/src/main/java/ToDo.java b/src/main/java/ToDo.java index 7f62eaa45..fd2840fe1 100644 --- a/src/main/java/ToDo.java +++ b/src/main/java/ToDo.java @@ -1,8 +1,17 @@ +import java.util.Arrays; + public class ToDo extends Task { public ToDo(String[] descriptionArray) { super(descriptionArray); } + public static String[] parseCommand (String command) throws InvalidCommandException{ + String[] commandArray = command.split(" "); + if (commandArray.length < 2){ + throw new InvalidCommandException("Description of todo cannot be empty!"); + } + return Arrays.copyOfRange(commandArray, 1, commandArray.length); + } @Override public String toString() { String todoPrefix = "[T]"; From 3d199c2dea750d7973ce340639ba82a6defb3a9c Mon Sep 17 00:00:00 2001 From: kristianachwan Date: Wed, 8 Feb 2023 13:45:57 +0800 Subject: [PATCH 18/40] Organize into packages --- README.md | 4 ++-- src/main/java/{ => duke}/Duke.java | 8 ++++++-- src/main/java/{ => duke/exception}/DukeException.java | 4 +++- .../{ => duke/exception}/InvalidCommandException.java | 2 ++ src/main/java/{ => duke/model}/Deadline.java | 4 ++++ src/main/java/{ => duke/model}/Event.java | 6 +++++- src/main/java/{ => duke/model}/Task.java | 10 +++++++--- src/main/java/{ => duke/model}/ToDo.java | 6 +++++- text-ui-test/EXPECTED.TXT | 2 +- text-ui-test/runtest.bat | 2 +- 10 files changed, 36 insertions(+), 12 deletions(-) rename src/main/java/{ => duke}/Duke.java (96%) rename src/main/java/{ => duke/exception}/DukeException.java (84%) rename src/main/java/{ => duke/exception}/InvalidCommandException.java (92%) rename src/main/java/{ => duke/model}/Deadline.java (93%) rename src/main/java/{ => duke/model}/Event.java (91%) rename src/main/java/{ => duke/model}/Task.java (89%) rename src/main/java/{ => duke/model}/ToDo.java (87%) diff --git a/README.md b/README.md index 8715d4d91..0f2208ab6 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Duke project template +# duke.Duke project template This is a project template for a greenfield Java project. It's named after the Java mascot _Duke_. Given below are instructions on how to use it. @@ -13,7 +13,7 @@ Prerequisites: JDK 11, update Intellij to the most recent version. 1. If there are any further prompts, accept the defaults. 1. Configure the project to use **JDK 11** (not other versions) as explained in [here](https://www.jetbrains.com/help/idea/sdk.html#set-up-jdk).
In the same dialog, set the **Project language level** field to the `SDK default` option. -3. After that, locate the `src/main/java/Duke.java` file, right-click it, and choose `Run Duke.main()` (if the code editor is showing compile errors, try restarting the IDE). If the setup is correct, you should see something like the below as the output: +3. After that, locate the `src/main/java/duke.Duke.java` file, right-click it, and choose `Run duke.Duke.main()` (if the code editor is showing compile errors, try restarting the IDE). If the setup is correct, you should see something like the below as the output: ``` Hello from ____ _ diff --git a/src/main/java/Duke.java b/src/main/java/duke/Duke.java similarity index 96% rename from src/main/java/Duke.java rename to src/main/java/duke/Duke.java index f5bea8564..07bee7dec 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/duke/Duke.java @@ -1,4 +1,8 @@ -import java.util.Arrays; +package duke; + +import duke.exception.InvalidCommandException; +import duke.model.*; + import java.util.Scanner; public class Duke { @@ -87,7 +91,7 @@ private static void printDuke() { + "|____/ \\__,_|_|\\_\\___|" + System.lineSeparator(); System.out.println("____________________________________________________________" + System.lineSeparator() + logo - + "Hello! I'm Duke!" + System.lineSeparator() + + "Hello! I'm duke.Duke!" + System.lineSeparator() + "What I can do for you?" + System.lineSeparator() + "____________________________________________________________" + System.lineSeparator() ); diff --git a/src/main/java/DukeException.java b/src/main/java/duke/exception/DukeException.java similarity index 84% rename from src/main/java/DukeException.java rename to src/main/java/duke/exception/DukeException.java index 2269ab15d..337c8365e 100644 --- a/src/main/java/DukeException.java +++ b/src/main/java/duke/exception/DukeException.java @@ -1,7 +1,9 @@ +package duke.exception; + import java.util.Arrays; public class DukeException extends Exception { - private static final String DUKE_PREFIX = "Duke Error: "; + private static final String DUKE_PREFIX = "duke.Duke Error: "; public static String[] parseCommand (String command) throws InvalidCommandException{ diff --git a/src/main/java/InvalidCommandException.java b/src/main/java/duke/exception/InvalidCommandException.java similarity index 92% rename from src/main/java/InvalidCommandException.java rename to src/main/java/duke/exception/InvalidCommandException.java index f0e7edc3c..c1da52b8f 100644 --- a/src/main/java/InvalidCommandException.java +++ b/src/main/java/duke/exception/InvalidCommandException.java @@ -1,3 +1,5 @@ +package duke.exception; + public class InvalidCommandException extends DukeException{ private static final String DEFAULT_MESSAGE = "I'm sorry but I couldn't understand you :("; diff --git a/src/main/java/Deadline.java b/src/main/java/duke/model/Deadline.java similarity index 93% rename from src/main/java/Deadline.java rename to src/main/java/duke/model/Deadline.java index 96b2554bc..5190b929e 100644 --- a/src/main/java/Deadline.java +++ b/src/main/java/duke/model/Deadline.java @@ -1,3 +1,7 @@ +package duke.model; + +import duke.exception.InvalidCommandException; + public class Deadline extends Task { protected String deadlineBy; diff --git a/src/main/java/Event.java b/src/main/java/duke/model/Event.java similarity index 91% rename from src/main/java/Event.java rename to src/main/java/duke/model/Event.java index 71a443bfb..6cd9e0567 100644 --- a/src/main/java/Event.java +++ b/src/main/java/duke/model/Event.java @@ -1,8 +1,12 @@ +package duke.model; + +import duke.exception.InvalidCommandException; + public class Event extends Task { protected String eventStart; protected String eventEnd; - public static String[] parseCommand (String command) throws InvalidCommandException{ + public static String[] parseCommand (String command) throws InvalidCommandException { String[] descriptionArray = new String[3]; String[] descriptionAndEventInfo = command.split("event")[1].split("/"); if (descriptionAndEventInfo.length < 3) { diff --git a/src/main/java/Task.java b/src/main/java/duke/model/Task.java similarity index 89% rename from src/main/java/Task.java rename to src/main/java/duke/model/Task.java index 5539c94b5..ae2128d89 100644 --- a/src/main/java/Task.java +++ b/src/main/java/duke/model/Task.java @@ -1,11 +1,15 @@ +package duke.model; + +import duke.exception.InvalidCommandException; + import java.util.Arrays; public class Task { - protected String description; + public String description; protected boolean isDone; - static int numberOfTasks = 0; + public static int numberOfTasks = 0; - public static String[] parseCommand (String command) throws InvalidCommandException{ + public static String[] parseCommand (String command) throws InvalidCommandException { String[] commandArray = command.split(" "); if (commandArray.length < 2){ throw new InvalidCommandException("Description of task cannot be empty!"); diff --git a/src/main/java/ToDo.java b/src/main/java/duke/model/ToDo.java similarity index 87% rename from src/main/java/ToDo.java rename to src/main/java/duke/model/ToDo.java index fd2840fe1..9c504f54e 100644 --- a/src/main/java/ToDo.java +++ b/src/main/java/duke/model/ToDo.java @@ -1,3 +1,7 @@ +package duke.model; + +import duke.exception.InvalidCommandException; + import java.util.Arrays; public class ToDo extends Task { @@ -5,7 +9,7 @@ public ToDo(String[] descriptionArray) { super(descriptionArray); } - public static String[] parseCommand (String command) throws InvalidCommandException{ + public static String[] parseCommand (String command) throws InvalidCommandException { String[] commandArray = command.split(" "); if (commandArray.length < 2){ throw new InvalidCommandException("Description of todo cannot be empty!"); diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index 17a5a2faa..6e6648e6a 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -4,7 +4,7 @@ ____________________________________________________________ | | | | | | | |/ / _ \ | |_| | |_| | < __/ |____/ \__,_|_|\_\___| -Hello! I'm Duke! +Hello! I'm duke.Duke! What I can do for you? ____________________________________________________________ diff --git a/text-ui-test/runtest.bat b/text-ui-test/runtest.bat index 087374464..62752b881 100644 --- a/text-ui-test/runtest.bat +++ b/text-ui-test/runtest.bat @@ -15,7 +15,7 @@ IF ERRORLEVEL 1 ( REM no error here, errorlevel == 0 REM run the program, feed commands from input.txt file and redirect the output to the ACTUAL.TXT -java -classpath ..\bin Duke < input.txt > ACTUAL.TXT +java -classpath ..\bin duke.Duke < input.txt > ACTUAL.TXT REM compare the output to the expected output FC ACTUAL.TXT EXPECTED.TXT From 0f6fcc6999b1f24b1222bf1aa82f1dfc8a3a230b Mon Sep 17 00:00:00 2001 From: kristianachwan Date: Wed, 8 Feb 2023 14:47:40 +0800 Subject: [PATCH 19/40] Fix UI-testing --- text-ui-test/EXPECTED.TXT | 35 ++--------------------------------- text-ui-test/input.txt | 8 +++++++- text-ui-test/runtest.sh | 2 +- 3 files changed, 10 insertions(+), 35 deletions(-) diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index 6e6648e6a..8d54a3d00 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -4,13 +4,13 @@ ____________________________________________________________ | | | | | | | |/ / _ \ | |_| | |_| | < __/ |____/ \__,_|_|\_\___| -Hello! I'm duke.Duke! +Hello! I'm Duke! What I can do for you? ____________________________________________________________ ____________________________________________________________ Got it. I've added this task: - [T][ ] borrow book + [T][ ] borrow Now you have 1 tasks in the list. ____________________________________________________________ ____________________________________________________________ @@ -18,34 +18,3 @@ ____________________________________________________________ [D][ ] return book Now you have 2 tasks in the list. ____________________________________________________________ - ____________________________________________________________ - 1. [T][ ] borrow book - 2. [D][ ] return book - ____________________________________________________________ - ____________________________________________________________ - Got it. I've added this task: - [E][ ] project meeting (from: from Mon 2pm to: to 4pm) - Now you have 3 tasks in the list. - ____________________________________________________________ - ____________________________________________________________ - Nice! I've marked this task as done: - [T][X] borrow book - ____________________________________________________________ - ____________________________________________________________ - Nice! I've marked this task as done: - [E][X] project meeting (from: from Mon 2pm to: to 4pm) - ____________________________________________________________ - ____________________________________________________________ - 1. [T][X] borrow book - 2. [D][ ] return book - 3. [E][X] project meeting (from: from Mon 2pm to: to 4pm) - ____________________________________________________________ - ____________________________________________________________ - Ok, I've marked this task as not done: - [T][ ] borrow book - ____________________________________________________________ - ____________________________________________________________ - 1. [T][ ] borrow book - 2. [D][ ] return book - 3. [E][X] project meeting (from: from Mon 2pm to: to 4pm) - ____________________________________________________________ diff --git a/text-ui-test/input.txt b/text-ui-test/input.txt index 2ef3861e6..dd12e90af 100644 --- a/text-ui-test/input.txt +++ b/text-ui-test/input.txt @@ -1,9 +1,15 @@ todo borrow book deadline return book /by Sunday +todo +event /from mon +deadline +blah +test list event project meeting /from Mon 2pm /to 4pm mark 1 mark 3 list unmark 1 -list \ No newline at end of file +list +bye \ No newline at end of file diff --git a/text-ui-test/runtest.sh b/text-ui-test/runtest.sh index c9ec87003..fa884c694 100644 --- a/text-ui-test/runtest.sh +++ b/text-ui-test/runtest.sh @@ -13,7 +13,7 @@ then fi # compile the code into the bin folder, terminates if error occurred -if ! javac -cp ../src/main/java -Xlint:none -d ../bin ../src/main/java/*.java +if ! javac -cp ../src/main/java/duke -Xlint:none -d ../bin ../src/main/java/duke/**/*.java then echo "********** BUILD FAILURE **********" exit 1 From 2ca1e4082da5e22168858520791a710d37217011 Mon Sep 17 00:00:00 2001 From: kristianachwan Date: Wed, 8 Feb 2023 15:01:58 +0800 Subject: [PATCH 20/40] Improve variables naming --- src/main/java/duke/exception/DukeException.java | 2 +- src/main/java/duke/model/Deadline.java | 9 +++++---- src/main/java/duke/model/Event.java | 6 +++--- src/main/java/duke/model/Task.java | 6 +++--- 4 files changed, 12 insertions(+), 11 deletions(-) diff --git a/src/main/java/duke/exception/DukeException.java b/src/main/java/duke/exception/DukeException.java index 337c8365e..dce01113c 100644 --- a/src/main/java/duke/exception/DukeException.java +++ b/src/main/java/duke/exception/DukeException.java @@ -3,7 +3,7 @@ import java.util.Arrays; public class DukeException extends Exception { - private static final String DUKE_PREFIX = "duke.Duke Error: "; + private static final String DUKE_PREFIX = "Duke Error: "; public static String[] parseCommand (String command) throws InvalidCommandException{ diff --git a/src/main/java/duke/model/Deadline.java b/src/main/java/duke/model/Deadline.java index 5190b929e..1beb2606d 100644 --- a/src/main/java/duke/model/Deadline.java +++ b/src/main/java/duke/model/Deadline.java @@ -7,12 +7,13 @@ public class Deadline extends Task { public static String[] parseCommand (String command) throws InvalidCommandException { String[] descriptionArray = new String[2]; - String[] descriptionAndDeadline = command.split("deadline")[1].split("/"); - if (descriptionAndDeadline.length < 2){ - throw new InvalidCommandException("Incomplete deadline description!"); + String[] commandDescriptionArray = command.split("deadline"); + if (commandDescriptionArray.length < 2 || commandDescriptionArray[1].split("/").length < 2){ + throw new InvalidCommandException("Incomplete deadline description"); } + for (int i = 0; i < 2; i++) { - descriptionArray[i] = descriptionAndDeadline[i].trim(); + descriptionArray[i] = commandDescriptionArray[1].split("/")[i].trim(); } return descriptionArray; } diff --git a/src/main/java/duke/model/Event.java b/src/main/java/duke/model/Event.java index 6cd9e0567..c6a972f15 100644 --- a/src/main/java/duke/model/Event.java +++ b/src/main/java/duke/model/Event.java @@ -8,12 +8,12 @@ public class Event extends Task { public static String[] parseCommand (String command) throws InvalidCommandException { String[] descriptionArray = new String[3]; - String[] descriptionAndEventInfo = command.split("event")[1].split("/"); - if (descriptionAndEventInfo.length < 3) { + String[] commandDescriptionArray = command.split("event"); + if (commandDescriptionArray.length < 2 || commandDescriptionArray[1].split("/").length < 3){ throw new InvalidCommandException("Incomplete event description!"); } for (int i = 0; i < 3; i++){ - descriptionArray[i] = descriptionAndEventInfo[i].trim(); + descriptionArray[i] = commandDescriptionArray[1].split("/")[i].trim(); } return descriptionArray; } diff --git a/src/main/java/duke/model/Task.java b/src/main/java/duke/model/Task.java index ae2128d89..1dd2cba07 100644 --- a/src/main/java/duke/model/Task.java +++ b/src/main/java/duke/model/Task.java @@ -5,7 +5,7 @@ import java.util.Arrays; public class Task { - public String description; + public String taskName; protected boolean isDone; public static int numberOfTasks = 0; @@ -18,7 +18,7 @@ public static String[] parseCommand (String command) throws InvalidCommandExcept } public Task (String[] descriptionArray) { - this.description = descriptionArray[0]; + this.taskName = descriptionArray[0]; this.isDone = false; numberOfTasks++; } @@ -51,7 +51,7 @@ public String getStatusIcon (){ } public String toString () { - return "[" + this.getStatusIcon() + "]" + "\t" + this.description; + return "[" + this.getStatusIcon() + "]" + "\t" + this.taskName; } From 075e95fec01a1ec475922abced0420a5bfada665 Mon Sep 17 00:00:00 2001 From: kristianachwan Date: Tue, 14 Feb 2023 19:41:29 +0800 Subject: [PATCH 21/40] Adding command and payload model --- src/main/java/duke/model/Command.java | 2 ++ src/main/java/duke/model/Payload.java | 2 ++ 2 files changed, 4 insertions(+) create mode 100644 src/main/java/duke/model/Command.java create mode 100644 src/main/java/duke/model/Payload.java diff --git a/src/main/java/duke/model/Command.java b/src/main/java/duke/model/Command.java new file mode 100644 index 000000000..a1205b662 --- /dev/null +++ b/src/main/java/duke/model/Command.java @@ -0,0 +1,2 @@ +package duke.model;public class Command { +} diff --git a/src/main/java/duke/model/Payload.java b/src/main/java/duke/model/Payload.java new file mode 100644 index 000000000..223ef5c29 --- /dev/null +++ b/src/main/java/duke/model/Payload.java @@ -0,0 +1,2 @@ +package duke.model;public class Payload { +} From 967378fe98b2d0304e2880bbec085f3191eb6553 Mon Sep 17 00:00:00 2001 From: kristianachwan Date: Tue, 14 Feb 2023 19:46:24 +0800 Subject: [PATCH 22/40] Add unknown command --- src/main/java/duke/Duke.java | 20 ++++++++------------ src/main/java/duke/model/Command.java | 19 ++++++++++++++++++- src/main/java/duke/model/Deadline.java | 17 +++++------------ src/main/java/duke/model/Event.java | 16 ++++------------ src/main/java/duke/model/Payload.java | 12 +++++++++++- src/main/java/duke/model/Task.java | 11 +++-------- src/main/java/duke/model/ToDo.java | 9 +-------- 7 files changed, 50 insertions(+), 54 deletions(-) diff --git a/src/main/java/duke/Duke.java b/src/main/java/duke/Duke.java index 07bee7dec..73b5f7638 100644 --- a/src/main/java/duke/Duke.java +++ b/src/main/java/duke/Duke.java @@ -13,14 +13,14 @@ public static void main(String[] args) { Scanner scanner = new Scanner(System.in); printDuke(); String input; - String command; String outputMessage; while (true) { input = scanner.nextLine(); - command = input.split(" ")[0]; + Command command = new Command(input); + String[] payloadData = command.getPayload().getData(); int taskIndex; try { - switch (command) { + switch (command.getType()) { case "list": outputMessage = Task.getTasksList(tasks); break; @@ -37,29 +37,25 @@ public static void main(String[] args) { + tasks[taskIndex].toString(); break; case "task": - String[] taskDescription = Task.parseCommand(input); - Task newTask = new Task(taskDescription); + Task newTask = new Task(payloadData); tasks[Task.numberOfTasks - 1] = newTask; outputMessage = TASK_ADDED_PREFIX + newTask.toString() + System.lineSeparator() + "\t" + getTaskAddedPostfix(); break; case "todo": - String[] toDoDescription = ToDo.parseCommand(input); - Task newTodo = new ToDo(toDoDescription); + Task newTodo = new ToDo(payloadData); tasks[Task.numberOfTasks - 1] = newTodo; outputMessage = TASK_ADDED_PREFIX + newTodo.toString() + System.lineSeparator() + "\t" + getTaskAddedPostfix(); break; case "deadline": - String[] deadlineDescription = Deadline.parseCommand(input); - Deadline newDeadline = new Deadline(deadlineDescription); + Deadline newDeadline = new Deadline(payloadData); tasks[Task.numberOfTasks - 1] = newDeadline; outputMessage = TASK_ADDED_PREFIX + newDeadline.toString() + System.lineSeparator() + "\t" + getTaskAddedPostfix(); break; case "event": - String[] eventDescription = Event.parseCommand(input); - Task newEvent = new Event(eventDescription); + Task newEvent = new Event(payloadData); tasks[Task.numberOfTasks - 1] = newEvent; outputMessage = TASK_ADDED_PREFIX + newEvent.toString() + System.lineSeparator() + "\t" + getTaskAddedPostfix(); @@ -68,7 +64,7 @@ public static void main(String[] args) { outputMessage = "Bye. Hope to see you again soon!"; System.exit(0); default: - throw new InvalidCommandException(); + throw new InvalidCommandException("Command is unidentified... Sorry :("); } } catch (InvalidCommandException e) { outputMessage = e.getMessage(); diff --git a/src/main/java/duke/model/Command.java b/src/main/java/duke/model/Command.java index a1205b662..cb41303cb 100644 --- a/src/main/java/duke/model/Command.java +++ b/src/main/java/duke/model/Command.java @@ -1,2 +1,19 @@ -package duke.model;public class Command { +package duke.model; + +public class Command { + protected String type; + protected Payload payload; + public Command (String input){ + String[] commandArray = input.split(" "); + this.type = commandArray[0]; + String payloadString = input.split(this.type)[1]; + payload = new Payload(payloadString.split("/")); + } + + public String getType() { + return this.type; + } + public Payload getPayload() { + return this.payload; + } } diff --git a/src/main/java/duke/model/Deadline.java b/src/main/java/duke/model/Deadline.java index 1beb2606d..45a2a9d90 100644 --- a/src/main/java/duke/model/Deadline.java +++ b/src/main/java/duke/model/Deadline.java @@ -5,21 +5,14 @@ public class Deadline extends Task { protected String deadlineBy; - public static String[] parseCommand (String command) throws InvalidCommandException { - String[] descriptionArray = new String[2]; - String[] commandDescriptionArray = command.split("deadline"); - if (commandDescriptionArray.length < 2 || commandDescriptionArray[1].split("/").length < 2){ + public Deadline(String[] descriptionArray) throws InvalidCommandException { + super(descriptionArray); + if (descriptionArray.length < 2){ throw new InvalidCommandException("Incomplete deadline description"); } - - for (int i = 0; i < 2; i++) { - descriptionArray[i] = commandDescriptionArray[1].split("/")[i].trim(); - } - return descriptionArray; - } - public Deadline(String[] descriptionArray) { - super(descriptionArray); this.deadlineBy = descriptionArray[1]; + + } @Override diff --git a/src/main/java/duke/model/Event.java b/src/main/java/duke/model/Event.java index c6a972f15..90629369d 100644 --- a/src/main/java/duke/model/Event.java +++ b/src/main/java/duke/model/Event.java @@ -6,19 +6,11 @@ public class Event extends Task { protected String eventStart; protected String eventEnd; - public static String[] parseCommand (String command) throws InvalidCommandException { - String[] descriptionArray = new String[3]; - String[] commandDescriptionArray = command.split("event"); - if (commandDescriptionArray.length < 2 || commandDescriptionArray[1].split("/").length < 3){ - throw new InvalidCommandException("Incomplete event description!"); - } - for (int i = 0; i < 3; i++){ - descriptionArray[i] = commandDescriptionArray[1].split("/")[i].trim(); - } - return descriptionArray; - } - public Event(String[] descriptionArray) { + public Event(String[] descriptionArray) throws InvalidCommandException{ super(descriptionArray); + if (descriptionArray.length < 3){ + throw new InvalidCommandException(); + } this.eventStart = descriptionArray[1]; this.eventEnd = descriptionArray[2]; } diff --git a/src/main/java/duke/model/Payload.java b/src/main/java/duke/model/Payload.java index 223ef5c29..b37b6f1bc 100644 --- a/src/main/java/duke/model/Payload.java +++ b/src/main/java/duke/model/Payload.java @@ -1,2 +1,12 @@ -package duke.model;public class Payload { +package duke.model; + +public class Payload{ + protected String[] data; + public Payload (String[] data){ + this.data = data; + } + public String[] getData(){ + return data; + } + } diff --git a/src/main/java/duke/model/Task.java b/src/main/java/duke/model/Task.java index 1dd2cba07..c58d96571 100644 --- a/src/main/java/duke/model/Task.java +++ b/src/main/java/duke/model/Task.java @@ -9,21 +9,16 @@ public class Task { protected boolean isDone; public static int numberOfTasks = 0; - public static String[] parseCommand (String command) throws InvalidCommandException { - String[] commandArray = command.split(" "); - if (commandArray.length < 2){ + public Task (String[] descriptionArray) throws InvalidCommandException{ + if (descriptionArray.length < 1){ throw new InvalidCommandException("Description of task cannot be empty!"); } - return Arrays.copyOfRange(commandArray, 1, commandArray.length); - } - - public Task (String[] descriptionArray) { this.taskName = descriptionArray[0]; this.isDone = false; numberOfTasks++; } - public Task (String[] descriptionArray, boolean isDone) { + public Task (String[] descriptionArray, boolean isDone) throws InvalidCommandException { this(descriptionArray); this.isDone = isDone; } diff --git a/src/main/java/duke/model/ToDo.java b/src/main/java/duke/model/ToDo.java index 9c504f54e..b310e56d5 100644 --- a/src/main/java/duke/model/ToDo.java +++ b/src/main/java/duke/model/ToDo.java @@ -5,17 +5,10 @@ import java.util.Arrays; public class ToDo extends Task { - public ToDo(String[] descriptionArray) { + public ToDo(String[] descriptionArray) throws InvalidCommandException { super(descriptionArray); } - public static String[] parseCommand (String command) throws InvalidCommandException { - String[] commandArray = command.split(" "); - if (commandArray.length < 2){ - throw new InvalidCommandException("Description of todo cannot be empty!"); - } - return Arrays.copyOfRange(commandArray, 1, commandArray.length); - } @Override public String toString() { String todoPrefix = "[T]"; From 5838b805ab043fd795b579bb6ce150fd702187f3 Mon Sep 17 00:00:00 2001 From: kristianachwan Date: Tue, 14 Feb 2023 23:17:49 +0800 Subject: [PATCH 23/40] Improve code quality --- src/main/java/duke/Duke.java | 5 +---- src/main/java/duke/model/Deadline.java | 2 -- src/main/java/duke/model/Task.java | 1 - 3 files changed, 1 insertion(+), 7 deletions(-) diff --git a/src/main/java/duke/Duke.java b/src/main/java/duke/Duke.java index 73b5f7638..c76801bc1 100644 --- a/src/main/java/duke/Duke.java +++ b/src/main/java/duke/Duke.java @@ -6,8 +6,8 @@ import java.util.Scanner; public class Duke { - static Task[] tasks = new Task[100]; static final String TASK_ADDED_PREFIX = "Got it. I've added this task:" + System.lineSeparator() + "\t"; + static Task[] tasks = new Task[100]; public static void main(String[] args) { Scanner scanner = new Scanner(System.in); @@ -69,9 +69,6 @@ public static void main(String[] args) { } catch (InvalidCommandException e) { outputMessage = e.getMessage(); } - - - System.out.println("\t____________________________________________________________"); System.out.println("\t" + outputMessage); System.out.println("\t____________________________________________________________"); diff --git a/src/main/java/duke/model/Deadline.java b/src/main/java/duke/model/Deadline.java index 45a2a9d90..d49c1b97d 100644 --- a/src/main/java/duke/model/Deadline.java +++ b/src/main/java/duke/model/Deadline.java @@ -11,8 +11,6 @@ public Deadline(String[] descriptionArray) throws InvalidCommandException { throw new InvalidCommandException("Incomplete deadline description"); } this.deadlineBy = descriptionArray[1]; - - } @Override diff --git a/src/main/java/duke/model/Task.java b/src/main/java/duke/model/Task.java index c58d96571..ec8c04a20 100644 --- a/src/main/java/duke/model/Task.java +++ b/src/main/java/duke/model/Task.java @@ -30,7 +30,6 @@ public static String getTasksList(Task[] tasks){ if (i < numberOfTasks - 1) { tasksList += System.lineSeparator()+ "\t"; } - } return tasksList; } From 21cedfd26c5753a16a9d89608c0fa7ef6da05f05 Mon Sep 17 00:00:00 2001 From: kristianachwan Date: Tue, 14 Feb 2023 23:24:23 +0800 Subject: [PATCH 24/40] Implement ArrayList for storing tasks --- src/main/java/duke/Duke.java | 23 ++++++++++++----------- src/main/java/duke/model/Task.java | 29 +++++++++++++++-------------- 2 files changed, 27 insertions(+), 25 deletions(-) diff --git a/src/main/java/duke/Duke.java b/src/main/java/duke/Duke.java index c76801bc1..6d8cb1ac2 100644 --- a/src/main/java/duke/Duke.java +++ b/src/main/java/duke/Duke.java @@ -3,11 +3,12 @@ import duke.exception.InvalidCommandException; import duke.model.*; +import java.util.ArrayList; import java.util.Scanner; public class Duke { static final String TASK_ADDED_PREFIX = "Got it. I've added this task:" + System.lineSeparator() + "\t"; - static Task[] tasks = new Task[100]; + static ArrayList tasks = new ArrayList(); public static void main(String[] args) { Scanner scanner = new Scanner(System.in); @@ -25,38 +26,38 @@ public static void main(String[] args) { outputMessage = Task.getTasksList(tasks); break; case "mark": - taskIndex = getTaskIndexFromInput(input); - tasks[taskIndex].markAsDone(); + taskIndex = Integer.parseInt(command.getPayload().getData()[0]); + tasks.get(taskIndex).markAsDone(); outputMessage = "Nice! I've marked this task as done:" + System.lineSeparator() + "\t" - + tasks[taskIndex].toString(); + + tasks.get(taskIndex).toString(); break; case "unmark": - taskIndex = getTaskIndexFromInput(input); - tasks[taskIndex].unmarkAsDone(); + taskIndex = Integer.parseInt(command.getPayload().getData()[0]); + tasks.get(taskIndex).unmarkAsDone(); outputMessage = "Ok, I've marked this task as not done:" + System.lineSeparator() + "\t" - + tasks[taskIndex].toString(); + + tasks.get(taskIndex).toString(); break; case "task": Task newTask = new Task(payloadData); - tasks[Task.numberOfTasks - 1] = newTask; + tasks.add(newTask); outputMessage = TASK_ADDED_PREFIX + newTask.toString() + System.lineSeparator() + "\t" + getTaskAddedPostfix(); break; case "todo": Task newTodo = new ToDo(payloadData); - tasks[Task.numberOfTasks - 1] = newTodo; + tasks.add(newTodo); outputMessage = TASK_ADDED_PREFIX + newTodo.toString() + System.lineSeparator() + "\t" + getTaskAddedPostfix(); break; case "deadline": Deadline newDeadline = new Deadline(payloadData); - tasks[Task.numberOfTasks - 1] = newDeadline; + tasks.add(newDeadline); outputMessage = TASK_ADDED_PREFIX + newDeadline.toString() + System.lineSeparator() + "\t" + getTaskAddedPostfix(); break; case "event": Task newEvent = new Event(payloadData); - tasks[Task.numberOfTasks - 1] = newEvent; + tasks.add(newEvent); outputMessage = TASK_ADDED_PREFIX + newEvent.toString() + System.lineSeparator() + "\t" + getTaskAddedPostfix(); break; diff --git a/src/main/java/duke/model/Task.java b/src/main/java/duke/model/Task.java index ec8c04a20..d35392297 100644 --- a/src/main/java/duke/model/Task.java +++ b/src/main/java/duke/model/Task.java @@ -2,15 +2,15 @@ import duke.exception.InvalidCommandException; -import java.util.Arrays; +import java.util.ArrayList; public class Task { + public static int numberOfTasks = 0; public String taskName; protected boolean isDone; - public static int numberOfTasks = 0; - public Task (String[] descriptionArray) throws InvalidCommandException{ - if (descriptionArray.length < 1){ + public Task(String[] descriptionArray) throws InvalidCommandException { + if (descriptionArray.length < 1) { throw new InvalidCommandException("Description of task cannot be empty!"); } this.taskName = descriptionArray[0]; @@ -18,36 +18,37 @@ public Task (String[] descriptionArray) throws InvalidCommandException{ numberOfTasks++; } - public Task (String[] descriptionArray, boolean isDone) throws InvalidCommandException { + public Task(String[] descriptionArray, boolean isDone) throws InvalidCommandException { this(descriptionArray); this.isDone = isDone; } - public static String getTasksList(Task[] tasks){ + public static String getTasksList(ArrayList tasks) { String tasksList = ""; for (int i = 0; i < numberOfTasks; i++) { - tasksList += String.format("%3d. ", (i+1)) + tasks[i].toString(); + tasksList += String.format("%3d. ", (i + 1)) + tasks.get(i).toString(); if (i < numberOfTasks - 1) { - tasksList += System.lineSeparator()+ "\t"; + tasksList += System.lineSeparator() + "\t"; } } return tasksList; } - public void markAsDone () { + public void markAsDone() { this.isDone = true; } - public void unmarkAsDone () { - this.isDone = false; + + public void unmarkAsDone() { + this.isDone = false; } - public String getStatusIcon (){ + + public String getStatusIcon() { return this.isDone ? "X" : " "; } - public String toString () { + public String toString() { return "[" + this.getStatusIcon() + "]" + "\t" + this.taskName; } - } From ffc1076af8c14d456d9f55cb4a9a39ef1e75812e Mon Sep 17 00:00:00 2001 From: kristianachwan Date: Tue, 14 Feb 2023 23:35:59 +0800 Subject: [PATCH 25/40] Extract methods refactoring --- src/main/java/duke/Duke.java | 104 +++++++++++++++++++++-------- src/main/java/duke/model/Task.java | 12 ---- 2 files changed, 75 insertions(+), 41 deletions(-) diff --git a/src/main/java/duke/Duke.java b/src/main/java/duke/Duke.java index 6d8cb1ac2..4c9af114e 100644 --- a/src/main/java/duke/Duke.java +++ b/src/main/java/duke/Duke.java @@ -19,47 +19,28 @@ public static void main(String[] args) { input = scanner.nextLine(); Command command = new Command(input); String[] payloadData = command.getPayload().getData(); - int taskIndex; try { switch (command.getType()) { case "list": - outputMessage = Task.getTasksList(tasks); + outputMessage = getTasksList(); break; case "mark": - taskIndex = Integer.parseInt(command.getPayload().getData()[0]); - tasks.get(taskIndex).markAsDone(); - outputMessage = "Nice! I've marked this task as done:" + System.lineSeparator() + "\t" - + tasks.get(taskIndex).toString(); + outputMessage = handleMark(command); break; case "unmark": - taskIndex = Integer.parseInt(command.getPayload().getData()[0]); - tasks.get(taskIndex).unmarkAsDone(); - outputMessage = "Ok, I've marked this task as not done:" + System.lineSeparator() + "\t" - + tasks.get(taskIndex).toString(); + outputMessage = handleUnmark(command); break; case "task": - Task newTask = new Task(payloadData); - tasks.add(newTask); - outputMessage = TASK_ADDED_PREFIX + newTask.toString() + System.lineSeparator() + "\t" - + getTaskAddedPostfix(); + outputMessage = handleAddTask(payloadData); break; case "todo": - Task newTodo = new ToDo(payloadData); - tasks.add(newTodo); - outputMessage = TASK_ADDED_PREFIX + newTodo.toString() + System.lineSeparator() + "\t" - + getTaskAddedPostfix(); + outputMessage = handleAddTodo(payloadData); break; case "deadline": - Deadline newDeadline = new Deadline(payloadData); - tasks.add(newDeadline); - outputMessage = TASK_ADDED_PREFIX + newDeadline.toString() + System.lineSeparator() + "\t" - + getTaskAddedPostfix(); + outputMessage = handleAddDeadline(payloadData); break; case "event": - Task newEvent = new Event(payloadData); - tasks.add(newEvent); - outputMessage = TASK_ADDED_PREFIX + newEvent.toString() + System.lineSeparator() + "\t" - + getTaskAddedPostfix(); + outputMessage = handleAddEvent(payloadData); break; case "bye": outputMessage = "Bye. Hope to see you again soon!"; @@ -77,7 +58,64 @@ public static void main(String[] args) { } - private static void printDuke() { + + public static String handleAddEvent(String[] payloadData) throws InvalidCommandException { + String outputMessage; + Task newEvent = new Event(payloadData); + tasks.add(newEvent); + outputMessage = TASK_ADDED_PREFIX + newEvent.toString() + System.lineSeparator() + "\t" + + getTaskAddedPostfix(); + return outputMessage; + } + + public static String handleAddDeadline(String[] payloadData) throws InvalidCommandException { + String outputMessage; + Deadline newDeadline = new Deadline(payloadData); + tasks.add(newDeadline); + outputMessage = TASK_ADDED_PREFIX + newDeadline.toString() + System.lineSeparator() + "\t" + + getTaskAddedPostfix(); + return outputMessage; + } + + public static String handleAddTodo(String[] payloadData) throws InvalidCommandException { + String outputMessage; + Task newTodo = new ToDo(payloadData); + tasks.add(newTodo); + outputMessage = TASK_ADDED_PREFIX + newTodo.toString() + System.lineSeparator() + "\t" + + getTaskAddedPostfix(); + return outputMessage; + } + + public static String handleAddTask(String[] payloadData) throws InvalidCommandException { + String outputMessage; + Task newTask = new Task(payloadData); + tasks.add(newTask); + outputMessage = TASK_ADDED_PREFIX + newTask.toString() + System.lineSeparator() + "\t" + + getTaskAddedPostfix(); + return outputMessage; + } + + public static String handleMark(Command command) { + int taskIndex; + String outputMessage; + taskIndex = Integer.parseInt(command.getPayload().getData()[0]); + tasks.get(taskIndex).markAsDone(); + outputMessage = "Nice! I've marked this task as done:" + System.lineSeparator() + "\t" + + tasks.get(taskIndex).toString(); + return outputMessage; + } + + public static String handleUnmark(Command command) { + String outputMessage; + int taskIndex; + taskIndex = Integer.parseInt(command.getPayload().getData()[0]); + tasks.get(taskIndex).unmarkAsDone(); + outputMessage = "Ok, I've marked this task as not done:" + System.lineSeparator() + "\t" + + tasks.get(taskIndex).toString(); + return outputMessage; + } + + public static void printDuke() { String logo = " ____ _" + System.lineSeparator() + "| _ \\ _ _| | _____" + System.lineSeparator() + "| | | | | | | |/ / _ \\" + System.lineSeparator() @@ -95,8 +133,16 @@ public static String getTaskAddedPostfix() { return "Now you have " + Task.numberOfTasks + " tasks in the list."; } - public static int getTaskIndexFromInput(String inputText) { - return Integer.parseInt(inputText.split(" ")[1]) - 1; + public static String getTasksList() { + String tasksList = ""; + int numberOfTasks = tasks.size(); + for (int i = 0; i < numberOfTasks; i++) { + tasksList += String.format("%3d. ", (i + 1)) + tasks.get(i).toString(); + if (i < numberOfTasks - 1) { + tasksList += System.lineSeparator() + "\t"; + } + } + return tasksList; } } diff --git a/src/main/java/duke/model/Task.java b/src/main/java/duke/model/Task.java index d35392297..57e83224b 100644 --- a/src/main/java/duke/model/Task.java +++ b/src/main/java/duke/model/Task.java @@ -2,8 +2,6 @@ import duke.exception.InvalidCommandException; -import java.util.ArrayList; - public class Task { public static int numberOfTasks = 0; public String taskName; @@ -23,16 +21,6 @@ public Task(String[] descriptionArray, boolean isDone) throws InvalidCommandExce this.isDone = isDone; } - public static String getTasksList(ArrayList tasks) { - String tasksList = ""; - for (int i = 0; i < numberOfTasks; i++) { - tasksList += String.format("%3d. ", (i + 1)) + tasks.get(i).toString(); - if (i < numberOfTasks - 1) { - tasksList += System.lineSeparator() + "\t"; - } - } - return tasksList; - } public void markAsDone() { this.isDone = true; From 5f38dce0b4ab73f7a8a7d18fcb3f2edd1b28d688 Mon Sep 17 00:00:00 2001 From: kristianachwan Date: Wed, 15 Feb 2023 01:05:53 +0800 Subject: [PATCH 26/40] Add delete task feature --- src/main/java/duke/Duke.java | 41 ++++++++++++++++++-------- src/main/java/duke/model/Command.java | 22 +++++++++++--- src/main/java/duke/model/Deadline.java | 6 ++-- src/main/java/duke/model/Event.java | 9 +++--- src/main/java/duke/model/Payload.java | 12 ++++++-- src/main/java/duke/model/Task.java | 7 +++-- src/main/java/duke/model/ToDo.java | 8 +++-- text-ui-test/EXPECTED.TXT | 20 ------------- text-ui-test/input.txt | 2 ++ text-ui-test/runtest.bat | 21 ------------- 10 files changed, 74 insertions(+), 74 deletions(-) delete mode 100644 text-ui-test/runtest.bat diff --git a/src/main/java/duke/Duke.java b/src/main/java/duke/Duke.java index 4c9af114e..50760fecf 100644 --- a/src/main/java/duke/Duke.java +++ b/src/main/java/duke/Duke.java @@ -8,6 +8,7 @@ public class Duke { static final String TASK_ADDED_PREFIX = "Got it. I've added this task:" + System.lineSeparator() + "\t"; + static final String TASK_REMOVED_PREFIX = "Noted! I've removed this task" + System.lineSeparator() + "\t"; static ArrayList tasks = new ArrayList(); public static void main(String[] args) { @@ -25,10 +26,10 @@ public static void main(String[] args) { outputMessage = getTasksList(); break; case "mark": - outputMessage = handleMark(command); + outputMessage = handleMarkTask(command); break; case "unmark": - outputMessage = handleUnmark(command); + outputMessage = handleUnmarkTask(command); break; case "task": outputMessage = handleAddTask(payloadData); @@ -42,11 +43,14 @@ public static void main(String[] args) { case "event": outputMessage = handleAddEvent(payloadData); break; + case "delete": + outputMessage = handleDeleteTask(payloadData); + break; case "bye": outputMessage = "Bye. Hope to see you again soon!"; System.exit(0); default: - throw new InvalidCommandException("Command is unidentified... Sorry :("); + throw new InvalidCommandException(); } } catch (InvalidCommandException e) { outputMessage = e.getMessage(); @@ -58,13 +62,21 @@ public static void main(String[] args) { } + public static String handleDeleteTask(String[] payloadData) throws InvalidCommandException { + String outputMessage; + int removedIndex = Integer.parseInt(payloadData[0]); + Task removedTask = tasks.get(removedIndex - 1); + tasks.remove(removedIndex - 1); + outputMessage = TASK_REMOVED_PREFIX + removedTask.toString() + System.lineSeparator() + "\t" + getTasksInformation(); + return outputMessage; + } public static String handleAddEvent(String[] payloadData) throws InvalidCommandException { String outputMessage; Task newEvent = new Event(payloadData); tasks.add(newEvent); outputMessage = TASK_ADDED_PREFIX + newEvent.toString() + System.lineSeparator() + "\t" - + getTaskAddedPostfix(); + + getTasksInformation(); return outputMessage; } @@ -73,7 +85,7 @@ public static String handleAddDeadline(String[] payloadData) throws InvalidComma Deadline newDeadline = new Deadline(payloadData); tasks.add(newDeadline); outputMessage = TASK_ADDED_PREFIX + newDeadline.toString() + System.lineSeparator() + "\t" - + getTaskAddedPostfix(); + + getTasksInformation(); return outputMessage; } @@ -82,7 +94,7 @@ public static String handleAddTodo(String[] payloadData) throws InvalidCommandEx Task newTodo = new ToDo(payloadData); tasks.add(newTodo); outputMessage = TASK_ADDED_PREFIX + newTodo.toString() + System.lineSeparator() + "\t" - + getTaskAddedPostfix(); + + getTasksInformation(); return outputMessage; } @@ -91,24 +103,24 @@ public static String handleAddTask(String[] payloadData) throws InvalidCommandEx Task newTask = new Task(payloadData); tasks.add(newTask); outputMessage = TASK_ADDED_PREFIX + newTask.toString() + System.lineSeparator() + "\t" - + getTaskAddedPostfix(); + + getTasksInformation(); return outputMessage; } - public static String handleMark(Command command) { + public static String handleMarkTask(Command command) { int taskIndex; String outputMessage; - taskIndex = Integer.parseInt(command.getPayload().getData()[0]); + taskIndex = Integer.parseInt(command.getPayload().getData()[0]) - 1; tasks.get(taskIndex).markAsDone(); outputMessage = "Nice! I've marked this task as done:" + System.lineSeparator() + "\t" + tasks.get(taskIndex).toString(); return outputMessage; } - public static String handleUnmark(Command command) { + public static String handleUnmarkTask(Command command) { String outputMessage; int taskIndex; - taskIndex = Integer.parseInt(command.getPayload().getData()[0]); + taskIndex = Integer.parseInt(command.getPayload().getData()[0]) - 1; tasks.get(taskIndex).unmarkAsDone(); outputMessage = "Ok, I've marked this task as not done:" + System.lineSeparator() + "\t" + tasks.get(taskIndex).toString(); @@ -129,11 +141,14 @@ public static void printDuke() { ); } - public static String getTaskAddedPostfix() { - return "Now you have " + Task.numberOfTasks + " tasks in the list."; + public static String getTasksInformation() { + return "Now you have " + tasks.size() + " tasks in the list."; } public static String getTasksList() { + if (tasks.size() == 0) { + return "Tasks is empty..."; + } String tasksList = ""; int numberOfTasks = tasks.size(); for (int i = 0; i < numberOfTasks; i++) { diff --git a/src/main/java/duke/model/Command.java b/src/main/java/duke/model/Command.java index cb41303cb..8b6bf9586 100644 --- a/src/main/java/duke/model/Command.java +++ b/src/main/java/duke/model/Command.java @@ -3,17 +3,31 @@ public class Command { protected String type; protected Payload payload; - public Command (String input){ + + public Command(String input) { String[] commandArray = input.split(" "); - this.type = commandArray[0]; - String payloadString = input.split(this.type)[1]; - payload = new Payload(payloadString.split("/")); + this.type = commandArray[0].trim(); + String[] payloadStringArray = input.split(this.type); + if (payloadStringArray.length > 1) { + payload = new Payload(trimStringArray(payloadStringArray[1].split("/"))); + } else { + payload = new Payload(); + } } public String getType() { return this.type; } + public Payload getPayload() { return this.payload; } + + public String[] trimStringArray(String[] stringArray) { + String[] trimmedStringArray = new String[stringArray.length]; + for (int i = 0; i < stringArray.length; i++) { + trimmedStringArray[i] = stringArray[i].trim(); + } + return trimmedStringArray; + } } diff --git a/src/main/java/duke/model/Deadline.java b/src/main/java/duke/model/Deadline.java index d49c1b97d..bc9045fdb 100644 --- a/src/main/java/duke/model/Deadline.java +++ b/src/main/java/duke/model/Deadline.java @@ -6,10 +6,10 @@ public class Deadline extends Task { protected String deadlineBy; public Deadline(String[] descriptionArray) throws InvalidCommandException { - super(descriptionArray); - if (descriptionArray.length < 2){ - throw new InvalidCommandException("Incomplete deadline description"); + if (descriptionArray.length < 2) { + throw new InvalidCommandException("Incomplete deadline description!"); } + this.taskName = descriptionArray[0]; this.deadlineBy = descriptionArray[1]; } diff --git a/src/main/java/duke/model/Event.java b/src/main/java/duke/model/Event.java index 90629369d..7aa7136ac 100644 --- a/src/main/java/duke/model/Event.java +++ b/src/main/java/duke/model/Event.java @@ -6,11 +6,12 @@ public class Event extends Task { protected String eventStart; protected String eventEnd; - public Event(String[] descriptionArray) throws InvalidCommandException{ - super(descriptionArray); - if (descriptionArray.length < 3){ - throw new InvalidCommandException(); + public Event(String[] descriptionArray) throws InvalidCommandException { + if (descriptionArray.length < 3) { + throw new InvalidCommandException("Incomplete description of event!"); } + System.out.println("test"); + this.taskName = descriptionArray[0]; this.eventStart = descriptionArray[1]; this.eventEnd = descriptionArray[2]; } diff --git a/src/main/java/duke/model/Payload.java b/src/main/java/duke/model/Payload.java index b37b6f1bc..b5a880546 100644 --- a/src/main/java/duke/model/Payload.java +++ b/src/main/java/duke/model/Payload.java @@ -1,11 +1,17 @@ package duke.model; -public class Payload{ +public class Payload { protected String[] data; - public Payload (String[] data){ + + public Payload() { + this.data = new String[0]; + } + + public Payload(String[] data) { this.data = data; } - public String[] getData(){ + + public String[] getData() { return data; } diff --git a/src/main/java/duke/model/Task.java b/src/main/java/duke/model/Task.java index 57e83224b..df6dbc54e 100644 --- a/src/main/java/duke/model/Task.java +++ b/src/main/java/duke/model/Task.java @@ -3,17 +3,18 @@ import duke.exception.InvalidCommandException; public class Task { - public static int numberOfTasks = 0; - public String taskName; + protected String taskName; protected boolean isDone; + public Task() { + } + public Task(String[] descriptionArray) throws InvalidCommandException { if (descriptionArray.length < 1) { throw new InvalidCommandException("Description of task cannot be empty!"); } this.taskName = descriptionArray[0]; this.isDone = false; - numberOfTasks++; } public Task(String[] descriptionArray, boolean isDone) throws InvalidCommandException { diff --git a/src/main/java/duke/model/ToDo.java b/src/main/java/duke/model/ToDo.java index b310e56d5..0881b87d7 100644 --- a/src/main/java/duke/model/ToDo.java +++ b/src/main/java/duke/model/ToDo.java @@ -2,11 +2,13 @@ import duke.exception.InvalidCommandException; -import java.util.Arrays; - public class ToDo extends Task { public ToDo(String[] descriptionArray) throws InvalidCommandException { - super(descriptionArray); + if (descriptionArray.length < 1) { + throw new InvalidCommandException("Incomplete description of ToDo!"); + } + this.taskName = descriptionArray[0]; + this.isDone = false; } @Override diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index 8d54a3d00..e69de29bb 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -1,20 +0,0 @@ -____________________________________________________________ - ____ _ -| _ \ _ _| | _____ -| | | | | | | |/ / _ \ -| |_| | |_| | < __/ -|____/ \__,_|_|\_\___| -Hello! I'm Duke! -What I can do for you? -____________________________________________________________ - - ____________________________________________________________ - Got it. I've added this task: - [T][ ] borrow - Now you have 1 tasks in the list. - ____________________________________________________________ - ____________________________________________________________ - Got it. I've added this task: - [D][ ] return book - Now you have 2 tasks in the list. - ____________________________________________________________ diff --git a/text-ui-test/input.txt b/text-ui-test/input.txt index dd12e90af..50f6b963e 100644 --- a/text-ui-test/input.txt +++ b/text-ui-test/input.txt @@ -9,6 +9,8 @@ list event project meeting /from Mon 2pm /to 4pm mark 1 mark 3 +delete 1 +delete 2 list unmark 1 list diff --git a/text-ui-test/runtest.bat b/text-ui-test/runtest.bat deleted file mode 100644 index 62752b881..000000000 --- a/text-ui-test/runtest.bat +++ /dev/null @@ -1,21 +0,0 @@ -@ECHO OFF - -REM create bin directory if it doesn't exist -if not exist ..\bin mkdir ..\bin - -REM delete output from previous run -if exist ACTUAL.TXT del ACTUAL.TXT - -REM compile the code into the bin folder -javac -cp ..\src\main\java -Xlint:none -d ..\bin ..\src\main\java\*.java -IF ERRORLEVEL 1 ( - echo ********** BUILD FAILURE ********** - exit /b 1 -) -REM no error here, errorlevel == 0 - -REM run the program, feed commands from input.txt file and redirect the output to the ACTUAL.TXT -java -classpath ..\bin duke.Duke < input.txt > ACTUAL.TXT - -REM compare the output to the expected output -FC ACTUAL.TXT EXPECTED.TXT From 2a0f5ab88d18e62725f08bf927fbd1104a6e62eb Mon Sep 17 00:00:00 2001 From: kristianachwan Date: Wed, 15 Feb 2023 01:39:06 +0800 Subject: [PATCH 27/40] Add DataAccess class --- data/duke.txt | 0 src/main/java/duke/Duke.java | 6 ++-- src/main/java/duke/utils/DataAccess.java | 42 ++++++++++++++++++++++++ 3 files changed, 46 insertions(+), 2 deletions(-) create mode 100644 data/duke.txt create mode 100644 src/main/java/duke/utils/DataAccess.java diff --git a/data/duke.txt b/data/duke.txt new file mode 100644 index 000000000..e69de29bb diff --git a/src/main/java/duke/Duke.java b/src/main/java/duke/Duke.java index 73b5f7638..4c0a19fb3 100644 --- a/src/main/java/duke/Duke.java +++ b/src/main/java/duke/Duke.java @@ -2,12 +2,14 @@ import duke.exception.InvalidCommandException; import duke.model.*; +import duke.utils.DataAccess; import java.util.Scanner; public class Duke { - static Task[] tasks = new Task[100]; static final String TASK_ADDED_PREFIX = "Got it. I've added this task:" + System.lineSeparator() + "\t"; + static Task[] tasks = new Task[100]; + static DataAccess dataAccess = new DataAccess("data/duke.txt"); public static void main(String[] args) { Scanner scanner = new Scanner(System.in); @@ -71,10 +73,10 @@ public static void main(String[] args) { } - System.out.println("\t____________________________________________________________"); System.out.println("\t" + outputMessage); System.out.println("\t____________________________________________________________"); + dataAccess.writeToFile(Task.getTasksList(tasks)); } } diff --git a/src/main/java/duke/utils/DataAccess.java b/src/main/java/duke/utils/DataAccess.java new file mode 100644 index 000000000..a34a409ab --- /dev/null +++ b/src/main/java/duke/utils/DataAccess.java @@ -0,0 +1,42 @@ +package duke.utils; + +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; + +public class DataAccess { + String filePath; + FileWriter fileWriter; + File file; + + public DataAccess(String filePath) { + this.filePath = filePath; + try { + this.file = new File(filePath); + if (!file.exists()) { + file.createNewFile(); + } + this.fileWriter = new FileWriter(filePath); + } catch (IOException e) { + System.out.println("Error instantiating Data Access Object for " + filePath); + } + } + + public void writeToFile(String text) { + try { + fileWriter.write(text); + fileWriter.flush(); + } catch (IOException e) { + System.out.println("Error writing to file: " + filePath); + } + } + + public void closeFile() { + try { + fileWriter.close(); + } catch (IOException e) { + System.out.println("Error closing file: " + filePath); + } + } + +} From 62219f38311a0693d05fe1223aab6ab66067720e Mon Sep 17 00:00:00 2001 From: kristianachwan Date: Wed, 15 Feb 2023 01:47:40 +0800 Subject: [PATCH 28/40] Resolve error after merging --- src/main/java/duke/Duke.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/duke/Duke.java b/src/main/java/duke/Duke.java index 2c657b8a2..29e159db9 100644 --- a/src/main/java/duke/Duke.java +++ b/src/main/java/duke/Duke.java @@ -9,8 +9,8 @@ public class Duke { static final String TASK_ADDED_PREFIX = "Got it. I've added this task:" + System.lineSeparator() + "\t"; - static DataAccess dataAccess = new DataAccess("data/duke.txt"); static final String TASK_REMOVED_PREFIX = "Noted! I've removed this task" + System.lineSeparator() + "\t"; + static DataAccess dataAccess = new DataAccess("data/duke.txt"); static ArrayList tasks = new ArrayList(); public static void main(String[] args) { @@ -60,7 +60,7 @@ public static void main(String[] args) { System.out.println("\t____________________________________________________________"); System.out.println("\t" + outputMessage); System.out.println("\t____________________________________________________________"); - dataAccess.writeToFile(Task.getTasksList(tasks)); + dataAccess.writeToFile(getTasksList()); } } From 5a25935c491a0ae7594ced3a1694b32275a24d79 Mon Sep 17 00:00:00 2001 From: kristianachwan Date: Wed, 15 Feb 2023 02:06:18 +0800 Subject: [PATCH 29/40] Fix bug writing duke.txt --- src/main/java/duke/Duke.java | 2 +- src/main/java/duke/utils/DataAccess.java | 28 ++++++++++-------------- 2 files changed, 12 insertions(+), 18 deletions(-) diff --git a/src/main/java/duke/Duke.java b/src/main/java/duke/Duke.java index 29e159db9..eb5444482 100644 --- a/src/main/java/duke/Duke.java +++ b/src/main/java/duke/Duke.java @@ -60,7 +60,7 @@ public static void main(String[] args) { System.out.println("\t____________________________________________________________"); System.out.println("\t" + outputMessage); System.out.println("\t____________________________________________________________"); - dataAccess.writeToFile(getTasksList()); + dataAccess.writeToFile("\t" + getTasksList()); } } diff --git a/src/main/java/duke/utils/DataAccess.java b/src/main/java/duke/utils/DataAccess.java index a34a409ab..913df1a89 100644 --- a/src/main/java/duke/utils/DataAccess.java +++ b/src/main/java/duke/utils/DataAccess.java @@ -1,41 +1,35 @@ package duke.utils; -import java.io.File; +import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; public class DataAccess { String filePath; - FileWriter fileWriter; - File file; + public DataAccess(String filePath) { this.filePath = filePath; - try { - this.file = new File(filePath); - if (!file.exists()) { - file.createNewFile(); - } - this.fileWriter = new FileWriter(filePath); - } catch (IOException e) { - System.out.println("Error instantiating Data Access Object for " + filePath); - } } public void writeToFile(String text) { try { - fileWriter.write(text); - fileWriter.flush(); + BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(filePath, false)); + emptyFile(); + bufferedWriter.write(text); + bufferedWriter.close(); } catch (IOException e) { System.out.println("Error writing to file: " + filePath); } } - public void closeFile() { + public void emptyFile() { try { - fileWriter.close(); + BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(filePath, false)); + bufferedWriter.write(""); + bufferedWriter.close(); } catch (IOException e) { - System.out.println("Error closing file: " + filePath); + throw new RuntimeException(e); } } From 3496b8ed2893999461cc9a730c2b54edfdf1643f Mon Sep 17 00:00:00 2001 From: kristianachwan Date: Wed, 15 Feb 2023 02:10:49 +0800 Subject: [PATCH 30/40] Clean code --- src/main/java/duke/utils/DataAccess.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/duke/utils/DataAccess.java b/src/main/java/duke/utils/DataAccess.java index 913df1a89..4876995ac 100644 --- a/src/main/java/duke/utils/DataAccess.java +++ b/src/main/java/duke/utils/DataAccess.java @@ -29,7 +29,8 @@ public void emptyFile() { bufferedWriter.write(""); bufferedWriter.close(); } catch (IOException e) { - throw new RuntimeException(e); + System.out.println("Cannot empty the file: " + filePath); + ; } } From 8a1dba84ac111019e9fec2b5f4848faba22573a0 Mon Sep 17 00:00:00 2001 From: kristianachwan Date: Wed, 1 Mar 2023 00:37:24 +0800 Subject: [PATCH 31/40] Refactor to more OOP --- data/duke.txt | 1 + src/main/java/META-INF/MANIFEST.MF | 3 + src/main/java/duke/Duke.java | 161 ++---------------- src/main/java/duke/boundary/Ui.java | 121 +++++++++++++ src/main/java/duke/controller/TaskList.java | 89 ++++++++++ src/main/java/duke/model/Command.java | 24 +-- src/main/java/duke/utils/Parser.java | 31 ++++ .../utils/{DataAccess.java => Storage.java} | 4 +- 8 files changed, 267 insertions(+), 167 deletions(-) create mode 100644 src/main/java/META-INF/MANIFEST.MF create mode 100644 src/main/java/duke/boundary/Ui.java create mode 100644 src/main/java/duke/controller/TaskList.java create mode 100644 src/main/java/duke/utils/Parser.java rename src/main/java/duke/utils/{DataAccess.java => Storage.java} (93%) diff --git a/data/duke.txt b/data/duke.txt index e69de29bb..7a2e8b15c 100644 --- a/data/duke.txt +++ b/data/duke.txt @@ -0,0 +1 @@ + Task is empty... \ No newline at end of file diff --git a/src/main/java/META-INF/MANIFEST.MF b/src/main/java/META-INF/MANIFEST.MF new file mode 100644 index 000000000..6e864153e --- /dev/null +++ b/src/main/java/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Main-Class: duke.Duke + diff --git a/src/main/java/duke/Duke.java b/src/main/java/duke/Duke.java index eb5444482..0a566026d 100644 --- a/src/main/java/duke/Duke.java +++ b/src/main/java/duke/Duke.java @@ -1,166 +1,31 @@ package duke; -import duke.exception.InvalidCommandException; -import duke.model.*; -import duke.utils.DataAccess; +import duke.boundary.Ui; +import duke.controller.TaskList; +import duke.model.Command; +import duke.utils.Parser; +import duke.utils.Storage; -import java.util.ArrayList; import java.util.Scanner; public class Duke { - static final String TASK_ADDED_PREFIX = "Got it. I've added this task:" + System.lineSeparator() + "\t"; - static final String TASK_REMOVED_PREFIX = "Noted! I've removed this task" + System.lineSeparator() + "\t"; - static DataAccess dataAccess = new DataAccess("data/duke.txt"); - static ArrayList tasks = new ArrayList(); + public static void main(String[] args) { + Storage dataAccess = new Storage("data/duke.txt"); Scanner scanner = new Scanner(System.in); - printDuke(); + TaskList taskList = new TaskList(); + Ui ui = new Ui(taskList); + ui.printDuke(); String input; - String outputMessage; while (true) { input = scanner.nextLine(); - Command command = new Command(input); - String[] payloadData = command.getPayload().getData(); - try { - switch (command.getType()) { - case "list": - outputMessage = getTasksList(); - break; - case "mark": - outputMessage = handleMarkTask(command); - break; - case "unmark": - outputMessage = handleUnmarkTask(command); - break; - case "task": - outputMessage = handleAddTask(payloadData); - break; - case "todo": - outputMessage = handleAddTodo(payloadData); - break; - case "deadline": - outputMessage = handleAddDeadline(payloadData); - break; - case "event": - outputMessage = handleAddEvent(payloadData); - break; - case "delete": - outputMessage = handleDeleteTask(payloadData); - break; - case "bye": - outputMessage = "Bye. Hope to see you again soon!"; - System.exit(0); - default: - throw new InvalidCommandException(); - } - } catch (InvalidCommandException e) { - outputMessage = e.getMessage(); - } - System.out.println("\t____________________________________________________________"); - System.out.println("\t" + outputMessage); - System.out.println("\t____________________________________________________________"); - dataAccess.writeToFile("\t" + getTasksList()); + Command command = Parser.parse(input); + ui.readCommand(command); + dataAccess.writeToFile("\t" + taskList.toString()); } } - public static String handleDeleteTask(String[] payloadData) throws InvalidCommandException { - String outputMessage; - int removedIndex = Integer.parseInt(payloadData[0]); - Task removedTask = tasks.get(removedIndex - 1); - tasks.remove(removedIndex - 1); - outputMessage = TASK_REMOVED_PREFIX + removedTask.toString() + System.lineSeparator() + "\t" + getTasksInformation(); - return outputMessage; - } - - public static String handleAddEvent(String[] payloadData) throws InvalidCommandException { - String outputMessage; - Task newEvent = new Event(payloadData); - tasks.add(newEvent); - outputMessage = TASK_ADDED_PREFIX + newEvent.toString() + System.lineSeparator() + "\t" - + getTasksInformation(); - return outputMessage; - } - - public static String handleAddDeadline(String[] payloadData) throws InvalidCommandException { - String outputMessage; - Deadline newDeadline = new Deadline(payloadData); - tasks.add(newDeadline); - outputMessage = TASK_ADDED_PREFIX + newDeadline.toString() + System.lineSeparator() + "\t" - + getTasksInformation(); - return outputMessage; - } - - public static String handleAddTodo(String[] payloadData) throws InvalidCommandException { - String outputMessage; - Task newTodo = new ToDo(payloadData); - tasks.add(newTodo); - outputMessage = TASK_ADDED_PREFIX + newTodo.toString() + System.lineSeparator() + "\t" - + getTasksInformation(); - return outputMessage; - } - - public static String handleAddTask(String[] payloadData) throws InvalidCommandException { - String outputMessage; - Task newTask = new Task(payloadData); - tasks.add(newTask); - outputMessage = TASK_ADDED_PREFIX + newTask.toString() + System.lineSeparator() + "\t" - + getTasksInformation(); - return outputMessage; - } - - public static String handleMarkTask(Command command) { - int taskIndex; - String outputMessage; - taskIndex = Integer.parseInt(command.getPayload().getData()[0]) - 1; - tasks.get(taskIndex).markAsDone(); - outputMessage = "Nice! I've marked this task as done:" + System.lineSeparator() + "\t" - + tasks.get(taskIndex).toString(); - return outputMessage; - } - - public static String handleUnmarkTask(Command command) { - String outputMessage; - int taskIndex; - taskIndex = Integer.parseInt(command.getPayload().getData()[0]) - 1; - tasks.get(taskIndex).unmarkAsDone(); - outputMessage = "Ok, I've marked this task as not done:" + System.lineSeparator() + "\t" - + tasks.get(taskIndex).toString(); - return outputMessage; - } - - public static void printDuke() { - String logo = " ____ _" + System.lineSeparator() - + "| _ \\ _ _| | _____" + System.lineSeparator() - + "| | | | | | | |/ / _ \\" + System.lineSeparator() - + "| |_| | |_| | < __/" + System.lineSeparator() - + "|____/ \\__,_|_|\\_\\___|" + System.lineSeparator(); - System.out.println("____________________________________________________________" + System.lineSeparator() - + logo - + "Hello! I'm duke.Duke!" + System.lineSeparator() - + "What I can do for you?" + System.lineSeparator() - + "____________________________________________________________" + System.lineSeparator() - ); - } - - public static String getTasksInformation() { - return "Now you have " + tasks.size() + " tasks in the list."; - } - - public static String getTasksList() { - if (tasks.size() == 0) { - return "Tasks is empty..."; - } - String tasksList = ""; - int numberOfTasks = tasks.size(); - for (int i = 0; i < numberOfTasks; i++) { - tasksList += String.format("%3d. ", (i + 1)) + tasks.get(i).toString(); - if (i < numberOfTasks - 1) { - tasksList += System.lineSeparator() + "\t"; - } - } - return tasksList; - } } diff --git a/src/main/java/duke/boundary/Ui.java b/src/main/java/duke/boundary/Ui.java new file mode 100644 index 000000000..1d66e6c54 --- /dev/null +++ b/src/main/java/duke/boundary/Ui.java @@ -0,0 +1,121 @@ +package duke.boundary; + +import duke.controller.TaskList; +import duke.exception.InvalidCommandException; +import duke.model.*; + +public class Ui { + static final String TASK_ADDED_PREFIX = "Got it. I've added this task:" + System.lineSeparator() + "\t"; + static final String TASK_DELETED_PREFIX = "Noted! I've removed this task" + System.lineSeparator() + "\t"; + static final String TASK_MARKED_PREFIX = "Nice! I've marked this task as done:" + System.lineSeparator() + "\t"; + static final String TASK_UNMARKED_PREFIX = "Ok, I've marked this task as not done:" + System.lineSeparator() + "\t"; + + protected TaskList taskList; + protected String outputMessage; + + public Ui(TaskList taskList) { + setTaskList(taskList); + } + + public void readCommand(Command command) { + Payload payload = command.getPayload(); + String[] payloadData = payload.getData(); + Task task; + Event event; + Deadline deadline; + try { + switch (command.getType()) { + case "list": + this.printTaskList(); + break; + case "mark": + task = taskList.handleMarkTask(command); + this.printMarkMessage(task); + break; + case "unmark": + task = taskList.handleUnmarkTask(command); + this.printUnmarkMessage(task); + break; + case "task": + task = taskList.handleAddTask(payloadData); + this.printAddMessage(task); + break; + case "todo": + ToDo todo = taskList.handleAddTodo(payloadData); + this.printAddMessage(todo); + break; + case "deadline": + deadline = taskList.handleAddDeadline(payloadData); + this.printAddMessage(deadline); + break; + case "event": + event = taskList.handleAddEvent(payloadData); + this.printAddMessage(event); + break; + case "delete": + task = taskList.handleDeleteTask(payloadData); + this.printDeleteMessage(task); + break; + case "bye": + this.printMessage("Bye. Hope to see you again soon!"); + System.exit(0); + default: + throw new InvalidCommandException(); + } + } catch (InvalidCommandException e) { + this.printMessage(e.getMessage()); + } + } + + public void printMarkMessage(Task task) { + this.printMessage(TASK_MARKED_PREFIX + task.toString()); + } + + public void printUnmarkMessage(Task task) { + this.printMessage(TASK_UNMARKED_PREFIX + task.toString()); + } + + public void printAddMessage(Task task) { + this.printMessage(TASK_ADDED_PREFIX + task.toString()); + } + + public void printDeleteMessage(Task task) { + this.printMessage(TASK_DELETED_PREFIX + task.toString()); + } + + public void printHorizontalLine() { + System.out.println("\t____________________________________________________________"); + } + + public void printMessage(String message) { + this.printHorizontalLine(); + System.out.println("\t" + message); + this.printHorizontalLine(); + } + + public void setTaskList(TaskList taskList) { + this.taskList = taskList; + } + + public void printDuke() { + String logo = " ____ _" + System.lineSeparator() + + "| _ \\ _ _| | _____" + System.lineSeparator() + + "| | | | | | | |/ / _ \\" + System.lineSeparator() + + "| |_| | |_| | < __/" + System.lineSeparator() + + "|____/ \\__,_|_|\\_\\___|" + System.lineSeparator(); + System.out.println("____________________________________________________________" + System.lineSeparator() + + logo + + "Hello! I'm duke.Duke!" + System.lineSeparator() + + "What I can do for you?" + System.lineSeparator() + + "____________________________________________________________" + System.lineSeparator() + ); + } + + public void printTaskList() { + this.printHorizontalLine(); + System.out.println("\t" + taskList.toString()); + this.printHorizontalLine(); + } + + +} diff --git a/src/main/java/duke/controller/TaskList.java b/src/main/java/duke/controller/TaskList.java new file mode 100644 index 000000000..3a38cfe13 --- /dev/null +++ b/src/main/java/duke/controller/TaskList.java @@ -0,0 +1,89 @@ +package duke.controller; + +import duke.exception.InvalidCommandException; +import duke.model.*; + +import java.util.ArrayList; + +public class TaskList { + protected ArrayList tasks; + + public TaskList() { + tasks = new ArrayList(); + } + + public Task handleUnmarkTask(Command command) { + String outputMessage; + int taskIndex; + taskIndex = Integer.parseInt(command.getPayload().getData()[0]) - 1; + Task unmarkedTask = tasks.get(taskIndex); + unmarkedTask.unmarkAsDone(); + return unmarkedTask; + } + + public int getTasksNumber() { + return tasks.size(); + } + + + public Task handleDeleteTask(String[] payloadData) throws InvalidCommandException { + String outputMessage; + int removedIndex = Integer.parseInt(payloadData[0]); + Task removedTask = tasks.get(removedIndex - 1); + tasks.remove(removedIndex - 1); + return removedTask; + } + + public Event handleAddEvent(String[] payloadData) throws InvalidCommandException { + String outputMessage; + Event newEvent = new Event(payloadData); + tasks.add(newEvent); + return newEvent; + } + + public Deadline handleAddDeadline(String[] payloadData) throws InvalidCommandException { + String outputMessage; + Deadline newDeadline = new Deadline(payloadData); + tasks.add(newDeadline); + return newDeadline; + } + + public ToDo handleAddTodo(String[] payloadData) throws InvalidCommandException { + String outputMessage; + ToDo newTodo = new ToDo(payloadData); + tasks.add(newTodo); + return newTodo; + } + + public Task handleAddTask(String[] payloadData) throws InvalidCommandException { + String outputMessage; + Task newTask = new Task(payloadData); + tasks.add(newTask); + return newTask; + } + + public Task handleMarkTask(Command command) { + int taskIndex; + String outputMessage; + taskIndex = Integer.parseInt(command.getPayload().getData()[0]) - 1; + Task markedTask = tasks.get(taskIndex); + markedTask.markAsDone(); + return markedTask; + } + + public String toString() { + int size = this.getTasksNumber(); + if (size == 0) { + return "Task is empty..."; + } + String taskListString = ""; + int numberOfTasks = size; + for (int i = 0; i < numberOfTasks; i++) { + taskListString += String.format("%3d. ", (i + 1)) + tasks.get(i).toString(); + if (i < numberOfTasks - 1) { + taskListString += System.lineSeparator() + "\t"; + } + } + return taskListString; + } +} diff --git a/src/main/java/duke/model/Command.java b/src/main/java/duke/model/Command.java index 8b6bf9586..0820a4c25 100644 --- a/src/main/java/duke/model/Command.java +++ b/src/main/java/duke/model/Command.java @@ -4,30 +4,20 @@ public class Command { protected String type; protected Payload payload; - public Command(String input) { - String[] commandArray = input.split(" "); - this.type = commandArray[0].trim(); - String[] payloadStringArray = input.split(this.type); - if (payloadStringArray.length > 1) { - payload = new Payload(trimStringArray(payloadStringArray[1].split("/"))); - } else { - payload = new Payload(); - } - } - public String getType() { return this.type; } + public void setType(String type) { + this.type = type; + } + public Payload getPayload() { return this.payload; } - public String[] trimStringArray(String[] stringArray) { - String[] trimmedStringArray = new String[stringArray.length]; - for (int i = 0; i < stringArray.length; i++) { - trimmedStringArray[i] = stringArray[i].trim(); - } - return trimmedStringArray; + public void setPayload(Payload payload) { + this.payload = payload; } + } diff --git a/src/main/java/duke/utils/Parser.java b/src/main/java/duke/utils/Parser.java new file mode 100644 index 000000000..e3e413ccd --- /dev/null +++ b/src/main/java/duke/utils/Parser.java @@ -0,0 +1,31 @@ +package duke.utils; + +import duke.model.Command; +import duke.model.Payload; + +public class Parser { + + public static Command parse(String input) { + Command command = new Command(); + String[] commandArray = input.split(" "); + command.setType(commandArray[0].trim()); + String[] payloadStringArray = input.split(command.getType()); + + if (payloadStringArray.length > 1) { + command.setPayload(new Payload(trimStringArray(payloadStringArray[1].split("/")))); + } else { + command.setPayload(new Payload()); + } + return command; + } + + public static String[] trimStringArray(String[] stringArray) { + String[] trimmedStringArray = new String[stringArray.length]; + for (int i = 0; i < stringArray.length; i++) { + trimmedStringArray[i] = stringArray[i].trim(); + } + return trimmedStringArray; + } + + +} diff --git a/src/main/java/duke/utils/DataAccess.java b/src/main/java/duke/utils/Storage.java similarity index 93% rename from src/main/java/duke/utils/DataAccess.java rename to src/main/java/duke/utils/Storage.java index 4876995ac..fb4c68b36 100644 --- a/src/main/java/duke/utils/DataAccess.java +++ b/src/main/java/duke/utils/Storage.java @@ -4,11 +4,11 @@ import java.io.FileWriter; import java.io.IOException; -public class DataAccess { +public class Storage { String filePath; - public DataAccess(String filePath) { + public Storage(String filePath) { this.filePath = filePath; } From 2b7328bf475ab1c56528ae273205e5ca89257819 Mon Sep 17 00:00:00 2001 From: kristianachwan Date: Wed, 1 Mar 2023 14:40:36 +0800 Subject: [PATCH 32/40] Add find feature --- data/duke.txt | 5 ++++- src/main/java/duke/boundary/Ui.java | 16 ++++++++++++++++ src/main/java/duke/controller/TaskList.java | 10 ++++++++++ src/main/java/duke/model/Task.java | 4 +++- 4 files changed, 33 insertions(+), 2 deletions(-) diff --git a/data/duke.txt b/data/duke.txt index 7a2e8b15c..af60f485e 100644 --- a/data/duke.txt +++ b/data/duke.txt @@ -1 +1,4 @@ - Task is empty... \ No newline at end of file + 1. [T][ ] assd + 2. [T][ ] asd2 + 3. [T][ ] book1 + 4. [T][ ] book2 \ No newline at end of file diff --git a/src/main/java/duke/boundary/Ui.java b/src/main/java/duke/boundary/Ui.java index 1d66e6c54..85617c76b 100644 --- a/src/main/java/duke/boundary/Ui.java +++ b/src/main/java/duke/boundary/Ui.java @@ -4,6 +4,8 @@ import duke.exception.InvalidCommandException; import duke.model.*; +import java.util.ArrayList; + public class Ui { static final String TASK_ADDED_PREFIX = "Got it. I've added this task:" + System.lineSeparator() + "\t"; static final String TASK_DELETED_PREFIX = "Noted! I've removed this task" + System.lineSeparator() + "\t"; @@ -25,6 +27,9 @@ public void readCommand(Command command) { Deadline deadline; try { switch (command.getType()) { + case "find": + this.printSearchedTasks(payloadData); + break; case "list": this.printTaskList(); break; @@ -67,6 +72,17 @@ public void readCommand(Command command) { } } + public void printSearchedTasks(String[] payloadData) { + String keyword = payloadData[0]; + ArrayList searchedTasks = taskList.getSearchedTasks(keyword); + this.printHorizontalLine(); + for (Task task : searchedTasks) { + System.out.println(task.toString()); + } + this.printHorizontalLine(); + + } + public void printMarkMessage(Task task) { this.printMessage(TASK_MARKED_PREFIX + task.toString()); } diff --git a/src/main/java/duke/controller/TaskList.java b/src/main/java/duke/controller/TaskList.java index 3a38cfe13..8e5e4d2e3 100644 --- a/src/main/java/duke/controller/TaskList.java +++ b/src/main/java/duke/controller/TaskList.java @@ -86,4 +86,14 @@ public String toString() { } return taskListString; } + + public ArrayList getSearchedTasks(String keyword) { + ArrayList searchedTasks = new ArrayList(); + for (Task task : tasks) { + if (task.getTaskName().contains(keyword)) { + searchedTasks.add(task); + } + } + return searchedTasks; + } } diff --git a/src/main/java/duke/model/Task.java b/src/main/java/duke/model/Task.java index df6dbc54e..77f28b15f 100644 --- a/src/main/java/duke/model/Task.java +++ b/src/main/java/duke/model/Task.java @@ -39,5 +39,7 @@ public String toString() { return "[" + this.getStatusIcon() + "]" + "\t" + this.taskName; } - + public String getTaskName() { + return this.taskName; + } } From a8e51f7b60a36b798d82c45d39d14f49fa57d573 Mon Sep 17 00:00:00 2001 From: kristianachwan Date: Wed, 1 Mar 2023 23:37:37 +0800 Subject: [PATCH 33/40] Add method header comments --- data/duke.txt | 2 +- src/main/java/duke/Duke.java | 5 +- src/main/java/duke/boundary/Ui.java | 76 +++++++++++++-- src/main/java/duke/controller/TaskList.java | 97 +++++++++++++++---- .../java/duke/exception/DukeException.java | 20 ++-- .../exception/InvalidCommandException.java | 20 +++- src/main/java/duke/model/Command.java | 30 ++++++ src/main/java/duke/model/Deadline.java | 17 ++++ src/main/java/duke/model/Event.java | 22 +++++ src/main/java/duke/model/Payload.java | 20 ++++ src/main/java/duke/model/Task.java | 43 ++++++++ src/main/java/duke/model/ToDo.java | 14 +++ src/main/java/duke/utils/Parser.java | 22 ++++- src/main/java/duke/utils/Storage.java | 21 +++- 14 files changed, 366 insertions(+), 43 deletions(-) diff --git a/data/duke.txt b/data/duke.txt index 7a2e8b15c..b918eac8a 100644 --- a/data/duke.txt +++ b/data/duke.txt @@ -1 +1 @@ - Task is empty... \ No newline at end of file + 1. [D][X] return book (by: by Sunday) \ No newline at end of file diff --git a/src/main/java/duke/Duke.java b/src/main/java/duke/Duke.java index 0a566026d..a819a0bf1 100644 --- a/src/main/java/duke/Duke.java +++ b/src/main/java/duke/Duke.java @@ -8,9 +8,10 @@ import java.util.Scanner; +/** + * A class that serves as an entry point to the application + */ public class Duke { - - public static void main(String[] args) { Storage dataAccess = new Storage("data/duke.txt"); Scanner scanner = new Scanner(System.in); diff --git a/src/main/java/duke/boundary/Ui.java b/src/main/java/duke/boundary/Ui.java index 1d66e6c54..166d4cbac 100644 --- a/src/main/java/duke/boundary/Ui.java +++ b/src/main/java/duke/boundary/Ui.java @@ -4,19 +4,46 @@ import duke.exception.InvalidCommandException; import duke.model.*; +/** + * Class that is mainly responsible to display an information to the user + */ public class Ui { + /** + * Prefix used when the task is added + */ static final String TASK_ADDED_PREFIX = "Got it. I've added this task:" + System.lineSeparator() + "\t"; + /** + * Prefix used when the task is deleted + */ static final String TASK_DELETED_PREFIX = "Noted! I've removed this task" + System.lineSeparator() + "\t"; + /** + * Prefix used when the task is marked + */ static final String TASK_MARKED_PREFIX = "Nice! I've marked this task as done:" + System.lineSeparator() + "\t"; + /** + * Prefix used when the task is unmarked + */ static final String TASK_UNMARKED_PREFIX = "Ok, I've marked this task as not done:" + System.lineSeparator() + "\t"; + /** + * TaskList attached to this Ui object + */ protected TaskList taskList; - protected String outputMessage; + /** + * Constructor that initiates an Ui object + * + * @param taskList the TaskList object attached to this Ui object + */ public Ui(TaskList taskList) { setTaskList(taskList); } + /** + * A method that classifies different cases of the command + * + * @param command The command object represents tokenized user command + */ public void readCommand(Command command) { Payload payload = command.getPayload(); String[] payloadData = payload.getData(); @@ -29,11 +56,11 @@ public void readCommand(Command command) { this.printTaskList(); break; case "mark": - task = taskList.handleMarkTask(command); + task = taskList.handleMarkTask(payloadData); this.printMarkMessage(task); break; case "unmark": - task = taskList.handleUnmarkTask(command); + task = taskList.handleUnmarkTask(payloadData); this.printUnmarkMessage(task); break; case "task": @@ -67,36 +94,72 @@ public void readCommand(Command command) { } } + /** + * Method to print message after marking a task + * + * @param task Task object to be marked + */ public void printMarkMessage(Task task) { this.printMessage(TASK_MARKED_PREFIX + task.toString()); } + /** + * Method to print message after unmarking a task + * + * @param task Task object to be unmarked + */ public void printUnmarkMessage(Task task) { this.printMessage(TASK_UNMARKED_PREFIX + task.toString()); } + /** + * Method to print a message after adding a task + * + * @param task Task object to be added + */ public void printAddMessage(Task task) { this.printMessage(TASK_ADDED_PREFIX + task.toString()); } + /** + * Method to print a message after deleting a task + * + * @param task Task object to be deleted + */ public void printDeleteMessage(Task task) { this.printMessage(TASK_DELETED_PREFIX + task.toString()); } + /** + * Method to print a horizontla line + */ public void printHorizontalLine() { System.out.println("\t____________________________________________________________"); } + /** + * Method to print a formatted message + * + * @param message The message to be formatted + */ public void printMessage(String message) { this.printHorizontalLine(); System.out.println("\t" + message); this.printHorizontalLine(); } + /** + * Method that set the taskList attached to this Ui object + * + * @param taskList The attached taskList object + */ public void setTaskList(TaskList taskList) { this.taskList = taskList; } + /** + * Method to pritn a welcome message of Duke + */ public void printDuke() { String logo = " ____ _" + System.lineSeparator() + "| _ \\ _ _| | _____" + System.lineSeparator() @@ -111,10 +174,11 @@ public void printDuke() { ); } + /** + * Method that prints the TaskList object representation + */ public void printTaskList() { - this.printHorizontalLine(); - System.out.println("\t" + taskList.toString()); - this.printHorizontalLine(); + this.printMessage(taskList.toString()); } diff --git a/src/main/java/duke/controller/TaskList.java b/src/main/java/duke/controller/TaskList.java index 3a38cfe13..bf7a8b06e 100644 --- a/src/main/java/duke/controller/TaskList.java +++ b/src/main/java/duke/controller/TaskList.java @@ -1,31 +1,71 @@ package duke.controller; import duke.exception.InvalidCommandException; -import duke.model.*; +import duke.model.Deadline; +import duke.model.Event; +import duke.model.Task; +import duke.model.ToDo; import java.util.ArrayList; +/** + * A class that manages a collection of tasks + */ public class TaskList { + /** + * The collection of tasks + */ protected ArrayList tasks; + /** + * Constructor that initializes the collection of tasks + */ public TaskList() { tasks = new ArrayList(); } - public Task handleUnmarkTask(Command command) { - String outputMessage; - int taskIndex; - taskIndex = Integer.parseInt(command.getPayload().getData()[0]) - 1; + /** + * Method that unmarks a task as done + * + * @param payloadData The payload data of the command + * @return The unmarked task + */ + public Task handleUnmarkTask(String[] payloadData) { + int taskIndex = taskIndex = Integer.parseInt(payloadData[0]) - 1; Task unmarkedTask = tasks.get(taskIndex); unmarkedTask.unmarkAsDone(); return unmarkedTask; } + /** + * Method that marks a task as done + * + * @param payloadData The payload data of the command + * @return The marked task + */ + public Task handleMarkTask(String[] payloadData) { + int taskIndex = Integer.parseInt(payloadData[0]) - 1; + Task markedTask = tasks.get(taskIndex); + markedTask.markAsDone(); + return markedTask; + } + + /** + * Method that returns the number of tasks of a taskList + * + * @return The number of tasks + */ public int getTasksNumber() { return tasks.size(); } - + /** + * A method that deletes a specific task + * + * @param payloadData THe payload data of the command + * @return The deleted task + * @throws InvalidCommandException If the information provided is insufficient + */ public Task handleDeleteTask(String[] payloadData) throws InvalidCommandException { String outputMessage; int removedIndex = Integer.parseInt(payloadData[0]); @@ -34,27 +74,52 @@ public Task handleDeleteTask(String[] payloadData) throws InvalidCommandExceptio return removedTask; } + /** + * Method that add an event to tasks + * + * @param payloadData The payload data of the command + * @return The added Event + * @throws InvalidCommandException If the information provided is insufficient + */ public Event handleAddEvent(String[] payloadData) throws InvalidCommandException { - String outputMessage; Event newEvent = new Event(payloadData); tasks.add(newEvent); return newEvent; } + /** + * Method that add a deadline to tasks + * + * @param payloadData The payload data of the command + * @return The added Deadline + * @throws InvalidCommandException If the information provided is insufficient + */ public Deadline handleAddDeadline(String[] payloadData) throws InvalidCommandException { - String outputMessage; Deadline newDeadline = new Deadline(payloadData); tasks.add(newDeadline); return newDeadline; } + /** + * Method that add a todo to tasks + * + * @param payloadData The payload data of the command + * @return The added ToDo + * @throws InvalidCommandException If the information provided is insufficient + */ public ToDo handleAddTodo(String[] payloadData) throws InvalidCommandException { - String outputMessage; ToDo newTodo = new ToDo(payloadData); tasks.add(newTodo); return newTodo; } + /** + * Method that add a task to tasks + * + * @param payloadData The payload data of the command + * @return The added Task + * @throws InvalidCommandException If the information provided is insufficient + */ public Task handleAddTask(String[] payloadData) throws InvalidCommandException { String outputMessage; Task newTask = new Task(payloadData); @@ -62,15 +127,11 @@ public Task handleAddTask(String[] payloadData) throws InvalidCommandException { return newTask; } - public Task handleMarkTask(Command command) { - int taskIndex; - String outputMessage; - taskIndex = Integer.parseInt(command.getPayload().getData()[0]) - 1; - Task markedTask = tasks.get(taskIndex); - markedTask.markAsDone(); - return markedTask; - } - + /** + * Method that converts a collection of tasks entity into its spring representation + * + * @return The spring representation of tasks + */ public String toString() { int size = this.getTasksNumber(); if (size == 0) { diff --git a/src/main/java/duke/exception/DukeException.java b/src/main/java/duke/exception/DukeException.java index dce01113c..17aaf46b0 100644 --- a/src/main/java/duke/exception/DukeException.java +++ b/src/main/java/duke/exception/DukeException.java @@ -1,19 +1,21 @@ package duke.exception; -import java.util.Arrays; +/** + * A class that represents basic custom exception for Duke + */ public class DukeException extends Exception { + /** + * Prefix for exception message + */ private static final String DUKE_PREFIX = "Duke Error: "; - public static String[] parseCommand (String command) throws InvalidCommandException{ - String[] commandArray = command.split(" "); - if (commandArray.length < 2){ - throw new InvalidCommandException("Description of cannot be empty!"); - } - return Arrays.copyOfRange(commandArray, 1, commandArray.length); - } - + /** + * Constructor that initiates the exception message + * + * @param message The message corresponding to the exception + */ public DukeException(String message) { super(DUKE_PREFIX + message); } diff --git a/src/main/java/duke/exception/InvalidCommandException.java b/src/main/java/duke/exception/InvalidCommandException.java index c1da52b8f..bbd7a2b05 100644 --- a/src/main/java/duke/exception/InvalidCommandException.java +++ b/src/main/java/duke/exception/InvalidCommandException.java @@ -1,13 +1,27 @@ package duke.exception; -public class InvalidCommandException extends DukeException{ +/** + * A class that represents custom exception that is thrown when the command is considered invalid + */ +public class InvalidCommandException extends DukeException { + /** + * Default message when message is not specified + */ private static final String DEFAULT_MESSAGE = "I'm sorry but I couldn't understand you :("; - public InvalidCommandException(String message){ + /** + * Constructor that initializes the message of the exception + * + * @param message The message related to the exception + */ + public InvalidCommandException(String message) { super(message); } - public InvalidCommandException () { + /** + * Empty constructor that initializes with default message + */ + public InvalidCommandException() { super(DEFAULT_MESSAGE); } } diff --git a/src/main/java/duke/model/Command.java b/src/main/java/duke/model/Command.java index 0820a4c25..7565c4b15 100644 --- a/src/main/java/duke/model/Command.java +++ b/src/main/java/duke/model/Command.java @@ -1,21 +1,51 @@ package duke.model; +/** + * A class to represent the command type and the payload of the command + */ public class Command { + + /** + * Represents the type of the command + */ protected String type; + /** + * Represents the payload of the command + */ protected Payload payload; + /** + * Method to return the type of the command + * + * @return The type of the command + */ public String getType() { return this.type; } + /** + * Method to set the type of the command + * + * @param type The type of the command + */ public void setType(String type) { this.type = type; } + /** + * Method to get the payload of the command + * + * @return The Payload object corresponding to the command object + */ public Payload getPayload() { return this.payload; } + /** + * Method to set the payload of the command + * + * @param payload The payload of the command + */ public void setPayload(Payload payload) { this.payload = payload; } diff --git a/src/main/java/duke/model/Deadline.java b/src/main/java/duke/model/Deadline.java index bc9045fdb..688c8dacf 100644 --- a/src/main/java/duke/model/Deadline.java +++ b/src/main/java/duke/model/Deadline.java @@ -2,9 +2,21 @@ import duke.exception.InvalidCommandException; +/** + * A class to store the Deadline entity + */ public class Deadline extends Task { + /** + * Represents the time when the deadline is due + */ protected String deadlineBy; + /** + * Constructor that initializes the deadline's deadlineBy and the deadline name + * + * @param descriptionArray + * @throws InvalidCommandException + */ public Deadline(String[] descriptionArray) throws InvalidCommandException { if (descriptionArray.length < 2) { throw new InvalidCommandException("Incomplete deadline description!"); @@ -13,6 +25,11 @@ public Deadline(String[] descriptionArray) throws InvalidCommandException { this.deadlineBy = descriptionArray[1]; } + /** + * Method to represent Deadline as a string + * + * @return String representation of Deadline + */ @Override public String toString() { String deadlinePrefix = "[D]"; diff --git a/src/main/java/duke/model/Event.java b/src/main/java/duke/model/Event.java index 7aa7136ac..ad1694c51 100644 --- a/src/main/java/duke/model/Event.java +++ b/src/main/java/duke/model/Event.java @@ -2,10 +2,27 @@ import duke.exception.InvalidCommandException; +/** + * A class to store Event entity + */ public class Event extends Task { + + /** + * Represents the start of the event + */ protected String eventStart; + + /** + * Represents the end of the event + */ protected String eventEnd; + /** + * A constructor that intializes the start and end of the event, along with the name of the event + * + * @param descriptionArray + * @throws InvalidCommandException + */ public Event(String[] descriptionArray) throws InvalidCommandException { if (descriptionArray.length < 3) { throw new InvalidCommandException("Incomplete description of event!"); @@ -16,6 +33,11 @@ public Event(String[] descriptionArray) throws InvalidCommandException { this.eventEnd = descriptionArray[2]; } + /** + * Method to represent Event as a string + * + * @return String representation of Event + */ @Override public String toString() { String deadlinePrefix = "[E]"; diff --git a/src/main/java/duke/model/Payload.java b/src/main/java/duke/model/Payload.java index b5a880546..c3c8b5493 100644 --- a/src/main/java/duke/model/Payload.java +++ b/src/main/java/duke/model/Payload.java @@ -1,16 +1,36 @@ package duke.model; +/** + * A class to represent the payload or argument of a Command object + */ public class Payload { + + /** + * Represent the data of the payload + */ protected String[] data; + /** + * Constructor that indicates an empty payload + */ public Payload() { this.data = new String[0]; } + /** + * Constructor that initializes the data of the payload + * + * @param data + */ public Payload(String[] data) { this.data = data; } + /** + * Method to return the data of the payload + * + * @return Array of string that represents multiple tokenized String + */ public String[] getData() { return data; } diff --git a/src/main/java/duke/model/Task.java b/src/main/java/duke/model/Task.java index df6dbc54e..78845b4ec 100644 --- a/src/main/java/duke/model/Task.java +++ b/src/main/java/duke/model/Task.java @@ -2,13 +2,33 @@ import duke.exception.InvalidCommandException; +/** + * A class to store the Task entity + */ public class Task { + /** + * Represents the name of the task + */ protected String taskName; + + /** + * Represents the state of the task, whether is done or not + */ protected boolean isDone; + /** + * Empty constructor that does nothing + */ public Task() { } + + /** + * Task Constructor that takes an array of String to describe the entity + * + * @param descriptionArray The array of String of information + * @throws InvalidCommandException When it is not given sufficient information + */ public Task(String[] descriptionArray) throws InvalidCommandException { if (descriptionArray.length < 1) { throw new InvalidCommandException("Description of task cannot be empty!"); @@ -17,24 +37,47 @@ public Task(String[] descriptionArray) throws InvalidCommandException { this.isDone = false; } + /** + * Task Constructor that takes an array of String to describe the entity and extra argument to initialize the todo whether is done or not. + * + * @param descriptionArray The array of String of information + * @param isDone The state of a Task object + * @throws InvalidCommandException When it is not given sufficient information + */ public Task(String[] descriptionArray, boolean isDone) throws InvalidCommandException { this(descriptionArray); this.isDone = isDone; } + /** + * Method to mark as done a task + */ public void markAsDone() { this.isDone = true; } + /** + * Method to unmark as done a task + */ public void unmarkAsDone() { this.isDone = false; } + /** + * Method to return the state of a task using string. X means that it is done, while empty space means that it is still not done. + * + * @return String representation of the state of the task + */ public String getStatusIcon() { return this.isDone ? "X" : " "; } + /** + * Method to represent Task as a string + * + * @return String representation of Task + */ public String toString() { return "[" + this.getStatusIcon() + "]" + "\t" + this.taskName; } diff --git a/src/main/java/duke/model/ToDo.java b/src/main/java/duke/model/ToDo.java index 0881b87d7..097a5b7bf 100644 --- a/src/main/java/duke/model/ToDo.java +++ b/src/main/java/duke/model/ToDo.java @@ -2,7 +2,16 @@ import duke.exception.InvalidCommandException; +/** + * A class to store the ToDo entity + */ public class ToDo extends Task { + /** + * ToDo Constructor that takes an array of String to describe the entity + * + * @param descriptionArray The array of String of information + * @throws InvalidCommandException When it is not given sufficient information + */ public ToDo(String[] descriptionArray) throws InvalidCommandException { if (descriptionArray.length < 1) { throw new InvalidCommandException("Incomplete description of ToDo!"); @@ -11,6 +20,11 @@ public ToDo(String[] descriptionArray) throws InvalidCommandException { this.isDone = false; } + /** + * Method to represent ToDo as a string + * + * @return String representation of ToDo + */ @Override public String toString() { String todoPrefix = "[T]"; diff --git a/src/main/java/duke/utils/Parser.java b/src/main/java/duke/utils/Parser.java index e3e413ccd..db7bd61a2 100644 --- a/src/main/java/duke/utils/Parser.java +++ b/src/main/java/duke/utils/Parser.java @@ -3,13 +3,23 @@ import duke.model.Command; import duke.model.Payload; +/** + * Class that serves as a parser to tokenize the input + */ public class Parser { + /** + * Method to parse the input into command object + * + * @param input The string input from the user + * @return The corresponding command object that is tokenized + */ public static Command parse(String input) { + String trimmedInput = input.trim(); Command command = new Command(); - String[] commandArray = input.split(" "); + String[] commandArray = trimmedInput.split(" "); command.setType(commandArray[0].trim()); - String[] payloadStringArray = input.split(command.getType()); + String[] payloadStringArray = trimmedInput.split(command.getType()); if (payloadStringArray.length > 1) { command.setPayload(new Payload(trimStringArray(payloadStringArray[1].split("/")))); @@ -19,6 +29,12 @@ public static Command parse(String input) { return command; } + /** + * Method to trim every String inside an array + * + * @param stringArray The string array about to be trimmed + * @return The trimmed stringArray + */ public static String[] trimStringArray(String[] stringArray) { String[] trimmedStringArray = new String[stringArray.length]; for (int i = 0; i < stringArray.length; i++) { @@ -27,5 +43,5 @@ public static String[] trimStringArray(String[] stringArray) { return trimmedStringArray; } - + } diff --git a/src/main/java/duke/utils/Storage.java b/src/main/java/duke/utils/Storage.java index fb4c68b36..22307e757 100644 --- a/src/main/java/duke/utils/Storage.java +++ b/src/main/java/duke/utils/Storage.java @@ -4,18 +4,34 @@ import java.io.FileWriter; import java.io.IOException; +/** + * Class that serves interaction between txt and CLI app + */ public class Storage { + /** + * The base filepath of the saved txt + */ String filePath; + /** + * Constructor that initializes the Storage object + * + * @param filePath The filepath of the txt file + */ public Storage(String filePath) { this.filePath = filePath; } + /** + * Method to write to a file + * + * @param text Text to be written to a file + */ public void writeToFile(String text) { try { BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(filePath, false)); - emptyFile(); + this.emptyFile(); bufferedWriter.write(text); bufferedWriter.close(); } catch (IOException e) { @@ -23,6 +39,9 @@ public void writeToFile(String text) { } } + /** + * Method to empty the file + */ public void emptyFile() { try { BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(filePath, false)); From 5d5a49875c27b7ae69c96c753091a6e2407c25a7 Mon Sep 17 00:00:00 2001 From: kristianachwan Date: Thu, 2 Mar 2023 03:37:40 +0800 Subject: [PATCH 34/40] Add user guide --- data/duke.txt | 10 +--- docs/README.md | 140 ++++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 129 insertions(+), 21 deletions(-) diff --git a/data/duke.txt b/data/duke.txt index 77e2806bf..ffc4d38d1 100644 --- a/data/duke.txt +++ b/data/duke.txt @@ -1,8 +1,2 @@ -<<<<<<< HEAD - 1. [D][X] return book (by: by Sunday) -======= - 1. [T][ ] assd - 2. [T][ ] asd2 - 3. [T][ ] book1 - 4. [T][ ] book2 ->>>>>>> master + 1. [D][ ] tP Meeting (by: Friday 16.00pm) + 2. [E][ ] CS2113 tP Meeting (from: Friday 16.00pm to: 18.00pm) \ No newline at end of file diff --git a/docs/README.md b/docs/README.md index 8077118eb..576edd322 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,29 +1,143 @@ # User Guide -## Features +Duke is a Command-Line Interface (CLI) task manager. It allows you to keep track of your tasks quickly and navigate +through those tasks quickly. -### Feature-ABC +## Features -Description of the feature. +- Adding different types of tasks: + - Todo: the most basic type of task + - Deadline: type of task which you can assign the due date of it + - Event: type of task which has a start and end date +- Searching based on keyword and listing all tasks are also supported -### Feature-XYZ +## Getting started -Description of the feature. +> Java 11 is recommended to run `Duke` -## Usage +1. Download the latest duke.jar from here [here](https://github.com/kristianachwan/ip/releases) +2. Go to the directory where you downloaded +3. Run `java -jar duke.jar` -### `Keyword` - Describe action +## Add ToDo -Describe the action and its outcome. +Adds todo to your list. Format: `todo ` -Example of usage: +### Adding `ToDo` example: -`keyword (optional arguments)` +``` +todo CS2113 tP Meeting + ____________________________________________________________ + Got it. I've added this task: + [T][ ] CS2113 tP Meeting + ____________________________________________________________ +``` + +## Add Deadline + +Adds deadline to your list. Format: `deadline /` + +### Adding `Deadline` example: + +``` +deadline tP Meeting /Friday 16.00pm + ____________________________________________________________ + Got it. I've added this task: + [D][ ] tP Meeting (by: Friday 16.00pm) + ____________________________________________________________ +``` + +## Add Deadline + +Adds event to your list. Format: `event / / ` + +### Adding `Event` example: + +``` +event CS2113 tP Meeting /Friday 16.00pm /18.00pm + ____________________________________________________________ + Got it. I've added this task: + [E][ ] CS2113 tP Meeting (from: Friday 16.00pm to: 18.00pm) + ____________________________________________________________ + +``` + +### Listing all tasks + +List all of your tasks. Format: `list` + +### Listing all tasks example: + +``` +list + ____________________________________________________________ + 1. [T][ ] CS2113 tP Meeting + 2. [D][ ] tP Meeting (by: Friday 16.00pm) + 3. [E][ ] CS2113 tP Meeting (from: Friday 16.00pm to: 18.00pm) + ____________________________________________________________ +``` -Expected outcome: +## Deleting a task: -Description of the outcome. +Delete your task by indicate the index of the task. Format: `delete ` +### Deleting a task example: + +``` +delete 1 + ____________________________________________________________ + Noted! I've removed this task + [T][ ] CS2113 tP Meeting + ____________________________________________________________ ``` -expected output + +## Searching specific tasks + +Search your task based on specific keyword. Format: `search ` + +### Searching specific tasks example + +``` +find tP + ____________________________________________________________ + [D][ ] tP Meeting (by: Friday 16.00pm) + [E][ ] CS2113 tP Meeting (from: Friday 16.00pm to: 18.00pm) + ____________________________________________________________ +``` + +## Marking task as done + +Mark your task as done. It will have `[X]` when it is listed again. +Format: `mark ` + +### Marking task as done example + +``` +mark 1 + ____________________________________________________________ + Nice! I've marked this task as done: + [D][X] tP Meeting (by: Friday 16.00pm) + ____________________________________________________________ +``` + +### Marking task as undone + +Mark your task as undone (or unmark). It will revert back to `[]`. +Format: `unmark ` + +``` +unmark 1 + ____________________________________________________________ + Ok, I've marked this task as not done: + [D][ ] tP Meeting (by: Friday 16.00pm) + ____________________________________________________________ +``` + +### Exiting the program + ``` +bye + ____________________________________________________________ + Bye. Hope to see you again soon! + ____________________________________________________________ +``` \ No newline at end of file From 59d2021fd3fe31726fd656dcecdcddbbd00127d5 Mon Sep 17 00:00:00 2001 From: kristianachwan Date: Thu, 2 Mar 2023 04:00:41 +0800 Subject: [PATCH 35/40] Fix typo userguide --- docs/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/README.md b/docs/README.md index 576edd322..eca24dd92 100644 --- a/docs/README.md +++ b/docs/README.md @@ -15,7 +15,7 @@ through those tasks quickly. > Java 11 is recommended to run `Duke` -1. Download the latest duke.jar from here [here](https://github.com/kristianachwan/ip/releases) +1. Download the latest duke.jar from [here](https://github.com/kristianachwan/ip/releases) 2. Go to the directory where you downloaded 3. Run `java -jar duke.jar` From 13b169701aa183887684134ee16aac18aa9f331f Mon Sep 17 00:00:00 2001 From: kristianachwan Date: Thu, 2 Mar 2023 04:06:03 +0800 Subject: [PATCH 36/40] Change user guide filenaming --- docs/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/README.md b/docs/README.md index eca24dd92..e948f8211 100644 --- a/docs/README.md +++ b/docs/README.md @@ -15,9 +15,9 @@ through those tasks quickly. > Java 11 is recommended to run `Duke` -1. Download the latest duke.jar from [here](https://github.com/kristianachwan/ip/releases) +1. Download the latest ip.jar from [here](https://github.com/kristianachwan/ip/releases) 2. Go to the directory where you downloaded -3. Run `java -jar duke.jar` +3. Run `java -jar ip.jar` ## Add ToDo From 89999d66971bc9ee42652850af3e3e0fb44cf8ff Mon Sep 17 00:00:00 2001 From: kristianachwan Date: Thu, 2 Mar 2023 04:19:28 +0800 Subject: [PATCH 37/40] Change filepath of duke.txt --- src/main/java/duke/Duke.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/duke/Duke.java b/src/main/java/duke/Duke.java index a819a0bf1..b5984df6b 100644 --- a/src/main/java/duke/Duke.java +++ b/src/main/java/duke/Duke.java @@ -13,7 +13,7 @@ */ public class Duke { public static void main(String[] args) { - Storage dataAccess = new Storage("data/duke.txt"); + Storage dataAccess = new Storage("duke.txt"); Scanner scanner = new Scanner(System.in); TaskList taskList = new TaskList(); Ui ui = new Ui(taskList); From ae2b710fa3a2666e0c814fc5368d88915f963cb5 Mon Sep 17 00:00:00 2001 From: kristianachwan Date: Thu, 2 Mar 2023 04:27:40 +0800 Subject: [PATCH 38/40] Change the format of printing search results --- src/main/java/duke/boundary/Ui.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/duke/boundary/Ui.java b/src/main/java/duke/boundary/Ui.java index db713398a..c522fbc8c 100644 --- a/src/main/java/duke/boundary/Ui.java +++ b/src/main/java/duke/boundary/Ui.java @@ -108,8 +108,9 @@ public void printSearchedTasks(String[] payloadData) { String keyword = payloadData[0]; ArrayList searchedTasks = taskList.getSearchedTasks(keyword); this.printHorizontalLine(); - for (Task task : searchedTasks) { - System.out.println(task.toString()); + + for (int i = 0; i < searchedTasks.size(); i++) { + System.out.printf("\t" + "%3d." + searchedTasks.get(i).toString(), i + 1); } this.printHorizontalLine(); From 2e3774dde687646ac10a6c6887c160fc1ac1a734 Mon Sep 17 00:00:00 2001 From: kristianachwan Date: Thu, 2 Mar 2023 04:28:35 +0800 Subject: [PATCH 39/40] Add line separator --- duke.txt | 4 ++++ src/main/java/duke/boundary/Ui.java | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 duke.txt diff --git a/duke.txt b/duke.txt new file mode 100644 index 000000000..b4f90de58 --- /dev/null +++ b/duke.txt @@ -0,0 +1,4 @@ + 1. [T][ ] asd + 2. [T][ ] asd2 + 3. [T][ ] asdd2 + 4. [T][ ] sd2 \ No newline at end of file diff --git a/src/main/java/duke/boundary/Ui.java b/src/main/java/duke/boundary/Ui.java index c522fbc8c..f477c5a80 100644 --- a/src/main/java/duke/boundary/Ui.java +++ b/src/main/java/duke/boundary/Ui.java @@ -110,7 +110,7 @@ public void printSearchedTasks(String[] payloadData) { this.printHorizontalLine(); for (int i = 0; i < searchedTasks.size(); i++) { - System.out.printf("\t" + "%3d." + searchedTasks.get(i).toString(), i + 1); + System.out.printf("\t" + "%3d." + searchedTasks.get(i).toString() + System.lineSeparator(), i + 1); } this.printHorizontalLine(); From 89782e8ca94e35b23c5b873e681ffa68606da04c Mon Sep 17 00:00:00 2001 From: kristianachwan Date: Thu, 2 Mar 2023 04:30:04 +0800 Subject: [PATCH 40/40] Update minor mistake on UG --- docs/README.md | 6 +++--- duke.txt | 9 +++++---- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/docs/README.md b/docs/README.md index e948f8211..40283667d 100644 --- a/docs/README.md +++ b/docs/README.md @@ -91,11 +91,11 @@ delete 1 ____________________________________________________________ ``` -## Searching specific tasks +## Finding specific tasks -Search your task based on specific keyword. Format: `search ` +Find your task based on specific keyword. Format: `find ` -### Searching specific tasks example +### Finding specific tasks example ``` find tP diff --git a/duke.txt b/duke.txt index b4f90de58..bf558ed95 100644 --- a/duke.txt +++ b/duke.txt @@ -1,4 +1,5 @@ - 1. [T][ ] asd - 2. [T][ ] asd2 - 3. [T][ ] asdd2 - 4. [T][ ] sd2 \ No newline at end of file + 1. [T][ ] asd1 + 2. [T][ ] asd23 + 3. [T][ ] asd33 + 4. [T][ ] a + 5. [D][ ] asd (by: 2pm) \ No newline at end of file