-
Notifications
You must be signed in to change notification settings - Fork 454
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[Rebecca Lau] iP #476
base: master
Are you sure you want to change the base?
[Rebecca Lau] iP #476
Changes from 20 commits
d839859
dce5cee
247ac39
78ea29d
f15709b
6a5d0e8
0be4686
5cb8123
0c57b93
310178c
1cbdef7
fd0bb3d
2ae58cc
2fcd257
f2aedc3
e6a51b1
fe0ff94
e4ad385
8e90406
c27673f
7fb685b
cb8b508
e48c0b5
b4758be
f14f614
db642c7
80db064
621657a
07cb01c
87995c8
db907f2
9cf988a
c6cc3a3
0972eb4
a4dd0df
cc9a2e4
2f301dd
20a4b9e
b77329f
c053484
2ef64a7
f29ff73
35b27e9
86cd0e0
9931a27
2e44079
fcab3b7
764206d
7f34564
9dcab1a
308fc97
454e98a
1bb04c1
1e77943
da29a26
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
This file was deleted.
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,49 @@ | ||
package duke; | ||
|
||
import duke.command.Command; | ||
import duke.task.TaskList; | ||
|
||
import java.io.IOException; | ||
|
||
public class Duke { | ||
|
||
private Storage storage; | ||
private TaskList tasks; | ||
private Ui ui; | ||
|
||
public Duke(String filePath) { | ||
ui = new Ui(); | ||
storage = new Storage(filePath); | ||
try { | ||
System.out.println(storage.load()); | ||
tasks = storage.load(); | ||
} catch (DukeException e) { | ||
ui.showError(e.getMessage()); | ||
tasks = new TaskList(); | ||
} catch (IOException e) { | ||
ui.showError(e.getMessage()); | ||
} | ||
} | ||
|
||
public void run() { | ||
ui.showWelcome(); | ||
boolean isExit = false; | ||
while (!isExit) { | ||
try { | ||
String fullCommand = ui.readCommand(); | ||
ui.showLine(); // show the divider line ("_______") | ||
Command c = Parser.parse(fullCommand); | ||
c.execute(tasks, ui, storage); | ||
isExit = c.isExit(); | ||
} catch (DukeException e) { | ||
ui.showError(e.getMessage()); | ||
} finally { | ||
ui.showLine(); | ||
} | ||
} | ||
} | ||
|
||
public static void main(String[] args) { | ||
new Duke("duke.txt").run(); | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
package duke; | ||
|
||
public class DukeException extends Exception { | ||
public DukeException(String message) { | ||
super(message); | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
package duke; | ||
|
||
import duke.command.*; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Is it better to not use wildcard for the import? It might be better to list all the stuff you want to import. |
||
|
||
public class Parser { | ||
public static Command parse(String input) throws DukeException { | ||
if (input.equals("bye")) { | ||
return new ExitCommand(); | ||
} else if (input.equals("list")) { | ||
return new ListCommand(); | ||
} else if (input.startsWith("done")) { | ||
return new DoneCommand(input); | ||
} else if (input.startsWith("delete")) { | ||
return new DeleteCommand(input); | ||
} else if (input.startsWith("todo")) { | ||
return new TodoCommand(input); | ||
} else if (input.startsWith("deadline")) { | ||
return new DeadlineCommand(input); | ||
} else if (input.startsWith("event")) { | ||
return new EventCommand(input); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Using |
||
} else { | ||
return new ErrorCommand(); | ||
} | ||
} | ||
} |
Original file line number | Diff line number | Diff line change | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,96 @@ | ||||||||||||||||||
package duke; | ||||||||||||||||||
|
||||||||||||||||||
import duke.task.*; | ||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Would be better to specifically list imports as before There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It might be better to list all the stuff you want to import instead of using wildcard. |
||||||||||||||||||
|
||||||||||||||||||
import java.io.File; | ||||||||||||||||||
import java.io.FileNotFoundException; | ||||||||||||||||||
import java.io.FileWriter; | ||||||||||||||||||
import java.io.IOException; | ||||||||||||||||||
import java.io.PrintWriter; | ||||||||||||||||||
import java.util.Scanner; | ||||||||||||||||||
|
||||||||||||||||||
public class Storage { | ||||||||||||||||||
String filePath; | ||||||||||||||||||
PrintWriter writer; | ||||||||||||||||||
TaskList ls; | ||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Would be good to add |
||||||||||||||||||
|
||||||||||||||||||
public Storage(String filePath) { | ||||||||||||||||||
this.filePath = filePath; | ||||||||||||||||||
} | ||||||||||||||||||
|
||||||||||||||||||
public void rewriteFile(TaskList ls) { | ||||||||||||||||||
this.ls = ls; | ||||||||||||||||||
try { | ||||||||||||||||||
FileWriter fw = new FileWriter(filePath, false); | ||||||||||||||||||
writer = new PrintWriter(fw); | ||||||||||||||||||
} catch (FileNotFoundException e) { | ||||||||||||||||||
e.printStackTrace(); | ||||||||||||||||||
} catch (IOException e) { | ||||||||||||||||||
e.printStackTrace(); | ||||||||||||||||||
} | ||||||||||||||||||
Comment on lines
+46
to
+50
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Possible to combine into a single catch statement here
Suggested change
|
||||||||||||||||||
|
||||||||||||||||||
for (int i = 0; i < ls.getSize(); i++) { | ||||||||||||||||||
Task task = ls.getTask(i); | ||||||||||||||||||
String type = task.getType(); | ||||||||||||||||||
String desc = task.getDesc(); | ||||||||||||||||||
String addOns = task.addOns(); | ||||||||||||||||||
if (type == "todo") { | ||||||||||||||||||
writer.println("T" + (task.checkIfDone() ? " | 1 | " : " | 0 | ") + desc); | ||||||||||||||||||
} else if (type == "deadline") { | ||||||||||||||||||
writer.println("D" + (ls.getTask(i).checkIfDone() ? " | 1 | " : " | 0 | ") | ||||||||||||||||||
+ desc + " | " + addOns); | ||||||||||||||||||
} else if (type == "event") { | ||||||||||||||||||
writer.println("E" + (task.checkIfDone() ? " | 1 | " : " | 0 | ") | ||||||||||||||||||
+ desc + " | " + addOns); | ||||||||||||||||||
} | ||||||||||||||||||
} | ||||||||||||||||||
writer.close(); | ||||||||||||||||||
} | ||||||||||||||||||
|
||||||||||||||||||
public TaskList load() throws IOException, DukeException { | ||||||||||||||||||
TaskList ls = new TaskList(); | ||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Instead of |
||||||||||||||||||
File directory = new File("duke.txt"); | ||||||||||||||||||
if (!directory.exists()) { | ||||||||||||||||||
directory.mkdir(); | ||||||||||||||||||
} | ||||||||||||||||||
File data = new File(filePath); | ||||||||||||||||||
data.createNewFile(); | ||||||||||||||||||
Scanner s = new Scanner(data); | ||||||||||||||||||
while (s.hasNext()) { | ||||||||||||||||||
ls.addTask(parseTask(s.nextLine())); | ||||||||||||||||||
} | ||||||||||||||||||
return ls; | ||||||||||||||||||
} | ||||||||||||||||||
|
||||||||||||||||||
public Task parseTask(String input) throws DukeException { | ||||||||||||||||||
if (input.startsWith("T")) { | ||||||||||||||||||
String taskDesc = input.substring(7); | ||||||||||||||||||
Todo tTask = new Todo(taskDesc); | ||||||||||||||||||
return tTask; | ||||||||||||||||||
} else if (input.startsWith("D")) { | ||||||||||||||||||
String taskDesc = input.substring(7); | ||||||||||||||||||
String taskDate = getDate(input); | ||||||||||||||||||
Deadline dTask = new Deadline(taskDesc, taskDate); | ||||||||||||||||||
return dTask; | ||||||||||||||||||
} else { | ||||||||||||||||||
String taskDesc = input.substring(7); | ||||||||||||||||||
String taskDate = getDate(input); | ||||||||||||||||||
Event eTask = new Event(taskDesc, taskDate); | ||||||||||||||||||
return eTask; | ||||||||||||||||||
} | ||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Could potentially improve readability by renaming |
||||||||||||||||||
} | ||||||||||||||||||
|
||||||||||||||||||
public String getDate(String input) { | ||||||||||||||||||
int endIndex = 0; | ||||||||||||||||||
int count = 0; | ||||||||||||||||||
for (int i = 0; i < input.length(); i++) { | ||||||||||||||||||
if (input.charAt(i) == '|') { | ||||||||||||||||||
if (count == 3) { | ||||||||||||||||||
endIndex = i; | ||||||||||||||||||
} | ||||||||||||||||||
} | ||||||||||||||||||
} | ||||||||||||||||||
return input.substring(endIndex); | ||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Could potentially shorten code by using |
||||||||||||||||||
} | ||||||||||||||||||
|
||||||||||||||||||
} |
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,66 @@ | ||||||||||||||||||||||||||||||||||||||||||||||
package duke; | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
import duke.task.Task; | ||||||||||||||||||||||||||||||||||||||||||||||
import duke.task.TaskList; | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
import java.util.Scanner; | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
public class Ui { | ||||||||||||||||||||||||||||||||||||||||||||||
private Scanner sc; | ||||||||||||||||||||||||||||||||||||||||||||||
private String input = ""; | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
public Ui() { | ||||||||||||||||||||||||||||||||||||||||||||||
this.sc = new Scanner(System.in); | ||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
public void showWelcome() { | ||||||||||||||||||||||||||||||||||||||||||||||
String logo = " ____ _ \n" | ||||||||||||||||||||||||||||||||||||||||||||||
+ "| _ \\ _ _| | _____ \n" | ||||||||||||||||||||||||||||||||||||||||||||||
+ "| | | | | | | |/ / _ \\\n" | ||||||||||||||||||||||||||||||||||||||||||||||
+ "| |_| | |_| | < __/\n" | ||||||||||||||||||||||||||||||||||||||||||||||
+ "|____/ \\__,_|_|\\_\\___|\n"; | ||||||||||||||||||||||||||||||||||||||||||||||
System.out.println("Hello from\n" + logo); | ||||||||||||||||||||||||||||||||||||||||||||||
System.out.println("Hello! I'm duke.Duke\n" + "What can I do for you?"); | ||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. You may import the duke package inside, and you not really have to specify package all the time. |
||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
public void goodbye() { | ||||||||||||||||||||||||||||||||||||||||||||||
System.out.println("Bye. Hope to see you again soon!"); | ||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
public void addTaskToList(Task task, int size) { | ||||||||||||||||||||||||||||||||||||||||||||||
String taskToString = task.toString(); | ||||||||||||||||||||||||||||||||||||||||||||||
System.out.println("Got it. I've added this task: \n" + taskToString | ||||||||||||||||||||||||||||||||||||||||||||||
+ "\nNow you have " + size + " tasks in the list."); | ||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
public void removeTaskFromList(Task task, int size) { | ||||||||||||||||||||||||||||||||||||||||||||||
String taskToString = task.toString(); | ||||||||||||||||||||||||||||||||||||||||||||||
System.out.println("Noted. I've removed this task: \n" + | ||||||||||||||||||||||||||||||||||||||||||||||
taskToString | ||||||||||||||||||||||||||||||||||||||||||||||
+ "\nNow you have " + size + " tasks in the list."); | ||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It's possible to just use
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
public void printTaskList(TaskList taskList) { | ||||||||||||||||||||||||||||||||||||||||||||||
if (taskList.getSize() == 0) { | ||||||||||||||||||||||||||||||||||||||||||||||
System.out.println("There are currently no tasks in your list."); | ||||||||||||||||||||||||||||||||||||||||||||||
} else { | ||||||||||||||||||||||||||||||||||||||||||||||
System.out.println("Here are the tasks in your list:"); | ||||||||||||||||||||||||||||||||||||||||||||||
for (int i = 0; i < taskList.getSize(); i++) { | ||||||||||||||||||||||||||||||||||||||||||||||
System.out.println((i + 1) + "." + taskList.getTask(i).toString()); | ||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
public String readCommand() { | ||||||||||||||||||||||||||||||||||||||||||||||
return sc.nextLine(); | ||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
public void showError(String e) { | ||||||||||||||||||||||||||||||||||||||||||||||
System.out.println(e); | ||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
public void showLine() { | ||||||||||||||||||||||||||||||||||||||||||||||
System.out.println("___________________"); | ||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
} |
Original file line number | Diff line number | Diff line change | ||||||||
---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,10 @@ | ||||||||||
package duke.command; | ||||||||||
import duke.task.TaskList; | ||||||||||
import duke.Ui; | ||||||||||
import duke.Storage; | ||||||||||
import duke.DukeException; | ||||||||||
|
||||||||||
public abstract class Command { | ||||||||||
public abstract void execute(TaskList ls, Ui ui, Storage storage) throws DukeException; | ||||||||||
public abstract boolean isExit(); | ||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Since all but one of the commands have
Suggested change
|
||||||||||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
package duke.command; | ||
import duke.Ui; | ||
import duke.Storage; | ||
import duke.DukeException; | ||
import duke.task.TaskList; | ||
import duke.task.Deadline; | ||
|
||
public class DeadlineCommand extends Command { | ||
|
||
private String input; | ||
private String taskDesc; | ||
private String deadline; | ||
|
||
public DeadlineCommand(String input) { | ||
this.input = input; | ||
this.taskDesc = input.replaceFirst("^deadline", "").split(" /")[0]; | ||
if (input.contains("/by")) { | ||
this.deadline = input.substring(input.indexOf("/by") + 4); | ||
} | ||
} | ||
|
||
@Override | ||
public void execute(TaskList ls, Ui ui, Storage storage) throws DukeException { | ||
Deadline dTask = new Deadline(taskDesc, deadline); | ||
ls.addTask(dTask); | ||
storage.rewriteFile(ls); | ||
} | ||
|
||
@Override | ||
public boolean isExit() { | ||
return false; | ||
} | ||
Comment on lines
+49
to
+52
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. After the non-abstract |
||
|
||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
package duke.command; | ||
import duke.Ui; | ||
import duke.Storage; | ||
import duke.DukeException; | ||
import duke.task.TaskList; | ||
import duke.task.Task; | ||
|
||
public class DeleteCommand extends Command { | ||
private String input; | ||
private int taskNumber; | ||
|
||
public DeleteCommand(String input) throws DukeException { | ||
this.input = input; | ||
try { | ||
if (input.equals("delete") || input.equals("delete ")) { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This can be avoided if the |
||
throw new DukeException("A number must follow after the command word 'delete'."); | ||
} | ||
this.taskNumber = Integer.valueOf(input.substring(7)) - 1; | ||
} catch (NumberFormatException e) { | ||
throw new DukeException("OOPS! Please enter a valid task number."); | ||
} | ||
} | ||
|
||
@Override | ||
public void execute(TaskList ls, Ui ui, Storage storage) throws DukeException { | ||
if (taskNumber < 0 || taskNumber >= ls.getSize()) { | ||
throw new DukeException("Item does not exist in the list."); | ||
} | ||
ls.removeTask(taskNumber); | ||
storage.rewriteFile(ls); | ||
} | ||
|
||
@Override | ||
public boolean isExit() { | ||
return false; | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
package duke.command; | ||
import duke.Ui; | ||
import duke.Storage; | ||
import duke.DukeException; | ||
import duke.task.TaskList; | ||
import duke.task.Task; | ||
|
||
public class DoneCommand extends Command { | ||
private String input; | ||
private int taskNumber; | ||
|
||
public DoneCommand(String input) throws DukeException { | ||
this.input = input; | ||
try { | ||
if (input.equals("done") || input.equals("done ")) { | ||
throw new DukeException("A number must follow after the command word 'done'."); | ||
} | ||
this.taskNumber = Integer.valueOf(input.substring(5)) - 1;; | ||
} catch (NumberFormatException e) { | ||
throw new DukeException("OOPS! Please enter a valid task number."); | ||
} | ||
} | ||
|
||
@Override | ||
public void execute(TaskList ls, Ui ui, Storage storage) throws DukeException { | ||
if (taskNumber < 0 || taskNumber >= ls.getSize()) { | ||
throw new DukeException("Item does not exist in the list."); | ||
} | ||
Task task = ls.getTask(taskNumber); | ||
task.markAsDone(); | ||
storage.rewriteFile(ls); | ||
} | ||
|
||
@Override | ||
public boolean isExit() { | ||
return false; | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Would be better to specifically list all
duke.command
imports here instead of using wildcard imports