From 23ee579f94b1d64b1c2d6ecf3747e9f6c47b4c88 Mon Sep 17 00:00:00 2001 From: Anderson Date: Wed, 25 Aug 2021 14:15:16 +0800 Subject: [PATCH 01/38] Add hello and bye message (level-0) --- src/main/java/Duke.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 5d313334c..4d05bce87 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -4,7 +4,13 @@ public static void main(String[] args) { + "| _ \\ _ _| | _____ \n" + "| | | | | | | |/ / _ \\\n" + "| |_| | |_| | < __/\n" - + "|____/ \\__,_|_|\\_\\___|\n"; + + "|____/ \\__,_|_|\\_\\___|\n" + + "____________________________________________________________\n" + + "Hello! I'm Duke\n" + + "What can I do for you?\n" + + "____________________________________________________________\n" + + "Bye. Hope to you again soon!\n" + + "____________________________________________________________\n"; System.out.println("Hello from\n" + logo); } } From 0cde5bb1665650aea2088ae72940a24e66b06618 Mon Sep 17 00:00:00 2001 From: Anderson Date: Wed, 25 Aug 2021 16:38:23 +0800 Subject: [PATCH 02/38] Level-1 commit: Added Greet, Echo, and Exit --- src/main/java/Duke.java | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 4d05bce87..c2b828b22 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -1,16 +1,33 @@ +import java.util.Scanner; + public class Duke { + public static void main(String[] args) { String logo = " ____ _ \n" + "| _ \\ _ _| | _____ \n" + "| | | | | | | |/ / _ \\\n" + "| |_| | |_| | < __/\n" - + "|____/ \\__,_|_|\\_\\___|\n" - + "____________________________________________________________\n" - + "Hello! I'm Duke\n" + + "|____/ \\__,_|_|\\_\\___|\n"; + String line = "\t____________________________________________________________\n\t"; + String greeting = line + + "Hello! I'm Duke\n\t" + "What can I do for you?\n" - + "____________________________________________________________\n" + + line; + String bye = line + "Bye. Hope to you again soon!\n" - + "____________________________________________________________\n"; - System.out.println("Hello from\n" + logo); + + line; + + String command; + Scanner in = new Scanner(System.in); + + System.out.println("\tHello from\n" + logo); + System.out.println(greeting); + command = in.nextLine(); + while (!command.equals("bye")) { + System.out.println(line + command + "\n" + line); + command = in.nextLine(); + } + + System.out.println(bye); } } From 7783a22b17d948f6e08b89226356f7c3b54043ed Mon Sep 17 00:00:00 2001 From: Anderson Date: Wed, 25 Aug 2021 20:26:39 +0800 Subject: [PATCH 03/38] Level-2 Added List command --- src/main/java/Duke.java | 42 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index c2b828b22..0ff762452 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -1,7 +1,20 @@ import java.util.Scanner; +import java.util.Arrays; public class Duke { + public static String[] FilterNulls(String[] toDos) { + String[] isFilteredNull = new String[100]; + int count = 0; + for (int i = 0; i < 100; i++) { + if (toDos[i] != null) { + isFilteredNull[count] = toDos[i]; + count++; + } + } + return Arrays.copyOf(isFilteredNull, count); + } + public static void main(String[] args) { String logo = " ____ _ \n" + "| _ \\ _ _| | _____ \n" @@ -20,12 +33,37 @@ public static void main(String[] args) { String command; Scanner in = new Scanner(System.in); + String[] unfilteredToDos = new String[100]; + int unfilteredCounter = 0; + System.out.println("\tHello from\n" + logo); System.out.println(greeting); command = in.nextLine(); while (!command.equals("bye")) { - System.out.println(line + command + "\n" + line); - command = in.nextLine(); + if (command.equals("\n")){ + command = in.nextLine(); + } + else if (!command.equals("list")) { + System.out.println(line + "added: " + command + "\n" + line); + unfilteredToDos[unfilteredCounter] = command; + unfilteredCounter++; + command = in.nextLine(); + } else if (command.equals("list")) { + String[] filteredNull = FilterNulls(unfilteredToDos); + int count = 0; + if (filteredNull[0] == null) { + System.out.println(line + "\tAll DONE!\n" + line); + command = in.nextLine(); + } else { + System.out.println(line); + for (String ToDo : filteredNull) { + count++; + System.out.println(count + "." + ToDo); + } + System.out.println(line); + command = in.nextLine(); + } + } } System.out.println(bye); From 6f7343a5cced05e33df3c0746d18e870c82e85ad Mon Sep 17 00:00:00 2001 From: Anderson Date: Wed, 25 Aug 2021 21:48:56 +0800 Subject: [PATCH 04/38] Added class ToDo, Added markAsDone to indicate in list and done command --- src/main/java/Duke.java | 31 ++++++++++++++++++++----------- src/main/java/ToDo.java | 22 ++++++++++++++++++++++ 2 files changed, 42 insertions(+), 11 deletions(-) create mode 100644 src/main/java/ToDo.java diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 0ff762452..f0f325fbb 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -3,8 +3,8 @@ public class Duke { - public static String[] FilterNulls(String[] toDos) { - String[] isFilteredNull = new String[100]; + public static ToDo[] FilterNulls(ToDo[] toDos) { + ToDo[] isFilteredNull = new ToDo[100]; int count = 0; for (int i = 0; i < 100; i++) { if (toDos[i] != null) { @@ -33,32 +33,41 @@ public static void main(String[] args) { String command; Scanner in = new Scanner(System.in); - String[] unfilteredToDos = new String[100]; + ToDo[] unfilteredToDos = new ToDo[100]; int unfilteredCounter = 0; System.out.println("\tHello from\n" + logo); System.out.println(greeting); command = in.nextLine(); + while (!command.equals("bye")) { - if (command.equals("\n")){ + if (command.equals("\n")) { + System.out.println(line); command = in.nextLine(); - } - else if (!command.equals("list")) { + } else if (command.contains("done")) { + System.out.println(line + "Nice! I've marked this task as done:"); + String[] removeWords = command.split(" "); + int toDoNumber = Integer.parseInt(removeWords[1]); + ToDo completedToDo = unfilteredToDos[(toDoNumber - 1)]; + completedToDo.markAsDone(); + System.out.println("\t\t" + completedToDo.getStatusIcon() + completedToDo.getTask() + "\n" + line); + command = in.nextLine(); + } else if (!command.equals("list")) { System.out.println(line + "added: " + command + "\n" + line); - unfilteredToDos[unfilteredCounter] = command; + unfilteredToDos[unfilteredCounter] = new ToDo(command); unfilteredCounter++; command = in.nextLine(); } else if (command.equals("list")) { - String[] filteredNull = FilterNulls(unfilteredToDos); + ToDo[] filteredNull = FilterNulls(unfilteredToDos); int count = 0; if (filteredNull[0] == null) { System.out.println(line + "\tAll DONE!\n" + line); command = in.nextLine(); } else { - System.out.println(line); - for (String ToDo : filteredNull) { + System.out.println(line + "Here are the tasks in your list:\n"); + for (ToDo toDo : filteredNull) { count++; - System.out.println(count + "." + ToDo); + System.out.println(count + "." + toDo.getStatusIcon() + toDo.getTask()); } System.out.println(line); command = in.nextLine(); diff --git a/src/main/java/ToDo.java b/src/main/java/ToDo.java new file mode 100644 index 000000000..52385b05a --- /dev/null +++ b/src/main/java/ToDo.java @@ -0,0 +1,22 @@ +public class ToDo { + protected String task; + protected boolean isDone; + + public ToDo(String task){ + this.task = task; + this.isDone = false; + } + + public String getStatusIcon() { + return(isDone ? "[X] " : "[ ] "); + } + + public String getTask(){ + return this.task; + } + + public void markAsDone(){ + this.isDone = true; + } + +} \ No newline at end of file From 9bd0f12e0abb6762ab3b15f02daa673e5a290c66 Mon Sep 17 00:00:00 2001 From: Anderson Date: Wed, 25 Aug 2021 21:55:44 +0800 Subject: [PATCH 05/38] fixed indentation --- src/main/java/Duke.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index f0f325fbb..a47e49d8e 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -23,11 +23,11 @@ public static void main(String[] args) { + "|____/ \\__,_|_|\\_\\___|\n"; String line = "\t____________________________________________________________\n\t"; String greeting = line - + "Hello! I'm Duke\n\t" - + "What can I do for you?\n" + + "Hello! I'm Anderson\n\t" + + "What do you need to do?\n" + line; String bye = line - + "Bye. Hope to you again soon!\n" + + "Bye. try not to procrastinate!\n" + line; String command; @@ -67,7 +67,7 @@ public static void main(String[] args) { System.out.println(line + "Here are the tasks in your list:\n"); for (ToDo toDo : filteredNull) { count++; - System.out.println(count + "." + toDo.getStatusIcon() + toDo.getTask()); + System.out.println("\t" + count + "." + toDo.getStatusIcon() + toDo.getTask()); } System.out.println(line); command = in.nextLine(); From 74a56b1b29bbcb6c19afbed252e7d2e2e47a909d Mon Sep 17 00:00:00 2001 From: Anderson Date: Wed, 25 Aug 2021 22:13:48 +0800 Subject: [PATCH 06/38] fixed Coding Standards --- src/main/java/Duke.java | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index a47e49d8e..7840b81a2 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -16,19 +16,19 @@ public static ToDo[] FilterNulls(ToDo[] toDos) { } public static void main(String[] args) { - String logo = " ____ _ \n" + String LOGO = " ____ _ \n" + "| _ \\ _ _| | _____ \n" + "| | | | | | | |/ / _ \\\n" + "| |_| | |_| | < __/\n" + "|____/ \\__,_|_|\\_\\___|\n"; - String line = "\t____________________________________________________________\n\t"; - String greeting = line + String LINE = "\t____________________________________________________________\n\t"; + String greeting = LINE + "Hello! I'm Anderson\n\t" + "What do you need to do?\n" - + line; - String bye = line + + LINE; + String BYE = LINE + "Bye. try not to procrastinate!\n" - + line; + + LINE; String command; Scanner in = new Scanner(System.in); @@ -36,24 +36,24 @@ public static void main(String[] args) { ToDo[] unfilteredToDos = new ToDo[100]; int unfilteredCounter = 0; - System.out.println("\tHello from\n" + logo); + System.out.println("\tHello from\n" + LOGO); System.out.println(greeting); command = in.nextLine(); while (!command.equals("bye")) { if (command.equals("\n")) { - System.out.println(line); + System.out.println(LINE); command = in.nextLine(); } else if (command.contains("done")) { - System.out.println(line + "Nice! I've marked this task as done:"); + System.out.println(LINE + "Nice! I've marked this task as done:"); String[] removeWords = command.split(" "); int toDoNumber = Integer.parseInt(removeWords[1]); ToDo completedToDo = unfilteredToDos[(toDoNumber - 1)]; completedToDo.markAsDone(); - System.out.println("\t\t" + completedToDo.getStatusIcon() + completedToDo.getTask() + "\n" + line); + System.out.println("\t\t" + completedToDo.getStatusIcon() + completedToDo.getTask() + "\n" + LINE); command = in.nextLine(); } else if (!command.equals("list")) { - System.out.println(line + "added: " + command + "\n" + line); + System.out.println(LINE + "added: " + command + "\n" + LINE); unfilteredToDos[unfilteredCounter] = new ToDo(command); unfilteredCounter++; command = in.nextLine(); @@ -61,20 +61,20 @@ public static void main(String[] args) { ToDo[] filteredNull = FilterNulls(unfilteredToDos); int count = 0; if (filteredNull[0] == null) { - System.out.println(line + "\tAll DONE!\n" + line); + System.out.println(LINE + "\tAll DONE!\n" + LINE); command = in.nextLine(); } else { - System.out.println(line + "Here are the tasks in your list:\n"); + System.out.println(LINE + "Here are the tasks in your list:\n"); for (ToDo toDo : filteredNull) { count++; System.out.println("\t" + count + "." + toDo.getStatusIcon() + toDo.getTask()); } - System.out.println(line); + System.out.println(LINE); command = in.nextLine(); } } } - System.out.println(bye); + System.out.println(BYE); } } From f59d5c0502b08b9b3cab5f193deaeb8f060afcf5 Mon Sep 17 00:00:00 2001 From: Anderson Date: Wed, 1 Sep 2021 04:25:54 +0800 Subject: [PATCH 07/38] ToDos, Events, Deadline Class added --- src/main/java/Deadline.java | 13 ++++ src/main/java/Duke.java | 147 +++++++++++++++++++++++++----------- src/main/java/Event.java | 13 ++++ src/main/java/Task.java | 26 +++++++ src/main/java/ToDo.java | 23 ++---- 5 files changed, 159 insertions(+), 63 deletions(-) create mode 100644 src/main/java/Deadline.java create mode 100644 src/main/java/Event.java create mode 100644 src/main/java/Task.java diff --git a/src/main/java/Deadline.java b/src/main/java/Deadline.java new file mode 100644 index 000000000..b32a0b57c --- /dev/null +++ b/src/main/java/Deadline.java @@ -0,0 +1,13 @@ +public class Deadline extends Task{ + + protected String by; + + public Deadline(String description, String by){ + super (description); + this.by = by; + } + + public String toString() { + return "[D]" + super.toString() + " (by: " + by + ")"; + } +} \ No newline at end of file diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 7840b81a2..0204e74a6 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -3,78 +3,133 @@ public class Duke { - public static ToDo[] FilterNulls(ToDo[] toDos) { - ToDo[] isFilteredNull = new ToDo[100]; + public static final String LOGO = " ____ _ \n" + + "| _ \\ _ _| | _____ \n" + + "| | | | | | | |/ / _ \\\n" + + "| |_| | |_| | < __/\n" + + "|____/ \\__,_|_|\\_\\___|\n"; + public static final String LINE = "\t____________________________________________________________\n\t"; + public static final String BYE = LINE + + "Bye. try not to procrastinate!\n" + + LINE; + public static final String GREETING = LINE + + "Hello! I'm Anderson\n\t" + + "What do you need to do?\n" + + LINE; + + public static Task[] FilterNulls(Task[] tasks) { + Task[] isFilteredNull = new Task[100]; int count = 0; for (int i = 0; i < 100; i++) { - if (toDos[i] != null) { - isFilteredNull[count] = toDos[i]; + if (tasks[i] != null) { + isFilteredNull[count] = tasks[i]; count++; } } return Arrays.copyOf(isFilteredNull, count); } + public static String GetCommand(String userInput) { + if (userInput.equals("\n")){ + return "again"; + } + if (userInput.length() > 2){ + String[] isolateCommand = userInput.split(" "); + return isolateCommand[0]; + } + return userInput; + } + + public static String GetItem(String userInput) { + String item = ""; + if (GetCommand(userInput).equals("Deadline")){ + item = userInput.substring(userInput.indexOf(" ")+1, userInput.indexOf("/")); + } else if (GetCommand(userInput).equals("Event")){ + item = userInput.substring(userInput.indexOf(" ")+1, userInput.indexOf("/")); + } else if (userInput.length() > 3){ + item = userInput.substring(userInput.indexOf(" ")+1); + } + return item; + } + + public static String GetTime(String userInput){ + String time = ""; + if (GetCommand(userInput).equals("Deadline")){ + time = userInput.substring(userInput.indexOf("/")+3); + } else if (GetCommand(userInput).equals("Event")){ + time = userInput.substring(userInput.indexOf("/")+3); + } else { + return ""; + } + return time; + } + public static void main(String[] args) { - String LOGO = " ____ _ \n" - + "| _ \\ _ _| | _____ \n" - + "| | | | | | | |/ / _ \\\n" - + "| |_| | |_| | < __/\n" - + "|____/ \\__,_|_|\\_\\___|\n"; - String LINE = "\t____________________________________________________________\n\t"; - String greeting = LINE - + "Hello! I'm Anderson\n\t" - + "What do you need to do?\n" - + LINE; - String BYE = LINE - + "Bye. try not to procrastinate!\n" - + LINE; - String command; - Scanner in = new Scanner(System.in); - ToDo[] unfilteredToDos = new ToDo[100]; + + Task[] unfilteredTasks = new Task[100]; int unfilteredCounter = 0; System.out.println("\tHello from\n" + LOGO); - System.out.println(greeting); - command = in.nextLine(); + System.out.println(GREETING); + + String userInput; + Scanner in = new Scanner(System.in); + userInput = in.nextLine(); + boolean closeDuke = false; - while (!command.equals("bye")) { - if (command.equals("\n")) { - System.out.println(LINE); - command = in.nextLine(); - } else if (command.contains("done")) { + while (!closeDuke) { + String command = GetCommand(userInput); + if (command.equals("done")){ System.out.println(LINE + "Nice! I've marked this task as done:"); - String[] removeWords = command.split(" "); - int toDoNumber = Integer.parseInt(removeWords[1]); - ToDo completedToDo = unfilteredToDos[(toDoNumber - 1)]; - completedToDo.markAsDone(); - System.out.println("\t\t" + completedToDo.getStatusIcon() + completedToDo.getTask() + "\n" + LINE); - command = in.nextLine(); - } else if (!command.equals("list")) { - System.out.println(LINE + "added: " + command + "\n" + LINE); - unfilteredToDos[unfilteredCounter] = new ToDo(command); - unfilteredCounter++; - command = in.nextLine(); - } else if (command.equals("list")) { - ToDo[] filteredNull = FilterNulls(unfilteredToDos); + int taskNumber = Integer.parseInt(GetItem(userInput)); + Task completedTask = unfilteredTasks[(taskNumber - 1)]; + completedTask.markAsDone(); + System.out.println("\t\t" + completedTask + "\n" + LINE); + userInput = in.nextLine(); + } else if (userInput.equals("list")) { + Task[] filteredNull = FilterNulls(unfilteredTasks); int count = 0; if (filteredNull[0] == null) { System.out.println(LINE + "\tAll DONE!\n" + LINE); - command = in.nextLine(); + userInput = in.nextLine(); } else { System.out.println(LINE + "Here are the tasks in your list:\n"); - for (ToDo toDo : filteredNull) { + for (Task task : filteredNull) { count++; - System.out.println("\t" + count + "." + toDo.getStatusIcon() + toDo.getTask()); + System.out.println("\t" + count + "." + task); } System.out.println(LINE); - command = in.nextLine(); + userInput = in.nextLine(); } + + } else if (command.equals("ToDo")){ + unfilteredTasks[unfilteredCounter] = new ToDo(GetItem(userInput)); + System.out.println(LINE + "Got it. I've added this task:\t"); + System.out.println(String.format("\t%d.",unfilteredCounter+1) + unfilteredTasks[unfilteredCounter] + "\n" + String.format("\tNow you have %d tasks in the list.\n", unfilteredCounter+1) + LINE); + unfilteredCounter++; + userInput = in.nextLine(); + } else if (command.equals("Deadline")){ + unfilteredTasks[unfilteredCounter] = new Deadline(GetItem(userInput), GetTime(userInput)); + System.out.println(LINE + "Got it. I've added this task:\t"); + System.out.println(String.format("\t%d.",unfilteredCounter+1) + unfilteredTasks[unfilteredCounter] + "\n" + String.format("\tNow you have %d tasks in the list.\n", unfilteredCounter+1) + LINE); + unfilteredCounter++; + userInput = in.nextLine(); + } else if (command.equals("Event")){ + unfilteredTasks[unfilteredCounter] = new Event(GetItem(userInput), GetTime(userInput)); + System.out.println(LINE + "Got it. I've added this task:\t"); + System.out.println(String.format("\t%d.",unfilteredCounter+1) + unfilteredTasks[unfilteredCounter] + "\n" + String.format("\tNow you have %d tasks in the list.\n", unfilteredCounter+1) + LINE); + unfilteredCounter++; + userInput = in.nextLine(); + + } else if (command.toLowerCase().equals("bye")) { + System.out.println(BYE); + closeDuke = true; + } else { + System.out.println(LINE + "\tInvalid input, Please Try Again :)\n" + LINE); + userInput = in.nextLine(); } } - - System.out.println(BYE); } } diff --git a/src/main/java/Event.java b/src/main/java/Event.java new file mode 100644 index 000000000..0066b788a --- /dev/null +++ b/src/main/java/Event.java @@ -0,0 +1,13 @@ +public class Event extends Task { + + protected String at; + + public Event(String description, String at){ + super (description); + this.at = at; + } + + public String toString() { + return "[E]" + super.toString() + " (at: " + at + ")"; + } +} \ No newline at end of file diff --git a/src/main/java/Task.java b/src/main/java/Task.java new file mode 100644 index 000000000..c253fd031 --- /dev/null +++ b/src/main/java/Task.java @@ -0,0 +1,26 @@ +public class Task { + protected String task; + protected boolean isDone; + + public Task(String task){ + this.task = task; + this.isDone = false; + } + + public String getStatusIcon() { + return(isDone ? "[X] " : "[ ] "); + } + + public String getTask(){ + return this.task; + } + + public void markAsDone(){ + this.isDone = true; + } + + public String toString(){ + return this.getStatusIcon() + this.task; + } + +} \ No newline at end of file diff --git a/src/main/java/ToDo.java b/src/main/java/ToDo.java index 52385b05a..fd9719d79 100644 --- a/src/main/java/ToDo.java +++ b/src/main/java/ToDo.java @@ -1,22 +1,11 @@ -public class ToDo { - protected String task; - protected boolean isDone; +public class ToDo extends Task { - public ToDo(String task){ - this.task = task; - this.isDone = false; + public ToDo(String description){ + super (description); } - public String getStatusIcon() { - return(isDone ? "[X] " : "[ ] "); + @Override + public String toString(){ + return "[T]" + super.toString(); } - - public String getTask(){ - return this.task; - } - - public void markAsDone(){ - this.isDone = true; - } - } \ No newline at end of file From 02a02a55154da7c9dec649093491b4148f87d26c Mon Sep 17 00:00:00 2001 From: Anderson Date: Wed, 1 Sep 2021 04:52:40 +0800 Subject: [PATCH 08/38] Semi Automated Test Added --- text-ui-test/input.txt | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/text-ui-test/input.txt b/text-ui-test/input.txt index e69de29bb..9c7e276fe 100644 --- a/text-ui-test/input.txt +++ b/text-ui-test/input.txt @@ -0,0 +1,9 @@ +ToDo AAA AA AAAA A +Deadline B BB BBB BBBB /by January +Event CC CCCC C CCC /at Noon +ToDo BigBoooom +list +done 3 +done 4 +list +byE \ No newline at end of file From 0396222c565d3eb30b53fc418d0080524c1b9faf Mon Sep 17 00:00:00 2001 From: Anderson Date: Sun, 5 Sep 2021 18:38:49 +0800 Subject: [PATCH 09/38] Added AcknowledgeAddition function (refractored) --- src/main/java/Duke.java | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 0204e74a6..c030f69d6 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -106,20 +106,17 @@ public static void main(String[] args) { } else if (command.equals("ToDo")){ unfilteredTasks[unfilteredCounter] = new ToDo(GetItem(userInput)); - System.out.println(LINE + "Got it. I've added this task:\t"); - System.out.println(String.format("\t%d.",unfilteredCounter+1) + unfilteredTasks[unfilteredCounter] + "\n" + String.format("\tNow you have %d tasks in the list.\n", unfilteredCounter+1) + LINE); + AcknowledgeAddition(unfilteredTasks[unfilteredCounter], unfilteredCounter); unfilteredCounter++; userInput = in.nextLine(); } else if (command.equals("Deadline")){ unfilteredTasks[unfilteredCounter] = new Deadline(GetItem(userInput), GetTime(userInput)); - System.out.println(LINE + "Got it. I've added this task:\t"); - System.out.println(String.format("\t%d.",unfilteredCounter+1) + unfilteredTasks[unfilteredCounter] + "\n" + String.format("\tNow you have %d tasks in the list.\n", unfilteredCounter+1) + LINE); + AcknowledgeAddition(unfilteredTasks[unfilteredCounter], unfilteredCounter); unfilteredCounter++; userInput = in.nextLine(); } else if (command.equals("Event")){ unfilteredTasks[unfilteredCounter] = new Event(GetItem(userInput), GetTime(userInput)); - System.out.println(LINE + "Got it. I've added this task:\t"); - System.out.println(String.format("\t%d.",unfilteredCounter+1) + unfilteredTasks[unfilteredCounter] + "\n" + String.format("\tNow you have %d tasks in the list.\n", unfilteredCounter+1) + LINE); + AcknowledgeAddition(unfilteredTasks[unfilteredCounter], unfilteredCounter); unfilteredCounter++; userInput = in.nextLine(); @@ -127,9 +124,18 @@ public static void main(String[] args) { System.out.println(BYE); closeDuke = true; } else { - System.out.println(LINE + "\tInvalid input, Please Try Again :)\n" + LINE); + InvalidMessage(); userInput = in.nextLine(); } } } + + private static void InvalidMessage() { + System.out.println(LINE + "\tInvalid input, Please Try Again :)\n" + LINE); + } + + private static void AcknowledgeAddition(Task unfilteredTask, int unfilteredCounter) { + System.out.println(LINE + "Got it. I've added this task:\t"); + System.out.println(String.format("\t%d.",unfilteredCounter+1) + unfilteredTask + "\n" + String.format("\tNow you have %d tasks in the list.\n", unfilteredCounter+1) + LINE); + } } From d6f724c7e3c54236d00983ac0a6966bb9f6fa320 Mon Sep 17 00:00:00 2001 From: Anderson Date: Sun, 5 Sep 2021 18:39:52 +0800 Subject: [PATCH 10/38] Fixed ui-test --- text-ui-test/EXPECTED.TXT | 67 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 64 insertions(+), 3 deletions(-) diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index 657e74f6e..af11dcd18 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -1,7 +1,68 @@ -Hello from - ____ _ -| _ \ _ _| | _____ + Hello from + ____ _ +| _ \ _ _| | _____ | | | | | | | |/ / _ \ | |_| | |_| | < __/ |____/ \__,_|_|\_\___| + ____________________________________________________________ + Hello! I'm Anderson + What do you need to do? + ____________________________________________________________ + + ____________________________________________________________ + Got it. I've added this task: + 1.[T][ ] AAA AA AAAA A + Now you have 1 tasks in the list. + ____________________________________________________________ + + ____________________________________________________________ + Got it. I've added this task: + 2.[D][ ] B BB BBB BBBB (by: January) + Now you have 2 tasks in the list. + ____________________________________________________________ + + ____________________________________________________________ + Got it. I've added this task: + 3.[E][ ] CC CCCC C CCC (at: Noon) + Now you have 3 tasks in the list. + ____________________________________________________________ + + ____________________________________________________________ + Got it. I've added this task: + 4.[T][ ] BigBoooom + Now you have 4 tasks in the list. + ____________________________________________________________ + + ____________________________________________________________ + Here are the tasks in your list: + + 1.[T][ ] AAA AA AAAA A + 2.[D][ ] B BB BBB BBBB (by: January) + 3.[E][ ] CC CCCC C CCC (at: Noon) + 4.[T][ ] BigBoooom + ____________________________________________________________ + + ____________________________________________________________ + Nice! I've marked this task as done: + [E][X] CC CCCC C CCC (at: Noon) + ____________________________________________________________ + + ____________________________________________________________ + Nice! I've marked this task as done: + [T][X] BigBoooom + ____________________________________________________________ + + ____________________________________________________________ + Here are the tasks in your list: + + 1.[T][ ] AAA AA AAAA A + 2.[D][ ] B BB BBB BBBB (by: January) + 3.[E][X] CC CCCC C CCC (at: Noon) + 4.[T][X] BigBoooom + ____________________________________________________________ + + ____________________________________________________________ + Bye. try not to procrastinate! + ____________________________________________________________ + From 4b85e0234be73f6f428e07ed0fac65971d52a733 Mon Sep 17 00:00:00 2001 From: Anderson Date: Wed, 8 Sep 2021 03:37:11 +0800 Subject: [PATCH 11/38] clean up before ip. refractored project --- src/main/java/Duke.java | 181 +++++++++++++++++++++++++--------------- 1 file changed, 115 insertions(+), 66 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index c030f69d6..ebe9d7df3 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -29,11 +29,11 @@ public static Task[] FilterNulls(Task[] tasks) { return Arrays.copyOf(isFilteredNull, count); } - public static String GetCommand(String userInput) { - if (userInput.equals("\n")){ + public static String getCommand(String userInput) { + if (isEmpty(userInput)) { return "again"; } - if (userInput.length() > 2){ + if (userInput.length() > 2) { String[] isolateCommand = userInput.split(" "); return isolateCommand[0]; } @@ -42,22 +42,32 @@ public static String GetCommand(String userInput) { public static String GetItem(String userInput) { String item = ""; - if (GetCommand(userInput).equals("Deadline")){ - item = userInput.substring(userInput.indexOf(" ")+1, userInput.indexOf("/")); - } else if (GetCommand(userInput).equals("Event")){ - item = userInput.substring(userInput.indexOf(" ")+1, userInput.indexOf("/")); - } else if (userInput.length() > 3){ - item = userInput.substring(userInput.indexOf(" ")+1); + String command = getCommand(userInput); + if (isDeadline(command)) { + item = notToDoItem(userInput); + } else if (isEvent(command)) { + item = notToDoItem(userInput); + } else if (userInput.length() > 3) { + item = getRequiredSubstring(userInput, " ", 1); } return item; } - public static String GetTime(String userInput){ + private static String getRequiredSubstring(String userInput, String s, int i) { + return userInput.substring(userInput.indexOf(s) + i); + } + + private static String notToDoItem(String userInput) { + return userInput.substring(userInput.indexOf(" ") + 1, userInput.indexOf("/")); + } + + public static String getTime(String userInput) { String time = ""; - if (GetCommand(userInput).equals("Deadline")){ - time = userInput.substring(userInput.indexOf("/")+3); - } else if (GetCommand(userInput).equals("Event")){ - time = userInput.substring(userInput.indexOf("/")+3); + String command = getCommand(userInput); + if (isDeadline(command)) { + time = getRequiredSubstring(userInput, "/", 3); + } else if (isEvent(command)) { + time = getRequiredSubstring(userInput, "/", 3); } else { return ""; } @@ -66,76 +76,115 @@ public static String GetTime(String userInput){ public static void main(String[] args) { - - Task[] unfilteredTasks = new Task[100]; int unfilteredCounter = 0; - System.out.println("\tHello from\n" + LOGO); - System.out.println(GREETING); + printGreetings(); String userInput; Scanner in = new Scanner(System.in); userInput = in.nextLine(); boolean closeDuke = false; - while (!closeDuke) { - String command = GetCommand(userInput); - if (command.equals("done")){ - System.out.println(LINE + "Nice! I've marked this task as done:"); - int taskNumber = Integer.parseInt(GetItem(userInput)); - Task completedTask = unfilteredTasks[(taskNumber - 1)]; - completedTask.markAsDone(); - System.out.println("\t\t" + completedTask + "\n" + LINE); - userInput = in.nextLine(); - } else if (userInput.equals("list")) { - Task[] filteredNull = FilterNulls(unfilteredTasks); - int count = 0; - if (filteredNull[0] == null) { - System.out.println(LINE + "\tAll DONE!\n" + LINE); - userInput = in.nextLine(); - } else { - System.out.println(LINE + "Here are the tasks in your list:\n"); - for (Task task : filteredNull) { - count++; - System.out.println("\t" + count + "." + task); - } - System.out.println(LINE); - userInput = in.nextLine(); - } + do { + String command = getCommand(userInput); + doDone(command, unfilteredTasks, userInput); + doList(command, unfilteredTasks); + unfilteredTasks[unfilteredCounter] = isToDo(command) ? new ToDo((GetItem(userInput))) : isDeadline(command) ? new Deadline(GetItem(userInput), getTime(userInput)) : isEvent(command) ? new Event(GetItem(userInput), getTime(userInput)) : null; - } else if (command.equals("ToDo")){ - unfilteredTasks[unfilteredCounter] = new ToDo(GetItem(userInput)); - AcknowledgeAddition(unfilteredTasks[unfilteredCounter], unfilteredCounter); - unfilteredCounter++; - userInput = in.nextLine(); - } else if (command.equals("Deadline")){ - unfilteredTasks[unfilteredCounter] = new Deadline(GetItem(userInput), GetTime(userInput)); - AcknowledgeAddition(unfilteredTasks[unfilteredCounter], unfilteredCounter); - unfilteredCounter++; - userInput = in.nextLine(); - } else if (command.equals("Event")){ - unfilteredTasks[unfilteredCounter] = new Event(GetItem(userInput), GetTime(userInput)); - AcknowledgeAddition(unfilteredTasks[unfilteredCounter], unfilteredCounter); - unfilteredCounter++; + AcknowledgeAddition(command, unfilteredTasks[unfilteredCounter], unfilteredCounter); + + unfilteredCounter = isInvalidCommand(command) ? unfilteredCounter : isList(command) ? unfilteredCounter : unfilteredCounter + 1; + if (!isBye(command)) { userInput = in.nextLine(); + } + doBye(command); + closeDuke = isBye(command); + } while (!closeDuke); + } + + private static void printGreetings() { + System.out.println("\tHello from\n" + LOGO); + System.out.println(GREETING); + } + + private static boolean isToDo(String command) { + return command.toLowerCase().equals("todo"); + } + + private static boolean isBye(String command) { + return command.toLowerCase().equals("bye"); + } + + private static boolean isDeadline(String command) { + return command.toLowerCase().equals("deadline"); + } - } else if (command.toLowerCase().equals("bye")) { - System.out.println(BYE); - closeDuke = true; + private static boolean isEvent(String command) { + return command.toLowerCase().equals("event"); + } + + private static boolean isList(String userInput) { + return userInput.toLowerCase().equals("list"); + } + + private static boolean isDone(String command) { + return command.toLowerCase().equals("done"); + } + + private static boolean isEmpty(String userInput) { + return userInput.equals("\n"); + } + + private static boolean isInvalidCommand(String command) { + return isEvent(command) ? false : isDeadline(command) ? false : isToDo(command) ? false : isList(command) ? false : isBye(command) ? false : true; + } + + private static void doDone(String command, Task[] fullTaskList, String userIn) { + if (isDone(command)) { + markedDoneMessage(fullTaskList, userIn); + } + } + + private static void doList(String command, Task[] fullTaskList) { + Task[] filteredNull = FilterNulls(fullTaskList); + int count = 0; + if (isList(command)) { + if (filteredNull[0] == null) { + System.out.println(LINE + "\tYou had no task to begin with\n" + LINE); } else { - InvalidMessage(); - userInput = in.nextLine(); + System.out.println(LINE + "Here are the tasks in your list:\n"); + for (Task task : filteredNull) { + count++; + System.out.println("\t" + count + "." + task); + } + System.out.println(LINE); } } } - private static void InvalidMessage() { - System.out.println(LINE + "\tInvalid input, Please Try Again :)\n" + LINE); + private static void doBye(String command) { + if (isBye(command)) { + System.out.println(BYE); + } } - private static void AcknowledgeAddition(Task unfilteredTask, int unfilteredCounter) { - System.out.println(LINE + "Got it. I've added this task:\t"); - System.out.println(String.format("\t%d.",unfilteredCounter+1) + unfilteredTask + "\n" + String.format("\tNow you have %d tasks in the list.\n", unfilteredCounter+1) + LINE); + private static void markedDoneMessage(Task[] unfilteredTasks, String userInput) { + System.out.println(LINE + "Nice! I've marked this task as done:"); + int taskNumber = Integer.parseInt(GetItem(userInput)); + Task completedTask = unfilteredTasks[(taskNumber - 1)]; + completedTask.markAsDone(); + System.out.println("\t\t" + completedTask + "\n" + LINE); + } + + private static void AcknowledgeAddition(String command, Task unfilteredTask, int unfilteredCounter) { + if (!isInvalidCommand(command) && !isList(command) && !isBye(command)) { + System.out.println(LINE + "Got it. I've added this task:\t"); + System.out.println(String.format("\t%d.", unfilteredCounter + 1) + unfilteredTask + "\n" + String.format("\tNow you have %d tasks in the list.\n", unfilteredCounter + 1) + LINE); + } + } + + private static void InvalidMessage() { + System.out.println(LINE + "\tInvalid input, Please Try Again :)\n" + LINE); } } From 7e9059fa4f9ed791bf8b0516581a69d8047fb791 Mon Sep 17 00:00:00 2001 From: Anderson Date: Wed, 8 Sep 2021 04:29:08 +0800 Subject: [PATCH 12/38] added Illegal ToDo Exception --- src/main/java/Duke.java | 27 ++++++++++++++++++------- src/main/java/IllegalToDoException.java | 8 ++++++++ 2 files changed, 28 insertions(+), 7 deletions(-) create mode 100644 src/main/java/IllegalToDoException.java diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index ebe9d7df3..be140695f 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -40,7 +40,7 @@ public static String getCommand(String userInput) { return userInput; } - public static String GetItem(String userInput) { + public static String GetItem(String userInput) throws IllegalToDoException { String item = ""; String command = getCommand(userInput); if (isDeadline(command)) { @@ -49,7 +49,10 @@ public static String GetItem(String userInput) { item = notToDoItem(userInput); } else if (userInput.length() > 3) { item = getRequiredSubstring(userInput, " ", 1); - } + if(item.trim().equals("") || item.toLowerCase().equals("todo")){ + throw new IllegalToDoException(); + } + } else if (isInvalidCommand(command)) return item; } @@ -74,7 +77,7 @@ public static String getTime(String userInput) { return time; } - public static void main(String[] args) { + public static void main(String[] args) throws IllegalToDoException { Task[] unfilteredTasks = new Task[100]; int unfilteredCounter = 0; @@ -90,9 +93,14 @@ public static void main(String[] args) { String command = getCommand(userInput); doDone(command, unfilteredTasks, userInput); doList(command, unfilteredTasks); - unfilteredTasks[unfilteredCounter] = isToDo(command) ? new ToDo((GetItem(userInput))) : isDeadline(command) ? new Deadline(GetItem(userInput), getTime(userInput)) : isEvent(command) ? new Event(GetItem(userInput), getTime(userInput)) : null; - AcknowledgeAddition(command, unfilteredTasks[unfilteredCounter], unfilteredCounter); + try { + unfilteredTasks[unfilteredCounter] = isToDo(command) ? new ToDo((GetItem(userInput))) : isDeadline(command) ? new Deadline(GetItem(userInput), getTime(userInput)) : isEvent(command) ? new Event(GetItem(userInput), getTime(userInput)) : null; + AcknowledgeAddition(command, unfilteredTasks[unfilteredCounter], unfilteredCounter); + } catch (IllegalToDoException e) { + e.printMessage(); + } + unfilteredCounter = isInvalidCommand(command) ? unfilteredCounter : isList(command) ? unfilteredCounter : unfilteredCounter + 1; if (!isBye(command)) { @@ -169,9 +177,14 @@ private static void doBye(String command) { } } - private static void markedDoneMessage(Task[] unfilteredTasks, String userInput) { + private static void markedDoneMessage(Task[] unfilteredTasks, String userInput){ System.out.println(LINE + "Nice! I've marked this task as done:"); - int taskNumber = Integer.parseInt(GetItem(userInput)); + int taskNumber = 0; + try { + taskNumber = Integer.parseInt(GetItem(userInput)); + } catch (IllegalToDoException e) { + System.out.println("Invalid ToDo"); + } Task completedTask = unfilteredTasks[(taskNumber - 1)]; completedTask.markAsDone(); System.out.println("\t\t" + completedTask + "\n" + LINE); diff --git a/src/main/java/IllegalToDoException.java b/src/main/java/IllegalToDoException.java new file mode 100644 index 000000000..5214ad37c --- /dev/null +++ b/src/main/java/IllegalToDoException.java @@ -0,0 +1,8 @@ +public class IllegalToDoException extends Exception{ + //@Override + public static void printMessage() { + System.out.println ("\t____________________________________________________________\n" + + "\tOOOPS!!! The description of a todo cannot be empty.\n" + + "\t____________________________________________________________\n\t"); + } +} From 08e054f2f1d989c6b607cb178216774d27169c26 Mon Sep 17 00:00:00 2001 From: Anderson Date: Wed, 8 Sep 2021 05:42:33 +0800 Subject: [PATCH 13/38] Added InvalidCommandException --- src/main/java/Duke.java | 47 ++++++++++++++-------- src/main/java/IllegalToDoException.java | 2 +- src/main/java/InvalidCommandException.java | 7 ++++ 3 files changed, 38 insertions(+), 18 deletions(-) create mode 100644 src/main/java/InvalidCommandException.java diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index be140695f..5dc41c6a0 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -31,7 +31,9 @@ public static Task[] FilterNulls(Task[] tasks) { public static String getCommand(String userInput) { if (isEmpty(userInput)) { - return "again"; + System.out.println(LINE + + "I'm Sorry, what did you say?\n" + + LINE); } if (userInput.length() > 2) { String[] isolateCommand = userInput.split(" "); @@ -40,19 +42,21 @@ public static String getCommand(String userInput) { return userInput; } - public static String GetItem(String userInput) throws IllegalToDoException { + public static String GetItem(String userInput) throws IllegalToDoException, InvalidCommandException { String item = ""; String command = getCommand(userInput); - if (isDeadline(command)) { + if (isEvent(command)) { item = notToDoItem(userInput); - } else if (isEvent(command)) { + } else if (isDeadline(command)) { item = notToDoItem(userInput); + } else if (isInvalidCommand(command)) { + throw new InvalidCommandException(); } else if (userInput.length() > 3) { item = getRequiredSubstring(userInput, " ", 1); - if(item.trim().equals("") || item.toLowerCase().equals("todo")){ + if (item.trim().equals("") || item.toLowerCase().equals("todo")) { throw new IllegalToDoException(); } - } else if (isInvalidCommand(command)) + } return item; } @@ -90,19 +94,26 @@ public static void main(String[] args) throws IllegalToDoException { boolean closeDuke = false; do { - String command = getCommand(userInput); - doDone(command, unfilteredTasks, userInput); - doList(command, unfilteredTasks); + String command = getCommand(userInput); try { - unfilteredTasks[unfilteredCounter] = isToDo(command) ? new ToDo((GetItem(userInput))) : isDeadline(command) ? new Deadline(GetItem(userInput), getTime(userInput)) : isEvent(command) ? new Event(GetItem(userInput), getTime(userInput)) : null; + String newTask = GetItem(userInput); + String time = getTime(userInput); + + doDone(command, unfilteredTasks, userInput); + doList(command, unfilteredTasks); + + unfilteredTasks[unfilteredCounter] = isToDo(command) ? new ToDo(newTask) : isDeadline(command) ? new Deadline(newTask, time) : isEvent(command) ? new Event(newTask, time) : null; AcknowledgeAddition(command, unfilteredTasks[unfilteredCounter], unfilteredCounter); + unfilteredCounter = (isInvalidCommand(command) || isList(command) || isDone(command)) ? unfilteredCounter : unfilteredCounter + 1; + } catch (IllegalToDoException e) { - e.printMessage(); + IllegalToDoException.printMessage(); + } catch (InvalidCommandException e) { + InvalidCommandException.printMessage(); } - unfilteredCounter = isInvalidCommand(command) ? unfilteredCounter : isList(command) ? unfilteredCounter : unfilteredCounter + 1; if (!isBye(command)) { userInput = in.nextLine(); } @@ -141,11 +152,11 @@ private static boolean isDone(String command) { } private static boolean isEmpty(String userInput) { - return userInput.equals("\n"); + return userInput.trim().equals(""); } private static boolean isInvalidCommand(String command) { - return isEvent(command) ? false : isDeadline(command) ? false : isToDo(command) ? false : isList(command) ? false : isBye(command) ? false : true; + return !isEvent(command) && !isDeadline(command) && !isToDo(command) && !isList(command) && !isBye(command) && !isDone(command); } private static void doDone(String command, Task[] fullTaskList, String userIn) { @@ -177,13 +188,15 @@ private static void doBye(String command) { } } - private static void markedDoneMessage(Task[] unfilteredTasks, String userInput){ + private static void markedDoneMessage(Task[] unfilteredTasks, String userInput) { System.out.println(LINE + "Nice! I've marked this task as done:"); int taskNumber = 0; try { taskNumber = Integer.parseInt(GetItem(userInput)); } catch (IllegalToDoException e) { System.out.println("Invalid ToDo"); + } catch (InvalidCommandException e) { + System.out.println("Invalid Command"); } Task completedTask = unfilteredTasks[(taskNumber - 1)]; completedTask.markAsDone(); @@ -191,12 +204,12 @@ private static void markedDoneMessage(Task[] unfilteredTasks, String userInput){ } private static void AcknowledgeAddition(String command, Task unfilteredTask, int unfilteredCounter) { - if (!isInvalidCommand(command) && !isList(command) && !isBye(command)) { + if (!isInvalidCommand(command) && !isList(command) && !isBye(command) && !isDone(command)) { System.out.println(LINE + "Got it. I've added this task:\t"); System.out.println(String.format("\t%d.", unfilteredCounter + 1) + unfilteredTask + "\n" + String.format("\tNow you have %d tasks in the list.\n", unfilteredCounter + 1) + LINE); } } - + private static void InvalidMessage() { System.out.println(LINE + "\tInvalid input, Please Try Again :)\n" + LINE); } diff --git a/src/main/java/IllegalToDoException.java b/src/main/java/IllegalToDoException.java index 5214ad37c..5c69e087e 100644 --- a/src/main/java/IllegalToDoException.java +++ b/src/main/java/IllegalToDoException.java @@ -2,7 +2,7 @@ public class IllegalToDoException extends Exception{ //@Override public static void printMessage() { System.out.println ("\t____________________________________________________________\n" + - "\tOOOPS!!! The description of a todo cannot be empty.\n" + + "\tOOOPS!!! The description of a todo cannot be empty. BIG SADS\n" + "\t____________________________________________________________\n\t"); } } diff --git a/src/main/java/InvalidCommandException.java b/src/main/java/InvalidCommandException.java new file mode 100644 index 000000000..b4d674262 --- /dev/null +++ b/src/main/java/InvalidCommandException.java @@ -0,0 +1,7 @@ +public class InvalidCommandException extends Exception{ + public static void printMessage() { + System.out.println ("\t____________________________________________________________\n" + + "\tOOOPS!!! I'm sorry, but I don't know what that means. EPIC SADS :-(\n" + + "\t____________________________________________________________\n\t"); + } +} From 328e111afd03946dc58008d88a470f4f58fe8ef7 Mon Sep 17 00:00:00 2001 From: Anderson Date: Wed, 8 Sep 2021 06:39:18 +0800 Subject: [PATCH 14/38] moved everything to duke package, and split command exceptions and task classes --- src/main/java/{ => duke}/Duke.java | 19 ++++++++++++------- .../command}/IllegalToDoException.java | 2 ++ .../command}/InvalidCommandException.java | 2 ++ src/main/java/{ => duke/task}/Deadline.java | 2 ++ src/main/java/{ => duke/task}/Event.java | 2 ++ src/main/java/{ => duke/task}/Task.java | 2 ++ src/main/java/{ => duke/task}/ToDo.java | 2 ++ 7 files changed, 24 insertions(+), 7 deletions(-) rename src/main/java/{ => duke}/Duke.java (96%) rename src/main/java/{ => duke/command}/IllegalToDoException.java (94%) rename src/main/java/{ => duke/command}/InvalidCommandException.java (94%) rename src/main/java/{ => duke/task}/Deadline.java (93%) rename src/main/java/{ => duke/task}/Event.java (93%) rename src/main/java/{ => duke/task}/Task.java (95%) rename src/main/java/{ => duke/task}/ToDo.java (90%) diff --git a/src/main/java/Duke.java b/src/main/java/duke/Duke.java similarity index 96% rename from src/main/java/Duke.java rename to src/main/java/duke/Duke.java index 5dc41c6a0..5a11d679f 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/duke/Duke.java @@ -1,3 +1,12 @@ +package duke; + +import duke.command.IllegalToDoException; +import duke.command.InvalidCommandException; +import duke.task.Deadline; +import duke.task.Event; +import duke.task.Task; +import duke.task.ToDo; + import java.util.Scanner; import java.util.Arrays; @@ -69,7 +78,7 @@ private static String notToDoItem(String userInput) { } public static String getTime(String userInput) { - String time = ""; + String time; String command = getCommand(userInput); if (isDeadline(command)) { time = getRequiredSubstring(userInput, "/", 3); @@ -81,7 +90,7 @@ public static String getTime(String userInput) { return time; } - public static void main(String[] args) throws IllegalToDoException { + public static void main(String[] args) { Task[] unfilteredTasks = new Task[100]; int unfilteredCounter = 0; @@ -91,7 +100,7 @@ public static void main(String[] args) throws IllegalToDoException { String userInput; Scanner in = new Scanner(System.in); userInput = in.nextLine(); - boolean closeDuke = false; + boolean closeDuke; do { @@ -209,8 +218,4 @@ private static void AcknowledgeAddition(String command, Task unfilteredTask, int System.out.println(String.format("\t%d.", unfilteredCounter + 1) + unfilteredTask + "\n" + String.format("\tNow you have %d tasks in the list.\n", unfilteredCounter + 1) + LINE); } } - - private static void InvalidMessage() { - System.out.println(LINE + "\tInvalid input, Please Try Again :)\n" + LINE); - } } diff --git a/src/main/java/IllegalToDoException.java b/src/main/java/duke/command/IllegalToDoException.java similarity index 94% rename from src/main/java/IllegalToDoException.java rename to src/main/java/duke/command/IllegalToDoException.java index 5c69e087e..51f64ee61 100644 --- a/src/main/java/IllegalToDoException.java +++ b/src/main/java/duke/command/IllegalToDoException.java @@ -1,3 +1,5 @@ +package duke.command; + public class IllegalToDoException extends Exception{ //@Override public static void printMessage() { diff --git a/src/main/java/InvalidCommandException.java b/src/main/java/duke/command/InvalidCommandException.java similarity index 94% rename from src/main/java/InvalidCommandException.java rename to src/main/java/duke/command/InvalidCommandException.java index b4d674262..9297a17c5 100644 --- a/src/main/java/InvalidCommandException.java +++ b/src/main/java/duke/command/InvalidCommandException.java @@ -1,3 +1,5 @@ +package duke.command; + public class InvalidCommandException extends Exception{ public static void printMessage() { System.out.println ("\t____________________________________________________________\n" + diff --git a/src/main/java/Deadline.java b/src/main/java/duke/task/Deadline.java similarity index 93% rename from src/main/java/Deadline.java rename to src/main/java/duke/task/Deadline.java index b32a0b57c..6dea1ea1a 100644 --- a/src/main/java/Deadline.java +++ b/src/main/java/duke/task/Deadline.java @@ -1,3 +1,5 @@ +package duke.task; + public class Deadline extends Task{ protected String by; diff --git a/src/main/java/Event.java b/src/main/java/duke/task/Event.java similarity index 93% rename from src/main/java/Event.java rename to src/main/java/duke/task/Event.java index 0066b788a..45e64b44a 100644 --- a/src/main/java/Event.java +++ b/src/main/java/duke/task/Event.java @@ -1,3 +1,5 @@ +package duke.task; + public class Event extends Task { protected String at; diff --git a/src/main/java/Task.java b/src/main/java/duke/task/Task.java similarity index 95% rename from src/main/java/Task.java rename to src/main/java/duke/task/Task.java index c253fd031..79e360784 100644 --- a/src/main/java/Task.java +++ b/src/main/java/duke/task/Task.java @@ -1,3 +1,5 @@ +package duke.task; + public class Task { protected String task; protected boolean isDone; diff --git a/src/main/java/ToDo.java b/src/main/java/duke/task/ToDo.java similarity index 90% rename from src/main/java/ToDo.java rename to src/main/java/duke/task/ToDo.java index fd9719d79..e5e7a99e8 100644 --- a/src/main/java/ToDo.java +++ b/src/main/java/duke/task/ToDo.java @@ -1,3 +1,5 @@ +package duke.task; + public class ToDo extends Task { public ToDo(String description){ From 23e7bae63d0845cadeb755c9d4ad71e9da8f3a06 Mon Sep 17 00:00:00 2001 From: Anderson Date: Wed, 8 Sep 2021 06:47:05 +0800 Subject: [PATCH 15/38] removeed unneecessary code --- src/main/java/duke/Duke.java | 14 +++++++------- src/main/java/duke/task/Task.java | 4 ---- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/src/main/java/duke/Duke.java b/src/main/java/duke/Duke.java index 5a11d679f..3d48b4f39 100644 --- a/src/main/java/duke/Duke.java +++ b/src/main/java/duke/Duke.java @@ -62,7 +62,7 @@ public static String GetItem(String userInput) throws IllegalToDoException, Inva throw new InvalidCommandException(); } else if (userInput.length() > 3) { item = getRequiredSubstring(userInput, " ", 1); - if (item.trim().equals("") || item.toLowerCase().equals("todo")) { + if (item.trim().equals("") || item.equalsIgnoreCase("todo")) { throw new IllegalToDoException(); } } @@ -137,27 +137,27 @@ private static void printGreetings() { } private static boolean isToDo(String command) { - return command.toLowerCase().equals("todo"); + return command.equalsIgnoreCase("todo"); } private static boolean isBye(String command) { - return command.toLowerCase().equals("bye"); + return command.equalsIgnoreCase("bye"); } private static boolean isDeadline(String command) { - return command.toLowerCase().equals("deadline"); + return command.equalsIgnoreCase("deadline"); } private static boolean isEvent(String command) { - return command.toLowerCase().equals("event"); + return command.equalsIgnoreCase("event"); } private static boolean isList(String userInput) { - return userInput.toLowerCase().equals("list"); + return userInput.equalsIgnoreCase("list"); } private static boolean isDone(String command) { - return command.toLowerCase().equals("done"); + return command.equalsIgnoreCase("done"); } private static boolean isEmpty(String userInput) { diff --git a/src/main/java/duke/task/Task.java b/src/main/java/duke/task/Task.java index 79e360784..2eebf3e9a 100644 --- a/src/main/java/duke/task/Task.java +++ b/src/main/java/duke/task/Task.java @@ -13,10 +13,6 @@ public String getStatusIcon() { return(isDone ? "[X] " : "[ ] "); } - public String getTask(){ - return this.task; - } - public void markAsDone(){ this.isDone = true; } From 779f267ea26bbc4a4859aa23f91d180702293784 Mon Sep 17 00:00:00 2001 From: Anderson Date: Tue, 14 Sep 2021 15:05:18 +0800 Subject: [PATCH 16/38] imported ArrayList Switched all Arrays to ArrayList --- src/main/java/duke/Duke.java | 69 ++++++++++++++++++++++-------------- 1 file changed, 43 insertions(+), 26 deletions(-) diff --git a/src/main/java/duke/Duke.java b/src/main/java/duke/Duke.java index 3d48b4f39..06ca4fb8b 100644 --- a/src/main/java/duke/Duke.java +++ b/src/main/java/duke/Duke.java @@ -1,5 +1,6 @@ package duke; +import duke.command.EmptyCommand; import duke.command.IllegalToDoException; import duke.command.InvalidCommandException; import duke.task.Deadline; @@ -8,7 +9,7 @@ import duke.task.ToDo; import java.util.Scanner; -import java.util.Arrays; +import java.util.ArrayList; public class Duke { @@ -25,9 +26,9 @@ public class Duke { + "Hello! I'm Anderson\n\t" + "What do you need to do?\n" + LINE; - - public static Task[] FilterNulls(Task[] tasks) { - Task[] isFilteredNull = new Task[100]; +/* + public static ArrayList FilterNulls(ArrayList tasks) { + ArrayList isFilteredNull = new ArrayList(); int count = 0; for (int i = 0; i < 100; i++) { if (tasks[i] != null) { @@ -36,14 +37,9 @@ public static Task[] FilterNulls(Task[] tasks) { } } return Arrays.copyOf(isFilteredNull, count); - } + }*/ public static String getCommand(String userInput) { - if (isEmpty(userInput)) { - System.out.println(LINE + - "I'm Sorry, what did you say?\n" + - LINE); - } if (userInput.length() > 2) { String[] isolateCommand = userInput.split(" "); return isolateCommand[0]; @@ -51,7 +47,7 @@ public static String getCommand(String userInput) { return userInput; } - public static String GetItem(String userInput) throws IllegalToDoException, InvalidCommandException { + public static String GetItem(String userInput) throws IllegalToDoException, InvalidCommandException, EmptyCommand { String item = ""; String command = getCommand(userInput); if (isEvent(command)) { @@ -65,6 +61,8 @@ public static String GetItem(String userInput) throws IllegalToDoException, Inva if (item.trim().equals("") || item.equalsIgnoreCase("todo")) { throw new IllegalToDoException(); } + } else if (isEmpty(command)){ + throw new EmptyCommand(); } return item; } @@ -92,7 +90,7 @@ public static String getTime(String userInput) { public static void main(String[] args) { - Task[] unfilteredTasks = new Task[100]; + ArrayList unfilteredTasks = new ArrayList(); int unfilteredCounter = 0; printGreetings(); @@ -112,13 +110,15 @@ public static void main(String[] args) { doDone(command, unfilteredTasks, userInput); doList(command, unfilteredTasks); - unfilteredTasks[unfilteredCounter] = isToDo(command) ? new ToDo(newTask) : isDeadline(command) ? new Deadline(newTask, time) : isEvent(command) ? new Event(newTask, time) : null; - AcknowledgeAddition(command, unfilteredTasks[unfilteredCounter], unfilteredCounter); - unfilteredCounter = (isInvalidCommand(command) || isList(command) || isDone(command)) ? unfilteredCounter : unfilteredCounter + 1; + unfilteredTasks = addNewTask(command, unfilteredTasks, newTask, time); + AcknowledgeAddition(command, unfilteredTasks, unfilteredCounter); + unfilteredCounter = (isInvalidCommand(command) || isList(command) || isDone(command) ||isBye(command)) ? unfilteredCounter : unfilteredCounter + 1; } catch (IllegalToDoException e) { IllegalToDoException.printMessage(); - } catch (InvalidCommandException e) { + } catch (EmptyCommand e){ + EmptyCommand.printMessage(); + }catch (InvalidCommandException e) { InvalidCommandException.printMessage(); } @@ -131,6 +131,17 @@ public static void main(String[] args) { } while (!closeDuke); } + private static ArrayList addNewTask(String command, ArrayList allTasks, String newTask, String time){ + if (isToDo(command)){ + allTasks.add(new ToDo(newTask)); + } else if (isDeadline(command)){ + allTasks.add(new Deadline(newTask, time)); + } else if (isEvent(command)){ + allTasks.add(new Event(newTask, time)); + } + return allTasks; + } + private static void printGreetings() { System.out.println("\tHello from\n" + LOGO); System.out.println(GREETING); @@ -160,6 +171,10 @@ private static boolean isDone(String command) { return command.equalsIgnoreCase("done"); } + private static boolean isDelete(String command) { + return command.equalsIgnoreCase("delete"); + } + private static boolean isEmpty(String userInput) { return userInput.trim().equals(""); } @@ -168,21 +183,21 @@ private static boolean isInvalidCommand(String command) { return !isEvent(command) && !isDeadline(command) && !isToDo(command) && !isList(command) && !isBye(command) && !isDone(command); } - private static void doDone(String command, Task[] fullTaskList, String userIn) { + private static void doDone(String command, ArrayList fullTaskList, String userIn) { if (isDone(command)) { markedDoneMessage(fullTaskList, userIn); } } - private static void doList(String command, Task[] fullTaskList) { - Task[] filteredNull = FilterNulls(fullTaskList); + private static void doList(String command, ArrayList fullTaskList) { + //Task[] filteredNull = FilterNulls(fullTaskList); int count = 0; if (isList(command)) { - if (filteredNull[0] == null) { + if (fullTaskList.size() == 0) { System.out.println(LINE + "\tYou had no task to begin with\n" + LINE); } else { System.out.println(LINE + "Here are the tasks in your list:\n"); - for (Task task : filteredNull) { + for (Task task : fullTaskList) { count++; System.out.println("\t" + count + "." + task); } @@ -197,7 +212,7 @@ private static void doBye(String command) { } } - private static void markedDoneMessage(Task[] unfilteredTasks, String userInput) { + private static void markedDoneMessage(ArrayList unfilteredTasks, String userInput) { System.out.println(LINE + "Nice! I've marked this task as done:"); int taskNumber = 0; try { @@ -206,16 +221,18 @@ private static void markedDoneMessage(Task[] unfilteredTasks, String userInput) System.out.println("Invalid ToDo"); } catch (InvalidCommandException e) { System.out.println("Invalid Command"); + } catch (EmptyCommand e) { + System.out.println("Empty Command"); } - Task completedTask = unfilteredTasks[(taskNumber - 1)]; + Task completedTask = unfilteredTasks.get(taskNumber - 1); completedTask.markAsDone(); System.out.println("\t\t" + completedTask + "\n" + LINE); } - private static void AcknowledgeAddition(String command, Task unfilteredTask, int unfilteredCounter) { - if (!isInvalidCommand(command) && !isList(command) && !isBye(command) && !isDone(command)) { + private static void AcknowledgeAddition(String command, ArrayList unfilteredTasks, int unfilteredCounter) { + if (isToDo(command) || isDeadline(command) || isEvent(command)) { System.out.println(LINE + "Got it. I've added this task:\t"); - System.out.println(String.format("\t%d.", unfilteredCounter + 1) + unfilteredTask + "\n" + String.format("\tNow you have %d tasks in the list.\n", unfilteredCounter + 1) + LINE); + System.out.println(String.format("\t%d.", unfilteredCounter + 1) + unfilteredTasks.get(unfilteredCounter) + "\n" + String.format("\tNow you have %d tasks in the list.\n", unfilteredCounter + 1) + LINE); } } } From 02e647d2390cf47c5551f0503102dc02f7dc2bc8 Mon Sep 17 00:00:00 2001 From: Anderson Date: Tue, 14 Sep 2021 16:48:11 +0800 Subject: [PATCH 17/38] Added Delete function --- src/main/java/duke/Duke.java | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/src/main/java/duke/Duke.java b/src/main/java/duke/Duke.java index 06ca4fb8b..49365cf2c 100644 --- a/src/main/java/duke/Duke.java +++ b/src/main/java/duke/Duke.java @@ -109,10 +109,11 @@ public static void main(String[] args) { doDone(command, unfilteredTasks, userInput); doList(command, unfilteredTasks); + unfilteredTasks = doDelete(command,unfilteredTasks, userInput); unfilteredTasks = addNewTask(command, unfilteredTasks, newTask, time); AcknowledgeAddition(command, unfilteredTasks, unfilteredCounter); - unfilteredCounter = (isInvalidCommand(command) || isList(command) || isDone(command) ||isBye(command)) ? unfilteredCounter : unfilteredCounter + 1; + unfilteredCounter = (isInvalidCommand(command) || isList(command) || isDone(command) ||isBye(command)) ? unfilteredCounter : (isDelete(command)) ? unfilteredCounter - 1 : unfilteredCounter + 1; } catch (IllegalToDoException e) { IllegalToDoException.printMessage(); @@ -180,7 +181,7 @@ private static boolean isEmpty(String userInput) { } private static boolean isInvalidCommand(String command) { - return !isEvent(command) && !isDeadline(command) && !isToDo(command) && !isList(command) && !isBye(command) && !isDone(command); + return !isEvent(command) && !isDeadline(command) && !isToDo(command) && !isList(command) && !isBye(command) && !isDone(command) && !isDelete(command); } private static void doDone(String command, ArrayList fullTaskList, String userIn) { @@ -189,6 +190,25 @@ private static void doDone(String command, ArrayList fullTaskList, String } } + private static ArrayList doDelete(String command, ArrayList fullTaskList, String userIn){ + if (isDelete(command)) { + System.out.println(LINE + "Noted! I've removed this task:"); + int taskNumber = 0; + try { + taskNumber = Integer.parseInt(GetItem(userIn)); + } catch (IllegalToDoException e) { + System.out.println("Invalid ToDo"); + } catch (InvalidCommandException e) { + System.out.println("Invalid Command"); + } catch (EmptyCommand e) { + System.out.println("Empty Command"); + } + //System.out.println("\t\t" + fullTaskList.get(taskNumber - 1) + "\n" + LINE); + System.out.println(String.format("\t%d.", taskNumber) + fullTaskList.get(taskNumber - 1) + "\n" + String.format("\tNow you have %d tasks in the list.\n", fullTaskList.size() - 1) + LINE); + fullTaskList.remove(taskNumber - 1); + } + return fullTaskList; + } private static void doList(String command, ArrayList fullTaskList) { //Task[] filteredNull = FilterNulls(fullTaskList); int count = 0; From 3a4d6be1e5ddc37f0f645a809e4e84c476921549 Mon Sep 17 00:00:00 2001 From: Anderson Date: Wed, 15 Sep 2021 03:58:53 +0800 Subject: [PATCH 18/38] Added Save to duke.txt --- src/main/java/duke/Duke.java | 70 ++++++++++++++++++++++++++- src/main/java/duke/task/Deadline.java | 9 ++++ src/main/java/duke/task/Event.java | 9 ++++ src/main/java/duke/task/Task.java | 17 +++++++ src/main/java/duke/task/ToDo.java | 6 +++ 5 files changed, 109 insertions(+), 2 deletions(-) diff --git a/src/main/java/duke/Duke.java b/src/main/java/duke/Duke.java index 3d48b4f39..75105441a 100644 --- a/src/main/java/duke/Duke.java +++ b/src/main/java/duke/Duke.java @@ -7,11 +7,20 @@ import duke.task.Task; import duke.task.ToDo; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileWriter; +import java.io.IOException; +import java.sql.SQLOutput; import java.util.Scanner; import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; public class Duke { + public static final String SAVEFILE_SEPERATOR = "|"; + public static final String FILE_PATH = "duke.txt"; public static final String LOGO = " ____ _ \n" + "| _ \\ _ _| | _____ \n" + "| | | | | | | |/ / _ \\\n" @@ -102,12 +111,19 @@ public static void main(String[] args) { userInput = in.nextLine(); boolean closeDuke; + /*try { + unfilteredTasks = loadFile(FILE_PATH, unfilteredTasks); + } catch (FileNotFoundException e){ + File dukeCheckpoint = new File(FILE_PATH); + } +*/ do { - String command = getCommand(userInput); try { + String newTask = GetItem(userInput); String time = getTime(userInput); + String dukeUpdate = ""; doDone(command, unfilteredTasks, userInput); doList(command, unfilteredTasks); @@ -116,13 +132,17 @@ public static void main(String[] args) { AcknowledgeAddition(command, unfilteredTasks[unfilteredCounter], unfilteredCounter); unfilteredCounter = (isInvalidCommand(command) || isList(command) || isDone(command)) ? unfilteredCounter : unfilteredCounter + 1; + dukeUpdate = autoSave(unfilteredTasks, dukeUpdate); + writeToFile(FILE_PATH, dukeUpdate); + } catch (IllegalToDoException e) { IllegalToDoException.printMessage(); } catch (InvalidCommandException e) { InvalidCommandException.printMessage(); + } catch (IOException e) { + System.out.println("Something went wrong: " + e.getMessage()); } - if (!isBye(command)) { userInput = in.nextLine(); } @@ -131,6 +151,52 @@ public static void main(String[] args) { } while (!closeDuke); } + private static String autoSave(Task[] unfilteredTasks, String dukeUpdate) { + for (Task task : unfilteredTasks) { + if (task != null) { + String completionStatus = task.isDone() ? "1" : "0"; + dukeUpdate = dukeUpdate + task.getType() + " | " + completionStatus + " | " + task.getTask(); + dukeUpdate = (task instanceof Deadline || task instanceof Event) ? dukeUpdate + " | " + task.getTime() : dukeUpdate; + dukeUpdate = dukeUpdate + "\n"; + } + } + return dukeUpdate; + } + + private static void loadFile(String filePath) throws FileNotFoundException { + File f = new File(filePath); + Scanner s = new Scanner(f); + while (s.hasNext()) { + loadCommands(s.nextLine()); + } + } + + private static void writeToFile(String filePath, String textToAdd) throws IOException { + FileWriter dukeIn = new FileWriter(filePath); + dukeIn.write(textToAdd); + dukeIn.close(); + } + + private static void loadCommands(String taskDetails) { + String[] taskBreakdown = taskDetails.split(SAVEFILE_SEPERATOR); + String taskType = taskBreakdown[0]; + String completionStatus = taskBreakdown[1]; + String task = taskBreakdown[2]; + String savedInput; + + switch (taskType) { + case "T": + savedInput = "todo " + task; + break; + case "D": + savedInput = "deadline " + task + " /by " + taskBreakdown[3]; + break; + case "E": + savedInput = "event " + task + " /at " + taskBreakdown[3]; + break; + } + } + private static void printGreetings() { System.out.println("\tHello from\n" + LOGO); System.out.println(GREETING); diff --git a/src/main/java/duke/task/Deadline.java b/src/main/java/duke/task/Deadline.java index 6dea1ea1a..4a6bc4987 100644 --- a/src/main/java/duke/task/Deadline.java +++ b/src/main/java/duke/task/Deadline.java @@ -3,12 +3,21 @@ public class Deadline extends Task{ protected String by; + protected String type = "D"; public Deadline(String description, String by){ super (description); this.by = by; } + public String getTime() { + return this.by; + } + + public String getType() { + return type; + } + public String toString() { return "[D]" + super.toString() + " (by: " + by + ")"; } diff --git a/src/main/java/duke/task/Event.java b/src/main/java/duke/task/Event.java index 45e64b44a..471844cd4 100644 --- a/src/main/java/duke/task/Event.java +++ b/src/main/java/duke/task/Event.java @@ -3,12 +3,21 @@ public class Event extends Task { protected String at; + protected String type = "E"; public Event(String description, String at){ super (description); this.at = at; } + public String getTime() { + return this.at; + } + + public String getType() { + return type; + } + public String toString() { return "[E]" + super.toString() + " (at: " + at + ")"; } diff --git a/src/main/java/duke/task/Task.java b/src/main/java/duke/task/Task.java index 2eebf3e9a..36aa18022 100644 --- a/src/main/java/duke/task/Task.java +++ b/src/main/java/duke/task/Task.java @@ -3,6 +3,7 @@ public class Task { protected String task; protected boolean isDone; + protected String type; public Task(String task){ this.task = task; @@ -13,6 +14,22 @@ public String getStatusIcon() { return(isDone ? "[X] " : "[ ] "); } + public boolean isDone() { + return isDone; + } + + public String getTime(){ + return ""; + } + + public String getTask(){ + return task; + } + + public String getType() { + return type; + } + public void markAsDone(){ this.isDone = true; } diff --git a/src/main/java/duke/task/ToDo.java b/src/main/java/duke/task/ToDo.java index e5e7a99e8..59416378b 100644 --- a/src/main/java/duke/task/ToDo.java +++ b/src/main/java/duke/task/ToDo.java @@ -2,10 +2,16 @@ public class ToDo extends Task { + protected String type = "T"; + public ToDo(String description){ super (description); } + public String getType() { + return type; + } + @Override public String toString(){ return "[T]" + super.toString(); From 10c23debe5fcb3195c5ae16c8032f2024848c904 Mon Sep 17 00:00:00 2001 From: Anderson Date: Wed, 15 Sep 2021 05:15:58 +0800 Subject: [PATCH 19/38] Added loadSaved --- src/main/java/duke/Duke.java | 49 ++++++++++++------- .../duke/command/IllegalToDoException.java | 4 +- .../duke/command/InvalidCommandException.java | 4 +- src/main/java/duke/task/Deadline.java | 6 +-- src/main/java/duke/task/Event.java | 4 +- src/main/java/duke/task/Task.java | 12 ++--- src/main/java/duke/task/ToDo.java | 6 +-- 7 files changed, 49 insertions(+), 36 deletions(-) diff --git a/src/main/java/duke/Duke.java b/src/main/java/duke/Duke.java index 75105441a..7201c6736 100644 --- a/src/main/java/duke/Duke.java +++ b/src/main/java/duke/Duke.java @@ -11,15 +11,12 @@ import java.io.FileNotFoundException; import java.io.FileWriter; import java.io.IOException; -import java.sql.SQLOutput; import java.util.Scanner; import java.util.Arrays; -import java.util.HashMap; -import java.util.Map; public class Duke { - public static final String SAVEFILE_SEPERATOR = "|"; + public static final String SAVEFILE_SEPERATOR = "\\|"; public static final String FILE_PATH = "duke.txt"; public static final String LOGO = " ____ _ \n" + "| _ \\ _ _| | _____ \n" @@ -111,12 +108,17 @@ public static void main(String[] args) { userInput = in.nextLine(); boolean closeDuke; - /*try { + try { unfilteredTasks = loadFile(FILE_PATH, unfilteredTasks); - } catch (FileNotFoundException e){ + } catch (FileNotFoundException e) { File dukeCheckpoint = new File(FILE_PATH); + try { + dukeCheckpoint.createNewFile(); + } catch (IOException ex) { + ex.printStackTrace(); + } } -*/ + do { String command = getCommand(userInput); try { @@ -127,6 +129,9 @@ public static void main(String[] args) { doDone(command, unfilteredTasks, userInput); doList(command, unfilteredTasks); + while (unfilteredTasks[unfilteredCounter] != null) { + unfilteredCounter++; + } unfilteredTasks[unfilteredCounter] = isToDo(command) ? new ToDo(newTask) : isDeadline(command) ? new Deadline(newTask, time) : isEvent(command) ? new Event(newTask, time) : null; AcknowledgeAddition(command, unfilteredTasks[unfilteredCounter], unfilteredCounter); @@ -163,12 +168,15 @@ private static String autoSave(Task[] unfilteredTasks, String dukeUpdate) { return dukeUpdate; } - private static void loadFile(String filePath) throws FileNotFoundException { + private static Task[] loadFile(String filePath, Task[] taskList) throws FileNotFoundException { File f = new File(filePath); Scanner s = new Scanner(f); + int countTracker = 0; while (s.hasNext()) { - loadCommands(s.nextLine()); + taskList[countTracker] = loadCommands(s.nextLine()); + countTracker++; } + return taskList; } private static void writeToFile(String filePath, String textToAdd) throws IOException { @@ -177,24 +185,29 @@ private static void writeToFile(String filePath, String textToAdd) throws IOExce dukeIn.close(); } - private static void loadCommands(String taskDetails) { + private static Task loadCommands(String taskDetails) { String[] taskBreakdown = taskDetails.split(SAVEFILE_SEPERATOR); - String taskType = taskBreakdown[0]; - String completionStatus = taskBreakdown[1]; - String task = taskBreakdown[2]; - String savedInput; - + String taskType = taskBreakdown[0].trim(); + String completionStatus = taskBreakdown[1].trim(); + String task = taskBreakdown[2].trim(); + Task savedTask; switch (taskType) { case "T": - savedInput = "todo " + task; + savedTask = new ToDo(task); break; case "D": - savedInput = "deadline " + task + " /by " + taskBreakdown[3]; + savedTask = new Deadline(task, taskBreakdown[3].trim()); break; case "E": - savedInput = "event " + task + " /at " + taskBreakdown[3]; + savedTask = new Event(task, taskBreakdown[3].trim()); break; + default: + savedTask = null; + } + if (completionStatus.equals("1")) { + savedTask.markAsDone(); } + return savedTask; } private static void printGreetings() { diff --git a/src/main/java/duke/command/IllegalToDoException.java b/src/main/java/duke/command/IllegalToDoException.java index 51f64ee61..ab1d49389 100644 --- a/src/main/java/duke/command/IllegalToDoException.java +++ b/src/main/java/duke/command/IllegalToDoException.java @@ -1,9 +1,9 @@ package duke.command; -public class IllegalToDoException extends Exception{ +public class IllegalToDoException extends Exception { //@Override public static void printMessage() { - System.out.println ("\t____________________________________________________________\n" + + System.out.println("\t____________________________________________________________\n" + "\tOOOPS!!! The description of a todo cannot be empty. BIG SADS\n" + "\t____________________________________________________________\n\t"); } diff --git a/src/main/java/duke/command/InvalidCommandException.java b/src/main/java/duke/command/InvalidCommandException.java index 9297a17c5..05596a639 100644 --- a/src/main/java/duke/command/InvalidCommandException.java +++ b/src/main/java/duke/command/InvalidCommandException.java @@ -1,8 +1,8 @@ package duke.command; -public class InvalidCommandException extends Exception{ +public class InvalidCommandException extends Exception { public static void printMessage() { - System.out.println ("\t____________________________________________________________\n" + + System.out.println("\t____________________________________________________________\n" + "\tOOOPS!!! I'm sorry, but I don't know what that means. EPIC SADS :-(\n" + "\t____________________________________________________________\n\t"); } diff --git a/src/main/java/duke/task/Deadline.java b/src/main/java/duke/task/Deadline.java index 4a6bc4987..7c1b19b7b 100644 --- a/src/main/java/duke/task/Deadline.java +++ b/src/main/java/duke/task/Deadline.java @@ -1,12 +1,12 @@ package duke.task; -public class Deadline extends Task{ +public class Deadline extends Task { protected String by; protected String type = "D"; - public Deadline(String description, String by){ - super (description); + public Deadline(String description, String by) { + super(description); this.by = by; } diff --git a/src/main/java/duke/task/Event.java b/src/main/java/duke/task/Event.java index 471844cd4..ee7e7676f 100644 --- a/src/main/java/duke/task/Event.java +++ b/src/main/java/duke/task/Event.java @@ -5,8 +5,8 @@ public class Event extends Task { protected String at; protected String type = "E"; - public Event(String description, String at){ - super (description); + public Event(String description, String at) { + super(description); this.at = at; } diff --git a/src/main/java/duke/task/Task.java b/src/main/java/duke/task/Task.java index 36aa18022..64a755b49 100644 --- a/src/main/java/duke/task/Task.java +++ b/src/main/java/duke/task/Task.java @@ -5,24 +5,24 @@ public class Task { protected boolean isDone; protected String type; - public Task(String task){ + public Task(String task) { this.task = task; this.isDone = false; } public String getStatusIcon() { - return(isDone ? "[X] " : "[ ] "); + return (isDone ? "[X] " : "[ ] "); } public boolean isDone() { return isDone; } - public String getTime(){ + public String getTime() { return ""; } - public String getTask(){ + public String getTask() { return task; } @@ -30,11 +30,11 @@ public String getType() { return type; } - public void markAsDone(){ + public void markAsDone() { this.isDone = true; } - public String toString(){ + public String toString() { return this.getStatusIcon() + this.task; } diff --git a/src/main/java/duke/task/ToDo.java b/src/main/java/duke/task/ToDo.java index 59416378b..59c79a3a9 100644 --- a/src/main/java/duke/task/ToDo.java +++ b/src/main/java/duke/task/ToDo.java @@ -4,8 +4,8 @@ public class ToDo extends Task { protected String type = "T"; - public ToDo(String description){ - super (description); + public ToDo(String description) { + super(description); } public String getType() { @@ -13,7 +13,7 @@ public String getType() { } @Override - public String toString(){ + public String toString() { return "[T]" + super.toString(); } } \ No newline at end of file From c1dbe3017cba171fbbaec46b21d6aa10dcaaf5a0 Mon Sep 17 00:00:00 2001 From: Anderson Date: Wed, 15 Sep 2021 08:54:12 +0800 Subject: [PATCH 20/38] Added EmptyCommand Exception class --- src/main/java/duke/command/EmptyCommand.java | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 src/main/java/duke/command/EmptyCommand.java diff --git a/src/main/java/duke/command/EmptyCommand.java b/src/main/java/duke/command/EmptyCommand.java new file mode 100644 index 000000000..bf9fa47f1 --- /dev/null +++ b/src/main/java/duke/command/EmptyCommand.java @@ -0,0 +1,10 @@ +package duke.command; + +public class EmptyCommand extends Exception { + + public static void printMessage() { + System.out.println("\t____________________________________________________________\n" + + "\tI'm Sorry, what did you say?\n" + + "\t____________________________________________________________\n"); + } +} From 234b54752c3cb0efdd25bbd576d364b0fba83b6a Mon Sep 17 00:00:00 2001 From: Anderson Date: Mon, 27 Sep 2021 06:35:05 +0800 Subject: [PATCH 21/38] Use More OOP: Added Parser, Storage, TaskList, Ui classes. --- src/main/java/duke/Duke.java | 326 ++---------------- .../duke/DukeExceptions/EmptyCommand.java | 10 + .../IllegalToDoException.java | 6 +- .../InvalidCommandException.java | 20 ++ src/main/java/duke/Parser.java | 105 ++++++ src/main/java/duke/Storage.java | 93 +++++ src/main/java/duke/TaskList.java | 59 ++++ src/main/java/duke/Ui.java | 66 ++++ src/main/java/duke/command/EmptyCommand.java | 10 - .../duke/command/InvalidCommandException.java | 9 - src/main/java/duke/task/Task.java | 6 + 11 files changed, 396 insertions(+), 314 deletions(-) create mode 100644 src/main/java/duke/DukeExceptions/EmptyCommand.java rename src/main/java/duke/{command => DukeExceptions}/IllegalToDoException.java (61%) create mode 100644 src/main/java/duke/DukeExceptions/InvalidCommandException.java create mode 100644 src/main/java/duke/Parser.java create mode 100644 src/main/java/duke/Storage.java create mode 100644 src/main/java/duke/TaskList.java create mode 100644 src/main/java/duke/Ui.java delete mode 100644 src/main/java/duke/command/EmptyCommand.java delete mode 100644 src/main/java/duke/command/InvalidCommandException.java diff --git a/src/main/java/duke/Duke.java b/src/main/java/duke/Duke.java index 406cd95ba..1547ca0f0 100644 --- a/src/main/java/duke/Duke.java +++ b/src/main/java/duke/Duke.java @@ -1,321 +1,63 @@ package duke; -import duke.command.EmptyCommand; -import duke.command.IllegalToDoException; -import duke.command.InvalidCommandException; -import duke.task.Deadline; -import duke.task.Event; +import duke.DukeExceptions.EmptyCommand; +import duke.DukeExceptions.InvalidCommandException; import duke.task.Task; -import duke.task.ToDo; -import java.io.File; import java.io.FileNotFoundException; -import java.io.FileWriter; -import java.io.IOException; import java.util.Scanner; import java.util.ArrayList; public class Duke { - public static final String SAVEFILE_SEPERATOR = "\\|"; - public static final String FILE_PATH = "duke.txt"; - public static final String LOGO = " ____ _ \n" - + "| _ \\ _ _| | _____ \n" - + "| | | | | | | |/ / _ \\\n" - + "| |_| | |_| | < __/\n" - + "|____/ \\__,_|_|\\_\\___|\n"; - public static final String LINE = "\t____________________________________________________________\n\t"; - public static final String BYE = LINE - + "Bye. try not to procrastinate!\n" - + LINE; - public static final String GREETING = LINE - + "Hello! I'm Anderson\n\t" - + "What do you need to do?\n" - + LINE; + private Storage storage; + private TaskList tasksLs; + private Ui ui; - public static String getCommand(String userInput) { - if (userInput.length() > 2) { - String[] isolateCommand = userInput.split(" "); - return isolateCommand[0]; - } - return userInput; - } + private Scanner in = new Scanner(System.in); - public static String GetItem(String userInput) throws IllegalToDoException, InvalidCommandException, EmptyCommand { - String item = ""; - String command = getCommand(userInput); - if (isEvent(command)) { - item = notToDoItem(userInput); - } else if (isDeadline(command)) { - item = notToDoItem(userInput); - } else if (isInvalidCommand(command)) { - throw new InvalidCommandException(); - } else if (userInput.length() > 3) { - item = getRequiredSubstring(userInput, " ", 1); - if (item.trim().equals("") || item.equalsIgnoreCase("todo")) { - throw new IllegalToDoException(); - } - } else if (isEmpty(command)) { - throw new EmptyCommand(); - } - return item; - } + /*public Duke(String filepath) { + this.tasksLs = new TaskList(new ArrayList()); + this.storage = new Storage(filepath); + this.ui = new Ui(); + }*/ - private static String getRequiredSubstring(String userInput, String s, int i) { - return userInput.substring(userInput.indexOf(s) + i); + public Duke() { + this.tasksLs = new TaskList(new ArrayList()); + this.storage = new Storage("duke.txt"); + this.ui = new Ui(); } - - private static String notToDoItem(String userInput) { - return userInput.substring(userInput.indexOf(" ") + 1, userInput.indexOf("/")); - } - - public static String getTime(String userInput) { - String time; - String command = getCommand(userInput); - if (isDeadline(command)) { - time = getRequiredSubstring(userInput, "/", 3); - } else if (isEvent(command)) { - time = getRequiredSubstring(userInput, "/", 3); - } else { - return ""; - } - return time; - } - - public static void main(String[] args) { - - ArrayList unfilteredTasks = new ArrayList(); - int unfilteredCounter = 0; - - printGreetings(); - - String userInput; - Scanner in = new Scanner(System.in); - userInput = in.nextLine(); - boolean closeDuke; - + + private void run() { + String input = ""; + ui.greetMessage(); try { - unfilteredTasks = loadFile(FILE_PATH, unfilteredTasks); + tasksLs = storage.loadFile(tasksLs.getList()); } catch (FileNotFoundException e) { - File dukeCheckpoint = new File(FILE_PATH); - try { - dukeCheckpoint.createNewFile(); - } catch (IOException ex) { - ex.printStackTrace(); - } + storage.createFile(); } + boolean closeDuke = false; do { - String command = getCommand(userInput); try { - - String newTask = GetItem(userInput); - String time = getTime(userInput); - String dukeUpdate = ""; - - doDone(command, unfilteredTasks, userInput); - doList(command, unfilteredTasks); - - unfilteredTasks = doDelete(command, unfilteredTasks, userInput); - - unfilteredTasks = addNewTask(command, unfilteredTasks, newTask, time); - AcknowledgeAddition(command, unfilteredTasks); - unfilteredCounter = (isInvalidCommand(command) || isList(command) || isDone(command) || isBye(command)) ? unfilteredCounter : (isDelete(command)) ? unfilteredCounter - 1 : unfilteredCounter + 1; - - dukeUpdate = autoSave(unfilteredTasks, dukeUpdate); - writeToFile(FILE_PATH, dukeUpdate); - - } catch (IllegalToDoException e) { - IllegalToDoException.printMessage(); - } catch (EmptyCommand e) { - EmptyCommand.printMessage(); + input = getInput(); + String parsed = new Parser(tasksLs, ui).parse(input); + System.out.println(parsed); + storage.autoSave(tasksLs.getList()); + closeDuke = input.trim().equals("bye"); } catch (InvalidCommandException e) { - InvalidCommandException.printMessage(); - } catch (IOException e) { - System.out.println("Something went wrong: " + e.getMessage()); - } - - if (!isBye(command)) { - userInput = in.nextLine(); - } - doBye(command); - closeDuke = isBye(command); - } while (!closeDuke); - } - - private static ArrayList addNewTask(String command, ArrayList allTasks, String newTask, String time) { - if (isToDo(command)) { - allTasks.add(new ToDo(newTask)); - } else if (isDeadline(command)) { - allTasks.add(new Deadline(newTask, time)); - } else if (isEvent(command)) { - allTasks.add(new Event(newTask, time)); - } - return allTasks; - } - - private static String autoSave(ArrayList unfilteredTasks, String dukeUpdate) { - for (Task task : unfilteredTasks) { - if (task != null) { - String completionStatus = task.isDone() ? "1" : "0"; - dukeUpdate = dukeUpdate + task.getType() + " | " + completionStatus + " | " + task.getTask(); - dukeUpdate = (task instanceof Deadline || task instanceof Event) ? dukeUpdate + " | " + task.getTime() : dukeUpdate; - dukeUpdate = dukeUpdate + "\n"; - } - } - return dukeUpdate; - } - - private static ArrayList loadFile(String filePath, ArrayList taskList) throws FileNotFoundException { - File f = new File(filePath); - Scanner s = new Scanner(f); - while (s.hasNext()) { - taskList = loadCommands(s.nextLine(), taskList); - } - return taskList; - } - - private static void writeToFile(String filePath, String textToAdd) throws IOException { - FileWriter dukeIn = new FileWriter(filePath); - dukeIn.write(textToAdd); - dukeIn.close(); - } - - private static ArrayList loadCommands(String taskDetails, ArrayList taskList) { - String[] taskBreakdown = taskDetails.split(SAVEFILE_SEPERATOR); - String taskType = taskBreakdown[0].trim(); - String completionStatus = taskBreakdown[1].trim(); - String task = taskBreakdown[2].trim(); - Task savedTask; - switch (taskType) { - case "T": - savedTask = new ToDo(task); - break; - case "D": - savedTask = new Deadline(task, taskBreakdown[3].trim()); - break; - case "E": - savedTask = new Event(task, taskBreakdown[3].trim()); - break; - default: - savedTask = null; - } - if (completionStatus.equals("1")) { - savedTask.markAsDone(); - } - taskList.add(savedTask); - return taskList; - } - - private static void printGreetings() { - System.out.println("\tHello from\n" + LOGO); - System.out.println(GREETING); - } - - private static boolean isToDo(String command) { - return command.equalsIgnoreCase("todo"); - } - - private static boolean isBye(String command) { - return command.equalsIgnoreCase("bye"); - } - - private static boolean isDeadline(String command) { - return command.equalsIgnoreCase("deadline"); - } - - private static boolean isEvent(String command) { - return command.equalsIgnoreCase("event"); - } - - private static boolean isList(String userInput) { - return userInput.equalsIgnoreCase("list"); - } - - private static boolean isDone(String command) { - return command.equalsIgnoreCase("done"); - } - - private static boolean isDelete(String command) { - return command.equalsIgnoreCase("delete"); - } - - private static boolean isEmpty(String userInput) { - return userInput.trim().equals(""); - } - - private static boolean isInvalidCommand(String command) { - return !isEvent(command) && !isDeadline(command) && !isToDo(command) && !isList(command) && !isBye(command) && !isDone(command) && !isDelete(command); - } - - private static void doDone(String command, ArrayList fullTaskList, String userIn) { - if (isDone(command)) { - markedDoneMessage(fullTaskList, userIn); - } - } - - private static ArrayList doDelete(String command, ArrayList fullTaskList, String userIn) { - if (isDelete(command)) { - System.out.println(LINE + "Noted! I've removed this task:"); - int taskNumber = 0; - try { - taskNumber = Integer.parseInt(GetItem(userIn)); - } catch (IllegalToDoException e) { - System.out.println("Invalid ToDo"); - } catch (InvalidCommandException e) { - System.out.println("Invalid Command"); + System.out.println(e.printMessage()); } catch (EmptyCommand e) { - System.out.println("Empty Command"); + System.out.println(e.printMessage()); } - System.out.println(String.format("\t%d.", taskNumber) + fullTaskList.get(taskNumber - 1) + "\n" + String.format("\tNow you have %d tasks in the list.\n", fullTaskList.size() - 1) + LINE); - fullTaskList.remove(taskNumber - 1); - } - return fullTaskList; - } - - private static void doList(String command, ArrayList fullTaskList) { - int count = 0; - if (isList(command)) { - if (fullTaskList.size() == 0) { - System.out.println(LINE + "\tYou had no task to begin with\n" + LINE); - } else { - System.out.println(LINE + "Here are the tasks in your list:\n"); - for (Task task : fullTaskList) { - count++; - System.out.println("\t" + count + "." + task); - } - System.out.println(LINE); - } - } - } - - private static void doBye(String command) { - if (isBye(command)) { - System.out.println(BYE); - } + } while (!closeDuke); } - private static void markedDoneMessage(ArrayList unfilteredTasks, String userInput) { - System.out.println(LINE + "Nice! I've marked this task as done:"); - int taskNumber = 0; - try { - taskNumber = Integer.parseInt(GetItem(userInput)); - } catch (IllegalToDoException e) { - System.out.println("Invalid ToDo"); - } catch (InvalidCommandException e) { - System.out.println("Invalid Command"); - } catch (EmptyCommand e) { - System.out.println("Empty Command"); - } - Task completedTask = unfilteredTasks.get(taskNumber - 1); - completedTask.markAsDone(); - System.out.println("\t\t" + completedTask + "\n" + LINE); + private String getInput() { + return in.nextLine(); } - private static void AcknowledgeAddition(String command, ArrayList unfilteredTasks) { - if (isToDo(command) || isDeadline(command) || isEvent(command)) { - System.out.println(LINE + "Got it. I've added this task:\t"); - System.out.println(String.format("\t%d.", unfilteredTasks.size()) + unfilteredTasks.get(unfilteredTasks.size() - 1) + "\n" + String.format("\tNow you have %d tasks in the list.\n", unfilteredTasks.size()) + LINE); - } + public static void main(String[] args) { + new Duke().run(); } } diff --git a/src/main/java/duke/DukeExceptions/EmptyCommand.java b/src/main/java/duke/DukeExceptions/EmptyCommand.java new file mode 100644 index 000000000..caa050c89 --- /dev/null +++ b/src/main/java/duke/DukeExceptions/EmptyCommand.java @@ -0,0 +1,10 @@ +package duke.DukeExceptions; + +public class EmptyCommand extends Exception { + + public String printMessage() { + return ("\t____________________________________________________________\n" + + "\tI'm Sorry, what did you say? It seems command was Empty\n" + + "\t____________________________________________________________\n"); + } +} diff --git a/src/main/java/duke/command/IllegalToDoException.java b/src/main/java/duke/DukeExceptions/IllegalToDoException.java similarity index 61% rename from src/main/java/duke/command/IllegalToDoException.java rename to src/main/java/duke/DukeExceptions/IllegalToDoException.java index ab1d49389..571a0b230 100644 --- a/src/main/java/duke/command/IllegalToDoException.java +++ b/src/main/java/duke/DukeExceptions/IllegalToDoException.java @@ -1,9 +1,9 @@ -package duke.command; +package duke.DukeExceptions; public class IllegalToDoException extends Exception { //@Override - public static void printMessage() { - System.out.println("\t____________________________________________________________\n" + + public String printMessage() { + return ("\t____________________________________________________________\n" + "\tOOOPS!!! The description of a todo cannot be empty. BIG SADS\n" + "\t____________________________________________________________\n\t"); } diff --git a/src/main/java/duke/DukeExceptions/InvalidCommandException.java b/src/main/java/duke/DukeExceptions/InvalidCommandException.java new file mode 100644 index 000000000..6df210d8f --- /dev/null +++ b/src/main/java/duke/DukeExceptions/InvalidCommandException.java @@ -0,0 +1,20 @@ +package duke.DukeExceptions; + +public class InvalidCommandException extends Exception { + private String thisError; + + public InvalidCommandException() { + this.thisError = ("\t____________________________________________________________\n" + + "\tOOOPS!!! I'm sorry, but I don't know what that means. EPIC SADS :-(\n" + + "\t____________________________________________________________\n\t"); + } + + public InvalidCommandException(String errorMessage) { + this.thisError = ("\t____________________________________________________________\n\t" + + errorMessage + + "\n\t____________________________________________________________\n\t"); + } + public String printMessage() { + return (this.thisError); + } +} diff --git a/src/main/java/duke/Parser.java b/src/main/java/duke/Parser.java new file mode 100644 index 000000000..e30465985 --- /dev/null +++ b/src/main/java/duke/Parser.java @@ -0,0 +1,105 @@ +package duke; + +import duke.DukeExceptions.EmptyCommand; +import duke.DukeExceptions.IllegalToDoException; +import duke.DukeExceptions.InvalidCommandException; +import duke.task.Deadline; +import duke.task.Event; +import duke.task.Task; +import duke.task.ToDo; + +public class Parser { + private TaskList taskList; + private Ui ui; + private String[] command; + + Parser(TaskList taskList, Ui ui) { + this.taskList = taskList; + this.ui = ui; + } + + public String parse(String userInput) throws InvalidCommandException, EmptyCommand { + try { + if (userInput.trim().equals("")) + throw new EmptyCommand(); + command = userInput.split(" "); + switch (command[0].trim().toLowerCase()) { + case "bye": + return parseBye(); + case "done": + return parseDone(userInput); + case "delete": + return parseDelete(getIndex(userInput)); + case "todo": + return parseTodo(userInput); + case "deadline": + return parseDeadline(userInput); + case "event": + return parseEvent(userInput); + case "list": + return parseList(); + default: + throw new InvalidCommandException("No command detected, check if you input commands correctly :)"); + } + } catch (InvalidCommandException e) { + return e.printMessage(); + } + } + + public String parseBye() { + return ui.byeMessage(); + } + + public String parseDone(String command) { + assert command.split(" ").length == 2 : "Format: [done] [number]"; + Task completedTask = taskList.markAsDone(command); + return ui.doneMessage(completedTask); + } + + public String parseDelete(int index) { + Task targetTask = taskList.deleteTask(index); + return ui.deleteMessage(taskList.getList(), index, targetTask); + } + + public String parseTodo(String command) { + taskList.addTask(new ToDo(taskList.getTodo(command))); + return ui.acknowledgeAddition(taskList.getList()); + } + + public String parseDeadline(String command) { + taskList.addTask(new Deadline(taskList.getDescription(command), taskList.getDate(command))); + return ui.acknowledgeAddition(taskList.getList()); + } + + public String parseEvent(String command) { + taskList.addTask(new Event(taskList.getDescription(command), taskList.getDate(command))); + return ui.acknowledgeAddition(taskList.getList()); + } + + public String parseList() { + return ui.printList(taskList); + } + + private static int getIndex(String command) { + String index = command.substring(command.indexOf(" ") + 1); + return Integer.parseInt(index.trim()); + } +} + +// String item = ""; +// String command = getCommand(userInput); +// if (isEvent(command)) { +// item = notToDoItem(userInput); +// } else if (isDeadline(command)) { +// item = notToDoItem(userInput); +// } else if (isInvalidCommand(command)) { +// throw new InvalidCommandException(); +// } else if (userInput.length() > 3) { +// item = getRequiredSubstring(userInput, " ", 1); +// if (item.trim().equals("") || item.equalsIgnoreCase("todo")) { +// throw new IllegalToDoException(); +// } +// } else if (isEmpty(command)) { +// throw new EmptyCommand(); +// } +// return item; diff --git a/src/main/java/duke/Storage.java b/src/main/java/duke/Storage.java new file mode 100644 index 000000000..684c55cd3 --- /dev/null +++ b/src/main/java/duke/Storage.java @@ -0,0 +1,93 @@ +package duke; + +import duke.task.Deadline; +import duke.task.Event; +import duke.task.Task; +import duke.task.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 Storage { + + private String filepath; + private TaskList currentData; + + public static final String SAVEFILE_SEPERATOR = "\\|"; + + Storage(String filepath) { + this.filepath = filepath; + } + + public TaskList loadFile(ArrayList taskList) throws FileNotFoundException { + File f = new File(this.filepath); + Scanner s = new Scanner(f); + currentData = new TaskList(taskList); + while (s.hasNext()) { + currentData = loadCommands(s.nextLine(), currentData.getList()); + } + return currentData; + } + + public void createFile() { + File f = new File(this.filepath); + try { + f.createNewFile(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + private static TaskList loadCommands(String taskDetails, ArrayList taskList) { + String[] taskBreakdown = taskDetails.split(SAVEFILE_SEPERATOR); + String taskType = taskBreakdown[0].trim(); + String completionStatus = taskBreakdown[1].trim(); + String task = taskBreakdown[2].trim(); + Task savedTask; + switch (taskType) { + case "T": + savedTask = new ToDo(task); + break; + case "D": + savedTask = new Deadline(task, taskBreakdown[3].trim()); + break; + case "E": + savedTask = new Event(task, taskBreakdown[3].trim()); + break; + default: + savedTask = null; + } + if (completionStatus.equals("1")) { + savedTask.markAsDone(); + } + taskList.add(savedTask); + return new TaskList(taskList); + } + + private void writeToFile(String filePath, String textToAdd) throws IOException { + FileWriter dukeIn = new FileWriter(filePath); + dukeIn.write(textToAdd); + dukeIn.close(); + } + + public void autoSave(ArrayList unfilteredTasks) { + String dukeUpdate = ""; + for (Task task : unfilteredTasks) { + if (task != null) { + String completionStatus = task.isDone() ? "1" : "0"; + dukeUpdate = dukeUpdate + task.getType() + " | " + completionStatus + " | " + task.getTask(); + dukeUpdate = (task instanceof Deadline || task instanceof Event) ? dukeUpdate + " | " + task.getTime() : dukeUpdate; + dukeUpdate = dukeUpdate + "\n"; + } + } + try { + writeToFile(this.filepath, dukeUpdate); + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/duke/TaskList.java b/src/main/java/duke/TaskList.java new file mode 100644 index 000000000..7cb7c3d4f --- /dev/null +++ b/src/main/java/duke/TaskList.java @@ -0,0 +1,59 @@ +package duke; + +import duke.task.Task; + +import java.util.ArrayList; + +public class TaskList { + private ArrayList list; + + TaskList(ArrayList list) { + this.list = list; + } + + public void addTask (Task newTask) { + this.list.add(newTask); + } + + public ArrayList getList() { + return list; + } + + public Task markAsDone(String command) { + int index = getIndex(command) - 1; + Task completedTask = list.get(index); + completedTask.markAsDone(); + list.get(index).markAsDone(); + return completedTask; + } + + public Task deleteTask(int index) { + Task targetTask = list.get(index - 1); + list.remove(index - 1); + return targetTask; + } + + public static String getTodo (String command) { + String item = command.substring(command.indexOf(" ") + 1); + return item; + } + + public String getDescription (String command) { + String desc = command.substring(command.indexOf(" ") + 1, command.indexOf("/")); + return desc; + } + + public String getDate (String command) { + String date = command.substring(command.indexOf("/") + 4); + return date; + } + + public Task getTask(int index) { + return list.get(index); + } + + private static int getIndex(String command) { + String index = command.substring(command.indexOf(" ") + 1); + return Integer.parseInt(index.trim()); + } +} diff --git a/src/main/java/duke/Ui.java b/src/main/java/duke/Ui.java new file mode 100644 index 000000000..ef57f3bed --- /dev/null +++ b/src/main/java/duke/Ui.java @@ -0,0 +1,66 @@ +package duke; + +import duke.task.Task; + +import java.util.ArrayList; + +public class Ui { + public static final String LOGO = " ____ _ \n" + + "| _ \\ _ _| | _____ \n" + + "| | | | | | | |/ / _ \\\n" + + "| |_| | |_| | < __/\n" + + "|____/ \\__,_|_|\\_\\___|\n"; + public static final String LINE = "\t____________________________________________________________\n\t"; + public static final String BYE = LINE + + "Bye. try not to procrastinate!\n" + + LINE; + public static final String GREETING = LINE + + "Hello! I'm Anderson\n\t" + + "What do you need to do?\n" + + LINE; + + public void greetMessage() { + System.out.println(LOGO + GREETING); + } + + public String byeMessage() { + return BYE; + } + + public String doneMessage(Task completedTask) { + return (LINE + + "Nice, I've marked this task as Done:" + + "\t\t" + completedTask + "\n" + + LINE); + } + + public String deleteMessage(ArrayList taskList, int taskNumber, Task targetTask){ + return (LINE + "Noted! I've removed this task:" + + String.format("\n\t%d.", taskNumber) + targetTask + String.format("\n\tNow you have %d tasks in the list.\n", taskList.size()) + LINE); + } + + public String printList(TaskList taskList) { + int count = 0; + String outputString = ""; + if (taskList.getList().size() == 0) { + outputString = (LINE + "\tThere is no task in List\n" + LINE); + } else { + outputString = (LINE + "Here are the tasks in your list:\n"); + for (Task task : taskList.getList()) { + count++; + outputString += ("\t" + count + "." + task + "\n"); + } + outputString += LINE; + } + return outputString; + } + + public String acknowledgeAddition(ArrayList taskArrayList) { + return (LINE + + "Got it. I've added this task:\n" + + String.format("\t%d.", taskArrayList.size()) + taskArrayList.get(taskArrayList.size() - 1) + "\n" + + String.format("\tNow you have %d tasks in the list.\n", taskArrayList.size()) + + LINE); + } + +} diff --git a/src/main/java/duke/command/EmptyCommand.java b/src/main/java/duke/command/EmptyCommand.java deleted file mode 100644 index bf9fa47f1..000000000 --- a/src/main/java/duke/command/EmptyCommand.java +++ /dev/null @@ -1,10 +0,0 @@ -package duke.command; - -public class EmptyCommand extends Exception { - - public static void printMessage() { - System.out.println("\t____________________________________________________________\n" + - "\tI'm Sorry, what did you say?\n" + - "\t____________________________________________________________\n"); - } -} diff --git a/src/main/java/duke/command/InvalidCommandException.java b/src/main/java/duke/command/InvalidCommandException.java deleted file mode 100644 index 05596a639..000000000 --- a/src/main/java/duke/command/InvalidCommandException.java +++ /dev/null @@ -1,9 +0,0 @@ -package duke.command; - -public class InvalidCommandException extends Exception { - public static void printMessage() { - System.out.println("\t____________________________________________________________\n" + - "\tOOOPS!!! I'm sorry, but I don't know what that means. EPIC SADS :-(\n" + - "\t____________________________________________________________\n\t"); - } -} diff --git a/src/main/java/duke/task/Task.java b/src/main/java/duke/task/Task.java index 64a755b49..f6fd39c7d 100644 --- a/src/main/java/duke/task/Task.java +++ b/src/main/java/duke/task/Task.java @@ -1,10 +1,16 @@ package duke.task; +import duke.TaskList; +import duke.Ui; + public class Task { protected String task; protected boolean isDone; protected String type; + private Ui ui; + private TaskList taskList; + public Task(String task) { this.task = task; this.isDone = false; From 713890557473d0307308be0e867dc48b7a7b9d7d Mon Sep 17 00:00:00 2001 From: Anderson Date: Mon, 27 Sep 2021 21:08:39 +0800 Subject: [PATCH 22/38] Added DukeExceptions class. Improved exception handling to handle more exceptions. --- src/main/java/duke/Duke.java | 6 +- .../duke/DukeExceptions/DukeException.java | 7 ++ .../duke/DukeExceptions/EmptyCommand.java | 6 +- .../DukeExceptions/IllegalToDoException.java | 2 +- .../InvalidCommandException.java | 4 +- .../DukeExceptions/InvalidValueException.java | 17 +++++ src/main/java/duke/Parser.java | 74 +++++++++++-------- src/main/java/duke/TaskList.java | 15 +++- src/main/java/duke/Ui.java | 2 +- 9 files changed, 91 insertions(+), 42 deletions(-) create mode 100644 src/main/java/duke/DukeExceptions/DukeException.java create mode 100644 src/main/java/duke/DukeExceptions/InvalidValueException.java diff --git a/src/main/java/duke/Duke.java b/src/main/java/duke/Duke.java index 1547ca0f0..b7a50727a 100644 --- a/src/main/java/duke/Duke.java +++ b/src/main/java/duke/Duke.java @@ -12,9 +12,9 @@ public class Duke { private Storage storage; private TaskList tasksLs; - private Ui ui; + private final Ui ui; - private Scanner in = new Scanner(System.in); + private final Scanner in = new Scanner(System.in); /*public Duke(String filepath) { this.tasksLs = new TaskList(new ArrayList()); @@ -27,7 +27,7 @@ public Duke() { this.storage = new Storage("duke.txt"); this.ui = new Ui(); } - + private void run() { String input = ""; ui.greetMessage(); diff --git a/src/main/java/duke/DukeExceptions/DukeException.java b/src/main/java/duke/DukeExceptions/DukeException.java new file mode 100644 index 000000000..6beedc131 --- /dev/null +++ b/src/main/java/duke/DukeExceptions/DukeException.java @@ -0,0 +1,7 @@ +package duke.DukeExceptions; + +public class DukeException extends Exception{ + public String printMessage() { + return "Something Went Wrong"; + } +} diff --git a/src/main/java/duke/DukeExceptions/EmptyCommand.java b/src/main/java/duke/DukeExceptions/EmptyCommand.java index caa050c89..c44ef0891 100644 --- a/src/main/java/duke/DukeExceptions/EmptyCommand.java +++ b/src/main/java/duke/DukeExceptions/EmptyCommand.java @@ -1,10 +1,12 @@ package duke.DukeExceptions; -public class EmptyCommand extends Exception { +public class EmptyCommand extends DukeException { public String printMessage() { return ("\t____________________________________________________________\n" + - "\tI'm Sorry, what did you say? It seems command was Empty\n" + + "\tNo command detected. Command was empty :)\n" + + "\t____________________________________________________________\n" + + "\tKey in [help] to list available commands\n" + "\t____________________________________________________________\n"); } } diff --git a/src/main/java/duke/DukeExceptions/IllegalToDoException.java b/src/main/java/duke/DukeExceptions/IllegalToDoException.java index 571a0b230..12a0f96aa 100644 --- a/src/main/java/duke/DukeExceptions/IllegalToDoException.java +++ b/src/main/java/duke/DukeExceptions/IllegalToDoException.java @@ -1,6 +1,6 @@ package duke.DukeExceptions; -public class IllegalToDoException extends Exception { +public class IllegalToDoException extends DukeException { //@Override public String printMessage() { return ("\t____________________________________________________________\n" + diff --git a/src/main/java/duke/DukeExceptions/InvalidCommandException.java b/src/main/java/duke/DukeExceptions/InvalidCommandException.java index 6df210d8f..be8f92d7e 100644 --- a/src/main/java/duke/DukeExceptions/InvalidCommandException.java +++ b/src/main/java/duke/DukeExceptions/InvalidCommandException.java @@ -1,11 +1,13 @@ package duke.DukeExceptions; -public class InvalidCommandException extends Exception { +public class InvalidCommandException extends DukeException { private String thisError; public InvalidCommandException() { this.thisError = ("\t____________________________________________________________\n" + "\tOOOPS!!! I'm sorry, but I don't know what that means. EPIC SADS :-(\n" + + "\t____________________________________________________________\n" + + "\tKey in [help] to list available commands\n" + "\t____________________________________________________________\n\t"); } diff --git a/src/main/java/duke/DukeExceptions/InvalidValueException.java b/src/main/java/duke/DukeExceptions/InvalidValueException.java new file mode 100644 index 000000000..13db9c295 --- /dev/null +++ b/src/main/java/duke/DukeExceptions/InvalidValueException.java @@ -0,0 +1,17 @@ +package duke.DukeExceptions; + +import duke.Duke; + +public class InvalidValueException extends DukeException { + private String errorMessage; + + public InvalidValueException(String expectedMessage) { + this.errorMessage = ("\t____________________________________________________________\n\t" + + expectedMessage + + "\n\t____________________________________________________________\n\t"); + } + + public String printMessage() { + return this.errorMessage; + } +} diff --git a/src/main/java/duke/Parser.java b/src/main/java/duke/Parser.java index e30465985..d82a35068 100644 --- a/src/main/java/duke/Parser.java +++ b/src/main/java/duke/Parser.java @@ -1,8 +1,9 @@ package duke; +import duke.DukeExceptions.DukeException; import duke.DukeExceptions.EmptyCommand; -import duke.DukeExceptions.IllegalToDoException; import duke.DukeExceptions.InvalidCommandException; +import duke.DukeExceptions.InvalidValueException; import duke.task.Deadline; import duke.task.Event; import duke.task.Task; @@ -29,7 +30,7 @@ public String parse(String userInput) throws InvalidCommandException, EmptyComma case "done": return parseDone(userInput); case "delete": - return parseDelete(getIndex(userInput)); + return parseDelete(userInput); case "todo": return parseTodo(userInput); case "deadline": @@ -39,9 +40,9 @@ public String parse(String userInput) throws InvalidCommandException, EmptyComma case "list": return parseList(); default: - throw new InvalidCommandException("No command detected, check if you input commands correctly :)"); + throw new InvalidCommandException(); } - } catch (InvalidCommandException e) { + } catch (DukeException e) { return e.printMessage(); } } @@ -50,29 +51,37 @@ public String parseBye() { return ui.byeMessage(); } - public String parseDone(String command) { - assert command.split(" ").length == 2 : "Format: [done] [number]"; + public String parseDone(String command) throws InvalidValueException { + validate(command); Task completedTask = taskList.markAsDone(command); return ui.doneMessage(completedTask); } - public String parseDelete(int index) { + public String parseDelete(String command) throws InvalidValueException { + validate(command); + int index = getIndex(command); Task targetTask = taskList.deleteTask(index); return ui.deleteMessage(taskList.getList(), index, targetTask); } - public String parseTodo(String command) { + public String parseTodo(String command) throws InvalidValueException { + if (command.split(" ").length == 1) + throw new InvalidValueException("Todo: Missing Description, Please Try Again"); taskList.addTask(new ToDo(taskList.getTodo(command))); return ui.acknowledgeAddition(taskList.getList()); } - public String parseDeadline(String command) { - taskList.addTask(new Deadline(taskList.getDescription(command), taskList.getDate(command))); + public String parseDeadline(String command) throws InvalidValueException { + if (command.split(" ").length == 1) + throw new InvalidValueException("Deadline: Missing Description / Time"); + taskList.addTask(new Deadline(taskList.getDescription(command), taskList.getMoreDetails(command))); return ui.acknowledgeAddition(taskList.getList()); } - public String parseEvent(String command) { - taskList.addTask(new Event(taskList.getDescription(command), taskList.getDate(command))); + public String parseEvent(String command) throws InvalidValueException { + if (command.split(" ").length == 1) + throw new InvalidValueException("Event: Missing Description / Time"); + taskList.addTask(new Event(taskList.getDescription(command), taskList.getMoreDetails(command))); return ui.acknowledgeAddition(taskList.getList()); } @@ -84,22 +93,27 @@ private static int getIndex(String command) { String index = command.substring(command.indexOf(" ") + 1); return Integer.parseInt(index.trim()); } -} -// String item = ""; -// String command = getCommand(userInput); -// if (isEvent(command)) { -// item = notToDoItem(userInput); -// } else if (isDeadline(command)) { -// item = notToDoItem(userInput); -// } else if (isInvalidCommand(command)) { -// throw new InvalidCommandException(); -// } else if (userInput.length() > 3) { -// item = getRequiredSubstring(userInput, " ", 1); -// if (item.trim().equals("") || item.equalsIgnoreCase("todo")) { -// throw new IllegalToDoException(); -// } -// } else if (isEmpty(command)) { -// throw new EmptyCommand(); -// } -// return item; + private boolean isNumeric(String validate) { + try { + Integer.parseInt(validate); + } catch (NumberFormatException e) { + return false; + } + return true; + } + + private void validate(String command) throws InvalidValueException { + String[] temp; + temp = command.split(" "); + if (temp.length == 1) { + throw new InvalidValueException("Missing Item Number"); + } else if (temp.length > 2) { + throw new InvalidValueException("Please be specific :) Expected 1 item number"); + } else if (!isNumeric(temp[1])) { + throw new InvalidValueException("Oops, could you input item as a number please"); + } else if (getIndex(command) > this.taskList.getList().size() | getIndex(command) < 1) { + throw new InvalidValueException(String.format("Input Number was more that [1 - %d] tasks in the list.", taskList.getList().size())); + } + } +} \ No newline at end of file diff --git a/src/main/java/duke/TaskList.java b/src/main/java/duke/TaskList.java index 7cb7c3d4f..85dbb2ee3 100644 --- a/src/main/java/duke/TaskList.java +++ b/src/main/java/duke/TaskList.java @@ -1,5 +1,6 @@ package duke; +import duke.DukeExceptions.InvalidValueException; import duke.task.Task; import java.util.ArrayList; @@ -38,14 +39,20 @@ public static String getTodo (String command) { return item; } - public String getDescription (String command) { + public String getDescription (String command) throws InvalidValueException { + if (!command.contains("/")) + throw new InvalidValueException("Missing detail demarcator: [/by ] or [/at ]"); String desc = command.substring(command.indexOf(" ") + 1, command.indexOf("/")); + if (desc.trim().equals("")) + throw new InvalidValueException("Missing Description in command"); return desc; } - public String getDate (String command) { - String date = command.substring(command.indexOf("/") + 4); - return date; + public String getMoreDetails(String command) throws InvalidValueException{ + String moreDetails = command.substring(command.indexOf("/") + 4); + if (moreDetails.trim().equals("")) + throw new InvalidValueException("Missing Required Extra Details"); + return moreDetails; } public Task getTask(int index) { diff --git a/src/main/java/duke/Ui.java b/src/main/java/duke/Ui.java index ef57f3bed..64984f8b1 100644 --- a/src/main/java/duke/Ui.java +++ b/src/main/java/duke/Ui.java @@ -29,7 +29,7 @@ public String byeMessage() { public String doneMessage(Task completedTask) { return (LINE - + "Nice, I've marked this task as Done:" + + "Nice, I've marked this task as Done:\n" + "\t\t" + completedTask + "\n" + LINE); } From bc637b2f8101bc1ee9cdbf4ef8a81987a17e377e Mon Sep 17 00:00:00 2001 From: Anderson Date: Mon, 27 Sep 2021 23:28:18 +0800 Subject: [PATCH 23/38] Added optional for user: DateTime Format --- src/main/java/duke/Duke.java | 6 +-- .../duke/DukeExceptions/DukeException.java | 2 +- .../duke/DukeExceptions/EmptyCommand.java | 2 +- .../DukeExceptions/IllegalToDoException.java | 2 +- .../InvalidCommandException.java | 2 +- .../DukeExceptions/InvalidValueException.java | 2 +- src/main/java/duke/Parser.java | 14 +++---- src/main/java/duke/Storage.java | 2 +- src/main/java/duke/TaskList.java | 39 ++++++++++++++++++- src/main/java/duke/task/Deadline.java | 2 +- src/main/java/duke/task/Event.java | 2 +- src/main/java/duke/task/Task.java | 8 +--- 12 files changed, 54 insertions(+), 29 deletions(-) diff --git a/src/main/java/duke/Duke.java b/src/main/java/duke/Duke.java index b7a50727a..0d11c0dd0 100644 --- a/src/main/java/duke/Duke.java +++ b/src/main/java/duke/Duke.java @@ -45,10 +45,8 @@ private void run() { System.out.println(parsed); storage.autoSave(tasksLs.getList()); closeDuke = input.trim().equals("bye"); - } catch (InvalidCommandException e) { - System.out.println(e.printMessage()); - } catch (EmptyCommand e) { - System.out.println(e.printMessage()); + } catch (InvalidCommandException | EmptyCommand e) { + System.out.println(e); } } while (!closeDuke); } diff --git a/src/main/java/duke/DukeExceptions/DukeException.java b/src/main/java/duke/DukeExceptions/DukeException.java index 6beedc131..9bdbb6497 100644 --- a/src/main/java/duke/DukeExceptions/DukeException.java +++ b/src/main/java/duke/DukeExceptions/DukeException.java @@ -1,7 +1,7 @@ package duke.DukeExceptions; public class DukeException extends Exception{ - public String printMessage() { + public String toString() { return "Something Went Wrong"; } } diff --git a/src/main/java/duke/DukeExceptions/EmptyCommand.java b/src/main/java/duke/DukeExceptions/EmptyCommand.java index c44ef0891..9f1f4e927 100644 --- a/src/main/java/duke/DukeExceptions/EmptyCommand.java +++ b/src/main/java/duke/DukeExceptions/EmptyCommand.java @@ -2,7 +2,7 @@ public class EmptyCommand extends DukeException { - public String printMessage() { + public String toString() { return ("\t____________________________________________________________\n" + "\tNo command detected. Command was empty :)\n" + "\t____________________________________________________________\n" + diff --git a/src/main/java/duke/DukeExceptions/IllegalToDoException.java b/src/main/java/duke/DukeExceptions/IllegalToDoException.java index 12a0f96aa..659af7dba 100644 --- a/src/main/java/duke/DukeExceptions/IllegalToDoException.java +++ b/src/main/java/duke/DukeExceptions/IllegalToDoException.java @@ -2,7 +2,7 @@ public class IllegalToDoException extends DukeException { //@Override - public String printMessage() { + public String toString() { return ("\t____________________________________________________________\n" + "\tOOOPS!!! The description of a todo cannot be empty. BIG SADS\n" + "\t____________________________________________________________\n\t"); diff --git a/src/main/java/duke/DukeExceptions/InvalidCommandException.java b/src/main/java/duke/DukeExceptions/InvalidCommandException.java index be8f92d7e..c76cab44a 100644 --- a/src/main/java/duke/DukeExceptions/InvalidCommandException.java +++ b/src/main/java/duke/DukeExceptions/InvalidCommandException.java @@ -16,7 +16,7 @@ public InvalidCommandException(String errorMessage) { + errorMessage + "\n\t____________________________________________________________\n\t"); } - public String printMessage() { + public String toString() { return (this.thisError); } } diff --git a/src/main/java/duke/DukeExceptions/InvalidValueException.java b/src/main/java/duke/DukeExceptions/InvalidValueException.java index 13db9c295..755b5e960 100644 --- a/src/main/java/duke/DukeExceptions/InvalidValueException.java +++ b/src/main/java/duke/DukeExceptions/InvalidValueException.java @@ -11,7 +11,7 @@ public InvalidValueException(String expectedMessage) { + "\n\t____________________________________________________________\n\t"); } - public String printMessage() { + public String toString() { return this.errorMessage; } } diff --git a/src/main/java/duke/Parser.java b/src/main/java/duke/Parser.java index d82a35068..72d419991 100644 --- a/src/main/java/duke/Parser.java +++ b/src/main/java/duke/Parser.java @@ -1,18 +1,16 @@ package duke; -import duke.DukeExceptions.DukeException; -import duke.DukeExceptions.EmptyCommand; -import duke.DukeExceptions.InvalidCommandException; -import duke.DukeExceptions.InvalidValueException; +import duke.DukeExceptions.*; import duke.task.Deadline; import duke.task.Event; import duke.task.Task; import duke.task.ToDo; +import java.time.format.DateTimeParseException; + public class Parser { private TaskList taskList; private Ui ui; - private String[] command; Parser(TaskList taskList, Ui ui) { this.taskList = taskList; @@ -23,7 +21,7 @@ public String parse(String userInput) throws InvalidCommandException, EmptyComma try { if (userInput.trim().equals("")) throw new EmptyCommand(); - command = userInput.split(" "); + String[] command = userInput.split(" "); switch (command[0].trim().toLowerCase()) { case "bye": return parseBye(); @@ -42,8 +40,8 @@ public String parse(String userInput) throws InvalidCommandException, EmptyComma default: throw new InvalidCommandException(); } - } catch (DukeException e) { - return e.printMessage(); + } catch (DukeException | DateTimeParseException e) { + return e.toString(); } } diff --git a/src/main/java/duke/Storage.java b/src/main/java/duke/Storage.java index 684c55cd3..0cae195b5 100644 --- a/src/main/java/duke/Storage.java +++ b/src/main/java/duke/Storage.java @@ -80,7 +80,7 @@ public void autoSave(ArrayList unfilteredTasks) { if (task != null) { String completionStatus = task.isDone() ? "1" : "0"; dukeUpdate = dukeUpdate + task.getType() + " | " + completionStatus + " | " + task.getTask(); - dukeUpdate = (task instanceof Deadline || task instanceof Event) ? dukeUpdate + " | " + task.getTime() : dukeUpdate; + dukeUpdate = (task instanceof Deadline || task instanceof Event) ? dukeUpdate + " | " + task.getMoreDetails() : dukeUpdate; dukeUpdate = dukeUpdate + "\n"; } } diff --git a/src/main/java/duke/TaskList.java b/src/main/java/duke/TaskList.java index 85dbb2ee3..b12c54b73 100644 --- a/src/main/java/duke/TaskList.java +++ b/src/main/java/duke/TaskList.java @@ -3,6 +3,10 @@ import duke.DukeExceptions.InvalidValueException; import duke.task.Task; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; import java.util.ArrayList; public class TaskList { @@ -35,8 +39,7 @@ public Task deleteTask(int index) { } public static String getTodo (String command) { - String item = command.substring(command.indexOf(" ") + 1); - return item; + return command.substring(command.indexOf(" ") + 1); } public String getDescription (String command) throws InvalidValueException { @@ -52,6 +55,38 @@ public String getMoreDetails(String command) throws InvalidValueException{ String moreDetails = command.substring(command.indexOf("/") + 4); if (moreDetails.trim().equals("")) throw new InvalidValueException("Missing Required Extra Details"); + if (moreDetails.trim().contains("/")) { + moreDetails = getCorrectFormat(moreDetails); + } + return moreDetails; + } + + private String getCorrectFormat(String moreDetails) { + + StringBuilder toParse = new StringBuilder(); + String[] dateTime = moreDetails.split(" "); + String[] tempDate = dateTime[0].trim().split("/"); + + for (int i=2; i > 0; i--) { + toParse.append(tempDate[i]).append("-"); + } + LocalDate date = LocalDate.parse(toParse + tempDate[0]); + moreDetails = date.format(DateTimeFormatter.ofPattern("MMM d yyyy")) + " "; + + if (dateTime.length > 1) { + toParse = new StringBuilder(); + int missingDigits = 6 - dateTime[1].trim().length(); + for (int i = 0; i < dateTime[1].trim().length(); i++) { + char c = dateTime[1].charAt(i); + toParse.append((i != 0 && i % 2 == 0) ? ":" + c : c); + } + for (int i=0 ; i Date: Tue, 28 Sep 2021 00:54:30 +0800 Subject: [PATCH 24/38] Added Find function --- src/main/java/duke/Parser.java | 16 +++++++++++++++- src/main/java/duke/TaskList.java | 12 +++++++++++- src/main/java/duke/Ui.java | 21 +++++++++++++++++++++ 3 files changed, 47 insertions(+), 2 deletions(-) diff --git a/src/main/java/duke/Parser.java b/src/main/java/duke/Parser.java index d82a35068..a290c07ac 100644 --- a/src/main/java/duke/Parser.java +++ b/src/main/java/duke/Parser.java @@ -25,6 +25,8 @@ public String parse(String userInput) throws InvalidCommandException, EmptyComma throw new EmptyCommand(); command = userInput.split(" "); switch (command[0].trim().toLowerCase()) { + case "help": + return parseHelp(); case "bye": return parseBye(); case "done": @@ -39,6 +41,8 @@ public String parse(String userInput) throws InvalidCommandException, EmptyComma return parseEvent(userInput); case "list": return parseList(); + case "find": + return parseFind(userInput); default: throw new InvalidCommandException(); } @@ -46,6 +50,9 @@ public String parse(String userInput) throws InvalidCommandException, EmptyComma return e.printMessage(); } } + public String parseHelp() { + return ui.helpList(); + } public String parseBye() { return ui.byeMessage(); @@ -67,7 +74,7 @@ public String parseDelete(String command) throws InvalidValueException { public String parseTodo(String command) throws InvalidValueException { if (command.split(" ").length == 1) throw new InvalidValueException("Todo: Missing Description, Please Try Again"); - taskList.addTask(new ToDo(taskList.getTodo(command))); + taskList.addTask(new ToDo(taskList.getItem(command))); return ui.acknowledgeAddition(taskList.getList()); } @@ -116,4 +123,11 @@ private void validate(String command) throws InvalidValueException { throw new InvalidValueException(String.format("Input Number was more that [1 - %d] tasks in the list.", taskList.getList().size())); } } + + public String parseFind(String command) throws InvalidValueException { + if (taskList.getList().size()==0) + return ui.printList(taskList); + String keyword = taskList.getItem(command); + return ui.findResults(keyword, taskList); + } } \ No newline at end of file diff --git a/src/main/java/duke/TaskList.java b/src/main/java/duke/TaskList.java index 85dbb2ee3..9a64dfd92 100644 --- a/src/main/java/duke/TaskList.java +++ b/src/main/java/duke/TaskList.java @@ -34,7 +34,7 @@ public Task deleteTask(int index) { return targetTask; } - public static String getTodo (String command) { + public static String getItem(String command) { String item = command.substring(command.indexOf(" ") + 1); return item; } @@ -59,6 +59,16 @@ public Task getTask(int index) { return list.get(index); } + public String find(String keyword) { + int count = 0; + String result = ""; + for (Task task : list) { + count += 1; + result += (task.getTask().contains(keyword)) ? String.format("\t%d. ", count) + task + "\n": "" ; + } + return result; + } + private static int getIndex(String command) { String index = command.substring(command.indexOf(" ") + 1); return Integer.parseInt(index.trim()); diff --git a/src/main/java/duke/Ui.java b/src/main/java/duke/Ui.java index 64984f8b1..65dd3f34a 100644 --- a/src/main/java/duke/Ui.java +++ b/src/main/java/duke/Ui.java @@ -63,4 +63,25 @@ public String acknowledgeAddition(ArrayList taskArrayList) { + LINE); } + public String helpList() { + return (LINE + + "Here are the list of commands Available in Duke:\n\t" + + LINE + + "bye : closes Programme\n\t" + + "list : lists out every Task stored in the savefile\n\t" + + "todo : Adds a new ToDo to the Task List\n\t" + + "deadline : Adds a new Deadline to the Task List\n\t" + + "event : Adds a new Event to the Task List\n\t" + + "find : Lists all tasks that contains a keyword\n\t" + + LINE); + } + + public String findResults(String keyword, TaskList taskList) { + String results = taskList.find(keyword); + return (LINE + + "Find Results of [" + keyword + "]:\n" + + results + + LINE); + } + } From 0aae49d302d9d0cbd3b0dc51b0ae36b0c7d127c7 Mon Sep 17 00:00:00 2001 From: Anderson Date: Tue, 28 Sep 2021 04:42:39 +0800 Subject: [PATCH 25/38] Added JavaDoc --- src/main/java/duke/Duke.java | 27 ++++--- .../duke/DukeExceptions/DukeException.java | 7 +- .../duke/DukeExceptions/EmptyCommand.java | 5 +- .../DukeExceptions/IllegalToDoException.java | 4 +- .../InvalidCommandException.java | 10 ++- .../DukeExceptions/InvalidValueException.java | 7 +- src/main/java/duke/Parser.java | 78 ++++++++++++++++++- src/main/java/duke/Storage.java | 38 ++++++++- src/main/java/duke/TaskList.java | 59 ++++++++++++++ src/main/java/duke/Ui.java | 34 ++++++++ src/main/java/duke/task/Deadline.java | 21 +++++ src/main/java/duke/task/Event.java | 17 ++++ src/main/java/duke/task/Task.java | 38 +++++++++ src/main/java/duke/task/ToDo.java | 10 +++ 14 files changed, 337 insertions(+), 18 deletions(-) diff --git a/src/main/java/duke/Duke.java b/src/main/java/duke/Duke.java index b7a50727a..539aa9ecd 100644 --- a/src/main/java/duke/Duke.java +++ b/src/main/java/duke/Duke.java @@ -16,21 +16,21 @@ public class Duke { private final Scanner in = new Scanner(System.in); - /*public Duke(String filepath) { - this.tasksLs = new TaskList(new ArrayList()); - this.storage = new Storage(filepath); - this.ui = new Ui(); - }*/ - + /** + * A constructor to initiate Duke. + */ public Duke() { this.tasksLs = new TaskList(new ArrayList()); this.storage = new Storage("duke.txt"); this.ui = new Ui(); } + /** + * Runs Duke object until user exits with . + */ private void run() { - String input = ""; ui.greetMessage(); + String input = ""; try { tasksLs = storage.loadFile(tasksLs.getList()); } catch (FileNotFoundException e) { @@ -46,17 +46,26 @@ private void run() { storage.autoSave(tasksLs.getList()); closeDuke = input.trim().equals("bye"); } catch (InvalidCommandException e) { - System.out.println(e.printMessage()); + System.out.println(e.toString()); } catch (EmptyCommand e) { - System.out.println(e.printMessage()); + System.out.println(e.toString()); } } while (!closeDuke); } + /** + * Prompts user for input. + * + * @return String input by user. + */ private String getInput() { return in.nextLine(); } + /** + * application. + * @param args to start Duke Application. + */ public static void main(String[] args) { new Duke().run(); } diff --git a/src/main/java/duke/DukeExceptions/DukeException.java b/src/main/java/duke/DukeExceptions/DukeException.java index 6beedc131..9eb39efe8 100644 --- a/src/main/java/duke/DukeExceptions/DukeException.java +++ b/src/main/java/duke/DukeExceptions/DukeException.java @@ -1,7 +1,12 @@ package duke.DukeExceptions; public class DukeException extends Exception{ - public String printMessage() { + /** + * convert to new default Exception message. + * + * @return error Message. + */ + public String toString() { return "Something Went Wrong"; } } diff --git a/src/main/java/duke/DukeExceptions/EmptyCommand.java b/src/main/java/duke/DukeExceptions/EmptyCommand.java index c44ef0891..18604c5b8 100644 --- a/src/main/java/duke/DukeExceptions/EmptyCommand.java +++ b/src/main/java/duke/DukeExceptions/EmptyCommand.java @@ -2,7 +2,10 @@ public class EmptyCommand extends DukeException { - public String printMessage() { + /** + * @return Empty input Message. + */ + public String toString() { return ("\t____________________________________________________________\n" + "\tNo command detected. Command was empty :)\n" + "\t____________________________________________________________\n" + diff --git a/src/main/java/duke/DukeExceptions/IllegalToDoException.java b/src/main/java/duke/DukeExceptions/IllegalToDoException.java index 12a0f96aa..e5c61aee8 100644 --- a/src/main/java/duke/DukeExceptions/IllegalToDoException.java +++ b/src/main/java/duke/DukeExceptions/IllegalToDoException.java @@ -1,8 +1,8 @@ package duke.DukeExceptions; public class IllegalToDoException extends DukeException { - //@Override - public String printMessage() { + @Override + public String toString() { return ("\t____________________________________________________________\n" + "\tOOOPS!!! The description of a todo cannot be empty. BIG SADS\n" + "\t____________________________________________________________\n\t"); diff --git a/src/main/java/duke/DukeExceptions/InvalidCommandException.java b/src/main/java/duke/DukeExceptions/InvalidCommandException.java index be8f92d7e..0b9e848a6 100644 --- a/src/main/java/duke/DukeExceptions/InvalidCommandException.java +++ b/src/main/java/duke/DukeExceptions/InvalidCommandException.java @@ -3,6 +3,9 @@ public class InvalidCommandException extends DukeException { private String thisError; + /** + * Default Constructor. + */ public InvalidCommandException() { this.thisError = ("\t____________________________________________________________\n" + "\tOOOPS!!! I'm sorry, but I don't know what that means. EPIC SADS :-(\n" @@ -11,12 +14,17 @@ public InvalidCommandException() { + "\t____________________________________________________________\n\t"); } + /** + * Constructor with custom errorMessage. + * + * @param errorMessage error Message to train Elgle. + */ public InvalidCommandException(String errorMessage) { this.thisError = ("\t____________________________________________________________\n\t" + errorMessage + "\n\t____________________________________________________________\n\t"); } - public String printMessage() { + public String toString() { return (this.thisError); } } diff --git a/src/main/java/duke/DukeExceptions/InvalidValueException.java b/src/main/java/duke/DukeExceptions/InvalidValueException.java index 13db9c295..ffb02426d 100644 --- a/src/main/java/duke/DukeExceptions/InvalidValueException.java +++ b/src/main/java/duke/DukeExceptions/InvalidValueException.java @@ -11,7 +11,12 @@ public InvalidValueException(String expectedMessage) { + "\n\t____________________________________________________________\n\t"); } - public String printMessage() { + /** + * convert to new default Exception message. + * + * @return error Message. + */ + public String toString() { return this.errorMessage; } } diff --git a/src/main/java/duke/Parser.java b/src/main/java/duke/Parser.java index d82a35068..557ff0d09 100644 --- a/src/main/java/duke/Parser.java +++ b/src/main/java/duke/Parser.java @@ -14,11 +14,25 @@ public class Parser { private Ui ui; private String[] command; + /** + * Constructor to create Parser object. + * + * @param taskList TaskList that is currently in use. + * @param ui Ui object. + */ Parser(TaskList taskList, Ui ui) { this.taskList = taskList; this.ui = ui; } + /** + * Breakdown user input to run user commands. + * + * @param userInput String input from user. + * @return Executed command ui. + * @throws InvalidCommandException if there are no recognisable command. + * @throws EmptyCommand if the input is empty. + */ public String parse(String userInput) throws InvalidCommandException, EmptyCommand { try { if (userInput.trim().equals("")) @@ -43,20 +57,39 @@ public String parse(String userInput) throws InvalidCommandException, EmptyComma throw new InvalidCommandException(); } } catch (DukeException e) { - return e.printMessage(); + return e.toString(); } } + /** + * Execute "bye" command. + * + * @return "bye" message. + */ public String parseBye() { return ui.byeMessage(); } + /** + * Execute "done" command. + * + * @param command Input from user. + * @return "done" message. + * @throws InvalidValueException if user input is in the wrong format. + */ public String parseDone(String command) throws InvalidValueException { validate(command); Task completedTask = taskList.markAsDone(command); return ui.doneMessage(completedTask); } + /** + * Execute "delete" command. + * + * @param command Input from user. + * * @return "deleted" message. + * * @throws InvalidValueException if user input is in the wrong format. + */ public String parseDelete(String command) throws InvalidValueException { validate(command); int index = getIndex(command); @@ -64,6 +97,13 @@ public String parseDelete(String command) throws InvalidValueException { return ui.deleteMessage(taskList.getList(), index, targetTask); } + /** + * Execute "Todo" command. + * + * @param command Input from user. + * @return String acknowledging new addition. + * @throws InvalidValueException if user input is in the wrong format. + */ public String parseTodo(String command) throws InvalidValueException { if (command.split(" ").length == 1) throw new InvalidValueException("Todo: Missing Description, Please Try Again"); @@ -71,6 +111,13 @@ public String parseTodo(String command) throws InvalidValueException { return ui.acknowledgeAddition(taskList.getList()); } + /** + * Execute "deadlinee" command. + * + * @param command Input from user. + * @return String acknowledging new addition. + * @throws InvalidValueException if user input is in the wrong format. + */ public String parseDeadline(String command) throws InvalidValueException { if (command.split(" ").length == 1) throw new InvalidValueException("Deadline: Missing Description / Time"); @@ -78,6 +125,13 @@ public String parseDeadline(String command) throws InvalidValueException { return ui.acknowledgeAddition(taskList.getList()); } + /** + * Execute "event" command. + * + * @param command Input from user. + * @return String acknowledging new addition. + * @throws InvalidValueException if user input is in the wrong format. + */ public String parseEvent(String command) throws InvalidValueException { if (command.split(" ").length == 1) throw new InvalidValueException("Event: Missing Description / Time"); @@ -85,15 +139,31 @@ public String parseEvent(String command) throws InvalidValueException { return ui.acknowledgeAddition(taskList.getList()); } + /** + * Execute "list" command. + * @return List in form of String. + */ public String parseList() { return ui.printList(taskList); } + /** + * Reetrieve index in command as integer. + * + * @param command Input from user. + * @return Extracted Integer. + */ private static int getIndex(String command) { String index = command.substring(command.indexOf(" ") + 1); return Integer.parseInt(index.trim()); } + /** + * Checks if input is numeric. + * + * @param validate Input that requires validation. + * @return true for input that is numeric and false for non numeric. + */ private boolean isNumeric(String validate) { try { Integer.parseInt(validate); @@ -103,6 +173,12 @@ private boolean isNumeric(String validate) { return true; } + /** + * Throw all possible Exceptions that might crash the programme. + * + * @param command Input from user. + * @throws InvalidValueException if user input is in the wrong format. + */ private void validate(String command) throws InvalidValueException { String[] temp; temp = command.split(" "); diff --git a/src/main/java/duke/Storage.java b/src/main/java/duke/Storage.java index 684c55cd3..304b91e4d 100644 --- a/src/main/java/duke/Storage.java +++ b/src/main/java/duke/Storage.java @@ -19,10 +19,22 @@ public class Storage { public static final String SAVEFILE_SEPERATOR = "\\|"; + /** + * Constructor to create Storage object. + * + * @param filepath intended filepath to store data. + */ Storage(String filepath) { this.filepath = filepath; } + /** + * Read file and extract file into TaskList. + * + * @param taskList Most Recent ArrayList taskList. + * @return Latest TaskList. + * @throws FileNotFoundException if file has never been created. + */ public TaskList loadFile(ArrayList taskList) throws FileNotFoundException { File f = new File(this.filepath); Scanner s = new Scanner(f); @@ -33,6 +45,9 @@ public TaskList loadFile(ArrayList taskList) throws FileNotFoundException return currentData; } + /** + * Creates a new file. + */ public void createFile() { File f = new File(this.filepath); try { @@ -42,6 +57,13 @@ public void createFile() { } } + /** + * Convert stored line of data into current TaskList. + * + * @param taskDetails Saved data from save file. + * @param taskList Current ArrayList task List. + * @return Current TaskList. + */ private static TaskList loadCommands(String taskDetails, ArrayList taskList) { String[] taskBreakdown = taskDetails.split(SAVEFILE_SEPERATOR); String taskType = taskBreakdown[0].trim(); @@ -68,15 +90,27 @@ private static TaskList loadCommands(String taskDetails, ArrayList taskLis return new TaskList(taskList); } + /** + * Input stored data into save file. + * + * @param filePath filePath of save file. + * @param textToAdd String to be written. + * @throws IOException when Run into execution. + */ private void writeToFile(String filePath, String textToAdd) throws IOException { FileWriter dukeIn = new FileWriter(filePath); dukeIn.write(textToAdd); dukeIn.close(); } - public void autoSave(ArrayList unfilteredTasks) { + /** + * Automatically ArrayList Tasks. + * + * @param taskArrayList current ArrayList. + */ + public void autoSave(ArrayList taskArrayList) { String dukeUpdate = ""; - for (Task task : unfilteredTasks) { + for (Task task : taskArrayList) { if (task != null) { String completionStatus = task.isDone() ? "1" : "0"; dukeUpdate = dukeUpdate + task.getType() + " | " + completionStatus + " | " + task.getTask(); diff --git a/src/main/java/duke/TaskList.java b/src/main/java/duke/TaskList.java index 85dbb2ee3..8862bdfb3 100644 --- a/src/main/java/duke/TaskList.java +++ b/src/main/java/duke/TaskList.java @@ -8,18 +8,39 @@ public class TaskList { private ArrayList list; + /** + * Constructor to create TaskList object. + * + * @param list is the current list of Task. + */ TaskList(ArrayList list) { this.list = list; } + /** + * Adds task to TaskList. + * + * @param newTask that user wants to add. + */ public void addTask (Task newTask) { this.list.add(newTask); } + /** + * Retrieves list of Tasks stored as ArrayList. + * + * @return list of Tasks stored in TaskList object. + */ public ArrayList getList() { return list; } + /** + * Sets isDone of tasks specified to true. + * + * @param command input by user. + * @return task specified as done. + */ public Task markAsDone(String command) { int index = getIndex(command) - 1; Task completedTask = list.get(index); @@ -28,17 +49,36 @@ public Task markAsDone(String command) { return completedTask; } + /** + * Deletes tasks from TaskList. + * + * @param index number of the task in list. + * @return deleted task. + */ public Task deleteTask(int index) { Task targetTask = list.get(index - 1); list.remove(index - 1); return targetTask; } + /** + * Retrieves the target items after user command + * + * @param command target items (Description or find target). + * @return target items. + */ public static String getTodo (String command) { String item = command.substring(command.indexOf(" ") + 1); return item; } + /** + * Retrieves the description of task in user input. + * + * @param command input from user. + * @return description of task. + * @throws InvalidValueException when missing demarcators, or missing description in command. + */ public String getDescription (String command) throws InvalidValueException { if (!command.contains("/")) throw new InvalidValueException("Missing detail demarcator: [/by ] or [/at ]"); @@ -48,6 +88,13 @@ public String getDescription (String command) throws InvalidValueException { return desc; } + /** + * Retrieves extra details needed. + * + * @param command input from user. + * @return extra details required. + * @throws InvalidValueException when missing extra details required in command. + */ public String getMoreDetails(String command) throws InvalidValueException{ String moreDetails = command.substring(command.indexOf("/") + 4); if (moreDetails.trim().equals("")) @@ -55,10 +102,22 @@ public String getMoreDetails(String command) throws InvalidValueException{ return moreDetails; } + /** + * Retrieves the task numbered the same as index in the TaskList. + * + * @param index of task to retrieve. + * @return task + */ public Task getTask(int index) { return list.get(index); } + /** + * Retrieve user input item as integer. + * + * @param command input from user + * @return index found in input + */ private static int getIndex(String command) { String index = command.substring(command.indexOf(" ") + 1); return Integer.parseInt(index.trim()); diff --git a/src/main/java/duke/Ui.java b/src/main/java/duke/Ui.java index 64984f8b1..bb93fd433 100644 --- a/src/main/java/duke/Ui.java +++ b/src/main/java/duke/Ui.java @@ -19,14 +19,28 @@ public class Ui { + "What do you need to do?\n" + LINE; + /** + * prints message to greet user. + */ public void greetMessage() { System.out.println(LOGO + GREETING); } + /** + * Retrieves bye Message. + * + * @return bye Message. + */ public String byeMessage() { return BYE; } + /** + * Acknowledge marking task as done. + * + * @param completedTask + * @return + */ public String doneMessage(Task completedTask) { return (LINE + "Nice, I've marked this task as Done:\n" @@ -34,11 +48,25 @@ public String doneMessage(Task completedTask) { + LINE); } + /** + * Acknowledge deletion of task from list of tasks. + * + * @param taskList ArrayList of Task. + * @param taskNumber Index number of target Task. + * @param targetTask Task to remove. + * @return Acknowledgement message. + */ public String deleteMessage(ArrayList taskList, int taskNumber, Task targetTask){ return (LINE + "Noted! I've removed this task:" + String.format("\n\t%d.", taskNumber) + targetTask + String.format("\n\tNow you have %d tasks in the list.\n", taskList.size()) + LINE); } + /*** + * Retrieves list in String form. + * + * @param taskList current TaskList. + * @return String of list. + */ public String printList(TaskList taskList) { int count = 0; String outputString = ""; @@ -55,6 +83,12 @@ public String printList(TaskList taskList) { return outputString; } + /** + * Retrieve acknowledgement message of new tasks to list. + * + * @param taskArrayList ArrayList of tasks. + * @return Acknowledgement of addition message. + */ public String acknowledgeAddition(ArrayList taskArrayList) { return (LINE + "Got it. I've added this task:\n" diff --git a/src/main/java/duke/task/Deadline.java b/src/main/java/duke/task/Deadline.java index 7c1b19b7b..2bb7c0d85 100644 --- a/src/main/java/duke/task/Deadline.java +++ b/src/main/java/duke/task/Deadline.java @@ -5,19 +5,40 @@ public class Deadline extends Task { protected String by; protected String type = "D"; + /** + * Constructor to create Deadline object. + * + * @param description Deadline description. + * @param by The time the deadline is due. + */ public Deadline(String description, String by) { super(description); this.by = by; } + /** + * Retrieve timings of deadlines. + * + * @return timings of the Deadline. + */ public String getTime() { return this.by; } + /** + * Retrieve the task type. + * + * @return Task type: "D". + */ public String getType() { return type; } + /** + * Overrides string representation to display. + * + * @return string representation to display. + */ public String toString() { return "[D]" + super.toString() + " (by: " + by + ")"; } diff --git a/src/main/java/duke/task/Event.java b/src/main/java/duke/task/Event.java index ee7e7676f..6934431bc 100644 --- a/src/main/java/duke/task/Event.java +++ b/src/main/java/duke/task/Event.java @@ -5,19 +5,36 @@ public class Event extends Task { protected String at; protected String type = "E"; + /** + * Constructor to create Event object. + * + * @param description Event description. + * @param at Event timings. + */ public Event(String description, String at) { super(description); this.at = at; } + /** + * Retrieve timings of events. + * + * @return timings of the Event. + */ public String getTime() { return this.at; } + /** + * Retrieve the task type. + * + * @return Task type: "E". + */ public String getType() { return type; } + @Override public String toString() { return "[E]" + super.toString() + " (at: " + at + ")"; } diff --git a/src/main/java/duke/task/Task.java b/src/main/java/duke/task/Task.java index f6fd39c7d..cc3e162d3 100644 --- a/src/main/java/duke/task/Task.java +++ b/src/main/java/duke/task/Task.java @@ -11,35 +11,73 @@ public class Task { private Ui ui; private TaskList taskList; + /** + * Constructor to create Task object + * + * @param task Description of the task + */ public Task(String task) { this.task = task; this.isDone = false; } + /** + * Retrieves "[X]" for tasks marked done or "[ ]" for tasks not marked done. + * + * @return Either "[X]" or "[ ]". + */ public String getStatusIcon() { return (isDone ? "[X] " : "[ ] "); } + /** + * Records if task is marked done. + * + * @return Status of the task. + */ public boolean isDone() { return isDone; } + /** + * Retrieve timings (if any) of deadlines or events. + * + * @return timings (if any) of the task. + */ public String getTime() { return ""; } + /** + * Retrieve description of the task. + * + * @return description of the task. + */ public String getTask() { return task; } + /** + * Retrieve the task type. + * + * @return Task type. + */ public String getType() { return type; } + /** + * set isDone to true. + */ public void markAsDone() { this.isDone = true; } + /** + * Overrides string representation to display. + * + * @return string representation to display. + */ public String toString() { return this.getStatusIcon() + this.task; } diff --git a/src/main/java/duke/task/ToDo.java b/src/main/java/duke/task/ToDo.java index 59c79a3a9..58a6fbf87 100644 --- a/src/main/java/duke/task/ToDo.java +++ b/src/main/java/duke/task/ToDo.java @@ -4,10 +4,20 @@ public class ToDo extends Task { protected String type = "T"; + /** + * Constructor to create ToDo object. + * + * @param description ToDo description. + */ public ToDo(String description) { super(description); } + /** + * Retrieve the task type. + * + * @return Task type: "T". + */ public String getType() { return type; } From c9ae39be0725f5363d56c632764953490902c58d Mon Sep 17 00:00:00 2001 From: Anderson Date: Tue, 28 Sep 2021 16:20:13 +0800 Subject: [PATCH 26/38] Improved DateTime formatting. Can now save to file in correct format. --- src/main/java/duke/Parser.java | 26 ++++++++++-- src/main/java/duke/TaskList.java | 53 ++++++++---------------- src/main/java/duke/Ui.java | 35 +++++++++++++--- src/main/java/duke/task/Deadline.java | 58 +++++++++++++++++++++++++- src/main/java/duke/task/Event.java | 59 ++++++++++++++++++++++++++- 5 files changed, 182 insertions(+), 49 deletions(-) diff --git a/src/main/java/duke/Parser.java b/src/main/java/duke/Parser.java index 0335691c5..c42f7eaf0 100644 --- a/src/main/java/duke/Parser.java +++ b/src/main/java/duke/Parser.java @@ -58,10 +58,18 @@ public String parse(String userInput) throws InvalidCommandException, EmptyComma default: throw new InvalidCommandException(); } - } catch (DukeException | DateTimeParseException e) { + } catch (DukeException e) { return e.toString(); + } catch (DateTimeParseException e) { + return ui.dateTimeFormat(); } } + + /** + * execute "help" command + * + * @return list of all commands available + */ public String parseHelp() { return ui.helpList(); } @@ -84,8 +92,8 @@ public String parseBye() { */ public String parseDone(String command) throws InvalidValueException { validate(command); - Task completedTask = taskList.markAsDone(command); - return ui.doneMessage(completedTask); + String statusMessage = taskList.markAsDone(command); + return ui.doneMessage(statusMessage); } /** @@ -126,6 +134,8 @@ public String parseTodo(String command) throws InvalidValueException { public String parseDeadline(String command) throws InvalidValueException { if (command.split(" ").length == 1) throw new InvalidValueException("Deadline: Missing Description / Time"); + if (command.split("/").length == 3) + throw new InvalidValueException("Please input Date in the following format: dd/mm/yyyy"); taskList.addTask(new Deadline(taskList.getDescription(command), taskList.getMoreDetails(command))); return ui.acknowledgeAddition(taskList.getList()); } @@ -140,6 +150,8 @@ public String parseDeadline(String command) throws InvalidValueException { public String parseEvent(String command) throws InvalidValueException { if (command.split(" ").length == 1) throw new InvalidValueException("Event: Missing Description / Time"); + if (command.split("/").length == 3) + throw new InvalidValueException("Please input Date in the following format: dd/mm/yyyy"); taskList.addTask(new Event(taskList.getDescription(command), taskList.getMoreDetails(command))); return ui.acknowledgeAddition(taskList.getList()); } @@ -198,7 +210,13 @@ private void validate(String command) throws InvalidValueException { } } - public String parseFind(String command) throws InvalidValueException { + /** + * Execute "find" command. + * + * @param command Input from user. + * @return List of all items found with keyword. + */ + public String parseFind(String command) { if (taskList.getList().size()==0) return ui.printList(taskList); String keyword = taskList.getItem(command); diff --git a/src/main/java/duke/TaskList.java b/src/main/java/duke/TaskList.java index 613ea4cff..4b5f10059 100644 --- a/src/main/java/duke/TaskList.java +++ b/src/main/java/duke/TaskList.java @@ -21,6 +21,14 @@ public class TaskList { this.list = list; } + public int notDoneCount() { + int unmarked = 0; + for (Task task : list) { + unmarked += (task.isDone()) ? 0 : 1; + } + return unmarked; + } + /** * Adds task to TaskList. * @@ -45,12 +53,14 @@ public ArrayList getList() { * @param command input by user. * @return task specified as done. */ - public Task markAsDone(String command) { + public String markAsDone(String command) { int index = getIndex(command) - 1; Task completedTask = list.get(index); + if (completedTask.isDone()) + return "Done Previously"; completedTask.markAsDone(); list.get(index).markAsDone(); - return completedTask; + return completedTask.toString(); } /** @@ -71,7 +81,7 @@ public Task deleteTask(int index) { * @param command target items (Description or find target). * @return target items. */ - public static String getTodo (String command) { + public static String getItem(String command) { return command.substring(command.indexOf(" ") + 1); } @@ -100,40 +110,8 @@ public String getDescription (String command) throws InvalidValueException { */ public String getMoreDetails(String command) throws InvalidValueException{ String moreDetails = command.substring(command.indexOf("/") + 4); - if (moreDetails.trim().equals("")) + if (moreDetails.trim().equals("") | moreDetails.trim().contains("\t")) throw new InvalidValueException("Missing Required Extra Details"); - if (moreDetails.trim().contains("/")) { - moreDetails = getCorrectFormat(moreDetails); - } - return moreDetails; - } - - private String getCorrectFormat(String moreDetails) { - - StringBuilder toParse = new StringBuilder(); - String[] dateTime = moreDetails.split(" "); - String[] tempDate = dateTime[0].trim().split("/"); - - for (int i=2; i > 0; i--) { - toParse.append(tempDate[i]).append("-"); - } - LocalDate date = LocalDate.parse(toParse + tempDate[0]); - moreDetails = date.format(DateTimeFormatter.ofPattern("MMM d yyyy")) + " "; - - if (dateTime.length > 1) { - toParse = new StringBuilder(); - int missingDigits = 6 - dateTime[1].trim().length(); - for (int i = 0; i < dateTime[1].trim().length(); i++) { - char c = dateTime[1].charAt(i); - toParse.append((i != 0 && i % 2 == 0) ? ":" + c : c); - } - for (int i=0 ; i taskArrayList) { public String helpList() { return (LINE + - "Here are the list of commands Available in Duke:\n\t" + + "Here are the list of commands Available in Duke:\n" + LINE + "bye : closes Programme\n\t" + "list : lists out every Task stored in the savefile\n\t" + "todo : Adds a new ToDo to the Task List\n\t" + "deadline : Adds a new Deadline to the Task List\n\t" + "event : Adds a new Event to the Task List\n\t" + - "find : Lists all tasks that contains a keyword\n\t" + + "find : Lists all tasks that contains a keyword\n" + LINE); } + /** + * Retrieves list of tasks containing keywords. + * + * @param keyword Extracted keyword from user. + * @param taskList Current TaskList object. + * @return list of tasks containing keywords. + */ public String findResults(String keyword, TaskList taskList) { String results = taskList.find(keyword); return (LINE + @@ -118,4 +130,15 @@ public String findResults(String keyword, TaskList taskList) { LINE); } + /** + * Retrieves correct format for Date/Time input. + * + * @return Correct format for Date/Time input. + */ + public String dateTimeFormat() { + return ("\t____________________________________________________________\n\t" + + "Date / Time input format should be: dd/mm/yyyy hhmmss" + + "\n\t____________________________________________________________\n\t"); + } + } diff --git a/src/main/java/duke/task/Deadline.java b/src/main/java/duke/task/Deadline.java index eb90c505c..ea4dc30b9 100644 --- a/src/main/java/duke/task/Deadline.java +++ b/src/main/java/duke/task/Deadline.java @@ -1,9 +1,15 @@ package duke.task; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; + public class Deadline extends Task { protected String by; protected String type = "D"; + protected LocalDate date; + protected LocalTime time; /** * Constructor to create Deadline object. @@ -14,6 +20,56 @@ public class Deadline extends Task { public Deadline(String description, String by) { super(description); this.by = by; + if (by.trim().contains("/")) { + String formattedBy = getCorrectFormat(by); + String[] tempStr = formattedBy.split(" "); + this.date = LocalDate.parse(tempStr[0]); + if (tempStr.length==2) + this.time = LocalTime.parse(tempStr[1]); + } + } + + /** + * Retrieve correct format to parse into LocalDate and LocalTime. + * + * @param by stored by String. + * @return correct format to parse into LocalDate and Local Time. + */ + private String getCorrectFormat(String by){ + + StringBuilder toParse = new StringBuilder(); + String[] dateTime = by.split(" "); + String[] tempDate = dateTime[0].trim().split("/"); + String toStore = ""; + if (tempDate.length == 3){ + for (int i = 2; i > 0; i--) { + toParse.append(tempDate[i]).append("-"); + } + toParse.append(tempDate[0]); + toStore += toParse + " "; + } + if (dateTime.length > 1) { + toParse = new StringBuilder(); + int missingDigits = 6 - dateTime[1].trim().length(); + for (int i = 0; i < dateTime[1].trim().length(); i++) { + char c = dateTime[1].charAt(i); + toParse.append((i != 0 && i % 2 == 0) ? ":" + c : c); + } + for (int i=0 ; i 0; i--) { + toParse.append(tempDate[i]).append("-"); + } + toParse.append(tempDate[0]); + toStore += toParse + " "; + } + + if (dateTime.length > 1) { + toParse = new StringBuilder(); + int missingDigits = 6 - dateTime[1].trim().length(); + for (int i = 0; i < dateTime[1].trim().length(); i++) { + char c = dateTime[1].charAt(i); + toParse.append((i != 0 && i % 2 == 0) ? ":" + c : c); + } + for (int i=0 ; i Date: Tue, 28 Sep 2021 16:24:20 +0800 Subject: [PATCH 27/38] Followed code style --- .../duke/DukeExceptions/DukeException.java | 2 +- .../DukeExceptions/IllegalToDoException.java | 10 ---- .../InvalidCommandException.java | 1 + src/main/java/duke/TaskList.java | 8 +-- src/main/java/duke/Ui.java | 58 +++++++++---------- src/main/java/duke/task/Deadline.java | 12 ++-- src/main/java/duke/task/Event.java | 12 ++-- 7 files changed, 47 insertions(+), 56 deletions(-) delete mode 100644 src/main/java/duke/DukeExceptions/IllegalToDoException.java diff --git a/src/main/java/duke/DukeExceptions/DukeException.java b/src/main/java/duke/DukeExceptions/DukeException.java index 9eb39efe8..35394b006 100644 --- a/src/main/java/duke/DukeExceptions/DukeException.java +++ b/src/main/java/duke/DukeExceptions/DukeException.java @@ -1,6 +1,6 @@ package duke.DukeExceptions; -public class DukeException extends Exception{ +public class DukeException extends Exception { /** * convert to new default Exception message. * diff --git a/src/main/java/duke/DukeExceptions/IllegalToDoException.java b/src/main/java/duke/DukeExceptions/IllegalToDoException.java deleted file mode 100644 index e5c61aee8..000000000 --- a/src/main/java/duke/DukeExceptions/IllegalToDoException.java +++ /dev/null @@ -1,10 +0,0 @@ -package duke.DukeExceptions; - -public class IllegalToDoException extends DukeException { - @Override - public String toString() { - return ("\t____________________________________________________________\n" + - "\tOOOPS!!! The description of a todo cannot be empty. BIG SADS\n" + - "\t____________________________________________________________\n\t"); - } -} diff --git a/src/main/java/duke/DukeExceptions/InvalidCommandException.java b/src/main/java/duke/DukeExceptions/InvalidCommandException.java index 0b9e848a6..724ba173a 100644 --- a/src/main/java/duke/DukeExceptions/InvalidCommandException.java +++ b/src/main/java/duke/DukeExceptions/InvalidCommandException.java @@ -24,6 +24,7 @@ public InvalidCommandException(String errorMessage) { + errorMessage + "\n\t____________________________________________________________\n\t"); } + public String toString() { return (this.thisError); } diff --git a/src/main/java/duke/TaskList.java b/src/main/java/duke/TaskList.java index 4b5f10059..cd3845c4a 100644 --- a/src/main/java/duke/TaskList.java +++ b/src/main/java/duke/TaskList.java @@ -34,7 +34,7 @@ public int notDoneCount() { * * @param newTask that user wants to add. */ - public void addTask (Task newTask) { + public void addTask(Task newTask) { this.list.add(newTask); } @@ -92,7 +92,7 @@ public static String getItem(String command) { * @return description of task. * @throws InvalidValueException when missing demarcators, or missing description in command. */ - public String getDescription (String command) throws InvalidValueException { + public String getDescription(String command) throws InvalidValueException { if (!command.contains("/")) throw new InvalidValueException("Missing detail demarcator: [/by ] or [/at ]"); String desc = command.substring(command.indexOf(" ") + 1, command.indexOf("/")); @@ -108,7 +108,7 @@ public String getDescription (String command) throws InvalidValueException { * @return extra details required. * @throws InvalidValueException when missing extra details required in command. */ - public String getMoreDetails(String command) throws InvalidValueException{ + public String getMoreDetails(String command) throws InvalidValueException { String moreDetails = command.substring(command.indexOf("/") + 4); if (moreDetails.trim().equals("") | moreDetails.trim().contains("\t")) throw new InvalidValueException("Missing Required Extra Details"); @@ -136,7 +136,7 @@ public String find(String keyword) { String result = ""; for (Task task : list) { count += 1; - result += (task.getTask().contains(keyword)) ? String.format("\t%d. ", count) + task + "\n": "" ; + result += (task.getTask().contains(keyword)) ? String.format("\t%d. ", count) + task + "\n" : ""; } return result; } diff --git a/src/main/java/duke/Ui.java b/src/main/java/duke/Ui.java index 2a58d89ed..8b985a785 100644 --- a/src/main/java/duke/Ui.java +++ b/src/main/java/duke/Ui.java @@ -56,15 +56,15 @@ public String doneMessage(String completedTask) { /** * Acknowledge deletion of task from list of tasks. * - * @param taskList ArrayList of Task. + * @param taskList ArrayList of Task. * @param taskNumber Index number of target Task. * @param targetTask Task to remove. * @return Acknowledgement message. */ - public String deleteMessage(ArrayList taskList, int taskNumber, Task targetTask){ + public String deleteMessage(ArrayList taskList, int taskNumber, Task targetTask) { return (LINE + "Noted! I've removed this task:" + String.format("\n\t%d.", taskNumber) + targetTask + String.format("\n\tNow you have %d tasks in the list.\n", taskList.size()) + LINE); - } + } /*** * Retrieves list in String form. @@ -73,20 +73,20 @@ public String deleteMessage(ArrayList taskList, int taskNumber, Task targe * @return String of list. */ public String printList(TaskList taskList) { - int count = 0; - String outputString = ""; - if (taskList.getList().size() == 0) { - outputString = (LINE + "\tThere is no task in List\n" + LINE); - } else { - outputString = (LINE + "Here are the tasks in your list:\n"); - for (Task task : taskList.getList()) { - count++; - outputString += ("\t" + count + "." + task + "\n"); - } - outputString += String.format("\n\tAs of now, %d task(s) remain not marked Done.\n", taskList.notDoneCount()) + LINE; - } - return outputString; - } + int count = 0; + String outputString = ""; + if (taskList.getList().size() == 0) { + outputString = (LINE + "\tThere is no task in List\n" + LINE); + } else { + outputString = (LINE + "Here are the tasks in your list:\n"); + for (Task task : taskList.getList()) { + count++; + outputString += ("\t" + count + "." + task + "\n"); + } + outputString += String.format("\n\tAs of now, %d task(s) remain not marked Done.\n", taskList.notDoneCount()) + LINE; + } + return outputString; + } /** * Retrieve acknowledgement message of new tasks to list. @@ -95,14 +95,14 @@ public String printList(TaskList taskList) { * @return Acknowledgement of addition message. */ public String acknowledgeAddition(ArrayList taskArrayList) { - return (LINE - + "Got it. I've added this task:\n" - + String.format("\t%d.", taskArrayList.size()) + taskArrayList.get(taskArrayList.size() - 1) + "\n" - + String.format("\tNow you have %d tasks in the list.\n", taskArrayList.size()) - + LINE); - } + return (LINE + + "Got it. I've added this task:\n" + + String.format("\t%d.", taskArrayList.size()) + taskArrayList.get(taskArrayList.size() - 1) + "\n" + + String.format("\tNow you have %d tasks in the list.\n", taskArrayList.size()) + + LINE); + } - public String helpList() { + public String helpList() { return (LINE + "Here are the list of commands Available in Duke:\n" + LINE + @@ -113,22 +113,22 @@ public String helpList() { "event : Adds a new Event to the Task List\n\t" + "find : Lists all tasks that contains a keyword\n" + LINE); - } + } /** * Retrieves list of tasks containing keywords. * - * @param keyword Extracted keyword from user. + * @param keyword Extracted keyword from user. * @param taskList Current TaskList object. * @return list of tasks containing keywords. */ - public String findResults(String keyword, TaskList taskList) { + public String findResults(String keyword, TaskList taskList) { String results = taskList.find(keyword); return (LINE + "Find Results of [" + keyword + "]:\n" + results + LINE); - } + } /** * Retrieves correct format for Date/Time input. @@ -139,6 +139,6 @@ public String dateTimeFormat() { return ("\t____________________________________________________________\n\t" + "Date / Time input format should be: dd/mm/yyyy hhmmss" + "\n\t____________________________________________________________\n\t"); - } + } } diff --git a/src/main/java/duke/task/Deadline.java b/src/main/java/duke/task/Deadline.java index ea4dc30b9..025408dfd 100644 --- a/src/main/java/duke/task/Deadline.java +++ b/src/main/java/duke/task/Deadline.java @@ -15,7 +15,7 @@ public class Deadline extends Task { * Constructor to create Deadline object. * * @param description Deadline description. - * @param by The time the deadline is due. + * @param by The time the deadline is due. */ public Deadline(String description, String by) { super(description); @@ -24,7 +24,7 @@ public Deadline(String description, String by) { String formattedBy = getCorrectFormat(by); String[] tempStr = formattedBy.split(" "); this.date = LocalDate.parse(tempStr[0]); - if (tempStr.length==2) + if (tempStr.length == 2) this.time = LocalTime.parse(tempStr[1]); } } @@ -35,13 +35,13 @@ public Deadline(String description, String by) { * @param by stored by String. * @return correct format to parse into LocalDate and Local Time. */ - private String getCorrectFormat(String by){ + private String getCorrectFormat(String by) { StringBuilder toParse = new StringBuilder(); String[] dateTime = by.split(" "); String[] tempDate = dateTime[0].trim().split("/"); String toStore = ""; - if (tempDate.length == 3){ + if (tempDate.length == 3) { for (int i = 2; i > 0; i--) { toParse.append(tempDate[i]).append("-"); } @@ -55,7 +55,7 @@ private String getCorrectFormat(String by){ char c = dateTime[1].charAt(i); toParse.append((i != 0 && i % 2 == 0) ? ":" + c : c); } - for (int i=0 ; i 0; i--) { toParse.append(tempDate[i]).append("-"); } @@ -56,7 +56,7 @@ private String getCorrectFormat(String by){ char c = dateTime[1].charAt(i); toParse.append((i != 0 && i % 2 == 0) ? ":" + c : c); } - for (int i=0 ; i Date: Tue, 28 Sep 2021 16:25:00 +0800 Subject: [PATCH 28/38] Followed code Style --- src/main/java/duke/Duke.java | 1 + src/main/java/duke/Parser.java | 13 +++++++------ src/main/java/duke/Storage.java | 4 ++-- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/main/java/duke/Duke.java b/src/main/java/duke/Duke.java index 4cefe7f3c..d0ae4fb13 100644 --- a/src/main/java/duke/Duke.java +++ b/src/main/java/duke/Duke.java @@ -62,6 +62,7 @@ private String getInput() { /** * application. + * * @param args to start Duke Application. */ public static void main(String[] args) { diff --git a/src/main/java/duke/Parser.java b/src/main/java/duke/Parser.java index c42f7eaf0..16a8e51d4 100644 --- a/src/main/java/duke/Parser.java +++ b/src/main/java/duke/Parser.java @@ -16,7 +16,7 @@ public class Parser { * Constructor to create Parser object. * * @param taskList TaskList that is currently in use. - * @param ui Ui object. + * @param ui Ui object. */ Parser(TaskList taskList, Ui ui) { this.taskList = taskList; @@ -29,7 +29,7 @@ public class Parser { * @param userInput String input from user. * @return Executed command ui. * @throws InvalidCommandException if there are no recognisable command. - * @throws EmptyCommand if the input is empty. + * @throws EmptyCommand if the input is empty. */ public String parse(String userInput) throws InvalidCommandException, EmptyCommand { try { @@ -100,8 +100,8 @@ public String parseDone(String command) throws InvalidValueException { * Execute "delete" command. * * @param command Input from user. - * * @return "deleted" message. - * * @throws InvalidValueException if user input is in the wrong format. + * * @return "deleted" message. + * * @throws InvalidValueException if user input is in the wrong format. */ public String parseDelete(String command) throws InvalidValueException { validate(command); @@ -158,6 +158,7 @@ public String parseEvent(String command) throws InvalidValueException { /** * Execute "list" command. + * * @return List in form of String. */ public String parseList() { @@ -216,8 +217,8 @@ private void validate(String command) throws InvalidValueException { * @param command Input from user. * @return List of all items found with keyword. */ - public String parseFind(String command) { - if (taskList.getList().size()==0) + public String parseFind(String command) { + if (taskList.getList().size() == 0) return ui.printList(taskList); String keyword = taskList.getItem(command); return ui.findResults(keyword, taskList); diff --git a/src/main/java/duke/Storage.java b/src/main/java/duke/Storage.java index c20c9e9a3..849287ef4 100644 --- a/src/main/java/duke/Storage.java +++ b/src/main/java/duke/Storage.java @@ -61,7 +61,7 @@ public void createFile() { * Convert stored line of data into current TaskList. * * @param taskDetails Saved data from save file. - * @param taskList Current ArrayList task List. + * @param taskList Current ArrayList task List. * @return Current TaskList. */ private static TaskList loadCommands(String taskDetails, ArrayList taskList) { @@ -93,7 +93,7 @@ private static TaskList loadCommands(String taskDetails, ArrayList taskLis /** * Input stored data into save file. * - * @param filePath filePath of save file. + * @param filePath filePath of save file. * @param textToAdd String to be written. * @throws IOException when Run into execution. */ From 8abfb57065d16f15df735a41a544ec0eb987f624 Mon Sep 17 00:00:00 2001 From: Anderson Date: Tue, 28 Sep 2021 16:39:52 +0800 Subject: [PATCH 29/38] Fixed Missing Date / Time error --- src/main/java/duke/Duke.java | 8 ++++---- src/main/java/duke/Parser.java | 10 ++++++---- src/main/java/duke/TaskList.java | 14 -------------- 3 files changed, 10 insertions(+), 22 deletions(-) diff --git a/src/main/java/duke/Duke.java b/src/main/java/duke/Duke.java index d0ae4fb13..91da1836b 100644 --- a/src/main/java/duke/Duke.java +++ b/src/main/java/duke/Duke.java @@ -10,7 +10,7 @@ public class Duke { - private Storage storage; + private final Storage storage; private TaskList tasksLs; private final Ui ui; @@ -19,9 +19,9 @@ public class Duke { /** * A constructor to initiate Duke. */ - public Duke() { + public Duke(String filepath) { this.tasksLs = new TaskList(new ArrayList()); - this.storage = new Storage("duke.txt"); + this.storage = new Storage(filepath); this.ui = new Ui(); } @@ -66,6 +66,6 @@ private String getInput() { * @param args to start Duke Application. */ public static void main(String[] args) { - new Duke().run(); + new Duke("duke.txt").run(); } } diff --git a/src/main/java/duke/Parser.java b/src/main/java/duke/Parser.java index 16a8e51d4..0330620c2 100644 --- a/src/main/java/duke/Parser.java +++ b/src/main/java/duke/Parser.java @@ -9,8 +9,8 @@ import java.time.format.DateTimeParseException; public class Parser { - private TaskList taskList; - private Ui ui; + private final TaskList taskList; + private final Ui ui; /** * Constructor to create Parser object. @@ -62,6 +62,8 @@ public String parse(String userInput) throws InvalidCommandException, EmptyComma return e.toString(); } catch (DateTimeParseException e) { return ui.dateTimeFormat(); + } catch (StringIndexOutOfBoundsException e) { + return new InvalidValueException("Please check if you input Date / Time").toString(); } } @@ -120,7 +122,7 @@ public String parseDelete(String command) throws InvalidValueException { public String parseTodo(String command) throws InvalidValueException { if (command.split(" ").length == 1) throw new InvalidValueException("Todo: Missing Description, Please Try Again"); - taskList.addTask(new ToDo(taskList.getItem(command))); + taskList.addTask(new ToDo(TaskList.getItem(command))); return ui.acknowledgeAddition(taskList.getList()); } @@ -220,7 +222,7 @@ private void validate(String command) throws InvalidValueException { public String parseFind(String command) { if (taskList.getList().size() == 0) return ui.printList(taskList); - String keyword = taskList.getItem(command); + String keyword = TaskList.getItem(command); return ui.findResults(keyword, taskList); } } \ No newline at end of file diff --git a/src/main/java/duke/TaskList.java b/src/main/java/duke/TaskList.java index cd3845c4a..5becccc28 100644 --- a/src/main/java/duke/TaskList.java +++ b/src/main/java/duke/TaskList.java @@ -3,10 +3,6 @@ import duke.DukeExceptions.InvalidValueException; import duke.task.Task; -import java.time.LocalDate; -import java.time.LocalTime; -import java.time.format.DateTimeFormatter; -import java.time.format.DateTimeParseException; import java.util.ArrayList; public class TaskList { @@ -115,16 +111,6 @@ public String getMoreDetails(String command) throws InvalidValueException { return moreDetails; } - /** - * Retrieves the task numbered the same as index in the TaskList. - * - * @param index of task to retrieve. - * @return task - */ - public Task getTask(int index) { - return list.get(index); - } - /** * Retrieve list of items containing the keyword. * From 145eb5335610e7a2f43c3c5469fa2e7b8ad8a802 Mon Sep 17 00:00:00 2001 From: Anderson Date: Tue, 28 Sep 2021 16:45:54 +0800 Subject: [PATCH 30/38] Formatted JavaDoc --- src/main/java/duke/Parser.java | 18 +++++++++--------- src/main/java/duke/TaskList.java | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/main/java/duke/Parser.java b/src/main/java/duke/Parser.java index 0330620c2..b475e7b5e 100644 --- a/src/main/java/duke/Parser.java +++ b/src/main/java/duke/Parser.java @@ -68,7 +68,7 @@ public String parse(String userInput) throws InvalidCommandException, EmptyComma } /** - * execute "help" command + * execute command * * @return list of all commands available */ @@ -77,7 +77,7 @@ public String parseHelp() { } /** - * Execute "bye" command. + * Execute command. * * @return "bye" message. */ @@ -86,7 +86,7 @@ public String parseBye() { } /** - * Execute "done" command. + * Execute command. * * @param command Input from user. * @return "done" message. @@ -99,7 +99,7 @@ public String parseDone(String command) throws InvalidValueException { } /** - * Execute "delete" command. + * Execute command. * * @param command Input from user. * * @return "deleted" message. @@ -113,7 +113,7 @@ public String parseDelete(String command) throws InvalidValueException { } /** - * Execute "Todo" command. + * Execute command. * * @param command Input from user. * @return String acknowledging new addition. @@ -127,7 +127,7 @@ public String parseTodo(String command) throws InvalidValueException { } /** - * Execute "deadlinee" command. + * Execute command. * * @param command Input from user. * @return String acknowledging new addition. @@ -137,13 +137,13 @@ public String parseDeadline(String command) throws InvalidValueException { if (command.split(" ").length == 1) throw new InvalidValueException("Deadline: Missing Description / Time"); if (command.split("/").length == 3) - throw new InvalidValueException("Please input Date in the following format: dd/mm/yyyy"); + throw new InvalidValueException("Please input Date in the following format:
"); taskList.addTask(new Deadline(taskList.getDescription(command), taskList.getMoreDetails(command))); return ui.acknowledgeAddition(taskList.getList()); } /** - * Execute "event" command. + * Execute command. * * @param command Input from user. * @return String acknowledging new addition. @@ -153,7 +153,7 @@ public String parseEvent(String command) throws InvalidValueException { if (command.split(" ").length == 1) throw new InvalidValueException("Event: Missing Description / Time"); if (command.split("/").length == 3) - throw new InvalidValueException("Please input Date in the following format: dd/mm/yyyy"); + throw new InvalidValueException("Please input Date in the following format:
"); taskList.addTask(new Event(taskList.getDescription(command), taskList.getMoreDetails(command))); return ui.acknowledgeAddition(taskList.getList()); } diff --git a/src/main/java/duke/TaskList.java b/src/main/java/duke/TaskList.java index 5becccc28..66d865696 100644 --- a/src/main/java/duke/TaskList.java +++ b/src/main/java/duke/TaskList.java @@ -90,7 +90,7 @@ public static String getItem(String command) { */ public String getDescription(String command) throws InvalidValueException { if (!command.contains("/")) - throw new InvalidValueException("Missing detail demarcator: [/by ] or [/at ]"); + throw new InvalidValueException("Missing detail demarcator: or "); String desc = command.substring(command.indexOf(" ") + 1, command.indexOf("/")); if (desc.trim().equals("")) throw new InvalidValueException("Missing Description in command"); From e2cf455d64824ae344d5c45ce5071f79b3191580 Mon Sep 17 00:00:00 2001 From: Anderson Date: Wed, 29 Sep 2021 02:27:36 +0800 Subject: [PATCH 31/38] Fixed some bugs --- src/main/java/duke/Duke.java | 2 ++ src/main/java/duke/Parser.java | 4 +-- src/main/java/duke/TaskList.java | 29 ++++++++++++++++--- src/main/java/duke/Ui.java | 49 ++++++++++++++++++-------------- 4 files changed, 57 insertions(+), 27 deletions(-) diff --git a/src/main/java/duke/Duke.java b/src/main/java/duke/Duke.java index 91da1836b..64a09a11f 100644 --- a/src/main/java/duke/Duke.java +++ b/src/main/java/duke/Duke.java @@ -18,6 +18,8 @@ public class Duke { /** * A constructor to initiate Duke. + * + * @param filepath Filepath when initiating. */ public Duke(String filepath) { this.tasksLs = new TaskList(new ArrayList()); diff --git a/src/main/java/duke/Parser.java b/src/main/java/duke/Parser.java index b475e7b5e..09d18aba5 100644 --- a/src/main/java/duke/Parser.java +++ b/src/main/java/duke/Parser.java @@ -219,10 +219,10 @@ private void validate(String command) throws InvalidValueException { * @param command Input from user. * @return List of all items found with keyword. */ - public String parseFind(String command) { + public String parseFind(String command) throws InvalidValueException { if (taskList.getList().size() == 0) return ui.printList(taskList); - String keyword = TaskList.getItem(command); + String keyword = TaskList.getKeyword(command); return ui.findResults(keyword, taskList); } } \ No newline at end of file diff --git a/src/main/java/duke/TaskList.java b/src/main/java/duke/TaskList.java index 66d865696..90f8273e5 100644 --- a/src/main/java/duke/TaskList.java +++ b/src/main/java/duke/TaskList.java @@ -77,8 +77,29 @@ public Task deleteTask(int index) { * @param command target items (Description or find target). * @return target items. */ - public static String getItem(String command) { - return command.substring(command.indexOf(" ") + 1); + public static String getItem(String command) throws InvalidValueException { + String item = ""; + if (command.contains(" ")) + item = command.substring((command.indexOf(" ") + 1)).trim(); + if (item.equals("")) + throw new InvalidValueException("You forgot to include Task description"); + return item; + } + + /** + * Retrieves keyword from command + * + * @param command Input from user + * @return Keyword required to find + * @throws InvalidValueException Whenever user never inputs keywords + */ + public static String getKeyword(String command) throws InvalidValueException { + String keyword = ""; + if (command.contains(" ")) + keyword = command.substring((command.indexOf(" ") + 1)).trim(); + if (keyword.equals("")) + throw new InvalidValueException("Find: Missing keyword to search, Please Try Again"); + return keyword; } /** @@ -91,8 +112,8 @@ public static String getItem(String command) { public String getDescription(String command) throws InvalidValueException { if (!command.contains("/")) throw new InvalidValueException("Missing detail demarcator: or "); - String desc = command.substring(command.indexOf(" ") + 1, command.indexOf("/")); - if (desc.trim().equals("")) + String desc = command.substring(command.indexOf(" ") + 1, command.indexOf("/")).trim(); + if (desc.equals("")) throw new InvalidValueException("Missing Description in command"); return desc; } diff --git a/src/main/java/duke/Ui.java b/src/main/java/duke/Ui.java index 8b985a785..e00f121ca 100644 --- a/src/main/java/duke/Ui.java +++ b/src/main/java/duke/Ui.java @@ -5,17 +5,17 @@ import java.util.ArrayList; public class Ui { - public static final String LOGO = " ____ _ \n" - + "| _ \\ _ _| | _____ \n" - + "| | | | | | | |/ / _ \\\n" - + "| |_| | |_| | < __/\n" - + "|____/ \\__,_|_|\\_\\___|\n"; - public static final String LINE = "\t____________________________________________________________\n\t"; + public static final String LOGO = "\t ____ _ \n" + + "\t| _ \\ _ _| | _____ \n" + + "\t| | | | | | | |/ / _ \\\n" + + "\t| |_| | |_| | < __/\n" + + "\t|____/ \\__,_|_|\\_\\___|\n"; + public static final String LINE = "\t____________________________________________________________\n\t\t"; public static final String BYE = LINE + "Bye. try not to procrastinate!\n" + LINE; public static final String GREETING = LINE - + "Hello! I'm Anderson\n\t" + + "Hello! I'm Anderson\n\t\t" + "What do you need to do?\n" + LINE; @@ -48,7 +48,7 @@ public String doneMessage(String completedTask) { + LINE); } return (LINE - + "Nice, I've marked this task as Done:\n" + + "Nice, I've marked this task as Done:\n\t" + "\t\t" + completedTask + "\n" + LINE); } @@ -63,7 +63,7 @@ public String doneMessage(String completedTask) { */ public String deleteMessage(ArrayList taskList, int taskNumber, Task targetTask) { return (LINE + "Noted! I've removed this task:" + - String.format("\n\t%d.", taskNumber) + targetTask + String.format("\n\tNow you have %d tasks in the list.\n", taskList.size()) + LINE); + String.format("\n\t\t%d.", taskNumber) + targetTask + String.format("\n\t\tNow you have %d tasks in the list.\n", taskList.size()) + LINE); } /*** @@ -81,9 +81,9 @@ public String printList(TaskList taskList) { outputString = (LINE + "Here are the tasks in your list:\n"); for (Task task : taskList.getList()) { count++; - outputString += ("\t" + count + "." + task + "\n"); + outputString += ("\t\t" + count + "." + task + "\n"); } - outputString += String.format("\n\tAs of now, %d task(s) remain not marked Done.\n", taskList.notDoneCount()) + LINE; + outputString += String.format("\n\t\tAs of now, %d task(s) remain not marked Done.\n", taskList.notDoneCount()) + LINE; } return outputString; } @@ -97,8 +97,8 @@ public String printList(TaskList taskList) { public String acknowledgeAddition(ArrayList taskArrayList) { return (LINE + "Got it. I've added this task:\n" - + String.format("\t%d.", taskArrayList.size()) + taskArrayList.get(taskArrayList.size() - 1) + "\n" - + String.format("\tNow you have %d tasks in the list.\n", taskArrayList.size()) + + String.format("\t\t%d.", taskArrayList.size()) + taskArrayList.get(taskArrayList.size() - 1) + "\n" + + String.format("\t\tNow you have %d tasks in the list.\n", taskArrayList.size()) + LINE); } @@ -106,12 +106,14 @@ public String helpList() { return (LINE + "Here are the list of commands Available in Duke:\n" + LINE + - "bye : closes Programme\n\t" + - "list : lists out every Task stored in the savefile\n\t" + - "todo : Adds a new ToDo to the Task List\n\t" + - "deadline : Adds a new Deadline to the Task List\n\t" + - "event : Adds a new Event to the Task List\n\t" + - "find : Lists all tasks that contains a keyword\n" + + "bye : closes Programme\n\t\t" + + "list : lists out every Task stored in the savefile\n\t\t" + + "todo : Adds a new ToDo to the Task List\n\t\t" + + "deadline : Adds a new Deadline to the Task List\n\t\t" + + "event : Adds a new Event to the Task List\n\t\t" + + "find : Lists all tasks that contains a keyword\n\t\t" + + "done : Mark a task as done\n\t\t" + + "delete : Delete task from Task List\n" + LINE); } @@ -124,6 +126,11 @@ public String helpList() { */ public String findResults(String keyword, TaskList taskList) { String results = taskList.find(keyword); + if (results.equals("")) { + return (LINE + + "No description matches [" + keyword + "]:\n" + + LINE); + } return (LINE + "Find Results of [" + keyword + "]:\n" + results + @@ -136,9 +143,9 @@ public String findResults(String keyword, TaskList taskList) { * @return Correct format for Date/Time input. */ public String dateTimeFormat() { - return ("\t____________________________________________________________\n\t" + return (LINE + "Date / Time input format should be: dd/mm/yyyy hhmmss" - + "\n\t____________________________________________________________\n\t"); + + LINE); } } From 14111c5604f451647d13317c582d64c9c8111615 Mon Sep 17 00:00:00 2001 From: Anderson Date: Wed, 29 Sep 2021 02:56:25 +0800 Subject: [PATCH 32/38] Made UI look nicer --- src/main/java/duke/DukeExceptions/EmptyCommand.java | 6 +++--- .../duke/DukeExceptions/InvalidCommandException.java | 10 +++++----- .../duke/DukeExceptions/InvalidValueException.java | 4 ++-- src/main/java/duke/Ui.java | 12 ++++++------ 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/main/java/duke/DukeExceptions/EmptyCommand.java b/src/main/java/duke/DukeExceptions/EmptyCommand.java index 18604c5b8..98bdb2530 100644 --- a/src/main/java/duke/DukeExceptions/EmptyCommand.java +++ b/src/main/java/duke/DukeExceptions/EmptyCommand.java @@ -6,10 +6,10 @@ public class EmptyCommand extends DukeException { * @return Empty input Message. */ public String toString() { - return ("\t____________________________________________________________\n" + + return ("\t______________________________________________________________________\n" + "\tNo command detected. Command was empty :)\n" + - "\t____________________________________________________________\n" + + "\t______________________________________________________________________\n" + "\tKey in [help] to list available commands\n" + - "\t____________________________________________________________\n"); + "\t______________________________________________________________________\n"); } } diff --git a/src/main/java/duke/DukeExceptions/InvalidCommandException.java b/src/main/java/duke/DukeExceptions/InvalidCommandException.java index 724ba173a..7a1183fe4 100644 --- a/src/main/java/duke/DukeExceptions/InvalidCommandException.java +++ b/src/main/java/duke/DukeExceptions/InvalidCommandException.java @@ -7,11 +7,11 @@ public class InvalidCommandException extends DukeException { * Default Constructor. */ public InvalidCommandException() { - this.thisError = ("\t____________________________________________________________\n" + this.thisError = ("\t______________________________________________________________________\n" + "\tOOOPS!!! I'm sorry, but I don't know what that means. EPIC SADS :-(\n" - + "\t____________________________________________________________\n" + + "\t______________________________________________________________________\n" + "\tKey in [help] to list available commands\n" - + "\t____________________________________________________________\n\t"); + + "\t______________________________________________________________________\n\t"); } /** @@ -20,9 +20,9 @@ public InvalidCommandException() { * @param errorMessage error Message to train Elgle. */ public InvalidCommandException(String errorMessage) { - this.thisError = ("\t____________________________________________________________\n\t" + this.thisError = ("\t______________________________________________________________________\n\t" + errorMessage - + "\n\t____________________________________________________________\n\t"); + + "\n\t______________________________________________________________________\n\t"); } public String toString() { diff --git a/src/main/java/duke/DukeExceptions/InvalidValueException.java b/src/main/java/duke/DukeExceptions/InvalidValueException.java index ffb02426d..ec0777b50 100644 --- a/src/main/java/duke/DukeExceptions/InvalidValueException.java +++ b/src/main/java/duke/DukeExceptions/InvalidValueException.java @@ -6,9 +6,9 @@ public class InvalidValueException extends DukeException { private String errorMessage; public InvalidValueException(String expectedMessage) { - this.errorMessage = ("\t____________________________________________________________\n\t" + this.errorMessage = ("\t______________________________________________________________________\n\t" + expectedMessage - + "\n\t____________________________________________________________\n\t"); + + "\n\t______________________________________________________________________\n\t"); } /** diff --git a/src/main/java/duke/Ui.java b/src/main/java/duke/Ui.java index e00f121ca..d77627d82 100644 --- a/src/main/java/duke/Ui.java +++ b/src/main/java/duke/Ui.java @@ -5,12 +5,12 @@ import java.util.ArrayList; public class Ui { - public static final String LOGO = "\t ____ _ \n" - + "\t| _ \\ _ _| | _____ \n" - + "\t| | | | | | | |/ / _ \\\n" - + "\t| |_| | |_| | < __/\n" - + "\t|____/ \\__,_|_|\\_\\___|\n"; - public static final String LINE = "\t____________________________________________________________\n\t\t"; + public static final String LOGO = "\t\t\t\t ____ _ \n" + + "\t\t\t\t| _ \\ _ _| | _____ \n" + + "\t\t\t\t| | | | | | | |/ / _ \\\n" + + "\t\t\t\t| |_| | |_| | < __/\n" + + "\t\t\t\t|____/ \\__,_|_|\\_\\___|\n"; + public static final String LINE = "\t______________________________________________________________________\n\t\t"; public static final String BYE = LINE + "Bye. try not to procrastinate!\n" + LINE; From 2ac746b0cf3f6e8317650fe079b0181607715ef6 Mon Sep 17 00:00:00 2001 From: Anderson Date: Wed, 29 Sep 2021 02:57:41 +0800 Subject: [PATCH 33/38] Added user guide --- docs/README.md | 233 ++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 220 insertions(+), 13 deletions(-) diff --git a/docs/README.md b/docs/README.md index 8077118eb..4d71f7bca 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,29 +1,236 @@ # User Guide +##Getting Started +### Preparations +Ensure that `ip.jar` is located within a folder of its own. +Open up a Terminal and ensure to the directory is the same as the folder `ip.jar` is located in. +### Initialising Duke +Enter the following into the terminal to initialise Duke application. +``` +java -jar ip.jar +``` +## Features and Usage +### Feature List +- `help` +- `todo` +- `deadline` +- `event` +- `list` +- `done` +- `delete` +- `bye` + +*All commands are not case-sensitive:* + +`dEAdLine`, `deadline`, and `Deadline` All mean: `deadline`. +___ +--- + +### List Commands: `help` +Prints all commands available. + +**Example of usage:** + +*input:* +``` +help +``` +--- +--- + +### Add ToDo: `todo` +Adds a new ToDo to the task list. A ToDo is a task with a description of the task. + +**Arguments:** +1. `` - Description of the ToDo task. + +**Format:** `todo ` + +**Example of usage:** + +*input:* +``` +todo Eat apples +``` +*output:* +``` +Got it. I've added this task: +1.[T][ ] Eat apples +Now you have 1 tasks in the list. +``` +--- +--- +### Add Deadline: `deadline` +Adds a new Deadline to the task list. A Deadline is a task with a description of the task and a deadline. + +**Arguments:** +1. `` - Description of the Deadline task. +2. `` - DateTime the deadline should be done by. + +**Format:** +- `deadline /by ` + +`` *is accepted in the following formats:* +- `Custom input` +- `dd/mm/yyyy` +- `dd/mm/yyyy hhmm` + +**Example of usage:** + +*input:* +``` +deadline IEM2 Assignment /by This Friday +``` +*output:* +``` +Got it. I've added this task: +2.[D][ ] IEM2 Assignment (by: This Friday) +Now you have 2 tasks in the list. +``` +___ +*input:* +``` +deadLine CS2113T ip submission /by 01/10/2021 2359 +``` +*output:* +``` +Got it. I've added this task: +3.[D][ ] CS2113T ip Submission (by: Oct 1 2021 11:59 PM) +Now you have 3 tasks in the list. +``` +___ +--- +### Add Event: `event` +Adds a new Event to the task list. An Event is a task with a description of the task and a event. + +**Arguments:** +1. `` - Description of the Event task. +2. `` - DateTime or Location the Event should be happening at. -## Features +**Format:** +- `event /at ` -### Feature-ABC +`` is accepted in the following formats: +- `Custom input` +- `dd/mm/yyyy` +- `dd/mm/yyyy hhmm` -Description of the feature. +**Example of usage:** -### Feature-XYZ +*input:* +``` +event Dance show /at Esplanade +``` +*output:* +``` +Got it. I've added this task: +4.[E][ ] Dance show (at: Esplanade) +Now you have 4 tasks in the list. +``` +--- +*input:* +``` +Event No Time To Die premiere /at 30/09/2021 +``` +*output:* +``` +Got it. I've added this task: +5.[E][ ] No Time To Die premiere (at: Sep 30 2021) +Now you have 5 tasks in the list. +``` +___ +--- +### List Tasks: `list` +Prints all tasks in the task list. + +**Arguments:** +None + +**Format:** `list` + +**Example of usage:** + +*input* +``` +list +``` +*output:* +``` +Here are the tasks in your list: +1.[T][ ] Eat apples +2.[D][ ] IEM2 Assignment (by: This Friday) +3.[D][ ] CS2113T ip Submission (by: Oct 1 2021 11:59 PM) +4.[E][ ] Dance show (at: Esplanade) +5.[E][ ] No Time To Die premiere (at: Sep 30 2021) + +``` +--- +--- +### Mark Task as Done: `done` +Marks a Task in the Task List as done. + +**Arguments:** +1. `` - Task index with respect to the list. + +**Format:** +- `done ` + +`` *should only be a number from the list* + +**Example of usage:** + +*input:* +``` +done 4 +``` +*output:* +``` +Nice, I've marked this task as Done: + [E][X] Dance show (at: Esplanade) +``` +___ +--- +### Remove Task from Task List: `delete` +Delete a Task from the Task List. -Description of the feature. +**Arguments:** +1. `` - Task index with respect to the list. -## Usage +**Format:** +- `delete ` -### `Keyword` - Describe action +*`` should only be a number from the list* -Describe the action and its outcome. +**Example of usage:** -Example of usage: +*input:* +``` +delete 3 +``` +*output:* +``` +Noted! I've removed this task: +3.[D][ ] CS2113T ip Submission (by: Oct 1 2021 11:59PM) +Now you have 4 tasks in the list. +``` +___ +--- +### Remove Task from Task List: `bye` +Exits Duke application. -`keyword (optional arguments)` +**Arguments:** + None -Expected outcome: +**Format:** +- `bye` -Description of the outcome. +**Example of usage:** +*input:* +``` +bye +``` +*output:* ``` -expected output +Bye. try not to procrastinate! ``` +___ \ No newline at end of file From cf461d14384683fbc004876a004b02c96d8bc37f Mon Sep 17 00:00:00 2001 From: uosjapuelks <73028629+uosjapuelks@users.noreply.github.com> Date: Wed, 29 Sep 2021 03:06:01 +0800 Subject: [PATCH 34/38] Set theme jekyll-theme-hacker --- docs/_config.yml | 1 + 1 file changed, 1 insertion(+) create mode 100644 docs/_config.yml diff --git a/docs/_config.yml b/docs/_config.yml new file mode 100644 index 000000000..fc24e7a62 --- /dev/null +++ b/docs/_config.yml @@ -0,0 +1 @@ +theme: jekyll-theme-hacker \ No newline at end of file From 75cbc1ebf36833758c964d9e2a3c63620cf67930 Mon Sep 17 00:00:00 2001 From: uosjapuelks <73028629+uosjapuelks@users.noreply.github.com> Date: Wed, 29 Sep 2021 03:41:59 +0800 Subject: [PATCH 35/38] Set theme jekyll-theme-modernist --- docs/_config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_config.yml b/docs/_config.yml index fc24e7a62..cc35c1df2 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -1 +1 @@ -theme: jekyll-theme-hacker \ No newline at end of file +theme: jekyll-theme-modernist \ No newline at end of file From 7ecef5e03605fcba41804453a00a16e514d2aea5 Mon Sep 17 00:00:00 2001 From: uosjapuelks <73028629+uosjapuelks@users.noreply.github.com> Date: Wed, 29 Sep 2021 03:45:57 +0800 Subject: [PATCH 36/38] Set theme jekyll-theme-leap-day --- docs/_config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_config.yml b/docs/_config.yml index cc35c1df2..b84971359 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -1 +1 @@ -theme: jekyll-theme-modernist \ No newline at end of file +theme: jekyll-theme-leap-day \ No newline at end of file From 709fcd663261ef767983c029832c3269ae9b77e2 Mon Sep 17 00:00:00 2001 From: uosjapuelks <73028629+uosjapuelks@users.noreply.github.com> Date: Wed, 29 Sep 2021 03:47:32 +0800 Subject: [PATCH 37/38] Set theme jekyll-theme-leap-day From f734c1bcc183658ae125f57eb11242c5176e0b56 Mon Sep 17 00:00:00 2001 From: Anderson Date: Wed, 29 Sep 2021 03:52:29 +0800 Subject: [PATCH 38/38] Fixed UG typo --- docs/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/README.md b/docs/README.md index 4d71f7bca..30d885366 100644 --- a/docs/README.md +++ b/docs/README.md @@ -145,7 +145,8 @@ Prints all tasks in the task list. **Arguments:** None -**Format:** `list` +**Format:** +- `list` **Example of usage:**