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; - } }