Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions java/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,10 @@
<artifactId>tasks</artifactId>
<version>0.1</version>

<packaging>jar</packaging>
<name>Task List</name>


<dependencies>
<dependency>
<groupId>junit</groupId>
Expand All @@ -20,6 +22,15 @@
<version>2.0.0.0</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.0</version>
</dependency>


</dependencies>

<build>
Expand Down
31 changes: 31 additions & 0 deletions java/src/main/java/com/codurance/training/actions/TaskActions.java
Original file line number Diff line number Diff line change
@@ -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);
}
Original file line number Diff line number Diff line change
@@ -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<String, List<Task>> tasksMap= new LinkedHashMap<>();
@Override
public void show(String commandLine) {
String[] subcommandRest = commandLine.split(" ", 3);
if(subcommandRest[1].equals("project")) {
for (Map.Entry<String, List<Task>> 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<Task>());
}

private void addTask(String project, String description) {
List<Task> 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<String, List<Task>> 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 <project name>");
out.println(" add task <project name> <task description>");
out.println(" check <task ID>");
out.println(" uncheck <task ID>");
out.println(" deadline <task ID>");
out.println(" delete <task ID>");
out.println(" customize <task ID> <customize ID>");
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<String, List<Task>> 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<String, List<Task>> 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<String, List<Task>> project : tasksMap.entrySet()) {
List<Task> taskList = project.getValue();
taskList.removeIf(task -> task.getId()==id);
}

}

@Override
public void showByDeadline() {
for (Map.Entry<String, List<Task>> 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<String, List<Task>> 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<String, List<Task>> project : tasksMap.entrySet()) {
for (Task task : project.getValue()) {
if (task.getId() == id) {
task.setCustomizableId(subCommand[1]);
return;
}
}
}
}
}

public long nextId() {
return ++lastId;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.codurance.training.executioner;

public interface TaskExecutioner {
void execute(String commandLine);
}
Original file line number Diff line number Diff line change
@@ -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;
}
}
}
Original file line number Diff line number Diff line change
@@ -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();
}

}
}
21 changes: 21 additions & 0 deletions java/src/main/java/com/codurance/training/tasks/Task.java
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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;
}
}
Loading