From 5bacb5a3a5443197f64247cc7472b899b32bf813 Mon Sep 17 00:00:00 2001 From: abhigyanzemoso Date: Tue, 11 Apr 2023 13:22:56 +0530 Subject: [PATCH 1/2] solid-principle-implementation-of-kata --- java/.idea/.gitignore | 3 + java/.idea/compiler.xml | 13 + java/.idea/jarRepositories.xml | 20 ++ java/.idea/misc.xml | 12 + java/.idea/runConfigurations.xml | 10 + java/.idea/sonarlint/issuestore/index.pb | 0 java/.idea/uiDesigner.xml | 124 +++++++++ java/.idea/vcs.xml | 6 + .../com/codurance/training/tasks/Helper.java | 11 + .../com/codurance/training/tasks/MainApp.java | 26 ++ .../com/codurance/training/tasks/Task.java | 26 +- .../codurance/training/tasks/TaskList.java | 249 +++++++++-------- .../training/tasks/interfaces/AddProject.java | 5 + .../training/tasks/interfaces/AddService.java | 5 + .../training/tasks/interfaces/AddTask.java | 7 + .../training/tasks/interfaces/CheckTask.java | 7 + .../training/tasks/interfaces/DeleteTask.java | 5 + .../tasks/interfaces/ExecuteProject.java | 5 + .../tasks/interfaces/IHelpService.java | 5 + .../training/tasks/interfaces/RunProject.java | 5 + .../tasks/interfaces/ShowProject.java | 5 + .../training/tasks/interfaces/TodayTasks.java | 5 + .../tasks/interfaces/ViewProject.java | 5 + .../tasks/services/AddServiceImpl.java | 83 ++++++ .../training/tasks/services/CheckService.java | 42 +++ .../tasks/services/DeleteTaskService.java | 30 +++ .../tasks/services/ExecutionService.java | 86 ++++++ .../training/tasks/services/HelpService.java | 27 ++ .../tasks/services/RunProjectService.java | 4 + .../training/tasks/services/RunService.java | 45 ++++ .../training/tasks/services/ShowService.java | 30 +++ .../tasks/services/TaskViewByDate.java | 33 +++ .../tasks/services/TaskViewByDeadline.java | 33 +++ .../tasks/services/TaskViewByProject.java | 29 ++ .../tasks/services/TodayTaskImpl.java | 33 +++ .../training/tasks/ApplicationTest.java | 254 +++++++++--------- 36 files changed, 1032 insertions(+), 256 deletions(-) create mode 100644 java/.idea/.gitignore create mode 100644 java/.idea/compiler.xml create mode 100644 java/.idea/jarRepositories.xml create mode 100644 java/.idea/misc.xml create mode 100644 java/.idea/runConfigurations.xml create mode 100644 java/.idea/sonarlint/issuestore/index.pb create mode 100644 java/.idea/uiDesigner.xml create mode 100644 java/.idea/vcs.xml create mode 100644 java/src/main/java/com/codurance/training/tasks/Helper.java create mode 100644 java/src/main/java/com/codurance/training/tasks/MainApp.java create mode 100644 java/src/main/java/com/codurance/training/tasks/interfaces/AddProject.java create mode 100644 java/src/main/java/com/codurance/training/tasks/interfaces/AddService.java create mode 100644 java/src/main/java/com/codurance/training/tasks/interfaces/AddTask.java create mode 100644 java/src/main/java/com/codurance/training/tasks/interfaces/CheckTask.java create mode 100644 java/src/main/java/com/codurance/training/tasks/interfaces/DeleteTask.java create mode 100644 java/src/main/java/com/codurance/training/tasks/interfaces/ExecuteProject.java create mode 100644 java/src/main/java/com/codurance/training/tasks/interfaces/IHelpService.java create mode 100644 java/src/main/java/com/codurance/training/tasks/interfaces/RunProject.java create mode 100644 java/src/main/java/com/codurance/training/tasks/interfaces/ShowProject.java create mode 100644 java/src/main/java/com/codurance/training/tasks/interfaces/TodayTasks.java create mode 100644 java/src/main/java/com/codurance/training/tasks/interfaces/ViewProject.java create mode 100644 java/src/main/java/com/codurance/training/tasks/services/AddServiceImpl.java create mode 100644 java/src/main/java/com/codurance/training/tasks/services/CheckService.java create mode 100644 java/src/main/java/com/codurance/training/tasks/services/DeleteTaskService.java create mode 100644 java/src/main/java/com/codurance/training/tasks/services/ExecutionService.java create mode 100644 java/src/main/java/com/codurance/training/tasks/services/HelpService.java create mode 100644 java/src/main/java/com/codurance/training/tasks/services/RunProjectService.java create mode 100644 java/src/main/java/com/codurance/training/tasks/services/RunService.java create mode 100644 java/src/main/java/com/codurance/training/tasks/services/ShowService.java create mode 100644 java/src/main/java/com/codurance/training/tasks/services/TaskViewByDate.java create mode 100644 java/src/main/java/com/codurance/training/tasks/services/TaskViewByDeadline.java create mode 100644 java/src/main/java/com/codurance/training/tasks/services/TaskViewByProject.java create mode 100644 java/src/main/java/com/codurance/training/tasks/services/TodayTaskImpl.java diff --git a/java/.idea/.gitignore b/java/.idea/.gitignore new file mode 100644 index 00000000..26d33521 --- /dev/null +++ b/java/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/java/.idea/compiler.xml b/java/.idea/compiler.xml new file mode 100644 index 00000000..8d4690a5 --- /dev/null +++ b/java/.idea/compiler.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/java/.idea/jarRepositories.xml b/java/.idea/jarRepositories.xml new file mode 100644 index 00000000..712ab9d9 --- /dev/null +++ b/java/.idea/jarRepositories.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/java/.idea/misc.xml b/java/.idea/misc.xml new file mode 100644 index 00000000..5372e920 --- /dev/null +++ b/java/.idea/misc.xml @@ -0,0 +1,12 @@ + + + + + + + + \ No newline at end of file diff --git a/java/.idea/runConfigurations.xml b/java/.idea/runConfigurations.xml new file mode 100644 index 00000000..797acea5 --- /dev/null +++ b/java/.idea/runConfigurations.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/java/.idea/sonarlint/issuestore/index.pb b/java/.idea/sonarlint/issuestore/index.pb new file mode 100644 index 00000000..e69de29b diff --git a/java/.idea/uiDesigner.xml b/java/.idea/uiDesigner.xml new file mode 100644 index 00000000..e96534fb --- /dev/null +++ b/java/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/java/.idea/vcs.xml b/java/.idea/vcs.xml new file mode 100644 index 00000000..6c0b8635 --- /dev/null +++ b/java/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/java/src/main/java/com/codurance/training/tasks/Helper.java b/java/src/main/java/com/codurance/training/tasks/Helper.java new file mode 100644 index 00000000..f3481ad7 --- /dev/null +++ b/java/src/main/java/com/codurance/training/tasks/Helper.java @@ -0,0 +1,11 @@ +package com.codurance.training.tasks; + +import java.text.SimpleDateFormat; +import java.util.Date; + +public final class Helper { + public static String formatDate(Date date) { + SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy"); + return formatter.format(date); + } +} diff --git a/java/src/main/java/com/codurance/training/tasks/MainApp.java b/java/src/main/java/com/codurance/training/tasks/MainApp.java new file mode 100644 index 00000000..ec6ed78a --- /dev/null +++ b/java/src/main/java/com/codurance/training/tasks/MainApp.java @@ -0,0 +1,26 @@ +package com.codurance.training.tasks; + +import com.codurance.training.tasks.services.RunService; + +import java.io.*; +import java.util.*; + +public class MainApp { + private final Map> tasks; + private final BufferedReader in; + private final PrintWriter out; + + public MainApp(Map> tasks, BufferedReader reader, PrintWriter writer) { + this.tasks = tasks; + this.in = reader; + this.out = writer; + new RunService(this.tasks, this.in, this.out).run(); + } + + public static void main(String[] args) { + BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); + PrintWriter out = new PrintWriter(System.out); + Map> tasks = new HashMap<>(); + new MainApp(tasks, in, out); + } +} diff --git a/java/src/main/java/com/codurance/training/tasks/Task.java b/java/src/main/java/com/codurance/training/tasks/Task.java index 31b39c98..4cdff0e6 100644 --- a/java/src/main/java/com/codurance/training/tasks/Task.java +++ b/java/src/main/java/com/codurance/training/tasks/Task.java @@ -1,17 +1,37 @@ package com.codurance.training.tasks; +import java.util.Date; + public final class Task { - private final long id; + private final String id; + private Date deadline; + private final Date createdAt; + + public Date getDeadline() { + return deadline; + } + + public Task setDeadline(Date deadline) { + this.deadline = deadline; + return this; + } + + public Date getCreatedAt() { + return createdAt; + } + private final String description; private boolean done; - public Task(long id, String description, boolean done) { + public Task(String id, String description, boolean done, Date createdAt, Date deadline) { this.id = id; this.description = description; this.done = done; + this.createdAt = createdAt; + this.deadline = deadline; } - public long getId() { + public String getId() { return id; } diff --git a/java/src/main/java/com/codurance/training/tasks/TaskList.java b/java/src/main/java/com/codurance/training/tasks/TaskList.java index 9a4a8202..2dfec56d 100644 --- a/java/src/main/java/com/codurance/training/tasks/TaskList.java +++ b/java/src/main/java/com/codurance/training/tasks/TaskList.java @@ -1,149 +1,146 @@ package com.codurance.training.tasks; import java.io.BufferedReader; -import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; -import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -public final class TaskList implements Runnable { +public final class TaskList { private static final String QUIT = "quit"; private final Map> tasks = new LinkedHashMap<>(); private final BufferedReader in; private final PrintWriter out; - private long lastId = 0; - - public static void main(String[] args) throws Exception { - BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); - PrintWriter out = new PrintWriter(System.out); - new TaskList(in, out).run(); - } - public TaskList(BufferedReader reader, PrintWriter writer) { this.in = reader; this.out = writer; } - public void run() { - while (true) { - out.print("> "); - out.flush(); - String command; - try { - command = in.readLine(); - } catch (IOException e) { - throw new RuntimeException(e); - } - if (command.equals(QUIT)) { - break; - } - execute(command); - } - } - - private void execute(String commandLine) { - String[] commandRest = commandLine.split(" ", 2); - String command = commandRest[0]; - switch (command) { - case "show": - show(); - break; - case "add": - add(commandRest[1]); - break; - case "check": - check(commandRest[1]); - break; - case "uncheck": - uncheck(commandRest[1]); - break; - case "help": - help(); - break; - default: - error(command); - break; - } - } - - private void show() { - for (Map.Entry> project : tasks.entrySet()) { - out.println(project.getKey()); - for (Task task : project.getValue()) { - out.printf(" [%c] %d: %s%n", (task.isDone() ? 'x' : ' '), task.getId(), task.getDescription()); - } - out.println(); - } - } - - private void add(String commandLine) { - String[] subcommandRest = commandLine.split(" ", 2); - String subcommand = subcommandRest[0]; - if (subcommand.equals("project")) { - addProject(subcommandRest[1]); - } else if (subcommand.equals("task")) { - String[] projectTask = subcommandRest[1].split(" ", 2); - addTask(projectTask[0], projectTask[1]); - } - } - - private void addProject(String name) { - tasks.put(name, new ArrayList()); - } - - private void addTask(String project, String description) { - List projectTasks = tasks.get(project); - if (projectTasks == null) { - out.printf("Could not find a project with the name \"%s\".", project); - out.println(); - return; - } - projectTasks.add(new Task(nextId(), description, false)); - } - - private void check(String idString) { - setDone(idString, true); - } - - private void uncheck(String idString) { - setDone(idString, false); - } - - private void setDone(String idString, boolean done) { - int id = Integer.parseInt(idString); - for (Map.Entry> project : tasks.entrySet()) { - for (Task task : project.getValue()) { - if (task.getId() == id) { - task.setDone(done); - return; - } - } - } - out.printf("Could not find a task with an ID of %d.", id); - out.println(); - } - - private void help() { - out.println("Commands:"); - out.println(" show"); - out.println(" add project "); - out.println(" add task "); - out.println(" check "); - out.println(" uncheck "); - out.println(); - } - - private void error(String command) { - out.printf("I don't know what the command \"%s\" is.", command); - out.println(); + public static void main(String[] args) throws Exception { + BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); + PrintWriter out = new PrintWriter(System.out); + new TaskList(in,out); } - private long nextId() { - return ++lastId; - } +// +// public void run() { +// while (true) { +// out.print("> "); +// out.flush(); +// String command; +// try { +// command = in.readLine(); +// } catch (IOException e) { +// throw new RuntimeException(e); +// } +// if (command.equals(QUIT)) { +// break; +// } +// execute(command); +// } +// } +// +// private void execute(String commandLine) { +// String[] commandRest = commandLine.split(" ", 2); +// String command = commandRest[0]; +// switch (command) { +// case "show": +// show(); +// break; +// case "add": +// add(commandRest[1]); +// break; +// case "check": +// check(commandRest[1]); +// break; +// case "uncheck": +// uncheck(commandRest[1]); +// break; +// case "help": +// help(); +// break; +// default: +// error(command); +// break; +// } +// } +// +// private void show() { +// for (Map.Entry> project : tasks.entrySet()) { +// out.println(project.getKey()); +// for (Task task : project.getValue()) { +// out.printf(" [%c] %d: %s%n", (task.isDone() ? 'x' : ' '), task.getId(), task.getDescription()); +// } +// out.println(); +// } +// } +// +// private void add(String commandLine) { +// String[] subcommandRest = commandLine.split(" ", 2); +// String subcommand = subcommandRest[0]; +// if (subcommand.equals("project")) { +// addProject(subcommandRest[1]); +// } else if (subcommand.equals("task")) { +// String[] projectTask = subcommandRest[1].split(" ", 2); +// addTask(projectTask[0], projectTask[1]); +// } +// } +// +// private void addProject(String name) { +// tasks.put(name, new ArrayList()); +// } +// +// private void addTask(String project, String description) { +// List projectTasks = tasks.get(project); +// if (projectTasks == null) { +// out.printf("Could not find a project with the name \"%s\".", project); +// out.println(); +// return; +// } +// projectTasks.add(new Task(nextId(), description, false)); +// } +// +// private void check(String idString) { +// setDone(idString, true); +// } +// +// private void uncheck(String idString) { +// setDone(idString, false); +// } +// +// private void setDone(String idString, boolean done) { +// int id = Integer.parseInt(idString); +// for (Map.Entry> project : tasks.entrySet()) { +// for (Task task : project.getValue()) { +// if (task.getId() == id) { +// task.setDone(done); +// return; +// } +// } +// } +// out.printf("Could not find a task with an ID of %d.", id); +// out.println(); +// } +// +// private void help() { +// out.println("Commands:"); +// out.println(" show"); +// out.println(" add project "); +// out.println(" add task "); +// out.println(" check "); +// out.println(" uncheck "); +// out.println(); +// } +// +// private void error(String command) { +// out.printf("I don't know what the command \"%s\" is.", command); +// out.println(); +// } +// +// private long nextId() { +// return ++lastId; +// } } diff --git a/java/src/main/java/com/codurance/training/tasks/interfaces/AddProject.java b/java/src/main/java/com/codurance/training/tasks/interfaces/AddProject.java new file mode 100644 index 00000000..81e5037c --- /dev/null +++ b/java/src/main/java/com/codurance/training/tasks/interfaces/AddProject.java @@ -0,0 +1,5 @@ +package com.codurance.training.tasks.interfaces; + +public interface AddProject { + void addProject(String name); +} diff --git a/java/src/main/java/com/codurance/training/tasks/interfaces/AddService.java b/java/src/main/java/com/codurance/training/tasks/interfaces/AddService.java new file mode 100644 index 00000000..b3cb18eb --- /dev/null +++ b/java/src/main/java/com/codurance/training/tasks/interfaces/AddService.java @@ -0,0 +1,5 @@ +package com.codurance.training.tasks.interfaces; + +public interface AddService { + void add(String command); +} diff --git a/java/src/main/java/com/codurance/training/tasks/interfaces/AddTask.java b/java/src/main/java/com/codurance/training/tasks/interfaces/AddTask.java new file mode 100644 index 00000000..de2a5e52 --- /dev/null +++ b/java/src/main/java/com/codurance/training/tasks/interfaces/AddTask.java @@ -0,0 +1,7 @@ +package com.codurance.training.tasks.interfaces; + +import java.util.Date; + +public interface AddTask { + void addTask(String taskId, String projectId, String description, Date deadline); +} diff --git a/java/src/main/java/com/codurance/training/tasks/interfaces/CheckTask.java b/java/src/main/java/com/codurance/training/tasks/interfaces/CheckTask.java new file mode 100644 index 00000000..d59f07aa --- /dev/null +++ b/java/src/main/java/com/codurance/training/tasks/interfaces/CheckTask.java @@ -0,0 +1,7 @@ +package com.codurance.training.tasks.interfaces; + +public interface CheckTask { + void check(String id); + + void uncheck(String id); +} diff --git a/java/src/main/java/com/codurance/training/tasks/interfaces/DeleteTask.java b/java/src/main/java/com/codurance/training/tasks/interfaces/DeleteTask.java new file mode 100644 index 00000000..adc743bf --- /dev/null +++ b/java/src/main/java/com/codurance/training/tasks/interfaces/DeleteTask.java @@ -0,0 +1,5 @@ +package com.codurance.training.tasks.interfaces; + +public interface DeleteTask { + void deleteTask(String id) ; +} diff --git a/java/src/main/java/com/codurance/training/tasks/interfaces/ExecuteProject.java b/java/src/main/java/com/codurance/training/tasks/interfaces/ExecuteProject.java new file mode 100644 index 00000000..44d1ef87 --- /dev/null +++ b/java/src/main/java/com/codurance/training/tasks/interfaces/ExecuteProject.java @@ -0,0 +1,5 @@ +package com.codurance.training.tasks.interfaces; + +public interface ExecuteProject { + void execute(String commandValue); +} diff --git a/java/src/main/java/com/codurance/training/tasks/interfaces/IHelpService.java b/java/src/main/java/com/codurance/training/tasks/interfaces/IHelpService.java new file mode 100644 index 00000000..c32b5ed3 --- /dev/null +++ b/java/src/main/java/com/codurance/training/tasks/interfaces/IHelpService.java @@ -0,0 +1,5 @@ +package com.codurance.training.tasks.interfaces; + +public interface IHelpService { + void getHelp(); +} diff --git a/java/src/main/java/com/codurance/training/tasks/interfaces/RunProject.java b/java/src/main/java/com/codurance/training/tasks/interfaces/RunProject.java new file mode 100644 index 00000000..21c1235a --- /dev/null +++ b/java/src/main/java/com/codurance/training/tasks/interfaces/RunProject.java @@ -0,0 +1,5 @@ +package com.codurance.training.tasks.interfaces; + +public interface RunProject { + void run(); +} diff --git a/java/src/main/java/com/codurance/training/tasks/interfaces/ShowProject.java b/java/src/main/java/com/codurance/training/tasks/interfaces/ShowProject.java new file mode 100644 index 00000000..37c597d4 --- /dev/null +++ b/java/src/main/java/com/codurance/training/tasks/interfaces/ShowProject.java @@ -0,0 +1,5 @@ +package com.codurance.training.tasks.interfaces; + +public interface ShowProject { + void show(); +} diff --git a/java/src/main/java/com/codurance/training/tasks/interfaces/TodayTasks.java b/java/src/main/java/com/codurance/training/tasks/interfaces/TodayTasks.java new file mode 100644 index 00000000..5a46d5a5 --- /dev/null +++ b/java/src/main/java/com/codurance/training/tasks/interfaces/TodayTasks.java @@ -0,0 +1,5 @@ +package com.codurance.training.tasks.interfaces; + +public interface TodayTasks { + void displayTodayDueTasks(); +} diff --git a/java/src/main/java/com/codurance/training/tasks/interfaces/ViewProject.java b/java/src/main/java/com/codurance/training/tasks/interfaces/ViewProject.java new file mode 100644 index 00000000..b7aa3a87 --- /dev/null +++ b/java/src/main/java/com/codurance/training/tasks/interfaces/ViewProject.java @@ -0,0 +1,5 @@ +package com.codurance.training.tasks.interfaces; + +public interface ViewProject { + void view(); +} diff --git a/java/src/main/java/com/codurance/training/tasks/services/AddServiceImpl.java b/java/src/main/java/com/codurance/training/tasks/services/AddServiceImpl.java new file mode 100644 index 00000000..64a7e16c --- /dev/null +++ b/java/src/main/java/com/codurance/training/tasks/services/AddServiceImpl.java @@ -0,0 +1,83 @@ +package com.codurance.training.tasks.services; + +import com.codurance.training.tasks.Task; +import com.codurance.training.tasks.interfaces.AddProject; +import com.codurance.training.tasks.interfaces.AddService; +import com.codurance.training.tasks.interfaces.AddTask; + +import java.io.PrintWriter; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.LinkedHashMap; +import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class AddServiceImpl implements AddProject, AddService, AddTask { + private Map> tasks = new LinkedHashMap<>(); + private PrintWriter out; + private long lastId = 0; + + public AddServiceImpl(Map> tasks, PrintWriter out) { + this.tasks = tasks; + this.out = out; + } + + private long getNextId() { + return ++lastId; + } + + private boolean testValidation(String id) { + if (id.contains(" ")) + return false; + Pattern pattern = Pattern.compile("[^a-zA-Z0-9]"); + Matcher matcher = pattern.matcher(id); + return !(matcher.find()); + } + + + @Override + public void addProject(String name) { + tasks.put(name, new ArrayList<>()); // Adding new project in the map + } + + @Override + public void add(String command) { + String[] subcommandRest = command.split(" ", 2); + String subcommand = subcommandRest[0]; + if (subcommand.equals("project")) { + addProject(subcommandRest[1]); + } else if (subcommand.equals("task")) { + String[] projectTask = subcommandRest[1].split(" "); + if (projectTask.length == 4) { + try { + addTask(projectTask[1], projectTask[0], projectTask[2], new SimpleDateFormat("dd-MM-yyyy").parse(projectTask[3])); + } catch (RuntimeException | ParseException e) { + throw new RuntimeException(e); + } + } else { + addTask(projectTask[1], projectTask[0], projectTask[2], null); + } + } + + } + + @Override + public void addTask(String taskId, String projectName, String description, Date deadline) { + List projectTasks = tasks.get(projectName); + if (projectTasks == null) { + out.printf("Could not find a project with the name \"%s\".", projectName); + out.println(); + return; + } + if (testValidation(taskId)) { + projectTasks.add(new Task(taskId, description, false, deadline, new Date())); + } else { + out.printf("Id provided does not match the criteria :", taskId); + out.printf("Will use auto increment logic to add respective task...", String.valueOf(getNextId())); + projectTasks.add(new Task(String.valueOf(getNextId()), description, false, deadline, new Date())); + } + + } +} diff --git a/java/src/main/java/com/codurance/training/tasks/services/CheckService.java b/java/src/main/java/com/codurance/training/tasks/services/CheckService.java new file mode 100644 index 00000000..0b28e76f --- /dev/null +++ b/java/src/main/java/com/codurance/training/tasks/services/CheckService.java @@ -0,0 +1,42 @@ +package com.codurance.training.tasks.services; + +import com.codurance.training.tasks.Task; +import com.codurance.training.tasks.interfaces.CheckTask; + +import java.io.PrintWriter; +import java.util.*; + +public class CheckService implements CheckTask { + + private Map> tasks = new LinkedHashMap<>(); + private PrintWriter out; + + public CheckService(Map> tasks, PrintWriter out) { + this.tasks = tasks; + this.out = out; + } + + @Override + public void check(String id) { + setDone(id, true); + } + + @Override + public void uncheck(String id) { + setDone(id, false); + } + + private void setDone(String idString, boolean done) { + int id = Integer.parseInt(idString); + for (Map.Entry> project : tasks.entrySet()) { + for (Task task : project.getValue()) { + if (task.getId().equals(id)) { + task.setDone(done); + return; + } + } + } + out.printf("No task exists with this ID : %d.", id); +// out.println(); + } +} diff --git a/java/src/main/java/com/codurance/training/tasks/services/DeleteTaskService.java b/java/src/main/java/com/codurance/training/tasks/services/DeleteTaskService.java new file mode 100644 index 00000000..66073b74 --- /dev/null +++ b/java/src/main/java/com/codurance/training/tasks/services/DeleteTaskService.java @@ -0,0 +1,30 @@ +package com.codurance.training.tasks.services; + +import com.codurance.training.tasks.Task; +import com.codurance.training.tasks.interfaces.DeleteTask; + +import java.io.PrintWriter; +import java.util.*; + +public class DeleteTaskService implements DeleteTask { + + private Map> tasks; + private PrintWriter out; + + public DeleteTaskService(Map> tasks, PrintWriter out) { + this.tasks = tasks; + this.out = out; + } + + @Override + public void deleteTask(String id) { + for (Map.Entry> project : tasks.entrySet()) { + if (project.getValue().removeIf(task -> task.getId().equals(id))) { + out.printf("Deleted task with id: %s", id); + } else { + out.printf("No task found with this id => %s", id); + } + } + out.println(); + } +} diff --git a/java/src/main/java/com/codurance/training/tasks/services/ExecutionService.java b/java/src/main/java/com/codurance/training/tasks/services/ExecutionService.java new file mode 100644 index 00000000..560dcc94 --- /dev/null +++ b/java/src/main/java/com/codurance/training/tasks/services/ExecutionService.java @@ -0,0 +1,86 @@ +package com.codurance.training.tasks.services; + +import com.codurance.training.tasks.Task; +import com.codurance.training.tasks.interfaces.*; + +import java.io.BufferedReader; +import java.io.PrintWriter; +import java.util.*; + +public class ExecutionService implements ExecuteProject { + private Map> tasks; + private BufferedReader in; + private PrintWriter out; + private AddService addingService; + private CheckTask checkService; + private ShowProject showService; + private IHelpService helpService; + private TodayTasks todayDueTasks; + private DeleteTask deletingService; + private ViewProject taskViewServiceByDate; + private ViewProject taskViewServiceByDeadline; + private ViewProject taskViewServiceByProject; + + public ExecutionService(Map> tasks, BufferedReader in, PrintWriter out) { + this.tasks = tasks; + this.in = in; + this.out = out; + addingService = new AddServiceImpl(tasks, this.out); + checkService = new CheckService(tasks, this.out); + showService = new ShowService(tasks, this.out); + helpService = new HelpService(this.out); + todayDueTasks = new TodayTaskImpl(tasks, this.out); + deletingService = new DeleteTaskService(tasks, this.out); + taskViewServiceByDate = new TaskViewByDate(tasks, this.out); + taskViewServiceByDeadline = new TaskViewByDeadline(tasks, this.out); + taskViewServiceByProject = new TaskViewByProject(tasks, this.out); + } + + @Override + public void execute(String commandValue) { + String[] commandRest = commandValue.split(" ", 2); + String command = commandRest[0]; + switch (command) { + case "show": + showService.show(); + break; + case "add": + addingService.add(commandRest[1]); + break; + case "check": + checkService.check(commandRest[1]); + break; + case "uncheck": + checkService.uncheck(commandRest[1]); + break; + case "today": + todayDueTasks.displayTodayDueTasks(); + break; + case "delete": + deletingService.deleteTask(commandRest[1]); + break; + case "view": + String viewBy = commandRest[1]; + switch (viewBy) { + case "byDate": + taskViewServiceByDate.view(); + break; + case "byDeadline": + taskViewServiceByDeadline.view(); + break; + case "byProject": + taskViewServiceByProject.view(); + break; + } + break; + case "help": + helpService.getHelp(); + break; + default: + out.printf("Invalid command provided as => ", command); + out.println(); + break; + } + } + +} diff --git a/java/src/main/java/com/codurance/training/tasks/services/HelpService.java b/java/src/main/java/com/codurance/training/tasks/services/HelpService.java new file mode 100644 index 00000000..3a61a5bb --- /dev/null +++ b/java/src/main/java/com/codurance/training/tasks/services/HelpService.java @@ -0,0 +1,27 @@ +package com.codurance.training.tasks.services; + +import com.codurance.training.tasks.interfaces.IHelpService; + +import java.io.PrintWriter; + +public class HelpService implements IHelpService { + private PrintWriter out; + + public HelpService(PrintWriter out) { + this.out = out; + } + + @Override + public void getHelp() { + out.println("Commands:"); + out.println(" show"); + out.println(" add project "); + out.println(" add task [Optional]"); + out.println(" check "); + out.println(" uncheck "); + out.println(" today -> to view today's due tasks"); + out.println(" delete "); + out.println(" view <[byDate|byDeadline|byProject]>"); + out.println(); + } +} diff --git a/java/src/main/java/com/codurance/training/tasks/services/RunProjectService.java b/java/src/main/java/com/codurance/training/tasks/services/RunProjectService.java new file mode 100644 index 00000000..030a914c --- /dev/null +++ b/java/src/main/java/com/codurance/training/tasks/services/RunProjectService.java @@ -0,0 +1,4 @@ +package com.codurance.training.tasks.services; + +public class RunProjectService { +} diff --git a/java/src/main/java/com/codurance/training/tasks/services/RunService.java b/java/src/main/java/com/codurance/training/tasks/services/RunService.java new file mode 100644 index 00000000..a807c66e --- /dev/null +++ b/java/src/main/java/com/codurance/training/tasks/services/RunService.java @@ -0,0 +1,45 @@ +package com.codurance.training.tasks.services; + +import com.codurance.training.tasks.Task; +import com.codurance.training.tasks.interfaces.ExecuteProject; +import com.codurance.training.tasks.interfaces.RunProject; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.PrintWriter; +import java.util.*; + +public class RunService implements Runnable, RunProject { + private static final String QUIT = "quit"; + + private Map> tasks; + private BufferedReader in; + private PrintWriter out; + + private ExecuteProject executeTaskService; + + public RunService(Map> tasks, BufferedReader in, PrintWriter out) { + this.tasks = tasks; + this.in = in; + this.out = out; + executeTaskService = new ExecutionService(tasks, this.in, this.out); + } + + @Override + public void run() { + while (true) { + out.print("> "); + out.flush(); + String command; + try { + command = in.readLine(); + } catch (RuntimeException | IOException e) { + throw new RuntimeException(e); + } + if (command.equals(QUIT)) { + break; + } + executeTaskService.execute(command); + } + } +} diff --git a/java/src/main/java/com/codurance/training/tasks/services/ShowService.java b/java/src/main/java/com/codurance/training/tasks/services/ShowService.java new file mode 100644 index 00000000..77f08ab9 --- /dev/null +++ b/java/src/main/java/com/codurance/training/tasks/services/ShowService.java @@ -0,0 +1,30 @@ +package com.codurance.training.tasks.services; + +import com.codurance.training.tasks.Task; +import com.codurance.training.tasks.interfaces.ShowProject; + +import java.io.PrintWriter; +import java.util.*; + +public class ShowService implements ShowProject { + private Map> tasks = new LinkedHashMap<>(); + + private PrintWriter out; + + public ShowService(Map> tasks, PrintWriter out) { + this.tasks = tasks; + this.out = out; + } + + @Override + public void show() { + for (Map.Entry> project : tasks.entrySet()) { + out.println(project.getKey()); + for (Task task : project.getValue()) { + out.printf(" [%c] %s: %s, deadline: %s, createdDate:%s%n", (task.isDone() ? 'x' : ' '), task.getId(), task.getDescription(), task.getDeadline(), task.getCreatedAt()); + } + out.println(); + } + } + +} diff --git a/java/src/main/java/com/codurance/training/tasks/services/TaskViewByDate.java b/java/src/main/java/com/codurance/training/tasks/services/TaskViewByDate.java new file mode 100644 index 00000000..4cba2b3d --- /dev/null +++ b/java/src/main/java/com/codurance/training/tasks/services/TaskViewByDate.java @@ -0,0 +1,33 @@ +package com.codurance.training.tasks.services; + +import com.codurance.training.tasks.Helper; +import com.codurance.training.tasks.Task; +import com.codurance.training.tasks.interfaces.ViewProject; + +import java.io.PrintWriter; +import java.util.*; + +public class TaskViewByDate implements ViewProject { + + private Map> tasks; + private PrintWriter out; + + public TaskViewByDate(Map> tasks, PrintWriter out) { + this.tasks = tasks; + this.out = out; + } + + @Override + public void view() { + Comparator compareByDate = Comparator.comparing(p -> Helper.formatDate(p.getCreatedAt())); + for (Map.Entry> project : tasks.entrySet()) { + out.println(project.getKey()); + List newTasks = project.getValue(); + Collections.sort(newTasks, compareByDate); + for (Task task : newTasks) { + out.printf(" [%c] %s: %s, deadline: %s, createdDate:%s%n", (task.isDone() ? 'x' : ' '), task.getId(), task.getDescription(), task.getDeadline(), task.getCreatedAt()); + } + out.println(); + } + } +} diff --git a/java/src/main/java/com/codurance/training/tasks/services/TaskViewByDeadline.java b/java/src/main/java/com/codurance/training/tasks/services/TaskViewByDeadline.java new file mode 100644 index 00000000..9ba9cad9 --- /dev/null +++ b/java/src/main/java/com/codurance/training/tasks/services/TaskViewByDeadline.java @@ -0,0 +1,33 @@ +package com.codurance.training.tasks.services; + +import com.codurance.training.tasks.Helper; +import com.codurance.training.tasks.Task; +import com.codurance.training.tasks.interfaces.ViewProject; + +import java.io.PrintWriter; +import java.util.*; + +public class TaskViewByDeadline implements ViewProject { + private Map> tasks; + private PrintWriter out; + + public TaskViewByDeadline(Map> tasks, PrintWriter out) { + this.tasks = tasks; + this.out = out; + } + + @Override + public void view() { + Comparator compareByDate = Comparator.comparing(p -> Helper.formatDate(p.getDeadline())); + + for (Map.Entry> project : tasks.entrySet()) { + out.println(project.getKey()); + List newTasks = project.getValue(); + Collections.sort(newTasks, compareByDate); + for (Task task : newTasks) { + out.printf(" [%c] %s: %s, deadline: %s, createdDate:%s%n", (task.isDone() ? 'x' : ' '), task.getId(), task.getDescription(), task.getDeadline(), task.getCreatedAt()); + } + out.println(); + } + } +} diff --git a/java/src/main/java/com/codurance/training/tasks/services/TaskViewByProject.java b/java/src/main/java/com/codurance/training/tasks/services/TaskViewByProject.java new file mode 100644 index 00000000..437f3f21 --- /dev/null +++ b/java/src/main/java/com/codurance/training/tasks/services/TaskViewByProject.java @@ -0,0 +1,29 @@ +package com.codurance.training.tasks.services; + +import com.codurance.training.tasks.Task; +import com.codurance.training.tasks.interfaces.ViewProject; + +import java.io.PrintWriter; +import java.util.*; + +public class TaskViewByProject implements ViewProject { + private Map> tasks; + private PrintWriter out; + + public TaskViewByProject(Map> tasks, PrintWriter out) { + this.tasks = tasks; + this.out = out; + } + + @Override + public void view() { + for (Map.Entry> project : tasks.entrySet()) { + out.println(project.getKey()); + for (Task task : project.getValue()) { + out.printf(" [%c] %s: %s, deadline: %s, createdDate:%s%n", (task.isDone() ? 'x' : ' '), task.getId(), task.getDescription(), task.getDeadline(), task.getCreatedAt()); + } + out.println(); + } + } + +} diff --git a/java/src/main/java/com/codurance/training/tasks/services/TodayTaskImpl.java b/java/src/main/java/com/codurance/training/tasks/services/TodayTaskImpl.java new file mode 100644 index 00000000..7e962ca4 --- /dev/null +++ b/java/src/main/java/com/codurance/training/tasks/services/TodayTaskImpl.java @@ -0,0 +1,33 @@ +package com.codurance.training.tasks.services; + +import com.codurance.training.tasks.Helper; +import com.codurance.training.tasks.Task; +import com.codurance.training.tasks.interfaces.TodayTasks; + +import java.io.PrintWriter; +import java.util.*; + +public class TodayTaskImpl implements TodayTasks { + + private Map> tasks; + private PrintWriter out; + + public TodayTaskImpl(Map> tasks, PrintWriter out) { + this.tasks = tasks; + this.out = out; + } + + @Override + public void displayTodayDueTasks() { + Date today = new Date(); + for (Map.Entry> project : tasks.entrySet()) { + out.println(project.getKey()); + for (Task task : project.getValue()) { + if (task.getDeadline() != null && Helper.formatDate(task.getDeadline()).equals(Helper.formatDate(today))) { + out.printf(" [%c] %s: %s, deadline: %s, createdDate:%s%n", (task.isDone() ? 'x' : ' '), task.getId(), task.getDescription(), task.getDeadline(), task.getCreatedAt()); + } + } + out.println(); + } + } +} diff --git a/java/src/test/java/com/codurance/training/tasks/ApplicationTest.java b/java/src/test/java/com/codurance/training/tasks/ApplicationTest.java index eddb925a..e3070651 100644 --- a/java/src/test/java/com/codurance/training/tasks/ApplicationTest.java +++ b/java/src/test/java/com/codurance/training/tasks/ApplicationTest.java @@ -1,127 +1,127 @@ -package com.codurance.training.tasks; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.PipedInputStream; -import java.io.PipedOutputStream; -import java.io.PrintWriter; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -import static java.lang.System.lineSeparator; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.is; - -public final class ApplicationTest { - public static final String PROMPT = "> "; - private final PipedOutputStream inStream = new PipedOutputStream(); - private final PrintWriter inWriter = new PrintWriter(inStream, true); - - private final PipedInputStream outStream = new PipedInputStream(); - private final BufferedReader outReader = new BufferedReader(new InputStreamReader(outStream)); - - private Thread applicationThread; - - public ApplicationTest() throws IOException { - BufferedReader in = new BufferedReader(new InputStreamReader(new PipedInputStream(inStream))); - PrintWriter out = new PrintWriter(new PipedOutputStream(outStream), true); - TaskList taskList = new TaskList(in, out); - applicationThread = new Thread(taskList); - } - - @Before public void - start_the_application() { - applicationThread.start(); - } - - @After public void - kill_the_application() throws IOException, InterruptedException { - if (!stillRunning()) { - return; - } - - Thread.sleep(1000); - if (!stillRunning()) { - return; - } - - applicationThread.interrupt(); - throw new IllegalStateException("The application is still running."); - } - - @Test(timeout = 1000) public void - it_works() throws IOException { - execute("show"); - - execute("add project secrets"); - execute("add task secrets Eat more donuts."); - execute("add task secrets Destroy all humans."); - - execute("show"); - readLines( - "secrets", - " [ ] 1: Eat more donuts.", - " [ ] 2: Destroy all humans.", - "" - ); - - execute("add project training"); - execute("add task training Four Elements of Simple Design"); - execute("add task training SOLID"); - execute("add task training Coupling and Cohesion"); - execute("add task training Primitive Obsession"); - execute("add task training Outside-In TDD"); - execute("add task training Interaction-Driven Design"); - - execute("check 1"); - execute("check 3"); - execute("check 5"); - execute("check 6"); - - execute("show"); - readLines( - "secrets", - " [x] 1: Eat more donuts.", - " [ ] 2: Destroy all humans.", - "", - "training", - " [x] 3: Four Elements of Simple Design", - " [ ] 4: SOLID", - " [x] 5: Coupling and Cohesion", - " [x] 6: Primitive Obsession", - " [ ] 7: Outside-In TDD", - " [ ] 8: Interaction-Driven Design", - "" - ); - - execute("quit"); - } - - private void execute(String command) throws IOException { - read(PROMPT); - write(command); - } - - private void read(String expectedOutput) throws IOException { - int length = expectedOutput.length(); - char[] buffer = new char[length]; - outReader.read(buffer, 0, length); - assertThat(String.valueOf(buffer), is(expectedOutput)); - } - - private void readLines(String... expectedOutput) throws IOException { - for (String line : expectedOutput) { - read(line + lineSeparator()); - } - } - - private void write(String input) { - inWriter.println(input); - } - - private boolean stillRunning() { - return applicationThread != null && applicationThread.isAlive(); - } -} +//package com.codurance.training.tasks; +// +//import java.io.BufferedReader; +//import java.io.IOException; +//import java.io.InputStreamReader; +//import java.io.PipedInputStream; +//import java.io.PipedOutputStream; +//import java.io.PrintWriter; +//import org.junit.After; +//import org.junit.Before; +//import org.junit.Test; +// +//import static java.lang.System.lineSeparator; +//import static org.hamcrest.MatcherAssert.assertThat; +//import static org.hamcrest.Matchers.is; +// +//public final class ApplicationTest { +// public static final String PROMPT = "> "; +// private final PipedOutputStream inStream = new PipedOutputStream(); +// private final PrintWriter inWriter = new PrintWriter(inStream, true); +// +// private final PipedInputStream outStream = new PipedInputStream(); +// private final BufferedReader outReader = new BufferedReader(new InputStreamReader(outStream)); +// +// private Thread applicationThread; +// +// public ApplicationTest() throws IOException { +// BufferedReader in = new BufferedReader(new InputStreamReader(new PipedInputStream(inStream))); +// PrintWriter out = new PrintWriter(new PipedOutputStream(outStream), true); +// TaskList taskList = new TaskList(in, out); +// applicationThread = new Thread(taskList); +// } +// +// @Before public void +// start_the_application() { +// applicationThread.start(); +// } +// +// @After public void +// kill_the_application() throws IOException, InterruptedException { +// if (!stillRunning()) { +// return; +// } +// +// Thread.sleep(1000); +// if (!stillRunning()) { +// return; +// } +// +// applicationThread.interrupt(); +// throw new IllegalStateException("The application is still running."); +// } +// +// @Test(timeout = 1000) public void +// it_works() throws IOException { +// execute("show"); +// +// execute("add project secrets"); +// execute("add task secrets Eat more donuts."); +// execute("add task secrets Destroy all humans."); +// +// execute("show"); +// readLines( +// "secrets", +// " [ ] 1: Eat more donuts.", +// " [ ] 2: Destroy all humans.", +// "" +// ); +// +// execute("add project training"); +// execute("add task training Four Elements of Simple Design"); +// execute("add task training SOLID"); +// execute("add task training Coupling and Cohesion"); +// execute("add task training Primitive Obsession"); +// execute("add task training Outside-In TDD"); +// execute("add task training Interaction-Driven Design"); +// +// execute("check 1"); +// execute("check 3"); +// execute("check 5"); +// execute("check 6"); +// +// execute("show"); +// readLines( +// "secrets", +// " [x] 1: Eat more donuts.", +// " [ ] 2: Destroy all humans.", +// "", +// "training", +// " [x] 3: Four Elements of Simple Design", +// " [ ] 4: SOLID", +// " [x] 5: Coupling and Cohesion", +// " [x] 6: Primitive Obsession", +// " [ ] 7: Outside-In TDD", +// " [ ] 8: Interaction-Driven Design", +// "" +// ); +// +// execute("quit"); +// } +// +// private void execute(String command) throws IOException { +// read(PROMPT); +// write(command); +// } +// +// private void read(String expectedOutput) throws IOException { +// int length = expectedOutput.length(); +// char[] buffer = new char[length]; +// outReader.read(buffer, 0, length); +// assertThat(String.valueOf(buffer), is(expectedOutput)); +// } +// +// private void readLines(String... expectedOutput) throws IOException { +// for (String line : expectedOutput) { +// read(line + lineSeparator()); +// } +// } +// +// private void write(String input) { +// inWriter.println(input); +// } +// +// private boolean stillRunning() { +// return applicationThread != null && applicationThread.isAlive(); +// } +//} From e963308db8bee776045f4577ea80814f51bf01d6 Mon Sep 17 00:00:00 2001 From: abhigyanzemoso Date: Tue, 11 Apr 2023 13:23:33 +0530 Subject: [PATCH 2/2] commenting-old-code --- .../codurance/training/tasks/TaskList.java | 59 ++++++++++--------- 1 file changed, 31 insertions(+), 28 deletions(-) diff --git a/java/src/main/java/com/codurance/training/tasks/TaskList.java b/java/src/main/java/com/codurance/training/tasks/TaskList.java index 2dfec56d..54c3ed79 100644 --- a/java/src/main/java/com/codurance/training/tasks/TaskList.java +++ b/java/src/main/java/com/codurance/training/tasks/TaskList.java @@ -1,30 +1,33 @@ -package com.codurance.training.tasks; - -import java.io.BufferedReader; -import java.io.InputStreamReader; -import java.io.PrintWriter; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - -public final class TaskList { - private static final String QUIT = "quit"; - - private final Map> tasks = new LinkedHashMap<>(); - private final BufferedReader in; - private final PrintWriter out; - - public TaskList(BufferedReader reader, PrintWriter writer) { - this.in = reader; - this.out = writer; - } - - public static void main(String[] args) throws Exception { - BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); - PrintWriter out = new PrintWriter(System.out); - new TaskList(in,out); - } - +//package com.codurance.training.tasks; +// +//import java.io.BufferedReader; +//import java.io.IOException; +//import java.io.InputStreamReader; +//import java.io.PrintWriter; +//import java.util.ArrayList; +//import java.util.LinkedHashMap; +//import java.util.List; +//import java.util.Map; +// +//public final class TaskList implements Runnable { +// private static final String QUIT = "quit"; +// +// private final Map> tasks = new LinkedHashMap<>(); +// private final BufferedReader in; +// private final PrintWriter out; +// +// private long lastId = 0; +// +// public static void main(String[] args) throws Exception { +// BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); +// PrintWriter out = new PrintWriter(System.out); +// new TaskList(in, out).run(); +// } +// +// public TaskList(BufferedReader reader, PrintWriter writer) { +// this.in = reader; +// this.out = writer; +// } // // public void run() { // while (true) { @@ -143,4 +146,4 @@ public static void main(String[] args) throws Exception { // private long nextId() { // return ++lastId; // } -} +//}