From d7666304c09cb91d93bdd311bacb3a29be46293b Mon Sep 17 00:00:00 2001 From: "SHANNEN\\shan" Date: Fri, 3 Mar 2023 01:15:43 +0800 Subject: [PATCH 1/2] Add Level-7 Save, Add new package messages, Update methods to support Level-7 --- src/main/java/Deadline.java | 10 +- src/main/java/Duke.java | 239 +++++++++++++----- src/main/java/Event.java | 10 +- src/main/java/Task.java | 4 +- src/main/java/Todo.java | 8 +- src/main/java/messages/ErrorMessages.java | 10 + src/main/java/messages/newTaskMessages.java | 9 + .../java/messages/operationalMessages.java | 14 + 8 files changed, 237 insertions(+), 67 deletions(-) create mode 100644 src/main/java/messages/ErrorMessages.java create mode 100644 src/main/java/messages/newTaskMessages.java create mode 100644 src/main/java/messages/operationalMessages.java diff --git a/src/main/java/Deadline.java b/src/main/java/Deadline.java index 15f5a7f3c..68303a70a 100644 --- a/src/main/java/Deadline.java +++ b/src/main/java/Deadline.java @@ -1,16 +1,22 @@ public class Deadline extends Task { protected String by; - protected String opening = "...\n" + "Got it. I've added this deadline:\n" + " [D][ ] "; +// protected String opening = "...\n" + "Got it. I've added this deadline:\n" + " [D][ ] "; public Deadline(String description, String by) { super(description); this.by = by; - System.out.println(opening + description + "(by: " + by + ")"); +// System.out.println(opening + description + "(by: " + by + ")"); } @Override public String toString() { return ("[D]" + super.toString() + " (by: " + by + ")"); } + + @Override + public String toSerialisedString() { + String isDoneStr = isDone ? "1" : "0"; + return ("D|" + isDoneStr +"|" + description + "|" + by); + } } diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index be179421a..e6e0436da 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -1,16 +1,47 @@ import exceptions.DukeException; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.util.ArrayList; import java.util.Scanner; +import static messages.ErrorMessages.invalidCommandMessage; +import static messages.ErrorMessages.invalidIndexErrorMessage; +import static messages.ErrorMessages.missingInfoErrorMessage; +import static messages.newTaskMessages.createNewDeadlineMessage; +import static messages.newTaskMessages.createNewEventMessage; +import static messages.newTaskMessages.createNewTodoMessage; +import static messages.operationalMessages.openingMessage; +import static messages.operationalMessages.closingMessage; +import static messages.operationalMessages.markTaskMessage; +import static messages.operationalMessages.unmarkTaskMessage; +import static messages.operationalMessages.removeTaskMessage; + public class Duke { -// 1) check for sufficient arguments -// 2) check for /by etc - public static void main(String[] args) { - System.out.println("Hello, I'm Duke!\n" + "What would you like to do today?"); + public static void main(String[] args) throws IOException { + ArrayList items = new ArrayList<>(); + + File f = new File("data/Duke.txt"); + if (f.exists()) { + Scanner scan = new Scanner(f); + while (scan.hasNext()) { + String taskLine = scan.nextLine(); + String[] taskArgs = taskLine.split("\\|"); + if (taskArgs[0].equals("T")) { + items.add(loadNewTodo(taskArgs[1].trim(), taskArgs[2].trim())); + } else if (taskArgs[0].equals("D")) { + items.add(loadNewEvent(taskArgs[1].trim(), taskArgs[2].trim(), taskArgs[3].trim(), taskArgs[4].trim())); + } else { + taskArgs[0] = "E"; + items.add(loadNewDeadline(taskArgs[1].trim(), taskArgs[2].trim(), taskArgs[3].trim())); + } + } + } + + System.out.println(openingMessage); Scanner response = new Scanner(System.in); - int counter = 1; - Task[] items = new Task[101]; // 1-based String line = ""; while (!(line.equals("bye"))) { @@ -21,69 +52,157 @@ public static void main(String[] args) { break; } if (line.equals("list")) { - System.out.println("...\n" + "Here are the tasks in your list:"); - for (int i = 1; i < counter; i++) { - System.out.println(i + "." + items[i]); - } + displayList(items); continue; } String arguments = lines[1]; + if (command.equals("mark")) { - try { - int index = Integer.parseInt(arguments); - items[index].isDone = true; - System.out.println("...\n" + "Nice! I've marked this task as done:\n" + items[index]); - } catch (NumberFormatException e) { - System.out.println("Please input a valid index!"); - } + markTask(items, arguments); } else if (command.equals("unmark")) { - try { - int index = Integer.parseInt(arguments); - items[index].isDone = false; - System.out.println("...\n" + "OK, I've marked this task as not done yet:\n" + items[index]); - } catch (NumberFormatException e) { - System.out.println("Please input a valid index!"); - } + unmarkTask(items, arguments); } else if (command.equals("todo")) { - Todo newTodo = new Todo(arguments); - items[counter] = newTodo; - counter++; + addNewTodo(items, arguments); } else if (command.equals("event")) { - try { - String[] eventInfo = arguments.split("/from "); - if (eventInfo.length < 2) { - throw new DukeException("There's missing information."); - } - String[] eventDuration = eventInfo[1].split("/to "); - if (eventDuration.length < 2) { - throw new DukeException("There's missing information."); - } - Event newEvent = new Event(eventInfo[0], eventDuration[0], eventDuration[1]); - items[counter] = newEvent; - counter++; - } catch (IndexOutOfBoundsException e){ - System.out.println("There's some missing information."); - } catch (DukeException e) { - System.out.println(e.getMessage()); - } + addNewEvent(items, arguments); } else if (command.equals("deadline")) { - try { - String[] deadlineInfo = arguments.split("/by "); - if (deadlineInfo.length < 2) { - throw new DukeException("There's missing information."); - } - Deadline newDeadline = new Deadline(deadlineInfo[0], deadlineInfo[1]); - items[counter] = newDeadline; - counter++; - } catch (StringIndexOutOfBoundsException e) { - System.out.println("What would you like to do, and when's the deadline?"); - } catch (IndexOutOfBoundsException e) { - System.out.println("Remember to add /by before the deadline!"); - } catch (DukeException e) { - System.out.println(e.getMessage()); - } + addNewDeadline(items, arguments); + } else if (command.equals("remove")) { + removeTask(items, arguments); + } else { + System.out.println(invalidCommandMessage); + continue; + } + writeToFile(items); + } + System.out.println(closingMessage); + } + + public static void writeToFile(ArrayList items) throws IOException { + FileWriter fw = new FileWriter("data/Duke.txt"); + StringBuilder sb = new StringBuilder(); + for (Task item : items) { + String newSerialisedTask = item.toSerialisedString(); + sb.append(newSerialisedTask).append("\n"); + } + String serialString = sb.toString(); + fw.write(serialString); + fw.close(); + } + + public static void displayList(ArrayList items) { + System.out.println("...\n" + "Here are the tasks in your list:"); + for (int i = 0; i < items.size(); i++) { + System.out.println((i + 1) + "." + items.get(i)); + } + } + + public static void markTask(ArrayList items, String arguments) { + try { + int index = Integer.parseInt(arguments) - 1; + items.get(index).isDone = true; + System.out.println(markTaskMessage + items.get(index)); + } catch (NumberFormatException e) { + System.out.println(invalidIndexErrorMessage); + } + } + + public static void unmarkTask(ArrayList items, String arguments) { + try { + int index = Integer.parseInt(arguments) - 1; + items.get(index).isDone = false; + System.out.println(unmarkTaskMessage + items.get(index)); + } catch (NumberFormatException e) { + System.out.println(invalidIndexErrorMessage); + } + } + + public static void removeTask(ArrayList items, String arguments) { + try { + int index = Integer.parseInt(arguments) - 1; + items.remove(index); + System.out.println(removeTaskMessage + (index + 1)); + } catch (NumberFormatException e) { + System.out.println(invalidIndexErrorMessage); + } + } + + public static Task createNewTodo(String arguments) { + System.out.println(createNewTodoMessage + arguments); + return new Todo(arguments); + } + + public static void addNewTodo(ArrayList items, String arguments) { + Task newTask = createNewTodo(arguments); + items.add(newTask); + } + + public static Task loadNewTodo(String isDoneString, String description) { + Todo readTodo = new Todo(description); + if (isDoneString.equals("1")) { + readTodo.isDone = true; + } + return readTodo; + } + + public static Task createNewEvent(String arguments) throws DukeException { + try { + String[] eventInfo = arguments.split("/from "); + if (eventInfo.length < 2) { + throw new DukeException(missingInfoErrorMessage); } + String[] eventDuration = eventInfo[1].split("/to "); + if (eventDuration.length < 2) { + throw new DukeException(missingInfoErrorMessage); + } + System.out.println(createNewEventMessage + eventInfo[0] + "(from: " + eventDuration[0] + " to: " + eventDuration[1] + ")"); + return new Event(eventInfo[0], eventDuration[0], eventDuration[1]); + + } catch (IndexOutOfBoundsException e) { + throw new DukeException(missingInfoErrorMessage); + } + } + + public static void addNewEvent(ArrayList items, String arguments) { + try { + Task newEvent = createNewEvent(arguments); + items.add(newEvent); + } catch (DukeException e) { + System.out.println(e.getMessage()); + } + } + + public static Task loadNewEvent(String isDoneString, String description, String start, String end) { + Event readEvent = new Event(description, start, end); + if (isDoneString.equals("1")) { + readEvent.isDone = true; + } + return readEvent; + } + + public static Task createNewDeadline(String arguments) throws DukeException { + String[] deadlineInfo = arguments.split("/by "); + if (deadlineInfo.length < 2) { + throw new DukeException(missingInfoErrorMessage); + } + System.out.println(createNewDeadlineMessage + deadlineInfo[0] + "(by: " + deadlineInfo[1] + ")"); + return new Deadline(deadlineInfo[0], deadlineInfo[1]); + } + + public static void addNewDeadline(ArrayList items, String arguments) { + try { + Task newDeadline = createNewDeadline(arguments); + items.add(newDeadline); + } catch (DukeException e) { + System.out.println(e.getMessage()); + } + } + + public static Task loadNewDeadline(String isDoneString, String description, String by) { + Deadline readDeadline = new Deadline(description, by); + if (isDoneString.equals("1")) { + readDeadline.isDone = true; } - System.out.println("Bye! Have a nice day:D"); + return readDeadline; } } \ No newline at end of file diff --git a/src/main/java/Event.java b/src/main/java/Event.java index de0a8645f..48fc29e98 100644 --- a/src/main/java/Event.java +++ b/src/main/java/Event.java @@ -1,17 +1,23 @@ public class Event extends Task { protected String start; protected String end; - protected String opening = "...\n" + "Got it. I've added this event:\n" + " [E][ ] "; +// protected String opening = "...\n" + "Got it. I've added this event:\n" + " [E][ ] "; public Event(String description, String start, String end) { super(description); this.start = start; this.end = end; - System.out.println(opening + description + "(from: " + start + " to: " + end + ")"); +// System.out.println(opening + description + "(from: " + start + " to: " + end + ")"); } @Override public String toString() { return ("[E]" + super.toString() + " (from: " + start + " to: " + end + ")"); } + + @Override + public String toSerialisedString() { + String isDoneStr = isDone ? "1" : "0"; + return ("E|" + isDoneStr + "|" + description + "|" + start + "|" + end); + } } diff --git a/src/main/java/Task.java b/src/main/java/Task.java index 751660a91..7454fc53a 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -1,4 +1,4 @@ -public class Task { +public abstract class Task { protected String description; protected boolean isDone; @@ -11,6 +11,8 @@ public String getStatusIcon() { return (isDone ? "x" : " "); // mark x if isDone is true, space if false } + public abstract String toSerialisedString(); + public String toString() { return ("[" + this.getStatusIcon() + "] " + description); } diff --git a/src/main/java/Todo.java b/src/main/java/Todo.java index 42eb7e57b..70d56d796 100644 --- a/src/main/java/Todo.java +++ b/src/main/java/Todo.java @@ -1,13 +1,17 @@ public class Todo extends Task { - protected String opening = "...\n" + "Got it. I've added this task:\n" + " [T][ ] "; public Todo(String description) { super(description); - System.out.println(opening + description); } @Override public String toString() { return ("[T]" + super.toString()); } + + @Override + public String toSerialisedString() { + String isDoneStr = isDone ? "1" : "0"; + return ("T|" + isDoneStr +"|" + description); + } } \ No newline at end of file diff --git a/src/main/java/messages/ErrorMessages.java b/src/main/java/messages/ErrorMessages.java new file mode 100644 index 000000000..3947e45c4 --- /dev/null +++ b/src/main/java/messages/ErrorMessages.java @@ -0,0 +1,10 @@ +package messages; + +public class ErrorMessages { + public static final String invalidIndexErrorMessage = "...\n" + "Please input a valid index!"; + + public static final String missingInfoErrorMessage = "...\n" + + "There's missing information. What would you like to do today?"; + + public static final String invalidCommandMessage = "...\n" + "Sorry, I don't understand that."; +} \ No newline at end of file diff --git a/src/main/java/messages/newTaskMessages.java b/src/main/java/messages/newTaskMessages.java new file mode 100644 index 000000000..83f18a171 --- /dev/null +++ b/src/main/java/messages/newTaskMessages.java @@ -0,0 +1,9 @@ +package messages; + +public class newTaskMessages { + public static final String createNewTodoMessage = "...\n" + "Got it. I've added this task:\n" + " [T][ ] "; + + public static final String createNewEventMessage = "...\n" + "Got it. I've added this event:\n" + " [E][ ] "; + + public static final String createNewDeadlineMessage = "...\n" + "Got it. I've added this deadline:\n" + " [D][ ] "; +} diff --git a/src/main/java/messages/operationalMessages.java b/src/main/java/messages/operationalMessages.java new file mode 100644 index 000000000..6191f5d3a --- /dev/null +++ b/src/main/java/messages/operationalMessages.java @@ -0,0 +1,14 @@ +package messages; + +public class operationalMessages { + public static final String openingMessage = "...\n" + "Hello, I'm Duke!\n" + "What would you like to do today?"; + + public static final String closingMessage = "...\n" + "Bye! Have a nice day:D"; + + public static final String markTaskMessage = "...\n" + "Nice! I've marked this task as done:\n"; + + public static final String unmarkTaskMessage = "...\n" + "OK, I've marked this task as not done yet:\n"; + + public static final String removeTaskMessage = "...\n" + "Okay, I've removed task "; + +} From 099340fc87415dfdc5c58eb532192e8a14acb023 Mon Sep 17 00:00:00 2001 From: "SHANNEN\\shan" Date: Fri, 3 Mar 2023 13:11:46 +0800 Subject: [PATCH 2/2] Remove extra code (cherry picked from commit 517e9327e4182c5d37ba98102c93c132ba884412) --- src/main/java/Deadline.java | 2 -- src/main/java/Event.java | 2 -- 2 files changed, 4 deletions(-) diff --git a/src/main/java/Deadline.java b/src/main/java/Deadline.java index 68303a70a..8ef16e48a 100644 --- a/src/main/java/Deadline.java +++ b/src/main/java/Deadline.java @@ -1,12 +1,10 @@ public class Deadline extends Task { protected String by; -// protected String opening = "...\n" + "Got it. I've added this deadline:\n" + " [D][ ] "; public Deadline(String description, String by) { super(description); this.by = by; -// System.out.println(opening + description + "(by: " + by + ")"); } @Override diff --git a/src/main/java/Event.java b/src/main/java/Event.java index 48fc29e98..46e9c5128 100644 --- a/src/main/java/Event.java +++ b/src/main/java/Event.java @@ -1,13 +1,11 @@ public class Event extends Task { protected String start; protected String end; -// protected String opening = "...\n" + "Got it. I've added this event:\n" + " [E][ ] "; public Event(String description, String start, String end) { super(description); this.start = start; this.end = end; -// System.out.println(opening + description + "(from: " + start + " to: " + end + ")"); } @Override