From edede19d33880b3e54056b2309ec2dc6b31ea14a Mon Sep 17 00:00:00 2001 From: John Nicholas Suharjono Date: Thu, 27 Jan 2022 17:17:53 +0800 Subject: [PATCH 01/27] initialize project --- src/main/java/Duke.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 5d313334c..0d9cc05b9 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -1,10 +1,10 @@ public class Duke { public static void main(String[] args) { - String logo = " ____ _ \n" - + "| _ \\ _ _| | _____ \n" - + "| | | | | | | |/ / _ \\\n" - + "| |_| | |_| | < __/\n" - + "|____/ \\__,_|_|\\_\\___|\n"; - System.out.println("Hello from\n" + logo); + System.out.println("____________________________________________________________"); + System.out.println("Hello I'm Duke"); + System.out.println("What can I do for you?"); + System.out.println("____________________________________________________________"); + System.out.println("Bye, Hope to see you again soon!"); + System.out.println("____________________________________________________________"); } } From 25d1b25b8a4f8b4faca3ec58d46821bf54c107db Mon Sep 17 00:00:00 2001 From: John Nicholas Suharjono Date: Thu, 27 Jan 2022 19:01:58 +0800 Subject: [PATCH 02/27] week 3 part 1 --- src/main/java/Duke.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 0d9cc05b9..c3ffb9eb6 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -1,8 +1,24 @@ +import java.util.Scanner; + public class Duke { public static void main(String[] args) { + String command; + Scanner in = new Scanner(System.in); + System.out.println("____________________________________________________________"); System.out.println("Hello I'm Duke"); System.out.println("What can I do for you?"); + System.out.println("____________________________________________________________"); + + command = in.nextLine(); + + while (!command.equals("bye")) { + System.out.println("____________________________________________________________"); + System.out.println(command); + System.out.println("____________________________________________________________"); + command = in.nextLine(); + } + System.out.println("____________________________________________________________"); System.out.println("Bye, Hope to see you again soon!"); System.out.println("____________________________________________________________"); From 28ad6a113f2ace4e2fa0b0e5036e42ca86d043f0 Mon Sep 17 00:00:00 2001 From: John Nicholas Suharjono Date: Thu, 27 Jan 2022 19:19:13 +0800 Subject: [PATCH 03/27] Week 3 Part 2 --- src/main/java/Duke.java | 34 ++++++++++++++++++++++++---------- 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index c3ffb9eb6..15d6c2bd1 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -4,23 +4,37 @@ public class Duke { public static void main(String[] args) { String command; Scanner in = new Scanner(System.in); + String[] task = new String[100]; + int numberOfTask = 0; - System.out.println("____________________________________________________________"); - System.out.println("Hello I'm Duke"); - System.out.println("What can I do for you?"); - System.out.println("____________________________________________________________"); + System.out.println("\t____________________________________________________________"); + System.out.println("\tHello I'm Duke"); + System.out.println("\tWhat can I do for you?"); + System.out.println("\t____________________________________________________________"); command = in.nextLine(); while (!command.equals("bye")) { - System.out.println("____________________________________________________________"); - System.out.println(command); - System.out.println("____________________________________________________________"); + if (command.equals("list")) { + System.out.println("\t____________________________________________________________"); + for (int i=0; i Date: Thu, 27 Jan 2022 22:54:26 +0800 Subject: [PATCH 04/27] Week 3 Part 3 --- src/main/java/{Duke.java => Brave.java} | 29 ++++++++++++++++++++----- src/main/java/Task.java | 26 ++++++++++++++++++++++ 2 files changed, 49 insertions(+), 6 deletions(-) rename src/main/java/{Duke.java => Brave.java} (56%) create mode 100644 src/main/java/Task.java diff --git a/src/main/java/Duke.java b/src/main/java/Brave.java similarity index 56% rename from src/main/java/Duke.java rename to src/main/java/Brave.java index 15d6c2bd1..e3ca85e58 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Brave.java @@ -1,24 +1,41 @@ import java.util.Scanner; +import java.lang.String; -public class Duke { +public class Brave { public static void main(String[] args) { String command; Scanner in = new Scanner(System.in); - String[] task = new String[100]; + Task[] task = new Task[100]; int numberOfTask = 0; System.out.println("\t____________________________________________________________"); - System.out.println("\tHello I'm Duke"); + System.out.println("\tHello I'm Brave"); System.out.println("\tWhat can I do for you?"); System.out.println("\t____________________________________________________________"); command = in.nextLine(); while (!command.equals("bye")) { - if (command.equals("list")) { + if (command.split(" ")[0].equals("mark")) { + String[] words = command.split(" "); + int taskIndex = Integer.parseInt(words[1]) - 1; + task[taskIndex].markAsDone(); + System.out.println("Nice! I've marked this task as done:"); + System.out.println(task[taskIndex].getStatusIcon() + " " + task[taskIndex].getDescription()); + } + + else if (command.split(" ")[0].equals("unmark")) { + String[] words = command.split(" "); + int taskIndex = Integer.parseInt(words[1]) - 1; + task[taskIndex].unmarkAsDone(); + System.out.println("OK, I've marked this task as not done yet:"); + System.out.println(task[taskIndex].getStatusIcon() + " " + task[taskIndex].getDescription()); + } + + else if (command.equals("list")) { System.out.println("\t____________________________________________________________"); for (int i=0; i Date: Thu, 3 Feb 2022 19:25:55 +0800 Subject: [PATCH 05/27] Week 3 Coding Standard --- src/main/java/Task.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/Task.java b/src/main/java/Task.java index c5a403a10..b09b6df57 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -14,6 +14,7 @@ public String getStatusIcon() { public String getDescription() { return description; } + public void markAsDone() { isDone = true; } @@ -21,6 +22,4 @@ public void markAsDone() { public void unmarkAsDone() { isDone = false; } - - -} \ No newline at end of file +} From e835c55778d2c9295a46da3710cf408a9d7ecc4e Mon Sep 17 00:00:00 2001 From: John Nicholas Suharjono Date: Fri, 4 Feb 2022 02:31:49 +0800 Subject: [PATCH 06/27] Add TaskManager Class --- src/main/java/Brave.java | 60 ++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 36 deletions(-) diff --git a/src/main/java/Brave.java b/src/main/java/Brave.java index e3ca85e58..98f3df652 100644 --- a/src/main/java/Brave.java +++ b/src/main/java/Brave.java @@ -3,55 +3,43 @@ public class Brave { public static void main(String[] args) { + String input; + String[] inputSplitted; String command; Scanner in = new Scanner(System.in); - Task[] task = new Task[100]; - int numberOfTask = 0; + TaskManager tasks = new TaskManager(); - System.out.println("\t____________________________________________________________"); - System.out.println("\tHello I'm Brave"); - System.out.println("\tWhat can I do for you?"); - System.out.println("\t____________________________________________________________"); + tasks.showWelcomeMessage(); - command = in.nextLine(); - while (!command.equals("bye")) { - if (command.split(" ")[0].equals("mark")) { - String[] words = command.split(" "); - int taskIndex = Integer.parseInt(words[1]) - 1; - task[taskIndex].markAsDone(); - System.out.println("Nice! I've marked this task as done:"); - System.out.println(task[taskIndex].getStatusIcon() + " " + task[taskIndex].getDescription()); - } + while (true) { + input = in.nextLine(); + inputSplitted = input.split(" ", 2); + command = inputSplitted[0]; - else if (command.split(" ")[0].equals("unmark")) { - String[] words = command.split(" "); - int taskIndex = Integer.parseInt(words[1]) - 1; - task[taskIndex].unmarkAsDone(); - System.out.println("OK, I've marked this task as not done yet:"); - System.out.println(task[taskIndex].getStatusIcon() + " " + task[taskIndex].getDescription()); + if (command.startsWith("bye")) { + break; } - else if (command.equals("list")) { - System.out.println("\t____________________________________________________________"); - for (int i=0; i Date: Fri, 4 Feb 2022 02:33:05 +0800 Subject: [PATCH 07/27] Add TaskManager class --- src/main/java/TaskManager.java | 43 ++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 src/main/java/TaskManager.java diff --git a/src/main/java/TaskManager.java b/src/main/java/TaskManager.java new file mode 100644 index 000000000..1632e97a0 --- /dev/null +++ b/src/main/java/TaskManager.java @@ -0,0 +1,43 @@ +public class TaskManager { + private final Task[] tasks = new Task[100]; + private int tasksCount = 0; + + public TaskManager() { + } + + public void addTask(String description) { + this.tasks[this.tasksCount] = new Task(description); + System.out.println("\t____________________________________________________________"); + System.out.println("\tadded: " + this.tasks[this.tasksCount].description); + System.out.println("\t____________________________________________________________"); + ++this.tasksCount; + } + + public void printTaskList() { + System.out.println("\t____________________________________________________________"); + for (int i=0; i Date: Fri, 4 Feb 2022 03:24:38 +0800 Subject: [PATCH 08/27] Level 4. Add ToDos, Events, Deadlines Class --- src/main/java/Brave.java | 30 ++++++++++++++++++++++++------ src/main/java/Deadline.java | 17 +++++++++++++++++ src/main/java/Event.java | 17 +++++++++++++++++ src/main/java/TaskManager.java | 8 ++++---- src/main/java/Todo.java | 10 ++++++++++ 5 files changed, 72 insertions(+), 10 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/Brave.java b/src/main/java/Brave.java index 98f3df652..6734c2751 100644 --- a/src/main/java/Brave.java +++ b/src/main/java/Brave.java @@ -4,8 +4,10 @@ public class Brave { public static void main(String[] args) { String input; - String[] inputSplitted; + String[] splitInput; String command; + String[] arguments; + String description; Scanner in = new Scanner(System.in); TaskManager tasks = new TaskManager(); @@ -14,8 +16,8 @@ public static void main(String[] args) { while (true) { input = in.nextLine(); - inputSplitted = input.split(" ", 2); - command = inputSplitted[0]; + splitInput = input.split(" ", 2); + command = splitInput[0]; if (command.startsWith("bye")) { break; @@ -26,13 +28,29 @@ public static void main(String[] args) { tasks.printTaskList(); break; case "mark": - tasks.markTask(Integer.parseInt(inputSplitted[1]) - 1); + tasks.markTask(Integer.parseInt(splitInput[1]) - 1); break; case "unmark": - tasks.unmarkTask(Integer.parseInt(inputSplitted[1]) - 1); + tasks.unmarkTask(Integer.parseInt(splitInput[1]) - 1); + break; + case "todo": + tasks.addTask(new Todo(splitInput[1])); + break; + case "deadline": + arguments = splitInput[1].split(" /by ", 2); + description = arguments[0]; + String by = arguments[1]; + tasks.addTask(new Deadline(description, by)); + break; + case "event": + arguments = splitInput[1].split(" /at ", 2); + description = arguments[0]; + String eventTime = arguments[1]; + tasks.addTask(new Event(description, eventTime)); break; default: - tasks.addTask(input); + System.out.println("Wrong input"); + break; } } diff --git a/src/main/java/Deadline.java b/src/main/java/Deadline.java new file mode 100644 index 000000000..93b585650 --- /dev/null +++ b/src/main/java/Deadline.java @@ -0,0 +1,17 @@ +public class Deadline extends Task { + private String by; + + public Deadline(String description, String by) { + super(description); + this.by = by; + } + + @Override + public String getStatusIcon() { + return "[D]" + super.getStatusIcon(); + } + + public String getDescription() { + return super.getDescription() + String.format(" (by: %s)", this.by); + } +} \ No newline at end of file diff --git a/src/main/java/Event.java b/src/main/java/Event.java new file mode 100644 index 000000000..a257056e8 --- /dev/null +++ b/src/main/java/Event.java @@ -0,0 +1,17 @@ +public class Event extends Task { + private String eventTime; + + public Event(String description, String eventTime) { + super(description); + this.eventTime = eventTime; + } + + @Override + public String getStatusIcon() { + return "[E]" + super.getStatusIcon(); + } + + public String getDescription() { + return super.getDescription() + String.format(" (at: %s)", this.eventTime); + } +} \ No newline at end of file diff --git a/src/main/java/TaskManager.java b/src/main/java/TaskManager.java index 1632e97a0..878afed2b 100644 --- a/src/main/java/TaskManager.java +++ b/src/main/java/TaskManager.java @@ -5,10 +5,10 @@ public class TaskManager { public TaskManager() { } - public void addTask(String description) { - this.tasks[this.tasksCount] = new Task(description); + public void addTask(Task description) { + this.tasks[this.tasksCount] = description; System.out.println("\t____________________________________________________________"); - System.out.println("\tadded: " + this.tasks[this.tasksCount].description); + System.out.println("\tYepp, I have added this task\n\t" + this.tasks[this.tasksCount].description +"\n\tYou currently have " + (this.tasksCount+1) + " task in the list"); System.out.println("\t____________________________________________________________"); ++this.tasksCount; } @@ -16,7 +16,7 @@ public void addTask(String description) { public void printTaskList() { System.out.println("\t____________________________________________________________"); for (int i=0; i Date: Fri, 4 Feb 2022 03:37:12 +0800 Subject: [PATCH 09/27] Improve code quality, add constant --- src/main/java/Brave.java | 19 ++++++++++--------- src/main/java/TaskManager.java | 15 ++++++++------- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/src/main/java/Brave.java b/src/main/java/Brave.java index 6734c2751..1233affcf 100644 --- a/src/main/java/Brave.java +++ b/src/main/java/Brave.java @@ -17,9 +17,12 @@ public static void main(String[] args) { while (true) { input = in.nextLine(); splitInput = input.split(" ", 2); - command = splitInput[0]; + command = splitInput[0]; //e.g. mark 2 -> take the first word as the command -> "mark" - if (command.startsWith("bye")) { + if (command.equals("bye")) { + System.out.println("\t____________________________________________________________"); + System.out.println("\tBye, Hope to see you again soon!"); + System.out.println("\t____________________________________________________________"); break; } @@ -28,35 +31,33 @@ public static void main(String[] args) { tasks.printTaskList(); break; case "mark": - tasks.markTask(Integer.parseInt(splitInput[1]) - 1); + tasks.markTask(Integer.parseInt(splitInput[1]) - 1); // 0 indexing break; case "unmark": - tasks.unmarkTask(Integer.parseInt(splitInput[1]) - 1); + tasks.unmarkTask(Integer.parseInt(splitInput[1]) - 1); // 0 indexing break; case "todo": tasks.addTask(new Todo(splitInput[1])); break; case "deadline": + // To-do validate arguments~ arguments = splitInput[1].split(" /by ", 2); description = arguments[0]; String by = arguments[1]; tasks.addTask(new Deadline(description, by)); break; case "event": + // To-do validate arguments~ arguments = splitInput[1].split(" /at ", 2); description = arguments[0]; String eventTime = arguments[1]; tasks.addTask(new Event(description, eventTime)); break; default: - System.out.println("Wrong input"); + System.out.println("Wrong input, available command are -> list/mark/unmark/todo/deadline/event"); break; } } - - System.out.println("\t____________________________________________________________"); - System.out.println("\tBye, Hope to see you again soon!"); - System.out.println("\t____________________________________________________________"); } diff --git a/src/main/java/TaskManager.java b/src/main/java/TaskManager.java index 878afed2b..00359b08d 100644 --- a/src/main/java/TaskManager.java +++ b/src/main/java/TaskManager.java @@ -1,5 +1,6 @@ public class TaskManager { - private final Task[] tasks = new Task[100]; + public static final int MAX_TASK = 100; + private final Task[] tasks = new Task[MAX_TASK]; private int tasksCount = 0; public TaskManager() { @@ -8,26 +9,26 @@ public TaskManager() { public void addTask(Task description) { this.tasks[this.tasksCount] = description; System.out.println("\t____________________________________________________________"); - System.out.println("\tYepp, I have added this task\n\t" + this.tasks[this.tasksCount].description +"\n\tYou currently have " + (this.tasksCount+1) + " task in the list"); + System.out.println("\tYepp, I have added this task\n\t" + this.tasks[this.tasksCount].description + "\n\tYou currently have " + (this.tasksCount + 1) + " task in the list"); System.out.println("\t____________________________________________________________"); - ++this.tasksCount; + this.tasksCount++; } public void printTaskList() { System.out.println("\t____________________________________________________________"); - for (int i=0; i Date: Thu, 10 Feb 2022 20:14:57 +0800 Subject: [PATCH 10/27] improve code quality --- src/main/java/Brave.java | 21 +++++++++------------ src/main/java/Task.java | 2 +- src/main/java/TaskManager.java | 26 +++++++++++++++++--------- 3 files changed, 27 insertions(+), 22 deletions(-) diff --git a/src/main/java/Brave.java b/src/main/java/Brave.java index 1233affcf..d4fb19c6f 100644 --- a/src/main/java/Brave.java +++ b/src/main/java/Brave.java @@ -4,7 +4,7 @@ public class Brave { public static void main(String[] args) { String input; - String[] splitInput; + String[] splitInputs; String command; String[] arguments; String description; @@ -13,16 +13,13 @@ public static void main(String[] args) { tasks.showWelcomeMessage(); - while (true) { input = in.nextLine(); - splitInput = input.split(" ", 2); - command = splitInput[0]; //e.g. mark 2 -> take the first word as the command -> "mark" + splitInputs = input.split(" ", 2); + command = splitInputs[0]; //e.g. mark 2 -> take the first word as the command -> "mark" if (command.equals("bye")) { - System.out.println("\t____________________________________________________________"); - System.out.println("\tBye, Hope to see you again soon!"); - System.out.println("\t____________________________________________________________"); + tasks.showFarewellMessage(); break; } @@ -31,24 +28,24 @@ public static void main(String[] args) { tasks.printTaskList(); break; case "mark": - tasks.markTask(Integer.parseInt(splitInput[1]) - 1); // 0 indexing + tasks.markTask(Integer.parseInt(splitInputs[1]) - 1); // 0 indexing break; case "unmark": - tasks.unmarkTask(Integer.parseInt(splitInput[1]) - 1); // 0 indexing + tasks.unmarkTask(Integer.parseInt(splitInputs[1]) - 1); // 0 indexing break; case "todo": - tasks.addTask(new Todo(splitInput[1])); + tasks.addTask(new Todo(splitInputs[1])); break; case "deadline": // To-do validate arguments~ - arguments = splitInput[1].split(" /by ", 2); + arguments = splitInputs[1].split(" /by ", 2); description = arguments[0]; String by = arguments[1]; tasks.addTask(new Deadline(description, by)); break; case "event": // To-do validate arguments~ - arguments = splitInput[1].split(" /at ", 2); + arguments = splitInputs[1].split(" /at ", 2); description = arguments[0]; String eventTime = arguments[1]; tasks.addTask(new Event(description, eventTime)); diff --git a/src/main/java/Task.java b/src/main/java/Task.java index b09b6df57..c8874f5d5 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -1,4 +1,4 @@ -public class Task { +public abstract class Task { protected String description; protected boolean isDone; diff --git a/src/main/java/TaskManager.java b/src/main/java/TaskManager.java index 00359b08d..8fc9671be 100644 --- a/src/main/java/TaskManager.java +++ b/src/main/java/TaskManager.java @@ -1,5 +1,6 @@ public class TaskManager { public static final int MAX_TASK = 100; + public static final String LINE_SPLIT = "\t____________________________________________________________"; private final Task[] tasks = new Task[MAX_TASK]; private int tasksCount = 0; @@ -8,24 +9,26 @@ public TaskManager() { public void addTask(Task description) { this.tasks[this.tasksCount] = description; - System.out.println("\t____________________________________________________________"); - System.out.println("\tYepp, I have added this task\n\t" + this.tasks[this.tasksCount].description + "\n\tYou currently have " + (this.tasksCount + 1) + " task in the list"); - System.out.println("\t____________________________________________________________"); + System.out.println(LINE_SPLIT); + System.out.println("\tYepp, I have added task below!"); + System.out.println("\t" + tasks[tasksCount].description); + System.out.println("\tYou currenly have " + (tasksCount + 1) + " task in the list"); + System.out.println(LINE_SPLIT); this.tasksCount++; } public void printTaskList() { - System.out.println("\t____________________________________________________________"); + System.out.println(LINE_SPLIT); for (int i = 0; i < tasksCount; i++) { - System.out.println(String.format("\t%d.%s %s", i + 1, this.tasks[i].getStatusIcon(), this.tasks[i].getDescription())); + System.out.println(String.format("\t%d.%s %s", i + 1, tasks[i].getStatusIcon(), tasks[i].getDescription())); } - System.out.println("\t____________________________________________________________"); + System.out.println(LINE_SPLIT); } public void markTask(int taskIndex) { this.tasks[taskIndex].markAsDone(); System.out.println("Nice! I've marked this task as done:"); - System.out.println(this.tasks[taskIndex].getStatusIcon() + " " + this.tasks[taskIndex].getDescription()); + System.out.println(tasks[taskIndex].getStatusIcon() + " " + tasks[taskIndex].getDescription()); } public void unmarkTask(int taskIndex) { @@ -35,10 +38,15 @@ public void unmarkTask(int taskIndex) { } public void showWelcomeMessage() { - System.out.println("\t____________________________________________________________"); + System.out.println(LINE_SPLIT); System.out.println("\tHello I'm Brave"); System.out.println("\tWhat can I do for you?"); - System.out.println("\t____________________________________________________________"); + System.out.println(LINE_SPLIT); } + public void showFarewellMessage() { + System.out.println(LINE_SPLIT); + System.out.println("\tBye, Hope to see you again soon!"); + System.out.println(LINE_SPLIT); + } } From 0852ee75aba817f53be114b02b0dc2b376e9e1fb Mon Sep 17 00:00:00 2001 From: John Nicholas Suharjono Date: Thu, 10 Feb 2022 20:55:55 +0800 Subject: [PATCH 11/27] Adding exception for mark, unmark, todo, and invalid command --- src/main/java/Brave.java | 29 ++++++++++++++++++--- src/main/java/IllegalArgumentException.java | 2 ++ 2 files changed, 27 insertions(+), 4 deletions(-) create mode 100644 src/main/java/IllegalArgumentException.java diff --git a/src/main/java/Brave.java b/src/main/java/Brave.java index d4fb19c6f..1f3550cbf 100644 --- a/src/main/java/Brave.java +++ b/src/main/java/Brave.java @@ -28,13 +28,29 @@ public static void main(String[] args) { tasks.printTaskList(); break; case "mark": - tasks.markTask(Integer.parseInt(splitInputs[1]) - 1); // 0 indexing + try { + tasks.markTask(Integer.parseInt(splitInputs[1]) - 1); // 0 indexing + } catch (NumberFormatException e) { + System.out.println("Please put in integer value"); + } catch (NullPointerException | ArrayIndexOutOfBoundsException e) { + System.out.println("Please put in valid number of task"); + } break; case "unmark": - tasks.unmarkTask(Integer.parseInt(splitInputs[1]) - 1); // 0 indexing + try { + tasks.unmarkTask(Integer.parseInt(splitInputs[1]) - 1); // 0 indexing + } catch (NumberFormatException e) { + System.out.println("Please put in integer value"); + } catch (NullPointerException | ArrayIndexOutOfBoundsException e) { + System.out.println("Please put in valid number of task"); + } break; case "todo": - tasks.addTask(new Todo(splitInputs[1])); + try { + tasks.addTask(new Todo(splitInputs[1])); + } catch (IndexOutOfBoundsException e) { + System.out.println(" ☹ OOPS!!! The description of a todo cannot be empty."); + } break; case "deadline": // To-do validate arguments~ @@ -51,7 +67,12 @@ public static void main(String[] args) { tasks.addTask(new Event(description, eventTime)); break; default: - System.out.println("Wrong input, available command are -> list/mark/unmark/todo/deadline/event"); + try { + throw new IllegalArgumentException(); + } catch (IllegalArgumentException e) { + System.out.println("☹ OOPS!!! I'm sorry, but I don't know what that means :-("); + System.out.println("Available command are -> list/mark/unmark/todo/deadline/event"); + } break; } } diff --git a/src/main/java/IllegalArgumentException.java b/src/main/java/IllegalArgumentException.java new file mode 100644 index 000000000..ee1ef933c --- /dev/null +++ b/src/main/java/IllegalArgumentException.java @@ -0,0 +1,2 @@ +public class IllegalArgumentException extends Exception{ +} From a235cc3374f87470457fbfbc83af6b9fcf2a059a Mon Sep 17 00:00:00 2001 From: John Nicholas Suharjono Date: Fri, 11 Feb 2022 00:14:29 +0800 Subject: [PATCH 12/27] create package --- src/main/java/{ => brave}/Brave.java | 2 ++ src/main/java/{ => brave}/Deadline.java | 2 ++ src/main/java/{ => brave}/Event.java | 2 ++ src/main/java/{ => brave}/IllegalArgumentException.java | 2 ++ src/main/java/{ => brave}/Task.java | 2 ++ src/main/java/{ => brave}/TaskManager.java | 2 ++ src/main/java/{ => brave}/Todo.java | 2 ++ 7 files changed, 14 insertions(+) rename src/main/java/{ => brave}/Brave.java (99%) rename src/main/java/{ => brave}/Deadline.java (96%) rename src/main/java/{ => brave}/Event.java (96%) rename src/main/java/{ => brave}/IllegalArgumentException.java (78%) rename src/main/java/{ => brave}/Task.java (96%) rename src/main/java/{ => brave}/TaskManager.java (99%) rename src/main/java/{ => brave}/Todo.java (92%) diff --git a/src/main/java/Brave.java b/src/main/java/brave/Brave.java similarity index 99% rename from src/main/java/Brave.java rename to src/main/java/brave/Brave.java index 1f3550cbf..e687c44c2 100644 --- a/src/main/java/Brave.java +++ b/src/main/java/brave/Brave.java @@ -1,3 +1,5 @@ +package brave; + import java.util.Scanner; import java.lang.String; diff --git a/src/main/java/Deadline.java b/src/main/java/brave/Deadline.java similarity index 96% rename from src/main/java/Deadline.java rename to src/main/java/brave/Deadline.java index 93b585650..27b70a0f8 100644 --- a/src/main/java/Deadline.java +++ b/src/main/java/brave/Deadline.java @@ -1,3 +1,5 @@ +package brave; + public class Deadline extends Task { private String by; diff --git a/src/main/java/Event.java b/src/main/java/brave/Event.java similarity index 96% rename from src/main/java/Event.java rename to src/main/java/brave/Event.java index a257056e8..cc8eeed35 100644 --- a/src/main/java/Event.java +++ b/src/main/java/brave/Event.java @@ -1,3 +1,5 @@ +package brave; + public class Event extends Task { private String eventTime; diff --git a/src/main/java/IllegalArgumentException.java b/src/main/java/brave/IllegalArgumentException.java similarity index 78% rename from src/main/java/IllegalArgumentException.java rename to src/main/java/brave/IllegalArgumentException.java index ee1ef933c..e0bd5a002 100644 --- a/src/main/java/IllegalArgumentException.java +++ b/src/main/java/brave/IllegalArgumentException.java @@ -1,2 +1,4 @@ +package brave; + public class IllegalArgumentException extends Exception{ } diff --git a/src/main/java/Task.java b/src/main/java/brave/Task.java similarity index 96% rename from src/main/java/Task.java rename to src/main/java/brave/Task.java index c8874f5d5..a8fc8ff06 100644 --- a/src/main/java/Task.java +++ b/src/main/java/brave/Task.java @@ -1,3 +1,5 @@ +package brave; + public abstract class Task { protected String description; protected boolean isDone; diff --git a/src/main/java/TaskManager.java b/src/main/java/brave/TaskManager.java similarity index 99% rename from src/main/java/TaskManager.java rename to src/main/java/brave/TaskManager.java index 8fc9671be..061bec535 100644 --- a/src/main/java/TaskManager.java +++ b/src/main/java/brave/TaskManager.java @@ -1,3 +1,5 @@ +package brave; + public class TaskManager { public static final int MAX_TASK = 100; public static final String LINE_SPLIT = "\t____________________________________________________________"; diff --git a/src/main/java/Todo.java b/src/main/java/brave/Todo.java similarity index 92% rename from src/main/java/Todo.java rename to src/main/java/brave/Todo.java index e8a555488..a2a56cbef 100644 --- a/src/main/java/Todo.java +++ b/src/main/java/brave/Todo.java @@ -1,3 +1,5 @@ +package brave; + public class Todo extends Task { public Todo(String description) { super(description); From f3bf0575648f02a36e598fdd5284561e325d6438 Mon Sep 17 00:00:00 2001 From: John Nicholas Suharjono Date: Thu, 17 Feb 2022 14:51:37 +0800 Subject: [PATCH 13/27] change array to ArrayList --- src/main/java/brave/Brave.java | 3 ++- src/main/java/brave/TaskManager.java | 32 ++++++++++++++++------------ 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/src/main/java/brave/Brave.java b/src/main/java/brave/Brave.java index e687c44c2..79c818a7c 100644 --- a/src/main/java/brave/Brave.java +++ b/src/main/java/brave/Brave.java @@ -49,7 +49,8 @@ public static void main(String[] args) { break; case "todo": try { - tasks.addTask(new Todo(splitInputs[1])); + description = splitInputs[1]; + tasks.addTask(new Todo(description)); } catch (IndexOutOfBoundsException e) { System.out.println(" ☹ OOPS!!! The description of a todo cannot be empty."); } diff --git a/src/main/java/brave/TaskManager.java b/src/main/java/brave/TaskManager.java index 061bec535..259b66f6e 100644 --- a/src/main/java/brave/TaskManager.java +++ b/src/main/java/brave/TaskManager.java @@ -1,42 +1,46 @@ package brave; +import java.util.ArrayList; + public class TaskManager { - public static final int MAX_TASK = 100; +// public static final int MAX_TASK = 100; public static final String LINE_SPLIT = "\t____________________________________________________________"; - private final Task[] tasks = new Task[MAX_TASK]; - private int tasksCount = 0; + private final ArrayList tasks = new ArrayList<>(); +// private final Task[] tasks = new Task[MAX_TASK]; +// private int tasksCount = 0; public TaskManager() { } - public void addTask(Task description) { - this.tasks[this.tasksCount] = description; + public void addTask(Task task) { + tasks.add(task); System.out.println(LINE_SPLIT); System.out.println("\tYepp, I have added task below!"); - System.out.println("\t" + tasks[tasksCount].description); - System.out.println("\tYou currenly have " + (tasksCount + 1) + " task in the list"); + System.out.println("\t" + task.description); + System.out.println("\tYou currenly have " + tasks.size() + " task in the list"); System.out.println(LINE_SPLIT); - this.tasksCount++; } public void printTaskList() { System.out.println(LINE_SPLIT); - for (int i = 0; i < tasksCount; i++) { - System.out.println(String.format("\t%d.%s %s", i + 1, tasks[i].getStatusIcon(), tasks[i].getDescription())); + for (Task task : tasks) { + System.out.println(String.format("\t%d.%s %s", tasks.indexOf(task) + 1, task.getStatusIcon(), task.getDescription())); } System.out.println(LINE_SPLIT); } public void markTask(int taskIndex) { - this.tasks[taskIndex].markAsDone(); + Task selected_task = tasks.get(taskIndex); + selected_task.markAsDone(); System.out.println("Nice! I've marked this task as done:"); - System.out.println(tasks[taskIndex].getStatusIcon() + " " + tasks[taskIndex].getDescription()); + System.out.println(selected_task.getStatusIcon() + " " + selected_task.getDescription()); } public void unmarkTask(int taskIndex) { - this.tasks[taskIndex].unmarkAsDone(); + Task selected_task = tasks.get(taskIndex); + selected_task.unmarkAsDone(); System.out.println("OK, I've marked this task as not done yet:"); - System.out.println(this.tasks[taskIndex].getStatusIcon() + " " + this.tasks[taskIndex].getDescription()); + System.out.println(selected_task.getStatusIcon() + " " + selected_task.getDescription()); } public void showWelcomeMessage() { From 2338c4c9def727d33272aeb2e39b2df3cb026020 Mon Sep 17 00:00:00 2001 From: John Nicholas Suharjono Date: Thu, 17 Feb 2022 23:43:48 +0800 Subject: [PATCH 14/27] Add delete function --- src/main/java/brave/Brave.java | 9 +++++++++ src/main/java/brave/TaskManager.java | 13 +++++++++++++ 2 files changed, 22 insertions(+) diff --git a/src/main/java/brave/Brave.java b/src/main/java/brave/Brave.java index 79c818a7c..6ba9f668a 100644 --- a/src/main/java/brave/Brave.java +++ b/src/main/java/brave/Brave.java @@ -69,6 +69,15 @@ public static void main(String[] args) { String eventTime = arguments[1]; tasks.addTask(new Event(description, eventTime)); break; + case "delete": + try { + tasks.deleteTask(Integer.parseInt(splitInputs[1]) - 1); // 0 indexing + } catch (NumberFormatException e) { + System.out.println("Please put in integer value"); + } catch (NullPointerException | ArrayIndexOutOfBoundsException e) { + System.out.println("Please put in valid number of task"); + } + break; default: try { throw new IllegalArgumentException(); diff --git a/src/main/java/brave/TaskManager.java b/src/main/java/brave/TaskManager.java index 259b66f6e..eaa5817c1 100644 --- a/src/main/java/brave/TaskManager.java +++ b/src/main/java/brave/TaskManager.java @@ -22,6 +22,10 @@ public void addTask(Task task) { } public void printTaskList() { + if (tasks.size() == 0) { + System.out.println("You currently have no task!"); + return; + } System.out.println(LINE_SPLIT); for (Task task : tasks) { System.out.println(String.format("\t%d.%s %s", tasks.indexOf(task) + 1, task.getStatusIcon(), task.getDescription())); @@ -43,6 +47,15 @@ public void unmarkTask(int taskIndex) { System.out.println(selected_task.getStatusIcon() + " " + selected_task.getDescription()); } + public void deleteTask(int taskIndex) { + Task selected_task = tasks.get(taskIndex); + System.out.println(LINE_SPLIT); + System.out.println("Successfully deleted task below"); + System.out.println(String.format("\t%d.%s %s", taskIndex + 1, selected_task.getStatusIcon(), selected_task.getDescription())); + tasks.remove(taskIndex); + System.out.println("You now have " + tasks.size() + " task remaining"); + } + public void showWelcomeMessage() { System.out.println(LINE_SPLIT); System.out.println("\tHello I'm Brave"); From 2656fb608d38a627dd31202a9247599362f37fb9 Mon Sep 17 00:00:00 2001 From: John Nicholas Suharjono Date: Fri, 18 Feb 2022 00:01:34 +0800 Subject: [PATCH 15/27] add data/brave.txt --- data/brave.txt | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 data/brave.txt diff --git a/data/brave.txt b/data/brave.txt new file mode 100644 index 000000000..34eebc882 --- /dev/null +++ b/data/brave.txt @@ -0,0 +1,4 @@ +T | 1 | read book +D | 0 | return book | June 6th +E | 0 | project meeting | Aug 6th 2-4pm +T | 1 | join sports club \ No newline at end of file From 7947f408b8365fb691f9cda381e576203295f58b Mon Sep 17 00:00:00 2001 From: John Nicholas Suharjono Date: Fri, 18 Feb 2022 08:37:46 +0800 Subject: [PATCH 16/27] Add file reading --- src/main/java/brave/Brave.java | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/main/java/brave/Brave.java b/src/main/java/brave/Brave.java index e687c44c2..04e507990 100644 --- a/src/main/java/brave/Brave.java +++ b/src/main/java/brave/Brave.java @@ -1,7 +1,9 @@ package brave; +import java.io.FileNotFoundException; import java.util.Scanner; import java.lang.String; +import java.io.File; public class Brave { public static void main(String[] args) { @@ -12,9 +14,13 @@ public static void main(String[] args) { String description; Scanner in = new Scanner(System.in); TaskManager tasks = new TaskManager(); + try { + initialiseTasks("data/brave.txt"); + } catch (FileNotFoundException e) { + System.out.println("File not found"); + } tasks.showWelcomeMessage(); - while (true) { input = in.nextLine(); splitInputs = input.split(" ", 2); @@ -80,5 +86,12 @@ public static void main(String[] args) { } } + public static void initialiseTasks(String filePath) throws FileNotFoundException { + File f = new File(filePath); // create a File for the given file path + Scanner s = new Scanner(f); // create a Scanner using the File as the source + while (s.hasNext()) { + System.out.println(s.nextLine()); + } + } } From b6b4efbd07cf4ee1ff62573b319c88767718393a Mon Sep 17 00:00:00 2001 From: John Nicholas Suharjono Date: Fri, 18 Feb 2022 09:46:11 +0800 Subject: [PATCH 17/27] Merge level 6 and level 7, finish read and write file --- data/brave.txt | 9 +++-- src/main/java/brave/Brave.java | 13 +----- src/main/java/brave/Deadline.java | 9 +++++ src/main/java/brave/Event.java | 9 +++++ src/main/java/brave/Task.java | 2 + src/main/java/brave/TaskManager.java | 59 +++++++++++++++++++++++++++- src/main/java/brave/Todo.java | 9 +++++ 7 files changed, 94 insertions(+), 16 deletions(-) diff --git a/data/brave.txt b/data/brave.txt index 34eebc882..983da2ab4 100644 --- a/data/brave.txt +++ b/data/brave.txt @@ -1,4 +1,5 @@ -T | 1 | read book -D | 0 | return book | June 6th -E | 0 | project meeting | Aug 6th 2-4pm -T | 1 | join sports club \ No newline at end of file +T , 1 , read book +D , 0 , return book , June 6th +E , 0 , project meeting , Aug 6th 2-4pm +T , 1 , join sports club +T , 0 , cs2113 lecture diff --git a/src/main/java/brave/Brave.java b/src/main/java/brave/Brave.java index c7d1633ea..51e717ff8 100644 --- a/src/main/java/brave/Brave.java +++ b/src/main/java/brave/Brave.java @@ -3,7 +3,6 @@ import java.io.FileNotFoundException; import java.util.Scanner; import java.lang.String; -import java.io.File; public class Brave { public static void main(String[] args) { @@ -15,7 +14,7 @@ public static void main(String[] args) { Scanner in = new Scanner(System.in); TaskManager tasks = new TaskManager(); try { - initialiseTasks("data/brave.txt"); + tasks.initialiseTasks("data/brave.txt"); } catch (FileNotFoundException e) { System.out.println("File not found"); } @@ -28,6 +27,7 @@ public static void main(String[] args) { if (command.equals("bye")) { tasks.showFarewellMessage(); + tasks.saveTask("data/brave.txt"); break; } @@ -95,13 +95,4 @@ public static void main(String[] args) { } } } - - public static void initialiseTasks(String filePath) throws FileNotFoundException { - File f = new File(filePath); // create a File for the given file path - Scanner s = new Scanner(f); // create a Scanner using the File as the source - while (s.hasNext()) { - System.out.println(s.nextLine()); - } - } - } diff --git a/src/main/java/brave/Deadline.java b/src/main/java/brave/Deadline.java index 27b70a0f8..95a109ca2 100644 --- a/src/main/java/brave/Deadline.java +++ b/src/main/java/brave/Deadline.java @@ -16,4 +16,13 @@ public String getStatusIcon() { public String getDescription() { return super.getDescription() + String.format(" (by: %s)", this.by); } + + @Override + public String getSaveFormat() { + if (!isDone) { + return "D , 0 , " + this.description + " , " + this.by; + } else { + return "D , 1 , " + this.description + " , " + this.by; + } + } } \ No newline at end of file diff --git a/src/main/java/brave/Event.java b/src/main/java/brave/Event.java index cc8eeed35..7d32bf772 100644 --- a/src/main/java/brave/Event.java +++ b/src/main/java/brave/Event.java @@ -16,4 +16,13 @@ public String getStatusIcon() { public String getDescription() { return super.getDescription() + String.format(" (at: %s)", this.eventTime); } + + @Override + public String getSaveFormat() { + if (!isDone) { + return "E , 0 , " + this.description + " , " + this.eventTime; + } else { + return "E , 1 , " + this.description + " , " + this.eventTime; + } + } } \ No newline at end of file diff --git a/src/main/java/brave/Task.java b/src/main/java/brave/Task.java index a8fc8ff06..268ef86eb 100644 --- a/src/main/java/brave/Task.java +++ b/src/main/java/brave/Task.java @@ -24,4 +24,6 @@ public void markAsDone() { public void unmarkAsDone() { isDone = false; } + + public abstract String getSaveFormat(); } diff --git a/src/main/java/brave/TaskManager.java b/src/main/java/brave/TaskManager.java index eaa5817c1..dee72187d 100644 --- a/src/main/java/brave/TaskManager.java +++ b/src/main/java/brave/TaskManager.java @@ -1,9 +1,14 @@ package brave; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; import java.util.ArrayList; +import java.util.Scanner; +import java.io.FileWriter; public class TaskManager { -// public static final int MAX_TASK = 100; + // public static final int MAX_TASK = 100; public static final String LINE_SPLIT = "\t____________________________________________________________"; private final ArrayList tasks = new ArrayList<>(); // private final Task[] tasks = new Task[MAX_TASK]; @@ -12,6 +17,43 @@ public class TaskManager { public TaskManager() { } + + public void initialiseTasks(String filePath) throws FileNotFoundException { + System.out.println("initialising task!"); + File f = new File(filePath); // create a File for the given file path + Scanner s = new Scanner(f); // create a Scanner using the File as the source + int taskIndex = -1; + while (s.hasNext()) { + taskIndex++; + Task selected_task; + String[] details = s.nextLine().split(" , ", 0); + switch (details[0]) { + case "T": + tasks.add(new Todo(details[2])); + if (details[1].equals("1")) { + selected_task = tasks.get(taskIndex); + selected_task.markAsDone(); + } + break; + case "D": + tasks.add(new Deadline(details[2], details[3])); + if (details[1].equals("1")) { + selected_task = tasks.get(taskIndex); + selected_task.markAsDone(); + } + break; + case "E": + tasks.add(new Event(details[2], details[3])); + if (details[1].equals("1")) { + selected_task = tasks.get(taskIndex); + selected_task.markAsDone(); + } + break; + } + } + System.out.println("done!"); + } + public void addTask(Task task) { tasks.add(task); System.out.println(LINE_SPLIT); @@ -33,6 +75,21 @@ public void printTaskList() { System.out.println(LINE_SPLIT); } + public void saveTask(String filePath) { + try { + FileWriter fw = new FileWriter(filePath); + String toFile = ""; + for (Task task : tasks) { + toFile += task.getSaveFormat() + "\n"; + } + fw.write(toFile); + fw.close(); + } + catch (Exception e) { + System.out.println(e); + } + } + public void markTask(int taskIndex) { Task selected_task = tasks.get(taskIndex); selected_task.markAsDone(); diff --git a/src/main/java/brave/Todo.java b/src/main/java/brave/Todo.java index a2a56cbef..853d115b6 100644 --- a/src/main/java/brave/Todo.java +++ b/src/main/java/brave/Todo.java @@ -9,4 +9,13 @@ public Todo(String description) { public String getStatusIcon() { return "[T]" + super.getStatusIcon(); } + + @Override + public String getSaveFormat() { + if (!isDone) { + return "T , 0 , " + description; + } else { + return "T , 1 , " + description; + } + } } \ No newline at end of file From acb94a44990c9514ce350b9971c82fa0d970ee42 Mon Sep 17 00:00:00 2001 From: John Nicholas Suharjono Date: Thu, 3 Mar 2022 02:55:42 +0800 Subject: [PATCH 18/27] delete some comments --- src/main/java/META-INF/MANIFEST.MF | 3 +++ src/main/java/brave/TaskManager.java | 4 ---- 2 files changed, 3 insertions(+), 4 deletions(-) create mode 100644 src/main/java/META-INF/MANIFEST.MF diff --git a/src/main/java/META-INF/MANIFEST.MF b/src/main/java/META-INF/MANIFEST.MF new file mode 100644 index 000000000..a98fc5530 --- /dev/null +++ b/src/main/java/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Main-Class: brave.Brave + diff --git a/src/main/java/brave/TaskManager.java b/src/main/java/brave/TaskManager.java index dee72187d..ce9788ec1 100644 --- a/src/main/java/brave/TaskManager.java +++ b/src/main/java/brave/TaskManager.java @@ -2,17 +2,13 @@ import java.io.File; import java.io.FileNotFoundException; -import java.io.IOException; import java.util.ArrayList; import java.util.Scanner; import java.io.FileWriter; public class TaskManager { - // public static final int MAX_TASK = 100; public static final String LINE_SPLIT = "\t____________________________________________________________"; private final ArrayList tasks = new ArrayList<>(); -// private final Task[] tasks = new Task[MAX_TASK]; -// private int tasksCount = 0; public TaskManager() { } From 612bddc87bfbbbafd61583b9cf71631c38ef2fef Mon Sep 17 00:00:00 2001 From: John Nicholas Suharjono Date: Thu, 3 Mar 2022 16:20:49 +0800 Subject: [PATCH 19/27] Create more class Add Ui Class Add Storage Class Add Parser Class --- data/brave.txt | 2 +- src/main/java/brave/Brave.java | 119 +++++------------- src/main/java/brave/TaskManager.java | 124 ------------------- src/main/java/brave/{ => data}/Deadline.java | 12 +- src/main/java/brave/{ => data}/Event.java | 12 +- src/main/java/brave/{ => data}/Task.java | 7 +- src/main/java/brave/data/TaskManager.java | 57 +++++++++ src/main/java/brave/{ => data}/Todo.java | 12 +- src/main/java/brave/parser/Parser.java | 101 +++++++++++++++ src/main/java/brave/storage/Storage.java | 78 ++++++++++++ src/main/java/brave/ui/Ui.java | 52 ++++++++ 11 files changed, 346 insertions(+), 230 deletions(-) delete mode 100644 src/main/java/brave/TaskManager.java rename src/main/java/brave/{ => data}/Deadline.java (85%) rename src/main/java/brave/{ => data}/Event.java (86%) rename src/main/java/brave/{ => data}/Task.java (81%) create mode 100644 src/main/java/brave/data/TaskManager.java rename src/main/java/brave/{ => data}/Todo.java (77%) create mode 100644 src/main/java/brave/parser/Parser.java create mode 100644 src/main/java/brave/storage/Storage.java create mode 100644 src/main/java/brave/ui/Ui.java diff --git a/data/brave.txt b/data/brave.txt index 983da2ab4..8fb79feed 100644 --- a/data/brave.txt +++ b/data/brave.txt @@ -1,5 +1,5 @@ T , 1 , read book -D , 0 , return book , June 6th +D , 1 , return book , June 6th E , 0 , project meeting , Aug 6th 2-4pm T , 1 , join sports club T , 0 , cs2113 lecture diff --git a/src/main/java/brave/Brave.java b/src/main/java/brave/Brave.java index 51e717ff8..885fa2d2d 100644 --- a/src/main/java/brave/Brave.java +++ b/src/main/java/brave/Brave.java @@ -1,98 +1,45 @@ package brave; -import java.io.FileNotFoundException; -import java.util.Scanner; +import brave.data.TaskManager; +import brave.parser.Parser; +import brave.ui.Ui; +import brave.storage.Storage; + +import java.io.IOException; import java.lang.String; public class Brave { - public static void main(String[] args) { - String input; - String[] splitInputs; - String command; - String[] arguments; - String description; - Scanner in = new Scanner(System.in); - TaskManager tasks = new TaskManager(); + + private final Ui ui; + private TaskManager tasks; + + public Brave(String filePath) { + ui = new Ui(); + Storage storage = new Storage(filePath); try { - tasks.initialiseTasks("data/brave.txt"); - } catch (FileNotFoundException e) { - System.out.println("File not found"); + tasks = new TaskManager(storage.load()); + } catch (IOException e) { + ui.showLoadingError(e.getMessage()); + tasks = new TaskManager(); } + } - tasks.showWelcomeMessage(); - while (true) { - input = in.nextLine(); - splitInputs = input.split(" ", 2); - command = splitInputs[0]; //e.g. mark 2 -> take the first word as the command -> "mark" - - if (command.equals("bye")) { - tasks.showFarewellMessage(); - tasks.saveTask("data/brave.txt"); - break; - } + public void run() { + ui.showWelcomeMessage(); + boolean isExit; + isExit = false; - switch (command) { - case "list": - tasks.printTaskList(); - break; - case "mark": - try { - tasks.markTask(Integer.parseInt(splitInputs[1]) - 1); // 0 indexing - } catch (NumberFormatException e) { - System.out.println("Please put in integer value"); - } catch (NullPointerException | ArrayIndexOutOfBoundsException e) { - System.out.println("Please put in valid number of task"); - } - break; - case "unmark": - try { - tasks.unmarkTask(Integer.parseInt(splitInputs[1]) - 1); // 0 indexing - } catch (NumberFormatException e) { - System.out.println("Please put in integer value"); - } catch (NullPointerException | ArrayIndexOutOfBoundsException e) { - System.out.println("Please put in valid number of task"); - } - break; - case "todo": - try { - description = splitInputs[1]; - tasks.addTask(new Todo(description)); - } catch (IndexOutOfBoundsException e) { - System.out.println(" ☹ OOPS!!! The description of a todo cannot be empty."); - } - break; - case "deadline": - // To-do validate arguments~ - arguments = splitInputs[1].split(" /by ", 2); - description = arguments[0]; - String by = arguments[1]; - tasks.addTask(new Deadline(description, by)); - break; - case "event": - // To-do validate arguments~ - arguments = splitInputs[1].split(" /at ", 2); - description = arguments[0]; - String eventTime = arguments[1]; - tasks.addTask(new Event(description, eventTime)); - break; - case "delete": - try { - tasks.deleteTask(Integer.parseInt(splitInputs[1]) - 1); // 0 indexing - } catch (NumberFormatException e) { - System.out.println("Please put in integer value"); - } catch (NullPointerException | ArrayIndexOutOfBoundsException e) { - System.out.println("Please put in valid number of task"); - } - break; - default: - try { - throw new IllegalArgumentException(); - } catch (IllegalArgumentException e) { - System.out.println("☹ OOPS!!! I'm sorry, but I don't know what that means :-("); - System.out.println("Available command are -> list/mark/unmark/todo/deadline/event"); - } - break; - } + while (!isExit) { + String fullCommand = ui.getUserCommand(); + Parser p = new Parser(ui); + p.parse(fullCommand, tasks); + isExit = p.getExit(); } + + ui.showFarewellMessage(); + } + + public static void main(String[] args) { + new Brave("data/brave.txt").run(); } } diff --git a/src/main/java/brave/TaskManager.java b/src/main/java/brave/TaskManager.java deleted file mode 100644 index ce9788ec1..000000000 --- a/src/main/java/brave/TaskManager.java +++ /dev/null @@ -1,124 +0,0 @@ -package brave; - -import java.io.File; -import java.io.FileNotFoundException; -import java.util.ArrayList; -import java.util.Scanner; -import java.io.FileWriter; - -public class TaskManager { - public static final String LINE_SPLIT = "\t____________________________________________________________"; - private final ArrayList tasks = new ArrayList<>(); - - public TaskManager() { - } - - - public void initialiseTasks(String filePath) throws FileNotFoundException { - System.out.println("initialising task!"); - File f = new File(filePath); // create a File for the given file path - Scanner s = new Scanner(f); // create a Scanner using the File as the source - int taskIndex = -1; - while (s.hasNext()) { - taskIndex++; - Task selected_task; - String[] details = s.nextLine().split(" , ", 0); - switch (details[0]) { - case "T": - tasks.add(new Todo(details[2])); - if (details[1].equals("1")) { - selected_task = tasks.get(taskIndex); - selected_task.markAsDone(); - } - break; - case "D": - tasks.add(new Deadline(details[2], details[3])); - if (details[1].equals("1")) { - selected_task = tasks.get(taskIndex); - selected_task.markAsDone(); - } - break; - case "E": - tasks.add(new Event(details[2], details[3])); - if (details[1].equals("1")) { - selected_task = tasks.get(taskIndex); - selected_task.markAsDone(); - } - break; - } - } - System.out.println("done!"); - } - - public void addTask(Task task) { - tasks.add(task); - System.out.println(LINE_SPLIT); - System.out.println("\tYepp, I have added task below!"); - System.out.println("\t" + task.description); - System.out.println("\tYou currenly have " + tasks.size() + " task in the list"); - System.out.println(LINE_SPLIT); - } - - public void printTaskList() { - if (tasks.size() == 0) { - System.out.println("You currently have no task!"); - return; - } - System.out.println(LINE_SPLIT); - for (Task task : tasks) { - System.out.println(String.format("\t%d.%s %s", tasks.indexOf(task) + 1, task.getStatusIcon(), task.getDescription())); - } - System.out.println(LINE_SPLIT); - } - - public void saveTask(String filePath) { - try { - FileWriter fw = new FileWriter(filePath); - String toFile = ""; - for (Task task : tasks) { - toFile += task.getSaveFormat() + "\n"; - } - fw.write(toFile); - fw.close(); - } - catch (Exception e) { - System.out.println(e); - } - } - - public void markTask(int taskIndex) { - Task selected_task = tasks.get(taskIndex); - selected_task.markAsDone(); - System.out.println("Nice! I've marked this task as done:"); - System.out.println(selected_task.getStatusIcon() + " " + selected_task.getDescription()); - } - - public void unmarkTask(int taskIndex) { - Task selected_task = tasks.get(taskIndex); - selected_task.unmarkAsDone(); - System.out.println("OK, I've marked this task as not done yet:"); - System.out.println(selected_task.getStatusIcon() + " " + selected_task.getDescription()); - } - - public void deleteTask(int taskIndex) { - Task selected_task = tasks.get(taskIndex); - System.out.println(LINE_SPLIT); - System.out.println("Successfully deleted task below"); - System.out.println(String.format("\t%d.%s %s", taskIndex + 1, selected_task.getStatusIcon(), selected_task.getDescription())); - tasks.remove(taskIndex); - System.out.println("You now have " + tasks.size() + " task remaining"); - } - - public void showWelcomeMessage() { - System.out.println(LINE_SPLIT); - System.out.println("\tHello I'm Brave"); - System.out.println("\tWhat can I do for you?"); - System.out.println(LINE_SPLIT); - } - - public void showFarewellMessage() { - System.out.println(LINE_SPLIT); - System.out.println("\tBye, Hope to see you again soon!"); - System.out.println(LINE_SPLIT); - } -} diff --git a/src/main/java/brave/Deadline.java b/src/main/java/brave/data/Deadline.java similarity index 85% rename from src/main/java/brave/Deadline.java rename to src/main/java/brave/data/Deadline.java index 95a109ca2..c64534679 100644 --- a/src/main/java/brave/Deadline.java +++ b/src/main/java/brave/data/Deadline.java @@ -1,4 +1,4 @@ -package brave; +package brave.data; public class Deadline extends Task { private String by; @@ -8,15 +8,15 @@ public Deadline(String description, String by) { this.by = by; } - @Override - public String getStatusIcon() { - return "[D]" + super.getStatusIcon(); - } - public String getDescription() { return super.getDescription() + String.format(" (by: %s)", this.by); } + @Override + public String toString() { + return "[D] " + super.toString(); + } + @Override public String getSaveFormat() { if (!isDone) { diff --git a/src/main/java/brave/Event.java b/src/main/java/brave/data/Event.java similarity index 86% rename from src/main/java/brave/Event.java rename to src/main/java/brave/data/Event.java index 7d32bf772..41c1fdb03 100644 --- a/src/main/java/brave/Event.java +++ b/src/main/java/brave/data/Event.java @@ -1,4 +1,4 @@ -package brave; +package brave.data; public class Event extends Task { private String eventTime; @@ -8,15 +8,15 @@ public Event(String description, String eventTime) { this.eventTime = eventTime; } - @Override - public String getStatusIcon() { - return "[E]" + super.getStatusIcon(); - } - public String getDescription() { return super.getDescription() + String.format(" (at: %s)", this.eventTime); } + @Override + public String toString() { + return "[E] " + super.toString(); + } + @Override public String getSaveFormat() { if (!isDone) { diff --git a/src/main/java/brave/Task.java b/src/main/java/brave/data/Task.java similarity index 81% rename from src/main/java/brave/Task.java rename to src/main/java/brave/data/Task.java index 268ef86eb..1152daf09 100644 --- a/src/main/java/brave/Task.java +++ b/src/main/java/brave/data/Task.java @@ -1,4 +1,4 @@ -package brave; +package brave.data; public abstract class Task { protected String description; @@ -25,5 +25,10 @@ public void unmarkAsDone() { isDone = false; } + @Override + public String toString() { + return getStatusIcon() + " " + getDescription(); + } + public abstract String getSaveFormat(); } diff --git a/src/main/java/brave/data/TaskManager.java b/src/main/java/brave/data/TaskManager.java new file mode 100644 index 000000000..2d809f974 --- /dev/null +++ b/src/main/java/brave/data/TaskManager.java @@ -0,0 +1,57 @@ +package brave.data; + +import brave.storage.Storage; +import brave.ui.Ui; + +import java.util.ArrayList; + +public class TaskManager { + public static final String LINE_SPLIT = "____________________________________________________________"; + private final ArrayList tasks; + private Ui ui; + + public TaskManager() { + tasks = new ArrayList<>(); + } + + public TaskManager(ArrayList tasks) { + this.tasks = tasks; + } + + public ArrayList getTasks() { + return tasks; + } + + public void addTask(Task task) { + tasks.add(task); + System.out.println(LINE_SPLIT); + System.out.println("Yepp, I have added task below!"); + System.out.println(task.description); + System.out.println("You currenly have " + tasks.size() + " task in the list"); + System.out.println(LINE_SPLIT); + } + + public void markTask(int taskIndex) { + Task selected_task = tasks.get(taskIndex); + selected_task.markAsDone(); + System.out.println("Nice! I've marked this task as done:"); + System.out.println(selected_task.getStatusIcon() + " " + selected_task.getDescription()); + } + + public void unmarkTask(int taskIndex) { + Task selected_task = tasks.get(taskIndex); + selected_task.unmarkAsDone(); + System.out.println("OK, I've marked this task as not done yet:"); + System.out.println(selected_task.getStatusIcon() + " " + selected_task.getDescription()); + } + + public void deleteTask(int taskIndex) { + Task selected_task = tasks.get(taskIndex); + System.out.println(LINE_SPLIT); + System.out.println("Successfully deleted task below"); + System.out.printf("%d.%s %s%n", taskIndex + 1, selected_task.getStatusIcon(), + selected_task.getDescription()); + tasks.remove(taskIndex); + System.out.println("You now have " + tasks.size() + " task remaining"); + } +} diff --git a/src/main/java/brave/Todo.java b/src/main/java/brave/data/Todo.java similarity index 77% rename from src/main/java/brave/Todo.java rename to src/main/java/brave/data/Todo.java index 853d115b6..b27a3937c 100644 --- a/src/main/java/brave/Todo.java +++ b/src/main/java/brave/data/Todo.java @@ -1,15 +1,10 @@ -package brave; +package brave.data; public class Todo extends Task { public Todo(String description) { super(description); } - @Override - public String getStatusIcon() { - return "[T]" + super.getStatusIcon(); - } - @Override public String getSaveFormat() { if (!isDone) { @@ -18,4 +13,9 @@ public String getSaveFormat() { return "T , 1 , " + description; } } + + @Override + public String toString() { + return "[T] " + super.toString(); + } } \ No newline at end of file diff --git a/src/main/java/brave/parser/Parser.java b/src/main/java/brave/parser/Parser.java new file mode 100644 index 000000000..e661aa551 --- /dev/null +++ b/src/main/java/brave/parser/Parser.java @@ -0,0 +1,101 @@ +package brave.parser; + +import brave.IllegalArgumentException; +import brave.data.Deadline; +import brave.data.Event; +import brave.data.TaskManager; +import brave.data.Todo; +import brave.storage.Storage; +import brave.ui.Ui; + +public class Parser { + + private static boolean isExit; + private Ui ui; + + public Parser(Ui ui) { + this.ui = ui; + } + + public void setExit(boolean exit) { + isExit = exit; + } + + public boolean getExit() { + return isExit; + } + + public void parse(String fullCommand, TaskManager tasks) { + String[] splitInputs = fullCommand.split(" ", 2); + String command = splitInputs[0]; //e.g. mark 2 -> take the first word as the command -> "mark" + + if (command.equals("bye")) { + Storage.encode(tasks.getTasks(), "data/brave.txt"); + setExit(true); + return; + } + + String description; + switch (command) { + case "list": + ui.printTaskList(tasks.getTasks()); + break; + case "mark": + try { + tasks.markTask(Integer.parseInt(splitInputs[1]) - 1); // 0 indexing + } catch (NumberFormatException e) { + System.out.println("Please put in integer value"); + } catch (NullPointerException | ArrayIndexOutOfBoundsException e) { + System.out.println("Please put in valid number of task"); + } + break; + case "unmark": + try { + tasks.unmarkTask(Integer.parseInt(splitInputs[1]) - 1); // 0 indexing + } catch (NumberFormatException e) { + System.out.println("Please put in integer value"); + } catch (NullPointerException | ArrayIndexOutOfBoundsException e) { + System.out.println("Please put in valid number of task"); + } + break; + case "todo": + try { + description = splitInputs[1]; + tasks.addTask(new Todo(description)); + } catch (IndexOutOfBoundsException e) { + System.out.println(" ☹ OOPS!!! The description of a todo cannot be empty."); + } + break; + case "deadline": + // To-do validate arguments~ + String[] arguments = splitInputs[1].split(" /by ", 2); + description = arguments[0]; + String by = arguments[1]; + tasks.addTask(new Deadline(description, by)); + break; + case "event": + arguments = splitInputs[1].split(" /at ", 2); + description = arguments[0]; + String eventTime = arguments[1]; + tasks.addTask(new Event(description, eventTime)); + break; + case "delete": + try { + tasks.deleteTask(Integer.parseInt(splitInputs[1]) - 1); // 0 indexing + } catch (NumberFormatException e) { + System.out.println("Please put in integer value"); + } catch (NullPointerException | ArrayIndexOutOfBoundsException e) { + System.out.println("Please put in valid number of task"); + } + break; + default: + try { + throw new IllegalArgumentException(); + } catch (IllegalArgumentException e) { + System.out.println("☹ OOPS!!! I'm sorry, but I don't know what that means :-("); + System.out.println("Available command are -> list/mark/unmark/todo/deadline/event"); + } + break; + } + } +} diff --git a/src/main/java/brave/storage/Storage.java b/src/main/java/brave/storage/Storage.java new file mode 100644 index 000000000..c4ec6947a --- /dev/null +++ b/src/main/java/brave/storage/Storage.java @@ -0,0 +1,78 @@ +package brave.storage; + +import brave.data.Deadline; +import brave.data.Event; +import brave.data.Task; +import brave.data.Todo; + +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Scanner; + +public class Storage { + private final String filePath; + + public Storage(String filePath) { + this.filePath = filePath; + } + + public ArrayList load() throws IOException { + File f = new File(filePath); // create a File for the given file path + Scanner s = new Scanner(f); // create a Scanner using the File as the source + ArrayList tasks = new ArrayList<>(); + decode(s, tasks); + return tasks; + } + + public static void decode(Scanner s, ArrayList tasks) { + int taskIndex = -1; + while (s.hasNext()) { + taskIndex++; + Task selected_task; + String[] details = s.nextLine().split(" , ", 0); + switch (details[0]) { + case "T": + tasks.add(new Todo(details[2])); + if (details[1].equals("1")) { + selected_task = tasks.get(taskIndex); + selected_task.markAsDone(); + } + break; + case "D": + tasks.add(new Deadline(details[2], details[3])); + if (details[1].equals("1")) { + selected_task = tasks.get(taskIndex); + selected_task.markAsDone(); + } + break; + case "E": + tasks.add(new Event(details[2], details[3])); + if (details[1].equals("1")) { + selected_task = tasks.get(taskIndex); + selected_task.markAsDone(); + } + break; + } + } + } + + public void save(ArrayList tasks) throws IOException { + encode(tasks, filePath); + } + + public static void encode(ArrayList tasks, String filePath) { + try { + FileWriter fw = new FileWriter(filePath); + StringBuilder toFile = new StringBuilder(); + for (Task task : tasks) { + toFile.append(task.getSaveFormat()).append("\n"); + } + fw.write(toFile.toString()); + fw.close(); + } catch (Exception e) { + System.out.println(e); + } + } +} diff --git a/src/main/java/brave/ui/Ui.java b/src/main/java/brave/ui/Ui.java new file mode 100644 index 000000000..61d346071 --- /dev/null +++ b/src/main/java/brave/ui/Ui.java @@ -0,0 +1,52 @@ +package brave.ui; + +import brave.data.Task; +import java.util.ArrayList; +import java.util.Scanner; + +public class Ui { + String input; + private final Scanner in; + public static final String LINE_SPLIT = "____________________________________________________________"; + boolean isExit; + + public Ui() { + in = new Scanner(System.in); + isExit = false; + } + + public String getUserCommand() { + input = in.nextLine(); + return input; + } + + public void showLoadingError(String message) { + System.out.println("\t Error: Failed to load data."); + System.out.println("\t " + message); + } + + public void showWelcomeMessage() { + System.out.println(LINE_SPLIT); + System.out.println("Hello I'm Brave"); + System.out.println("What can I do for you?"); + System.out.println(LINE_SPLIT); + } + + public void showFarewellMessage() { + System.out.println(LINE_SPLIT); + System.out.println("Bye, Hope to see you again soon!"); + System.out.println(LINE_SPLIT); + } + + public void printTaskList(ArrayList tasks) { + if (tasks.size() == 0) { + System.out.println("You currently have no task!"); + return; + } + System.out.println(LINE_SPLIT); + for (Task task : tasks) { + System.out.println(String.format("%d ", tasks.indexOf((task)) + 1) + task); + } + System.out.println(LINE_SPLIT); + } +} From 6e125a8d7144d046fcfbc520abdebab1b93f3c44 Mon Sep 17 00:00:00 2001 From: John Nicholas Suharjono Date: Thu, 3 Mar 2022 16:59:43 +0800 Subject: [PATCH 20/27] Add find method --- src/main/java/brave/parser/Parser.java | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/src/main/java/brave/parser/Parser.java b/src/main/java/brave/parser/Parser.java index e661aa551..9f79b695d 100644 --- a/src/main/java/brave/parser/Parser.java +++ b/src/main/java/brave/parser/Parser.java @@ -1,13 +1,14 @@ package brave.parser; import brave.IllegalArgumentException; -import brave.data.Deadline; -import brave.data.Event; -import brave.data.TaskManager; -import brave.data.Todo; +import brave.data.*; import brave.storage.Storage; import brave.ui.Ui; +import java.util.ArrayList; + +import static java.util.stream.Collectors.toList; + public class Parser { private static boolean isExit; @@ -67,7 +68,6 @@ public void parse(String fullCommand, TaskManager tasks) { } break; case "deadline": - // To-do validate arguments~ String[] arguments = splitInputs[1].split(" /by ", 2); description = arguments[0]; String by = arguments[1]; @@ -88,6 +88,18 @@ public void parse(String fullCommand, TaskManager tasks) { System.out.println("Please put in valid number of task"); } break; + case "find": + try { + String params = splitInputs[1]; + ArrayList filteredTask = (ArrayList) tasks.getTasks().stream(). + filter(task -> task.getDescription().toLowerCase(). + contains(params.toLowerCase())).collect(toList()); + + ui.printTaskList(filteredTask); + } catch (IndexOutOfBoundsException e) { + System.out.println("Brave need something to search for!!"); + } + break; default: try { throw new IllegalArgumentException(); From ed140e735c276a65be86a2964f206f9ecb535ffb Mon Sep 17 00:00:00 2001 From: John Nicholas Suharjono Date: Fri, 4 Mar 2022 00:47:46 +0800 Subject: [PATCH 21/27] Added JavaDoc Implement PathOf to get Directory Path --- src/main/java/brave/Brave.java | 26 ++++++++--- src/main/java/brave/data/Deadline.java | 14 +++++- src/main/java/brave/data/Event.java | 12 ++++- src/main/java/brave/data/Task.java | 12 +++++ src/main/java/brave/data/TaskManager.java | 54 +++++++++++++++-------- src/main/java/brave/data/Todo.java | 11 ++++- src/main/java/brave/parser/Parser.java | 23 +++++++--- src/main/java/brave/storage/Storage.java | 39 +++++++++++++--- src/main/java/brave/ui/Ui.java | 34 ++++++++++++-- 9 files changed, 184 insertions(+), 41 deletions(-) diff --git a/src/main/java/brave/Brave.java b/src/main/java/brave/Brave.java index 885fa2d2d..d4bb2b78e 100644 --- a/src/main/java/brave/Brave.java +++ b/src/main/java/brave/Brave.java @@ -7,15 +7,27 @@ import java.io.IOException; import java.lang.String; +import java.nio.file.Path; + +/** + * Entry point for Brave-Bot Task Helper + * Initialize the UI, TaskManager, and Storage component. + */ public class Brave { private final Ui ui; private TaskManager tasks; + private final Storage storage; + /** + * Initialize the UI, loading the file data from storage + * + * @param filePath filepath for the program to read from + */ public Brave(String filePath) { ui = new Ui(); - Storage storage = new Storage(filePath); + storage = new Storage(filePath); try { tasks = new TaskManager(storage.load()); } catch (IOException e) { @@ -24,14 +36,17 @@ public Brave(String filePath) { } } + /** + * Read the user input command, + * and keep iterating until stop condition is reached + */ public void run() { ui.showWelcomeMessage(); - boolean isExit; - isExit = false; + boolean isExit = false; while (!isExit) { String fullCommand = ui.getUserCommand(); - Parser p = new Parser(ui); + Parser p = new Parser(ui, storage); p.parse(fullCommand, tasks); isExit = p.getExit(); } @@ -40,6 +55,7 @@ public void run() { } public static void main(String[] args) { - new Brave("data/brave.txt").run(); + String DIR_PATH = String.valueOf(Path.of(System.getProperty("user.dir"), "data")); + new Brave(DIR_PATH + "/brave.txt").run(); } } diff --git a/src/main/java/brave/data/Deadline.java b/src/main/java/brave/data/Deadline.java index c64534679..75d555cf5 100644 --- a/src/main/java/brave/data/Deadline.java +++ b/src/main/java/brave/data/Deadline.java @@ -1,8 +1,16 @@ package brave.data; +/** + * Inherit from Task class, with additional "by" as the deadline + */ public class Deadline extends Task { private String by; + /** + * Class constructor + * @param description description for the given task + * @param by indicating the deadline of given task + */ public Deadline(String description, String by) { super(description); this.by = by; @@ -12,9 +20,13 @@ public String getDescription() { return super.getDescription() + String.format(" (by: %s)", this.by); } + /** + * Override print method + * @return String that is correctly formatted + */ @Override public String toString() { - return "[D] " + super.toString(); + return "[D]" + super.toString(); } @Override diff --git a/src/main/java/brave/data/Event.java b/src/main/java/brave/data/Event.java index 41c1fdb03..90e8c1b8b 100644 --- a/src/main/java/brave/data/Event.java +++ b/src/main/java/brave/data/Event.java @@ -1,8 +1,18 @@ package brave.data; +/** + * Inherit from the Task class + * Represent an event task with description and the happening date and time of it. + */ public class Event extends Task { private String eventTime; + /** + * Class constructor. + * + * @param description description of the event task + * @param eventTime happening date and time of the event task + */ public Event(String description, String eventTime) { super(description); this.eventTime = eventTime; @@ -14,7 +24,7 @@ public String getDescription() { @Override public String toString() { - return "[E] " + super.toString(); + return "[E]" + super.toString(); } @Override diff --git a/src/main/java/brave/data/Task.java b/src/main/java/brave/data/Task.java index 1152daf09..51746212d 100644 --- a/src/main/java/brave/data/Task.java +++ b/src/main/java/brave/data/Task.java @@ -1,14 +1,26 @@ package brave.data; +/** + * Abstract class that act as the parent for Todo, Deadline, and Event. + */ public abstract class Task { protected String description; protected boolean isDone; + /** + * Class Constructor + * @param description description for the given task + */ public Task(String description) { this.description = description; this.isDone = false; } + /** + * Get the status of the given task. + * + * @return "X" if the task is completed. + */ public String getStatusIcon() { return (isDone ? "[X]" : "[ ]"); // mark done task with X } diff --git a/src/main/java/brave/data/TaskManager.java b/src/main/java/brave/data/TaskManager.java index 2d809f974..69666f4da 100644 --- a/src/main/java/brave/data/TaskManager.java +++ b/src/main/java/brave/data/TaskManager.java @@ -1,19 +1,25 @@ package brave.data; -import brave.storage.Storage; import brave.ui.Ui; import java.util.ArrayList; +/** + * This class is used to manage the entire list of task + */ public class TaskManager { - public static final String LINE_SPLIT = "____________________________________________________________"; private final ArrayList tasks; - private Ui ui; + private Ui ui = new Ui(); + /** + * Class Constructor, initialise an empty array list if no file found + */ public TaskManager() { tasks = new ArrayList<>(); } - + /** + * Class Constructor, initialise an array of list from the file + */ public TaskManager(ArrayList tasks) { this.tasks = tasks; } @@ -22,36 +28,46 @@ public ArrayList getTasks() { return tasks; } + /** + * Add a new task to the task list. + * + * @param task the new task + */ public void addTask(Task task) { tasks.add(task); - System.out.println(LINE_SPLIT); - System.out.println("Yepp, I have added task below!"); - System.out.println(task.description); - System.out.println("You currenly have " + tasks.size() + " task in the list"); - System.out.println(LINE_SPLIT); + ui.showAddTaskMessage(task, tasks.size()); } + /** + * Mark the task as finished + * + * @param taskIndex index of the task + */ public void markTask(int taskIndex) { Task selected_task = tasks.get(taskIndex); selected_task.markAsDone(); - System.out.println("Nice! I've marked this task as done:"); - System.out.println(selected_task.getStatusIcon() + " " + selected_task.getDescription()); + ui.showMarkTaskMessage(selected_task); } + /** + * Mark the task as unfinished + * + * @param taskIndex index of the task + */ public void unmarkTask(int taskIndex) { Task selected_task = tasks.get(taskIndex); selected_task.unmarkAsDone(); - System.out.println("OK, I've marked this task as not done yet:"); - System.out.println(selected_task.getStatusIcon() + " " + selected_task.getDescription()); + ui.showUnmarkTaskMessage(selected_task); } - public void deleteTask(int taskIndex) { + /** + * Delete the task with a specific index. + * + * @param taskIndex the index of the task to be deleted + */ + public void deleteTask(int taskIndex) { Task selected_task = tasks.get(taskIndex); - System.out.println(LINE_SPLIT); - System.out.println("Successfully deleted task below"); - System.out.printf("%d.%s %s%n", taskIndex + 1, selected_task.getStatusIcon(), - selected_task.getDescription()); + ui.showDeleteTaskMessage(selected_task, tasks.size()); tasks.remove(taskIndex); - System.out.println("You now have " + tasks.size() + " task remaining"); } } diff --git a/src/main/java/brave/data/Todo.java b/src/main/java/brave/data/Todo.java index b27a3937c..62d64cdf2 100644 --- a/src/main/java/brave/data/Todo.java +++ b/src/main/java/brave/data/Todo.java @@ -1,6 +1,15 @@ package brave.data; +/** + * Inherit from Task class + * Represent the type of task To-Do that only have description + */ public class Todo extends Task { + /** + * Class constructor specifying whether the task is done. + * + * @param description description of the todo task + */ public Todo(String description) { super(description); } @@ -16,6 +25,6 @@ public String getSaveFormat() { @Override public String toString() { - return "[T] " + super.toString(); + return "[T]" + super.toString(); } } \ No newline at end of file diff --git a/src/main/java/brave/parser/Parser.java b/src/main/java/brave/parser/Parser.java index 9f79b695d..2e32d1e49 100644 --- a/src/main/java/brave/parser/Parser.java +++ b/src/main/java/brave/parser/Parser.java @@ -9,13 +9,19 @@ import static java.util.stream.Collectors.toList; +/** + * Parses user input + * After parsing execute the given input + */ public class Parser { private static boolean isExit; - private Ui ui; + private final Ui ui; + private final Storage storage; - public Parser(Ui ui) { + public Parser(Ui ui, Storage storage) { this.ui = ui; + this.storage = storage; } public void setExit(boolean exit) { @@ -26,12 +32,19 @@ public boolean getExit() { return isExit; } + /** + * Parses user input into a command for execution + * + * @param fullCommand the full user input command + * @param tasks the TaskManager object containing all the tasks and action + * @throws IllegalArgumentException If the command is not recognized + */ public void parse(String fullCommand, TaskManager tasks) { String[] splitInputs = fullCommand.split(" ", 2); String command = splitInputs[0]; //e.g. mark 2 -> take the first word as the command -> "mark" if (command.equals("bye")) { - Storage.encode(tasks.getTasks(), "data/brave.txt"); + storage.save(tasks.getTasks()); setExit(true); return; } @@ -91,9 +104,7 @@ public void parse(String fullCommand, TaskManager tasks) { case "find": try { String params = splitInputs[1]; - ArrayList filteredTask = (ArrayList) tasks.getTasks().stream(). - filter(task -> task.getDescription().toLowerCase(). - contains(params.toLowerCase())).collect(toList()); + ArrayList filteredTask = (ArrayList) tasks.getTasks().stream().filter(task -> task.getDescription().toLowerCase().contains(params.toLowerCase())).collect(toList()); ui.printTaskList(filteredTask); } catch (IndexOutOfBoundsException e) { diff --git a/src/main/java/brave/storage/Storage.java b/src/main/java/brave/storage/Storage.java index c4ec6947a..326e1d191 100644 --- a/src/main/java/brave/storage/Storage.java +++ b/src/main/java/brave/storage/Storage.java @@ -8,16 +8,28 @@ import java.io.File; import java.io.FileWriter; import java.io.IOException; +import java.nio.file.Path; import java.util.ArrayList; import java.util.Scanner; +/** + * This class is used to manage all things related to File Management + * Loading and saving the file, decoding and encoding the file format + */ + public class Storage { - private final String filePath; + private String filePath; public Storage(String filePath) { this.filePath = filePath; } + /** + * When the program start, load the file from the storage + * + * @return the list of task read from file + * @throws IOException If an output exception occurs + */ public ArrayList load() throws IOException { File f = new File(filePath); // create a File for the given file path Scanner s = new Scanner(f); // create a Scanner using the File as the source @@ -26,7 +38,13 @@ public ArrayList load() throws IOException { return tasks; } - public static void decode(Scanner s, ArrayList tasks) { + /** + * Decodes the strings loaded from storage file into a list of tasks. + * + * @param s scanner use to read the file + * @param tasks the data loaded from storage file as a list of strings + */ + private static void decode(Scanner s, ArrayList tasks) { int taskIndex = -1; while (s.hasNext()) { taskIndex++; @@ -58,11 +76,22 @@ public static void decode(Scanner s, ArrayList tasks) { } } - public void save(ArrayList tasks) throws IOException { + /** + * Save the list by writing on filepath that we provide + * + * @param tasks list of task that will be written to the file + */ + public void save(ArrayList tasks) { encode(tasks, filePath); } - public static void encode(ArrayList tasks, String filePath) { + /** + * Encodes the list of tasks into a list of strings to be stored in storage file. + * + * @param tasks the list of tasks to be stored + * @param filePath filepath destination + */ + private void encode(ArrayList tasks, String filePath) { try { FileWriter fw = new FileWriter(filePath); StringBuilder toFile = new StringBuilder(); @@ -72,7 +101,7 @@ public static void encode(ArrayList tasks, String filePath) { fw.write(toFile.toString()); fw.close(); } catch (Exception e) { - System.out.println(e); + System.out.println(e.getMessage()); } } } diff --git a/src/main/java/brave/ui/Ui.java b/src/main/java/brave/ui/Ui.java index 61d346071..817a7ce47 100644 --- a/src/main/java/brave/ui/Ui.java +++ b/src/main/java/brave/ui/Ui.java @@ -4,15 +4,17 @@ import java.util.ArrayList; import java.util.Scanner; +/** + * Handles the UI of the application + * Handles interaction with the user + */ public class Ui { String input; private final Scanner in; - public static final String LINE_SPLIT = "____________________________________________________________"; - boolean isExit; + public static final String LINE_SPLIT = "_______________________________________________________"; public Ui() { in = new Scanner(System.in); - isExit = false; } public String getUserCommand() { @@ -49,4 +51,30 @@ public void printTaskList(ArrayList tasks) { } System.out.println(LINE_SPLIT); } + + public void showAddTaskMessage(Task task, int size) { + System.out.println(LINE_SPLIT); + System.out.println("GOTT IT!!, I have added task below!"); + System.out.println(task); + System.out.println("You currently have " + size + " task in the list"); + System.out.println(LINE_SPLIT); + } + + public void showDeleteTaskMessage(Task task, int size) { + System.out.println(LINE_SPLIT); + System.out.println("I managed to delete task below!"); + System.out.println(task); + System.out.println("You now have " + (size-1) + " task remaining"); + System.out.println(LINE_SPLIT); + } + + public void showMarkTaskMessage(Task task) { + System.out.println("Nice! I've marked this task as done:"); + System.out.println(task); + } + + public void showUnmarkTaskMessage(Task task) { + System.out.println("OK, I've marked this task as not done yet:"); + System.out.println(task); + } } From 46a7af1526fb33f1e0aaeffa0f6d553485135faa Mon Sep 17 00:00:00 2001 From: John Nicholas Suharjono Date: Fri, 4 Mar 2022 03:43:36 +0800 Subject: [PATCH 22/27] Add User Guide --- README.md | 12 +- docs/README.md | 192 ++++++++++++++++++++-- src/main/java/brave/Brave.java | 4 +- src/main/java/brave/data/TaskManager.java | 2 +- src/main/java/brave/storage/Storage.java | 1 - src/main/java/brave/ui/Ui.java | 11 +- 6 files changed, 197 insertions(+), 25 deletions(-) diff --git a/README.md b/README.md index 8715d4d91..17c785dbf 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Duke project template +# Brave 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. @@ -16,9 +16,9 @@ Prerequisites: JDK 11, update Intellij to the most recent version. 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 - ____ _ - | _ \ _ _| | _____ - | | | | | | | |/ / _ \ - | |_| | |_| | < __/ - |____/ \__,_|_|\_\___| + ____ _ + | __ ) _ __ __ ___ _____ | | + | _ \| '__/ _` \ \ / / _ \ | | + | |_) | | | (_| |\ V / __/ |_| + |____/|_| \__,_| \_/ \___| (_) ``` diff --git a/docs/README.md b/docs/README.md index 8077118eb..8c1160ade 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,29 +1,197 @@ # User Guide +Brave is a **Command Line Interface (CLI) application** for you to manage your daily task +Todo - Event - Deadline + +- [Quick Start](#quick-start) +- [Features](#features) + - [Adding a Todo: `todo`](#adding-a-todo-todo) + - [Adding a Deadline: `deadline`](#adding-a-deadline-deadline) + - [Adding an Event: `event`](#adding-an-event-event) + - [Listing all tasks: `list`](#listing-out-all-tasks-list) + - [Marking a task as done: `mark`](#marking-a-task-as-completed-mark) + - [Marking a task as incomplete : `unmark`](#marking-a-task-as-incomplete-unmark) + - [Deleting a task: `delete`](#deleting-a-task-delete) + - [Searching for tasks: `find`](#searching-for-tasks-find) + - [Exiting the program: `bye`](#exiting-the-program-bye) + +## Quick Start +1. Prerequisites: JDK 11, update Intellij to the most recent version. +2. Download the latest copy of `Brave.jar` from the [Releases](https://github.com/johnsuharjono/ip/releases) page. +3. Open your Command Prompt (Windows) or Terminal (Mac/Linux), and navigate to the folder you created. +4. Run the command `java -jar Brave.jar` + ## Features -### Feature-ABC +### Adding a Todo: `todo` + +Create a To-Do type task + +**Format:** `todo ` + +**Example Input:** +``` +todo learn web development +``` + +**Example Output:** +``` +---------------------------------------------- +GOTT IT!! I have added task below! +[T][ ] learn web development +You currently have (n) task in the list +---------------------------------------------- +``` + +### Adding a Deadline: `deadline` + +Create a Deadline type task + +**Format:** `deadline /by