From cba3a84f12f30ae1bf3933e01f534a1c8f500e7b Mon Sep 17 00:00:00 2001 From: firwer Date: Wed, 25 Jan 2023 00:57:42 +0800 Subject: [PATCH 01/37] Level-0 --- src/main/java/Duke.java | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 5d313334c..44568a5ab 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -1,10 +1,8 @@ public class Duke { public static void main(String[] args) { - String logo = " ____ _ \n" - + "| _ \\ _ _| | _____ \n" - + "| | | | | | | |/ / _ \\\n" - + "| |_| | |_| | < __/\n" - + "|____/ \\__,_|_|\\_\\___|\n"; - System.out.println("Hello from\n" + logo); + String welcome = "Hello! I'm Clippy\n" + + "What can I do for you?\n" + + "Bye. Hope to see you again soon!\n"; + System.out.println(welcome); } } From fa4c68ed65a73d7810d56f65b0aa93366548eeff Mon Sep 17 00:00:00 2001 From: firwer Date: Wed, 25 Jan 2023 11:02:03 +0800 Subject: [PATCH 02/37] Level 0: Greet --- 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 44568a5ab..6ed6bcb6f 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -1,8 +1,14 @@ public class Duke { public static void main(String[] args) { - String welcome = "Hello! I'm Clippy\n" + String logo = " ____ _ \n" + + "| _ \\ _ _| | _____ \n" + + "| | | | | | | |/ / _ \\\n" + + "| |_| | |_| | < __/\n" + + "|____/ \\__,_|_|\\_\\___|\n"; + String welcome = "Hello! I'm Duke\n" + "What can I do for you?\n" + "Bye. Hope to see you again soon!\n"; + System.out.println("Hello from\n" + logo); System.out.println(welcome); } } From b2bac14f79e68b6e413d02697031b72aa08b71cf Mon Sep 17 00:00:00 2001 From: firwer Date: Wed, 25 Jan 2023 21:28:17 +0800 Subject: [PATCH 03/37] Level 1: Greet, Echo, Exit --- src/main/java/Duke.java | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 6ed6bcb6f..7adfede01 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -1,3 +1,4 @@ +import java.util.Scanner; public class Duke { public static void main(String[] args) { String logo = " ____ _ \n" @@ -6,9 +7,20 @@ public static void main(String[] args) { + "| |_| | |_| | < __/\n" + "|____/ \\__,_|_|\\_\\___|\n"; String welcome = "Hello! I'm Duke\n" - + "What can I do for you?\n" - + "Bye. Hope to see you again soon!\n"; + + "What can I do for you?\n"; System.out.println("Hello from\n" + logo); System.out.println(welcome); - } + while(true) { + Scanner s = new Scanner(System.in); // Create a Scanner object + String echo = s.nextLine(); // Read user input + if (echo.equals("bye")) { + System.out.println("Bye. Hope to see you again soon!"); + break; + } else { + System.out.println("*****************************"); + System.out.println(echo); + System.out.println("*****************************"); + } + } + } } From fe1d44392b22d3d57cacd64566afd1d0ffdeec78 Mon Sep 17 00:00:00 2001 From: firwer Date: Thu, 26 Jan 2023 00:17:37 +0800 Subject: [PATCH 04/37] Level 2: Add, List --- src/main/java/Duke.java | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 7adfede01..aba4268c9 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -1,4 +1,6 @@ +import java.util.ArrayList; import java.util.Scanner; + public class Duke { public static void main(String[] args) { String logo = " ____ _ \n" @@ -9,18 +11,27 @@ public static void main(String[] args) { String welcome = "Hello! I'm Duke\n" + "What can I do for you?\n"; System.out.println("Hello from\n" + logo); + System.out.println(welcome); - while(true) { + ArrayList listItems = new ArrayList<>(); + while (true) { + Scanner s = new Scanner(System.in); // Create a Scanner object String echo = s.nextLine(); // Read user input + if (echo.equals("bye")) { System.out.println("Bye. Hope to see you again soon!"); break; - } else { + } else if (echo.equals("list")) { System.out.println("*****************************"); - System.out.println(echo); + for (int i = 0; i < listItems.size(); i++) { + System.out.println(i + 1 + ". " + listItems.get(i)); + } System.out.println("*****************************"); - } + } else { + listItems.add(echo); + System.out.println("added: " + echo); } } + } } From 3cefb715584a3b881bbe14bb8412e4812bf5480e Mon Sep 17 00:00:00 2001 From: firwer Date: Thu, 26 Jan 2023 01:33:46 +0800 Subject: [PATCH 05/37] Level 3: Mark as done --- src/main/java/Duke.java | 18 +++++++++++---- src/main/java/Task.java | 21 +++++++++++++++++ src/main/java/TaskList.java | 45 +++++++++++++++++++++++++++++++++++++ 3 files changed, 80 insertions(+), 4 deletions(-) create mode 100644 src/main/java/Task.java create mode 100644 src/main/java/TaskList.java diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index aba4268c9..8790cc419 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -14,6 +14,8 @@ public static void main(String[] args) { System.out.println(welcome); ArrayList listItems = new ArrayList<>(); + TaskList taskList = new TaskList(); + while (true) { Scanner s = new Scanner(System.in); // Create a Scanner object @@ -24,12 +26,20 @@ public static void main(String[] args) { break; } else if (echo.equals("list")) { System.out.println("*****************************"); - for (int i = 0; i < listItems.size(); i++) { - System.out.println(i + 1 + ". " + listItems.get(i)); - } + taskList.ListTask(); System.out.println("*****************************"); + } else if (echo.contains("unmark")) { + String[] output = echo.split(" "); + if (!taskList.MarkTask(Integer.parseInt(output[1]), false)) { + System.out.println("Uh-oh! Task Not Found!"); + } + } else if (echo.contains("mark")) { + String[] output = echo.split(" "); + if (!taskList.MarkTask(Integer.parseInt(output[1]), true)) { + System.out.println("Uh-oh! Task Not Found!"); + } } else { - listItems.add(echo); + taskList.AddTask(echo); System.out.println("added: " + echo); } } diff --git a/src/main/java/Task.java b/src/main/java/Task.java new file mode 100644 index 000000000..fdfd9bef5 --- /dev/null +++ b/src/main/java/Task.java @@ -0,0 +1,21 @@ +public class Task { + private String taskName = ""; + private boolean completed = false; + + public Task(String taskName) { + this.taskName = taskName; + this.completed = false; + } + + public String GetTaskName() { + return this.taskName; + } + + public void SetCompleted(boolean completed) { + this.completed = completed; + } + + public boolean IsCompleted() { + return completed; + } +} diff --git a/src/main/java/TaskList.java b/src/main/java/TaskList.java new file mode 100644 index 000000000..f537ca1e6 --- /dev/null +++ b/src/main/java/TaskList.java @@ -0,0 +1,45 @@ +import java.util.ArrayList; + +public class TaskList { + private static ArrayList TaskList = new ArrayList<>(); + + public void AddTask(String taskName) { + Task t = new Task(taskName); + TaskList.add(t); + } + + public boolean MarkTask(int taskNumber, boolean mark) { + if (taskNumber <= 0 || taskNumber > TaskList.size()) { + return false; + } else { + if (mark && TaskList.get(taskNumber - 1).IsCompleted()) { + System.out.println("Task already marked as completed!"); + } else if (!mark && !TaskList.get(taskNumber - 1).IsCompleted()) { + System.out.println("Task already marked as not completed!"); + } else { + TaskList.get(taskNumber - 1).SetCompleted(mark); + if (mark) { + System.out.println("Nice! I've marked this task as done:"); + System.out.println("[X] " + TaskList.get(taskNumber - 1).GetTaskName()); + } else { + System.out.println("OK, I've marked this task as not done yet:"); + System.out.println("[ ] " + TaskList.get(taskNumber - 1).GetTaskName()); + } + } + return true; + } + } + + public void ListTask() { + System.out.println("Here are the tasks in your list:"); + for (int i = 0; i < TaskList.size(); i++) { + if (TaskList.get(i).IsCompleted()) { + System.out.println(i + 1 + ".[X] " + TaskList.get(i).GetTaskName()); + } else { + System.out.println(i + 1 + ".[ ] " + TaskList.get(i).GetTaskName()); + } + + } + } +} + From 31390cc0ffd6afde3cc35aa01fea5ebaa2681914 Mon Sep 17 00:00:00 2001 From: firwer Date: Mon, 30 Jan 2023 00:38:44 +0800 Subject: [PATCH 06/37] A-CodingStandard: format code to meet requirement --- src/main/java/TaskList.java | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/main/java/TaskList.java b/src/main/java/TaskList.java index f537ca1e6..8f10a7d18 100644 --- a/src/main/java/TaskList.java +++ b/src/main/java/TaskList.java @@ -1,29 +1,29 @@ import java.util.ArrayList; public class TaskList { - private static ArrayList TaskList = new ArrayList<>(); + private static ArrayList list = new ArrayList<>(); public void AddTask(String taskName) { Task t = new Task(taskName); - TaskList.add(t); + list.add(t); } public boolean MarkTask(int taskNumber, boolean mark) { - if (taskNumber <= 0 || taskNumber > TaskList.size()) { + if (taskNumber <= 0 || taskNumber > list.size()) { return false; } else { - if (mark && TaskList.get(taskNumber - 1).IsCompleted()) { + if (mark && list.get(taskNumber - 1).IsCompleted()) { System.out.println("Task already marked as completed!"); - } else if (!mark && !TaskList.get(taskNumber - 1).IsCompleted()) { + } else if (!mark && !list.get(taskNumber - 1).IsCompleted()) { System.out.println("Task already marked as not completed!"); } else { - TaskList.get(taskNumber - 1).SetCompleted(mark); + list.get(taskNumber - 1).SetCompleted(mark); if (mark) { System.out.println("Nice! I've marked this task as done:"); - System.out.println("[X] " + TaskList.get(taskNumber - 1).GetTaskName()); + System.out.println("[X] " + list.get(taskNumber - 1).GetTaskName()); } else { System.out.println("OK, I've marked this task as not done yet:"); - System.out.println("[ ] " + TaskList.get(taskNumber - 1).GetTaskName()); + System.out.println("[ ] " + list.get(taskNumber - 1).GetTaskName()); } } return true; @@ -32,11 +32,11 @@ public boolean MarkTask(int taskNumber, boolean mark) { public void ListTask() { System.out.println("Here are the tasks in your list:"); - for (int i = 0; i < TaskList.size(); i++) { - if (TaskList.get(i).IsCompleted()) { - System.out.println(i + 1 + ".[X] " + TaskList.get(i).GetTaskName()); + for (int i = 0; i < list.size(); i++) { + if (list.get(i).IsCompleted()) { + System.out.println(i + 1 + ".[X] " + list.get(i).GetTaskName()); } else { - System.out.println(i + 1 + ".[ ] " + TaskList.get(i).GetTaskName()); + System.out.println(i + 1 + ".[ ] " + list.get(i).GetTaskName()); } } From 6e29b6591c25843baec942188c42517416dafa49 Mon Sep 17 00:00:00 2001 From: firwer Date: Mon, 30 Jan 2023 12:10:47 +0800 Subject: [PATCH 07/37] Level-4 - feat: add todos, deadlines, events tracking --- src/main/java/Deadline.java | 20 ++++++++++++++++++++ src/main/java/Duke.java | 26 +++++++++++++++++++++----- src/main/java/Event.java | 27 +++++++++++++++++++++++++++ src/main/java/Task.java | 6 ++++++ src/main/java/TaskList.java | 24 +++++++++++++++++------- src/main/java/Todo.java | 15 +++++++++++++++ 6 files changed, 106 insertions(+), 12 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..b956fdd32 --- /dev/null +++ b/src/main/java/Deadline.java @@ -0,0 +1,20 @@ +public class Deadline extends Task { + private String byWhen = ""; + + public Deadline(String taskName, String byWhen) { + super(taskName); + this.byWhen = byWhen; + } + + public String getByWhen() { + return byWhen; + } + + public String toString() { + if (super.IsCompleted()) { + return ".[D][X] " + super.GetTaskName() + "(by: " + getByWhen() + ")"; + } else { + return ".[D][ ] " + super.GetTaskName() + "(by: " + getByWhen() + ")"; + } + } +} diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 8790cc419..ec850b791 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -17,7 +17,7 @@ public static void main(String[] args) { TaskList taskList = new TaskList(); while (true) { - + String[] output; Scanner s = new Scanner(System.in); // Create a Scanner object String echo = s.nextLine(); // Read user input @@ -29,18 +29,34 @@ public static void main(String[] args) { taskList.ListTask(); System.out.println("*****************************"); } else if (echo.contains("unmark")) { - String[] output = echo.split(" "); + output = echo.split(" "); if (!taskList.MarkTask(Integer.parseInt(output[1]), false)) { System.out.println("Uh-oh! Task Not Found!"); } } else if (echo.contains("mark")) { - String[] output = echo.split(" "); + output = echo.split(" "); if (!taskList.MarkTask(Integer.parseInt(output[1]), true)) { System.out.println("Uh-oh! Task Not Found!"); } + } else if (echo.contains("todo")) { + taskList.AddTask(echo.substring(5)); + System.out.println("Got it. I've added this task:"); + System.out.println("[T][ ] " + echo.substring(5)); + System.out.println("Now you have " + taskList.GetTaskCount() + " tasks in the list"); + } else if (echo.contains("deadline")) { + output = echo.split("/"); + taskList.AddTask(output[0].substring(9), output[1].substring(3)); + System.out.println("Got it. I've added this task:"); + System.out.println("[D][ ] " + output[0].substring(9) + "(by: " + output[1].substring(3) + ")"); + System.out.println("Now you have " + taskList.GetTaskCount() + " tasks in the list"); + } else if (echo.contains("event")) { + output = echo.split("/"); + taskList.AddTask(output[0].substring(6), output[1].substring(5), output[2].substring(3)); + System.out.println("Got it. I've added this task:"); + System.out.println("[E][ ] " + output[0].substring(6) + "(from: " + output[1].substring(5) + " to: " + output[2].substring(3) + ")"); + System.out.println("Now you have " + taskList.GetTaskCount() + " tasks in the list"); } else { - taskList.AddTask(echo); - System.out.println("added: " + echo); + System.out.println("I don't understand what you mean, please try again!"); } } } diff --git a/src/main/java/Event.java b/src/main/java/Event.java new file mode 100644 index 000000000..c823e1ffd --- /dev/null +++ b/src/main/java/Event.java @@ -0,0 +1,27 @@ +public class Event extends Task { + + private String startWhen = ""; + private String endWhen = ""; + + public Event(String taskName, String startWhen, String endWhen) { + super(taskName); + this.startWhen = startWhen; + this.endWhen = endWhen; + } + + public String getStartWhen() { + return startWhen; + } + + public String getEndWhen() { + return endWhen; + } + + public String toString() { + if (super.IsCompleted()) { + return ".[E][X] " + super.GetTaskName() + "(from: " + getStartWhen() + " to: " + getEndWhen() + ")"; + } else { + return ".[E][ ] " + super.GetTaskName() + "(from: " + getStartWhen() + " to: " + getEndWhen() + ")"; + } + } +} diff --git a/src/main/java/Task.java b/src/main/java/Task.java index fdfd9bef5..2fd6e3752 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -18,4 +18,10 @@ public void SetCompleted(boolean completed) { public boolean IsCompleted() { return completed; } + + public String toString() { + return ""; + } + + ; } diff --git a/src/main/java/TaskList.java b/src/main/java/TaskList.java index 8f10a7d18..1d143bda8 100644 --- a/src/main/java/TaskList.java +++ b/src/main/java/TaskList.java @@ -4,10 +4,20 @@ public class TaskList { private static ArrayList list = new ArrayList<>(); public void AddTask(String taskName) { - Task t = new Task(taskName); + Todo t = new Todo(taskName); list.add(t); } + public void AddTask(String taskName, String byWhen) { + Deadline d = new Deadline(taskName, byWhen); + list.add(d); + } + + public void AddTask(String taskName, String startWhen, String endWhen) { + Event e = new Event(taskName, startWhen, endWhen); + list.add(e); + } + public boolean MarkTask(int taskNumber, boolean mark) { if (taskNumber <= 0 || taskNumber > list.size()) { return false; @@ -33,13 +43,13 @@ public boolean MarkTask(int taskNumber, boolean mark) { public void ListTask() { System.out.println("Here are the tasks in your list:"); for (int i = 0; i < list.size(); i++) { - if (list.get(i).IsCompleted()) { - System.out.println(i + 1 + ".[X] " + list.get(i).GetTaskName()); - } else { - System.out.println(i + 1 + ".[ ] " + list.get(i).GetTaskName()); - } - + System.out.print(i + 1); + System.out.println(list.get(i).toString()); } } + + public int GetTaskCount() { + return list.size(); + } } diff --git a/src/main/java/Todo.java b/src/main/java/Todo.java new file mode 100644 index 000000000..684374a0f --- /dev/null +++ b/src/main/java/Todo.java @@ -0,0 +1,15 @@ +public class Todo extends Task { + + public Todo(String taskName) { + super(taskName); + } + + public String toString() { + if (super.IsCompleted()) { + return ".[T][X] " + super.GetTaskName(); + } else { + return ".[T][ ] " + super.GetTaskName(); + } + } + +} From 431c1060d84ee550e7b4a36a38636a79cfe19640 Mon Sep 17 00:00:00 2001 From: firwer Date: Mon, 30 Jan 2023 13:30:59 +0800 Subject: [PATCH 08/37] A-TextUiTesting --- text-ui-test/EXPECTED.TXT | 66 +++++++++++++++++++++++++++++++++++++-- text-ui-test/input.txt | 18 +++++++++++ 2 files changed, 82 insertions(+), 2 deletions(-) diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index 657e74f6e..1826d5825 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -1,7 +1,69 @@ Hello from - ____ _ -| _ \ _ _| | _____ + ____ _ +| _ \ _ _| | _____ | | | | | | | |/ / _ \ | |_| | |_| | < __/ |____/ \__,_|_|\_\___| +Hello! I'm Duke +What can I do for you? + +Got it. I've added this task: +[T][ ] return books +Now you have 1 tasks in the list +Got it. I've added this task: +[T][ ] return laundry +Now you have 2 tasks in the list +***************************** +Here are the tasks in your list: +1.[T][ ] return books +2.[T][ ] return laundry +***************************** +Got it. I've added this task: +[D][ ] assignment 1 (by: Next monday) +Now you have 3 tasks in the list +Got it. I've added this task: +[D][ ] lab 10 (by: Next tues) +Now you have 4 tasks in the list +***************************** +Here are the tasks in your list: +1.[T][ ] return books +2.[T][ ] return laundry +3.[D][ ] assignment 1 (by: Next monday) +4.[D][ ] lab 10 (by: Next tues) +***************************** +I don't understand what you mean, please try again! +I don't understand what you mean, please try again! +Got it. I've added this task: +[E][ ] funfair 1 (from: 21 jan to: 4 feb) +Now you have 5 tasks in the list +Got it. I've added this task: +[E][ ] fund raising (from: 30 feb to: 31 mar) +Now you have 6 tasks in the list +***************************** +Here are the tasks in your list: +1.[T][ ] return books +2.[T][ ] return laundry +3.[D][ ] assignment 1 (by: Next monday) +4.[D][ ] lab 10 (by: Next tues) +5.[E][ ] funfair 1 (from: 21 jan to: 4 feb) +6.[E][ ] fund raising (from: 30 feb to: 31 mar) +***************************** +Nice! I've marked this task as done: +[X] assignment 1 +Nice! I've marked this task as done: +[X] funfair 1 +Uh-oh! Task Not Found! +Task already marked as not completed! +OK, I've marked this task as not done yet: +[ ] assignment 1 +Task already marked as completed! +***************************** +Here are the tasks in your list: +1.[T][ ] return books +2.[T][ ] return laundry +3.[D][ ] assignment 1 (by: Next monday) +4.[D][ ] lab 10 (by: Next tues) +5.[E][X] funfair 1 (from: 21 jan to: 4 feb) +6.[E][ ] fund raising (from: 30 feb to: 31 mar) +***************************** \ No newline at end of file diff --git a/text-ui-test/input.txt b/text-ui-test/input.txt index e69de29bb..dde8dc667 100644 --- a/text-ui-test/input.txt +++ b/text-ui-test/input.txt @@ -0,0 +1,18 @@ +todo return books +todo return laundry +list +deadline assignment 1 /by Next monday +deadline lab 10 /by Next tues +list +garbage 12323 +garbage asdasda +event funfair 1 /from 21 jan /to 4 feb +event fund raising /from 30 feb /to 31 mar +list +mark 3 +mark 5 +mark 100 +unmark 2 +unmark 3 +mark 5 +list \ No newline at end of file From 0d61ab198ca3e87c64041be895655b2db9b271b5 Mon Sep 17 00:00:00 2001 From: firwer Date: Wed, 1 Feb 2023 00:27:54 +0800 Subject: [PATCH 09/37] refactor: introduce display class to handle all CLI display requirements --- src/main/java/Display.java | 2 ++ src/main/java/Duke.java | 63 --------------------------------- src/main/java/Sage.java | 70 +++++++++++++++++++++++++++++++++++++ src/main/java/TaskType.java | 2 ++ 4 files changed, 74 insertions(+), 63 deletions(-) create mode 100644 src/main/java/Display.java delete mode 100644 src/main/java/Duke.java create mode 100644 src/main/java/Sage.java create mode 100644 src/main/java/TaskType.java diff --git a/src/main/java/Display.java b/src/main/java/Display.java new file mode 100644 index 000000000..369421d37 --- /dev/null +++ b/src/main/java/Display.java @@ -0,0 +1,2 @@ +package PACKAGE_NAME;public class Display { +} diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java deleted file mode 100644 index ec850b791..000000000 --- a/src/main/java/Duke.java +++ /dev/null @@ -1,63 +0,0 @@ -import java.util.ArrayList; -import java.util.Scanner; - -public class Duke { - public static void main(String[] args) { - String logo = " ____ _ \n" - + "| _ \\ _ _| | _____ \n" - + "| | | | | | | |/ / _ \\\n" - + "| |_| | |_| | < __/\n" - + "|____/ \\__,_|_|\\_\\___|\n"; - String welcome = "Hello! I'm Duke\n" - + "What can I do for you?\n"; - System.out.println("Hello from\n" + logo); - - System.out.println(welcome); - ArrayList listItems = new ArrayList<>(); - TaskList taskList = new TaskList(); - - while (true) { - String[] output; - Scanner s = new Scanner(System.in); // Create a Scanner object - String echo = s.nextLine(); // Read user input - - if (echo.equals("bye")) { - System.out.println("Bye. Hope to see you again soon!"); - break; - } else if (echo.equals("list")) { - System.out.println("*****************************"); - taskList.ListTask(); - System.out.println("*****************************"); - } else if (echo.contains("unmark")) { - output = echo.split(" "); - if (!taskList.MarkTask(Integer.parseInt(output[1]), false)) { - System.out.println("Uh-oh! Task Not Found!"); - } - } else if (echo.contains("mark")) { - output = echo.split(" "); - if (!taskList.MarkTask(Integer.parseInt(output[1]), true)) { - System.out.println("Uh-oh! Task Not Found!"); - } - } else if (echo.contains("todo")) { - taskList.AddTask(echo.substring(5)); - System.out.println("Got it. I've added this task:"); - System.out.println("[T][ ] " + echo.substring(5)); - System.out.println("Now you have " + taskList.GetTaskCount() + " tasks in the list"); - } else if (echo.contains("deadline")) { - output = echo.split("/"); - taskList.AddTask(output[0].substring(9), output[1].substring(3)); - System.out.println("Got it. I've added this task:"); - System.out.println("[D][ ] " + output[0].substring(9) + "(by: " + output[1].substring(3) + ")"); - System.out.println("Now you have " + taskList.GetTaskCount() + " tasks in the list"); - } else if (echo.contains("event")) { - output = echo.split("/"); - taskList.AddTask(output[0].substring(6), output[1].substring(5), output[2].substring(3)); - System.out.println("Got it. I've added this task:"); - System.out.println("[E][ ] " + output[0].substring(6) + "(from: " + output[1].substring(5) + " to: " + output[2].substring(3) + ")"); - System.out.println("Now you have " + taskList.GetTaskCount() + " tasks in the list"); - } else { - System.out.println("I don't understand what you mean, please try again!"); - } - } - } -} diff --git a/src/main/java/Sage.java b/src/main/java/Sage.java new file mode 100644 index 000000000..eb7eb0a2b --- /dev/null +++ b/src/main/java/Sage.java @@ -0,0 +1,70 @@ +import java.util.ArrayList; +import java.util.Scanner; + +public class Sage { + public static void main(String[] args) { + String logo = + "─────────────────────────────────────────────────────────────\n" + + "─██████████████─██████████████─██████████████─██████████████─\n" + + "─██░░░░░░░░░░██─██░░░░░░░░░░██─██░░░░░░░░░░██─██░░░░░░░░░░██─\n" + + "─██░░██████████─██░░██████░░██─██░░██████████─██░░██████████─\n" + + "─██░░██─────────██░░██──██░░██─██░░██─────────██░░██─────────\n" + + "─██░░██████████─██░░██████░░██─██░░██─────────██░░██████████─\n" + + "─██░░░░░░░░░░██─██░░░░░░░░░░██─██░░██──██████─██░░░░░░░░░░██─\n" + + "─██████████░░██─██░░██████░░██─██░░██──██░░██─██░░██████████─\n" + + "─────────██░░██─██░░██──██░░██─██░░██──██░░██─██░░██─────────\n" + + "─██████████░░██─██░░██──██░░██─██░░██████░░██─██░░██████████─\n" + + "─██░░░░░░░░░░██─██░░██──██░░██─██░░░░░░░░░░██─██░░░░░░░░░░██─\n" + + "─██████████████─██████──██████─██████████████─██████████████─\n" + + "─────────────────────────────────────────────────────────────"; + String welcome = "Hello! I'm Duke\n" + + "What can I do for you?\n"; + System.out.println("Hello from\n" + logo); + + System.out.println(welcome); + TaskList taskList = new TaskList(); + Scanner s = new Scanner(System.in); + while (s.hasNextLine()) { + String[] output; + String echo = s.nextLine(); // Read user input + + if (echo.equals("bye")) { + System.out.println("Bye. Hope to see you again soon!"); + break; + } else if (echo.equals("list")) { + System.out.println("*****************************"); + taskList.ListTask(); + System.out.println("*****************************"); + } else if (echo.contains("unmark")) { + output = echo.split(" "); + if (!taskList.MarkTask(Integer.parseInt(output[1]), false)) { + System.out.println("Uh-oh! Task Not Found!"); + } + } else if (echo.contains("mark")) { + output = echo.split(" "); + if (!taskList.MarkTask(Integer.parseInt(output[1]), true)) { + System.out.println("Uh-oh! Task Not Found!"); + } + } else if (echo.contains("todo")) { + taskList.AddTask(echo.substring(5)); + System.out.println("Got it. I've added this task:"); + System.out.println("[T][ ] " + echo.substring(5)); + System.out.println("Now you have " + taskList.GetTaskCount() + " tasks in the list"); + } else if (echo.contains("deadline")) { + output = echo.split("/"); + taskList.AddTask(output[0].substring(9), output[1].substring(3)); + System.out.println("Got it. I've added this task:"); + System.out.println("[D][ ] " + output[0].substring(9) + "(by: " + output[1].substring(3) + ")"); + System.out.println("Now you have " + taskList.GetTaskCount() + " tasks in the list"); + } else if (echo.contains("event")) { + output = echo.split("/"); + taskList.AddTask(output[0].substring(6), output[1].substring(5), output[2].substring(3)); + System.out.println("Got it. I've added this task:"); + System.out.println("[E][ ] " + output[0].substring(6) + "(from: " + output[1].substring(5) + " to: " + output[2].substring(3) + ")"); + System.out.println("Now you have " + taskList.GetTaskCount() + " tasks in the list"); + } else { + System.out.println("I don't understand what you mean, please try again!"); + } + } + } +} diff --git a/src/main/java/TaskType.java b/src/main/java/TaskType.java new file mode 100644 index 000000000..b8b84b0d4 --- /dev/null +++ b/src/main/java/TaskType.java @@ -0,0 +1,2 @@ +package PACKAGE_NAME;public enum TaskType { +} From 30316f243e8fe3db7ca0f3737cc8bd353b9bb1bd Mon Sep 17 00:00:00 2001 From: firwer Date: Wed, 1 Feb 2023 00:35:28 +0800 Subject: [PATCH 10/37] docs: add param docs for display class functions --- src/main/java/Display.java | 104 +++++++++++++++++++++++++++++++++++- src/main/java/Sage.java | 77 +++++++++----------------- src/main/java/TaskList.java | 34 ++++++------ src/main/java/TaskType.java | 5 +- text-ui-test/EXPECTED.TXT | 17 +++--- 5 files changed, 156 insertions(+), 81 deletions(-) diff --git a/src/main/java/Display.java b/src/main/java/Display.java index 369421d37..39eceadd0 100644 --- a/src/main/java/Display.java +++ b/src/main/java/Display.java @@ -1,2 +1,104 @@ -package PACKAGE_NAME;public class Display { +import java.util.ArrayList; + +public class Display { + private static String line = + "█████╗█████╗█████╗█████╗█████╗█████╗█████╗\n" + + "╚════╝╚════╝╚════╝╚════╝╚════╝╚════╝╚════╝"; + + public void WelcomeUser() { + String logo = "░██████╗░█████╗░░██████╗░███████╗\n" + + "██╔════╝██╔══██╗██╔════╝░██╔════╝\n" + + "╚█████╗░███████║██║░░██╗░█████╗░░\n" + + "░╚═══██╗██╔══██║██║░░╚██╗██╔══╝░░\n" + + "██████╔╝██║░░██║╚██████╔╝███████╗\n" + + "╚═════╝░╚═╝░░╚═╝░╚═════╝░╚══════╝"; + String welcome = "Hello! I'm SAGE, the knowledgeable one\n" + + "What can I do for you today?\n"; + System.out.println(logo); + System.out.println(welcome); + } + + public void GoodByeUser() { + System.out.println("Bye. Hope to see you again soon!"); + } + + /** + * Displays the list of tasks stored in the taskList. + * + * @param taskList The TaskList object that contains the tasks to be displayed. + */ + public void DisplayTask(TaskList taskList) { + System.out.println(line); + taskList.ListTask(); + System.out.println(line); + } + + /** + * This method prints a message to the console indicating the addition of a task to the task list and its details. + * The message includes the type of task, the task description and the task count after adding the task. + * + * @param userInput The input entered by the user in the form of an array of strings after character split + * @param taskType The type of task being added (TODO, EVENT or DEADLINE) + * @param taskList The list of tasks to which the new task is being added + **/ + public void AddedTask(String[] userInput, TaskType taskType, TaskList taskList) { + System.out.println(line); + switch (taskType) { + case TODO: + System.out.println("Got it. I've added this task:"); + System.out.println("[T][ ] " + userInput[0].substring(5)); + System.out.println("Now you have " + taskList.GetTaskCount() + " tasks in the list"); + break; + case EVENT: + System.out.println("Got it. I've added this task:"); + System.out.println("[E][ ] " + userInput[0].substring(6) + "(from: " + userInput[1].substring(5) + " to: " + userInput[2].substring(3) + ")"); + System.out.println("Now you have " + taskList.GetTaskCount() + " tasks in the list"); + break; + case DEADLINE: + System.out.println("Got it. I've added this task:"); + System.out.println("[D][ ] " + userInput[0].substring(9) + "(by: " + userInput[1].substring(3) + ")"); + System.out.println("Now you have " + taskList.GetTaskCount() + " tasks in the list"); + break; + } + System.out.println(line); + } + + public void TaskNotFound() { + System.out.println("Uh-oh! Task Not Found!"); + } + + public void UnknownInput() { + System.out.println("I don't understand what you mean, please try again!"); + } + + public void InvalidUnmark() { + System.out.println("Task already marked as not completed!"); + } + + public void InvalidMark() { + System.out.println("Task already marked as completed!"); + } + + /** + * This method is used to display a marked task as not done in the task list. + * + * @param list the list of tasks + * @param taskNumber the taskNumber index that is to be unmarked + */ + public void ValidUnmark(ArrayList list, int taskNumber) { + System.out.println("OK, I've marked this task as not done yet:"); + System.out.println("[ ] " + list.get(taskNumber - 1).GetTaskName()); + } + + /** + * This method is used to display an unmarked task as done in the task list. + * + * @param list the list of tasks + * @param taskNumber the taskNumber index that is to be marked + */ + public void ValidMark(ArrayList list, int taskNumber) { + System.out.println("Nice! I've marked this task as done:"); + System.out.println("[X] " + list.get(taskNumber - 1).GetTaskName()); + } + } diff --git a/src/main/java/Sage.java b/src/main/java/Sage.java index eb7eb0a2b..99b367ac3 100644 --- a/src/main/java/Sage.java +++ b/src/main/java/Sage.java @@ -3,67 +3,38 @@ public class Sage { public static void main(String[] args) { - String logo = - "─────────────────────────────────────────────────────────────\n" + - "─██████████████─██████████████─██████████████─██████████████─\n" + - "─██░░░░░░░░░░██─██░░░░░░░░░░██─██░░░░░░░░░░██─██░░░░░░░░░░██─\n" + - "─██░░██████████─██░░██████░░██─██░░██████████─██░░██████████─\n" + - "─██░░██─────────██░░██──██░░██─██░░██─────────██░░██─────────\n" + - "─██░░██████████─██░░██████░░██─██░░██─────────██░░██████████─\n" + - "─██░░░░░░░░░░██─██░░░░░░░░░░██─██░░██──██████─██░░░░░░░░░░██─\n" + - "─██████████░░██─██░░██████░░██─██░░██──██░░██─██░░██████████─\n" + - "─────────██░░██─██░░██──██░░██─██░░██──██░░██─██░░██─────────\n" + - "─██████████░░██─██░░██──██░░██─██░░██████░░██─██░░██████████─\n" + - "─██░░░░░░░░░░██─██░░██──██░░██─██░░░░░░░░░░██─██░░░░░░░░░░██─\n" + - "─██████████████─██████──██████─██████████████─██████████████─\n" + - "─────────────────────────────────────────────────────────────"; - String welcome = "Hello! I'm Duke\n" - + "What can I do for you?\n"; - System.out.println("Hello from\n" + logo); - - System.out.println(welcome); + Display UI = new Display(); TaskList taskList = new TaskList(); Scanner s = new Scanner(System.in); + UI.WelcomeUser(); while (s.hasNextLine()) { String[] output; - String echo = s.nextLine(); // Read user input - - if (echo.equals("bye")) { - System.out.println("Bye. Hope to see you again soon!"); + String input = s.nextLine(); + if (input.equals("bye")) { + UI.GoodByeUser(); break; - } else if (echo.equals("list")) { - System.out.println("*****************************"); - taskList.ListTask(); - System.out.println("*****************************"); - } else if (echo.contains("unmark")) { - output = echo.split(" "); - if (!taskList.MarkTask(Integer.parseInt(output[1]), false)) { - System.out.println("Uh-oh! Task Not Found!"); - } - } else if (echo.contains("mark")) { - output = echo.split(" "); - if (!taskList.MarkTask(Integer.parseInt(output[1]), true)) { - System.out.println("Uh-oh! Task Not Found!"); - } - } else if (echo.contains("todo")) { - taskList.AddTask(echo.substring(5)); - System.out.println("Got it. I've added this task:"); - System.out.println("[T][ ] " + echo.substring(5)); - System.out.println("Now you have " + taskList.GetTaskCount() + " tasks in the list"); - } else if (echo.contains("deadline")) { - output = echo.split("/"); + } else if (input.equals("list")) { + UI.DisplayTask(taskList); + } else if (input.contains("unmark")) { + output = input.split(" "); + taskList.UnmarkTask(Integer.parseInt(output[1]), UI); + } else if (input.contains("mark")) { + output = input.split(" "); + taskList.MarkTask(Integer.parseInt(output[1]), UI); + } else if (input.contains("todo")) { + taskList.AddTask(input.substring(5)); + output = input.split("/"); + UI.AddedTask(output, TaskType.TODO, taskList); + } else if (input.contains("deadline")) { + output = input.split("/"); taskList.AddTask(output[0].substring(9), output[1].substring(3)); - System.out.println("Got it. I've added this task:"); - System.out.println("[D][ ] " + output[0].substring(9) + "(by: " + output[1].substring(3) + ")"); - System.out.println("Now you have " + taskList.GetTaskCount() + " tasks in the list"); - } else if (echo.contains("event")) { - output = echo.split("/"); + UI.AddedTask(output, TaskType.DEADLINE, taskList); + } else if (input.contains("event")) { + output = input.split("/"); taskList.AddTask(output[0].substring(6), output[1].substring(5), output[2].substring(3)); - System.out.println("Got it. I've added this task:"); - System.out.println("[E][ ] " + output[0].substring(6) + "(from: " + output[1].substring(5) + " to: " + output[2].substring(3) + ")"); - System.out.println("Now you have " + taskList.GetTaskCount() + " tasks in the list"); + UI.AddedTask(output, TaskType.EVENT, taskList); } else { - System.out.println("I don't understand what you mean, please try again!"); + UI.UnknownInput(); } } } diff --git a/src/main/java/TaskList.java b/src/main/java/TaskList.java index 1d143bda8..4c58bae1c 100644 --- a/src/main/java/TaskList.java +++ b/src/main/java/TaskList.java @@ -18,25 +18,25 @@ public void AddTask(String taskName, String startWhen, String endWhen) { list.add(e); } - public boolean MarkTask(int taskNumber, boolean mark) { + public void UnmarkTask(int taskNumber, Display UI) { if (taskNumber <= 0 || taskNumber > list.size()) { - return false; + UI.TaskNotFound(); + } else if (!list.get(taskNumber - 1).IsCompleted()) { + UI.InvalidUnmark(); } else { - if (mark && list.get(taskNumber - 1).IsCompleted()) { - System.out.println("Task already marked as completed!"); - } else if (!mark && !list.get(taskNumber - 1).IsCompleted()) { - System.out.println("Task already marked as not completed!"); - } else { - list.get(taskNumber - 1).SetCompleted(mark); - if (mark) { - System.out.println("Nice! I've marked this task as done:"); - System.out.println("[X] " + list.get(taskNumber - 1).GetTaskName()); - } else { - System.out.println("OK, I've marked this task as not done yet:"); - System.out.println("[ ] " + list.get(taskNumber - 1).GetTaskName()); - } - } - return true; + list.get(taskNumber - 1).SetCompleted(false); + UI.ValidUnmark(list, taskNumber); + } + } + + public void MarkTask(int taskNumber, Display UI) { + if (taskNumber <= 0 || taskNumber > list.size()) { + UI.TaskNotFound(); + } else if (list.get(taskNumber - 1).IsCompleted()) { + UI.InvalidMark(); + } else { + list.get(taskNumber - 1).SetCompleted(true); + UI.ValidMark(list, taskNumber); } } diff --git a/src/main/java/TaskType.java b/src/main/java/TaskType.java index b8b84b0d4..3cb851374 100644 --- a/src/main/java/TaskType.java +++ b/src/main/java/TaskType.java @@ -1,2 +1,5 @@ -package PACKAGE_NAME;public enum TaskType { +public enum TaskType { + DEADLINE, + TODO, + EVENT } diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index 1826d5825..3324ce6c9 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -1,12 +1,11 @@ -Hello from - ____ _ -| _ \ _ _| | _____ -| | | | | | | |/ / _ \ -| |_| | |_| | < __/ -|____/ \__,_|_|\_\___| - -Hello! I'm Duke -What can I do for you? +░██████╗░█████╗░░██████╗░███████╗ +██╔════╝██╔══██╗██╔════╝░██╔════╝ +╚█████╗░███████║██║░░██╗░█████╗░░ +░╚═══██╗██╔══██║██║░░╚██╗██╔══╝░░ +██████╔╝██║░░██║╚██████╔╝███████╗ +╚═════╝░╚═╝░░╚═╝░╚═════╝░╚══════╝ +Hello! I'm SAGE, the knowledgeable one +What can I do for you today? Got it. I've added this task: [T][ ] return books From a66e9868cac923f47bc98bd5b2fa14e98408a18c Mon Sep 17 00:00:00 2001 From: Poh Wei Pin Date: Wed, 1 Feb 2023 00:46:45 +0800 Subject: [PATCH 11/37] Update README.md --- README.md | 30 ++++++++---------------------- 1 file changed, 8 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index 8715d4d91..251f75fbb 100644 --- a/README.md +++ b/README.md @@ -1,24 +1,10 @@ -# Duke project template +# SAGE project -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. - -## Setting up in Intellij - -Prerequisites: JDK 11, update Intellij to the most recent version. - -1. Open Intellij (if you are not in the welcome screen, click `File` > `Close Project` to close the existing project first) -1. Open the project into Intellij as follows: - 1. Click `Open`. - 1. Select the project directory, and click `OK`. - 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: - ``` Hello from - ____ _ - | _ \ _ _| | _____ - | | | | | | | |/ / _ \ - | |_| | |_| | < __/ - |____/ \__,_|_|\_\___| - ``` + +░██████╗░█████╗░░██████╗░███████╗ +██╔════╝██╔══██╗██╔════╝░██╔════╝ +╚█████╗░███████║██║░░██╗░█████╗░░ +░╚═══██╗██╔══██║██║░░╚██╗██╔══╝░░ +██████╔╝██║░░██║╚██████╔╝███████╗ +╚═════╝░╚═╝░░╚═╝░╚═════╝░╚══════╝ From cac0c9e2134faee5d59f1a1f788f8482d5c887de Mon Sep 17 00:00:00 2001 From: Poh Wei Pin Date: Wed, 1 Feb 2023 00:47:49 +0800 Subject: [PATCH 12/37] Update README.md --- README.md | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 251f75fbb..bf8b84d77 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,18 @@ -# SAGE project +# SAGE iP project Hello from -░██████╗░█████╗░░██████╗░███████╗ -██╔════╝██╔══██╗██╔════╝░██╔════╝ -╚█████╗░███████║██║░░██╗░█████╗░░ -░╚═══██╗██╔══██║██║░░╚██╗██╔══╝░░ -██████╔╝██║░░██║╚██████╔╝███████╗ -╚═════╝░╚═╝░░╚═╝░╚═════╝░╚══════╝ + +───────────────────────────────────────────────────────────── +─██████████████─██████████████─██████████████─██████████████─ +─██░░░░░░░░░░██─██░░░░░░░░░░██─██░░░░░░░░░░██─██░░░░░░░░░░██─ +─██░░██████████─██░░██████░░██─██░░██████████─██░░██████████─ +─██░░██─────────██░░██──██░░██─██░░██─────────██░░██───────── +─██░░██████████─██░░██████░░██─██░░██─────────██░░██████████─ +─██░░░░░░░░░░██─██░░░░░░░░░░██─██░░██──██████─██░░░░░░░░░░██─ +─██████████░░██─██░░██████░░██─██░░██──██░░██─██░░██████████─ +─────────██░░██─██░░██──██░░██─██░░██──██░░██─██░░██───────── +─██████████░░██─██░░██──██░░██─██░░██████░░██─██░░██████████─ +─██░░░░░░░░░░██─██░░██──██░░██─██░░░░░░░░░░██─██░░░░░░░░░░██─ +─██████████████─██████──██████─██████████████─██████████████─ +───────────────────────────────────────────────────────────── From ba94855dabf716d65386b815ab08d107ecd6bb4d Mon Sep 17 00:00:00 2001 From: firwer Date: Wed, 1 Feb 2023 18:02:26 +0800 Subject: [PATCH 13/37] chore: Rename methods to PASCAL and documentation of functions --- src/main/java/Display.java | 40 +++++++++++++++-------------- src/main/java/Sage.java | 48 +++++++++++++++++++--------------- src/main/java/TaskList.java | 51 +++++++++++++++++++++++++++++-------- 3 files changed, 89 insertions(+), 50 deletions(-) diff --git a/src/main/java/Display.java b/src/main/java/Display.java index 39eceadd0..61c7e62ae 100644 --- a/src/main/java/Display.java +++ b/src/main/java/Display.java @@ -1,12 +1,12 @@ import java.util.ArrayList; public class Display { - private static String line = + private static String LINE = "█████╗█████╗█████╗█████╗█████╗█████╗█████╗\n" + "╚════╝╚════╝╚════╝╚════╝╚════╝╚════╝╚════╝"; - public void WelcomeUser() { - String logo = "░██████╗░█████╗░░██████╗░███████╗\n" + + public void welcomeUser() { + String LOGO = "░██████╗░█████╗░░██████╗░███████╗\n" + "██╔════╝██╔══██╗██╔════╝░██╔════╝\n" + "╚█████╗░███████║██║░░██╗░█████╗░░\n" + "░╚═══██╗██╔══██║██║░░╚██╗██╔══╝░░\n" + @@ -14,11 +14,11 @@ public void WelcomeUser() { "╚═════╝░╚═╝░░╚═╝░╚═════╝░╚══════╝"; String welcome = "Hello! I'm SAGE, the knowledgeable one\n" + "What can I do for you today?\n"; - System.out.println(logo); + System.out.println(LOGO); System.out.println(welcome); } - public void GoodByeUser() { + public void goodByeUser() { System.out.println("Bye. Hope to see you again soon!"); } @@ -27,10 +27,10 @@ public void GoodByeUser() { * * @param taskList The TaskList object that contains the tasks to be displayed. */ - public void DisplayTask(TaskList taskList) { - System.out.println(line); + public void displayTask(TaskList taskList) { + System.out.println(LINE); taskList.ListTask(); - System.out.println(line); + System.out.println(LINE); } /** @@ -41,8 +41,8 @@ public void DisplayTask(TaskList taskList) { * @param taskType The type of task being added (TODO, EVENT or DEADLINE) * @param taskList The list of tasks to which the new task is being added **/ - public void AddedTask(String[] userInput, TaskType taskType, TaskList taskList) { - System.out.println(line); + public void addedTask(String[] userInput, TaskType taskType, TaskList taskList) { + System.out.println(LINE); switch (taskType) { case TODO: System.out.println("Got it. I've added this task:"); @@ -51,31 +51,33 @@ public void AddedTask(String[] userInput, TaskType taskType, TaskList taskList) break; case EVENT: System.out.println("Got it. I've added this task:"); - System.out.println("[E][ ] " + userInput[0].substring(6) + "(from: " + userInput[1].substring(5) + " to: " + userInput[2].substring(3) + ")"); + System.out.println("[E][ ] " + userInput[0].substring(6) + "(from: " + + userInput[1].substring(5) + " to: " + userInput[2].substring(3) + ")"); System.out.println("Now you have " + taskList.GetTaskCount() + " tasks in the list"); break; case DEADLINE: System.out.println("Got it. I've added this task:"); - System.out.println("[D][ ] " + userInput[0].substring(9) + "(by: " + userInput[1].substring(3) + ")"); + System.out.println("[D][ ] " + userInput[0].substring(9) + "(by: " + + userInput[1].substring(3) + ")"); System.out.println("Now you have " + taskList.GetTaskCount() + " tasks in the list"); break; } - System.out.println(line); + System.out.println(LINE); } - public void TaskNotFound() { + public void taskNotFound() { System.out.println("Uh-oh! Task Not Found!"); } - public void UnknownInput() { + public void unknownInput() { System.out.println("I don't understand what you mean, please try again!"); } - public void InvalidUnmark() { + public void invalidUnmark() { System.out.println("Task already marked as not completed!"); } - public void InvalidMark() { + public void invalidMark() { System.out.println("Task already marked as completed!"); } @@ -85,7 +87,7 @@ public void InvalidMark() { * @param list the list of tasks * @param taskNumber the taskNumber index that is to be unmarked */ - public void ValidUnmark(ArrayList list, int taskNumber) { + public void validUnmark(ArrayList list, int taskNumber) { System.out.println("OK, I've marked this task as not done yet:"); System.out.println("[ ] " + list.get(taskNumber - 1).GetTaskName()); } @@ -96,7 +98,7 @@ public void ValidUnmark(ArrayList list, int taskNumber) { * @param list the list of tasks * @param taskNumber the taskNumber index that is to be marked */ - public void ValidMark(ArrayList list, int taskNumber) { + public void validMark(ArrayList list, int taskNumber) { System.out.println("Nice! I've marked this task as done:"); System.out.println("[X] " + list.get(taskNumber - 1).GetTaskName()); } diff --git a/src/main/java/Sage.java b/src/main/java/Sage.java index 99b367ac3..d82e16135 100644 --- a/src/main/java/Sage.java +++ b/src/main/java/Sage.java @@ -6,35 +6,43 @@ public static void main(String[] args) { Display UI = new Display(); TaskList taskList = new TaskList(); Scanner s = new Scanner(System.in); - UI.WelcomeUser(); + UI.welcomeUser(); while (s.hasNextLine()) { String[] output; String input = s.nextLine(); - if (input.equals("bye")) { - UI.GoodByeUser(); + switch (input) { + case "bye": + UI.goodByeUser(); + return; + case "list": + UI.displayTask(taskList); break; - } else if (input.equals("list")) { - UI.DisplayTask(taskList); - } else if (input.contains("unmark")) { + case "unmark": output = input.split(" "); - taskList.UnmarkTask(Integer.parseInt(output[1]), UI); - } else if (input.contains("mark")) { + taskList.unmarkTask(Integer.parseInt(output[1]), UI); + break; + case "mark": output = input.split(" "); - taskList.MarkTask(Integer.parseInt(output[1]), UI); - } else if (input.contains("todo")) { - taskList.AddTask(input.substring(5)); + taskList.markTask(Integer.parseInt(output[1]), UI); + break; + case "todo": output = input.split("/"); - UI.AddedTask(output, TaskType.TODO, taskList); - } else if (input.contains("deadline")) { + taskList.addTask(input); + UI.addedTask(output, TaskType.TODO, taskList); + break; + case "deadline": output = input.split("/"); - taskList.AddTask(output[0].substring(9), output[1].substring(3)); - UI.AddedTask(output, TaskType.DEADLINE, taskList); - } else if (input.contains("event")) { + taskList.addTask(output[0].substring(9), output[1].substring(3)); + UI.addedTask(output, TaskType.DEADLINE, taskList); + break; + case "event": output = input.split("/"); - taskList.AddTask(output[0].substring(6), output[1].substring(5), output[2].substring(3)); - UI.AddedTask(output, TaskType.EVENT, taskList); - } else { - UI.UnknownInput(); + taskList.addTask(output[0].substring(6), output[1].substring(5), output[2].substring(3)); + UI.addedTask(output, TaskType.EVENT, taskList); + break; + default: + UI.unknownInput(); + break; } } } diff --git a/src/main/java/TaskList.java b/src/main/java/TaskList.java index 4c58bae1c..44b6e6931 100644 --- a/src/main/java/TaskList.java +++ b/src/main/java/TaskList.java @@ -3,40 +3,69 @@ public class TaskList { private static ArrayList list = new ArrayList<>(); - public void AddTask(String taskName) { + /** + * This method instantiate a Todo object and add the Todo object to the TaskList + * + * @param taskName The name of the TODO task to be added + **/ + public void addTask(String taskName) { Todo t = new Todo(taskName); list.add(t); } - public void AddTask(String taskName, String byWhen) { + /** + * This method instantiate a Todo object and add the Todo object to the TaskList + * + * @param taskName a string that represents the name of the TODO task to add. + **/ + public void addTask(String taskName, String byWhen) { Deadline d = new Deadline(taskName, byWhen); list.add(d); } - public void AddTask(String taskName, String startWhen, String endWhen) { + /** + * This method instantiate an Event object and add the Event object to the TaskList + * + * @param taskName a string that represents the name of the EVENT task to add. + * @param startWhen a string that represents the start date and time of the EVENT task. + * @param endWhen a string that represents the end date and time of the EVENT task. + */ + public void addTask(String taskName, String startWhen, String endWhen) { Event e = new Event(taskName, startWhen, endWhen); list.add(e); } - public void UnmarkTask(int taskNumber, Display UI) { + /** + * Unmarks a completed task. + * + * @param taskNumber an integer that represents the index of the task to unmark (1-Indexed). + * @param UI an object of the Display class that provides the user interface. + */ + public void unmarkTask(int taskNumber, Display UI) { if (taskNumber <= 0 || taskNumber > list.size()) { - UI.TaskNotFound(); + UI.taskNotFound(); } else if (!list.get(taskNumber - 1).IsCompleted()) { - UI.InvalidUnmark(); + UI.invalidUnmark(); } else { list.get(taskNumber - 1).SetCompleted(false); - UI.ValidUnmark(list, taskNumber); + UI.validUnmark(list, taskNumber); } } - public void MarkTask(int taskNumber, Display UI) { + /** + * Marks a completed task. + * + * @param taskNumber an integer that represents the index of the task to mark (1-Indexed). + * @param UI an object of the Display class that provides the user interface. + */ + public void markTask(int taskNumber, Display UI) { if (taskNumber <= 0 || taskNumber > list.size()) { - UI.TaskNotFound(); + UI.taskNotFound(); } else if (list.get(taskNumber - 1).IsCompleted()) { - UI.InvalidMark(); + UI.invalidMark(); } else { list.get(taskNumber - 1).SetCompleted(true); - UI.ValidMark(list, taskNumber); + UI.validMark(list, taskNumber); } } From 031dd31f20eae33c8c6586da6c2e1ebd71bbed9a Mon Sep 17 00:00:00 2001 From: firwer Date: Thu, 2 Feb 2023 23:04:44 +0800 Subject: [PATCH 14/37] A-CodeQuality: Minor adjustments to ensure coding standards are met --- src/main/java/Deadline.java | 6 +++--- src/main/java/Display.java | 26 +++++++++++++------------- src/main/java/Event.java | 6 +++--- src/main/java/Sage.java | 27 +++++++++++++-------------- src/main/java/Task.java | 6 +++--- src/main/java/TaskList.java | 32 ++++++++++++++++---------------- src/main/java/Todo.java | 6 +++--- 7 files changed, 54 insertions(+), 55 deletions(-) diff --git a/src/main/java/Deadline.java b/src/main/java/Deadline.java index b956fdd32..460945cde 100644 --- a/src/main/java/Deadline.java +++ b/src/main/java/Deadline.java @@ -11,10 +11,10 @@ public String getByWhen() { } public String toString() { - if (super.IsCompleted()) { - return ".[D][X] " + super.GetTaskName() + "(by: " + getByWhen() + ")"; + if (super.isCompleted()) { + return ".[D][X] " + super.getTaskName() + "(by: " + getByWhen() + ")"; } else { - return ".[D][ ] " + super.GetTaskName() + "(by: " + getByWhen() + ")"; + return ".[D][ ] " + super.getTaskName() + "(by: " + getByWhen() + ")"; } } } diff --git a/src/main/java/Display.java b/src/main/java/Display.java index 61c7e62ae..0a621b8ac 100644 --- a/src/main/java/Display.java +++ b/src/main/java/Display.java @@ -1,17 +1,17 @@ import java.util.ArrayList; public class Display { - private static String LINE = + private static final String LINE = "█████╗█████╗█████╗█████╗█████╗█████╗█████╗\n" + "╚════╝╚════╝╚════╝╚════╝╚════╝╚════╝╚════╝"; + private static final String LOGO = "░██████╗░█████╗░░██████╗░███████╗\n" + + "██╔════╝██╔══██╗██╔════╝░██╔════╝\n" + + "╚█████╗░███████║██║░░██╗░█████╗░░\n" + + "░╚═══██╗██╔══██║██║░░╚██╗██╔══╝░░\n" + + "██████╔╝██║░░██║╚██████╔╝███████╗\n" + + "╚═════╝░╚═╝░░╚═╝░╚═════╝░╚══════╝"; public void welcomeUser() { - String LOGO = "░██████╗░█████╗░░██████╗░███████╗\n" + - "██╔════╝██╔══██╗██╔════╝░██╔════╝\n" + - "╚█████╗░███████║██║░░██╗░█████╗░░\n" + - "░╚═══██╗██╔══██║██║░░╚██╗██╔══╝░░\n" + - "██████╔╝██║░░██║╚██████╔╝███████╗\n" + - "╚═════╝░╚═╝░░╚═╝░╚═════╝░╚══════╝"; String welcome = "Hello! I'm SAGE, the knowledgeable one\n" + "What can I do for you today?\n"; System.out.println(LOGO); @@ -29,7 +29,7 @@ public void goodByeUser() { */ public void displayTask(TaskList taskList) { System.out.println(LINE); - taskList.ListTask(); + taskList.listTask(); System.out.println(LINE); } @@ -47,19 +47,19 @@ public void addedTask(String[] userInput, TaskType taskType, TaskList taskList) case TODO: System.out.println("Got it. I've added this task:"); System.out.println("[T][ ] " + userInput[0].substring(5)); - System.out.println("Now you have " + taskList.GetTaskCount() + " tasks in the list"); + System.out.println("Now you have " + taskList.getTaskCount() + " tasks in the list"); break; case EVENT: System.out.println("Got it. I've added this task:"); System.out.println("[E][ ] " + userInput[0].substring(6) + "(from: " + userInput[1].substring(5) + " to: " + userInput[2].substring(3) + ")"); - System.out.println("Now you have " + taskList.GetTaskCount() + " tasks in the list"); + System.out.println("Now you have " + taskList.getTaskCount() + " tasks in the list"); break; case DEADLINE: System.out.println("Got it. I've added this task:"); System.out.println("[D][ ] " + userInput[0].substring(9) + "(by: " + userInput[1].substring(3) + ")"); - System.out.println("Now you have " + taskList.GetTaskCount() + " tasks in the list"); + System.out.println("Now you have " + taskList.getTaskCount() + " tasks in the list"); break; } System.out.println(LINE); @@ -89,7 +89,7 @@ public void invalidMark() { */ public void validUnmark(ArrayList list, int taskNumber) { System.out.println("OK, I've marked this task as not done yet:"); - System.out.println("[ ] " + list.get(taskNumber - 1).GetTaskName()); + System.out.println("[ ] " + list.get(taskNumber - 1).getTaskName()); } /** @@ -100,7 +100,7 @@ public void validUnmark(ArrayList list, int taskNumber) { */ public void validMark(ArrayList list, int taskNumber) { System.out.println("Nice! I've marked this task as done:"); - System.out.println("[X] " + list.get(taskNumber - 1).GetTaskName()); + System.out.println("[X] " + list.get(taskNumber - 1).getTaskName()); } } diff --git a/src/main/java/Event.java b/src/main/java/Event.java index c823e1ffd..bd377b0f6 100644 --- a/src/main/java/Event.java +++ b/src/main/java/Event.java @@ -18,10 +18,10 @@ public String getEndWhen() { } public String toString() { - if (super.IsCompleted()) { - return ".[E][X] " + super.GetTaskName() + "(from: " + getStartWhen() + " to: " + getEndWhen() + ")"; + if (super.isCompleted()) { + return ".[E][X] " + super.getTaskName() + "(from: " + getStartWhen() + " to: " + getEndWhen() + ")"; } else { - return ".[E][ ] " + super.GetTaskName() + "(from: " + getStartWhen() + " to: " + getEndWhen() + ")"; + return ".[E][ ] " + super.getTaskName() + "(from: " + getStartWhen() + " to: " + getEndWhen() + ")"; } } } diff --git a/src/main/java/Sage.java b/src/main/java/Sage.java index d82e16135..1c4c7701d 100644 --- a/src/main/java/Sage.java +++ b/src/main/java/Sage.java @@ -1,47 +1,46 @@ -import java.util.ArrayList; import java.util.Scanner; public class Sage { public static void main(String[] args) { - Display UI = new Display(); + Display ui = new Display(); TaskList taskList = new TaskList(); - Scanner s = new Scanner(System.in); - UI.welcomeUser(); - while (s.hasNextLine()) { + Scanner command = new Scanner(System.in); + ui.welcomeUser(); + while (command.hasNextLine()) { String[] output; - String input = s.nextLine(); + String input = command.nextLine(); switch (input) { case "bye": - UI.goodByeUser(); + ui.goodByeUser(); return; case "list": - UI.displayTask(taskList); + ui.displayTask(taskList); break; case "unmark": output = input.split(" "); - taskList.unmarkTask(Integer.parseInt(output[1]), UI); + taskList.unmarkTask(Integer.parseInt(output[1]), ui); break; case "mark": output = input.split(" "); - taskList.markTask(Integer.parseInt(output[1]), UI); + taskList.markTask(Integer.parseInt(output[1]), ui); break; case "todo": output = input.split("/"); taskList.addTask(input); - UI.addedTask(output, TaskType.TODO, taskList); + ui.addedTask(output, TaskType.TODO, taskList); break; case "deadline": output = input.split("/"); taskList.addTask(output[0].substring(9), output[1].substring(3)); - UI.addedTask(output, TaskType.DEADLINE, taskList); + ui.addedTask(output, TaskType.DEADLINE, taskList); break; case "event": output = input.split("/"); taskList.addTask(output[0].substring(6), output[1].substring(5), output[2].substring(3)); - UI.addedTask(output, TaskType.EVENT, taskList); + ui.addedTask(output, TaskType.EVENT, taskList); break; default: - UI.unknownInput(); + ui.unknownInput(); break; } } diff --git a/src/main/java/Task.java b/src/main/java/Task.java index 2fd6e3752..6a0028103 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -7,15 +7,15 @@ public Task(String taskName) { this.completed = false; } - public String GetTaskName() { + public String getTaskName() { return this.taskName; } - public void SetCompleted(boolean completed) { + public void setCompleted(boolean completed) { this.completed = completed; } - public boolean IsCompleted() { + public boolean isCompleted() { return completed; } diff --git a/src/main/java/TaskList.java b/src/main/java/TaskList.java index 44b6e6931..ad36f2d0c 100644 --- a/src/main/java/TaskList.java +++ b/src/main/java/TaskList.java @@ -39,16 +39,16 @@ public void addTask(String taskName, String startWhen, String endWhen) { * Unmarks a completed task. * * @param taskNumber an integer that represents the index of the task to unmark (1-Indexed). - * @param UI an object of the Display class that provides the user interface. + * @param ui an object of the Display class that provides the user interface. */ - public void unmarkTask(int taskNumber, Display UI) { + public void unmarkTask(int taskNumber, Display ui) { if (taskNumber <= 0 || taskNumber > list.size()) { - UI.taskNotFound(); - } else if (!list.get(taskNumber - 1).IsCompleted()) { - UI.invalidUnmark(); + ui.taskNotFound(); + } else if (!list.get(taskNumber - 1).isCompleted()) { + ui.invalidUnmark(); } else { - list.get(taskNumber - 1).SetCompleted(false); - UI.validUnmark(list, taskNumber); + list.get(taskNumber - 1).setCompleted(false); + ui.validUnmark(list, taskNumber); } } @@ -56,20 +56,20 @@ public void unmarkTask(int taskNumber, Display UI) { * Marks a completed task. * * @param taskNumber an integer that represents the index of the task to mark (1-Indexed). - * @param UI an object of the Display class that provides the user interface. + * @param ui an object of the Display class that provides the user interface. */ - public void markTask(int taskNumber, Display UI) { + public void markTask(int taskNumber, Display ui) { if (taskNumber <= 0 || taskNumber > list.size()) { - UI.taskNotFound(); - } else if (list.get(taskNumber - 1).IsCompleted()) { - UI.invalidMark(); + ui.taskNotFound(); + } else if (list.get(taskNumber - 1).isCompleted()) { + ui.invalidMark(); } else { - list.get(taskNumber - 1).SetCompleted(true); - UI.validMark(list, taskNumber); + list.get(taskNumber - 1).setCompleted(true); + ui.validMark(list, taskNumber); } } - public void ListTask() { + public void listTask() { System.out.println("Here are the tasks in your list:"); for (int i = 0; i < list.size(); i++) { System.out.print(i + 1); @@ -77,7 +77,7 @@ public void ListTask() { } } - public int GetTaskCount() { + public int getTaskCount() { return list.size(); } } diff --git a/src/main/java/Todo.java b/src/main/java/Todo.java index 684374a0f..6b3b04f4a 100644 --- a/src/main/java/Todo.java +++ b/src/main/java/Todo.java @@ -5,10 +5,10 @@ public Todo(String taskName) { } public String toString() { - if (super.IsCompleted()) { - return ".[T][X] " + super.GetTaskName(); + if (super.isCompleted()) { + return ".[T][X] " + super.getTaskName(); } else { - return ".[T][ ] " + super.GetTaskName(); + return ".[T][ ] " + super.getTaskName(); } } From 73eff724c705c513542a7f82ce5ce246033231b2 Mon Sep 17 00:00:00 2001 From: firwer Date: Thu, 2 Feb 2023 23:27:01 +0800 Subject: [PATCH 15/37] A-CodeQuality: Add-on to previous commit for further standard improvement --- src/main/java/Deadline.java | 1 + src/main/java/Event.java | 1 + src/main/java/Todo.java | 1 + 3 files changed, 3 insertions(+) diff --git a/src/main/java/Deadline.java b/src/main/java/Deadline.java index 460945cde..fbca9344d 100644 --- a/src/main/java/Deadline.java +++ b/src/main/java/Deadline.java @@ -10,6 +10,7 @@ public String getByWhen() { return byWhen; } + @Override public String toString() { if (super.isCompleted()) { return ".[D][X] " + super.getTaskName() + "(by: " + getByWhen() + ")"; diff --git a/src/main/java/Event.java b/src/main/java/Event.java index bd377b0f6..1b1819f28 100644 --- a/src/main/java/Event.java +++ b/src/main/java/Event.java @@ -17,6 +17,7 @@ public String getEndWhen() { return endWhen; } + @Override public String toString() { if (super.isCompleted()) { return ".[E][X] " + super.getTaskName() + "(from: " + getStartWhen() + " to: " + getEndWhen() + ")"; diff --git a/src/main/java/Todo.java b/src/main/java/Todo.java index 6b3b04f4a..40edf5f76 100644 --- a/src/main/java/Todo.java +++ b/src/main/java/Todo.java @@ -4,6 +4,7 @@ public Todo(String taskName) { super(taskName); } + @Override public String toString() { if (super.isCompleted()) { return ".[T][X] " + super.getTaskName(); From 7307fefe4da2470efef735c14b40d74052519ba7 Mon Sep 17 00:00:00 2001 From: firwer Date: Fri, 3 Feb 2023 18:16:26 +0800 Subject: [PATCH 16/37] refactor: Add Command class to handle string parsing --- src/main/java/Command.java | 54 ++++++++++++++++++++++ src/main/java/Display.java | 18 +++++--- src/main/java/Sage.java | 30 +++++------- src/main/java/TaskList.java | 92 ++++++++++++++++++++++++------------- 4 files changed, 139 insertions(+), 55 deletions(-) create mode 100644 src/main/java/Command.java diff --git a/src/main/java/Command.java b/src/main/java/Command.java new file mode 100644 index 000000000..06d8ddeff --- /dev/null +++ b/src/main/java/Command.java @@ -0,0 +1,54 @@ +public class Command { + private String[] rawOutput; + private String taskType; + private String taskDescription; + private String by = null; + private String from = null; + private String to = null; + + public Command(String input) { + this.rawOutput = input.split("/"); + String[] body = rawOutput[0].split(" ", 2); + this.taskType = body[0].toLowerCase(); + if (body.length > 1) { + this.taskDescription = body[1]; + } + + for (String i : rawOutput) { + String[] line = i.split(" ", 2); + String field = line.length > 1 ? line[1].trim() : null; + switch (line[0]) { + case "by": + this.by = field; + break; + case "from": + this.from = field; + break; + case "to": + this.to = field; + break; + } + } + + } + + public String getTaskType() { + return taskType; + } + + public String getTaskDescription() { + return taskDescription; + } + + public String getBy() { + return by; + } + + public String getFrom() { + return from; + } + + public String getTo() { + return to; + } +} diff --git a/src/main/java/Display.java b/src/main/java/Display.java index 0a621b8ac..c8b9a1fb0 100644 --- a/src/main/java/Display.java +++ b/src/main/java/Display.java @@ -41,30 +41,36 @@ public void displayTask(TaskList taskList) { * @param taskType The type of task being added (TODO, EVENT or DEADLINE) * @param taskList The list of tasks to which the new task is being added **/ - public void addedTask(String[] userInput, TaskType taskType, TaskList taskList) { + public void addedTask(Command command, TaskType taskType, TaskList taskList) { System.out.println(LINE); switch (taskType) { case TODO: System.out.println("Got it. I've added this task:"); - System.out.println("[T][ ] " + userInput[0].substring(5)); + System.out.println("[T][ ] " + command.getTaskDescription()); System.out.println("Now you have " + taskList.getTaskCount() + " tasks in the list"); break; case EVENT: System.out.println("Got it. I've added this task:"); - System.out.println("[E][ ] " + userInput[0].substring(6) + "(from: " - + userInput[1].substring(5) + " to: " + userInput[2].substring(3) + ")"); + System.out.println("[E][ ] " + command.getTaskDescription() + "(from: " + + command.getFrom() + " to: " + command.getTo() + ")"); System.out.println("Now you have " + taskList.getTaskCount() + " tasks in the list"); break; case DEADLINE: System.out.println("Got it. I've added this task:"); - System.out.println("[D][ ] " + userInput[0].substring(9) + "(by: " - + userInput[1].substring(3) + ")"); + System.out.println("[D][ ] " + command.getTaskDescription() + "(by: " + + command.getBy() + ")"); System.out.println("Now you have " + taskList.getTaskCount() + " tasks in the list"); break; } System.out.println(LINE); } + public void missingTodoField() { + System.out.println(LINE); + System.out.println("Description "); + System.out.println(LINE); + } + public void taskNotFound() { System.out.println("Uh-oh! Task Not Found!"); } diff --git a/src/main/java/Sage.java b/src/main/java/Sage.java index 1c4c7701d..2bd3dd10d 100644 --- a/src/main/java/Sage.java +++ b/src/main/java/Sage.java @@ -4,12 +4,11 @@ public class Sage { public static void main(String[] args) { Display ui = new Display(); TaskList taskList = new TaskList(); - Scanner command = new Scanner(System.in); + Scanner input = new Scanner(System.in); ui.welcomeUser(); - while (command.hasNextLine()) { - String[] output; - String input = command.nextLine(); - switch (input) { + while (input.hasNextLine()) { + Command command = new Command(input.nextLine()); + switch (command.getTaskType()) { case "bye": ui.goodByeUser(); return; @@ -17,27 +16,22 @@ public static void main(String[] args) { ui.displayTask(taskList); break; case "unmark": - output = input.split(" "); - taskList.unmarkTask(Integer.parseInt(output[1]), ui); + taskList.unmarkTask(command.getTaskDescription(), ui); break; case "mark": - output = input.split(" "); - taskList.markTask(Integer.parseInt(output[1]), ui); + taskList.markTask(command.getTaskDescription(), ui); break; case "todo": - output = input.split("/"); - taskList.addTask(input); - ui.addedTask(output, TaskType.TODO, taskList); + taskList.addTask(command.getTaskDescription()); + ui.addedTask(command, TaskType.TODO, taskList); break; case "deadline": - output = input.split("/"); - taskList.addTask(output[0].substring(9), output[1].substring(3)); - ui.addedTask(output, TaskType.DEADLINE, taskList); + taskList.addTask(command.getTaskDescription(), command.getBy()); + ui.addedTask(command, TaskType.DEADLINE, taskList); break; case "event": - output = input.split("/"); - taskList.addTask(output[0].substring(6), output[1].substring(5), output[2].substring(3)); - ui.addedTask(output, TaskType.EVENT, taskList); + taskList.addTask(command.getTaskDescription(), command.getFrom(), command.getTo()); + ui.addedTask(command, TaskType.EVENT, taskList); break; default: ui.unknownInput(); diff --git a/src/main/java/TaskList.java b/src/main/java/TaskList.java index ad36f2d0c..57f415099 100644 --- a/src/main/java/TaskList.java +++ b/src/main/java/TaskList.java @@ -9,63 +9,93 @@ public class TaskList { * @param taskName The name of the TODO task to be added **/ public void addTask(String taskName) { - Todo t = new Todo(taskName); - list.add(t); + if (taskName == null) { + throw new IllegalArgumentException("Todo description parameter is missing"); + } else { + Todo t = new Todo(taskName); + list.add(t); + } } /** - * This method instantiate a Todo object and add the Todo object to the TaskList + * This method instantiate a Deadline object and add the Deadline object to the TaskList * - * @param taskName a string that represents the name of the TODO task to add. + * @param taskName a string that represents the name of the Deadline task to add. + * @param byWhen a string that represents the deadline of the Deadline task. **/ public void addTask(String taskName, String byWhen) { - Deadline d = new Deadline(taskName, byWhen); - list.add(d); + if (taskName == null) { + throw new IllegalArgumentException("Deadline description parameter is missing"); + } else if (byWhen == null) { + throw new IllegalArgumentException("Deadline by parameter is missing"); + } else { + Deadline d = new Deadline(taskName, byWhen); + list.add(d); + } } /** * This method instantiate an Event object and add the Event object to the TaskList * - * @param taskName a string that represents the name of the EVENT task to add. - * @param startWhen a string that represents the start date and time of the EVENT task. - * @param endWhen a string that represents the end date and time of the EVENT task. + * @param taskName a string that represents the name of the Event task to add. + * @param startWhen a string that represents the start date and time of the Event task. + * @param endWhen a string that represents the end date and time of the Event task. */ public void addTask(String taskName, String startWhen, String endWhen) { - Event e = new Event(taskName, startWhen, endWhen); - list.add(e); + if (taskName == null) { + throw new IllegalArgumentException("Event description parameter is missing"); + } else if (startWhen == null) { + throw new IllegalArgumentException("Event starting parameter is missing"); + } else if (endWhen == null) { + throw new IllegalArgumentException("Event ending parameter is missing"); + } else { + Event e = new Event(taskName, startWhen, endWhen); + list.add(e); + } } /** * Unmarks a completed task. * - * @param taskNumber an integer that represents the index of the task to unmark (1-Indexed). - * @param ui an object of the Display class that provides the user interface. + * @param taskDescription string that represents the index of the task to unmark (1-Indexed). + * @param ui an object of the Display class that provides the user interface. */ - public void unmarkTask(int taskNumber, Display ui) { - if (taskNumber <= 0 || taskNumber > list.size()) { - ui.taskNotFound(); - } else if (!list.get(taskNumber - 1).isCompleted()) { - ui.invalidUnmark(); - } else { - list.get(taskNumber - 1).setCompleted(false); - ui.validUnmark(list, taskNumber); + public void unmarkTask(String taskDescription, Display ui) { + try { + int taskNumber = Integer.parseInt(taskDescription); + if (taskNumber <= 0 || taskNumber > list.size()) { + ui.taskNotFound(); + } else if (!list.get(taskNumber - 1).isCompleted()) { + ui.invalidUnmark(); + } else { + list.get(taskNumber - 1).setCompleted(false); + ui.validUnmark(list, taskNumber); + } + } catch (NumberFormatException e) { + System.out.println("Index of task to be unmarked is missing"); } + } /** * Marks a completed task. * - * @param taskNumber an integer that represents the index of the task to mark (1-Indexed). - * @param ui an object of the Display class that provides the user interface. + * @param taskDescription a string that represents the index of the task to mark (1-Indexed). + * @param ui an object of the Display class that provides the user interface. */ - public void markTask(int taskNumber, Display ui) { - if (taskNumber <= 0 || taskNumber > list.size()) { - ui.taskNotFound(); - } else if (list.get(taskNumber - 1).isCompleted()) { - ui.invalidMark(); - } else { - list.get(taskNumber - 1).setCompleted(true); - ui.validMark(list, taskNumber); + public void markTask(String taskDescription, Display ui) { + try { + int taskNumber = Integer.parseInt(taskDescription); + if (taskNumber <= 0 || taskNumber > list.size()) { + ui.taskNotFound(); + } else if (list.get(taskNumber - 1).isCompleted()) { + ui.invalidMark(); + } else { + list.get(taskNumber - 1).setCompleted(true); + ui.validMark(list, taskNumber); + } + } catch (NumberFormatException e) { + System.out.println("Index of task to be marked is missing"); } } From d7704a015976d068cb415ed411c202e18413d27b Mon Sep 17 00:00:00 2001 From: firwer Date: Fri, 3 Feb 2023 18:45:57 +0800 Subject: [PATCH 17/37] Level-5: Error handling and display improvements --- src/main/java/Display.java | 43 +++++++++++++++++++++++++------------- text-ui-test/EXPECTED.TXT | 6 ------ 2 files changed, 29 insertions(+), 20 deletions(-) diff --git a/src/main/java/Display.java b/src/main/java/Display.java index c8b9a1fb0..13600a409 100644 --- a/src/main/java/Display.java +++ b/src/main/java/Display.java @@ -43,31 +43,21 @@ public void displayTask(TaskList taskList) { **/ public void addedTask(Command command, TaskType taskType, TaskList taskList) { System.out.println(LINE); + System.out.println("Got it. I've added this task:"); switch (taskType) { case TODO: - System.out.println("Got it. I've added this task:"); System.out.println("[T][ ] " + command.getTaskDescription()); - System.out.println("Now you have " + taskList.getTaskCount() + " tasks in the list"); break; case EVENT: - System.out.println("Got it. I've added this task:"); System.out.println("[E][ ] " + command.getTaskDescription() + "(from: " + command.getFrom() + " to: " + command.getTo() + ")"); - System.out.println("Now you have " + taskList.getTaskCount() + " tasks in the list"); break; case DEADLINE: - System.out.println("Got it. I've added this task:"); System.out.println("[D][ ] " + command.getTaskDescription() + "(by: " + command.getBy() + ")"); - System.out.println("Now you have " + taskList.getTaskCount() + " tasks in the list"); break; } - System.out.println(LINE); - } - - public void missingTodoField() { - System.out.println(LINE); - System.out.println("Description "); + System.out.println("Now you have " + taskList.getTaskCount() + " tasks in the list"); System.out.println(LINE); } @@ -94,8 +84,21 @@ public void invalidMark() { * @param taskNumber the taskNumber index that is to be unmarked */ public void validUnmark(ArrayList list, int taskNumber) { + + Task taskObj = list.get(taskNumber - 1); System.out.println("OK, I've marked this task as not done yet:"); - System.out.println("[ ] " + list.get(taskNumber - 1).getTaskName()); + if (taskObj instanceof Deadline) { + Deadline deadline = (Deadline) taskObj; + System.out.println("[E][ ] " + taskObj.getTaskName() + "(by: " + + ((Deadline) taskObj).getByWhen() + ") "); + } else if (taskObj instanceof Event) { + Event event = (Event) taskObj; + System.out.println("[E][ ] " + event.getTaskName() + "(from: " + + event.getStartWhen() + " to: " + event.getEndWhen() + ")"); + } else { + Todo todo = (Todo) taskObj; + System.out.println("[T][ ] " + todo.getTaskName()); + } } /** @@ -105,8 +108,20 @@ public void validUnmark(ArrayList list, int taskNumber) { * @param taskNumber the taskNumber index that is to be marked */ public void validMark(ArrayList list, int taskNumber) { + Task taskObj = list.get(taskNumber - 1); System.out.println("Nice! I've marked this task as done:"); - System.out.println("[X] " + list.get(taskNumber - 1).getTaskName()); + if (taskObj instanceof Deadline) { + Deadline deadline = (Deadline) taskObj; + System.out.println("[E][X] " + taskObj.getTaskName() + "(by: " + + ((Deadline) taskObj).getByWhen() + ") "); + } else if (taskObj instanceof Event) { + Event event = (Event) taskObj; + System.out.println("[E][X] " + event.getTaskName() + "(from: " + + event.getStartWhen() + " to: " + event.getEndWhen() + ")"); + } else { + Todo todo = (Todo) taskObj; + System.out.println("[T][X] " + todo.getTaskName()); + } } } diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index 3324ce6c9..c713e4352 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -1,9 +1,3 @@ -░██████╗░█████╗░░██████╗░███████╗ -██╔════╝██╔══██╗██╔════╝░██╔════╝ -╚█████╗░███████║██║░░██╗░█████╗░░ -░╚═══██╗██╔══██║██║░░╚██╗██╔══╝░░ -██████╔╝██║░░██║╚██████╔╝███████╗ -╚═════╝░╚═╝░░╚═╝░╚═════╝░╚══════╝ Hello! I'm SAGE, the knowledgeable one What can I do for you today? From 2d9626a7a7f9947f22323ffc2650124861d2ac67 Mon Sep 17 00:00:00 2001 From: firwer Date: Mon, 6 Feb 2023 12:57:03 +0800 Subject: [PATCH 18/37] refactor: Create exception classes for proper handling of errors --- src/main/java/Display.java | 67 ++++++----- src/main/java/EmptyListException.java | 10 ++ src/main/java/IllegalTaskOperation.java | 14 +++ src/main/java/InvalidTaskException.java | 15 +++ src/main/java/MissingParameterException.java | 24 ++++ src/main/java/Sage.java | 11 +- src/main/java/TaskList.java | 111 ++++++++++++------- 7 files changed, 179 insertions(+), 73 deletions(-) create mode 100644 src/main/java/EmptyListException.java create mode 100644 src/main/java/IllegalTaskOperation.java create mode 100644 src/main/java/InvalidTaskException.java create mode 100644 src/main/java/MissingParameterException.java diff --git a/src/main/java/Display.java b/src/main/java/Display.java index 13600a409..ea9005d8e 100644 --- a/src/main/java/Display.java +++ b/src/main/java/Display.java @@ -11,6 +11,10 @@ public class Display { "██████╔╝██║░░██║╚██████╔╝███████╗\n" + "╚═════╝░╚═╝░░╚═╝░╚═════╝░╚══════╝"; + public String printLine() { + return LINE; + } + public void welcomeUser() { String welcome = "Hello! I'm SAGE, the knowledgeable one\n" + "What can I do for you today?\n"; @@ -27,11 +31,19 @@ public void goodByeUser() { * * @param taskList The TaskList object that contains the tasks to be displayed. */ - public void displayTask(TaskList taskList) { - System.out.println(LINE); - taskList.listTask(); - System.out.println(LINE); - } +// public void displayTask(TaskList taskList) { +// System.out.println(LINE); +// try { +// if (taskList.getTaskCount() > 0) { +// taskList.listTask(); +// } else { +// throw new EmptyListException(); +// } +// } catch (EmptyListException e) { +// System.out.println(e.errorMsg()); +// } +// System.out.println(LINE); +// } /** * This method prints a message to the console indicating the addition of a task to the task list and its details. @@ -41,23 +53,29 @@ public void displayTask(TaskList taskList) { * @param taskType The type of task being added (TODO, EVENT or DEADLINE) * @param taskList The list of tasks to which the new task is being added **/ - public void addedTask(Command command, TaskType taskType, TaskList taskList) { + public void addedTask(String taskDescription, int taskCount) { System.out.println(LINE); System.out.println("Got it. I've added this task:"); - switch (taskType) { - case TODO: - System.out.println("[T][ ] " + command.getTaskDescription()); - break; - case EVENT: - System.out.println("[E][ ] " + command.getTaskDescription() + "(from: " - + command.getFrom() + " to: " + command.getTo() + ")"); - break; - case DEADLINE: - System.out.println("[D][ ] " + command.getTaskDescription() + "(by: " - + command.getBy() + ")"); - break; - } - System.out.println("Now you have " + taskList.getTaskCount() + " tasks in the list"); + System.out.println("[T][ ] " + taskDescription); + System.out.println("Now you have " + taskCount + " tasks in the list"); + System.out.println(LINE); + } + + public void addedTask(String taskDescription, String by, int taskCount) { + System.out.println(LINE); + System.out.println("Got it. I've added this task:"); + System.out.println("[D][ ] " + taskDescription + "(by: " + + by + ")"); + System.out.println("Now you have " + taskCount + " tasks in the list"); + System.out.println(LINE); + } + + public void addedTask(String taskDescription, String from, String to, int taskCount) { + System.out.println(LINE); + System.out.println("Got it. I've added this task:"); + System.out.println("[E][ ] " + taskDescription + "(from: " + + from + " to: " + to + ")"); + System.out.println("Now you have " + taskCount + " tasks in the list"); System.out.println(LINE); } @@ -69,13 +87,6 @@ public void unknownInput() { System.out.println("I don't understand what you mean, please try again!"); } - public void invalidUnmark() { - System.out.println("Task already marked as not completed!"); - } - - public void invalidMark() { - System.out.println("Task already marked as completed!"); - } /** * This method is used to display a marked task as not done in the task list. @@ -88,7 +99,6 @@ public void validUnmark(ArrayList list, int taskNumber) { Task taskObj = list.get(taskNumber - 1); System.out.println("OK, I've marked this task as not done yet:"); if (taskObj instanceof Deadline) { - Deadline deadline = (Deadline) taskObj; System.out.println("[E][ ] " + taskObj.getTaskName() + "(by: " + ((Deadline) taskObj).getByWhen() + ") "); } else if (taskObj instanceof Event) { @@ -111,7 +121,6 @@ public void validMark(ArrayList list, int taskNumber) { Task taskObj = list.get(taskNumber - 1); System.out.println("Nice! I've marked this task as done:"); if (taskObj instanceof Deadline) { - Deadline deadline = (Deadline) taskObj; System.out.println("[E][X] " + taskObj.getTaskName() + "(by: " + ((Deadline) taskObj).getByWhen() + ") "); } else if (taskObj instanceof Event) { diff --git a/src/main/java/EmptyListException.java b/src/main/java/EmptyListException.java new file mode 100644 index 000000000..ed162530c --- /dev/null +++ b/src/main/java/EmptyListException.java @@ -0,0 +1,10 @@ +public class EmptyListException extends Exception { + /** + * Exception which returns an error message when operations is conducted on an empty list. + * + * @return An error message when user is conducting operations on an empty list of tasks + */ + public String errorMsg() { + return "There are currently no tasks in your list!"; + } +} diff --git a/src/main/java/IllegalTaskOperation.java b/src/main/java/IllegalTaskOperation.java new file mode 100644 index 000000000..94960850a --- /dev/null +++ b/src/main/java/IllegalTaskOperation.java @@ -0,0 +1,14 @@ +public class IllegalTaskOperation extends Exception { + /** + * Exception which returns an error message when operations is conducted on an empty list. + * + * @return An error message when user is conducting operations on an empty list of tasks + */ + public String errorAlreadyUnmarked() { + return "Task already marked as not completed!"; + } + + public String errorAlreadyMarked() { + return "Task already marked as completed!"; + } +} diff --git a/src/main/java/InvalidTaskException.java b/src/main/java/InvalidTaskException.java new file mode 100644 index 000000000..44adcd945 --- /dev/null +++ b/src/main/java/InvalidTaskException.java @@ -0,0 +1,15 @@ +public class InvalidTaskException extends Exception { + /** + * Exception which returns an error message when an out-of-bound task index is provided by the user + * + * @return An error message when user provides a task index that is out of bound + */ + public String errorMark() { + return "Unable to mark the specified task: task index provided is invalid."; + } + + public String errorUnmark() { + return "Unable to unmark the specified task: task index provided is invalid."; + } + +} diff --git a/src/main/java/MissingParameterException.java b/src/main/java/MissingParameterException.java new file mode 100644 index 000000000..94b94d7ff --- /dev/null +++ b/src/main/java/MissingParameterException.java @@ -0,0 +1,24 @@ +public class MissingParameterException extends Exception { + /** + * Exception which returns an error message when there are missing parameter(s) in task operations. + * + * @return An error message when user provides incomplete/missing parameters in task operations + */ + public String missingParamDesc() { + return "Task description parameter is missing"; + } + + public String missingParamStart() { + return "Task from parameter is missing"; + } + + public String missingParamEnd() { + return "Task to parameter is missing"; + + } + + public String missingParamBy() { + return "Task by parameter is missing"; + } + +} diff --git a/src/main/java/Sage.java b/src/main/java/Sage.java index 2bd3dd10d..b698943f1 100644 --- a/src/main/java/Sage.java +++ b/src/main/java/Sage.java @@ -2,8 +2,8 @@ public class Sage { public static void main(String[] args) { - Display ui = new Display(); TaskList taskList = new TaskList(); + Display ui = new Display(); Scanner input = new Scanner(System.in); ui.welcomeUser(); while (input.hasNextLine()) { @@ -13,25 +13,22 @@ public static void main(String[] args) { ui.goodByeUser(); return; case "list": - ui.displayTask(taskList); + taskList.listTask(); break; case "unmark": - taskList.unmarkTask(command.getTaskDescription(), ui); + taskList.unmarkTask(command.getTaskDescription()); break; case "mark": - taskList.markTask(command.getTaskDescription(), ui); + taskList.markTask(command.getTaskDescription()); break; case "todo": taskList.addTask(command.getTaskDescription()); - ui.addedTask(command, TaskType.TODO, taskList); break; case "deadline": taskList.addTask(command.getTaskDescription(), command.getBy()); - ui.addedTask(command, TaskType.DEADLINE, taskList); break; case "event": taskList.addTask(command.getTaskDescription(), command.getFrom(), command.getTo()); - ui.addedTask(command, TaskType.EVENT, taskList); break; default: ui.unknownInput(); diff --git a/src/main/java/TaskList.java b/src/main/java/TaskList.java index 57f415099..0c7fd9110 100644 --- a/src/main/java/TaskList.java +++ b/src/main/java/TaskList.java @@ -3,17 +3,24 @@ public class TaskList { private static ArrayList list = new ArrayList<>(); + private static final Display UI = new Display(); + /** * This method instantiate a Todo object and add the Todo object to the TaskList * * @param taskName The name of the TODO task to be added **/ public void addTask(String taskName) { - if (taskName == null) { - throw new IllegalArgumentException("Todo description parameter is missing"); - } else { - Todo t = new Todo(taskName); - list.add(t); + try { + if (taskName == null) { + throw new MissingParameterException(); + } else { + Todo t = new Todo(taskName); + list.add(t); + } + UI.addedTask(taskName, list.size()); + } catch (MissingParameterException e) { + System.out.println(e.missingParamDesc()); } } @@ -24,13 +31,20 @@ public void addTask(String taskName) { * @param byWhen a string that represents the deadline of the Deadline task. **/ public void addTask(String taskName, String byWhen) { - if (taskName == null) { - throw new IllegalArgumentException("Deadline description parameter is missing"); - } else if (byWhen == null) { - throw new IllegalArgumentException("Deadline by parameter is missing"); - } else { - Deadline d = new Deadline(taskName, byWhen); - list.add(d); + try { + if (taskName == null || byWhen == null) { + throw new MissingParameterException(); + } else { + Deadline d = new Deadline(taskName, byWhen); + list.add(d); + } + UI.addedTask(taskName, byWhen, list.size()); + } catch (MissingParameterException e) { + if (taskName == null) { + System.out.println(e.missingParamDesc()); + } else { + System.out.println(e.missingParamBy()); + } } } @@ -42,15 +56,22 @@ public void addTask(String taskName, String byWhen) { * @param endWhen a string that represents the end date and time of the Event task. */ public void addTask(String taskName, String startWhen, String endWhen) { - if (taskName == null) { - throw new IllegalArgumentException("Event description parameter is missing"); - } else if (startWhen == null) { - throw new IllegalArgumentException("Event starting parameter is missing"); - } else if (endWhen == null) { - throw new IllegalArgumentException("Event ending parameter is missing"); - } else { - Event e = new Event(taskName, startWhen, endWhen); - list.add(e); + try { + if (taskName == null || startWhen == null || endWhen == null) { + throw new MissingParameterException(); + } else { + Event e = new Event(taskName, startWhen, endWhen); + list.add(e); + } + UI.addedTask(taskName, startWhen, endWhen, list.size()); + } catch (MissingParameterException e) { + if (taskName == null) { + System.out.println(e.missingParamDesc()); + } else if (startWhen == null) { + System.out.println(e.missingParamStart()); + } else { + System.out.println(e.missingParamEnd()); + } } } @@ -58,21 +79,24 @@ public void addTask(String taskName, String startWhen, String endWhen) { * Unmarks a completed task. * * @param taskDescription string that represents the index of the task to unmark (1-Indexed). - * @param ui an object of the Display class that provides the user interface. */ - public void unmarkTask(String taskDescription, Display ui) { + public void unmarkTask(String taskDescription) { try { int taskNumber = Integer.parseInt(taskDescription); if (taskNumber <= 0 || taskNumber > list.size()) { - ui.taskNotFound(); + throw new InvalidTaskException(); } else if (!list.get(taskNumber - 1).isCompleted()) { - ui.invalidUnmark(); + throw new IllegalTaskOperation(); } else { list.get(taskNumber - 1).setCompleted(false); - ui.validUnmark(list, taskNumber); + UI.validUnmark(list, taskNumber); } + } catch (InvalidTaskException e) { + System.out.println(e.errorUnmark()); + } catch (IllegalTaskOperation e) { + System.out.println(e.errorAlreadyUnmarked()); } catch (NumberFormatException e) { - System.out.println("Index of task to be unmarked is missing"); + System.out.println("No index is provided!"); } } @@ -81,30 +105,43 @@ public void unmarkTask(String taskDescription, Display ui) { * Marks a completed task. * * @param taskDescription a string that represents the index of the task to mark (1-Indexed). - * @param ui an object of the Display class that provides the user interface. */ - public void markTask(String taskDescription, Display ui) { + public void markTask(String taskDescription) { try { int taskNumber = Integer.parseInt(taskDescription); if (taskNumber <= 0 || taskNumber > list.size()) { - ui.taskNotFound(); + throw new InvalidTaskException(); } else if (list.get(taskNumber - 1).isCompleted()) { - ui.invalidMark(); + throw new IllegalTaskOperation(); } else { list.get(taskNumber - 1).setCompleted(true); - ui.validMark(list, taskNumber); + UI.validMark(list, taskNumber); } + } catch (InvalidTaskException e) { + System.out.println(e.errorMark()); + } catch (IllegalTaskOperation e) { + System.out.println(e.errorAlreadyMarked()); } catch (NumberFormatException e) { - System.out.println("Index of task to be marked is missing"); + System.out.println("No index is provided!"); } } public void listTask() { - System.out.println("Here are the tasks in your list:"); - for (int i = 0; i < list.size(); i++) { - System.out.print(i + 1); - System.out.println(list.get(i).toString()); + System.out.println(UI.printLine()); + try { + if (list.size() > 0) { + System.out.println("Here are the tasks in your list:"); + for (int i = 0; i < list.size(); i++) { + System.out.print(i + 1); + System.out.println(list.get(i).toString()); + } + } else { + throw new EmptyListException(); + } + } catch (EmptyListException e) { + System.out.println(e.errorMsg()); } + System.out.println(UI.printLine()); } public int getTaskCount() { From ee57ec6fdf2c6c12ac36b30a9dcbbc22a973d375 Mon Sep 17 00:00:00 2001 From: firwer Date: Mon, 6 Feb 2023 13:15:05 +0800 Subject: [PATCH 19/37] refactor: grouped class files into packages --- src/main/java/{ => sage/enums}/TaskType.java | 2 ++ .../exceptions}/EmptyListException.java | 2 ++ .../exceptions}/IllegalTaskOperation.java | 2 ++ .../exceptions}/InvalidTaskException.java | 2 ++ .../MissingParameterException.java | 2 ++ src/main/java/{ => sage/main}/Sage.java | 6 ++++++ .../java/{ => sage/tasktypes}/Deadline.java | 2 ++ src/main/java/{ => sage/tasktypes}/Event.java | 2 ++ src/main/java/{ => sage/tasktypes}/Task.java | 2 ++ src/main/java/{ => sage/tasktypes}/Todo.java | 2 ++ src/main/java/{ => sage/utility}/Command.java | 2 ++ src/main/java/{ => sage/utility}/Display.java | 20 +++++++------------ .../java/{ => sage/utility}/TaskList.java | 11 ++++++++++ 13 files changed, 44 insertions(+), 13 deletions(-) rename src/main/java/{ => sage/enums}/TaskType.java (73%) rename src/main/java/{ => sage/exceptions}/EmptyListException.java (93%) rename src/main/java/{ => sage/exceptions}/IllegalTaskOperation.java (94%) rename src/main/java/{ => sage/exceptions}/InvalidTaskException.java (95%) rename src/main/java/{ => sage/exceptions}/MissingParameterException.java (96%) rename src/main/java/{ => sage/main}/Sage.java (92%) rename src/main/java/{ => sage/tasktypes}/Deadline.java (95%) rename src/main/java/{ => sage/tasktypes}/Event.java (96%) rename src/main/java/{ => sage/tasktypes}/Task.java (95%) rename src/main/java/{ => sage/tasktypes}/Todo.java (92%) rename src/main/java/{ => sage/utility}/Command.java (98%) rename src/main/java/{ => sage/utility}/Display.java (92%) rename src/main/java/{ => sage/utility}/TaskList.java (94%) diff --git a/src/main/java/TaskType.java b/src/main/java/sage/enums/TaskType.java similarity index 73% rename from src/main/java/TaskType.java rename to src/main/java/sage/enums/TaskType.java index 3cb851374..ed74470a8 100644 --- a/src/main/java/TaskType.java +++ b/src/main/java/sage/enums/TaskType.java @@ -1,3 +1,5 @@ +package sage.enums; + public enum TaskType { DEADLINE, TODO, diff --git a/src/main/java/EmptyListException.java b/src/main/java/sage/exceptions/EmptyListException.java similarity index 93% rename from src/main/java/EmptyListException.java rename to src/main/java/sage/exceptions/EmptyListException.java index ed162530c..f7a288319 100644 --- a/src/main/java/EmptyListException.java +++ b/src/main/java/sage/exceptions/EmptyListException.java @@ -1,3 +1,5 @@ +package sage.exceptions; + public class EmptyListException extends Exception { /** * Exception which returns an error message when operations is conducted on an empty list. diff --git a/src/main/java/IllegalTaskOperation.java b/src/main/java/sage/exceptions/IllegalTaskOperation.java similarity index 94% rename from src/main/java/IllegalTaskOperation.java rename to src/main/java/sage/exceptions/IllegalTaskOperation.java index 94960850a..266256952 100644 --- a/src/main/java/IllegalTaskOperation.java +++ b/src/main/java/sage/exceptions/IllegalTaskOperation.java @@ -1,3 +1,5 @@ +package sage.exceptions; + public class IllegalTaskOperation extends Exception { /** * Exception which returns an error message when operations is conducted on an empty list. diff --git a/src/main/java/InvalidTaskException.java b/src/main/java/sage/exceptions/InvalidTaskException.java similarity index 95% rename from src/main/java/InvalidTaskException.java rename to src/main/java/sage/exceptions/InvalidTaskException.java index 44adcd945..eddfc9567 100644 --- a/src/main/java/InvalidTaskException.java +++ b/src/main/java/sage/exceptions/InvalidTaskException.java @@ -1,3 +1,5 @@ +package sage.exceptions; + public class InvalidTaskException extends Exception { /** * Exception which returns an error message when an out-of-bound task index is provided by the user diff --git a/src/main/java/MissingParameterException.java b/src/main/java/sage/exceptions/MissingParameterException.java similarity index 96% rename from src/main/java/MissingParameterException.java rename to src/main/java/sage/exceptions/MissingParameterException.java index 94b94d7ff..d0fdc448e 100644 --- a/src/main/java/MissingParameterException.java +++ b/src/main/java/sage/exceptions/MissingParameterException.java @@ -1,3 +1,5 @@ +package sage.exceptions; + public class MissingParameterException extends Exception { /** * Exception which returns an error message when there are missing parameter(s) in task operations. diff --git a/src/main/java/Sage.java b/src/main/java/sage/main/Sage.java similarity index 92% rename from src/main/java/Sage.java rename to src/main/java/sage/main/Sage.java index b698943f1..3fb0d2347 100644 --- a/src/main/java/Sage.java +++ b/src/main/java/sage/main/Sage.java @@ -1,3 +1,9 @@ +package sage.main; + +import sage.utility.Command; +import sage.utility.Display; +import sage.utility.TaskList; + import java.util.Scanner; public class Sage { diff --git a/src/main/java/Deadline.java b/src/main/java/sage/tasktypes/Deadline.java similarity index 95% rename from src/main/java/Deadline.java rename to src/main/java/sage/tasktypes/Deadline.java index fbca9344d..3deb84305 100644 --- a/src/main/java/Deadline.java +++ b/src/main/java/sage/tasktypes/Deadline.java @@ -1,3 +1,5 @@ +package sage.tasktypes; + public class Deadline extends Task { private String byWhen = ""; diff --git a/src/main/java/Event.java b/src/main/java/sage/tasktypes/Event.java similarity index 96% rename from src/main/java/Event.java rename to src/main/java/sage/tasktypes/Event.java index 1b1819f28..e9ea69749 100644 --- a/src/main/java/Event.java +++ b/src/main/java/sage/tasktypes/Event.java @@ -1,3 +1,5 @@ +package sage.tasktypes; + public class Event extends Task { private String startWhen = ""; diff --git a/src/main/java/Task.java b/src/main/java/sage/tasktypes/Task.java similarity index 95% rename from src/main/java/Task.java rename to src/main/java/sage/tasktypes/Task.java index 6a0028103..f97c80cca 100644 --- a/src/main/java/Task.java +++ b/src/main/java/sage/tasktypes/Task.java @@ -1,3 +1,5 @@ +package sage.tasktypes; + public class Task { private String taskName = ""; private boolean completed = false; diff --git a/src/main/java/Todo.java b/src/main/java/sage/tasktypes/Todo.java similarity index 92% rename from src/main/java/Todo.java rename to src/main/java/sage/tasktypes/Todo.java index 40edf5f76..c8cf12a03 100644 --- a/src/main/java/Todo.java +++ b/src/main/java/sage/tasktypes/Todo.java @@ -1,3 +1,5 @@ +package sage.tasktypes; + public class Todo extends Task { public Todo(String taskName) { diff --git a/src/main/java/Command.java b/src/main/java/sage/utility/Command.java similarity index 98% rename from src/main/java/Command.java rename to src/main/java/sage/utility/Command.java index 06d8ddeff..364119904 100644 --- a/src/main/java/Command.java +++ b/src/main/java/sage/utility/Command.java @@ -1,3 +1,5 @@ +package sage.utility; + public class Command { private String[] rawOutput; private String taskType; diff --git a/src/main/java/Display.java b/src/main/java/sage/utility/Display.java similarity index 92% rename from src/main/java/Display.java rename to src/main/java/sage/utility/Display.java index ea9005d8e..12d305eaf 100644 --- a/src/main/java/Display.java +++ b/src/main/java/sage/utility/Display.java @@ -1,5 +1,12 @@ +package sage.utility; + import java.util.ArrayList; +import sage.tasktypes.Deadline; +import sage.tasktypes.Event; +import sage.tasktypes.Todo; +import sage.tasktypes.Task; + public class Display { private static final String LINE = "█████╗█████╗█████╗█████╗█████╗█████╗█████╗\n" + @@ -31,19 +38,6 @@ public void goodByeUser() { * * @param taskList The TaskList object that contains the tasks to be displayed. */ -// public void displayTask(TaskList taskList) { -// System.out.println(LINE); -// try { -// if (taskList.getTaskCount() > 0) { -// taskList.listTask(); -// } else { -// throw new EmptyListException(); -// } -// } catch (EmptyListException e) { -// System.out.println(e.errorMsg()); -// } -// System.out.println(LINE); -// } /** * This method prints a message to the console indicating the addition of a task to the task list and its details. diff --git a/src/main/java/TaskList.java b/src/main/java/sage/utility/TaskList.java similarity index 94% rename from src/main/java/TaskList.java rename to src/main/java/sage/utility/TaskList.java index 0c7fd9110..5f29c1b66 100644 --- a/src/main/java/TaskList.java +++ b/src/main/java/sage/utility/TaskList.java @@ -1,5 +1,16 @@ +package sage.utility; + import java.util.ArrayList; +import sage.exceptions.IllegalTaskOperation; +import sage.exceptions.MissingParameterException; +import sage.exceptions.EmptyListException; +import sage.exceptions.InvalidTaskException; +import sage.tasktypes.Deadline; +import sage.tasktypes.Event; +import sage.tasktypes.Task; +import sage.tasktypes.Todo; + public class TaskList { private static ArrayList list = new ArrayList<>(); From 673838f67f56c248816f176b2a06e3b7cdb4404d Mon Sep 17 00:00:00 2001 From: firwer Date: Mon, 13 Feb 2023 12:45:31 +0800 Subject: [PATCH 20/37] Level-6: Implement delete function --- .../sage/exceptions/EmptyListException.java | 15 ++-- .../exceptions/IllegalOperationException.java | 17 ++++ .../sage/exceptions/IllegalTaskOperation.java | 16 ---- .../sage/exceptions/InvalidTaskException.java | 17 ---- .../exceptions/MissingParameterException.java | 30 ++++--- .../sage/exceptions/OutOfBoundException.java | 22 +++++ src/main/java/sage/main/Sage.java | 9 +- src/main/java/sage/tasktypes/Task.java | 8 +- src/main/java/sage/utility/Display.java | 64 ++++++++----- src/main/java/sage/utility/TaskList.java | 89 ++++++++++++------- 10 files changed, 173 insertions(+), 114 deletions(-) create mode 100644 src/main/java/sage/exceptions/IllegalOperationException.java delete mode 100644 src/main/java/sage/exceptions/IllegalTaskOperation.java delete mode 100644 src/main/java/sage/exceptions/InvalidTaskException.java create mode 100644 src/main/java/sage/exceptions/OutOfBoundException.java diff --git a/src/main/java/sage/exceptions/EmptyListException.java b/src/main/java/sage/exceptions/EmptyListException.java index f7a288319..268e2d76d 100644 --- a/src/main/java/sage/exceptions/EmptyListException.java +++ b/src/main/java/sage/exceptions/EmptyListException.java @@ -1,12 +1,13 @@ package sage.exceptions; +/** + * Exception which returns an error message when operations is conducted on an empty list. + *

+ * Prints exception message + */ public class EmptyListException extends Exception { - /** - * Exception which returns an error message when operations is conducted on an empty list. - * - * @return An error message when user is conducting operations on an empty list of tasks - */ - public String errorMsg() { - return "There are currently no tasks in your list!"; + + public void errorMsg() { + System.out.println("There are currently no tasks in your list!"); } } diff --git a/src/main/java/sage/exceptions/IllegalOperationException.java b/src/main/java/sage/exceptions/IllegalOperationException.java new file mode 100644 index 000000000..b76f3c81f --- /dev/null +++ b/src/main/java/sage/exceptions/IllegalOperationException.java @@ -0,0 +1,17 @@ +package sage.exceptions; + +/** + * Exception which returns an error message when operations is conducted on an empty list. + *

+ * Prints exception message + */ +public class IllegalOperationException extends Exception { + + public void errorAlreadyUnmarked() { + System.out.println("Task already marked as not completed!"); + } + + public void errorAlreadyMarked() { + System.out.println("Task already marked as completed!"); + } +} diff --git a/src/main/java/sage/exceptions/IllegalTaskOperation.java b/src/main/java/sage/exceptions/IllegalTaskOperation.java deleted file mode 100644 index 266256952..000000000 --- a/src/main/java/sage/exceptions/IllegalTaskOperation.java +++ /dev/null @@ -1,16 +0,0 @@ -package sage.exceptions; - -public class IllegalTaskOperation extends Exception { - /** - * Exception which returns an error message when operations is conducted on an empty list. - * - * @return An error message when user is conducting operations on an empty list of tasks - */ - public String errorAlreadyUnmarked() { - return "Task already marked as not completed!"; - } - - public String errorAlreadyMarked() { - return "Task already marked as completed!"; - } -} diff --git a/src/main/java/sage/exceptions/InvalidTaskException.java b/src/main/java/sage/exceptions/InvalidTaskException.java deleted file mode 100644 index eddfc9567..000000000 --- a/src/main/java/sage/exceptions/InvalidTaskException.java +++ /dev/null @@ -1,17 +0,0 @@ -package sage.exceptions; - -public class InvalidTaskException extends Exception { - /** - * Exception which returns an error message when an out-of-bound task index is provided by the user - * - * @return An error message when user provides a task index that is out of bound - */ - public String errorMark() { - return "Unable to mark the specified task: task index provided is invalid."; - } - - public String errorUnmark() { - return "Unable to unmark the specified task: task index provided is invalid."; - } - -} diff --git a/src/main/java/sage/exceptions/MissingParameterException.java b/src/main/java/sage/exceptions/MissingParameterException.java index d0fdc448e..8f022c6af 100644 --- a/src/main/java/sage/exceptions/MissingParameterException.java +++ b/src/main/java/sage/exceptions/MissingParameterException.java @@ -1,26 +1,30 @@ package sage.exceptions; +/** + * Exception which returns an error message when there are missing parameter(s) in task operations. + *

+ * Prints exception message + */ public class MissingParameterException extends Exception { - /** - * Exception which returns an error message when there are missing parameter(s) in task operations. - * - * @return An error message when user provides incomplete/missing parameters in task operations - */ - public String missingParamDesc() { - return "Task description parameter is missing"; + + public void missingParamDesc() { + System.out.println("Task \"description\" parameter is missing"); } - public String missingParamStart() { - return "Task from parameter is missing"; + public void missingParamStart() { + System.out.println("Task \"from\" parameter is missing"); } - public String missingParamEnd() { - return "Task to parameter is missing"; + public void missingParamEnd() { + System.out.println("Task \"to\" parameter is missing"); } - public String missingParamBy() { - return "Task by parameter is missing"; + public void missingParamBy() { + System.out.println("Task \"by\" parameter is missing"); } + public void missingParamTaskIndex() { + System.out.println("Delete \"index\" parameter is missing"); + } } diff --git a/src/main/java/sage/exceptions/OutOfBoundException.java b/src/main/java/sage/exceptions/OutOfBoundException.java new file mode 100644 index 000000000..9d2ce427d --- /dev/null +++ b/src/main/java/sage/exceptions/OutOfBoundException.java @@ -0,0 +1,22 @@ +package sage.exceptions; + +/** + * Exception which returns an error message when an out-of-bound task index is provided by the user + *

+ * Prints exception message + */ +public class OutOfBoundException extends Exception { + + public void errorMark() { + System.out.println("Unable to mark the specified task: task index provided is invalid."); + } + + public void errorUnmark() { + System.out.println("Unable to unmark the specified task: task index provided is invalid."); + } + + public void errorDelete() { + System.out.println("Unable to delete the specified task: task index provided is invalid."); + } + +} diff --git a/src/main/java/sage/main/Sage.java b/src/main/java/sage/main/Sage.java index 3fb0d2347..9dd918125 100644 --- a/src/main/java/sage/main/Sage.java +++ b/src/main/java/sage/main/Sage.java @@ -11,12 +11,12 @@ public static void main(String[] args) { TaskList taskList = new TaskList(); Display ui = new Display(); Scanner input = new Scanner(System.in); - ui.welcomeUser(); + ui.printWelcomeUser(); while (input.hasNextLine()) { Command command = new Command(input.nextLine()); switch (command.getTaskType()) { case "bye": - ui.goodByeUser(); + ui.printGoodByeUser(); return; case "list": taskList.listTask(); @@ -27,6 +27,9 @@ public static void main(String[] args) { case "mark": taskList.markTask(command.getTaskDescription()); break; + case "delete": + taskList.deleteTask(command.getTaskDescription()); + break; case "todo": taskList.addTask(command.getTaskDescription()); break; @@ -37,7 +40,7 @@ public static void main(String[] args) { taskList.addTask(command.getTaskDescription(), command.getFrom(), command.getTo()); break; default: - ui.unknownInput(); + ui.printUnknownInput(); break; } } diff --git a/src/main/java/sage/tasktypes/Task.java b/src/main/java/sage/tasktypes/Task.java index f97c80cca..08cf46d87 100644 --- a/src/main/java/sage/tasktypes/Task.java +++ b/src/main/java/sage/tasktypes/Task.java @@ -2,11 +2,11 @@ public class Task { private String taskName = ""; - private boolean completed = false; + private boolean isCompleted = false; public Task(String taskName) { this.taskName = taskName; - this.completed = false; + this.isCompleted = false; } public String getTaskName() { @@ -14,11 +14,11 @@ public String getTaskName() { } public void setCompleted(boolean completed) { - this.completed = completed; + this.isCompleted = completed; } public boolean isCompleted() { - return completed; + return isCompleted; } public String toString() { diff --git a/src/main/java/sage/utility/Display.java b/src/main/java/sage/utility/Display.java index 12d305eaf..abc151001 100644 --- a/src/main/java/sage/utility/Display.java +++ b/src/main/java/sage/utility/Display.java @@ -22,32 +22,24 @@ public String printLine() { return LINE; } - public void welcomeUser() { + public void printWelcomeUser() { String welcome = "Hello! I'm SAGE, the knowledgeable one\n" + "What can I do for you today?\n"; System.out.println(LOGO); System.out.println(welcome); } - public void goodByeUser() { + public void printGoodByeUser() { System.out.println("Bye. Hope to see you again soon!"); } /** - * Displays the list of tasks stored in the taskList. + * This method prints a message to the console indicating the addition of a TODO task to the task list and its details. * - * @param taskList The TaskList object that contains the tasks to be displayed. + * @param taskDescription The description of the task. + * @param taskCount The number of tasks in list. */ - - /** - * This method prints a message to the console indicating the addition of a task to the task list and its details. - * The message includes the type of task, the task description and the task count after adding the task. - * - * @param userInput The input entered by the user in the form of an array of strings after character split - * @param taskType The type of task being added (TODO, EVENT or DEADLINE) - * @param taskList The list of tasks to which the new task is being added - **/ - public void addedTask(String taskDescription, int taskCount) { + public void printAddedTask(String taskDescription, int taskCount) { System.out.println(LINE); System.out.println("Got it. I've added this task:"); System.out.println("[T][ ] " + taskDescription); @@ -55,7 +47,14 @@ public void addedTask(String taskDescription, int taskCount) { System.out.println(LINE); } - public void addedTask(String taskDescription, String by, int taskCount) { + /** + * This method prints a message to the console indicating the addition of a DEADLINE task to the task list and its details. + * + * @param taskDescription The description of the task. + * @param by The deadline date/time of the task + * @param taskCount The number of tasks in list. + */ + public void printAddedTask(String taskDescription, String by, int taskCount) { System.out.println(LINE); System.out.println("Got it. I've added this task:"); System.out.println("[D][ ] " + taskDescription + "(by: " @@ -64,7 +63,15 @@ public void addedTask(String taskDescription, String by, int taskCount) { System.out.println(LINE); } - public void addedTask(String taskDescription, String from, String to, int taskCount) { + /** + * This method prints a message to the console indicating the addition of an EVENT task to the task list and its details. + * + * @param taskDescription The description of the task. + * @param from The starting date/time of the task + * @param to The ending date/time of the task + * @param taskCount The number of tasks in list. + */ + public void printAddedTask(String taskDescription, String from, String to, int taskCount) { System.out.println(LINE); System.out.println("Got it. I've added this task:"); System.out.println("[E][ ] " + taskDescription + "(from: " @@ -73,11 +80,11 @@ public void addedTask(String taskDescription, String from, String to, int taskCo System.out.println(LINE); } - public void taskNotFound() { + public void printTaskNotFound() { System.out.println("Uh-oh! Task Not Found!"); } - public void unknownInput() { + public void printUnknownInput() { System.out.println("I don't understand what you mean, please try again!"); } @@ -88,7 +95,7 @@ public void unknownInput() { * @param list the list of tasks * @param taskNumber the taskNumber index that is to be unmarked */ - public void validUnmark(ArrayList list, int taskNumber) { + public void printValidUnmark(ArrayList list, int taskNumber) { Task taskObj = list.get(taskNumber - 1); System.out.println("OK, I've marked this task as not done yet:"); @@ -111,7 +118,7 @@ public void validUnmark(ArrayList list, int taskNumber) { * @param list the list of tasks * @param taskNumber the taskNumber index that is to be marked */ - public void validMark(ArrayList list, int taskNumber) { + public void printValidMark(ArrayList list, int taskNumber) { Task taskObj = list.get(taskNumber - 1); System.out.println("Nice! I've marked this task as done:"); if (taskObj instanceof Deadline) { @@ -127,4 +134,21 @@ public void validMark(ArrayList list, int taskNumber) { } } + public void printDeletedTask(ArrayList list, int taskNumber) { + Task taskObj = list.get(taskNumber - 1); + System.out.println("Noted. I've removed this task:"); + if (taskObj instanceof Deadline) { + System.out.println("[E][X] " + taskObj.getTaskName() + "(by: " + + ((Deadline) taskObj).getByWhen() + ") "); + } else if (taskObj instanceof Event) { + Event event = (Event) taskObj; + System.out.println("[E][X] " + event.getTaskName() + "(from: " + + event.getStartWhen() + " to: " + event.getEndWhen() + ")"); + } else { + Todo todo = (Todo) taskObj; + System.out.println("[T][X] " + todo.getTaskName()); + } + System.out.println("Now you have " + String.valueOf(list.size() - 1) + " tasks in the list."); + } + } diff --git a/src/main/java/sage/utility/TaskList.java b/src/main/java/sage/utility/TaskList.java index 5f29c1b66..628c0e29b 100644 --- a/src/main/java/sage/utility/TaskList.java +++ b/src/main/java/sage/utility/TaskList.java @@ -2,10 +2,10 @@ import java.util.ArrayList; -import sage.exceptions.IllegalTaskOperation; +import sage.exceptions.IllegalOperationException; import sage.exceptions.MissingParameterException; import sage.exceptions.EmptyListException; -import sage.exceptions.InvalidTaskException; +import sage.exceptions.OutOfBoundException; import sage.tasktypes.Deadline; import sage.tasktypes.Event; import sage.tasktypes.Task; @@ -29,9 +29,9 @@ public void addTask(String taskName) { Todo t = new Todo(taskName); list.add(t); } - UI.addedTask(taskName, list.size()); + UI.printAddedTask(taskName, list.size()); } catch (MissingParameterException e) { - System.out.println(e.missingParamDesc()); + e.missingParamDesc(); } } @@ -49,12 +49,12 @@ public void addTask(String taskName, String byWhen) { Deadline d = new Deadline(taskName, byWhen); list.add(d); } - UI.addedTask(taskName, byWhen, list.size()); + UI.printAddedTask(taskName, byWhen, list.size()); } catch (MissingParameterException e) { if (taskName == null) { - System.out.println(e.missingParamDesc()); + e.missingParamDesc(); } else { - System.out.println(e.missingParamBy()); + e.missingParamBy(); } } } @@ -74,40 +74,61 @@ public void addTask(String taskName, String startWhen, String endWhen) { Event e = new Event(taskName, startWhen, endWhen); list.add(e); } - UI.addedTask(taskName, startWhen, endWhen, list.size()); + UI.printAddedTask(taskName, startWhen, endWhen, list.size()); } catch (MissingParameterException e) { if (taskName == null) { - System.out.println(e.missingParamDesc()); + e.missingParamDesc(); } else if (startWhen == null) { - System.out.println(e.missingParamStart()); + e.missingParamStart(); } else { - System.out.println(e.missingParamEnd()); + e.missingParamEnd(); } } } + /** + * Deletes a task. + * + * @param taskIndex string that represents the index of the task to unmark (1-Indexed). + */ + public void deleteTask(String taskIndex) { + try { + int taskNumber = Integer.parseInt(taskIndex); + if (taskNumber <= 0 || taskNumber > list.size()) { + throw new OutOfBoundException(); + } else { + UI.printDeletedTask(list, taskNumber); + list.remove(taskNumber - 1); + } + } catch (OutOfBoundException e) { + e.errorDelete(); + } catch (NumberFormatException e) { + e.printStackTrace(); + } + } + /** * Unmarks a completed task. * - * @param taskDescription string that represents the index of the task to unmark (1-Indexed). + * @param taskIndex string that represents the index of the task to unmark (1-Indexed). */ - public void unmarkTask(String taskDescription) { + public void unmarkTask(String taskIndex) { try { - int taskNumber = Integer.parseInt(taskDescription); + int taskNumber = Integer.parseInt(taskIndex); if (taskNumber <= 0 || taskNumber > list.size()) { - throw new InvalidTaskException(); + throw new OutOfBoundException(); } else if (!list.get(taskNumber - 1).isCompleted()) { - throw new IllegalTaskOperation(); + throw new IllegalOperationException(); } else { list.get(taskNumber - 1).setCompleted(false); - UI.validUnmark(list, taskNumber); + UI.printValidUnmark(list, taskNumber); } - } catch (InvalidTaskException e) { - System.out.println(e.errorUnmark()); - } catch (IllegalTaskOperation e) { - System.out.println(e.errorAlreadyUnmarked()); + } catch (OutOfBoundException e) { + e.errorUnmark(); + } catch (IllegalOperationException e) { + e.errorAlreadyUnmarked(); } catch (NumberFormatException e) { - System.out.println("No index is provided!"); + e.printStackTrace(); } } @@ -115,25 +136,25 @@ public void unmarkTask(String taskDescription) { /** * Marks a completed task. * - * @param taskDescription a string that represents the index of the task to mark (1-Indexed). + * @param taskIndex a string that represents the index of the task to mark (1-Indexed). */ - public void markTask(String taskDescription) { + public void markTask(String taskIndex) { try { - int taskNumber = Integer.parseInt(taskDescription); + int taskNumber = Integer.parseInt(taskIndex); if (taskNumber <= 0 || taskNumber > list.size()) { - throw new InvalidTaskException(); + throw new OutOfBoundException(); } else if (list.get(taskNumber - 1).isCompleted()) { - throw new IllegalTaskOperation(); + throw new IllegalOperationException(); } else { list.get(taskNumber - 1).setCompleted(true); - UI.validMark(list, taskNumber); + UI.printValidMark(list, taskNumber); } - } catch (InvalidTaskException e) { - System.out.println(e.errorMark()); - } catch (IllegalTaskOperation e) { - System.out.println(e.errorAlreadyMarked()); + } catch (OutOfBoundException e) { + e.errorMark(); + } catch (IllegalOperationException e) { + e.errorAlreadyMarked(); } catch (NumberFormatException e) { - System.out.println("No index is provided!"); + e.printStackTrace(); } } @@ -150,7 +171,7 @@ public void listTask() { throw new EmptyListException(); } } catch (EmptyListException e) { - System.out.println(e.errorMsg()); + e.errorMsg(); } System.out.println(UI.printLine()); } From 777b8be8bbfd803286c2bc32b62818fa209ba8ae Mon Sep 17 00:00:00 2001 From: firwer Date: Mon, 13 Feb 2023 12:53:08 +0800 Subject: [PATCH 21/37] fix: Task completion symbol not showing correctly --- src/main/java/sage/tasktypes/Task.java | 7 +++++++ src/main/java/sage/utility/Display.java | 6 +++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/main/java/sage/tasktypes/Task.java b/src/main/java/sage/tasktypes/Task.java index 08cf46d87..bf46a83d3 100644 --- a/src/main/java/sage/tasktypes/Task.java +++ b/src/main/java/sage/tasktypes/Task.java @@ -21,6 +21,13 @@ public boolean isCompleted() { return isCompleted; } + public char printStatusSymbol() { + if (isCompleted) { + return 'X'; + } + return ' '; + } + public String toString() { return ""; } diff --git a/src/main/java/sage/utility/Display.java b/src/main/java/sage/utility/Display.java index abc151001..eb85db201 100644 --- a/src/main/java/sage/utility/Display.java +++ b/src/main/java/sage/utility/Display.java @@ -138,15 +138,15 @@ public void printDeletedTask(ArrayList list, int taskNumber) { Task taskObj = list.get(taskNumber - 1); System.out.println("Noted. I've removed this task:"); if (taskObj instanceof Deadline) { - System.out.println("[E][X] " + taskObj.getTaskName() + "(by: " + + System.out.println("[E][" + taskObj.printStatusSymbol() + "] " + taskObj.getTaskName() + "(by: " + ((Deadline) taskObj).getByWhen() + ") "); } else if (taskObj instanceof Event) { Event event = (Event) taskObj; - System.out.println("[E][X] " + event.getTaskName() + "(from: " + System.out.println("[E][" + taskObj.printStatusSymbol() + "] " + event.getTaskName() + "(from: " + event.getStartWhen() + " to: " + event.getEndWhen() + ")"); } else { Todo todo = (Todo) taskObj; - System.out.println("[T][X] " + todo.getTaskName()); + System.out.println("[T][" + taskObj.printStatusSymbol() + "] " + todo.getTaskName()); } System.out.println("Now you have " + String.valueOf(list.size() - 1) + " tasks in the list."); } From 82c462cab04b8a8c160b13e7f1b6cf469827a8bb Mon Sep 17 00:00:00 2001 From: firwer Date: Mon, 13 Feb 2023 13:19:09 +0800 Subject: [PATCH 22/37] refactor: Massive overhaul of duplicated code through abstraction --- src/main/java/sage/tasktypes/Deadline.java | 4 +- src/main/java/sage/tasktypes/Event.java | 4 +- src/main/java/sage/tasktypes/Todo.java | 4 +- src/main/java/sage/utility/Display.java | 97 ++++------------------ src/main/java/sage/utility/TaskList.java | 13 +-- 5 files changed, 27 insertions(+), 95 deletions(-) diff --git a/src/main/java/sage/tasktypes/Deadline.java b/src/main/java/sage/tasktypes/Deadline.java index 3deb84305..79ecf5a45 100644 --- a/src/main/java/sage/tasktypes/Deadline.java +++ b/src/main/java/sage/tasktypes/Deadline.java @@ -15,9 +15,9 @@ public String getByWhen() { @Override public String toString() { if (super.isCompleted()) { - return ".[D][X] " + super.getTaskName() + "(by: " + getByWhen() + ")"; + return "[D][X] " + super.getTaskName() + "(by: " + getByWhen() + ")"; } else { - return ".[D][ ] " + super.getTaskName() + "(by: " + getByWhen() + ")"; + return "[D][ ] " + super.getTaskName() + "(by: " + getByWhen() + ")"; } } } diff --git a/src/main/java/sage/tasktypes/Event.java b/src/main/java/sage/tasktypes/Event.java index e9ea69749..585a8f014 100644 --- a/src/main/java/sage/tasktypes/Event.java +++ b/src/main/java/sage/tasktypes/Event.java @@ -22,9 +22,9 @@ public String getEndWhen() { @Override public String toString() { if (super.isCompleted()) { - return ".[E][X] " + super.getTaskName() + "(from: " + getStartWhen() + " to: " + getEndWhen() + ")"; + return "[E][X] " + super.getTaskName() + "(from: " + getStartWhen() + " to: " + getEndWhen() + ")"; } else { - return ".[E][ ] " + super.getTaskName() + "(from: " + getStartWhen() + " to: " + getEndWhen() + ")"; + return "[E][ ] " + super.getTaskName() + "(from: " + getStartWhen() + " to: " + getEndWhen() + ")"; } } } diff --git a/src/main/java/sage/tasktypes/Todo.java b/src/main/java/sage/tasktypes/Todo.java index c8cf12a03..344b40739 100644 --- a/src/main/java/sage/tasktypes/Todo.java +++ b/src/main/java/sage/tasktypes/Todo.java @@ -9,9 +9,9 @@ public Todo(String taskName) { @Override public String toString() { if (super.isCompleted()) { - return ".[T][X] " + super.getTaskName(); + return "[T][X] " + super.getTaskName(); } else { - return ".[T][ ] " + super.getTaskName(); + return "[T][ ] " + super.getTaskName(); } } diff --git a/src/main/java/sage/utility/Display.java b/src/main/java/sage/utility/Display.java index eb85db201..17a10b0ff 100644 --- a/src/main/java/sage/utility/Display.java +++ b/src/main/java/sage/utility/Display.java @@ -36,118 +36,49 @@ public void printGoodByeUser() { /** * This method prints a message to the console indicating the addition of a TODO task to the task list and its details. * - * @param taskDescription The description of the task. - * @param taskCount The number of tasks in list. + * @param taskObj A task object (TODO/DEADLINE/EVENT) + * @param taskCount The number of tasks in list. */ - public void printAddedTask(String taskDescription, int taskCount) { + public void printAddedTask(Task taskObj, int taskCount) { System.out.println(LINE); System.out.println("Got it. I've added this task:"); - System.out.println("[T][ ] " + taskDescription); + System.out.println(taskObj); System.out.println("Now you have " + taskCount + " tasks in the list"); System.out.println(LINE); } - /** - * This method prints a message to the console indicating the addition of a DEADLINE task to the task list and its details. - * - * @param taskDescription The description of the task. - * @param by The deadline date/time of the task - * @param taskCount The number of tasks in list. - */ - public void printAddedTask(String taskDescription, String by, int taskCount) { - System.out.println(LINE); - System.out.println("Got it. I've added this task:"); - System.out.println("[D][ ] " + taskDescription + "(by: " - + by + ")"); - System.out.println("Now you have " + taskCount + " tasks in the list"); - System.out.println(LINE); - } - - /** - * This method prints a message to the console indicating the addition of an EVENT task to the task list and its details. - * - * @param taskDescription The description of the task. - * @param from The starting date/time of the task - * @param to The ending date/time of the task - * @param taskCount The number of tasks in list. - */ - public void printAddedTask(String taskDescription, String from, String to, int taskCount) { - System.out.println(LINE); - System.out.println("Got it. I've added this task:"); - System.out.println("[E][ ] " + taskDescription + "(from: " - + from + " to: " + to + ")"); - System.out.println("Now you have " + taskCount + " tasks in the list"); - System.out.println(LINE); - } - - public void printTaskNotFound() { - System.out.println("Uh-oh! Task Not Found!"); - } - public void printUnknownInput() { System.out.println("I don't understand what you mean, please try again!"); } /** - * This method is used to display a marked task as not done in the task list. + * This method is used to display a marked/unmark task as not done/done in the task list. * * @param list the list of tasks * @param taskNumber the taskNumber index that is to be unmarked + * @param isToMark whether operation executed is to mark a task */ - public void printValidUnmark(ArrayList list, int taskNumber) { - + public void printMarking(ArrayList list, int taskNumber, boolean isToMark) { Task taskObj = list.get(taskNumber - 1); - System.out.println("OK, I've marked this task as not done yet:"); - if (taskObj instanceof Deadline) { - System.out.println("[E][ ] " + taskObj.getTaskName() + "(by: " + - ((Deadline) taskObj).getByWhen() + ") "); - } else if (taskObj instanceof Event) { - Event event = (Event) taskObj; - System.out.println("[E][ ] " + event.getTaskName() + "(from: " - + event.getStartWhen() + " to: " + event.getEndWhen() + ")"); + if (isToMark) { + System.out.println("Nice! I've marked this task as done:"); } else { - Todo todo = (Todo) taskObj; - System.out.println("[T][ ] " + todo.getTaskName()); + System.out.println("OK, I've marked this task as not done yet:"); } + System.out.println(taskObj); } /** - * This method is used to display an unmarked task as done in the task list. + * This method is used to display delete operation in the task list. * * @param list the list of tasks - * @param taskNumber the taskNumber index that is to be marked + * @param taskNumber the taskNumber index of the task that is to be deleted */ - public void printValidMark(ArrayList list, int taskNumber) { - Task taskObj = list.get(taskNumber - 1); - System.out.println("Nice! I've marked this task as done:"); - if (taskObj instanceof Deadline) { - System.out.println("[E][X] " + taskObj.getTaskName() + "(by: " + - ((Deadline) taskObj).getByWhen() + ") "); - } else if (taskObj instanceof Event) { - Event event = (Event) taskObj; - System.out.println("[E][X] " + event.getTaskName() + "(from: " - + event.getStartWhen() + " to: " + event.getEndWhen() + ")"); - } else { - Todo todo = (Todo) taskObj; - System.out.println("[T][X] " + todo.getTaskName()); - } - } - public void printDeletedTask(ArrayList list, int taskNumber) { Task taskObj = list.get(taskNumber - 1); System.out.println("Noted. I've removed this task:"); - if (taskObj instanceof Deadline) { - System.out.println("[E][" + taskObj.printStatusSymbol() + "] " + taskObj.getTaskName() + "(by: " + - ((Deadline) taskObj).getByWhen() + ") "); - } else if (taskObj instanceof Event) { - Event event = (Event) taskObj; - System.out.println("[E][" + taskObj.printStatusSymbol() + "] " + event.getTaskName() + "(from: " - + event.getStartWhen() + " to: " + event.getEndWhen() + ")"); - } else { - Todo todo = (Todo) taskObj; - System.out.println("[T][" + taskObj.printStatusSymbol() + "] " + todo.getTaskName()); - } + System.out.println(taskObj); System.out.println("Now you have " + String.valueOf(list.size() - 1) + " tasks in the list."); } diff --git a/src/main/java/sage/utility/TaskList.java b/src/main/java/sage/utility/TaskList.java index 628c0e29b..ab083aaff 100644 --- a/src/main/java/sage/utility/TaskList.java +++ b/src/main/java/sage/utility/TaskList.java @@ -28,8 +28,9 @@ public void addTask(String taskName) { } else { Todo t = new Todo(taskName); list.add(t); + UI.printAddedTask(t, list.size()); } - UI.printAddedTask(taskName, list.size()); + } catch (MissingParameterException e) { e.missingParamDesc(); } @@ -48,8 +49,8 @@ public void addTask(String taskName, String byWhen) { } else { Deadline d = new Deadline(taskName, byWhen); list.add(d); + UI.printAddedTask(d, list.size()); } - UI.printAddedTask(taskName, byWhen, list.size()); } catch (MissingParameterException e) { if (taskName == null) { e.missingParamDesc(); @@ -73,8 +74,8 @@ public void addTask(String taskName, String startWhen, String endWhen) { } else { Event e = new Event(taskName, startWhen, endWhen); list.add(e); + UI.printAddedTask(e, list.size()); } - UI.printAddedTask(taskName, startWhen, endWhen, list.size()); } catch (MissingParameterException e) { if (taskName == null) { e.missingParamDesc(); @@ -121,7 +122,7 @@ public void unmarkTask(String taskIndex) { throw new IllegalOperationException(); } else { list.get(taskNumber - 1).setCompleted(false); - UI.printValidUnmark(list, taskNumber); + UI.printMarking(list, taskNumber, false); } } catch (OutOfBoundException e) { e.errorUnmark(); @@ -147,7 +148,7 @@ public void markTask(String taskIndex) { throw new IllegalOperationException(); } else { list.get(taskNumber - 1).setCompleted(true); - UI.printValidMark(list, taskNumber); + UI.printMarking(list, taskNumber, true); } } catch (OutOfBoundException e) { e.errorMark(); @@ -164,7 +165,7 @@ public void listTask() { if (list.size() > 0) { System.out.println("Here are the tasks in your list:"); for (int i = 0; i < list.size(); i++) { - System.out.print(i + 1); + System.out.print(i + 1 + "."); System.out.println(list.get(i).toString()); } } else { From 440b0eeb022461cc6c00834795629efd42e4ada0 Mon Sep 17 00:00:00 2001 From: firwer Date: Mon, 13 Feb 2023 14:08:46 +0800 Subject: [PATCH 23/37] Level-7: Add save feature --- data/sage.txt | 1 + src/main/java/sage/main/Sage.java | 4 ++++ src/main/java/sage/utility/FileMgmt.java | 30 ++++++++++++++++++++++++ src/main/java/sage/utility/TaskList.java | 11 +++++++++ 4 files changed, 46 insertions(+) create mode 100644 data/sage.txt create mode 100644 src/main/java/sage/utility/FileMgmt.java diff --git a/data/sage.txt b/data/sage.txt new file mode 100644 index 000000000..194bdd331 --- /dev/null +++ b/data/sage.txt @@ -0,0 +1 @@ +.[T][X] Hello there \ No newline at end of file diff --git a/src/main/java/sage/main/Sage.java b/src/main/java/sage/main/Sage.java index 3fb0d2347..00e164f83 100644 --- a/src/main/java/sage/main/Sage.java +++ b/src/main/java/sage/main/Sage.java @@ -2,6 +2,7 @@ import sage.utility.Command; import sage.utility.Display; +import sage.utility.FileMgmt; import sage.utility.TaskList; import java.util.Scanner; @@ -9,6 +10,7 @@ public class Sage { public static void main(String[] args) { TaskList taskList = new TaskList(); + FileMgmt fm = new FileMgmt(); Display ui = new Display(); Scanner input = new Scanner(System.in); ui.welcomeUser(); @@ -36,6 +38,8 @@ public static void main(String[] args) { case "event": taskList.addTask(command.getTaskDescription(), command.getFrom(), command.getTo()); break; + case "write": + taskList.update(fm); default: ui.unknownInput(); break; diff --git a/src/main/java/sage/utility/FileMgmt.java b/src/main/java/sage/utility/FileMgmt.java new file mode 100644 index 000000000..0f29eb7e2 --- /dev/null +++ b/src/main/java/sage/utility/FileMgmt.java @@ -0,0 +1,30 @@ +package sage.utility; + +import sage.tasktypes.Task; + +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.util.ArrayList; + +public class FileMgmt { + + private static final String PROJECT_FILE_DIR = "./data/sage.txt"; + + public void updateFile(ArrayList list) { + File f = new File(PROJECT_FILE_DIR); + try { + f.getParentFile().mkdirs(); + if (!f.exists()) { + f.createNewFile(); + } + FileWriter fw = new FileWriter(PROJECT_FILE_DIR); + for (Task taskobj : list) { + fw.write(String.valueOf(taskobj)); + } + fw.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/sage/utility/TaskList.java b/src/main/java/sage/utility/TaskList.java index 5f29c1b66..f20fc0766 100644 --- a/src/main/java/sage/utility/TaskList.java +++ b/src/main/java/sage/utility/TaskList.java @@ -10,11 +10,17 @@ import sage.tasktypes.Event; import sage.tasktypes.Task; import sage.tasktypes.Todo; +import sage.utility.FileMgmt; public class TaskList { private static ArrayList list = new ArrayList<>(); private static final Display UI = new Display(); + private static final FileMgmt fm = new FileMgmt(); + + public void update(FileMgmt fm) { + fm.updateFile(list); + } /** * This method instantiate a Todo object and add the Todo object to the TaskList @@ -30,6 +36,7 @@ public void addTask(String taskName) { list.add(t); } UI.addedTask(taskName, list.size()); + fm.updateFile(list); } catch (MissingParameterException e) { System.out.println(e.missingParamDesc()); } @@ -50,6 +57,7 @@ public void addTask(String taskName, String byWhen) { list.add(d); } UI.addedTask(taskName, byWhen, list.size()); + fm.updateFile(list); } catch (MissingParameterException e) { if (taskName == null) { System.out.println(e.missingParamDesc()); @@ -75,6 +83,7 @@ public void addTask(String taskName, String startWhen, String endWhen) { list.add(e); } UI.addedTask(taskName, startWhen, endWhen, list.size()); + fm.updateFile(list); } catch (MissingParameterException e) { if (taskName == null) { System.out.println(e.missingParamDesc()); @@ -101,6 +110,7 @@ public void unmarkTask(String taskDescription) { } else { list.get(taskNumber - 1).setCompleted(false); UI.validUnmark(list, taskNumber); + fm.updateFile(list); } } catch (InvalidTaskException e) { System.out.println(e.errorUnmark()); @@ -127,6 +137,7 @@ public void markTask(String taskDescription) { } else { list.get(taskNumber - 1).setCompleted(true); UI.validMark(list, taskNumber); + fm.updateFile(list); } } catch (InvalidTaskException e) { System.out.println(e.errorMark()); From 1eb35ee1ee24ac14156e50e000a3343375a75639 Mon Sep 17 00:00:00 2001 From: firwer Date: Wed, 15 Feb 2023 00:28:41 +0800 Subject: [PATCH 24/37] A-Jar: Create .jar file for Sage --- data/sage.txt | 4 +++- src/main/java/META-INF/MANIFEST.MF | 3 +++ src/main/java/sage/utility/FileMgmt.java | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 src/main/java/META-INF/MANIFEST.MF diff --git a/data/sage.txt b/data/sage.txt index 194bdd331..08c6a4058 100644 --- a/data/sage.txt +++ b/data/sage.txt @@ -1 +1,3 @@ -.[T][X] Hello there \ No newline at end of file +[T][ ] test +[T][X] a skmdmas +[E][ ] samdakdsak (from: asndasd to: asjndda) diff --git a/src/main/java/META-INF/MANIFEST.MF b/src/main/java/META-INF/MANIFEST.MF new file mode 100644 index 000000000..62b526a76 --- /dev/null +++ b/src/main/java/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Main-Class: sage.main.Sage + diff --git a/src/main/java/sage/utility/FileMgmt.java b/src/main/java/sage/utility/FileMgmt.java index 0f29eb7e2..60114f8bf 100644 --- a/src/main/java/sage/utility/FileMgmt.java +++ b/src/main/java/sage/utility/FileMgmt.java @@ -20,7 +20,7 @@ public void updateFile(ArrayList list) { } FileWriter fw = new FileWriter(PROJECT_FILE_DIR); for (Task taskobj : list) { - fw.write(String.valueOf(taskobj)); + fw.write(String.valueOf(taskobj) + " \r\n"); } fw.close(); } catch (IOException e) { From a5363708d3eb92f9224b83dbd993037820a1a68c Mon Sep 17 00:00:00 2001 From: firwer Date: Wed, 15 Feb 2023 00:40:37 +0800 Subject: [PATCH 25/37] refactor: Merge unmark and mark function into one --- data/sage.txt | 4 +-- src/main/java/sage/main/Sage.java | 4 +-- src/main/java/sage/utility/TaskList.java | 40 ++++++------------------ 3 files changed, 13 insertions(+), 35 deletions(-) diff --git a/data/sage.txt b/data/sage.txt index 08c6a4058..a9cb26616 100644 --- a/data/sage.txt +++ b/data/sage.txt @@ -1,3 +1 @@ -[T][ ] test -[T][X] a skmdmas -[E][ ] samdakdsak (from: asndasd to: asjndda) +[T][ ] aosdaodasd diff --git a/src/main/java/sage/main/Sage.java b/src/main/java/sage/main/Sage.java index 20d61c892..87d104390 100644 --- a/src/main/java/sage/main/Sage.java +++ b/src/main/java/sage/main/Sage.java @@ -24,10 +24,10 @@ public static void main(String[] args) { taskList.listTask(); break; case "unmark": - taskList.unmarkTask(command.getTaskDescription()); + taskList.markingTask(command.getTaskDescription(), false); break; case "mark": - taskList.markTask(command.getTaskDescription()); + taskList.markingTask(command.getTaskDescription(), true); break; case "delete": taskList.deleteTask(command.getTaskDescription()); diff --git a/src/main/java/sage/utility/TaskList.java b/src/main/java/sage/utility/TaskList.java index 14af12bf5..f615d8647 100644 --- a/src/main/java/sage/utility/TaskList.java +++ b/src/main/java/sage/utility/TaskList.java @@ -121,52 +121,32 @@ public void deleteTask(String taskIndex) { * * @param taskIndex string that represents the index of the task to unmark (1-Indexed). */ - public void unmarkTask(String taskIndex) { + public void markingTask(String taskIndex, Boolean isMark) { try { int taskNumber = Integer.parseInt(taskIndex); if (taskNumber <= 0 || taskNumber > list.size()) { throw new OutOfBoundException(); - } else if (!list.get(taskNumber - 1).isCompleted()) { + } else if ((!isMark && !list.get(taskNumber - 1).isCompleted()) || + (isMark && list.get(taskNumber - 1).isCompleted())) { throw new IllegalOperationException(); } else { - list.get(taskNumber - 1).setCompleted(false); + list.get(taskNumber - 1).setCompleted(isMark); fm.updateFile(list); - UI.printMarking(list, taskNumber, false); + UI.printMarking(list, taskNumber, isMark); } } catch (OutOfBoundException e) { e.errorUnmark(); } catch (IllegalOperationException e) { - e.errorAlreadyUnmarked(); - } catch (NumberFormatException e) { - e.printStackTrace(); - } - - } - - /** - * Marks a completed task. - * - * @param taskIndex a string that represents the index of the task to mark (1-Indexed). - */ - public void markTask(String taskIndex) { - try { - int taskNumber = Integer.parseInt(taskIndex); - if (taskNumber <= 0 || taskNumber > list.size()) { - throw new OutOfBoundException(); - } else if (list.get(taskNumber - 1).isCompleted()) { - throw new IllegalOperationException(); + if (isMark) { + e.errorAlreadyMarked(); } else { - list.get(taskNumber - 1).setCompleted(true); - fm.updateFile(list); - UI.printMarking(list, taskNumber, true); + e.errorAlreadyUnmarked(); } - } catch (OutOfBoundException e) { - e.errorMark(); - } catch (IllegalOperationException e) { - e.errorAlreadyMarked(); + } catch (NumberFormatException e) { e.printStackTrace(); } + } public void listTask() { From 06b0d724fc16679065e8846bb92c6c4a4857b27b Mon Sep 17 00:00:00 2001 From: firwer Date: Wed, 15 Feb 2023 00:46:38 +0800 Subject: [PATCH 26/37] fix: Exception class not showing msg but stacktrace --- data/sage.txt | 2 +- .../exceptions/MissingParameterException.java | 2 +- src/main/java/sage/utility/TaskList.java | 16 +++++++++++----- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/data/sage.txt b/data/sage.txt index a9cb26616..17ce2f09b 100644 --- a/data/sage.txt +++ b/data/sage.txt @@ -1 +1 @@ -[T][ ] aosdaodasd +[T][X] asndak diff --git a/src/main/java/sage/exceptions/MissingParameterException.java b/src/main/java/sage/exceptions/MissingParameterException.java index 8f022c6af..e0ebb80fe 100644 --- a/src/main/java/sage/exceptions/MissingParameterException.java +++ b/src/main/java/sage/exceptions/MissingParameterException.java @@ -25,6 +25,6 @@ public void missingParamBy() { } public void missingParamTaskIndex() { - System.out.println("Delete \"index\" parameter is missing"); + System.out.println("\"index\" parameter is missing"); } } diff --git a/src/main/java/sage/utility/TaskList.java b/src/main/java/sage/utility/TaskList.java index f615d8647..20878b58a 100644 --- a/src/main/java/sage/utility/TaskList.java +++ b/src/main/java/sage/utility/TaskList.java @@ -102,6 +102,9 @@ public void addTask(String taskName, String startWhen, String endWhen) { */ public void deleteTask(String taskIndex) { try { + if (taskIndex == null) { + throw new MissingParameterException(); + } int taskNumber = Integer.parseInt(taskIndex); if (taskNumber <= 0 || taskNumber > list.size()) { throw new OutOfBoundException(); @@ -111,8 +114,8 @@ public void deleteTask(String taskIndex) { } } catch (OutOfBoundException e) { e.errorDelete(); - } catch (NumberFormatException e) { - e.printStackTrace(); + } catch (MissingParameterException e) { + e.missingParamTaskIndex(); } } @@ -122,7 +125,11 @@ public void deleteTask(String taskIndex) { * @param taskIndex string that represents the index of the task to unmark (1-Indexed). */ public void markingTask(String taskIndex, Boolean isMark) { + try { + if (taskIndex == null) { + throw new MissingParameterException(); + } int taskNumber = Integer.parseInt(taskIndex); if (taskNumber <= 0 || taskNumber > list.size()) { throw new OutOfBoundException(); @@ -142,9 +149,8 @@ public void markingTask(String taskIndex, Boolean isMark) { } else { e.errorAlreadyUnmarked(); } - - } catch (NumberFormatException e) { - e.printStackTrace(); + } catch (MissingParameterException e) { + e.missingParamTaskIndex(); } } From 12ca1b7811d5352f713b2e11a24fb069df03e82a Mon Sep 17 00:00:00 2001 From: firwer Date: Wed, 15 Feb 2023 15:51:20 +0800 Subject: [PATCH 27/37] fix: Introduce data persistence from previous session --- data/sage.txt | 6 +++- src/main/java/sage/main/Sage.java | 7 ++-- src/main/java/sage/utility/Display.java | 4 +++ src/main/java/sage/utility/FileMgmt.java | 46 ++++++++++++++++++++++++ src/main/java/sage/utility/TaskList.java | 28 ++++++++++----- 5 files changed, 78 insertions(+), 13 deletions(-) diff --git a/data/sage.txt b/data/sage.txt index 17ce2f09b..b34ea013e 100644 --- a/data/sage.txt +++ b/data/sage.txt @@ -1 +1,5 @@ -[T][X] asndak +[E][X] hasdnajsad (from: tues to: weds) +[D][ ] ksndadsad (by: weds) +[T][X] shit +[D][ ] LOLOL SASA (by: aasmdk asdmak) +[E][ ] ASDKA asmsdakd (from: asdnmadksa asdma to: adskamdas asdkm sa) diff --git a/src/main/java/sage/main/Sage.java b/src/main/java/sage/main/Sage.java index 87d104390..765fa6cda 100644 --- a/src/main/java/sage/main/Sage.java +++ b/src/main/java/sage/main/Sage.java @@ -14,6 +14,7 @@ public static void main(String[] args) { Display ui = new Display(); Scanner input = new Scanner(System.in); ui.printWelcomeUser(); + fm.recoverData(taskList); while (input.hasNextLine()) { Command command = new Command(input.nextLine()); switch (command.getTaskType()) { @@ -33,13 +34,13 @@ public static void main(String[] args) { taskList.deleteTask(command.getTaskDescription()); break; case "todo": - taskList.addTask(command.getTaskDescription()); + taskList.addTask(command.getTaskDescription(), false, false); break; case "deadline": - taskList.addTask(command.getTaskDescription(), command.getBy()); + taskList.addTask(command.getTaskDescription(), command.getBy(), false, false); break; case "event": - taskList.addTask(command.getTaskDescription(), command.getFrom(), command.getTo()); + taskList.addTask(command.getTaskDescription(), command.getFrom(), command.getTo(), false, false); break; case "write": taskList.update(fm); diff --git a/src/main/java/sage/utility/Display.java b/src/main/java/sage/utility/Display.java index 17a10b0ff..429917bc5 100644 --- a/src/main/java/sage/utility/Display.java +++ b/src/main/java/sage/utility/Display.java @@ -33,6 +33,10 @@ public void printGoodByeUser() { System.out.println("Bye. Hope to see you again soon!"); } + public void printResumeSession() { + System.out.println("Info: Data from previous session is resumed"); + } + /** * This method prints a message to the console indicating the addition of a TODO task to the task list and its details. * diff --git a/src/main/java/sage/utility/FileMgmt.java b/src/main/java/sage/utility/FileMgmt.java index 60114f8bf..64cdee81b 100644 --- a/src/main/java/sage/utility/FileMgmt.java +++ b/src/main/java/sage/utility/FileMgmt.java @@ -1,16 +1,62 @@ package sage.utility; +import sage.tasktypes.Deadline; import sage.tasktypes.Task; +import sage.tasktypes.Todo; import java.io.File; +import java.io.FileNotFoundException; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; +import java.util.Scanner; public class FileMgmt { private static final String PROJECT_FILE_DIR = "./data/sage.txt"; + public void recoverData(TaskList taskList) { + File f = new File(PROJECT_FILE_DIR); + if (f.exists()) { + Display UI = new Display(); + UI.printResumeSession(); + try { + Scanner scanner = new Scanner(f); + + while (scanner.hasNextLine()) { + String line = scanner.nextLine(); + char taskType = line.charAt(1); + String taskDescription = ""; + String taskTime = ""; + boolean isCompleted = false; + char s = line.charAt(4); + if (s == 'X') { + isCompleted = true; + } + if (taskType == 'T') { + taskDescription = line.substring(7); + taskList.addTask(taskDescription, isCompleted, true); + } else { + String taskPeriod = line.substring(line.indexOf('(') + 1, line.indexOf(')')); + taskDescription = line.substring(7, line.indexOf('(') - 1) + " "; + if (taskType == 'D') { + String taskBy = taskPeriod.substring(taskPeriod.indexOf(":") + 2); + taskList.addTask(taskDescription, taskBy, isCompleted, true); + } else { + String taskFrom = taskPeriod.substring(taskPeriod.indexOf("from: ") + 6, taskPeriod.indexOf("to: ") - 1); + String taskTo = taskPeriod.substring(taskPeriod.indexOf("to: ") + 4); + taskList.addTask(taskDescription, taskFrom, taskTo, isCompleted, true); + } + } + } + + scanner.close(); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } + } + } + public void updateFile(ArrayList list) { File f = new File(PROJECT_FILE_DIR); try { diff --git a/src/main/java/sage/utility/TaskList.java b/src/main/java/sage/utility/TaskList.java index 20878b58a..0bebdfc6a 100644 --- a/src/main/java/sage/utility/TaskList.java +++ b/src/main/java/sage/utility/TaskList.java @@ -27,15 +27,18 @@ public void update(FileMgmt fm) { * * @param taskName The name of the TODO task to be added **/ - public void addTask(String taskName) { + public void addTask(String taskName, boolean isCompleted, boolean silentmode) { try { if (taskName == null) { throw new MissingParameterException(); } else { Todo t = new Todo(taskName); list.add(t); - UI.printAddedTask(t, list.size()); - fm.updateFile(list); + t.setCompleted(isCompleted); + if (!silentmode) { + UI.printAddedTask(t, list.size()); + fm.updateFile(list); + } } } catch (MissingParameterException e) { e.missingParamDesc(); @@ -48,15 +51,18 @@ public void addTask(String taskName) { * @param taskName a string that represents the name of the Deadline task to add. * @param byWhen a string that represents the deadline of the Deadline task. **/ - public void addTask(String taskName, String byWhen) { + public void addTask(String taskName, String byWhen, boolean isCompleted, boolean silentMode) { try { if (taskName == null || byWhen == null) { throw new MissingParameterException(); } else { Deadline d = new Deadline(taskName, byWhen); list.add(d); - fm.updateFile(list); - UI.printAddedTask(d, list.size()); + d.setCompleted(isCompleted); + if (!silentMode) { + fm.updateFile(list); + UI.printAddedTask(d, list.size()); + } } } catch (MissingParameterException e) { if (taskName == null) { @@ -74,15 +80,18 @@ public void addTask(String taskName, String byWhen) { * @param startWhen a string that represents the start date and time of the Event task. * @param endWhen a string that represents the end date and time of the Event task. */ - public void addTask(String taskName, String startWhen, String endWhen) { + public void addTask(String taskName, String startWhen, String endWhen, boolean isCompleted, boolean silentmode) { try { if (taskName == null || startWhen == null || endWhen == null) { throw new MissingParameterException(); } else { Event e = new Event(taskName, startWhen, endWhen); list.add(e); - fm.updateFile(list); - UI.printAddedTask(e, list.size()); + e.setCompleted(isCompleted); + if (!silentmode) { + fm.updateFile(list); + UI.printAddedTask(e, list.size()); + } } } catch (MissingParameterException e) { if (taskName == null) { @@ -110,6 +119,7 @@ public void deleteTask(String taskIndex) { throw new OutOfBoundException(); } else { UI.printDeletedTask(list, taskNumber); + fm.updateFile(list); list.remove(taskNumber - 1); } } catch (OutOfBoundException e) { From 7c4c04d8601bed14e4bcce4c96ecaa46c44f5fa8 Mon Sep 17 00:00:00 2001 From: firwer Date: Mon, 20 Feb 2023 12:47:10 +0800 Subject: [PATCH 28/37] A-MoreOOP - Refactor: Abstract main class components to Ui --- src/main/java/sage/utility/{Command.java => Parser.java} | 4 ++-- .../java/sage/utility/{FileMgmt.java => Storage.java} | 9 ++++----- src/main/java/sage/utility/Ui.java | 2 ++ 3 files changed, 8 insertions(+), 7 deletions(-) rename src/main/java/sage/utility/{Command.java => Parser.java} (95%) rename src/main/java/sage/utility/{FileMgmt.java => Storage.java} (95%) create mode 100644 src/main/java/sage/utility/Ui.java diff --git a/src/main/java/sage/utility/Command.java b/src/main/java/sage/utility/Parser.java similarity index 95% rename from src/main/java/sage/utility/Command.java rename to src/main/java/sage/utility/Parser.java index 364119904..84e6e6f08 100644 --- a/src/main/java/sage/utility/Command.java +++ b/src/main/java/sage/utility/Parser.java @@ -1,6 +1,6 @@ package sage.utility; -public class Command { +public class Parser { private String[] rawOutput; private String taskType; private String taskDescription; @@ -8,7 +8,7 @@ public class Command { private String from = null; private String to = null; - public Command(String input) { + public Parser(String input) { this.rawOutput = input.split("/"); String[] body = rawOutput[0].split(" ", 2); this.taskType = body[0].toLowerCase(); diff --git a/src/main/java/sage/utility/FileMgmt.java b/src/main/java/sage/utility/Storage.java similarity index 95% rename from src/main/java/sage/utility/FileMgmt.java rename to src/main/java/sage/utility/Storage.java index 64cdee81b..8246ff1ef 100644 --- a/src/main/java/sage/utility/FileMgmt.java +++ b/src/main/java/sage/utility/Storage.java @@ -1,8 +1,6 @@ package sage.utility; -import sage.tasktypes.Deadline; import sage.tasktypes.Task; -import sage.tasktypes.Todo; import java.io.File; import java.io.FileNotFoundException; @@ -11,10 +9,11 @@ import java.util.ArrayList; import java.util.Scanner; -public class FileMgmt { +public class Storage { private static final String PROJECT_FILE_DIR = "./data/sage.txt"; + public void recoverData(TaskList taskList) { File f = new File(PROJECT_FILE_DIR); if (f.exists()) { @@ -30,6 +29,7 @@ public void recoverData(TaskList taskList) { String taskTime = ""; boolean isCompleted = false; char s = line.charAt(4); + if (s == 'X') { isCompleted = true; } @@ -49,10 +49,9 @@ public void recoverData(TaskList taskList) { } } } - scanner.close(); } catch (FileNotFoundException e) { - e.printStackTrace(); + System.out.println("An error occurred when trying to read/access the data file"); } } } diff --git a/src/main/java/sage/utility/Ui.java b/src/main/java/sage/utility/Ui.java new file mode 100644 index 000000000..345b7f9b5 --- /dev/null +++ b/src/main/java/sage/utility/Ui.java @@ -0,0 +1,2 @@ +package sage.utility;public class Ui { +} From 81f2f77c9bf9cefc03e0a88cc4d903a9ea30a9a8 Mon Sep 17 00:00:00 2001 From: firwer Date: Mon, 20 Feb 2023 13:41:41 +0800 Subject: [PATCH 29/37] feat: Time parsing for deadline in dd-MM-yyyy or yyyy-MM-dd formats --- data/sage.txt | 5 -- src/main/java/sage/main/Sage.java | 55 ++++------------------ src/main/java/sage/tasktypes/Deadline.java | 38 +++++++++++++-- src/main/java/sage/utility/TaskList.java | 6 +-- src/main/java/sage/utility/Ui.java | 55 +++++++++++++++++++++- 5 files changed, 101 insertions(+), 58 deletions(-) delete mode 100644 data/sage.txt diff --git a/data/sage.txt b/data/sage.txt deleted file mode 100644 index b34ea013e..000000000 --- a/data/sage.txt +++ /dev/null @@ -1,5 +0,0 @@ -[E][X] hasdnajsad (from: tues to: weds) -[D][ ] ksndadsad (by: weds) -[T][X] shit -[D][ ] LOLOL SASA (by: aasmdk asdmak) -[E][ ] ASDKA asmsdakd (from: asdnmadksa asdma to: adskamdas asdkm sa) diff --git a/src/main/java/sage/main/Sage.java b/src/main/java/sage/main/Sage.java index 765fa6cda..091bf6d91 100644 --- a/src/main/java/sage/main/Sage.java +++ b/src/main/java/sage/main/Sage.java @@ -1,53 +1,18 @@ package sage.main; -import sage.utility.Command; -import sage.utility.Display; -import sage.utility.FileMgmt; -import sage.utility.TaskList; - -import java.util.Scanner; +import sage.utility.*; public class Sage { public static void main(String[] args) { - TaskList taskList = new TaskList(); - FileMgmt fm = new FileMgmt(); - Display ui = new Display(); - Scanner input = new Scanner(System.in); - ui.printWelcomeUser(); - fm.recoverData(taskList); - while (input.hasNextLine()) { - Command command = new Command(input.nextLine()); - switch (command.getTaskType()) { - case "bye": - ui.printGoodByeUser(); - return; - case "list": - taskList.listTask(); - break; - case "unmark": - taskList.markingTask(command.getTaskDescription(), false); - break; - case "mark": - taskList.markingTask(command.getTaskDescription(), true); - break; - case "delete": - taskList.deleteTask(command.getTaskDescription()); - break; - case "todo": - taskList.addTask(command.getTaskDescription(), false, false); - break; - case "deadline": - taskList.addTask(command.getTaskDescription(), command.getBy(), false, false); - break; - case "event": - taskList.addTask(command.getTaskDescription(), command.getFrom(), command.getTo(), false, false); - break; - case "write": - taskList.update(fm); - default: - ui.printUnknownInput(); - break; - } + Display display = new Display(); + Ui ui = new Ui(); + ui.recoverData(); + boolean isExit = false; + display.printWelcomeUser(); + while (!isExit) { + String input = ui.readInput(); + Parser parsed = new Parser(input); + isExit = ui.readCommand(parsed); } } } diff --git a/src/main/java/sage/tasktypes/Deadline.java b/src/main/java/sage/tasktypes/Deadline.java index 79ecf5a45..053c6da95 100644 --- a/src/main/java/sage/tasktypes/Deadline.java +++ b/src/main/java/sage/tasktypes/Deadline.java @@ -1,23 +1,53 @@ package sage.tasktypes; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; + public class Deadline extends Task { private String byWhen = ""; + private LocalDate date = null; + public Deadline(String taskName, String byWhen) { super(taskName); - this.byWhen = byWhen; + DateTimeFormatter dateformat1 = DateTimeFormatter.ofPattern("dd-MM-uuuu"); + DateTimeFormatter dateformat2 = DateTimeFormatter.ofPattern("uuuu-MM-dd"); + try { + this.date = LocalDate.parse(byWhen, dateformat1); + } catch (DateTimeParseException e1) { + try { + this.date = LocalDate.parse(byWhen, dateformat2); + } catch (DateTimeParseException e2) { + this.byWhen = byWhen; + } + } } public String getByWhen() { return byWhen; } + public String getFormattedTime() { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd MMM yyyy"); + return this.date.format(formatter); + } + @Override public String toString() { - if (super.isCompleted()) { - return "[D][X] " + super.getTaskName() + "(by: " + getByWhen() + ")"; + if (this.date != null) { + if (super.isCompleted()) { + return "[D][X] " + super.getTaskName() + "(by: " + getFormattedTime() + ")"; + } else { + return "[D][ ] " + super.getTaskName() + "(by: " + getFormattedTime() + ")"; + } } else { - return "[D][ ] " + super.getTaskName() + "(by: " + getByWhen() + ")"; + if (super.isCompleted()) { + return "[D][X] " + super.getTaskName() + "(by: " + getByWhen() + ")"; + } else { + return "[D][ ] " + super.getTaskName() + "(by: " + getByWhen() + ")"; + } } } } diff --git a/src/main/java/sage/utility/TaskList.java b/src/main/java/sage/utility/TaskList.java index 0bebdfc6a..a5e044e81 100644 --- a/src/main/java/sage/utility/TaskList.java +++ b/src/main/java/sage/utility/TaskList.java @@ -10,15 +10,15 @@ import sage.tasktypes.Event; import sage.tasktypes.Task; import sage.tasktypes.Todo; -import sage.utility.FileMgmt; +import sage.utility.Storage; public class TaskList { private static ArrayList list = new ArrayList<>(); private static final Display UI = new Display(); - private static final FileMgmt fm = new FileMgmt(); + private static final Storage fm = new Storage(); - public void update(FileMgmt fm) { + public void update(Storage fm) { fm.updateFile(list); } diff --git a/src/main/java/sage/utility/Ui.java b/src/main/java/sage/utility/Ui.java index 345b7f9b5..265549980 100644 --- a/src/main/java/sage/utility/Ui.java +++ b/src/main/java/sage/utility/Ui.java @@ -1,2 +1,55 @@ -package sage.utility;public class Ui { +package sage.utility; + +import java.util.Scanner; + +public class Ui { + + private static Display display = new Display(); + private static TaskList taskList = new TaskList(); + + private static Storage fm = new Storage(); + + + public void recoverData() { + fm.recoverData(taskList); + } + + public String readInput() { + Scanner input = new Scanner(System.in); + return input.nextLine(); + } + + public boolean readCommand(Parser parsed) { + switch (parsed.getTaskType()) { + case "bye": + display.printGoodByeUser(); + return true; + case "list": + taskList.listTask(); + break; + case "unmark": + taskList.markingTask(parsed.getTaskDescription(), false); + break; + case "mark": + taskList.markingTask(parsed.getTaskDescription(), true); + break; + case "delete": + taskList.deleteTask(parsed.getTaskDescription()); + break; + case "todo": + taskList.addTask(parsed.getTaskDescription(), false, false); + break; + case "deadline": + taskList.addTask(parsed.getTaskDescription(), parsed.getBy(), false, false); + break; + case "event": + taskList.addTask(parsed.getTaskDescription(), parsed.getFrom(), parsed.getTo(), false, false); + break; + default: + display.printUnknownInput(); + break; + } + return false; + } + } From 2576cdb74f35328e8d5f299e985363229bd07ab3 Mon Sep 17 00:00:00 2001 From: firwer Date: Mon, 20 Feb 2023 15:17:53 +0800 Subject: [PATCH 30/37] Level-9: Add find feature with exception handling --- data/sage.txt | 3 ++ .../exceptions/MissingParameterException.java | 4 +++ src/main/java/sage/tasktypes/Deadline.java | 8 ++--- src/main/java/sage/tasktypes/Event.java | 4 +-- src/main/java/sage/tasktypes/Task.java | 10 +++--- src/main/java/sage/tasktypes/Todo.java | 4 +-- src/main/java/sage/utility/Display.java | 16 +++++++++ src/main/java/sage/utility/TaskList.java | 34 ++++++++++++++----- src/main/java/sage/utility/Ui.java | 3 ++ 9 files changed, 65 insertions(+), 21 deletions(-) create mode 100644 data/sage.txt diff --git a/data/sage.txt b/data/sage.txt new file mode 100644 index 000000000..96da5c8f3 --- /dev/null +++ b/data/sage.txt @@ -0,0 +1,3 @@ +[T][X] askdmasdd +[T][ ] read book +[D][X] return book (by: June 6th) diff --git a/src/main/java/sage/exceptions/MissingParameterException.java b/src/main/java/sage/exceptions/MissingParameterException.java index e0ebb80fe..198b740a4 100644 --- a/src/main/java/sage/exceptions/MissingParameterException.java +++ b/src/main/java/sage/exceptions/MissingParameterException.java @@ -27,4 +27,8 @@ public void missingParamBy() { public void missingParamTaskIndex() { System.out.println("\"index\" parameter is missing"); } + + public void missingParamKeyword() { + System.out.println("\"Keywords\" parameter is missing"); + } } diff --git a/src/main/java/sage/tasktypes/Deadline.java b/src/main/java/sage/tasktypes/Deadline.java index 053c6da95..02a0f4f7f 100644 --- a/src/main/java/sage/tasktypes/Deadline.java +++ b/src/main/java/sage/tasktypes/Deadline.java @@ -38,15 +38,15 @@ public String getFormattedTime() { public String toString() { if (this.date != null) { if (super.isCompleted()) { - return "[D][X] " + super.getTaskName() + "(by: " + getFormattedTime() + ")"; + return "[D][X] " + super.getTaskDetails() + "(by: " + getFormattedTime() + ")"; } else { - return "[D][ ] " + super.getTaskName() + "(by: " + getFormattedTime() + ")"; + return "[D][ ] " + super.getTaskDetails() + "(by: " + getFormattedTime() + ")"; } } else { if (super.isCompleted()) { - return "[D][X] " + super.getTaskName() + "(by: " + getByWhen() + ")"; + return "[D][X] " + super.getTaskDetails() + "(by: " + getByWhen() + ")"; } else { - return "[D][ ] " + super.getTaskName() + "(by: " + getByWhen() + ")"; + return "[D][ ] " + super.getTaskDetails() + "(by: " + getByWhen() + ")"; } } } diff --git a/src/main/java/sage/tasktypes/Event.java b/src/main/java/sage/tasktypes/Event.java index 585a8f014..0936cd79f 100644 --- a/src/main/java/sage/tasktypes/Event.java +++ b/src/main/java/sage/tasktypes/Event.java @@ -22,9 +22,9 @@ public String getEndWhen() { @Override public String toString() { if (super.isCompleted()) { - return "[E][X] " + super.getTaskName() + "(from: " + getStartWhen() + " to: " + getEndWhen() + ")"; + return "[E][X] " + super.getTaskDetails() + "(from: " + getStartWhen() + " to: " + getEndWhen() + ")"; } else { - return "[E][ ] " + super.getTaskName() + "(from: " + getStartWhen() + " to: " + getEndWhen() + ")"; + return "[E][ ] " + super.getTaskDetails() + "(from: " + getStartWhen() + " to: " + getEndWhen() + ")"; } } } diff --git a/src/main/java/sage/tasktypes/Task.java b/src/main/java/sage/tasktypes/Task.java index bf46a83d3..53e671480 100644 --- a/src/main/java/sage/tasktypes/Task.java +++ b/src/main/java/sage/tasktypes/Task.java @@ -1,16 +1,16 @@ package sage.tasktypes; public class Task { - private String taskName = ""; + private String taskDetails = ""; private boolean isCompleted = false; - public Task(String taskName) { - this.taskName = taskName; + public Task(String taskDetails) { + this.taskDetails = taskDetails; this.isCompleted = false; } - public String getTaskName() { - return this.taskName; + public String getTaskDetails() { + return this.taskDetails; } public void setCompleted(boolean completed) { diff --git a/src/main/java/sage/tasktypes/Todo.java b/src/main/java/sage/tasktypes/Todo.java index 344b40739..537ce0ea0 100644 --- a/src/main/java/sage/tasktypes/Todo.java +++ b/src/main/java/sage/tasktypes/Todo.java @@ -9,9 +9,9 @@ public Todo(String taskName) { @Override public String toString() { if (super.isCompleted()) { - return "[T][X] " + super.getTaskName(); + return "[T][X] " + super.getTaskDetails(); } else { - return "[T][ ] " + super.getTaskName(); + return "[T][ ] " + super.getTaskDetails(); } } diff --git a/src/main/java/sage/utility/Display.java b/src/main/java/sage/utility/Display.java index 429917bc5..e76e21127 100644 --- a/src/main/java/sage/utility/Display.java +++ b/src/main/java/sage/utility/Display.java @@ -1,5 +1,6 @@ package sage.utility; +import java.sql.SQLOutput; import java.util.ArrayList; import sage.tasktypes.Deadline; @@ -86,4 +87,19 @@ public void printDeletedTask(ArrayList list, int taskNumber) { System.out.println("Now you have " + String.valueOf(list.size() - 1) + " tasks in the list."); } + public void printSearchTask(ArrayList results) { + System.out.println(LINE); + if (results.isEmpty()) { + System.out.println("Found no matching query. Please try another again!"); + } else { + System.out.println("Found " + results.size() + " matching queries!"); + for (int i = 0; i < results.size(); i++) { + System.out.print(i + 1 + "."); + System.out.println(results.get(i)); + } + + } + System.out.println(LINE); + } + } diff --git a/src/main/java/sage/utility/TaskList.java b/src/main/java/sage/utility/TaskList.java index a5e044e81..2d2ddca88 100644 --- a/src/main/java/sage/utility/TaskList.java +++ b/src/main/java/sage/utility/TaskList.java @@ -1,5 +1,6 @@ package sage.utility; +import java.lang.reflect.Array; import java.util.ArrayList; import sage.exceptions.IllegalOperationException; @@ -15,13 +16,30 @@ public class TaskList { private static ArrayList list = new ArrayList<>(); - private static final Display UI = new Display(); + private static final Display display = new Display(); private static final Storage fm = new Storage(); public void update(Storage fm) { fm.updateFile(list); } + public void findTask(String keywords) { + ArrayList results = new ArrayList(); + try { + if (keywords == null) { + throw new MissingParameterException(); + } + for (Task t : list) { + if (t.getTaskDetails().contains(keywords)) { + results.add(t); + } + } + display.printSearchTask(results); + } catch (MissingParameterException e) { + e.missingParamKeyword(); + } + } + /** * This method instantiate a Todo object and add the Todo object to the TaskList * @@ -36,7 +54,7 @@ public void addTask(String taskName, boolean isCompleted, boolean silentmode) { list.add(t); t.setCompleted(isCompleted); if (!silentmode) { - UI.printAddedTask(t, list.size()); + display.printAddedTask(t, list.size()); fm.updateFile(list); } } @@ -61,7 +79,7 @@ public void addTask(String taskName, String byWhen, boolean isCompleted, boolean d.setCompleted(isCompleted); if (!silentMode) { fm.updateFile(list); - UI.printAddedTask(d, list.size()); + display.printAddedTask(d, list.size()); } } } catch (MissingParameterException e) { @@ -90,7 +108,7 @@ public void addTask(String taskName, String startWhen, String endWhen, boolean i e.setCompleted(isCompleted); if (!silentmode) { fm.updateFile(list); - UI.printAddedTask(e, list.size()); + display.printAddedTask(e, list.size()); } } } catch (MissingParameterException e) { @@ -118,7 +136,7 @@ public void deleteTask(String taskIndex) { if (taskNumber <= 0 || taskNumber > list.size()) { throw new OutOfBoundException(); } else { - UI.printDeletedTask(list, taskNumber); + display.printDeletedTask(list, taskNumber); fm.updateFile(list); list.remove(taskNumber - 1); } @@ -149,7 +167,7 @@ public void markingTask(String taskIndex, Boolean isMark) { } else { list.get(taskNumber - 1).setCompleted(isMark); fm.updateFile(list); - UI.printMarking(list, taskNumber, isMark); + display.printMarking(list, taskNumber, isMark); } } catch (OutOfBoundException e) { e.errorUnmark(); @@ -166,7 +184,7 @@ public void markingTask(String taskIndex, Boolean isMark) { } public void listTask() { - System.out.println(UI.printLine()); + System.out.println(display.printLine()); try { if (list.size() > 0) { System.out.println("Here are the tasks in your list:"); @@ -180,7 +198,7 @@ public void listTask() { } catch (EmptyListException e) { e.errorMsg(); } - System.out.println(UI.printLine()); + System.out.println(display.printLine()); } public int getTaskCount() { diff --git a/src/main/java/sage/utility/Ui.java b/src/main/java/sage/utility/Ui.java index 265549980..a44ca6e66 100644 --- a/src/main/java/sage/utility/Ui.java +++ b/src/main/java/sage/utility/Ui.java @@ -45,6 +45,9 @@ public boolean readCommand(Parser parsed) { case "event": taskList.addTask(parsed.getTaskDescription(), parsed.getFrom(), parsed.getTo(), false, false); break; + case "find": + taskList.findTask(parsed.getTaskDescription()); + break; default: display.printUnknownInput(); break; From eab3f72f0e7863b228044f98af77747276c7dbe2 Mon Sep 17 00:00:00 2001 From: firwer Date: Mon, 20 Feb 2023 16:00:07 +0800 Subject: [PATCH 31/37] A-JavaDoc - docs: Add missing JavaDocs to classes and methods --- src/main/java/sage/tasktypes/Deadline.java | 5 +++++ src/main/java/sage/tasktypes/Event.java | 4 ++++ src/main/java/sage/tasktypes/Todo.java | 3 +++ src/main/java/sage/utility/Display.java | 4 ++++ src/main/java/sage/utility/Parser.java | 9 +++++++++ src/main/java/sage/utility/Storage.java | 16 +++++++++++++++- src/main/java/sage/utility/TaskList.java | 16 ++++++++++++---- src/main/java/sage/utility/Ui.java | 13 +++++++++++++ 8 files changed, 65 insertions(+), 5 deletions(-) diff --git a/src/main/java/sage/tasktypes/Deadline.java b/src/main/java/sage/tasktypes/Deadline.java index 02a0f4f7f..02d4631a1 100644 --- a/src/main/java/sage/tasktypes/Deadline.java +++ b/src/main/java/sage/tasktypes/Deadline.java @@ -5,6 +5,11 @@ import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; + +/** + * A class that represents a deadline task + */ + public class Deadline extends Task { private String byWhen = ""; diff --git a/src/main/java/sage/tasktypes/Event.java b/src/main/java/sage/tasktypes/Event.java index 0936cd79f..cbdcb25f1 100644 --- a/src/main/java/sage/tasktypes/Event.java +++ b/src/main/java/sage/tasktypes/Event.java @@ -1,5 +1,9 @@ package sage.tasktypes; +/** + * A class that represents an event task + */ + public class Event extends Task { private String startWhen = ""; diff --git a/src/main/java/sage/tasktypes/Todo.java b/src/main/java/sage/tasktypes/Todo.java index 537ce0ea0..fe3f1e96f 100644 --- a/src/main/java/sage/tasktypes/Todo.java +++ b/src/main/java/sage/tasktypes/Todo.java @@ -1,5 +1,8 @@ package sage.tasktypes; +/** + * A class that represents a todo task + */ public class Todo extends Task { public Todo(String taskName) { diff --git a/src/main/java/sage/utility/Display.java b/src/main/java/sage/utility/Display.java index e76e21127..fac8ba6e9 100644 --- a/src/main/java/sage/utility/Display.java +++ b/src/main/java/sage/utility/Display.java @@ -8,6 +8,10 @@ import sage.tasktypes.Todo; import sage.tasktypes.Task; +/** + * A class containing methods for printing text on the console. + */ + public class Display { private static final String LINE = "█████╗█████╗█████╗█████╗█████╗█████╗█████╗\n" + diff --git a/src/main/java/sage/utility/Parser.java b/src/main/java/sage/utility/Parser.java index 84e6e6f08..4c6bdec22 100644 --- a/src/main/java/sage/utility/Parser.java +++ b/src/main/java/sage/utility/Parser.java @@ -1,5 +1,9 @@ package sage.utility; + +/** + * A class containing methods for parsing of raw user input for easier reading + */ public class Parser { private String[] rawOutput; private String taskType; @@ -8,6 +12,11 @@ public class Parser { private String from = null; private String to = null; + /** + * Parses user input into its respective task type, description and other attributes + * + * @param input raw user input to be parsed + */ public Parser(String input) { this.rawOutput = input.split("/"); String[] body = rawOutput[0].split(" ", 2); diff --git a/src/main/java/sage/utility/Storage.java b/src/main/java/sage/utility/Storage.java index 8246ff1ef..2935843d4 100644 --- a/src/main/java/sage/utility/Storage.java +++ b/src/main/java/sage/utility/Storage.java @@ -9,11 +9,19 @@ import java.util.ArrayList; import java.util.Scanner; + +/** + * A class that contains storage and file related I/O methods + */ public class Storage { private static final String PROJECT_FILE_DIR = "./data/sage.txt"; - + /** + * Recovers and parse any stored data in ./data/sage.txt to taskList + * + * @param taskList contains information and methods about all the tasks currently in the list + */ public void recoverData(TaskList taskList) { File f = new File(PROJECT_FILE_DIR); if (f.exists()) { @@ -56,6 +64,12 @@ public void recoverData(TaskList taskList) { } } + /** + * Updates the data file in ./data/sage.txt with the latest list of tasks + * + * @param list list of tasks information in the application + */ + public void updateFile(ArrayList list) { File f = new File(PROJECT_FILE_DIR); try { diff --git a/src/main/java/sage/utility/TaskList.java b/src/main/java/sage/utility/TaskList.java index 2d2ddca88..354e2d9bb 100644 --- a/src/main/java/sage/utility/TaskList.java +++ b/src/main/java/sage/utility/TaskList.java @@ -13,16 +13,21 @@ import sage.tasktypes.Todo; import sage.utility.Storage; +/** + * A class that stores the list of tasks in the application and access methods for all task operations + */ + public class TaskList { private static ArrayList list = new ArrayList<>(); private static final Display display = new Display(); private static final Storage fm = new Storage(); - public void update(Storage fm) { - fm.updateFile(list); - } - + /** + * Display a list of tasks with its description matching the search query (keywords) provided by the user. + * + * @param keywords the search term input provided by the user + */ public void findTask(String keywords) { ArrayList results = new ArrayList(); try { @@ -183,6 +188,9 @@ public void markingTask(String taskIndex, Boolean isMark) { } + /** + * Display a list of tasks currently stored in the list + */ public void listTask() { System.out.println(display.printLine()); try { diff --git a/src/main/java/sage/utility/Ui.java b/src/main/java/sage/utility/Ui.java index a44ca6e66..bacf41b35 100644 --- a/src/main/java/sage/utility/Ui.java +++ b/src/main/java/sage/utility/Ui.java @@ -2,6 +2,10 @@ import java.util.Scanner; +/** + * A class that represents user interaction methods. + */ + public class Ui { private static Display display = new Display(); @@ -10,6 +14,9 @@ public class Ui { private static Storage fm = new Storage(); + /** + * Retrieves and restore any available task information data stored in ./data/sage.txt + */ public void recoverData() { fm.recoverData(taskList); } @@ -19,6 +26,12 @@ public String readInput() { return input.nextLine(); } + /** + * Reads the parsed user input and delegate the respective operation based on the task type + * + * @param parsed a Parser object that contains parsed user input + * @return boolean that indicates whether to exit the application + */ public boolean readCommand(Parser parsed) { switch (parsed.getTaskType()) { case "bye": From 2fa5d5229eae613cb1c7ff67d9c0a1a37d51747e Mon Sep 17 00:00:00 2001 From: firwer Date: Fri, 24 Feb 2023 01:15:09 +0800 Subject: [PATCH 32/37] fix: Delete operation updates file before item is removed from list --- src/main/java/sage/utility/TaskList.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/sage/utility/TaskList.java b/src/main/java/sage/utility/TaskList.java index 2d2ddca88..f9528abad 100644 --- a/src/main/java/sage/utility/TaskList.java +++ b/src/main/java/sage/utility/TaskList.java @@ -137,8 +137,8 @@ public void deleteTask(String taskIndex) { throw new OutOfBoundException(); } else { display.printDeletedTask(list, taskNumber); - fm.updateFile(list); list.remove(taskNumber - 1); + fm.updateFile(list); } } catch (OutOfBoundException e) { e.errorDelete(); From fa99405b381bd499fe9685a7b7e1ce8b748c6aa5 Mon Sep 17 00:00:00 2001 From: firwer Date: Fri, 24 Feb 2023 15:23:48 +0800 Subject: [PATCH 33/37] A-UserGuide: Add user guide --- docs/README.md | 162 +++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 150 insertions(+), 12 deletions(-) diff --git a/docs/README.md b/docs/README.md index 8077118eb..6940160d7 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,29 +1,167 @@ -# User Guide +# User Guide For Sage Task Manager -## Features +░██████╗░█████╗░░██████╗░███████╗ +██╔════╝██╔══██╗██╔════╝░██╔════╝ +╚█████╗░███████║██║░░██╗░█████╗░░ +░╚═══██╗██╔══██║██║░░╚██╗██╔══╝░░ +██████╔╝██║░░██║╚██████╔╝███████╗ +╚═════╝░╚═╝░░╚═╝░╚═════╝░╚══════╝ -### Feature-ABC +## Features -Description of the feature. +### Add Task (Todo, Event or Deadline) -### Feature-XYZ +This feature allows the user to add a task to the task list. The user can add a task to the application. -Description of the feature. +### Delete A Task + +To delete a task from the application + +### List All Tasks + +To list all tasks in the application + +### Find A Task + +To find tasks with a matching query in the task description. + +### Mark/Unmark Task + +You can mark/unmark a task as done/not done in the application. + +### Data Persistence Support + +Your previous session data will be automatically stored (in ./data/sage.txt) and restored (If applicable) ## Usage -### `Keyword` - Describe action +### `Todo` - Add a Todo Task + +Adds a Todo task to the task list. + +Example of usage: + +`todo buy groceries` + +Expected outcome: + +``` +Got it. I've added this task: +[T][ ] buy groceries +Now you have X tasks in the list. +``` + +### `deadline` - Add a Deadline Task + +Adds a Deadline task to the task list. + +Example of usage: + +`deadline submit report /by 2022-03-31` + +Expected outcome: + +``` +Got it. I've added this task: +[D][ ] submit report (by: 31 Mar 2022) +Now you have X tasks in the list. +``` + +### `event` - Add an Event Task + +Adds an Event task to the task list. + +Example of usage: + +`event project meeting /from 2022-04-01 /to 2022-04-02` + +Expected outcome: + +``` +Got it. I've added this task: +[E][ ] project meeting (from: 2022-04-01 to: 2022-04-02) +Now you have X tasks in the list. +``` + +### `delete` - Delete a Task + +Deletes the specified task from the task list. -Describe the action and its outcome. +Example of usage: -Example of usage: +`delete 2` -`keyword (optional arguments)` +Expected outcome: + +``` +Noted. I've removed this task: +[D][ ] submit report (by: 31 Mar 2022) +Now you have X tasks in the list. +``` + +### `find` - Find Tasks + +Displays a list of tasks that match the specified keyword. + +Example of usage: + +`find meeting` Expected outcome: -Description of the outcome. +``` +Found 1 matching queries! +1.[E][ ] project meeting (from: 2022-04-01 to: 2022-04-02) +``` + +### `list` - List All Tasks + +Displays a list of all tasks in the task list. + +Example of usage: + +`list` + +Expected outcome: ``` -expected output +Here are the tasks in your list: +1.[T][ ] buy groceries +2.[E][ ] project meeting (from: 2022-04-01 to: 2022-04-02) ``` + +### `mark` - Mark a Task as Done + +Marks the specified task as done. + +Example of usage: + +`mark 1` + +Expected outcome: + +``` +Nice! I've marked this task as done: +[T][X] buy groceries +``` + +### `unmark` - Unmark a Task as Undone + +Marks the specified task as undone. + +Example of usage: + +`unmark 1` + +Expected outcome: + +``` +Noted. I've marked this task as undone: +[T][ ] buy groceries +``` + +## Other Commands + +### `bye` - Quit the application + +Exit the application From 567d1df524a856852245538c76bfe3061e4a0afb Mon Sep 17 00:00:00 2001 From: Poh Wei Pin Date: Fri, 24 Feb 2023 15:31:59 +0800 Subject: [PATCH 34/37] Update README.md --- README.md | 163 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 160 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index bf8b84d77..a62e419ac 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,6 @@ # SAGE iP project - Hello from - - +# User Guide For Sage Task Manager ───────────────────────────────────────────────────────────── ─██████████████─██████████████─██████████████─██████████████─ ─██░░░░░░░░░░██─██░░░░░░░░░░██─██░░░░░░░░░░██─██░░░░░░░░░░██─ @@ -16,3 +14,162 @@ ─██░░░░░░░░░░██─██░░██──██░░██─██░░░░░░░░░░██─██░░░░░░░░░░██─ ─██████████████─██████──██████─██████████████─██████████████─ ───────────────────────────────────────────────────────────── + +## Features + +### Add Task (Todo, Event or Deadline) + +This feature allows the user to add a task to the task list. The user can add a task to the application. + +### Delete A Task + +To delete a task from the application + +### List All Tasks + +To list all tasks in the application + +### Find A Task + +To find tasks with a matching query in the task description. + +### Mark/Unmark Task + +You can mark/unmark a task as done/not done in the application. + +### Data Persistence Support + +Your previous session data will be automatically stored (in ./data/sage.txt) and restored (If applicable) + +## Usage + +### `Todo` - Add a Todo Task + +Adds a Todo task to the task list. + +Example of usage: + +`todo buy groceries` + +Expected outcome: + +``` +Got it. I've added this task: +[T][ ] buy groceries +Now you have X tasks in the list. +``` + +### `deadline` - Add a Deadline Task + +Adds a Deadline task to the task list. + +Example of usage: + +`deadline submit report /by 2022-03-31` + +Expected outcome: + +``` +Got it. I've added this task: +[D][ ] submit report (by: 31 Mar 2022) +Now you have X tasks in the list. +``` + +### `event` - Add an Event Task + +Adds an Event task to the task list. + +Example of usage: + +`event project meeting /from 2022-04-01 /to 2022-04-02` + +Expected outcome: + +``` +Got it. I've added this task: +[E][ ] project meeting (from: 2022-04-01 to: 2022-04-02) +Now you have X tasks in the list. +``` + +### `delete` - Delete a Task + +Deletes the specified task from the task list. + +Example of usage: + +`delete 2` + +Expected outcome: + +``` +Noted. I've removed this task: +[D][ ] submit report (by: 31 Mar 2022) +Now you have X tasks in the list. +``` + +### `find` - Find Tasks + +Displays a list of tasks that match the specified keyword. + +Example of usage: + +`find meeting` + +Expected outcome: + +``` +Found 1 matching queries! +1.[E][ ] project meeting (from: 2022-04-01 to: 2022-04-02) +``` + +### `list` - List All Tasks + +Displays a list of all tasks in the task list. + +Example of usage: + +`list` + +Expected outcome: + +``` +Here are the tasks in your list: +1.[T][ ] buy groceries +2.[E][ ] project meeting (from: 2022-04-01 to: 2022-04-02) +``` + +### `mark` - Mark a Task as Done + +Marks the specified task as done. + +Example of usage: + +`mark 1` + +Expected outcome: + +``` +Nice! I've marked this task as done: +[T][X] buy groceries +``` + +### `unmark` - Unmark a Task as Undone + +Marks the specified task as undone. + +Example of usage: + +`unmark 1` + +Expected outcome: + +``` +Noted. I've marked this task as undone: +[T][ ] buy groceries +``` + +## Other Commands + +### `bye` - Quit the application + +Exit the application From 473b696c85b18a03e5561ec9639f02795faf8031 Mon Sep 17 00:00:00 2001 From: firwer Date: Fri, 24 Feb 2023 15:33:01 +0800 Subject: [PATCH 35/37] docs: Graphic out of place --- docs/README.md | 7 ------- 1 file changed, 7 deletions(-) diff --git a/docs/README.md b/docs/README.md index 6940160d7..7281790d7 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,12 +1,5 @@ # User Guide For Sage Task Manager -░██████╗░█████╗░░██████╗░███████╗ -██╔════╝██╔══██╗██╔════╝░██╔════╝ -╚█████╗░███████║██║░░██╗░█████╗░░ -░╚═══██╗██╔══██║██║░░╚██╗██╔══╝░░ -██████╔╝██║░░██║╚██████╔╝███████╗ -╚═════╝░╚═╝░░╚═╝░╚═════╝░╚══════╝ - ## Features ### Add Task (Todo, Event or Deadline) From 56953e12c68f6116985364a773e9b02d456d06c3 Mon Sep 17 00:00:00 2001 From: firwer Date: Fri, 24 Feb 2023 15:50:39 +0800 Subject: [PATCH 36/37] chore: Code quality improvement --- src/main/java/sage/tasktypes/Deadline.java | 1 - src/main/java/sage/utility/Display.java | 6 +----- src/main/java/sage/utility/Storage.java | 7 +++---- src/main/java/sage/utility/TaskList.java | 2 -- 4 files changed, 4 insertions(+), 12 deletions(-) diff --git a/src/main/java/sage/tasktypes/Deadline.java b/src/main/java/sage/tasktypes/Deadline.java index 02d4631a1..7777cf4c7 100644 --- a/src/main/java/sage/tasktypes/Deadline.java +++ b/src/main/java/sage/tasktypes/Deadline.java @@ -1,7 +1,6 @@ package sage.tasktypes; import java.time.LocalDate; -import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; diff --git a/src/main/java/sage/utility/Display.java b/src/main/java/sage/utility/Display.java index fac8ba6e9..5ad377d99 100644 --- a/src/main/java/sage/utility/Display.java +++ b/src/main/java/sage/utility/Display.java @@ -1,11 +1,7 @@ package sage.utility; -import java.sql.SQLOutput; import java.util.ArrayList; -import sage.tasktypes.Deadline; -import sage.tasktypes.Event; -import sage.tasktypes.Todo; import sage.tasktypes.Task; /** @@ -88,7 +84,7 @@ public void printDeletedTask(ArrayList list, int taskNumber) { Task taskObj = list.get(taskNumber - 1); System.out.println("Noted. I've removed this task:"); System.out.println(taskObj); - System.out.println("Now you have " + String.valueOf(list.size() - 1) + " tasks in the list."); + System.out.println("Now you have " + (list.size() - 1) + " tasks in the list."); } public void printSearchTask(ArrayList results) { diff --git a/src/main/java/sage/utility/Storage.java b/src/main/java/sage/utility/Storage.java index 2935843d4..39e53ba37 100644 --- a/src/main/java/sage/utility/Storage.java +++ b/src/main/java/sage/utility/Storage.java @@ -34,7 +34,6 @@ public void recoverData(TaskList taskList) { String line = scanner.nextLine(); char taskType = line.charAt(1); String taskDescription = ""; - String taskTime = ""; boolean isCompleted = false; char s = line.charAt(4); @@ -48,7 +47,7 @@ public void recoverData(TaskList taskList) { String taskPeriod = line.substring(line.indexOf('(') + 1, line.indexOf(')')); taskDescription = line.substring(7, line.indexOf('(') - 1) + " "; if (taskType == 'D') { - String taskBy = taskPeriod.substring(taskPeriod.indexOf(":") + 2); + String taskBy = taskPeriod.substring(taskPeriod.indexOf(':') + 2); taskList.addTask(taskDescription, taskBy, isCompleted, true); } else { String taskFrom = taskPeriod.substring(taskPeriod.indexOf("from: ") + 6, taskPeriod.indexOf("to: ") - 1); @@ -79,11 +78,11 @@ public void updateFile(ArrayList list) { } FileWriter fw = new FileWriter(PROJECT_FILE_DIR); for (Task taskobj : list) { - fw.write(String.valueOf(taskobj) + " \r\n"); + fw.write(taskobj + " \r\n"); } fw.close(); } catch (IOException e) { - e.printStackTrace(); + System.out.println("Info: Error Updating Changes to Data File, Please refresh App!"); } } } diff --git a/src/main/java/sage/utility/TaskList.java b/src/main/java/sage/utility/TaskList.java index b30d5afc9..ddfc8a3a9 100644 --- a/src/main/java/sage/utility/TaskList.java +++ b/src/main/java/sage/utility/TaskList.java @@ -1,6 +1,5 @@ package sage.utility; -import java.lang.reflect.Array; import java.util.ArrayList; import sage.exceptions.IllegalOperationException; @@ -11,7 +10,6 @@ import sage.tasktypes.Event; import sage.tasktypes.Task; import sage.tasktypes.Todo; -import sage.utility.Storage; /** * A class that stores the list of tasks in the application and access methods for all task operations From 4b8645bff545f6b71f98c53aaf593682e8e0239d Mon Sep 17 00:00:00 2001 From: firwer Date: Thu, 2 Mar 2023 21:59:43 +0800 Subject: [PATCH 37/37] refactor: final cleanup for release --- data/sage.txt | 7 +- .../sage/exceptions/EmptyListException.java | 2 - .../exceptions/IllegalOperationException.java | 2 - .../exceptions/MissingParameterException.java | 2 - .../sage/exceptions/OutOfBoundException.java | 2 - src/main/java/sage/main/Sage.java | 5 +- src/main/java/sage/tasktypes/Deadline.java | 2 +- src/main/java/sage/tasktypes/Event.java | 2 +- src/main/java/sage/tasktypes/Task.java | 4 ++ src/main/java/sage/tasktypes/Todo.java | 2 +- src/main/java/sage/utility/Parser.java | 16 +++-- src/main/java/sage/utility/Storage.java | 66 ++++++++++++------- src/main/java/sage/utility/TaskList.java | 12 ++-- src/main/java/sage/utility/Ui.java | 2 +- 14 files changed, 74 insertions(+), 52 deletions(-) diff --git a/data/sage.txt b/data/sage.txt index 96da5c8f3..fee1a737f 100644 --- a/data/sage.txt +++ b/data/sage.txt @@ -1,3 +1,4 @@ -[T][X] askdmasdd -[T][ ] read book -[D][X] return book (by: June 6th) +[T][ ] read book +[D][ ] return book (by: June 6th) +[T][ ] aasdadsada +[D][X] ajsdkaakd,as (by: wkjsdas) diff --git a/src/main/java/sage/exceptions/EmptyListException.java b/src/main/java/sage/exceptions/EmptyListException.java index 268e2d76d..8a2603160 100644 --- a/src/main/java/sage/exceptions/EmptyListException.java +++ b/src/main/java/sage/exceptions/EmptyListException.java @@ -2,8 +2,6 @@ /** * Exception which returns an error message when operations is conducted on an empty list. - *

- * Prints exception message */ public class EmptyListException extends Exception { diff --git a/src/main/java/sage/exceptions/IllegalOperationException.java b/src/main/java/sage/exceptions/IllegalOperationException.java index b76f3c81f..eb5b02c79 100644 --- a/src/main/java/sage/exceptions/IllegalOperationException.java +++ b/src/main/java/sage/exceptions/IllegalOperationException.java @@ -2,8 +2,6 @@ /** * Exception which returns an error message when operations is conducted on an empty list. - *

- * Prints exception message */ public class IllegalOperationException extends Exception { diff --git a/src/main/java/sage/exceptions/MissingParameterException.java b/src/main/java/sage/exceptions/MissingParameterException.java index 198b740a4..b18c32709 100644 --- a/src/main/java/sage/exceptions/MissingParameterException.java +++ b/src/main/java/sage/exceptions/MissingParameterException.java @@ -2,8 +2,6 @@ /** * Exception which returns an error message when there are missing parameter(s) in task operations. - *

- * Prints exception message */ public class MissingParameterException extends Exception { diff --git a/src/main/java/sage/exceptions/OutOfBoundException.java b/src/main/java/sage/exceptions/OutOfBoundException.java index 9d2ce427d..ab41e14e0 100644 --- a/src/main/java/sage/exceptions/OutOfBoundException.java +++ b/src/main/java/sage/exceptions/OutOfBoundException.java @@ -2,8 +2,6 @@ /** * Exception which returns an error message when an out-of-bound task index is provided by the user - *

- * Prints exception message */ public class OutOfBoundException extends Exception { diff --git a/src/main/java/sage/main/Sage.java b/src/main/java/sage/main/Sage.java index 091bf6d91..ef7d6b95e 100644 --- a/src/main/java/sage/main/Sage.java +++ b/src/main/java/sage/main/Sage.java @@ -1,6 +1,9 @@ package sage.main; -import sage.utility.*; +import sage.utility.Display; +import sage.utility.Parser; +import sage.utility.Ui; + public class Sage { public static void main(String[] args) { diff --git a/src/main/java/sage/tasktypes/Deadline.java b/src/main/java/sage/tasktypes/Deadline.java index 7777cf4c7..a94788057 100644 --- a/src/main/java/sage/tasktypes/Deadline.java +++ b/src/main/java/sage/tasktypes/Deadline.java @@ -6,7 +6,7 @@ /** - * A class that represents a deadline task + * An inherited class from Task that represents Deadline which also stores the expected completion date of a task */ public class Deadline extends Task { diff --git a/src/main/java/sage/tasktypes/Event.java b/src/main/java/sage/tasktypes/Event.java index cbdcb25f1..b30dc4f61 100644 --- a/src/main/java/sage/tasktypes/Event.java +++ b/src/main/java/sage/tasktypes/Event.java @@ -1,7 +1,7 @@ package sage.tasktypes; /** - * A class that represents an event task + * An inherited class from Task that represents Event which also stores the expected starting and ending time of a task */ public class Event extends Task { diff --git a/src/main/java/sage/tasktypes/Task.java b/src/main/java/sage/tasktypes/Task.java index 53e671480..95d9a168f 100644 --- a/src/main/java/sage/tasktypes/Task.java +++ b/src/main/java/sage/tasktypes/Task.java @@ -1,5 +1,9 @@ package sage.tasktypes; + +/** + * A parent class that represents a task's description and completion status. + */ public class Task { private String taskDetails = ""; private boolean isCompleted = false; diff --git a/src/main/java/sage/tasktypes/Todo.java b/src/main/java/sage/tasktypes/Todo.java index fe3f1e96f..8cd10a385 100644 --- a/src/main/java/sage/tasktypes/Todo.java +++ b/src/main/java/sage/tasktypes/Todo.java @@ -1,7 +1,7 @@ package sage.tasktypes; /** - * A class that represents a todo task + * An inherited class from Task that represents Todo. */ public class Todo extends Task { diff --git a/src/main/java/sage/utility/Parser.java b/src/main/java/sage/utility/Parser.java index 4c6bdec22..eda400645 100644 --- a/src/main/java/sage/utility/Parser.java +++ b/src/main/java/sage/utility/Parser.java @@ -12,6 +12,10 @@ public class Parser { private String from = null; private String to = null; + private static final Integer MAXSPLIT = 2; + private static final Integer TASKTYPEINDEX = 0; + private static final Integer TASKDESCRIPTIONINDEX = 1; + /** * Parses user input into its respective task type, description and other attributes * @@ -19,16 +23,16 @@ public class Parser { */ public Parser(String input) { this.rawOutput = input.split("/"); - String[] body = rawOutput[0].split(" ", 2); - this.taskType = body[0].toLowerCase(); + String[] body = rawOutput[TASKTYPEINDEX].split(" ", MAXSPLIT); + this.taskType = body[TASKTYPEINDEX].toLowerCase(); if (body.length > 1) { - this.taskDescription = body[1]; + this.taskDescription = body[TASKDESCRIPTIONINDEX]; } for (String i : rawOutput) { - String[] line = i.split(" ", 2); - String field = line.length > 1 ? line[1].trim() : null; - switch (line[0]) { + String[] line = i.split(" ", MAXSPLIT); + String field = line.length > 1 ? line[TASKDESCRIPTIONINDEX].trim() : null; + switch (line[TASKTYPEINDEX]) { case "by": this.by = field; break; diff --git a/src/main/java/sage/utility/Storage.java b/src/main/java/sage/utility/Storage.java index 39e53ba37..0229bf078 100644 --- a/src/main/java/sage/utility/Storage.java +++ b/src/main/java/sage/utility/Storage.java @@ -16,6 +16,14 @@ public class Storage { private static final String PROJECT_FILE_DIR = "./data/sage.txt"; + private static final Integer TASKTYPEINDEX = 1; + private static final Integer TASKCOMPLETIONINDEX = 4; + private static final Integer TASKFROMLENGTH = 6; + private static final Integer TASKTOLENGTH = 4; + + private static final Integer TASKBYLENGTH = 2; + + private static final Integer TASKDESCENTRYINDEX = 7; /** * Recovers and parse any stored data in ./data/sage.txt to taskList @@ -29,32 +37,9 @@ public void recoverData(TaskList taskList) { UI.printResumeSession(); try { Scanner scanner = new Scanner(f); - while (scanner.hasNextLine()) { String line = scanner.nextLine(); - char taskType = line.charAt(1); - String taskDescription = ""; - boolean isCompleted = false; - char s = line.charAt(4); - - if (s == 'X') { - isCompleted = true; - } - if (taskType == 'T') { - taskDescription = line.substring(7); - taskList.addTask(taskDescription, isCompleted, true); - } else { - String taskPeriod = line.substring(line.indexOf('(') + 1, line.indexOf(')')); - taskDescription = line.substring(7, line.indexOf('(') - 1) + " "; - if (taskType == 'D') { - String taskBy = taskPeriod.substring(taskPeriod.indexOf(':') + 2); - taskList.addTask(taskDescription, taskBy, isCompleted, true); - } else { - String taskFrom = taskPeriod.substring(taskPeriod.indexOf("from: ") + 6, taskPeriod.indexOf("to: ") - 1); - String taskTo = taskPeriod.substring(taskPeriod.indexOf("to: ") + 4); - taskList.addTask(taskDescription, taskFrom, taskTo, isCompleted, true); - } - } + writeToApp(line, taskList); } scanner.close(); } catch (FileNotFoundException e) { @@ -63,6 +48,39 @@ public void recoverData(TaskList taskList) { } } + /** + * Writes a given line recovered from previous session data to the application + * + * @param line contains information about a recovered task from the previous session + * @param taskList contains information and methods about all the tasks currently in the list + */ + public void writeToApp(String line, TaskList taskList) { + char taskType = line.charAt(TASKTYPEINDEX); + String taskDescription = ""; + boolean isCompleted = false; + char s = line.charAt(TASKCOMPLETIONINDEX); + + if (s == 'X') { + isCompleted = true; + } + if (taskType == 'T') { + taskDescription = line.substring(TASKDESCENTRYINDEX); + taskList.addTask(taskDescription, isCompleted, true); + } else { + String taskPeriod = line.substring(line.indexOf('(') + 1, line.indexOf(')')); + taskDescription = line.substring(7, line.indexOf('(') - 1) + " "; + if (taskType == 'D') { + String taskBy = taskPeriod.substring(taskPeriod.indexOf(':') + TASKBYLENGTH); + taskList.addTask(taskDescription, taskBy, isCompleted, true); + } else { + String taskFrom = taskPeriod.substring(taskPeriod.indexOf("from: ") + TASKFROMLENGTH, + taskPeriod.indexOf("to: ") - 1); + String taskTo = taskPeriod.substring(taskPeriod.indexOf("to: ") + TASKTOLENGTH); + taskList.addTask(taskDescription, taskFrom, taskTo, isCompleted, true); + } + } + } + /** * Updates the data file in ./data/sage.txt with the latest list of tasks * diff --git a/src/main/java/sage/utility/TaskList.java b/src/main/java/sage/utility/TaskList.java index ddfc8a3a9..91bc13494 100644 --- a/src/main/java/sage/utility/TaskList.java +++ b/src/main/java/sage/utility/TaskList.java @@ -48,7 +48,7 @@ public void findTask(String keywords) { * * @param taskName The name of the TODO task to be added **/ - public void addTask(String taskName, boolean isCompleted, boolean silentmode) { + public void addTask(String taskName, boolean isCompleted, boolean isSilentMode) { try { if (taskName == null) { throw new MissingParameterException(); @@ -56,7 +56,7 @@ public void addTask(String taskName, boolean isCompleted, boolean silentmode) { Todo t = new Todo(taskName); list.add(t); t.setCompleted(isCompleted); - if (!silentmode) { + if (!isSilentMode) { display.printAddedTask(t, list.size()); fm.updateFile(list); } @@ -72,7 +72,7 @@ public void addTask(String taskName, boolean isCompleted, boolean silentmode) { * @param taskName a string that represents the name of the Deadline task to add. * @param byWhen a string that represents the deadline of the Deadline task. **/ - public void addTask(String taskName, String byWhen, boolean isCompleted, boolean silentMode) { + public void addTask(String taskName, String byWhen, boolean isCompleted, boolean isSilentMode) { try { if (taskName == null || byWhen == null) { throw new MissingParameterException(); @@ -80,7 +80,7 @@ public void addTask(String taskName, String byWhen, boolean isCompleted, boolean Deadline d = new Deadline(taskName, byWhen); list.add(d); d.setCompleted(isCompleted); - if (!silentMode) { + if (!isSilentMode) { fm.updateFile(list); display.printAddedTask(d, list.size()); } @@ -101,7 +101,7 @@ public void addTask(String taskName, String byWhen, boolean isCompleted, boolean * @param startWhen a string that represents the start date and time of the Event task. * @param endWhen a string that represents the end date and time of the Event task. */ - public void addTask(String taskName, String startWhen, String endWhen, boolean isCompleted, boolean silentmode) { + public void addTask(String taskName, String startWhen, String endWhen, boolean isCompleted, boolean isSilentMode) { try { if (taskName == null || startWhen == null || endWhen == null) { throw new MissingParameterException(); @@ -109,7 +109,7 @@ public void addTask(String taskName, String startWhen, String endWhen, boolean i Event e = new Event(taskName, startWhen, endWhen); list.add(e); e.setCompleted(isCompleted); - if (!silentmode) { + if (!isSilentMode) { fm.updateFile(list); display.printAddedTask(e, list.size()); } diff --git a/src/main/java/sage/utility/Ui.java b/src/main/java/sage/utility/Ui.java index bacf41b35..76d128aa2 100644 --- a/src/main/java/sage/utility/Ui.java +++ b/src/main/java/sage/utility/Ui.java @@ -3,7 +3,7 @@ import java.util.Scanner; /** - * A class that represents user interaction methods. + * A class that represents user interaction methods such as the execution of user input and recovering previous session. */ public class Ui {