diff --git a/java/pom.xml b/java/pom.xml
index 6f4d7681..520c00b0 100644
--- a/java/pom.xml
+++ b/java/pom.xml
@@ -5,8 +5,10 @@
tasks
0.1
+ jar
Task List
+
junit
@@ -20,6 +22,15 @@
2.0.0.0
test
+
+
+
+ org.apache.commons
+ commons-lang3
+ 3.0
+
+
+
diff --git a/java/src/main/java/com/codurance/training/actions/TaskActions.java b/java/src/main/java/com/codurance/training/actions/TaskActions.java
new file mode 100644
index 00000000..774db9ce
--- /dev/null
+++ b/java/src/main/java/com/codurance/training/actions/TaskActions.java
@@ -0,0 +1,31 @@
+package com.codurance.training.actions;
+
+ public interface TaskActions {
+ void show(String commandLine);
+
+ void add(String commnandLine);
+
+ void addProject(String name);
+
+ void setDone(String idString,boolean done);
+
+ void check(String idString);
+
+ void uncheck(String idString);
+
+ void help();
+
+ void error(String command);
+
+ void deadline(String command);
+
+ void today();
+
+ void delete(String command);
+
+ void showByDeadline();
+
+ void showByDate(String s);
+
+ void customize(String s);
+ }
diff --git a/java/src/main/java/com/codurance/training/actions/impl/TaskActionsImpl.java b/java/src/main/java/com/codurance/training/actions/impl/TaskActionsImpl.java
new file mode 100644
index 00000000..770dd5bd
--- /dev/null
+++ b/java/src/main/java/com/codurance/training/actions/impl/TaskActionsImpl.java
@@ -0,0 +1,206 @@
+package com.codurance.training.actions.impl;
+
+import com.codurance.training.actions.TaskActions;
+import com.codurance.training.tasks.Task;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.time.DateUtils;
+
+import java.io.PrintWriter;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.regex.Pattern;
+
+public class TaskActionsImpl implements TaskActions {
+ private final PrintWriter out = new PrintWriter(System.out);
+
+ private static long lastId = 0;
+
+ private static final Map> tasksMap= new LinkedHashMap<>();
+ @Override
+ public void show(String commandLine) {
+ String[] subcommandRest = commandLine.split(" ", 3);
+ if(subcommandRest[1].equals("project")) {
+ for (Map.Entry> project : tasksMap.entrySet()) {
+ out.println(project.getKey());
+ for (Task task : project.getValue()) {
+ // out.printf(" [%c] %d: %s%n", (task.isDone() ? 'x' : ' '), task.getId(), task.getDescription());
+ System.out.println(task.isDone() ? 'x' : " " + task.getId() + " " + task.getDescription() + " " + task.getDeadline() + " " + task.getCustomizableId());
+
+ }
+ out.println();
+ }
+ }else if(subcommandRest[1].equals("deadline")){
+ showByDeadline();
+ } else if (subcommandRest[1].equals("date")) {
+ showByDate(subcommandRest[2]);
+ }
+ }
+ @Override
+ public 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]);
+ }
+ }
+ @Override
+ public void addProject(String name) {
+ tasksMap.put(name, new ArrayList());
+ }
+
+ private void addTask(String project, String description) {
+ List projectTasks = tasksMap.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));
+ }
+ @Override
+ public void check(String idString) {
+ setDone(idString, true);
+ }
+ @Override
+ public void uncheck(String idString) {
+ setDone(idString, false);
+ }
+ @Override
+ public void setDone(String idString, boolean done) {
+ int id = Integer.parseInt(idString);
+ for (Map.Entry> project : tasksMap.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();
+ }
+ @Override
+ public void help() {
+ out.println("Commands:");
+ out.println(" view by project");
+ out.println(" view by date");
+ out.println(" view by deadline");
+ out.println(" add project ");
+ out.println(" add task ");
+ out.println(" check ");
+ out.println(" uncheck ");
+ out.println(" deadline ");
+ out.println(" delete ");
+ out.println(" customize ");
+ out.println(" today");
+ out.println();
+ }
+ @Override
+ public void error(String command) {
+ out.printf("I don't know what the command \"%s\" is.", command);
+ out.println();
+ }
+
+ @Override
+ public void deadline(String command) {
+ try {
+ String[] subCommand = command.split(" ", 2);
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+ Date deadlineDate = sdf.parse(subCommand[1]);
+ int id = Integer.parseInt(subCommand[0]);
+ for (Map.Entry> project : tasksMap.entrySet()) {
+ for (Task task : project.getValue()) {
+ if (task.getId() == id) {
+ task.setDeadline(deadlineDate);
+ return;
+ }
+ }
+ }
+ }catch (ParseException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ @Override
+ public void today() {
+ for (Map.Entry> project : tasksMap.entrySet()) {
+ for (Task task : project.getValue()) {
+ if (DateUtils.isSameDay(new Date(),task.getDeadline())) {
+// out.printf(" [%c] %d: %s%n", (task.isDone() ? 'x' : ' '), task.getId(), task.getDescription());
+ System.out.println(task.isDone()?'x':" "+task.getId()+" "+task.getDescription()+" "+task.getDeadline()+" "+task.getCustomizableId());
+ }
+ }
+ out.println();
+ }
+ }
+
+ @Override
+ public void delete(String command) {
+ int id = Integer.parseInt(command);
+ for (Map.Entry> project : tasksMap.entrySet()) {
+ List taskList = project.getValue();
+ taskList.removeIf(task -> task.getId()==id);
+ }
+
+ }
+
+ @Override
+ public void showByDeadline() {
+ for (Map.Entry> project : tasksMap.entrySet()) {
+ for (Task task : project.getValue()) {
+ if(task.getDeadline()!=null) {
+ if (DateUtils.isSameDay(new Date(), task.getDeadline())) {
+// out.printf(" [%c] %d: %s%n", (task.isDone() ? 'x' : ' '), task.getId(), task.getDescription());
+ System.out.println(task.isDone() ? 'x' : " " + task.getId() + " " + task.getDescription() + " " + task.getDeadline() + " " + task.getCustomizableId());
+ }
+ }
+ }
+ out.println();
+ }
+ }
+
+ @Override
+ public void showByDate(String s) {
+ try {
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+ Date date = sdf.parse(s);
+ for (Map.Entry> project : tasksMap.entrySet()) {
+ for (Task task : project.getValue()) {
+ if (DateUtils.isSameDay(date, task.getDeadline())) {
+// out.printf(" [%c] %d: %s%n", (task.isDone() ? 'x' : ' '), task.getId(), task.getDescription());
+ System.out.println(task.isDone() ? 'x' : " " + task.getId() + " " + task.getDescription() + " " + task.getDeadline()+" "+task.getCustomizableId());
+ }
+ }
+ out.println();
+ }
+ }catch (ParseException e){
+ throw new RuntimeException(e);
+ }
+ }
+
+ @Override
+ public void customize(String command) {
+ String[] subCommand = command.split(" ", 2);
+ Pattern p = Pattern.compile(
+ "[^a-z0-9 ]", Pattern.CASE_INSENSITIVE);
+ int id = Integer.parseInt(subCommand[0]);
+ if((!p.matcher(subCommand[1]).find())&& !StringUtils.containsWhitespace(subCommand[1])) {
+ for (Map.Entry> project : tasksMap.entrySet()) {
+ for (Task task : project.getValue()) {
+ if (task.getId() == id) {
+ task.setCustomizableId(subCommand[1]);
+ return;
+ }
+ }
+ }
+ }
+ }
+
+ public long nextId() {
+ return ++lastId;
+ }
+}
diff --git a/java/src/main/java/com/codurance/training/executioner/TaskExecutioner.java b/java/src/main/java/com/codurance/training/executioner/TaskExecutioner.java
new file mode 100644
index 00000000..9d174c79
--- /dev/null
+++ b/java/src/main/java/com/codurance/training/executioner/TaskExecutioner.java
@@ -0,0 +1,5 @@
+package com.codurance.training.executioner;
+
+public interface TaskExecutioner {
+ void execute(String commandLine);
+}
diff --git a/java/src/main/java/com/codurance/training/executioner/impl/TaskExecutionerImpl.java b/java/src/main/java/com/codurance/training/executioner/impl/TaskExecutionerImpl.java
new file mode 100644
index 00000000..6c8da010
--- /dev/null
+++ b/java/src/main/java/com/codurance/training/executioner/impl/TaskExecutionerImpl.java
@@ -0,0 +1,44 @@
+package com.codurance.training.executioner.impl;
+
+import com.codurance.training.actions.impl.TaskActionsImpl;
+import com.codurance.training.executioner.TaskExecutioner;
+
+public class TaskExecutionerImpl implements TaskExecutioner {
+ TaskActionsImpl taskActions = new TaskActionsImpl();
+ public void execute(String commandLine) {
+ String[] commandRest = commandLine.split(" ", 2);
+ String command = commandRest[0];
+ switch (command) {
+ case "view":
+ taskActions.show(commandRest[1]);
+ break;
+ case "add":
+ taskActions.add(commandRest[1]);
+ break;
+ case "check":
+ taskActions.check(commandRest[1]);
+ break;
+ case "uncheck":
+ taskActions.uncheck(commandRest[1]);
+ break;
+ case "help":
+ taskActions.help();
+ break;
+ case "deadline":
+ taskActions.deadline(commandRest[1]);
+ break;
+ case "today":
+ taskActions.today();
+ break;
+ case "delete":
+ taskActions.delete(commandRest[1]);
+ break;
+ case "customize":
+ taskActions.customize(commandRest[1]);
+ break;
+ default:
+ taskActions.error(command);
+ break;
+ }
+ }
+}
diff --git a/java/src/main/java/com/codurance/training/main/TaskApplicationRunner.java b/java/src/main/java/com/codurance/training/main/TaskApplicationRunner.java
new file mode 100644
index 00000000..9e963b11
--- /dev/null
+++ b/java/src/main/java/com/codurance/training/main/TaskApplicationRunner.java
@@ -0,0 +1,22 @@
+package com.codurance.training.main;
+
+import com.codurance.training.tasks.TaskList;
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.io.PrintWriter;
+
+public class TaskApplicationRunner {
+ public static void main(String[] args) {
+ PrintWriter out =null;
+ try{
+ BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
+ out = new PrintWriter(System.out);
+ new TaskList(in,out).run();
+ }catch (Exception e){
+ out.close();
+ e.printStackTrace();
+ }
+
+ }
+}
\ No newline at end of file
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..f85a0dcd 100644
--- a/java/src/main/java/com/codurance/training/tasks/Task.java
+++ b/java/src/main/java/com/codurance/training/tasks/Task.java
@@ -1,10 +1,16 @@
package com.codurance.training.tasks;
+import java.util.Date;
+
public final class Task {
private final long id;
private final String description;
private boolean done;
+ private Date deadline;
+
+ private String customizableId;
+
public Task(long id, String description, boolean done) {
this.id = id;
this.description = description;
@@ -26,4 +32,19 @@ public boolean isDone() {
public void setDone(boolean done) {
this.done = done;
}
+
+ public Date getDeadline() {
+ return deadline;
+ }
+
+ public void setDeadline(Date deadline) {
+ this.deadline = deadline;
+ }
+ public String getCustomizableId(){
+ return customizableId;
+ }
+
+ public void setCustomizableId(String customizableId){
+ this.customizableId=customizableId;
+ }
}
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..5cf9a345 100644
--- a/java/src/main/java/com/codurance/training/tasks/TaskList.java
+++ b/java/src/main/java/com/codurance/training/tasks/TaskList.java
@@ -1,10 +1,10 @@
package com.codurance.training.tasks;
+import com.codurance.training.executioner.impl.TaskExecutionerImpl;
+
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;
@@ -12,17 +12,10 @@
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();
- }
+ private final TaskExecutionerImpl executioner = new TaskExecutionerImpl();
public TaskList(BufferedReader reader, PrintWriter writer) {
this.in = reader;
@@ -42,108 +35,11 @@ public void run() {
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]);
+ executioner.execute(command);
}
}
- 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;
- }
}