From a34ad5016e5390fd2acca4ff622a66a062269fc2 Mon Sep 17 00:00:00 2001 From: MayFairMI6 <143886061+MayFairMI6@users.noreply.github.com> Date: Sun, 25 Aug 2024 10:34:24 -0400 Subject: [PATCH 01/53] Add files via upload --- src/main/java/AirBorder.java | 77 ++++++++++++++++++++++++++++++++++++ src/main/java/Task.java | 29 ++++++++++++++ 2 files changed, 106 insertions(+) create mode 100644 src/main/java/AirBorder.java create mode 100644 src/main/java/Task.java diff --git a/src/main/java/AirBorder.java b/src/main/java/AirBorder.java new file mode 100644 index 000000000..c96dab30c --- /dev/null +++ b/src/main/java/AirBorder.java @@ -0,0 +1,77 @@ +import java.util.Scanner; + + + public class AirBorder { + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + Task[] tasks = new Task[100]; // + int taskCount = 0; + + System.out.println("____________________________________________________________"); + System.out.println(" Hello! I'm AirBorder"); + System.out.println(" What can I do for you?"); + System.out.println("____________________________________________________________"); + + while (true) { + String userInput = scanner.nextLine().trim().toLowerCase(); + + if (userInput.equals("bye")) { + System.out.println("____________________________________________________________"); + System.out.println(" Bye. Hope to see you again soon!"); + System.out.println("____________________________________________________________"); + break; + } else if (userInput.equals("list")) { + System.out.println("____________________________________________________________"); + System.out.println(" Here are the tasks in your list:"); + if (taskCount == 0) { + System.out.println(" No tasks added."); + } else { + for (int i = 0; i < taskCount; i++) { + System.out.println(" " + (i + 1) + ". " + tasks[i]); + } + } + System.out.println("____________________________________________________________"); + } else if (userInput.startsWith("mark ")) { + int taskNumber = Integer.parseInt(userInput.split(" ")[1]) - 1; + if (taskNumber >= 0 && taskNumber < taskCount) { + tasks[taskNumber].markAsDone(); // Call on Task object + System.out.println("____________________________________________________________"); + System.out.println(" Nice! I've marked this task as done:"); + System.out.println(" " + tasks[taskNumber]); + System.out.println("____________________________________________________________"); + } else { + System.out.println("____________________________________________________________"); + System.out.println(" Invalid task number."); + System.out.println("____________________________________________________________"); + } + } else if (userInput.startsWith("unmark ")) { + int taskNumber = Integer.parseInt(userInput.split(" ")[1]) - 1; + if (taskNumber >= 0 && taskNumber < taskCount) { + tasks[taskNumber].markAsNotDone(); // Call on Task object + System.out.println("____________________________________________________________"); + System.out.println(" OK, I've marked this task as not done yet:"); + System.out.println(" " + tasks[taskNumber]); + System.out.println("____________________________________________________________"); + } else { + System.out.println("____________________________________________________________"); + System.out.println(" Invalid task number."); + System.out.println("____________________________________________________________"); + } + } else { + if (taskCount < 100) { // Check to prevent exceeding the array limit + tasks[taskCount] = new Task(userInput); + taskCount++; + System.out.println("____________________________________________________________"); + System.out.println(" added: " + userInput); + System.out.println("____________________________________________________________"); + } else { + System.out.println("____________________________________________________________"); + System.out.println(" Task list is full. Cannot add more tasks."); + System.out.println("____________________________________________________________"); + } + } + } + + scanner.close(); + } + } diff --git a/src/main/java/Task.java b/src/main/java/Task.java new file mode 100644 index 000000000..0b2c8a36a --- /dev/null +++ b/src/main/java/Task.java @@ -0,0 +1,29 @@ +public class Task { + + protected String description; + protected boolean isDone; + + public Task(String description) { + this.description = description; + this.isDone = false; + } + + public String getStatusIcon() { + return (isDone ? "X" : " "); // Mark done tasks with X + } + + public void markAsDone() { + isDone = true; + } + + public void markAsNotDone() { + isDone = false; + } + + @Override + public String toString() { + return "[" + getStatusIcon() + "] " + description; + } + + } + From dc1c07f8a6ae1f2f516edafcd852d4f0d00489b4 Mon Sep 17 00:00:00 2001 From: MayFairMI6 <143886061+MayFairMI6@users.noreply.github.com> Date: Tue, 24 Sep 2024 19:42:39 -0400 Subject: [PATCH 02/53] Delete src/main/java/Duke.java Proceeded as per description- Move duke out of package --- src/main/java/Duke.java | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 src/main/java/Duke.java diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java deleted file mode 100644 index 5d313334c..000000000 --- a/src/main/java/Duke.java +++ /dev/null @@ -1,10 +0,0 @@ -public class Duke { - public static void main(String[] args) { - String logo = " ____ _ \n" - + "| _ \\ _ _| | _____ \n" - + "| | | | | | | |/ / _ \\\n" - + "| |_| | |_| | < __/\n" - + "|____/ \\__,_|_|\\_\\___|\n"; - System.out.println("Hello from\n" + logo); - } -} From 5891e811c29581ec5dafc4ce12730423e1a91c06 Mon Sep 17 00:00:00 2001 From: MayFairMI6 <143886061+MayFairMI6@users.noreply.github.com> Date: Tue, 24 Sep 2024 19:43:52 -0400 Subject: [PATCH 03/53] Create Level-5 --- Level-5 | 1 + 1 file changed, 1 insertion(+) create mode 100644 Level-5 diff --git a/Level-5 b/Level-5 new file mode 100644 index 000000000..8233d1f13 --- /dev/null +++ b/Level-5 @@ -0,0 +1 @@ +Airborder.java and Tasks.java From ff3ea23307e0a6892547d8272e3983048af26fcb Mon Sep 17 00:00:00 2001 From: MayFairMI6 <143886061+MayFairMI6@users.noreply.github.com> Date: Tue, 24 Sep 2024 20:57:45 -0400 Subject: [PATCH 04/53] Update Level-5 --- Level-5 | 188 +++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 187 insertions(+), 1 deletion(-) diff --git a/Level-5 b/Level-5 index 8233d1f13..cacd7c41c 100644 --- a/Level-5 +++ b/Level-5 @@ -1 +1,187 @@ -Airborder.java and Tasks.java +import java.util.Scanner; +public class AirBorder { + private static final int MAX_TASK_COUNT = 100; + private static Task[] taskList = new Task[MAX_TASK_COUNT]; + private static int taskCount = 0; + + public static void main(String[] args) { + Scanner inputScanner = new Scanner(System.in); + + printWelcomeMessage(); + + while (true) { + String userCommand = inputScanner.nextLine().trim(); + + if (userCommand.equalsIgnoreCase("bye")) { + printExitMessage(); + break; + } + + try { + switch (getCommandType(userCommand)) { + case "list": + printTaskList(); + break; + case "todo": + addToDoTask(userCommand.substring(5).trim()); + break; + case "deadline": + addDeadlineTask(userCommand); + break; + case "event": + addEventTask(userCommand); + break; + case "mark": + markTaskAsDone(userCommand); + break; + case "unmark": + unmarkTask(userCommand); + break; + default: + throw new InvalidCommandException(); + } + } catch (AirBorderException e) { + printErrorMessage(e.getMessage()); + } + } + + inputScanner.close(); + } + + private static String getCommandType(String userCommand) { + if (userCommand.startsWith("todo ")) { + return "todo"; + } else if (userCommand.startsWith("deadline ")) { + return "deadline"; + } else if (userCommand.startsWith("event ")) { + return "event"; + } else if (userCommand.equalsIgnoreCase("list")) { + return "list"; + } else if (userCommand.startsWith("mark ")) { + return "mark"; + } else if (userCommand.startsWith("unmark ")) { + return "unmark"; + } else { + return "unknown"; + } + } + + private static void printWelcomeMessage() { + System.out.println("____________________________________________________________"); + System.out.println(" Welcome aboard AirBorder."); + System.out.println(" Ready to assist you with your tasks!"); + System.out.println("____________________________________________________________"); + } + + private static void printExitMessage() { + System.out.println("____________________________________________________________"); + System.out.println(" Thank you for flying with AirBorder!"); + System.out.println("____________________________________________________________"); + } + + private static void printTaskList() throws AirBorderException { + if (taskCount == 0) { + throw new AirBorderException("No tasks in your itinerary yet. Please add tasks before listing."); + } + System.out.println("____________________________________________________________"); + System.out.println(" Here are the tasks in your itinerary:"); + for (int i = 0; i < taskCount; i++) { + System.out.println(" " + (i + 1) + ". " + taskList[i]); + } + System.out.println("____________________________________________________________"); + } + + private static void addToDoTask(String description) throws AirBorderException { + if (description.isEmpty()) { + throw new AirBorderException("Insufficient Documentation: Task description cannot be empty. Please provide a valid task."); + } + if (taskCount < MAX_TASK_COUNT) { + taskList[taskCount] = new ToDo(description); + taskCount++; + printTaskAddedMessage(taskList[taskCount - 1]); + } else { + throw new AirBorderException("Boarding Refused: Task list is full. Unable to add more tasks."); + } + } + + private static void addDeadlineTask(String userCommand) throws AirBorderException { + String[] taskDetails = userCommand.substring(9).split(" /by "); + if (taskDetails.length < 2 || taskDetails[0].trim().isEmpty()) { + throw new AirBorderException("Insufficient Documentation: Invalid deadline format. Use: deadline /by "); + } + if (taskCount < MAX_TASK_COUNT) { + taskList[taskCount] = new Deadline(taskDetails[0].trim(), taskDetails[1].trim()); + taskCount++; + printTaskAddedMessage(taskList[taskCount - 1]); + } else { + throw new AirBorderException("Boarding Refused: Task list is full. Unable to add more tasks."); + } + } + + private static void addEventTask(String userCommand) throws AirBorderException { + String[] taskDetails = userCommand.substring(6).split(" /from | /to "); + if (taskDetails.length < 3 || taskDetails[0].trim().isEmpty()) { + throw new AirBorderException("Minimum Passport Validity Condition Not Met for Destination: Invalid event format. Use: event /from /to "); + } + if (taskCount < MAX_TASK_COUNT) { + taskList[taskCount] = new Event(taskDetails[0].trim(), taskDetails[1].trim(), taskDetails[2].trim()); + taskCount++; + printTaskAddedMessage(taskList[taskCount - 1]); + } else { + throw new AirBorderException("Offloaded: Please check with ground staff."); + } + } + + private static void markTaskAsDone(String userCommand) throws AirBorderException { + int taskIndex = Integer.parseInt(userCommand.split(" ")[1]) - 1; + if (isValidTaskIndex(taskIndex)) { + taskList[taskIndex].markAsDone(); + printTaskDoneMessage(taskList[taskIndex]); + } else { + throw new AirBorderException("Check-In Refused: Invalid task number."); + } + } + + private static void unmarkTask(String userCommand) throws AirBorderException { + int taskIndex = Integer.parseInt(userCommand.split(" ")[1]) - 1; + if (isValidTaskIndex(taskIndex)) { + taskList[taskIndex].markAsNotDone(); + printTaskUndoneMessage(taskList[taskIndex]); + } else { + throw new AirBorderException("Check-In Refused: Invalid task number."); + } + } + + private static boolean isValidTaskIndex(int taskIndex) { + return taskIndex >= 0 && taskIndex < taskCount; + } + + private static void printTaskAddedMessage(Task task) { + System.out.println("____________________________________________________________"); + System.out.println(" Flight Confirmed! I've added this task:"); + System.out.println(" " + task); + System.out.println(" Now you have " + taskCount + " tasks in the list."); + System.out.println("____________________________________________________________"); + } + + private static void printTaskDoneMessage(Task task) { + System.out.println("____________________________________________________________"); + System.out.println(" Task completed! Ready for boarding:"); + System.out.println(" " + task); + System.out.println("____________________________________________________________"); + } + + private static void printTaskUndoneMessage(Task task) { + System.out.println("____________________________________________________________"); + System.out.println(" Task unchecked. Unable to board yet:"); + System.out.println(" " + task); + System.out.println("____________________________________________________________"); + } + + private static void printErrorMessage(String errorMessage) { + System.out.println("____________________________________________________________"); + System.out.println(" ERROR: " + errorMessage); + System.out.println("____________________________________________________________"); + } +} + From 09ce943057d69e2f406f85d945baefa01b1f3db8 Mon Sep 17 00:00:00 2001 From: MayFairMI6 <143886061+MayFairMI6@users.noreply.github.com> Date: Tue, 24 Sep 2024 21:48:55 -0400 Subject: [PATCH 05/53] Add files via upload Main file added in another increment (Level-5) --- AirBorderException.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 AirBorderException.java diff --git a/AirBorderException.java b/AirBorderException.java new file mode 100644 index 000000000..8d381a613 --- /dev/null +++ b/AirBorderException.java @@ -0,0 +1,12 @@ +public class AirBorderException extends Exception { + public AirBorderException(String message) { + super(message); + } +} + +// Specific InvalidCommandException for unrecognized requests +class InvalidCommandException extends AirBorderException { + public InvalidCommandException() { + super("Unrecognized Request: Please ensure your input is correct or contact ground staff for assistance."); + } +} From 40375fcdfe980698875dd868136304300ba35a1d Mon Sep 17 00:00:00 2001 From: MayFairMI6 <143886061+MayFairMI6@users.noreply.github.com> Date: Tue, 24 Sep 2024 21:59:57 -0400 Subject: [PATCH 06/53] Update Duke.java updated with airborder_exception --- src/main/java/Duke.java | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 5d313334c..985401a33 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -1,10 +1,12 @@ -public class Duke { - public static void main(String[] args) { - String logo = " ____ _ \n" - + "| _ \\ _ _| | _____ \n" - + "| | | | | | | |/ / _ \\\n" - + "| |_| | |_| | < __/\n" - + "|____/ \\__,_|_|\\_\\___|\n"; - System.out.println("Hello from\n" + logo); +public class AirBorderException extends Exception { + public AirBorderException(String message) { + super(message); + } +} + +// Specific InvalidCommandException for unrecognized requests +class InvalidCommandException extends AirBorderException { + public InvalidCommandException() { + super("Unrecognized Request: Please ensure your input is correct or contact ground staff for assistance."); } } From 104a825c71844d8b146381bb95614f16b6b31427 Mon Sep 17 00:00:00 2001 From: MayFairMI6 <143886061+MayFairMI6@users.noreply.github.com> Date: Tue, 24 Sep 2024 22:05:30 -0400 Subject: [PATCH 07/53] Rename Duke.java to AirBorderException.java renamed --- src/main/java/{Duke.java => AirBorderException.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/main/java/{Duke.java => AirBorderException.java} (100%) diff --git a/src/main/java/Duke.java b/src/main/java/AirBorderException.java similarity index 100% rename from src/main/java/Duke.java rename to src/main/java/AirBorderException.java From dff8157f3e75f7537a82cfb6ec512b30c44a1994 Mon Sep 17 00:00:00 2001 From: MayFairMI6 <143886061+MayFairMI6@users.noreply.github.com> Date: Tue, 24 Sep 2024 23:08:51 -0400 Subject: [PATCH 08/53] Update and rename Duke.java to AirBorder.java --- src/main/java/AirBorder.java | 195 +++++++++++++++++++++++++++++++++++ src/main/java/Duke.java | 10 -- 2 files changed, 195 insertions(+), 10 deletions(-) create mode 100644 src/main/java/AirBorder.java delete mode 100644 src/main/java/Duke.java diff --git a/src/main/java/AirBorder.java b/src/main/java/AirBorder.java new file mode 100644 index 000000000..3956b3784 --- /dev/null +++ b/src/main/java/AirBorder.java @@ -0,0 +1,195 @@ +import java.util.ArrayList; +import java.util.Scanner; + +public class AirBorder { + // Use ArrayList for task storage + private static ArrayList taskList = new ArrayList<>(); + + public static void main(String[] args) { + Scanner inputScanner = new Scanner(System.in); + + printWelcomeMessage(); + + while (true) { + String userCommand = inputScanner.nextLine().trim(); + + if (userCommand.equalsIgnoreCase("bye")) { + printExitMessage(); + break; + } + + try { + switch (getCommandType(userCommand)) { + case "list": + printTaskList(); + break; + case "todo": + addToDoTask(userCommand.substring(5).trim()); + break; + case "deadline": + addDeadlineTask(userCommand); + break; + case "event": + addEventTask(userCommand); + break; + case "delete": + deleteTask(userCommand); + break; + case "mark": + markTaskAsDone(userCommand); + break; + case "unmark": + unmarkTask(userCommand); + break; + default: + throw new InvalidCommandException(); + } + } catch (AirBorderException e) { + printErrorMessage(e.getMessage()); + } + } + + inputScanner.close(); + } + + private static String getCommandType(String userCommand) { + if (userCommand.startsWith("todo ")) { + return "todo"; + } else if (userCommand.startsWith("deadline ")) { + return "deadline"; + } else if (userCommand.startsWith("event ")) { + return "event"; + } else if (userCommand.startsWith("delete ")) { + return "delete"; + } else if (userCommand.equalsIgnoreCase("list")) { + return "list"; + } else if (userCommand.startsWith("mark ")) { + return "mark"; + } else if (userCommand.startsWith("unmark ")) { + return "unmark"; + } else { + return "unknown"; + } + } + + private static void printWelcomeMessage() { + System.out.println("____________________________________________________________"); + System.out.println(" Welcome aboard AirBorder."); + System.out.println(" Ready to assist you with your tasks!"); + System.out.println("____________________________________________________________"); + } + + private static void printExitMessage() { + System.out.println("____________________________________________________________"); + System.out.println(" Thank you for flying with AirBorder!"); + System.out.println("____________________________________________________________"); + } + + private static void printTaskList() throws AirBorderException { + if (taskList.isEmpty()) { + throw new AirBorderException("No tasks in your itinerary yet. Please add tasks before listing."); + } + System.out.println("____________________________________________________________"); + System.out.println(" Here are the tasks in your itinerary:"); + for (int i = 0; i < taskList.size(); i++) { + System.out.println(" " + (i + 1) + ". " + taskList.get(i)); + } + System.out.println("____________________________________________________________"); + } + + private static void addToDoTask(String description) throws AirBorderException { + if (description.isEmpty()) { + throw new AirBorderException("Insufficient Documentation: Task description cannot be empty. Please provide a valid task."); + } + taskList.add(new ToDo(description)); + printTaskAddedMessage(taskList.get(taskList.size() - 1)); + } + + private static void addDeadlineTask(String userCommand) throws AirBorderException { + String[] taskDetails = userCommand.substring(9).split(" /by "); + if (taskDetails.length < 2 || taskDetails[0].trim().isEmpty()) { + throw new AirBorderException("Insufficient Documentation: Invalid deadline format. Use: deadline /by "); + } + taskList.add(new Deadline(taskDetails[0].trim(), taskDetails[1].trim())); + printTaskAddedMessage(taskList.get(taskList.size() - 1)); + } + + private static void addEventTask(String userCommand) throws AirBorderException { + String[] taskDetails = userCommand.substring(6).split(" /from | /to "); + if (taskDetails.length < 3 || taskDetails[0].trim().isEmpty()) { + throw new AirBorderException("Minimum Passport Validity Condition Not Met for Destination: Invalid event format. Use: event /from /to "); + } + taskList.add(new Event(taskDetails[0].trim(), taskDetails[1].trim(), taskDetails[2].trim())); + printTaskAddedMessage(taskList.get(taskList.size() - 1)); + } + + private static void deleteTask(String userCommand) throws AirBorderException { + int taskIndex = Integer.parseInt(userCommand.split(" ")[1]) - 1; + if (isValidTaskIndex(taskIndex)) { + Task removedTask = taskList.remove(taskIndex); + printTaskDeletedMessage(removedTask); + } else { + throw new AirBorderException("Check-In Refused: Invalid task number."); + } + } + + private static void markTaskAsDone(String userCommand) throws AirBorderException { + int taskIndex = Integer.parseInt(userCommand.split(" ")[1]) - 1; + if (isValidTaskIndex(taskIndex)) { + taskList.get(taskIndex).markAsDone(); + printTaskDoneMessage(taskList.get(taskIndex)); + } else { + throw new AirBorderException("Check-In Refused: Invalid task number."); + } + } + + private static void unmarkTask(String userCommand) throws AirBorderException { + int taskIndex = Integer.parseInt(userCommand.split(" ")[1]) - 1; + if (isValidTaskIndex(taskIndex)) { + taskList.get(taskIndex).markAsNotDone(); + printTaskUndoneMessage(taskList.get(taskIndex)); + } else { + throw new AirBorderException("Check-In Refused: Invalid task number."); + } + } + + private static boolean isValidTaskIndex(int taskIndex) { + return taskIndex >= 0 && taskIndex < taskList.size(); + } + + private static void printTaskAddedMessage(Task task) { + System.out.println("____________________________________________________________"); + System.out.println(" Flight Confirmed! I've added this task:"); + System.out.println(" " + task); + System.out.println(" Now you have " + taskList.size() + " tasks in the list."); + System.out.println("____________________________________________________________"); + } + + private static void printTaskDeletedMessage(Task task) { + System.out.println("____________________________________________________________"); + System.out.println(" Noted. I've removed this task:"); + System.out.println(" " + task); + System.out.println(" Now you have " + taskList.size() + " tasks in the list."); + System.out.println("____________________________________________________________"); + } + + private static void printTaskDoneMessage(Task task) { + System.out.println("____________________________________________________________"); + System.out.println(" Task completed! Ready for boarding:"); + System.out.println(" " + task); + System.out.println("____________________________________________________________"); + } + + private static void printTaskUndoneMessage(Task task) { + System.out.println("____________________________________________________________"); + System.out.println(" Task unchecked. Unable to board yet:"); + System.out.println(" " + task); + System.out.println("____________________________________________________________"); + } + + private static void printErrorMessage(String errorMessage) { + System.out.println("____________________________________________________________"); + System.out.println(" ERROR: " + errorMessage); + System.out.println("____________________________________________________________"); + } +} diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java deleted file mode 100644 index 5d313334c..000000000 --- a/src/main/java/Duke.java +++ /dev/null @@ -1,10 +0,0 @@ -public class Duke { - public static void main(String[] args) { - String logo = " ____ _ \n" - + "| _ \\ _ _| | _____ \n" - + "| | | | | | | |/ / _ \\\n" - + "| |_| | |_| | < __/\n" - + "|____/ \\__,_|_|\\_\\___|\n"; - System.out.println("Hello from\n" + logo); - } -} From 6bbf43cf80a3c36ef57d3e2855fa77669e620149 Mon Sep 17 00:00:00 2001 From: MayFairMI6 <143886061+MayFairMI6@users.noreply.github.com> Date: Tue, 24 Sep 2024 23:20:16 -0400 Subject: [PATCH 09/53] Update and rename Duke.java to AirBorder.java with command-line arguments to accept file path from user --- src/main/java/AirBorder.java | 206 +++++++++++++++++++++++++++++++++++ src/main/java/Duke.java | 10 -- 2 files changed, 206 insertions(+), 10 deletions(-) create mode 100644 src/main/java/AirBorder.java delete mode 100644 src/main/java/Duke.java diff --git a/src/main/java/AirBorder.java b/src/main/java/AirBorder.java new file mode 100644 index 000000000..a07909562 --- /dev/null +++ b/src/main/java/AirBorder.java @@ -0,0 +1,206 @@ +import java.io.*; +import java.util.ArrayList; +import java.util.Scanner; + +public class AirBorder { + private static ArrayList taskList = new ArrayList<>(); + + public static void main(String[] args) { + String filePath = args.length > 0 ? args[0] : "./data/airborder.txt"; // Command-line argument for file path + loadTasks(filePath); // Load tasks from file at startup + Scanner inputScanner = new Scanner(System.in); + + printWelcomeMessage(); + + while (true) { + String userCommand = inputScanner.nextLine().trim(); + + if (userCommand.equalsIgnoreCase("bye")) { + printExitMessage(); + saveTasks(filePath); // Save tasks before exiting + break; + } + + try { + switch (getCommandType(userCommand)) { + case "list": + printTaskList(); + break; + case "todo": + addToDoTask(userCommand.substring(5).trim(), filePath); + break; + case "deadline": + addDeadlineTask(userCommand, filePath); + break; + case "event": + addEventTask(userCommand, filePath); + break; + case "delete": + deleteTask(userCommand, filePath); + break; + case "mark": + markTaskAsDone(userCommand, filePath); + break; + case "unmark": + unmarkTask(userCommand, filePath); + break; + default: + throw new InvalidCommandException(); + } + } catch (AirBorderException e) { + printErrorMessage(e.getMessage()); + } + } + + inputScanner.close(); + } + + // Task management methods with added file path parameter + private static void addToDoTask(String description, String filePath) throws AirBorderException { + if (description.isEmpty()) { + throw new AirBorderException("Insufficient Documentation: Task description cannot be empty. Please provide a valid task."); + } + Task newTask = new ToDo(description); + taskList.add(newTask); + printTaskAddedMessage(newTask); + saveTasks(filePath); // Save tasks after adding + } + + private static void addDeadlineTask(String userCommand, String filePath) throws AirBorderException { + String[] taskDetails = userCommand.substring(9).split(" /by "); + if (taskDetails.length < 2 || taskDetails[0].trim().isEmpty()) { + throw new AirBorderException("Insufficient Documentation: Invalid deadline format. Use: deadline /by "); + } + Task newTask = new Deadline(taskDetails[0].trim(), taskDetails[1].trim()); + taskList.add(newTask); + printTaskAddedMessage(newTask); + saveTasks(filePath); // Save tasks after adding + } + + private static void addEventTask(String userCommand, String filePath) throws AirBorderException { + String[] taskDetails = userCommand.substring(6).split(" /from | /to "); + if (taskDetails.length < 3 || taskDetails[0].trim().isEmpty()) { + throw new AirBorderException("Minimum Passport Validity Condition Not Met for Destination: Invalid event format. Use: event /from /to "); + } + Task newTask = new Event(taskDetails[0].trim(), taskDetails[1].trim(), taskDetails[2].trim()); + taskList.add(newTask); + printTaskAddedMessage(newTask); + saveTasks(filePath); // Save tasks after adding + } + + private static void deleteTask(String userCommand, String filePath) throws AirBorderException { + int taskIndex = Integer.parseInt(userCommand.split(" ")[1]) - 1; + if (isValidTaskIndex(taskIndex)) { + Task removedTask = taskList.remove(taskIndex); + printTaskDeletedMessage(removedTask); + saveTasks(filePath); // Save tasks after deleting + } else { + throw new AirBorderException("Check-In Refused: Invalid task number."); + } + } + + private static void markTaskAsDone(String userCommand, String filePath) throws AirBorderException { + int taskIndex = Integer.parseInt(userCommand.split(" ")[1]) - 1; + if (isValidTaskIndex(taskIndex)) { + taskList.get(taskIndex).markAsDone(); + printTaskDoneMessage(taskList.get(taskIndex)); + saveTasks(filePath); // Save tasks after marking + } else { + throw new AirBorderException("Check-In Refused: Invalid task number."); + } + } + + private static void unmarkTask(String userCommand, String filePath) throws AirBorderException { + int taskIndex = Integer.parseInt(userCommand.split(" ")[1]) - 1; + if (isValidTaskIndex(taskIndex)) { + taskList.get(taskIndex).markAsNotDone(); + printTaskUndoneMessage(taskList.get(taskIndex)); + saveTasks(filePath); // Save tasks after unmarking + } else { + throw new AirBorderException("Check-In Refused: Invalid task number."); + } + } + + // Check if the task index is valid + private static boolean isValidTaskIndex(int taskIndex) { + return taskIndex >= 0 && taskIndex < taskList.size(); + } + + // Save tasks to file + private static void saveTasks(String filePath) { + try { + File file = new File(filePath); + // Ensure the directory exists + file.getParentFile().mkdirs(); + FileWriter writer = new FileWriter(file); + for (Task task : taskList) { + writer.write(formatTaskForSave(task) + System.lineSeparator()); + } + writer.close(); + } catch (IOException e) { + System.out.println("Error saving tasks: " + e.getMessage()); + } + } + + // Load tasks from file + private static void loadTasks(String filePath) { + try { + File file = new File(filePath); + if (!file.exists()) { + return; // No file to load from + } + BufferedReader reader = new BufferedReader(new FileReader(file)); + String line; + while ((line = reader.readLine()) != null) { + Task task = parseTaskFromFile(line); + taskList.add(task); + } + reader.close(); + } catch (IOException e) { + System.out.println("Error loading tasks: " + e.getMessage()); + } + } + + // Helper to format tasks for saving + private static String formatTaskForSave(Task task) { + if (task instanceof ToDo) { + return "T | " + (task.isDone ? "1" : "0") + " | " + task.description; + } else if (task instanceof Deadline) { + Deadline deadline = (Deadline) task; + return "D | " + (task.isDone ? "1" : "0") + " | " + task.description + " | " + deadline.by; + } else if (task instanceof Event) { + Event event = (Event) task; + return "E | " + (task.isDone ? "1" : "0") + " | " + task.description + " | " + event.from + " | " + event.to; + } + return ""; + } + + // Helper to parse tasks from file + private static Task parseTaskFromFile(String line) { + String[] parts = line.split(" \\| "); + switch (parts[0]) { + case "T": + ToDo todo = new ToDo(parts[2]); + if (parts[1].equals("1")) { + todo.markAsDone(); + } + return todo; + case "D": + Deadline deadline = new Deadline(parts[2], parts[3]); + if (parts[1].equals("1")) { + deadline.markAsDone(); + } + return deadline; + case "E": + Event event = new Event(parts[2], parts[3], parts[4]); + if (parts[1].equals("1")) { + event.markAsDone(); + } + return event; + default: + return null; + } + } + + // Other helper methods (printTaskAddedMessage, printTaskDeletedMessage, etc.) remain unchanged +} diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java deleted file mode 100644 index 5d313334c..000000000 --- a/src/main/java/Duke.java +++ /dev/null @@ -1,10 +0,0 @@ -public class Duke { - public static void main(String[] args) { - String logo = " ____ _ \n" - + "| _ \\ _ _| | _____ \n" - + "| | | | | | | |/ / _ \\\n" - + "| |_| | |_| | < __/\n" - + "|____/ \\__,_|_|\\_\\___|\n"; - System.out.println("Hello from\n" + logo); - } -} From 54ffe8c0aef4758df93ff0ebb2f2ef7aa8c80950 Mon Sep 17 00:00:00 2001 From: MayFairMI6 <143886061+MayFairMI6@users.noreply.github.com> Date: Wed, 25 Sep 2024 04:04:27 -0400 Subject: [PATCH 10/53] Update Task.java --- src/main/java/Task.java | 80 +++++++++++++++++++++++++++++++---------- 1 file changed, 61 insertions(+), 19 deletions(-) diff --git a/src/main/java/Task.java b/src/main/java/Task.java index 0b2c8a36a..18a9890b5 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -1,29 +1,71 @@ public class Task { + protected String description; + protected boolean isDone; - protected String description; - protected boolean isDone; + public Task(String description) { + this.description = description; + this.isDone = false; + } + + // Changed method names to be meaningful and concise + public String getStatusIcon() { + return isDone ? "X" : " "; + } + + // Guard clause applied to eliminate nested logic + public void markAsDone() { + this.isDone = true; + } + + public void markAsNotDone() { + this.isDone = false; + } + + // Kept method consistent, no change required + @Override + public String toString() { + return "[" + getStatusIcon() + "] " + description; + } +} + +public class ToDo extends Task { + public ToDo(String description) { + super(description); + } + + @Override + public String toString() { + return "[T]" + super.toString(); + } +} - public Task(String description) { - this.description = description; - this.isDone = false; - } +public class Deadline extends Task { + protected String deadline; // Renamed 'by' to 'deadline' for clarity - public String getStatusIcon() { - return (isDone ? "X" : " "); // Mark done tasks with X - } + public Deadline(String description, String deadline) { + super(description); + this.deadline = deadline; + } - public void markAsDone() { - isDone = true; - } + @Override + public String toString() { + return "[D]" + super.toString() + " (by: " + deadline + ")"; + } +} - public void markAsNotDone() { - isDone = false; - } +public class Event extends Task { + protected String startTime; + protected String endTime; - @Override - public String toString() { - return "[" + getStatusIcon() + "] " + description; - } + public Event(String description, String startTime, String endTime) { + super(description); + this.startTime = startTime; + this.endTime = endTime; + } + @Override + public String toString() { + return "[E]" + super.toString() + " (from: " + startTime + " to: " + endTime + ")"; } +} From 79819dfabc22a351417ee213ffe1f7e90917507a Mon Sep 17 00:00:00 2001 From: MayFairMI6 <143886061+MayFairMI6@users.noreply.github.com> Date: Wed, 25 Sep 2024 04:11:57 -0400 Subject: [PATCH 11/53] Add files via upload --- src/main/java/Task (1).java | 70 +++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 src/main/java/Task (1).java diff --git a/src/main/java/Task (1).java b/src/main/java/Task (1).java new file mode 100644 index 000000000..be60ffbc7 --- /dev/null +++ b/src/main/java/Task (1).java @@ -0,0 +1,70 @@ +public class Task { + protected String description; + protected boolean isDone; + + public Task(String description) { + this.description = description; + this.isDone = false; + } + + // Changed method names to be meaningful and concise + public String getStatusIcon() { + return isDone ? "X" : " "; + } + + // Guard clause applied to eliminate nested logic + public void markAsDone() { + this.isDone = true; + } + + public void markAsNotDone() { + this.isDone = false; + } + + // Kept method consistent, no change required + @Override + public String toString() { + return "[" + getStatusIcon() + "] " + description; + } +} + +public class ToDo extends Task { + public ToDo(String description) { + super(description); + } + + @Override + public String toString() { + return "[T]" + super.toString(); + } +} + +public class Deadline extends Task { + protected String deadline; // Renamed 'by' to 'deadline' for clarity + + public Deadline(String description, String deadline) { + super(description); + this.deadline = deadline; + } + + @Override + public String toString() { + return "[D]" + super.toString() + " (by: " + deadline + ")"; + } +} + +public class Event extends Task { + protected String startTime; + protected String endTime; + + public Event(String description, String startTime, String endTime) { + super(description); + this.startTime = startTime; + this.endTime = endTime; + } + + @Override + public String toString() { + return "[E]" + super.toString() + " (from: " + startTime + " to: " + endTime + ")"; + } +} From e4bbdfcdf59f8208f3d5f3c8ec243d5cf2427213 Mon Sep 17 00:00:00 2001 From: MayFairMI6 <143886061+MayFairMI6@users.noreply.github.com> Date: Wed, 25 Sep 2024 04:12:32 -0400 Subject: [PATCH 12/53] Add files via upload --- src/main/java/Task (1).java | 70 +++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 src/main/java/Task (1).java diff --git a/src/main/java/Task (1).java b/src/main/java/Task (1).java new file mode 100644 index 000000000..be60ffbc7 --- /dev/null +++ b/src/main/java/Task (1).java @@ -0,0 +1,70 @@ +public class Task { + protected String description; + protected boolean isDone; + + public Task(String description) { + this.description = description; + this.isDone = false; + } + + // Changed method names to be meaningful and concise + public String getStatusIcon() { + return isDone ? "X" : " "; + } + + // Guard clause applied to eliminate nested logic + public void markAsDone() { + this.isDone = true; + } + + public void markAsNotDone() { + this.isDone = false; + } + + // Kept method consistent, no change required + @Override + public String toString() { + return "[" + getStatusIcon() + "] " + description; + } +} + +public class ToDo extends Task { + public ToDo(String description) { + super(description); + } + + @Override + public String toString() { + return "[T]" + super.toString(); + } +} + +public class Deadline extends Task { + protected String deadline; // Renamed 'by' to 'deadline' for clarity + + public Deadline(String description, String deadline) { + super(description); + this.deadline = deadline; + } + + @Override + public String toString() { + return "[D]" + super.toString() + " (by: " + deadline + ")"; + } +} + +public class Event extends Task { + protected String startTime; + protected String endTime; + + public Event(String description, String startTime, String endTime) { + super(description); + this.startTime = startTime; + this.endTime = endTime; + } + + @Override + public String toString() { + return "[E]" + super.toString() + " (from: " + startTime + " to: " + endTime + ")"; + } +} From 75cd7e0ebd192a318eb363ac6659fed965090f84 Mon Sep 17 00:00:00 2001 From: MayFairMI6 <143886061+MayFairMI6@users.noreply.github.com> Date: Wed, 25 Sep 2024 04:18:00 -0400 Subject: [PATCH 13/53] Delete src/main/java/Duke.java deleted to avoid merge conflicts --- src/main/java/Duke.java | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 src/main/java/Duke.java diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java deleted file mode 100644 index 5d313334c..000000000 --- a/src/main/java/Duke.java +++ /dev/null @@ -1,10 +0,0 @@ -public class Duke { - public static void main(String[] args) { - String logo = " ____ _ \n" - + "| _ \\ _ _| | _____ \n" - + "| | | | | | | |/ / _ \\\n" - + "| |_| | |_| | < __/\n" - + "|____/ \\__,_|_|\\_\\___|\n"; - System.out.println("Hello from\n" + logo); - } -} From 31be5c5cc164a4dd25272f7faf5a4a24ec30a4dd Mon Sep 17 00:00:00 2001 From: MayFairMI6 <143886061+MayFairMI6@users.noreply.github.com> Date: Wed, 25 Sep 2024 05:52:59 -0400 Subject: [PATCH 14/53] samplw --- src/main/java/AirBorder.java | 13 +++++++++++++ src/main/java/Duke.java | 10 ---------- 2 files changed, 13 insertions(+), 10 deletions(-) delete mode 100644 src/main/java/Duke.java diff --git a/src/main/java/AirBorder.java b/src/main/java/AirBorder.java index c96dab30c..9fa5569ac 100644 --- a/src/main/java/AirBorder.java +++ b/src/main/java/AirBorder.java @@ -1,3 +1,4 @@ +<<<<<<< Updated upstream import java.util.Scanner; @@ -75,3 +76,15 @@ public static void main(String[] args) { scanner.close(); } } +======= +public class Duke { + public static void main(String[] args) { + String logo = " ____ _ \n" + + "| _ \\ _ _| | _____ \n" + + "| | | | | | | |/ / _ \\\n" + + "| |_| | |_| | < __/\n" + + "|____/ \\__,_|_|\\_\\___|\n"; + System.out.println("Hello from\n" + logo); + } +} +>>>>>>> Stashed changes diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java deleted file mode 100644 index 5d313334c..000000000 --- a/src/main/java/Duke.java +++ /dev/null @@ -1,10 +0,0 @@ -public class Duke { - public static void main(String[] args) { - String logo = " ____ _ \n" - + "| _ \\ _ _| | _____ \n" - + "| | | | | | | |/ / _ \\\n" - + "| |_| | |_| | < __/\n" - + "|____/ \\__,_|_|\\_\\___|\n"; - System.out.println("Hello from\n" + logo); - } -} From a2dd3143b74c8ce0fdf5baa98987ebba6ea4c44f Mon Sep 17 00:00:00 2001 From: MayFairMI6 <143886061+MayFairMI6@users.noreply.github.com> Date: Wed, 25 Sep 2024 06:57:16 -0400 Subject: [PATCH 15/53] Update and rename Task (1).java to Task.java --- src/main/java/{Task (1).java => Task.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/main/java/{Task (1).java => Task.java} (100%) diff --git a/src/main/java/Task (1).java b/src/main/java/Task.java similarity index 100% rename from src/main/java/Task (1).java rename to src/main/java/Task.java From bbd418be6b02e58fb284e992ea1478fb01a1c60d Mon Sep 17 00:00:00 2001 From: MayFairMI6 <143886061+MayFairMI6@users.noreply.github.com> Date: Thu, 26 Sep 2024 12:05:07 -0400 Subject: [PATCH 16/53] Delete src/main/java/Task (1).java Redundant file-naming error --- src/main/java/Task (1).java | 70 ------------------------------------- 1 file changed, 70 deletions(-) delete mode 100644 src/main/java/Task (1).java diff --git a/src/main/java/Task (1).java b/src/main/java/Task (1).java deleted file mode 100644 index be60ffbc7..000000000 --- a/src/main/java/Task (1).java +++ /dev/null @@ -1,70 +0,0 @@ -public class Task { - protected String description; - protected boolean isDone; - - public Task(String description) { - this.description = description; - this.isDone = false; - } - - // Changed method names to be meaningful and concise - public String getStatusIcon() { - return isDone ? "X" : " "; - } - - // Guard clause applied to eliminate nested logic - public void markAsDone() { - this.isDone = true; - } - - public void markAsNotDone() { - this.isDone = false; - } - - // Kept method consistent, no change required - @Override - public String toString() { - return "[" + getStatusIcon() + "] " + description; - } -} - -public class ToDo extends Task { - public ToDo(String description) { - super(description); - } - - @Override - public String toString() { - return "[T]" + super.toString(); - } -} - -public class Deadline extends Task { - protected String deadline; // Renamed 'by' to 'deadline' for clarity - - public Deadline(String description, String deadline) { - super(description); - this.deadline = deadline; - } - - @Override - public String toString() { - return "[D]" + super.toString() + " (by: " + deadline + ")"; - } -} - -public class Event extends Task { - protected String startTime; - protected String endTime; - - public Event(String description, String startTime, String endTime) { - super(description); - this.startTime = startTime; - this.endTime = endTime; - } - - @Override - public String toString() { - return "[E]" + super.toString() + " (from: " + startTime + " to: " + endTime + ")"; - } -} From 503b48d70f25f907d50ba3413f03671f38a982a2 Mon Sep 17 00:00:00 2001 From: MayFairMI6 <143886061+MayFairMI6@users.noreply.github.com> Date: Thu, 26 Sep 2024 12:34:11 -0400 Subject: [PATCH 17/53] Delete AirBorderException.java --- AirBorderException.java | 12 ------------ 1 file changed, 12 deletions(-) delete mode 100644 AirBorderException.java diff --git a/AirBorderException.java b/AirBorderException.java deleted file mode 100644 index 8d381a613..000000000 --- a/AirBorderException.java +++ /dev/null @@ -1,12 +0,0 @@ -public class AirBorderException extends Exception { - public AirBorderException(String message) { - super(message); - } -} - -// Specific InvalidCommandException for unrecognized requests -class InvalidCommandException extends AirBorderException { - public InvalidCommandException() { - super("Unrecognized Request: Please ensure your input is correct or contact ground staff for assistance."); - } -} From a72b114f09b05b4394842ea967bac365316725dd Mon Sep 17 00:00:00 2001 From: MayFairMI6 <143886061+MayFairMI6@users.noreply.github.com> Date: Thu, 26 Sep 2024 13:13:43 -0400 Subject: [PATCH 18/53] Modularity Modularity update --- src/main/java/AirBorder.java | 183 ++++++++++++++++++----------------- src/main/java/Deadline.java | 13 +++ src/main/java/Deadline.txt | 13 +++ src/main/java/Event.java | 15 +++ src/main/java/Task.java | 46 +-------- src/main/java/ToDo.java | 10 ++ 6 files changed, 146 insertions(+), 134 deletions(-) create mode 100644 src/main/java/Deadline.java create mode 100644 src/main/java/Deadline.txt create mode 100644 src/main/java/Event.java create mode 100644 src/main/java/ToDo.java diff --git a/src/main/java/AirBorder.java b/src/main/java/AirBorder.java index a07909562..ac374e424 100644 --- a/src/main/java/AirBorder.java +++ b/src/main/java/AirBorder.java @@ -3,13 +3,13 @@ import java.util.Scanner; public class AirBorder { + // Hardcoded file path to save and load tasks + private static final String FILE_PATH = "C:\\Users\\anony\\OneDrive\\Documents\\GitHub\\ip\\src\\main\\java\\airborder.txt"; private static ArrayList taskList = new ArrayList<>(); public static void main(String[] args) { - String filePath = args.length > 0 ? args[0] : "./data/airborder.txt"; // Command-line argument for file path - loadTasks(filePath); // Load tasks from file at startup + loadTasks(); // Load tasks from file at startup Scanner inputScanner = new Scanner(System.in); - printWelcomeMessage(); while (true) { @@ -17,7 +17,7 @@ public static void main(String[] args) { if (userCommand.equalsIgnoreCase("bye")) { printExitMessage(); - saveTasks(filePath); // Save tasks before exiting + saveTasks(); // Save tasks before exiting break; } @@ -27,22 +27,22 @@ public static void main(String[] args) { printTaskList(); break; case "todo": - addToDoTask(userCommand.substring(5).trim(), filePath); + addToDoTask(userCommand.substring(5).trim()); break; case "deadline": - addDeadlineTask(userCommand, filePath); + addDeadlineTask(userCommand); break; case "event": - addEventTask(userCommand, filePath); + addEventTask(userCommand); break; case "delete": - deleteTask(userCommand, filePath); + deleteTask(userCommand); break; case "mark": - markTaskAsDone(userCommand, filePath); + markTaskAsDone(userCommand); break; case "unmark": - unmarkTask(userCommand, filePath); + unmarkTask(userCommand); break; default: throw new InvalidCommandException(); @@ -55,83 +55,31 @@ public static void main(String[] args) { inputScanner.close(); } - // Task management methods with added file path parameter - private static void addToDoTask(String description, String filePath) throws AirBorderException { - if (description.isEmpty()) { - throw new AirBorderException("Insufficient Documentation: Task description cannot be empty. Please provide a valid task."); - } - Task newTask = new ToDo(description); - taskList.add(newTask); - printTaskAddedMessage(newTask); - saveTasks(filePath); // Save tasks after adding - } - - private static void addDeadlineTask(String userCommand, String filePath) throws AirBorderException { - String[] taskDetails = userCommand.substring(9).split(" /by "); - if (taskDetails.length < 2 || taskDetails[0].trim().isEmpty()) { - throw new AirBorderException("Insufficient Documentation: Invalid deadline format. Use: deadline /by "); - } - Task newTask = new Deadline(taskDetails[0].trim(), taskDetails[1].trim()); - taskList.add(newTask); - printTaskAddedMessage(newTask); - saveTasks(filePath); // Save tasks after adding - } - - private static void addEventTask(String userCommand, String filePath) throws AirBorderException { - String[] taskDetails = userCommand.substring(6).split(" /from | /to "); - if (taskDetails.length < 3 || taskDetails[0].trim().isEmpty()) { - throw new AirBorderException("Minimum Passport Validity Condition Not Met for Destination: Invalid event format. Use: event /from /to "); - } - Task newTask = new Event(taskDetails[0].trim(), taskDetails[1].trim(), taskDetails[2].trim()); - taskList.add(newTask); - printTaskAddedMessage(newTask); - saveTasks(filePath); // Save tasks after adding - } - - private static void deleteTask(String userCommand, String filePath) throws AirBorderException { - int taskIndex = Integer.parseInt(userCommand.split(" ")[1]) - 1; - if (isValidTaskIndex(taskIndex)) { - Task removedTask = taskList.remove(taskIndex); - printTaskDeletedMessage(removedTask); - saveTasks(filePath); // Save tasks after deleting + private static String getCommandType(String userCommand) { + if (userCommand.startsWith("todo ")) { + return "todo"; + } else if (userCommand.startsWith("deadline ")) { + return "deadline"; + } else if (userCommand.startsWith("event ")) { + return "event"; + } else if (userCommand.startsWith("delete ")) { + return "delete"; + } else if (userCommand.equalsIgnoreCase("list")) { + return "list"; + } else if (userCommand.startsWith("mark ")) { + return "mark"; + } else if (userCommand.startsWith("unmark ")) { + return "unmark"; } else { - throw new AirBorderException("Check-In Refused: Invalid task number."); + return "unknown"; } } - private static void markTaskAsDone(String userCommand, String filePath) throws AirBorderException { - int taskIndex = Integer.parseInt(userCommand.split(" ")[1]) - 1; - if (isValidTaskIndex(taskIndex)) { - taskList.get(taskIndex).markAsDone(); - printTaskDoneMessage(taskList.get(taskIndex)); - saveTasks(filePath); // Save tasks after marking - } else { - throw new AirBorderException("Check-In Refused: Invalid task number."); - } - } - - private static void unmarkTask(String userCommand, String filePath) throws AirBorderException { - int taskIndex = Integer.parseInt(userCommand.split(" ")[1]) - 1; - if (isValidTaskIndex(taskIndex)) { - taskList.get(taskIndex).markAsNotDone(); - printTaskUndoneMessage(taskList.get(taskIndex)); - saveTasks(filePath); // Save tasks after unmarking - } else { - throw new AirBorderException("Check-In Refused: Invalid task number."); - } - } - - // Check if the task index is valid - private static boolean isValidTaskIndex(int taskIndex) { - return taskIndex >= 0 && taskIndex < taskList.size(); - } - - // Save tasks to file - private static void saveTasks(String filePath) { + // Save tasks to the hardcoded file path + private static void saveTasks() { try { - File file = new File(filePath); - // Ensure the directory exists - file.getParentFile().mkdirs(); + File file = new File(FILE_PATH); + file.getParentFile().mkdirs(); // Ensure the directory exists FileWriter writer = new FileWriter(file); for (Task task : taskList) { writer.write(formatTaskForSave(task) + System.lineSeparator()); @@ -142,12 +90,12 @@ private static void saveTasks(String filePath) { } } - // Load tasks from file - private static void loadTasks(String filePath) { + // Load tasks from the hardcoded file path + private static void loadTasks() { try { - File file = new File(filePath); + File file = new File(FILE_PATH); if (!file.exists()) { - return; // No file to load from + return; // File does not exist, no tasks to load } BufferedReader reader = new BufferedReader(new FileReader(file)); String line; @@ -161,7 +109,7 @@ private static void loadTasks(String filePath) { } } - // Helper to format tasks for saving + // Helper method to format tasks for saving to file private static String formatTaskForSave(Task task) { if (task instanceof ToDo) { return "T | " + (task.isDone ? "1" : "0") + " | " + task.description; @@ -175,7 +123,7 @@ private static String formatTaskForSave(Task task) { return ""; } - // Helper to parse tasks from file + // Helper method to parse tasks from file private static Task parseTaskFromFile(String line) { String[] parts = line.split(" \\| "); switch (parts[0]) { @@ -202,5 +150,62 @@ private static Task parseTaskFromFile(String line) { } } - // Other helper methods (printTaskAddedMessage, printTaskDeletedMessage, etc.) remain unchanged + // Other methods for task operations like addToDoTask(), addDeadlineTask(), etc. remain the same + private static void printWelcomeMessage() { + System.out.println("____________________________________________________________"); + System.out.println(" Welcome aboard AirBorder."); + System.out.println(" Ready to assist you with your tasks!"); + System.out.println("____________________________________________________________"); + } + + private static void printExitMessage() { + System.out.println("____________________________________________________________"); + System.out.println(" Thank you for flying with AirBorder!"); + System.out.println("____________________________________________________________"); + } + + private static void printTaskList() { + System.out.println("____________________________________________________________"); + if (taskList.isEmpty()) { + System.out.println(" No tasks in your list."); + } else { + System.out.println(" Here are your tasks:"); + for (int i = 0; i < taskList.size(); i++) { + System.out.println(" " + (i + 1) + ". " + taskList.get(i)); + } + } + System.out.println("____________________________________________________________"); + } + + private static void printErrorMessage(String message) { + System.out.println("____________________________________________________________"); + System.out.println(" ERROR: " + message); + System.out.println("____________________________________________________________"); + } + + private static void printTaskAddedMessage(Task task) { + System.out.println("____________________________________________________________"); + System.out.println(" Task added: " + task); + System.out.println(" Now you have " + taskList.size() + " tasks."); + System.out.println("____________________________________________________________"); + } + + private static void printTaskDeletedMessage(Task task) { + System.out.println("____________________________________________________________"); + System.out.println(" Task deleted: " + task); + System.out.println(" Now you have " + taskList.size() + " tasks."); + System.out.println("____________________________________________________________"); + } + + private static void printTaskDoneMessage(Task task) { + System.out.println("____________________________________________________________"); + System.out.println(" Task completed: " + task); + System.out.println("____________________________________________________________"); + } + + private static void printTaskUndoneMessage(Task task) { + System.out.println("____________________________________________________________"); + System.out.println(" Task marked as incomplete: " + task); + System.out.println("____________________________________________________________"); + } } diff --git a/src/main/java/Deadline.java b/src/main/java/Deadline.java new file mode 100644 index 000000000..573b7b879 --- /dev/null +++ b/src/main/java/Deadline.java @@ -0,0 +1,13 @@ +public class Deadline extends Task { + protected String by; + + public Deadline(String description, String by) { + super(description); + this.by = by; + } + + @Override + public String toString() { + return "[D]" + super.toString() + " (by: " + by + ")"; + } +} diff --git a/src/main/java/Deadline.txt b/src/main/java/Deadline.txt new file mode 100644 index 000000000..573b7b879 --- /dev/null +++ b/src/main/java/Deadline.txt @@ -0,0 +1,13 @@ +public class Deadline extends Task { + protected String by; + + public Deadline(String description, String by) { + super(description); + this.by = by; + } + + @Override + public String toString() { + return "[D]" + super.toString() + " (by: " + by + ")"; + } +} diff --git a/src/main/java/Event.java b/src/main/java/Event.java new file mode 100644 index 000000000..d1378a314 --- /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: " + from + " to: " + to + ")"; + } +} diff --git a/src/main/java/Task.java b/src/main/java/Task.java index be60ffbc7..0d3600565 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -7,12 +7,10 @@ public Task(String description) { this.isDone = false; } - // Changed method names to be meaningful and concise public String getStatusIcon() { - return isDone ? "X" : " "; + return (isDone ? "X" : " "); } - // Guard clause applied to eliminate nested logic public void markAsDone() { this.isDone = true; } @@ -21,50 +19,8 @@ public void markAsNotDone() { this.isDone = false; } - // Kept method consistent, no change required @Override public String toString() { return "[" + getStatusIcon() + "] " + description; } } - -public class ToDo extends Task { - public ToDo(String description) { - super(description); - } - - @Override - public String toString() { - return "[T]" + super.toString(); - } -} - -public class Deadline extends Task { - protected String deadline; // Renamed 'by' to 'deadline' for clarity - - public Deadline(String description, String deadline) { - super(description); - this.deadline = deadline; - } - - @Override - public String toString() { - return "[D]" + super.toString() + " (by: " + deadline + ")"; - } -} - -public class Event extends Task { - protected String startTime; - protected String endTime; - - public Event(String description, String startTime, String endTime) { - super(description); - this.startTime = startTime; - this.endTime = endTime; - } - - @Override - public String toString() { - return "[E]" + super.toString() + " (from: " + startTime + " to: " + endTime + ")"; - } -} diff --git a/src/main/java/ToDo.java b/src/main/java/ToDo.java new file mode 100644 index 000000000..ee72ef43c --- /dev/null +++ b/src/main/java/ToDo.java @@ -0,0 +1,10 @@ +public class ToDo extends Task { + public ToDo(String description) { + super(description); + } + + @Override + public String toString() { + return "[T]" + super.toString(); + } +} From 53b56976055ff6921fb4da73eccfc2df651f3cd7 Mon Sep 17 00:00:00 2001 From: MayFairMI6 <143886061+MayFairMI6@users.noreply.github.com> Date: Thu, 26 Sep 2024 18:06:14 -0400 Subject: [PATCH 19/53] Fixed version compatibility issue --- AirBorder.jar | Bin 0 -> 8171 bytes MANIFEST.MF | 1 + src/main/java/AirBorder.java | 82 ++++++++++++++++++++- src/main/java/AirBorderException.java | 7 -- src/main/java/InvalidCommandException.java | 5 ++ src/main/java/Task.java | 2 +- src/main/java/airborder.txt | 2 + src/main/out/AirBorder.class | Bin 0 -> 8795 bytes src/main/out/AirBorderException.class | Bin 0 -> 236 bytes src/main/out/Deadline.class | Bin 0 -> 868 bytes src/main/out/Event.class | Bin 0 -> 944 bytes src/main/out/InvalidCommandException.class | Bin 0 -> 355 bytes src/main/out/Task.class | Bin 0 -> 1136 bytes src/main/out/ToDo.class | Bin 0 -> 735 bytes 14 files changed, 88 insertions(+), 11 deletions(-) create mode 100644 AirBorder.jar create mode 100644 MANIFEST.MF create mode 100644 src/main/java/InvalidCommandException.java create mode 100644 src/main/java/airborder.txt create mode 100644 src/main/out/AirBorder.class create mode 100644 src/main/out/AirBorderException.class create mode 100644 src/main/out/Deadline.class create mode 100644 src/main/out/Event.class create mode 100644 src/main/out/InvalidCommandException.class create mode 100644 src/main/out/Task.class create mode 100644 src/main/out/ToDo.class diff --git a/AirBorder.jar b/AirBorder.jar new file mode 100644 index 0000000000000000000000000000000000000000..605fa76eab92df3592b9a0b3e47536411372989d GIT binary patch literal 8171 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 taskList = new ArrayList<>(); @@ -75,6 +74,80 @@ private static String getCommandType(String userCommand) { } } + // Methods for adding, deleting, and managing tasks + + private static void addToDoTask(String description) throws AirBorderException { + if (description.isEmpty()) { + throw new AirBorderException("Task description cannot be empty."); + } + Task newTask = new ToDo(description); + taskList.add(newTask); + printTaskAddedMessage(newTask); + } + + private static void addDeadlineTask(String userCommand) throws AirBorderException { + String[] taskDetails = userCommand.substring(9).split(" /by "); + if (taskDetails.length < 2 || taskDetails[0].trim().isEmpty() || taskDetails[1].trim().isEmpty()) { + throw new AirBorderException("Invalid deadline format. Use: deadline /by