From fc5c9c37831e8e133f7eb64c9f94a80c38db2ed4 Mon Sep 17 00:00:00 2001 From: victorouy Date: Wed, 1 Feb 2023 11:31:18 +0800 Subject: [PATCH 01/20] Level-0 --- src/main/java/Duke.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 5d313334c..ca3dba41b 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -6,5 +6,12 @@ public static void main(String[] args) { + "| |_| | |_| | < __/\n" + "|____/ \\__,_|_|\\_\\___|\n"; System.out.println("Hello from\n" + logo); + + System.out.println("____________________________________________________________"); + System.out.println("Hello! I'm Duke"); + System.out.println("What can I do for you?"); + System.out.println("____________________________________________________________"); + System.out.println("Bye. Hope to see you again soon!"); + System.out.println("____________________________________________________________"); } } From 1a69fbcdc05a0a226f62f06602a9c297202e7fb5 Mon Sep 17 00:00:00 2001 From: victorouy Date: Wed, 1 Feb 2023 17:39:40 +0800 Subject: [PATCH 02/20] Level-1 --- src/main/java/Duke.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index ca3dba41b..47c8bec2e 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -1,3 +1,5 @@ +import java.util.Scanner; + public class Duke { public static void main(String[] args) { String logo = " ____ _ \n" @@ -11,6 +13,20 @@ public static void main(String[] args) { System.out.println("Hello! I'm Duke"); System.out.println("What can I do for you?"); System.out.println("____________________________________________________________"); + + Scanner scanner = new Scanner(System.in); + String echoInput = ""; + + while (!echoInput.equals("bye")) { + echoInput = scanner.nextLine(); + + if (!echoInput.equals("bye")) { + System.out.println("____________________________________________________________"); + System.out.println(echoInput); + System.out.println("____________________________________________________________"); + } + } + System.out.println("____________________________________________________________"); System.out.println("Bye. Hope to see you again soon!"); System.out.println("____________________________________________________________"); } From 7b3b00827fc960fb397b2c724768797bd883616b Mon Sep 17 00:00:00 2001 From: victorouy Date: Wed, 1 Feb 2023 18:50:45 +0800 Subject: [PATCH 03/20] Level-2 --- src/main/java/Duke.java | 49 +++++++++++++++++++++++++++++++---------- 1 file changed, 37 insertions(+), 12 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 47c8bec2e..b2091ca29 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -1,7 +1,42 @@ import java.util.Scanner; public class Duke { + public static void main(String[] args) { + greetings(); + echoText(); + goodbye(); + } + + private static void echoText() { + Scanner scanner = new Scanner(System.in); + String echoInput = ""; + String[] storedText = new String[100]; + int counter = 0; + + while (!echoInput.equals("bye")) { + echoInput = scanner.nextLine(); + if (echoInput.equals("bye")) { + break; + } + if (echoInput.equals("list")) { + System.out.println("____________________________________________________________"); + for (int i = 0; i < counter; i++) { + System.out.println(i+1 + ". " + storedText[i]); + } + System.out.println("____________________________________________________________"); + } + else { + storedText[counter] = echoInput; + System.out.println("____________________________________________________________"); + System.out.println("added: " + echoInput); + System.out.println("____________________________________________________________"); + counter = counter + 1; + } + } + } + + private static void greetings() { String logo = " ____ _ \n" + "| _ \\ _ _| | _____ \n" + "| | | | | | | |/ / _ \\\n" @@ -13,19 +48,9 @@ public static void main(String[] args) { System.out.println("Hello! I'm Duke"); System.out.println("What can I do for you?"); System.out.println("____________________________________________________________"); + } - Scanner scanner = new Scanner(System.in); - String echoInput = ""; - - while (!echoInput.equals("bye")) { - echoInput = scanner.nextLine(); - - if (!echoInput.equals("bye")) { - System.out.println("____________________________________________________________"); - System.out.println(echoInput); - System.out.println("____________________________________________________________"); - } - } + private static void goodbye() { System.out.println("____________________________________________________________"); System.out.println("Bye. Hope to see you again soon!"); System.out.println("____________________________________________________________"); From 92c50175c87153a1e2e7a0aca516d02c124e4890 Mon Sep 17 00:00:00 2001 From: victorouy Date: Wed, 1 Feb 2023 19:24:11 +0800 Subject: [PATCH 04/20] Level-3 --- src/main/java/Duke.java | 55 +++++++++++++++++++++++++++++++++++------ src/main/java/Task.java | 31 +++++++++++++++++++++++ 2 files changed, 78 insertions(+), 8 deletions(-) create mode 100644 src/main/java/Task.java diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index b2091ca29..cd7956e31 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -8,10 +8,49 @@ public static void main(String[] args) { goodbye(); } + private static void listTasks(int counter, Task[] storedTask) { + System.out.println("____________________________________________________________"); + System.out.println("Here are the tasks in your list:"); + for (int i = 0; i < counter; i++) { + if (storedTask[i].getIsDone()) { + System.out.println(i + 1 + ". [x] " + storedTask[i].getText()); + } + else { + System.out.println(i + 1 + ". [ ] " + storedTask[i].getText()); + } + } + System.out.println("____________________________________________________________"); + } + + private static void markingAsDone(String echoInput, int counter, Task[] storedTask) { + try { + String stringListNumber = echoInput.substring(5, echoInput.length()); + int listNumber = Integer.parseInt(stringListNumber); + + storedTask[listNumber-1].setIsDone(true); + listTasks(counter, storedTask); + } + catch (NumberFormatException ex){ + System.out.println("____________________________________________________________"); + System.out.println("*DID NOT ENTER A VALID NUMBER*"); + System.out.println("____________________________________________________________"); + } + catch (ArrayIndexOutOfBoundsException x) { + System.out.println("____________________________________________________________"); + System.out.println("*DID NOT ENTER A NUMBER ON LIST*"); + System.out.println("____________________________________________________________"); + } + catch (NullPointerException x) { + System.out.println("____________________________________________________________"); + System.out.println("*DID NOT ENTER A NUMBER ON LIST*"); + System.out.println("____________________________________________________________"); + } + } + private static void echoText() { Scanner scanner = new Scanner(System.in); String echoInput = ""; - String[] storedText = new String[100]; + Task[] storedTask = new Task[100]; int counter = 0; while (!echoInput.equals("bye")) { @@ -19,15 +58,15 @@ private static void echoText() { if (echoInput.equals("bye")) { break; } - if (echoInput.equals("list")) { - System.out.println("____________________________________________________________"); - for (int i = 0; i < counter; i++) { - System.out.println(i+1 + ". " + storedText[i]); - } - System.out.println("____________________________________________________________"); + else if (echoInput.equals("list")) { + listTasks(counter, storedTask); + } + else if (echoInput.startsWith("mark ")) { + markingAsDone(echoInput, counter, storedTask); } else { - storedText[counter] = echoInput; + Task tempTask = new Task(echoInput, false); + storedTask[counter] = tempTask; System.out.println("____________________________________________________________"); System.out.println("added: " + echoInput); System.out.println("____________________________________________________________"); diff --git a/src/main/java/Task.java b/src/main/java/Task.java new file mode 100644 index 000000000..92d0820f4 --- /dev/null +++ b/src/main/java/Task.java @@ -0,0 +1,31 @@ +public class Task { + + private String text; + private boolean isDone; + + public Task() { + this.text = ""; + this.isDone = false; + } + + public Task(String text, boolean isDone) { + this.text = text; + this.isDone = isDone; + } + + public String getText() { + return this.text; + } + + public void setText(String text) { + this.text = text; + } + + public boolean getIsDone() { + return this.isDone; + } + + public void setIsDone(boolean isDone) { + this.isDone = isDone; + } +} From cd91defbc1fdb7530e2c237cea50c153d681e037 Mon Sep 17 00:00:00 2001 From: victorouy Date: Wed, 1 Feb 2023 19:36:54 +0800 Subject: [PATCH 05/20] A-CodingStandard --- src/main/java/Duke.java | 4 +++- src/main/java/Task.java | 3 +++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index cd7956e31..a7f21e1a6 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -1,5 +1,8 @@ import java.util.Scanner; +/** + * A class that acts as a CLI that keeps tracks of tasks you write and mark down + */ public class Duke { public static void main(String[] args) { @@ -82,7 +85,6 @@ private static void greetings() { + "| |_| | |_| | < __/\n" + "|____/ \\__,_|_|\\_\\___|\n"; System.out.println("Hello from\n" + logo); - System.out.println("____________________________________________________________"); System.out.println("Hello! I'm Duke"); System.out.println("What can I do for you?"); diff --git a/src/main/java/Task.java b/src/main/java/Task.java index 92d0820f4..b1a50ac47 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -1,3 +1,6 @@ +/** + * Task class used to have a text (description) and isDone attributes + */ public class Task { private String text; From 40d177506caa3976671908c321e807242116a9ce Mon Sep 17 00:00:00 2001 From: victorouy Date: Wed, 8 Feb 2023 03:29:39 +0800 Subject: [PATCH 06/20] Level-4 --- src/main/java/Deadline.java | 18 +++++++ src/main/java/Duke.java | 94 +++++++++++++++++++++++-------------- src/main/java/Event.java | 15 ++++++ src/main/java/Task.java | 28 +++++++---- src/main/java/Todo.java | 15 ++++++ text-ui-test/EXPECTED.TXT | 37 +++++++++++++++ text-ui-test/input.txt | 5 ++ text-ui-test/runtest.bat | 2 +- 8 files changed, 168 insertions(+), 46 deletions(-) create mode 100644 src/main/java/Deadline.java create mode 100644 src/main/java/Event.java create mode 100644 src/main/java/Todo.java diff --git a/src/main/java/Deadline.java b/src/main/java/Deadline.java new file mode 100644 index 000000000..21086c61e --- /dev/null +++ b/src/main/java/Deadline.java @@ -0,0 +1,18 @@ +public class Deadline extends Task { + protected String by; + + public Deadline(String description, String by) { + super(description); + this.by = by; + } + +// public Deadline(String description, boolean isDone, String by) { +// super(description, isDone); +// this.by = by; +// } + + @Override + public String toString() { + return "[D]" + super.toString() + " (by: " + by + ")"; + } +} diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index a7f21e1a6..c11781bfd 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -7,7 +7,7 @@ public class Duke { public static void main(String[] args) { greetings(); - echoText(); + manageInput(); goodbye(); } @@ -15,14 +15,9 @@ private static void listTasks(int counter, Task[] storedTask) { System.out.println("____________________________________________________________"); System.out.println("Here are the tasks in your list:"); for (int i = 0; i < counter; i++) { - if (storedTask[i].getIsDone()) { - System.out.println(i + 1 + ". [x] " + storedTask[i].getText()); - } - else { - System.out.println(i + 1 + ". [ ] " + storedTask[i].getText()); - } + System.out.println((i + 1) + ". " + storedTask[i].toString()); } - System.out.println("____________________________________________________________"); + System.out.println("____________________________________________________________\n"); } private static void markingAsDone(String echoInput, int counter, Task[] storedTask) { @@ -33,47 +28,74 @@ private static void markingAsDone(String echoInput, int counter, Task[] storedTa storedTask[listNumber-1].setIsDone(true); listTasks(counter, storedTask); } - catch (NumberFormatException ex){ - System.out.println("____________________________________________________________"); - System.out.println("*DID NOT ENTER A VALID NUMBER*"); - System.out.println("____________________________________________________________"); + catch (NumberFormatException ex) { + printMarkError(); } - catch (ArrayIndexOutOfBoundsException x) { - System.out.println("____________________________________________________________"); - System.out.println("*DID NOT ENTER A NUMBER ON LIST*"); - System.out.println("____________________________________________________________"); + catch (ArrayIndexOutOfBoundsException ex) { + printMarkError(); } - catch (NullPointerException x) { - System.out.println("____________________________________________________________"); - System.out.println("*DID NOT ENTER A NUMBER ON LIST*"); - System.out.println("____________________________________________________________"); + catch (NullPointerException ex) { + printMarkError(); } } - private static void echoText() { + private static void printMarkError() { + System.out.println("____________________________________________________________"); + System.out.println("*DID NOT ENTER A VALID NUMBER*"); + System.out.println("____________________________________________________________\n"); + } + + private static void printTaskInput(Task task, int counter) { + System.out.println("____________________________________________________________"); + System.out.println("Got it. I've added this task:"); + System.out.println(task.toString()); + System.out.println("Now you have " + counter + " tasks in the list."); + System.out.println("____________________________________________________________\n"); + } + + private static void manageInput() { Scanner scanner = new Scanner(System.in); - String echoInput = ""; + String input = ""; Task[] storedTask = new Task[100]; int counter = 0; - while (!echoInput.equals("bye")) { - echoInput = scanner.nextLine(); - if (echoInput.equals("bye")) { + while (!input.equals("bye")) { + input = scanner.nextLine(); + if (input.equals("bye")) { break; } - else if (echoInput.equals("list")) { + else if (input.equals("list")) { listTasks(counter, storedTask); } - else if (echoInput.startsWith("mark ")) { - markingAsDone(echoInput, counter, storedTask); + else if (input.startsWith("mark")) { + markingAsDone(input, counter, storedTask); } - else { - Task tempTask = new Task(echoInput, false); + else if (input.startsWith("todo ")) { + Task tempTask = new Todo(input); storedTask[counter] = tempTask; - System.out.println("____________________________________________________________"); - System.out.println("added: " + echoInput); - System.out.println("____________________________________________________________"); counter = counter + 1; + printTaskInput(tempTask, counter); + } + else if (input.startsWith("deadline") && input.contains("/")) { + Task tempTask = new Deadline(input, input.substring(input.lastIndexOf("/") + 1)); + storedTask[counter] = tempTask; + counter = counter + 1; + printTaskInput(tempTask, counter); + } + else if (input.startsWith("event") && input.matches(".*/.*/.*")) { + String tempInput = input.substring(input.indexOf("/") + 1); + String fromString = tempInput.substring(0, tempInput.indexOf("/")); + String toString = tempInput.substring(tempInput.lastIndexOf("/") + 1); + + Task tempTask = new Event(input, fromString, toString); + storedTask[counter] = tempTask; + counter = counter + 1; + printTaskInput(tempTask, counter); + } + else { + System.out.println("____________________________________________________________"); + System.out.println("Invalid input"); + System.out.println("____________________________________________________________\n"); } } } @@ -88,12 +110,12 @@ private static void greetings() { System.out.println("____________________________________________________________"); System.out.println("Hello! I'm Duke"); System.out.println("What can I do for you?"); - System.out.println("____________________________________________________________"); + System.out.println("____________________________________________________________\n"); } private static void goodbye() { System.out.println("____________________________________________________________"); System.out.println("Bye. Hope to see you again soon!"); - System.out.println("____________________________________________________________"); + System.out.println("____________________________________________________________\n"); } -} +} \ No newline at end of file diff --git a/src/main/java/Event.java b/src/main/java/Event.java new file mode 100644 index 000000000..0118bfd8e --- /dev/null +++ b/src/main/java/Event.java @@ -0,0 +1,15 @@ +public class Event extends Task { + protected String from; + protected String to; + + public Event(String description, String from, String to) { + super(description); + this.from = from; + this.to = to; + } + + @Override + public String toString() { + return "[E]" + super.toString() + " (from: " + this.from + " to: " + this.to + ")"; + } +} diff --git a/src/main/java/Task.java b/src/main/java/Task.java index b1a50ac47..e5c5fad87 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -3,25 +3,35 @@ */ public class Task { - private String text; - private boolean isDone; + protected String description; + protected boolean isDone; public Task() { - this.text = ""; + this.description = ""; this.isDone = false; } - public Task(String text, boolean isDone) { - this.text = text; + public Task(String description) { + this.description = description; + this.isDone = false; + } + + public Task(String description, boolean isDone) { + this.description = description; this.isDone = isDone; } - public String getText() { - return this.text; + @Override + public String toString() { + return "[" + ((this.isDone) ? "X] " : " ] ") + ((description.indexOf("/") == -1) ? description : (description.substring(0, description.indexOf("/")))); + } + + public String getDescription() { + return this.description; } - public void setText(String text) { - this.text = text; + public void setDescription(String description) { + this.description = description; } public boolean getIsDone() { diff --git a/src/main/java/Todo.java b/src/main/java/Todo.java new file mode 100644 index 000000000..a6da7bd21 --- /dev/null +++ b/src/main/java/Todo.java @@ -0,0 +1,15 @@ +public class Todo extends Task { + + public Todo(String description) { + super(description); + } + +// public Todo(String description, boolean isDone) { +// super(description, isDone); +// } + + @Override + public String toString() { + return "[T]" + super.toString(); + } +} diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index 657e74f6e..fcedffb3d 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -5,3 +5,40 @@ Hello from | |_| | |_| | < __/ |____/ \__,_|_|\_\___| +____________________________________________________________ +Hello! I'm Duke +What can I do for you? +____________________________________________________________ + +____________________________________________________________ +Got it. I've added this task: +[T][ ] todo assignment 1 +Now you have 1 tasks in the list. +____________________________________________________________ + +____________________________________________________________ +Got it. I've added this task: +[D][ ] deadline assignment 2 (by: by monday) +Now you have 2 tasks in the list. +____________________________________________________________ + +____________________________________________________________ +Got it. I've added this task: +[E][ ] event assignment 3 (from: tuesday to: thursday) +Now you have 3 tasks in the list. +____________________________________________________________ + +____________________________________________________________ +Here are the tasks in your list: +1. [T][ ] todo assignment 1 +2. [D][ ] deadline assignment 2 (by: by monday) +3. [E][ ] event assignment 3 (from: tuesday to: thursday) +____________________________________________________________ + +____________________________________________________________ +Here are the tasks in your list: +1. [T][ ] todo assignment 1 +2. [D][ ] deadline assignment 2 (by: by monday) +3. [E][X] event assignment 3 (from: tuesday to: thursday) +____________________________________________________________ + diff --git a/text-ui-test/input.txt b/text-ui-test/input.txt index e69de29bb..b40b8d824 100644 --- a/text-ui-test/input.txt +++ b/text-ui-test/input.txt @@ -0,0 +1,5 @@ +todo assignment 1 +deadline assignment 2/by monday +event assignment 3/tuesday/thursday +list +mark 3 \ No newline at end of file diff --git a/text-ui-test/runtest.bat b/text-ui-test/runtest.bat index 087374464..97c1d9157 100644 --- a/text-ui-test/runtest.bat +++ b/text-ui-test/runtest.bat @@ -7,7 +7,7 @@ REM delete output from previous run if exist ACTUAL.TXT del ACTUAL.TXT REM compile the code into the bin folder -javac -cp ..\src\main\java -Xlint:none -d ..\bin ..\src\main\java\*.java +javac -cp ..\src\main\java -Xlint:none -d ..\bin ..\src\main\java\Duke.java IF ERRORLEVEL 1 ( echo ********** BUILD FAILURE ********** exit /b 1 From 9c2996414a573232129f80e5f12e889eae25943a Mon Sep 17 00:00:00 2001 From: victorouy Date: Wed, 8 Feb 2023 03:48:03 +0800 Subject: [PATCH 07/20] A-CodingStandard_2 --- src/main/java/Deadline.java | 5 ----- src/main/java/Duke.java | 40 +++++++++++++++++-------------------- src/main/java/Task.java | 3 ++- src/main/java/Todo.java | 4 ---- 4 files changed, 20 insertions(+), 32 deletions(-) diff --git a/src/main/java/Deadline.java b/src/main/java/Deadline.java index 21086c61e..573b7b879 100644 --- a/src/main/java/Deadline.java +++ b/src/main/java/Deadline.java @@ -6,11 +6,6 @@ public Deadline(String description, String by) { this.by = by; } -// public Deadline(String description, boolean isDone, String by) { -// super(description, isDone); -// this.by = by; -// } - @Override public String toString() { return "[D]" + super.toString() + " (by: " + by + ")"; diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index c11781bfd..cc49e651f 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -27,14 +27,11 @@ private static void markingAsDone(String echoInput, int counter, Task[] storedTa storedTask[listNumber-1].setIsDone(true); listTasks(counter, storedTask); - } - catch (NumberFormatException ex) { + } catch (NumberFormatException ex) { printMarkError(); - } - catch (ArrayIndexOutOfBoundsException ex) { + } catch (ArrayIndexOutOfBoundsException ex) { printMarkError(); - } - catch (NullPointerException ex) { + } catch (NullPointerException ex) { printMarkError(); } } @@ -44,7 +41,14 @@ private static void printMarkError() { System.out.println("*DID NOT ENTER A VALID NUMBER*"); System.out.println("____________________________________________________________\n"); } - + + private static void printInvalidInput() { + System.out.println("____________________________________________________________"); + System.out.println("Invalid input"); + System.out.println("____________________________________________________________\n"); + } + + private static void printTaskInput(Task task, int counter) { System.out.println("____________________________________________________________"); System.out.println("Got it. I've added this task:"); @@ -63,26 +67,21 @@ private static void manageInput() { input = scanner.nextLine(); if (input.equals("bye")) { break; - } - else if (input.equals("list")) { + } else if (input.equals("list")) { listTasks(counter, storedTask); - } - else if (input.startsWith("mark")) { + } else if (input.startsWith("mark")) { markingAsDone(input, counter, storedTask); - } - else if (input.startsWith("todo ")) { + } else if (input.startsWith("todo ")) { Task tempTask = new Todo(input); storedTask[counter] = tempTask; counter = counter + 1; printTaskInput(tempTask, counter); - } - else if (input.startsWith("deadline") && input.contains("/")) { + } else if (input.startsWith("deadline") && input.contains("/")) { Task tempTask = new Deadline(input, input.substring(input.lastIndexOf("/") + 1)); storedTask[counter] = tempTask; counter = counter + 1; printTaskInput(tempTask, counter); - } - else if (input.startsWith("event") && input.matches(".*/.*/.*")) { + } else if (input.startsWith("event") && input.matches(".*/.*/.*")) { String tempInput = input.substring(input.indexOf("/") + 1); String fromString = tempInput.substring(0, tempInput.indexOf("/")); String toString = tempInput.substring(tempInput.lastIndexOf("/") + 1); @@ -91,11 +90,8 @@ else if (input.startsWith("event") && input.matches(".*/.*/.*")) { storedTask[counter] = tempTask; counter = counter + 1; printTaskInput(tempTask, counter); - } - else { - System.out.println("____________________________________________________________"); - System.out.println("Invalid input"); - System.out.println("____________________________________________________________\n"); + } else { + printInvalidInput(); } } } diff --git a/src/main/java/Task.java b/src/main/java/Task.java index e5c5fad87..ff97fb6a0 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -23,7 +23,8 @@ public Task(String description, boolean isDone) { @Override public String toString() { - return "[" + ((this.isDone) ? "X] " : " ] ") + ((description.indexOf("/") == -1) ? description : (description.substring(0, description.indexOf("/")))); + String descriptionNoSlash = (description.indexOf("/") == -1) ? description : (description.substring(0, description.indexOf("/"))); + return "[" + ((this.isDone) ? "X] " : " ] ") + descriptionNoSlash; } public String getDescription() { diff --git a/src/main/java/Todo.java b/src/main/java/Todo.java index a6da7bd21..931cfd4f9 100644 --- a/src/main/java/Todo.java +++ b/src/main/java/Todo.java @@ -4,10 +4,6 @@ public Todo(String description) { super(description); } -// public Todo(String description, boolean isDone) { -// super(description, isDone); -// } - @Override public String toString() { return "[T]" + super.toString(); From 97150f3c87f3f451e94d858e94885b2cf50eff67 Mon Sep 17 00:00:00 2001 From: victorouy Date: Wed, 8 Feb 2023 04:20:14 +0800 Subject: [PATCH 08/20] Level-5 --- src/main/java/Duke.java | 114 +++++++++++++++++-------------- src/main/java/DukeException.java | 11 +++ 2 files changed, 72 insertions(+), 53 deletions(-) create mode 100644 src/main/java/DukeException.java diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index cc49e651f..a1d270c6e 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -11,15 +11,6 @@ public static void main(String[] args) { goodbye(); } - private static void listTasks(int counter, Task[] storedTask) { - System.out.println("____________________________________________________________"); - System.out.println("Here are the tasks in your list:"); - for (int i = 0; i < counter; i++) { - System.out.println((i + 1) + ". " + storedTask[i].toString()); - } - System.out.println("____________________________________________________________\n"); - } - private static void markingAsDone(String echoInput, int counter, Task[] storedTask) { try { String stringListNumber = echoInput.substring(5, echoInput.length()); @@ -36,19 +27,75 @@ private static void markingAsDone(String echoInput, int counter, Task[] storedTa } } - private static void printMarkError() { + private static void manageInput() { + Scanner scanner = new Scanner(System.in); + String input = ""; + Task[] storedTask = new Task[100]; + int counter = 0; + + while (!input.equals("bye")) { + try { + input = scanner.nextLine(); + if (input.equals("bye")) { + break; + } else if (input.equals("list")) { + listTasks(counter, storedTask); + } else if (input.startsWith("mark")) { + markingAsDone(input, counter, storedTask); + } else if (input.startsWith("todo")) { + blankTodo(input); + Task tempTask = new Todo(input); + storedTask[counter] = tempTask; + counter = counter + 1; + printTaskInput(tempTask, counter); + } else if (input.startsWith("deadline") && input.contains("/")) { + Task tempTask = new Deadline(input, input.substring(input.lastIndexOf("/") + 1)); + storedTask[counter] = tempTask; + counter = counter + 1; + printTaskInput(tempTask, counter); + } else if (input.startsWith("event") && input.matches(".*/.*/.*")) { + String tempInput = input.substring(input.indexOf("/") + 1); + String fromString = tempInput.substring(0, tempInput.indexOf("/")); + String toString = tempInput.substring(tempInput.lastIndexOf("/") + 1); + + Task tempTask = new Event(input, fromString, toString); + storedTask[counter] = tempTask; + counter = counter + 1; + printTaskInput(tempTask, counter); + } else { + invalidInput(); + } + } catch (DukeException ex) { + continue; + } + } + } + + private static void blankTodo(String input) throws DukeException { + if (input.length() == 4 || input.substring(4).isBlank()) { + throw new DukeException("☹ OOPS!!! The description of a todo cannot be empty."); + } + } + + private static void invalidInput() throws DukeException { + throw new DukeException("☹ OOPS!!! I'm sorry, but I don't know what that means :-("); + } + + private static void listTasks(int counter, Task[] storedTask) { System.out.println("____________________________________________________________"); - System.out.println("*DID NOT ENTER A VALID NUMBER*"); + System.out.println("Here are the tasks in your list:"); + for (int i = 0; i < counter; i++) { + System.out.println((i + 1) + ". " + storedTask[i].toString()); + } System.out.println("____________________________________________________________\n"); } - private static void printInvalidInput() { + private static void printMarkError() { System.out.println("____________________________________________________________"); - System.out.println("Invalid input"); + System.out.println("*DID NOT ENTER A VALID NUMBER*"); System.out.println("____________________________________________________________\n"); } - private static void printTaskInput(Task task, int counter) { System.out.println("____________________________________________________________"); System.out.println("Got it. I've added this task:"); @@ -57,45 +104,6 @@ private static void printTaskInput(Task task, int counter) { System.out.println("____________________________________________________________\n"); } - private static void manageInput() { - Scanner scanner = new Scanner(System.in); - String input = ""; - Task[] storedTask = new Task[100]; - int counter = 0; - - while (!input.equals("bye")) { - input = scanner.nextLine(); - if (input.equals("bye")) { - break; - } else if (input.equals("list")) { - listTasks(counter, storedTask); - } else if (input.startsWith("mark")) { - markingAsDone(input, counter, storedTask); - } else if (input.startsWith("todo ")) { - Task tempTask = new Todo(input); - storedTask[counter] = tempTask; - counter = counter + 1; - printTaskInput(tempTask, counter); - } else if (input.startsWith("deadline") && input.contains("/")) { - Task tempTask = new Deadline(input, input.substring(input.lastIndexOf("/") + 1)); - storedTask[counter] = tempTask; - counter = counter + 1; - printTaskInput(tempTask, counter); - } else if (input.startsWith("event") && input.matches(".*/.*/.*")) { - String tempInput = input.substring(input.indexOf("/") + 1); - String fromString = tempInput.substring(0, tempInput.indexOf("/")); - String toString = tempInput.substring(tempInput.lastIndexOf("/") + 1); - - Task tempTask = new Event(input, fromString, toString); - storedTask[counter] = tempTask; - counter = counter + 1; - printTaskInput(tempTask, counter); - } else { - printInvalidInput(); - } - } - } - private static void greetings() { String logo = " ____ _ \n" + "| _ \\ _ _| | _____ \n" diff --git a/src/main/java/DukeException.java b/src/main/java/DukeException.java new file mode 100644 index 000000000..06c109b01 --- /dev/null +++ b/src/main/java/DukeException.java @@ -0,0 +1,11 @@ +public class DukeException extends Exception { + + public DukeException() {} + + public DukeException(String message) { + super(message); + System.out.println("____________________________________________________________"); + System.out.println(message); + System.out.println("____________________________________________________________\n"); + } +} From 27639db18b96509a77677af87f001da229977469 Mon Sep 17 00:00:00 2001 From: victorouy Date: Wed, 8 Feb 2023 04:26:42 +0800 Subject: [PATCH 09/20] A-Packages --- README.md | 4 ++-- src/main/java/{ => duke/exceptions}/DukeException.java | 2 ++ src/main/java/{ => duke/main}/Duke.java | 10 +++++++++- src/main/java/{ => duke/task}/Deadline.java | 2 ++ src/main/java/{ => duke/task}/Event.java | 2 ++ src/main/java/{ => duke/task}/Task.java | 4 +++- src/main/java/{ => duke/task}/Todo.java | 2 ++ text-ui-test/EXPECTED.TXT | 2 +- text-ui-test/runtest.bat | 4 ++-- 9 files changed, 25 insertions(+), 7 deletions(-) rename src/main/java/{ => duke/exceptions}/DukeException.java (93%) rename src/main/java/{ => duke/main}/Duke.java (96%) rename src/main/java/{ => duke/task}/Deadline.java (93%) rename src/main/java/{ => duke/task}/Event.java (94%) rename src/main/java/{ => duke/task}/Task.java (91%) rename src/main/java/{ => duke/task}/Todo.java (90%) diff --git a/README.md b/README.md index 8715d4d91..04cdf8d26 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Duke project template +# duke.main.Duke project template This is a project template for a greenfield Java project. It's named after the Java mascot _Duke_. Given below are instructions on how to use it. @@ -13,7 +13,7 @@ Prerequisites: JDK 11, update Intellij to the most recent version. 1. If there are any further prompts, accept the defaults. 1. Configure the project to use **JDK 11** (not other versions) as explained in [here](https://www.jetbrains.com/help/idea/sdk.html#set-up-jdk).
In the same dialog, set the **Project language level** field to the `SDK default` option. -3. After that, locate the `src/main/java/Duke.java` file, right-click it, and choose `Run Duke.main()` (if the code editor is showing compile errors, try restarting the IDE). If the setup is correct, you should see something like the below as the output: +3. After that, locate the `src/main/java/duke.main.Duke.java` file, right-click it, and choose `Run duke.main.Duke.main()` (if the code editor is showing compile errors, try restarting the IDE). If the setup is correct, you should see something like the below as the output: ``` Hello from ____ _ diff --git a/src/main/java/DukeException.java b/src/main/java/duke/exceptions/DukeException.java similarity index 93% rename from src/main/java/DukeException.java rename to src/main/java/duke/exceptions/DukeException.java index 06c109b01..f631f1217 100644 --- a/src/main/java/DukeException.java +++ b/src/main/java/duke/exceptions/DukeException.java @@ -1,3 +1,5 @@ +package duke.exceptions; + public class DukeException extends Exception { public DukeException() {} diff --git a/src/main/java/Duke.java b/src/main/java/duke/main/Duke.java similarity index 96% rename from src/main/java/Duke.java rename to src/main/java/duke/main/Duke.java index a1d270c6e..23b4888f6 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/duke/main/Duke.java @@ -1,3 +1,11 @@ +package duke.main; + +import duke.exceptions.DukeException; +import duke.task.Deadline; +import duke.task.Event; +import duke.task.Task; +import duke.task.Todo; + import java.util.Scanner; /** @@ -112,7 +120,7 @@ private static void greetings() { + "|____/ \\__,_|_|\\_\\___|\n"; System.out.println("Hello from\n" + logo); System.out.println("____________________________________________________________"); - System.out.println("Hello! I'm Duke"); + System.out.println("Hello! I'm duke.main.Duke"); System.out.println("What can I do for you?"); System.out.println("____________________________________________________________\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 573b7b879..dea8c0d50 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 94% rename from src/main/java/Event.java rename to src/main/java/duke/task/Event.java index 0118bfd8e..89b5cadf4 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 from; protected String to; diff --git a/src/main/java/Task.java b/src/main/java/duke/task/Task.java similarity index 91% rename from src/main/java/Task.java rename to src/main/java/duke/task/Task.java index ff97fb6a0..7d11c8b13 100644 --- a/src/main/java/Task.java +++ b/src/main/java/duke/task/Task.java @@ -1,5 +1,7 @@ +package duke.task; + /** - * Task class used to have a text (description) and isDone attributes + * duke.task.Task class used to have a text (description) and isDone attributes */ public class Task { 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 931cfd4f9..8b66e9468 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) { diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index fcedffb3d..f823ba715 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -6,7 +6,7 @@ Hello from |____/ \__,_|_|\_\___| ____________________________________________________________ -Hello! I'm Duke +Hello! I'm duke.main.Duke What can I do for you? ____________________________________________________________ diff --git a/text-ui-test/runtest.bat b/text-ui-test/runtest.bat index 97c1d9157..aab623331 100644 --- a/text-ui-test/runtest.bat +++ b/text-ui-test/runtest.bat @@ -7,7 +7,7 @@ REM delete output from previous run if exist ACTUAL.TXT del ACTUAL.TXT REM compile the code into the bin folder -javac -cp ..\src\main\java -Xlint:none -d ..\bin ..\src\main\java\Duke.java +javac -cp ..\src\main\java -Xlint:none -d ..\bin ..\src\main\java\duke.main.Duke.java IF ERRORLEVEL 1 ( echo ********** BUILD FAILURE ********** exit /b 1 @@ -15,7 +15,7 @@ IF ERRORLEVEL 1 ( REM no error here, errorlevel == 0 REM run the program, feed commands from input.txt file and redirect the output to the ACTUAL.TXT -java -classpath ..\bin Duke < input.txt > ACTUAL.TXT +java -classpath ..\bin duke.main.Duke < input.txt > ACTUAL.TXT REM compare the output to the expected output FC ACTUAL.TXT EXPECTED.TXT From 5fc16d1b4f40691494d777c8650dabd35fcbfddc Mon Sep 17 00:00:00 2001 From: victorouy Date: Fri, 3 Mar 2023 15:48:21 +0800 Subject: [PATCH 10/20] Level-7 --- src/main/java/duke/main/Duke.java | 49 +++++++++++++++++++++++-------- 1 file changed, 36 insertions(+), 13 deletions(-) diff --git a/src/main/java/duke/main/Duke.java b/src/main/java/duke/main/Duke.java index 23b4888f6..598140c84 100644 --- a/src/main/java/duke/main/Duke.java +++ b/src/main/java/duke/main/Duke.java @@ -6,6 +6,8 @@ import duke.task.Task; import duke.task.Todo; +import java.lang.reflect.Array; +import java.util.ArrayList; import java.util.Scanner; /** @@ -19,26 +21,45 @@ public static void main(String[] args) { goodbye(); } - private static void markingAsDone(String echoInput, int counter, Task[] storedTask) { + private static int selectTask(String echoInput, int counter, ArrayList storedTask) { try { - String stringListNumber = echoInput.substring(5, echoInput.length()); - int listNumber = Integer.parseInt(stringListNumber); - - storedTask[listNumber-1].setIsDone(true); - listTasks(counter, storedTask); + if (echoInput.startsWith("mark")) { + String stringListNumber = echoInput.substring(5, echoInput.length()); + int index = Integer.parseInt(stringListNumber) - 1; + storedTask.get(index).setIsDone(true); + listTasks(counter, storedTask); + } + else if (echoInput.startsWith("delete")) { + String stringListNumber = echoInput.substring(7, echoInput.length()); + int index = Integer.parseInt(stringListNumber) - 1; + deleteTask(index, storedTask); + return counter - 1; + } } catch (NumberFormatException ex) { printMarkError(); } catch (ArrayIndexOutOfBoundsException ex) { printMarkError(); + } catch (IndexOutOfBoundsException ex) { + printMarkError(); } catch (NullPointerException ex) { printMarkError(); } + return counter; + } + + private static void deleteTask(int removeIndex, ArrayList storedTask) { + System.out.println("____________________________________________________________"); + System.out.println("Noted. I've removed this task:\n" + + " " + storedTask.get(removeIndex).toString() + "\n" + + "Now you have " + (storedTask.size() - 1) + " tasks in the list."); + System.out.println("____________________________________________________________\n"); + storedTask.remove(removeIndex); } private static void manageInput() { Scanner scanner = new Scanner(System.in); String input = ""; - Task[] storedTask = new Task[100]; + ArrayList storedTask = new ArrayList(); int counter = 0; while (!input.equals("bye")) { @@ -49,16 +70,16 @@ private static void manageInput() { } else if (input.equals("list")) { listTasks(counter, storedTask); } else if (input.startsWith("mark")) { - markingAsDone(input, counter, storedTask); + selectTask(input, counter, storedTask); } else if (input.startsWith("todo")) { blankTodo(input); Task tempTask = new Todo(input); - storedTask[counter] = tempTask; + storedTask.add(tempTask); counter = counter + 1; printTaskInput(tempTask, counter); } else if (input.startsWith("deadline") && input.contains("/")) { Task tempTask = new Deadline(input, input.substring(input.lastIndexOf("/") + 1)); - storedTask[counter] = tempTask; + storedTask.add(tempTask); counter = counter + 1; printTaskInput(tempTask, counter); } else if (input.startsWith("event") && input.matches(".*/.*/.*")) { @@ -67,9 +88,11 @@ private static void manageInput() { String toString = tempInput.substring(tempInput.lastIndexOf("/") + 1); Task tempTask = new Event(input, fromString, toString); - storedTask[counter] = tempTask; + storedTask.add(tempTask); counter = counter + 1; printTaskInput(tempTask, counter); + } else if (input.startsWith("delete")) { + counter = selectTask(input, counter, storedTask); } else { invalidInput(); } @@ -89,11 +112,11 @@ private static void invalidInput() throws DukeException { throw new DukeException("☹ OOPS!!! I'm sorry, but I don't know what that means :-("); } - private static void listTasks(int counter, Task[] storedTask) { + private static void listTasks(int counter, ArrayList storedTask) { System.out.println("____________________________________________________________"); System.out.println("Here are the tasks in your list:"); for (int i = 0; i < counter; i++) { - System.out.println((i + 1) + ". " + storedTask[i].toString()); + System.out.println((i + 1) + ". " + storedTask.get(i).toString()); } System.out.println("____________________________________________________________\n"); } From db824d56086e3069661f0440c9bd69e10593c857 Mon Sep 17 00:00:00 2001 From: victorouy Date: Fri, 3 Mar 2023 15:50:18 +0800 Subject: [PATCH 11/20] Level-6 --- src/main/java/duke/main/Duke.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/duke/main/Duke.java b/src/main/java/duke/main/Duke.java index 598140c84..f9946d2ac 100644 --- a/src/main/java/duke/main/Duke.java +++ b/src/main/java/duke/main/Duke.java @@ -11,7 +11,7 @@ import java.util.Scanner; /** - * A class that acts as a CLI that keeps tracks of tasks you write and mark down + * A class that acts as a CLI that keeps track of tasks you write and mark down */ public class Duke { From 68ee37fbeb487c150023be5d7e6fdcd1315d737a Mon Sep 17 00:00:00 2001 From: victorouy Date: Sat, 4 Mar 2023 16:32:00 +0800 Subject: [PATCH 12/20] branch-Level-7 complete --- src/data/duke.txt | 2 + src/main/java/duke/main/Duke.java | 141 +++++++++++++++++++++----- src/main/java/duke/task/Deadline.java | 5 + src/main/java/duke/task/Event.java | 6 ++ src/main/java/duke/task/Todo.java | 4 + 5 files changed, 135 insertions(+), 23 deletions(-) create mode 100644 src/data/duke.txt diff --git a/src/data/duke.txt b/src/data/duke.txt new file mode 100644 index 000000000..caefc69a2 --- /dev/null +++ b/src/data/duke.txt @@ -0,0 +1,2 @@ +T|0|asdfa +D|1|adfasdfasdf/modna \ No newline at end of file diff --git a/src/main/java/duke/main/Duke.java b/src/main/java/duke/main/Duke.java index 23b4888f6..9e93465a8 100644 --- a/src/main/java/duke/main/Duke.java +++ b/src/main/java/duke/main/Duke.java @@ -6,6 +6,8 @@ import duke.task.Task; import duke.task.Todo; +import java.io.*; +import java.util.ArrayList; import java.util.Scanner; /** @@ -13,19 +15,20 @@ */ public class Duke { - public static void main(String[] args) { + public static void main(String[] args) throws IOException { greetings(); manageInput(); goodbye(); } - private static void markingAsDone(String echoInput, int counter, Task[] storedTask) { + private static void selectTask(String echoInput, int counter, ArrayList storedTask) { try { - String stringListNumber = echoInput.substring(5, echoInput.length()); - int listNumber = Integer.parseInt(stringListNumber); - - storedTask[listNumber-1].setIsDone(true); - listTasks(counter, storedTask); + if (echoInput.startsWith("mark")) { + String stringListNumber = echoInput.substring(5, echoInput.length()); + int index = Integer.parseInt(stringListNumber) - 1; + storedTask.get(index).setIsDone(true); + listTasks(counter, storedTask); + } } catch (NumberFormatException ex) { printMarkError(); } catch (ArrayIndexOutOfBoundsException ex) { @@ -35,11 +38,13 @@ private static void markingAsDone(String echoInput, int counter, Task[] storedTa } } - private static void manageInput() { + private static void manageInput() throws IOException { Scanner scanner = new Scanner(System.in); String input = ""; - Task[] storedTask = new Task[100]; - int counter = 0; + ArrayList storedTask = new ArrayList(); + + dukeFile(storedTask); + int counter = storedTask.size(); while (!input.equals("bye")) { try { @@ -49,27 +54,31 @@ private static void manageInput() { } else if (input.equals("list")) { listTasks(counter, storedTask); } else if (input.startsWith("mark")) { - markingAsDone(input, counter, storedTask); + selectTask(input, counter, storedTask); + updateDukeFile(storedTask); } else if (input.startsWith("todo")) { blankTodo(input); - Task tempTask = new Todo(input); - storedTask[counter] = tempTask; - counter = counter + 1; + Task tempTask = new Todo(input.substring(5)); + storedTask.add(tempTask); + counter++; printTaskInput(tempTask, counter); + writeDukeFile(tempTask, true); } else if (input.startsWith("deadline") && input.contains("/")) { - Task tempTask = new Deadline(input, input.substring(input.lastIndexOf("/") + 1)); - storedTask[counter] = tempTask; - counter = counter + 1; + Task tempTask = new Deadline(input.substring(9), input.substring(input.lastIndexOf("/") + 1)); + storedTask.add(tempTask); + counter++; printTaskInput(tempTask, counter); + writeDukeFile(tempTask, true); } else if (input.startsWith("event") && input.matches(".*/.*/.*")) { String tempInput = input.substring(input.indexOf("/") + 1); String fromString = tempInput.substring(0, tempInput.indexOf("/")); String toString = tempInput.substring(tempInput.lastIndexOf("/") + 1); - Task tempTask = new Event(input, fromString, toString); - storedTask[counter] = tempTask; - counter = counter + 1; + Task tempTask = new Event(input.substring(6), fromString, toString); + storedTask.add(tempTask); + counter++; printTaskInput(tempTask, counter); + writeDukeFile(tempTask, true); } else { invalidInput(); } @@ -79,6 +88,92 @@ private static void manageInput() { } } + private static void updateDukeFile(ArrayList storedTask) throws IOException { + writeDukeFile(storedTask.get(0), false); + for (int i = 1; i < storedTask.size(); i++) { + writeDukeFile(storedTask.get(i), true); + } + } + + private static void dukeFile(ArrayList storedTask) throws IOException { + java.nio.file.Path dukeFilePath = getDukeFilePath(); + boolean fileExists = java.nio.file.Files.exists(dukeFilePath); + java.nio.file.Path dataDirPath = getDataDirPath(); + boolean dirExists = java.nio.file.Files.exists(dataDirPath); + File dukeFile = new File(dukeFilePath.toString()); + + if (fileExists) { + readDukeFile(storedTask, dukeFile); + } else { + try { + if (!dirExists) { + File dataDir = new File(dataDirPath.toString()); + dataDir.mkdir(); + } + dukeFile.createNewFile(); + } catch (IOException e) { + System.out.println("An error occurred."); + e.printStackTrace(); + } + } + } + + private static java.nio.file.Path getDukeFilePath() { + File f = new File(""); + String home = f.getAbsolutePath(); + return java.nio.file.Paths.get(home, "src", "data", "duke.txt"); + } + + private static java.nio.file.Path getDataDirPath() { + File f = new File(""); + String home = f.getAbsolutePath(); + return java.nio.file.Paths.get(home, "src", "data"); + } + + private static void readDukeFile(ArrayList storedTask, File dukeFile) throws IOException { + Scanner s = new Scanner(dukeFile); + while (s.hasNextLine()) { + String task = s.nextLine(); + String taskType = task.substring(0, 1); + boolean isMarked = task.substring(2, 3).equals("0") ? false : true; + String taskDesc = task.substring(4); + + if (taskType.equals("T")) { + Task tempTask = new Todo(taskDesc, isMarked); + storedTask.add(tempTask); + } else if (taskType.equals("D")) { + Task tempTask = new Deadline(taskDesc, taskDesc.substring(taskDesc.lastIndexOf("/") + 1), isMarked); + storedTask.add(tempTask); + } else if (taskType.equals("E")) { + String tempInput = taskDesc.substring(taskDesc.indexOf("/") + 1); + String fromString = tempInput.substring(0, tempInput.indexOf("/")); + String toString = tempInput.substring(tempInput.lastIndexOf("/") + 1); + + Task tempTask = new Event(taskDesc, fromString, toString, isMarked); + storedTask.add(tempTask); + } + } + } + + private static void writeDukeFile(Task task, boolean appendFile) throws IOException { + String line = (task.getIsDone() ? "1" : "0") + "|" + task.getDescription(); + if (task instanceof Todo) { + line = "T|" + line; + } else if (task instanceof Deadline) { + line = "D|" + line; + } else if (task instanceof Event) { + line = "E|" + line; + } + File dukeFile = new File(getDukeFilePath().toString()); + FileWriter fw = new FileWriter(dukeFile, appendFile); + if (appendFile) { + fw.write("\n" + line); + } else { + fw.write(line); + } + fw.close(); + } + private static void blankTodo(String input) throws DukeException { if (input.length() == 4 || input.substring(4).isBlank()) { throw new DukeException("☹ OOPS!!! The description of a todo cannot be empty."); @@ -89,11 +184,11 @@ private static void invalidInput() throws DukeException { throw new DukeException("☹ OOPS!!! I'm sorry, but I don't know what that means :-("); } - private static void listTasks(int counter, Task[] storedTask) { + private static void listTasks(int counter, ArrayList storedTask) { System.out.println("____________________________________________________________"); System.out.println("Here are the tasks in your list:"); for (int i = 0; i < counter; i++) { - System.out.println((i + 1) + ". " + storedTask[i].toString()); + System.out.println((i + 1) + ". " + storedTask.get(i).toString()); } System.out.println("____________________________________________________________\n"); } @@ -120,7 +215,7 @@ private static void greetings() { + "|____/ \\__,_|_|\\_\\___|\n"; System.out.println("Hello from\n" + logo); System.out.println("____________________________________________________________"); - System.out.println("Hello! I'm duke.main.Duke"); + System.out.println("Hello! I'm Duke"); System.out.println("What can I do for you?"); System.out.println("____________________________________________________________\n"); } diff --git a/src/main/java/duke/task/Deadline.java b/src/main/java/duke/task/Deadline.java index dea8c0d50..8e09af15d 100644 --- a/src/main/java/duke/task/Deadline.java +++ b/src/main/java/duke/task/Deadline.java @@ -8,6 +8,11 @@ public Deadline(String description, String by) { this.by = by; } + public Deadline(String description, String by, boolean isDone) { + super(description, isDone); + this.by = by; + } + @Override 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 89b5cadf4..f157f9e04 100644 --- a/src/main/java/duke/task/Event.java +++ b/src/main/java/duke/task/Event.java @@ -10,6 +10,12 @@ public Event(String description, String from, String to) { this.to = to; } + public Event(String description, String from, String to, boolean isDone) { + super(description, isDone); + this.from = from; + this.to = to; + } + @Override public String toString() { return "[E]" + super.toString() + " (from: " + this.from + " to: " + this.to + ")"; diff --git a/src/main/java/duke/task/Todo.java b/src/main/java/duke/task/Todo.java index 8b66e9468..672f357e7 100644 --- a/src/main/java/duke/task/Todo.java +++ b/src/main/java/duke/task/Todo.java @@ -6,6 +6,10 @@ public Todo(String description) { super(description); } + public Todo(String description, boolean isDone) { + super(description, isDone); + } + @Override public String toString() { return "[T]" + super.toString(); From 75d707b93afa3e250b68813cb3b14eb1707e3abd Mon Sep 17 00:00:00 2001 From: victorouy Date: Sat, 4 Mar 2023 16:34:24 +0800 Subject: [PATCH 13/20] adding tag --- src/main/java/duke/main/Duke.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/duke/main/Duke.java b/src/main/java/duke/main/Duke.java index 9e93465a8..85598237d 100644 --- a/src/main/java/duke/main/Duke.java +++ b/src/main/java/duke/main/Duke.java @@ -11,7 +11,7 @@ import java.util.Scanner; /** - * A class that acts as a CLI that keeps tracks of tasks you write and mark down + * A class that acts as a CLI that keeps tracks of tasks you write and mark down */ public class Duke { From 2acafc4c2b67a4942c3d217c12b4dea6d6f3492d Mon Sep 17 00:00:00 2001 From: victorouy Date: Sat, 4 Mar 2023 18:45:17 +0800 Subject: [PATCH 14/20] A-Jar complete --- src/data/duke.txt | 4 +- src/main/java/META-INF/MANIFEST.MF | 3 + src/main/java/duke/main/Duke.java | 91 +++++++++++++++++------------- 3 files changed, 58 insertions(+), 40 deletions(-) create mode 100644 src/main/java/META-INF/MANIFEST.MF diff --git a/src/data/duke.txt b/src/data/duke.txt index caefc69a2..6d9e68b5d 100644 --- a/src/data/duke.txt +++ b/src/data/duke.txt @@ -1,2 +1,2 @@ -T|0|asdfa -D|1|adfasdfasdf/modna \ No newline at end of file +T|1| +T|0|asdf \ No newline at end of file diff --git a/src/main/java/META-INF/MANIFEST.MF b/src/main/java/META-INF/MANIFEST.MF new file mode 100644 index 000000000..2c6354be6 --- /dev/null +++ b/src/main/java/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Main-Class: duke.main.Duke + diff --git a/src/main/java/duke/main/Duke.java b/src/main/java/duke/main/Duke.java index 214bfd40f..1ba27b15c 100644 --- a/src/main/java/duke/main/Duke.java +++ b/src/main/java/duke/main/Duke.java @@ -108,33 +108,38 @@ private static void manageInput() throws IOException { } } - private static void updateDukeFile(ArrayList storedTask) throws IOException { + private static void updateDukeFile(ArrayList storedTask) { writeDukeFile(storedTask.get(0), false); for (int i = 1; i < storedTask.size(); i++) { writeDukeFile(storedTask.get(i), true); } } - private static void dukeFile(ArrayList storedTask) throws IOException { + private static void dukeFile(ArrayList storedTask) { java.nio.file.Path dukeFilePath = getDukeFilePath(); boolean fileExists = java.nio.file.Files.exists(dukeFilePath); java.nio.file.Path dataDirPath = getDataDirPath(); - boolean dirExists = java.nio.file.Files.exists(dataDirPath); + boolean dataDirExists = java.nio.file.Files.exists(dataDirPath); + java.nio.file.Path srcDirPath = getSrcDirPath(); + boolean drcDirExists = java.nio.file.Files.exists(srcDirPath); File dukeFile = new File(dukeFilePath.toString()); - if (fileExists) { - readDukeFile(storedTask, dukeFile); - } else { - try { - if (!dirExists) { + try { + if (fileExists) { + readDukeFile(storedTask, dukeFile); + } else { + if (!drcDirExists) { + File srcDir = new File(srcDirPath.toString()); + srcDir.mkdir(); + } + if (!dataDirExists) { File dataDir = new File(dataDirPath.toString()); dataDir.mkdir(); } dukeFile.createNewFile(); - } catch (IOException e) { - System.out.println("An error occurred."); - e.printStackTrace(); } + } catch (IOException e) { + System.out.println("Note: data will not be saved (Duke.txt unable to be created)"); } } @@ -150,32 +155,40 @@ private static java.nio.file.Path getDataDirPath() { return java.nio.file.Paths.get(home, "src", "data"); } - private static void readDukeFile(ArrayList storedTask, File dukeFile) throws IOException { + private static java.nio.file.Path getSrcDirPath() { + File f = new File(""); + String home = f.getAbsolutePath(); + return java.nio.file.Paths.get(home, "src"); + } + + private static void readDukeFile(ArrayList storedTask, File dukeFile) throws FileNotFoundException { Scanner s = new Scanner(dukeFile); while (s.hasNextLine()) { String task = s.nextLine(); - String taskType = task.substring(0, 1); - boolean isMarked = task.substring(2, 3).equals("0") ? false : true; - String taskDesc = task.substring(4); - - if (taskType.equals("T")) { - Task tempTask = new Todo(taskDesc, isMarked); - storedTask.add(tempTask); - } else if (taskType.equals("D")) { - Task tempTask = new Deadline(taskDesc, taskDesc.substring(taskDesc.lastIndexOf("/") + 1), isMarked); - storedTask.add(tempTask); - } else if (taskType.equals("E")) { - String tempInput = taskDesc.substring(taskDesc.indexOf("/") + 1); - String fromString = tempInput.substring(0, tempInput.indexOf("/")); - String toString = tempInput.substring(tempInput.lastIndexOf("/") + 1); - - Task tempTask = new Event(taskDesc, fromString, toString, isMarked); - storedTask.add(tempTask); + if (task.length() > 4) { + String taskType = task.substring(0, 1); + boolean isMarked = task.substring(2, 3).equals("0") ? false : true; + String taskDesc = task.substring(4); + + if (taskType.equals("T")) { + Task tempTask = new Todo(taskDesc, isMarked); + storedTask.add(tempTask); + } else if (taskType.equals("D")) { + Task tempTask = new Deadline(taskDesc, taskDesc.substring(taskDesc.lastIndexOf("/") + 1), isMarked); + storedTask.add(tempTask); + } else if (taskType.equals("E")) { + String tempInput = taskDesc.substring(taskDesc.indexOf("/") + 1); + String fromString = tempInput.substring(0, tempInput.indexOf("/")); + String toString = tempInput.substring(tempInput.lastIndexOf("/") + 1); + + Task tempTask = new Event(taskDesc, fromString, toString, isMarked); + storedTask.add(tempTask); + } } } } - private static void writeDukeFile(Task task, boolean appendFile) throws IOException { + private static void writeDukeFile(Task task, boolean appendFile) { String line = (task.getIsDone() ? "1" : "0") + "|" + task.getDescription(); if (task instanceof Todo) { line = "T|" + line; @@ -184,14 +197,16 @@ private static void writeDukeFile(Task task, boolean appendFile) throws IOExcept } else if (task instanceof Event) { line = "E|" + line; } - File dukeFile = new File(getDukeFilePath().toString()); - FileWriter fw = new FileWriter(dukeFile, appendFile); - if (appendFile) { - fw.write("\n" + line); - } else { - fw.write(line); - } - fw.close(); + try { + File dukeFile = new File(getDukeFilePath().toString()); + FileWriter fw = new FileWriter(dukeFile, appendFile); + if (appendFile) { + fw.write("\n" + line); + } else { + fw.write(line); + } + fw.close(); + } catch (IOException ex) {} } private static void blankTodo(String input) throws DukeException { From 04dd8a3ce42991fdf08f7d0d8f0ac8fe20ec00c8 Mon Sep 17 00:00:00 2001 From: victorouy Date: Sun, 5 Mar 2023 21:07:38 +0800 Subject: [PATCH 15/20] A-MoreOOP Completed --- data/tasks.txt | 0 src/data/duke.txt | 2 - src/main/java/duke/entity/Parser.java | 37 +++ src/main/java/duke/entity/Storage.java | 115 ++++++++ src/main/java/duke/entity/TaskList.java | 38 +++ src/main/java/duke/entity/Ui.java | 137 +++++++++ .../java/duke/exceptions/DukeException.java | 10 +- src/main/java/duke/main/Duke.java | 266 ++---------------- 8 files changed, 355 insertions(+), 250 deletions(-) create mode 100644 data/tasks.txt delete mode 100644 src/data/duke.txt create mode 100644 src/main/java/duke/entity/Parser.java create mode 100644 src/main/java/duke/entity/Storage.java create mode 100644 src/main/java/duke/entity/TaskList.java create mode 100644 src/main/java/duke/entity/Ui.java diff --git a/data/tasks.txt b/data/tasks.txt new file mode 100644 index 000000000..e69de29bb diff --git a/src/data/duke.txt b/src/data/duke.txt deleted file mode 100644 index 6d9e68b5d..000000000 --- a/src/data/duke.txt +++ /dev/null @@ -1,2 +0,0 @@ -T|1| -T|0|asdf \ No newline at end of file diff --git a/src/main/java/duke/entity/Parser.java b/src/main/java/duke/entity/Parser.java new file mode 100644 index 000000000..e8e0a07f8 --- /dev/null +++ b/src/main/java/duke/entity/Parser.java @@ -0,0 +1,37 @@ +package duke.entity; + +public class Parser { + private String input; + + public void setInput(String input) { + this.input = input; + } + + public int parseMarkIndex() { + String stringListNumber = input.substring(5); + return Integer.parseInt(stringListNumber) - 1; + } + + public int parseDeleteIndex() { + String stringListNumber = input.substring(7); + return Integer.parseInt(stringListNumber) - 1; + } + + public String parseDeadlineBy() { + return input.substring(input.lastIndexOf("/") + 1); + } + + public String parseEventFrom() { + String tempInput = input.substring(input.indexOf("/") + 1); + return tempInput.substring(0, tempInput.indexOf("/")); + } + + public String parseEventTo() { + String tempInput = input.substring(input.indexOf("/") + 1); + return tempInput.substring(tempInput.lastIndexOf("/") + 1); + } + + public boolean validateEventInput() { + return input.matches(".*/.*/.*"); + } +} diff --git a/src/main/java/duke/entity/Storage.java b/src/main/java/duke/entity/Storage.java new file mode 100644 index 000000000..0c46da391 --- /dev/null +++ b/src/main/java/duke/entity/Storage.java @@ -0,0 +1,115 @@ +package duke.entity; + +import duke.exceptions.DukeException; +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; + + public Storage(String filePath) { + this.filePath = filePath; + } + + public ArrayList load() throws DukeException { + + String[] filePathArr = filePath.split("/"); + String tempFilePath = filePath.substring(0, filePath.indexOf("/")); + ArrayList tasks = new ArrayList(); + + String tempPath = filePathArr[0]; + for (int i = 0; i < filePathArr.length; i++) { + if (i != 0) { + tempPath = tempPath + "/" + filePathArr[i]; + } + java.nio.file.Path filePath = getPath(tempPath); + boolean pathExists = java.nio.file.Files.exists(filePath); + File pathFile = new File(filePath.toString()); + + try { + if (i == (filePathArr.length - 1) && pathExists) { + readDukeFile(tasks, pathFile); + } else if (!pathExists) { + if (i == (filePathArr.length - 1)) { + pathFile.createNewFile(); + } else { + pathFile.mkdir(); + } + } + } catch (IOException e) { + throw new DukeException("Note: data will not be saved (Duke.txt unable to be created)"); + } + } + return tasks; + } + + private void readDukeFile(ArrayList tasks, File dukeFile) throws FileNotFoundException { + Scanner s = new Scanner(dukeFile); + while (s.hasNextLine()) { + String task = s.nextLine(); + if (task.length() > 4) { + String taskType = task.substring(0, 1); + boolean isMarked = task.substring(2, 3).equals("0") ? false : true; + String taskDesc = task.substring(4); + + if (taskType.equals("T")) { + Task tempTask = new Todo(taskDesc, isMarked); + tasks.add(tempTask); + } else if (taskType.equals("D")) { + Task tempTask = new Deadline(taskDesc, taskDesc.substring(taskDesc.lastIndexOf("/") + 1), isMarked); + tasks.add(tempTask); + } else if (taskType.equals("E")) { + String tempInput = taskDesc.substring(taskDesc.indexOf("/") + 1); + String fromString = tempInput.substring(0, tempInput.indexOf("/")); + String toString = tempInput.substring(tempInput.lastIndexOf("/") + 1); + + Task tempTask = new Event(taskDesc, fromString, toString, isMarked); + tasks.add(tempTask); + } + } + } + } + + private java.nio.file.Path getPath(String path) { + File f = new File(""); + String home = f.getAbsolutePath(); + return java.nio.file.Paths.get(home, path); + } + + public void updateDukeFile(TaskList taskList) { + writeDukeFile(taskList.getTask(0), false); + for (int i = 1; i < taskList.taskSize(); i++) { + writeDukeFile(taskList.getTask(i), true); + } + } + + public void writeDukeFile(Task task, boolean appendFile) { + String line = (task.getIsDone() ? "1" : "0") + "|" + task.getDescription(); + if (task instanceof Todo) { + line = "T|" + line; + } else if (task instanceof Deadline) { + line = "D|" + line; + } else if (task instanceof Event) { + line = "E|" + line; + } + try { + File dukeFile = new File(getPath(this.filePath).toString()); + FileWriter fw = new FileWriter(dukeFile, appendFile); + if (appendFile) { + fw.write("\n" + line); + } else { + fw.write(line); + } + fw.close(); + } catch (IOException ex) {} + } +} diff --git a/src/main/java/duke/entity/TaskList.java b/src/main/java/duke/entity/TaskList.java new file mode 100644 index 000000000..56bc99c90 --- /dev/null +++ b/src/main/java/duke/entity/TaskList.java @@ -0,0 +1,38 @@ +package duke.entity; + +import duke.task.Task; + +import java.util.ArrayList; + +public class TaskList { + + private ArrayList taskArrayList; + + public TaskList() { + + } + + public TaskList(ArrayList taskArrayList) { + this.taskArrayList = taskArrayList; + } + + public ArrayList getTaskArrayList() { + return taskArrayList; + } + + public Task getTask(int index) { + return this.taskArrayList.get(index); + } + + public void addTask(Task task) { + taskArrayList.add(task); + } + + public int taskSize() { + return taskArrayList.size(); + } + + public void removeTask(int index) { + this.taskArrayList.remove(index); + } +} diff --git a/src/main/java/duke/entity/Ui.java b/src/main/java/duke/entity/Ui.java new file mode 100644 index 000000000..3fb561443 --- /dev/null +++ b/src/main/java/duke/entity/Ui.java @@ -0,0 +1,137 @@ +package duke.entity; + +import duke.exceptions.DukeException; +import duke.task.Deadline; +import duke.task.Event; +import duke.task.Task; +import duke.task.Todo; + +import java.util.ArrayList; +import java.util.Scanner; + +public class Ui { + private Parser parser = new Parser(); + + public boolean manageInput(TaskList taskList, Storage storage) { + Scanner scanner = new Scanner(System.in); + int counter = taskList.taskSize(); + + try { + String input = scanner.nextLine(); + this.parser.setInput(input); + + if (input.equals("bye")) { + return false; + } else if (input.equals("list")) { + listTasks(counter, taskList.getTaskArrayList()); + } else if (input.startsWith("mark")) { + selectTask(input, taskList); + listTasks(counter, taskList.getTaskArrayList()); + storage.updateDukeFile(taskList); + } else if (input.startsWith("todo")) { + blankTodo(input); + Task tempTask = new Todo(input.substring(5)); + taskList.addTask(tempTask); + printAddedTask(tempTask, counter); + storage.writeDukeFile(tempTask, true); + } else if (input.startsWith("deadline") && input.contains("/")) { + Task tempTask = new Deadline(input.substring(9), parser.parseDeadlineBy()); + taskList.addTask(tempTask); + printAddedTask(tempTask, counter); + storage.writeDukeFile(tempTask, true); + } else if (input.startsWith("event") && parser.validateEventInput()) { + Task tempTask = new Event(input.substring(6), parser.parseEventFrom(), parser.parseEventTo()); + taskList.addTask(tempTask); + printAddedTask(tempTask, counter); + storage.writeDukeFile(tempTask, true); + } else if (input.startsWith("delete")) { + selectTask(input, taskList); + } else { + invalidInput(); + } + } catch (DukeException ex) { + System.out.println(ex.toString()); + } + return true; + } + + private void selectTask(String input, TaskList taskList) { + try { + if (input.startsWith("mark")) { + taskList.getTask(parser.parseMarkIndex()).setIsDone(true); + } + else if (input.startsWith("delete")) { + deleteTask(parser.parseDeleteIndex(), taskList); + } + } catch (NumberFormatException ex) { + printMarkError(); + } catch (ArrayIndexOutOfBoundsException ex) { + printMarkError(); + } catch (IndexOutOfBoundsException ex) { + printMarkError(); + } catch (NullPointerException ex) { + printMarkError(); + } + } + + private void listTasks(int counter, ArrayList storedTask) { + System.out.println("____________________________________________________________"); + System.out.println("Here are the tasks in your list:"); + for (int i = 0; i < counter; i++) { + System.out.println((i + 1) + ". " + storedTask.get(i).toString()); + } + System.out.println("____________________________________________________________\n"); + } + + private void deleteTask(int removeIndex, TaskList taskList) { + System.out.println("____________________________________________________________"); + System.out.println("Noted. I've removed this task:\n" + + " " + taskList.getTask(removeIndex).toString() + "\n" + + "Now you have " + (taskList.taskSize() - 1) + " tasks in the list."); + System.out.println("____________________________________________________________\n"); + taskList.removeTask(removeIndex); + } + + private void blankTodo(String input) throws DukeException { + if (input.length() == 4 || input.substring(4).isBlank()) { + throw new DukeException("☹ OOPS!!! Must have a description.\n"); + } + } + + private void invalidInput() throws DukeException { + throw new DukeException("☹ OOPS!!! I'm sorry, but I don't know what that means :-(\n"); + } + + private void printMarkError() { + System.out.println("____________________________________________________________"); + System.out.println("*DID NOT ENTER A VALID NUMBER*"); + System.out.println("____________________________________________________________\n"); + } + + private void printAddedTask(Task task, int counter) { + System.out.println("____________________________________________________________"); + System.out.println("Got it. I've added this task:"); + System.out.println(task.toString()); + System.out.println("Now you have " + (counter + 1) + " tasks in the list."); + System.out.println("____________________________________________________________\n"); + } + + public void goodbye() { + System.out.println("____________________________________________________________"); + System.out.println("Bye. Hope to see you again soon!"); + System.out.println("____________________________________________________________\n"); + } + + public void greetings() { + String logo = " ____ _ \n" + + "| _ \\ _ _| | _____ \n" + + "| | | | | | | |/ / _ \\\n" + + "| |_| | |_| | < __/\n" + + "|____/ \\__,_|_|\\_\\___|\n"; + System.out.println("Hello from\n" + logo); + System.out.println("____________________________________________________________"); + System.out.println("Hello! I'm Duke"); + System.out.println("What can I do for you?"); + System.out.println("____________________________________________________________\n"); + } +} diff --git a/src/main/java/duke/exceptions/DukeException.java b/src/main/java/duke/exceptions/DukeException.java index f631f1217..4e9254281 100644 --- a/src/main/java/duke/exceptions/DukeException.java +++ b/src/main/java/duke/exceptions/DukeException.java @@ -6,8 +6,12 @@ public DukeException() {} public DukeException(String message) { super(message); - System.out.println("____________________________________________________________"); - System.out.println(message); - System.out.println("____________________________________________________________\n"); + } + + @Override + public String toString() { + return "____________________________________________________________\n" + + super.getMessage() + + "____________________________________________________________\n"; } } diff --git a/src/main/java/duke/main/Duke.java b/src/main/java/duke/main/Duke.java index 1ba27b15c..e93723e1e 100644 --- a/src/main/java/duke/main/Duke.java +++ b/src/main/java/duke/main/Duke.java @@ -1,263 +1,39 @@ package duke.main; +import duke.entity.Storage; +import duke.entity.TaskList; +import duke.entity.Ui; import duke.exceptions.DukeException; -import duke.task.Deadline; -import duke.task.Event; -import duke.task.Task; -import duke.task.Todo; - -import java.util.ArrayList; -import java.io.*; -import java.util.Scanner; /** * A class that acts as a CLI that keeps tracks of tasks you write and mark down */ public class Duke { + private Storage storage; + private TaskList tasks; + private Ui ui; - public static void main(String[] args) throws IOException { - greetings(); - manageInput(); - goodbye(); - } - - private static int selectTask(String echoInput, int counter, ArrayList storedTask) { + public Duke(String filePath) { + ui = new Ui(); + storage = new Storage(filePath); try { - if (echoInput.startsWith("mark")) { - String stringListNumber = echoInput.substring(5, echoInput.length()); - int index = Integer.parseInt(stringListNumber) - 1; - storedTask.get(index).setIsDone(true); - listTasks(counter, storedTask); - } - else if (echoInput.startsWith("delete")) { - String stringListNumber = echoInput.substring(7, echoInput.length()); - int index = Integer.parseInt(stringListNumber) - 1; - deleteTask(index, storedTask); - return counter - 1; - } - } catch (NumberFormatException ex) { - printMarkError(); - } catch (ArrayIndexOutOfBoundsException ex) { - printMarkError(); - } catch (IndexOutOfBoundsException ex) { - printMarkError(); - } catch (NullPointerException ex) { - printMarkError(); - } - return counter; - } - - private static void deleteTask(int removeIndex, ArrayList storedTask) { - System.out.println("____________________________________________________________"); - System.out.println("Noted. I've removed this task:\n" + - " " + storedTask.get(removeIndex).toString() + "\n" + - "Now you have " + (storedTask.size() - 1) + " tasks in the list."); - System.out.println("____________________________________________________________\n"); - storedTask.remove(removeIndex); - } - - private static void manageInput() throws IOException { - Scanner scanner = new Scanner(System.in); - String input = ""; - ArrayList storedTask = new ArrayList(); - - dukeFile(storedTask); - int counter = storedTask.size(); - - while (!input.equals("bye")) { - try { - input = scanner.nextLine(); - if (input.equals("bye")) { - break; - } else if (input.equals("list")) { - listTasks(counter, storedTask); - } else if (input.startsWith("mark")) { - selectTask(input, counter, storedTask); - updateDukeFile(storedTask); - } else if (input.startsWith("todo")) { - blankTodo(input); - Task tempTask = new Todo(input.substring(5)); - storedTask.add(tempTask); - counter++; - printTaskInput(tempTask, counter); - writeDukeFile(tempTask, true); - } else if (input.startsWith("deadline") && input.contains("/")) { - Task tempTask = new Deadline(input.substring(9), input.substring(input.lastIndexOf("/") + 1)); - storedTask.add(tempTask); - counter++; - printTaskInput(tempTask, counter); - writeDukeFile(tempTask, true); - } else if (input.startsWith("event") && input.matches(".*/.*/.*")) { - String tempInput = input.substring(input.indexOf("/") + 1); - String fromString = tempInput.substring(0, tempInput.indexOf("/")); - String toString = tempInput.substring(tempInput.lastIndexOf("/") + 1); - - Task tempTask = new Event(input.substring(6), fromString, toString); - storedTask.add(tempTask); - counter++; - printTaskInput(tempTask, counter); - writeDukeFile(tempTask, true); - } else if (input.startsWith("delete")) { - counter = selectTask(input, counter, storedTask); - } else { - invalidInput(); - } - } catch (DukeException ex) { - continue; - } + tasks = new TaskList(storage.load()); + } catch (DukeException e) { + System.out.println(e.toString()); + tasks = new TaskList(); } } - private static void updateDukeFile(ArrayList storedTask) { - writeDukeFile(storedTask.get(0), false); - for (int i = 1; i < storedTask.size(); i++) { - writeDukeFile(storedTask.get(i), true); + public void run() { + ui.greetings(); + boolean exited = true; + while (exited) { + exited = ui.manageInput(tasks, storage); } + ui.goodbye(); } - private static void dukeFile(ArrayList storedTask) { - java.nio.file.Path dukeFilePath = getDukeFilePath(); - boolean fileExists = java.nio.file.Files.exists(dukeFilePath); - java.nio.file.Path dataDirPath = getDataDirPath(); - boolean dataDirExists = java.nio.file.Files.exists(dataDirPath); - java.nio.file.Path srcDirPath = getSrcDirPath(); - boolean drcDirExists = java.nio.file.Files.exists(srcDirPath); - File dukeFile = new File(dukeFilePath.toString()); - - try { - if (fileExists) { - readDukeFile(storedTask, dukeFile); - } else { - if (!drcDirExists) { - File srcDir = new File(srcDirPath.toString()); - srcDir.mkdir(); - } - if (!dataDirExists) { - File dataDir = new File(dataDirPath.toString()); - dataDir.mkdir(); - } - dukeFile.createNewFile(); - } - } catch (IOException e) { - System.out.println("Note: data will not be saved (Duke.txt unable to be created)"); - } - } - - private static java.nio.file.Path getDukeFilePath() { - File f = new File(""); - String home = f.getAbsolutePath(); - return java.nio.file.Paths.get(home, "src", "data", "duke.txt"); - } - - private static java.nio.file.Path getDataDirPath() { - File f = new File(""); - String home = f.getAbsolutePath(); - return java.nio.file.Paths.get(home, "src", "data"); - } - - private static java.nio.file.Path getSrcDirPath() { - File f = new File(""); - String home = f.getAbsolutePath(); - return java.nio.file.Paths.get(home, "src"); - } - - private static void readDukeFile(ArrayList storedTask, File dukeFile) throws FileNotFoundException { - Scanner s = new Scanner(dukeFile); - while (s.hasNextLine()) { - String task = s.nextLine(); - if (task.length() > 4) { - String taskType = task.substring(0, 1); - boolean isMarked = task.substring(2, 3).equals("0") ? false : true; - String taskDesc = task.substring(4); - - if (taskType.equals("T")) { - Task tempTask = new Todo(taskDesc, isMarked); - storedTask.add(tempTask); - } else if (taskType.equals("D")) { - Task tempTask = new Deadline(taskDesc, taskDesc.substring(taskDesc.lastIndexOf("/") + 1), isMarked); - storedTask.add(tempTask); - } else if (taskType.equals("E")) { - String tempInput = taskDesc.substring(taskDesc.indexOf("/") + 1); - String fromString = tempInput.substring(0, tempInput.indexOf("/")); - String toString = tempInput.substring(tempInput.lastIndexOf("/") + 1); - - Task tempTask = new Event(taskDesc, fromString, toString, isMarked); - storedTask.add(tempTask); - } - } - } - } - - private static void writeDukeFile(Task task, boolean appendFile) { - String line = (task.getIsDone() ? "1" : "0") + "|" + task.getDescription(); - if (task instanceof Todo) { - line = "T|" + line; - } else if (task instanceof Deadline) { - line = "D|" + line; - } else if (task instanceof Event) { - line = "E|" + line; - } - try { - File dukeFile = new File(getDukeFilePath().toString()); - FileWriter fw = new FileWriter(dukeFile, appendFile); - if (appendFile) { - fw.write("\n" + line); - } else { - fw.write(line); - } - fw.close(); - } catch (IOException ex) {} - } - - private static void blankTodo(String input) throws DukeException { - if (input.length() == 4 || input.substring(4).isBlank()) { - throw new DukeException("☹ OOPS!!! The description of a todo cannot be empty."); - } - } - - private static void invalidInput() throws DukeException { - throw new DukeException("☹ OOPS!!! I'm sorry, but I don't know what that means :-("); - } - - private static void listTasks(int counter, ArrayList storedTask) { - System.out.println("____________________________________________________________"); - System.out.println("Here are the tasks in your list:"); - for (int i = 0; i < counter; i++) { - System.out.println((i + 1) + ". " + storedTask.get(i).toString()); - } - System.out.println("____________________________________________________________\n"); - } - - private static void printMarkError() { - System.out.println("____________________________________________________________"); - System.out.println("*DID NOT ENTER A VALID NUMBER*"); - System.out.println("____________________________________________________________\n"); - } - - private static void printTaskInput(Task task, int counter) { - System.out.println("____________________________________________________________"); - System.out.println("Got it. I've added this task:"); - System.out.println(task.toString()); - System.out.println("Now you have " + counter + " tasks in the list."); - System.out.println("____________________________________________________________\n"); - } - - private static void greetings() { - String logo = " ____ _ \n" - + "| _ \\ _ _| | _____ \n" - + "| | | | | | | |/ / _ \\\n" - + "| |_| | |_| | < __/\n" - + "|____/ \\__,_|_|\\_\\___|\n"; - System.out.println("Hello from\n" + logo); - System.out.println("____________________________________________________________"); - System.out.println("Hello! I'm Duke"); - System.out.println("What can I do for you?"); - System.out.println("____________________________________________________________\n"); - } - - private static void goodbye() { - System.out.println("____________________________________________________________"); - System.out.println("Bye. Hope to see you again soon!"); - System.out.println("____________________________________________________________\n"); + public static void main(String[] args) { + new Duke("data/tasks.txt").run(); } } \ No newline at end of file From 3a959760bd75fa9e83b9f24ead9ad645b9d2cdf7 Mon Sep 17 00:00:00 2001 From: victorouy Date: Sun, 5 Mar 2023 21:45:37 +0800 Subject: [PATCH 16/20] Level-9 Complete --- data/tasks.txt | 3 +++ src/main/java/duke/entity/TaskList.java | 17 +++++++++--- src/main/java/duke/entity/Ui.java | 36 ++++++++++++++++--------- 3 files changed, 40 insertions(+), 16 deletions(-) diff --git a/data/tasks.txt b/data/tasks.txt index e69de29bb..a2f061f22 100644 --- a/data/tasks.txt +++ b/data/tasks.txt @@ -0,0 +1,3 @@ +T|0|hellp +D|1|help /monday +T|0|fasdfsdaf \ No newline at end of file diff --git a/src/main/java/duke/entity/TaskList.java b/src/main/java/duke/entity/TaskList.java index 56bc99c90..622472062 100644 --- a/src/main/java/duke/entity/TaskList.java +++ b/src/main/java/duke/entity/TaskList.java @@ -5,12 +5,9 @@ import java.util.ArrayList; public class TaskList { - private ArrayList taskArrayList; - public TaskList() { - - } + public TaskList() {} public TaskList(ArrayList taskArrayList) { this.taskArrayList = taskArrayList; @@ -35,4 +32,16 @@ public int taskSize() { public void removeTask(int index) { this.taskArrayList.remove(index); } + + public ArrayList findTaskArrayList(String keyword) { + + System.out.println("KEYWORD: " + keyword); + ArrayList tempTaskArrayList = new ArrayList(); + for (Task task : taskArrayList) { + if (task.getDescription().matches("(.*)" + keyword + "(.*)")) { + tempTaskArrayList.add(task); + } + } + return tempTaskArrayList; + } } diff --git a/src/main/java/duke/entity/Ui.java b/src/main/java/duke/entity/Ui.java index 3fb561443..e52830eda 100644 --- a/src/main/java/duke/entity/Ui.java +++ b/src/main/java/duke/entity/Ui.java @@ -14,8 +14,6 @@ public class Ui { public boolean manageInput(TaskList taskList, Storage storage) { Scanner scanner = new Scanner(System.in); - int counter = taskList.taskSize(); - try { String input = scanner.nextLine(); this.parser.setInput(input); @@ -23,29 +21,31 @@ public boolean manageInput(TaskList taskList, Storage storage) { if (input.equals("bye")) { return false; } else if (input.equals("list")) { - listTasks(counter, taskList.getTaskArrayList()); + listTasks(taskList.getTaskArrayList()); } else if (input.startsWith("mark")) { selectTask(input, taskList); - listTasks(counter, taskList.getTaskArrayList()); + listTasks(taskList.getTaskArrayList()); storage.updateDukeFile(taskList); } else if (input.startsWith("todo")) { - blankTodo(input); + blankDescription(input); Task tempTask = new Todo(input.substring(5)); taskList.addTask(tempTask); - printAddedTask(tempTask, counter); + printAddedTask(tempTask, taskList.taskSize()); storage.writeDukeFile(tempTask, true); } else if (input.startsWith("deadline") && input.contains("/")) { Task tempTask = new Deadline(input.substring(9), parser.parseDeadlineBy()); taskList.addTask(tempTask); - printAddedTask(tempTask, counter); + printAddedTask(tempTask, taskList.taskSize()); storage.writeDukeFile(tempTask, true); } else if (input.startsWith("event") && parser.validateEventInput()) { Task tempTask = new Event(input.substring(6), parser.parseEventFrom(), parser.parseEventTo()); taskList.addTask(tempTask); - printAddedTask(tempTask, counter); + printAddedTask(tempTask, taskList.taskSize()); storage.writeDukeFile(tempTask, true); } else if (input.startsWith("delete")) { selectTask(input, taskList); + } else if (input.startsWith("find")) { + findTasks(input, taskList); } else { invalidInput(); } @@ -74,10 +74,10 @@ else if (input.startsWith("delete")) { } } - private void listTasks(int counter, ArrayList storedTask) { + private void listTasks(ArrayList storedTask) { System.out.println("____________________________________________________________"); System.out.println("Here are the tasks in your list:"); - for (int i = 0; i < counter; i++) { + for (int i = 0; i < storedTask.size(); i++) { System.out.println((i + 1) + ". " + storedTask.get(i).toString()); } System.out.println("____________________________________________________________\n"); @@ -92,7 +92,19 @@ private void deleteTask(int removeIndex, TaskList taskList) { taskList.removeTask(removeIndex); } - private void blankTodo(String input) throws DukeException { + private void findTasks(String input, TaskList taskList) throws DukeException { + blankDescription(input); + ArrayList foundTaskList = taskList.findTaskArrayList(input.substring(5)); + + System.out.println("____________________________________________________________"); + System.out.println("Here are the matching tasks in your list:"); + for (int i = 0; i < foundTaskList.size(); i++) { + System.out.println((i + 1) + ". " + foundTaskList.get(i).toString()); + } + System.out.println("____________________________________________________________\n"); + } + + private void blankDescription(String input) throws DukeException { if (input.length() == 4 || input.substring(4).isBlank()) { throw new DukeException("☹ OOPS!!! Must have a description.\n"); } @@ -112,7 +124,7 @@ private void printAddedTask(Task task, int counter) { System.out.println("____________________________________________________________"); System.out.println("Got it. I've added this task:"); System.out.println(task.toString()); - System.out.println("Now you have " + (counter + 1) + " tasks in the list."); + System.out.println("Now you have " + counter + " tasks in the list."); System.out.println("____________________________________________________________\n"); } From 4d445e29166f86aa37bb9dae9286db8a18fb0080 Mon Sep 17 00:00:00 2001 From: victorouy Date: Sun, 5 Mar 2023 23:06:14 +0800 Subject: [PATCH 17/20] branch-A-JavaDoc complete --- src/main/java/duke/entity/Parser.java | 20 +++- src/main/java/duke/entity/Storage.java | 69 +++++++------- src/main/java/duke/entity/TaskList.java | 25 ++++- src/main/java/duke/entity/Ui.java | 92 ++++++++++++------- .../java/duke/exceptions/DukeException.java | 16 ++++ src/main/java/duke/main/Duke.java | 17 +++- src/main/java/duke/task/Deadline.java | 21 +++++ src/main/java/duke/task/Event.java | 23 +++++ src/main/java/duke/task/Task.java | 37 +++++++- src/main/java/duke/task/Todo.java | 14 +++ 10 files changed, 262 insertions(+), 72 deletions(-) diff --git a/src/main/java/duke/entity/Parser.java b/src/main/java/duke/entity/Parser.java index e8e0a07f8..edf47011b 100644 --- a/src/main/java/duke/entity/Parser.java +++ b/src/main/java/duke/entity/Parser.java @@ -1,5 +1,8 @@ package duke.entity; +/** + * Parses the user's inputs by making sense of the user command + */ public class Parser { private String input; @@ -7,16 +10,31 @@ public void setInput(String input) { this.input = input; } + /** + * Parse the input to find the index of task to be marked + * + * @return index to be marked + */ public int parseMarkIndex() { String stringListNumber = input.substring(5); return Integer.parseInt(stringListNumber) - 1; } + /** + * Parse the input to find the index of task to be deleted + * + * @return index to be deleted + */ public int parseDeleteIndex() { String stringListNumber = input.substring(7); return Integer.parseInt(stringListNumber) - 1; } + /** + * Parse input to get deadline date + * + * @return string of deadline date + */ public String parseDeadlineBy() { return input.substring(input.lastIndexOf("/") + 1); } @@ -34,4 +52,4 @@ public String parseEventTo() { public boolean validateEventInput() { return input.matches(".*/.*/.*"); } -} +} \ No newline at end of file diff --git a/src/main/java/duke/entity/Storage.java b/src/main/java/duke/entity/Storage.java index 0c46da391..9ef7a654c 100644 --- a/src/main/java/duke/entity/Storage.java +++ b/src/main/java/duke/entity/Storage.java @@ -13,6 +13,9 @@ import java.util.ArrayList; import java.util.Scanner; +/** + * Class used to deal with loading tasks from the file and saving tasks in the file + */ public class Storage { private String filePath; @@ -20,13 +23,17 @@ public Storage(String filePath) { this.filePath = filePath; } + /** + * Load or creates the data file into an array list of task + * + * @return loaded array list of task + * @throws DukeException if data will not be saved + */ public ArrayList load() throws DukeException { - String[] filePathArr = filePath.split("/"); - String tempFilePath = filePath.substring(0, filePath.indexOf("/")); ArrayList tasks = new ArrayList(); - String tempPath = filePathArr[0]; + for (int i = 0; i < filePathArr.length; i++) { if (i != 0) { tempPath = tempPath + "/" + filePathArr[i]; @@ -52,6 +59,34 @@ public ArrayList load() throws DukeException { return tasks; } + public void updateDukeFile(TaskList taskList) { + writeDukeFile(taskList.getTask(0), false); + for (int i = 1; i < taskList.taskSize(); i++) { + writeDukeFile(taskList.getTask(i), true); + } + } + + public void writeDukeFile(Task task, boolean appendFile) { + String line = (task.getIsDone() ? "1" : "0") + "|" + task.getDescription(); + if (task instanceof Todo) { + line = "T|" + line; + } else if (task instanceof Deadline) { + line = "D|" + line; + } else if (task instanceof Event) { + line = "E|" + line; + } + try { + File dukeFile = new File(getPath(this.filePath).toString()); + FileWriter fw = new FileWriter(dukeFile, appendFile); + if (appendFile) { + fw.write("\n" + line); + } else { + fw.write(line); + } + fw.close(); + } catch (IOException ex) {} + } + private void readDukeFile(ArrayList tasks, File dukeFile) throws FileNotFoundException { Scanner s = new Scanner(dukeFile); while (s.hasNextLine()) { @@ -84,32 +119,4 @@ private java.nio.file.Path getPath(String path) { String home = f.getAbsolutePath(); return java.nio.file.Paths.get(home, path); } - - public void updateDukeFile(TaskList taskList) { - writeDukeFile(taskList.getTask(0), false); - for (int i = 1; i < taskList.taskSize(); i++) { - writeDukeFile(taskList.getTask(i), true); - } - } - - public void writeDukeFile(Task task, boolean appendFile) { - String line = (task.getIsDone() ? "1" : "0") + "|" + task.getDescription(); - if (task instanceof Todo) { - line = "T|" + line; - } else if (task instanceof Deadline) { - line = "D|" + line; - } else if (task instanceof Event) { - line = "E|" + line; - } - try { - File dukeFile = new File(getPath(this.filePath).toString()); - FileWriter fw = new FileWriter(dukeFile, appendFile); - if (appendFile) { - fw.write("\n" + line); - } else { - fw.write(line); - } - fw.close(); - } catch (IOException ex) {} - } } diff --git a/src/main/java/duke/entity/TaskList.java b/src/main/java/duke/entity/TaskList.java index 56bc99c90..23f6af21e 100644 --- a/src/main/java/duke/entity/TaskList.java +++ b/src/main/java/duke/entity/TaskList.java @@ -1,16 +1,15 @@ package duke.entity; import duke.task.Task; - import java.util.ArrayList; +/** + * Contains the task list with operations to manipulate tasks in the list + */ public class TaskList { - private ArrayList taskArrayList; - public TaskList() { - - } + public TaskList() {} public TaskList(ArrayList taskArrayList) { this.taskArrayList = taskArrayList; @@ -35,4 +34,20 @@ public int taskSize() { public void removeTask(int index) { this.taskArrayList.remove(index); } + + /** + * Searches for tasks in task list that matches a given keyword + * + * @param keyword string to search for match + * @return contains the found/matched tasks + */ + public ArrayList findTaskArrayList(String keyword) { + ArrayList tempTaskArrayList = new ArrayList(); + for (Task task : taskArrayList) { + if (task.getDescription().matches("(.*)" + keyword + "(.*)")) { + tempTaskArrayList.add(task); + } + } + return tempTaskArrayList; + } } diff --git a/src/main/java/duke/entity/Ui.java b/src/main/java/duke/entity/Ui.java index 3fb561443..dbaf0a059 100644 --- a/src/main/java/duke/entity/Ui.java +++ b/src/main/java/duke/entity/Ui.java @@ -9,13 +9,21 @@ import java.util.ArrayList; import java.util.Scanner; +/** + * Interacts with user and outputs information given a response to users inputs + */ public class Ui { private Parser parser = new Parser(); + /** + * Takes input from user's command and processes it depending on their request + * + * @param taskList list of tasks + * @param storage storage object + * @return true if continue program, false otherwise + */ public boolean manageInput(TaskList taskList, Storage storage) { Scanner scanner = new Scanner(System.in); - int counter = taskList.taskSize(); - try { String input = scanner.nextLine(); this.parser.setInput(input); @@ -23,29 +31,31 @@ public boolean manageInput(TaskList taskList, Storage storage) { if (input.equals("bye")) { return false; } else if (input.equals("list")) { - listTasks(counter, taskList.getTaskArrayList()); + listTasks(taskList.getTaskArrayList()); } else if (input.startsWith("mark")) { selectTask(input, taskList); - listTasks(counter, taskList.getTaskArrayList()); + listTasks(taskList.getTaskArrayList()); storage.updateDukeFile(taskList); } else if (input.startsWith("todo")) { - blankTodo(input); + blankDescription(input); Task tempTask = new Todo(input.substring(5)); taskList.addTask(tempTask); - printAddedTask(tempTask, counter); + printAddedTask(tempTask, taskList.taskSize()); storage.writeDukeFile(tempTask, true); } else if (input.startsWith("deadline") && input.contains("/")) { Task tempTask = new Deadline(input.substring(9), parser.parseDeadlineBy()); taskList.addTask(tempTask); - printAddedTask(tempTask, counter); - storage.writeDukeFile(tempTask, true); + printAddedTask(tempTask, taskList.taskSize()); + storage.writeDukeFile(tempTask, true); } else if (input.startsWith("event") && parser.validateEventInput()) { Task tempTask = new Event(input.substring(6), parser.parseEventFrom(), parser.parseEventTo()); taskList.addTask(tempTask); - printAddedTask(tempTask, counter); + printAddedTask(tempTask, taskList.taskSize()); storage.writeDukeFile(tempTask, true); } else if (input.startsWith("delete")) { selectTask(input, taskList); + } else if (input.startsWith("find")) { + findTasks(input, taskList); } else { invalidInput(); } @@ -55,6 +65,31 @@ public boolean manageInput(TaskList taskList, Storage storage) { return true; } + /** + * Prints goodbye message + */ + public void goodbye() { + System.out.println("____________________________________________________________"); + System.out.println("Bye. Hope to see you again soon!"); + System.out.println("____________________________________________________________\n"); + } + + /** + * Prints greeting message + */ + public void greetings() { + String logo = " ____ _ \n" + + "| _ \\ _ _| | _____ \n" + + "| | | | | | | |/ / _ \\\n" + + "| |_| | |_| | < __/\n" + + "|____/ \\__,_|_|\\_\\___|\n"; + System.out.println("Hello from\n" + logo); + System.out.println("____________________________________________________________"); + System.out.println("Hello! I'm Duke"); + System.out.println("What can I do for you?"); + System.out.println("____________________________________________________________\n"); + } + private void selectTask(String input, TaskList taskList) { try { if (input.startsWith("mark")) { @@ -74,10 +109,10 @@ else if (input.startsWith("delete")) { } } - private void listTasks(int counter, ArrayList storedTask) { + private void listTasks(ArrayList storedTask) { System.out.println("____________________________________________________________"); System.out.println("Here are the tasks in your list:"); - for (int i = 0; i < counter; i++) { + for (int i = 0; i < storedTask.size(); i++) { System.out.println((i + 1) + ". " + storedTask.get(i).toString()); } System.out.println("____________________________________________________________\n"); @@ -92,7 +127,19 @@ private void deleteTask(int removeIndex, TaskList taskList) { taskList.removeTask(removeIndex); } - private void blankTodo(String input) throws DukeException { + private void findTasks(String input, TaskList taskList) throws DukeException { + blankDescription(input); + ArrayList foundTaskList = taskList.findTaskArrayList(input.substring(5)); + + System.out.println("____________________________________________________________"); + System.out.println("Here are the matching tasks in your list:"); + for (int i = 0; i < foundTaskList.size(); i++) { + System.out.println((i + 1) + ". " + foundTaskList.get(i).toString()); + } + System.out.println("____________________________________________________________\n"); + } + + private void blankDescription(String input) throws DukeException { if (input.length() == 4 || input.substring(4).isBlank()) { throw new DukeException("☹ OOPS!!! Must have a description.\n"); } @@ -112,26 +159,7 @@ private void printAddedTask(Task task, int counter) { System.out.println("____________________________________________________________"); System.out.println("Got it. I've added this task:"); System.out.println(task.toString()); - System.out.println("Now you have " + (counter + 1) + " tasks in the list."); - System.out.println("____________________________________________________________\n"); - } - - public void goodbye() { - System.out.println("____________________________________________________________"); - System.out.println("Bye. Hope to see you again soon!"); - System.out.println("____________________________________________________________\n"); - } - - public void greetings() { - String logo = " ____ _ \n" - + "| _ \\ _ _| | _____ \n" - + "| | | | | | | |/ / _ \\\n" - + "| |_| | |_| | < __/\n" - + "|____/ \\__,_|_|\\_\\___|\n"; - System.out.println("Hello from\n" + logo); - System.out.println("____________________________________________________________"); - System.out.println("Hello! I'm Duke"); - System.out.println("What can I do for you?"); + System.out.println("Now you have " + counter + " tasks in the list."); System.out.println("____________________________________________________________\n"); } } diff --git a/src/main/java/duke/exceptions/DukeException.java b/src/main/java/duke/exceptions/DukeException.java index 4e9254281..b21a4506c 100644 --- a/src/main/java/duke/exceptions/DukeException.java +++ b/src/main/java/duke/exceptions/DukeException.java @@ -1,13 +1,29 @@ package duke.exceptions; +/** + * Exception when there is an inputted error or Duke program fails + */ public class DukeException extends Exception { + /** + * Default constructor + */ public DukeException() {} + /** + * Instantiates message + * + * @param message exception cause + */ public DukeException(String message) { super(message); } + /** + * Overrides toString to include exception message + * + * @return exception message + */ @Override public String toString() { return "____________________________________________________________\n" diff --git a/src/main/java/duke/main/Duke.java b/src/main/java/duke/main/Duke.java index e93723e1e..cb18a73a8 100644 --- a/src/main/java/duke/main/Duke.java +++ b/src/main/java/duke/main/Duke.java @@ -6,13 +6,19 @@ import duke.exceptions.DukeException; /** - * A class that acts as a CLI that keeps tracks of tasks you write and mark down + * Contains the main method where it begins the program and runs the program as the base of the + * Duke program. */ public class Duke { private Storage storage; private TaskList tasks; private Ui ui; + /** + * Constructor initiates the instance variables given the loaded tasks from the data file + * + * @param filePath string of the file path where tasks data will be saved + */ public Duke(String filePath) { ui = new Ui(); storage = new Storage(filePath); @@ -24,6 +30,10 @@ public Duke(String filePath) { } } + /** + * Starts the program after initializing Duke. Loops through manageInput method which takes in the input and + * outputs results to user until they exit the program + */ public void run() { ui.greetings(); boolean exited = true; @@ -33,6 +43,11 @@ public void run() { ui.goodbye(); } + /** + * Initializes the instance variable Duke duke and runs the program + * + * @param args + */ public static void main(String[] args) { new Duke("data/tasks.txt").run(); } diff --git a/src/main/java/duke/task/Deadline.java b/src/main/java/duke/task/Deadline.java index 8e09af15d..597ab464c 100644 --- a/src/main/java/duke/task/Deadline.java +++ b/src/main/java/duke/task/Deadline.java @@ -1,18 +1,39 @@ package duke.task; +/** + * Represents a deadline task where a deadline for a task is included + */ public class Deadline extends Task { protected String by; + /** + * Instantiates the deadline task variables + * + * @param description description of task + * @param by deadline date of task + */ public Deadline(String description, String by) { super(description); this.by = by; } + /** + * Instantiates the deadline task variables + * + * @param description description of task + * @param by deadline date of task + * @param isDone if task is marked as done + */ public Deadline(String description, String by, boolean isDone) { super(description, isDone); this.by = by; } + /** + * Overrides toString method to return output as shown in list of tasks + * + * @return string of deadline in listed format + */ @Override 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 f157f9e04..ee984be7b 100644 --- a/src/main/java/duke/task/Event.java +++ b/src/main/java/duke/task/Event.java @@ -1,21 +1,44 @@ package duke.task; +/** + * Represents an event task where there is a from and to date + */ public class Event extends Task { protected String from; protected String to; + /** + * Instantiates the event task variables + * + * @param description description of event + * @param from start date of event + * @param to end date of event + */ public Event(String description, String from, String to) { super(description); this.from = from; this.to = to; } + /** + * Instantiates the event task variables + * + * @param description description of event + * @param from start date of event + * @param to end date of event + * @param isDone if task is marked as done + */ public Event(String description, String from, String to, boolean isDone) { super(description, isDone); this.from = from; this.to = to; } + /** + * Overrides toString method to return output as shown in list of tasks + * + * @return string of event in listed format + */ @Override public String toString() { return "[E]" + super.toString() + " (from: " + this.from + " to: " + this.to + ")"; diff --git a/src/main/java/duke/task/Task.java b/src/main/java/duke/task/Task.java index 7d11c8b13..5726962e5 100644 --- a/src/main/java/duke/task/Task.java +++ b/src/main/java/duke/task/Task.java @@ -1,46 +1,79 @@ package duke.task; /** - * duke.task.Task class used to have a text (description) and isDone attributes + * Task class used to have a text (description) and isDone attributes */ public class Task { protected String description; protected boolean isDone; + /** + * Instantiates defaults empty string description and isDone as false + */ public Task() { this.description = ""; this.isDone = false; } + /** + * Instantiates string description and defaults isDone as false + */ public Task(String description) { this.description = description; this.isDone = false; } - + /** + * Instantiates string description and isDone + */ public Task(String description, boolean isDone) { this.description = description; this.isDone = isDone; } + /** + * Overrides toString method to return output as shown in list of tasks + * + * @return string of task in listed format + */ @Override public String toString() { String descriptionNoSlash = (description.indexOf("/") == -1) ? description : (description.substring(0, description.indexOf("/"))); return "[" + ((this.isDone) ? "X] " : " ] ") + descriptionNoSlash; } + /** + * Task description getter + * + * @return description of task + */ public String getDescription() { return this.description; } + /** + * Task description setter + * + * @param description task description + */ public void setDescription(String description) { this.description = description; } + /** + * Task isDone getter + * + * @return if task if done + */ public boolean getIsDone() { return this.isDone; } + /** + * Task isDone setter + * + * @param isDone if task if done + */ public void setIsDone(boolean isDone) { this.isDone = isDone; } diff --git a/src/main/java/duke/task/Todo.java b/src/main/java/duke/task/Todo.java index 672f357e7..72d476a2b 100644 --- a/src/main/java/duke/task/Todo.java +++ b/src/main/java/duke/task/Todo.java @@ -1,15 +1,29 @@ package duke.task; +/** + * Represents a todo task with a description and isDone + */ public class Todo extends Task { + /** + * Instantiates string description and defaults isDone as false + */ public Todo(String description) { super(description); } + /** + * Instantiates string description and isDone + */ public Todo(String description, boolean isDone) { super(description, isDone); } + /** + * Overrides toString method to return output as shown in list of tasks + * + * @return string of todo in listed format + */ @Override public String toString() { return "[T]" + super.toString(); From c3a4d35d00521e157bad7071c73aba244300f10d Mon Sep 17 00:00:00 2001 From: Victor <76132903+victorouy@users.noreply.github.com> Date: Sun, 5 Mar 2023 23:20:35 +0800 Subject: [PATCH 18/20] Update README.md --- README.md | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 04cdf8d26..1971ba646 100644 --- a/README.md +++ b/README.md @@ -1,20 +1,23 @@ -# duke.main.Duke project template +# Duke Program User Guide -This is a project template for a greenfield Java project. It's named after the Java mascot _Duke_. Given below are instructions on how to use it. +## Input commands +### Add to task +- todo [description] +- deadline [description]/[by] +- event [description]/[from]/[to] -## Setting up in Intellij +### Manipulate tasks +- mark [task number] +- delete [task number] + +### Get tasks +- list +- find [search] + +### Exit program +- bye -Prerequisites: JDK 11, update Intellij to the most recent version. -1. Open Intellij (if you are not in the welcome screen, click `File` > `Close Project` to close the existing project first) -1. Open the project into Intellij as follows: - 1. Click `Open`. - 1. Select the project directory, and click `OK`. - 1. If there are any further prompts, accept the defaults. -1. Configure the project to use **JDK 11** (not other versions) as explained in [here](https://www.jetbrains.com/help/idea/sdk.html#set-up-jdk).
- In the same dialog, set the **Project language level** field to the `SDK default` option. -3. After that, locate the `src/main/java/duke.main.Duke.java` file, right-click it, and choose `Run duke.main.Duke.main()` (if the code editor is showing compile errors, try restarting the IDE). If the setup is correct, you should see something like the below as the output: - ``` Hello from ____ _ | _ \ _ _| | _____ From 3f599bca3d03e4d19d1c02bdf0f023dc72008729 Mon Sep 17 00:00:00 2001 From: Victor <76132903+victorouy@users.noreply.github.com> Date: Sun, 5 Mar 2023 23:20:50 +0800 Subject: [PATCH 19/20] Update README.md --- README.md | 9 --------- 1 file changed, 9 deletions(-) diff --git a/README.md b/README.md index 1971ba646..23865ac32 100644 --- a/README.md +++ b/README.md @@ -16,12 +16,3 @@ ### Exit program - bye - - - Hello from - ____ _ - | _ \ _ _| | _____ - | | | | | | | |/ / _ \ - | |_| | |_| | < __/ - |____/ \__,_|_|\_\___| - ``` From 9a33a4d706ee3a655e539640397ebe771641ac79 Mon Sep 17 00:00:00 2001 From: Victor <76132903+victorouy@users.noreply.github.com> Date: Sun, 5 Mar 2023 23:41:56 +0800 Subject: [PATCH 20/20] Update README.md --- docs/README.md | 39 ++++++++++++++------------------------- 1 file changed, 14 insertions(+), 25 deletions(-) diff --git a/docs/README.md b/docs/README.md index 8077118eb..23865ac32 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,29 +1,18 @@ -# User Guide +# Duke Program User Guide -## Features +## Input commands +### Add to task +- todo [description] +- deadline [description]/[by] +- event [description]/[from]/[to] -### Feature-ABC +### Manipulate tasks +- mark [task number] +- delete [task number] -Description of the feature. +### Get tasks +- list +- find [search] -### Feature-XYZ - -Description of the feature. - -## Usage - -### `Keyword` - Describe action - -Describe the action and its outcome. - -Example of usage: - -`keyword (optional arguments)` - -Expected outcome: - -Description of the outcome. - -``` -expected output -``` +### Exit program +- bye