diff options
| author | Kamal Wickramanayake <kamal@inbox.lk> | 2026-03-22 15:33:43 +0530 |
|---|---|---|
| committer | Kamal Wickramanayake <kamal@inbox.lk> | 2026-03-22 15:33:43 +0530 |
| commit | 8f875db252cfead19b029ff443f81d087c3cf097 (patch) | |
| tree | e1474def31b18a48868417b5445ce1676d7298ec /oop/10-task-tracker | |
| parent | 938427dace1a9622a55e3f81845fb82af697d001 (diff) | |
Added 10-task-tracker
Diffstat (limited to 'oop/10-task-tracker')
13 files changed, 378 insertions, 0 deletions
diff --git a/oop/10-task-tracker/.gitignore b/oop/10-task-tracker/.gitignore new file mode 100644 index 0000000..eb5a316 --- /dev/null +++ b/oop/10-task-tracker/.gitignore @@ -0,0 +1 @@ +target diff --git a/oop/10-task-tracker/.mvn/jvm.config b/oop/10-task-tracker/.mvn/jvm.config new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/oop/10-task-tracker/.mvn/jvm.config diff --git a/oop/10-task-tracker/.mvn/maven.config b/oop/10-task-tracker/.mvn/maven.config new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/oop/10-task-tracker/.mvn/maven.config diff --git a/oop/10-task-tracker/docs/01-requirements.txt b/oop/10-task-tracker/docs/01-requirements.txt new file mode 100644 index 0000000..932d793 --- /dev/null +++ b/oop/10-task-tracker/docs/01-requirements.txt @@ -0,0 +1,6 @@ +A task tracking system is to be developed. A user should be able to enter +new tasks into the system either assigning it to a user or unassigned. A +task should have a title and a description. It should be possible to update +the estimated time of a task. Once a task is completed, the user should be +able to set the actual time spent on the task. The software should allow +viewing the tasks assigned to a user. diff --git a/oop/10-task-tracker/docs/02-domain-model.uxf b/oop/10-task-tracker/docs/02-domain-model.uxf new file mode 100644 index 0000000..89ed41a --- /dev/null +++ b/oop/10-task-tracker/docs/02-domain-model.uxf @@ -0,0 +1,13 @@ +<diagram program="umletino" version="15.1"><zoom_level>10</zoom_level><element><id>UMLClass</id><coordinates><x>60</x><y>100</y><w>100</w><h>60</h></coordinates><panel_attributes>User +-- +id +username</panel_attributes><additional_attributes></additional_attributes></element><element><id>UMLClass</id><coordinates><x>360</x><y>100</y><w>100</w><h>120</h></coordinates><panel_attributes>Task +-- +id +title +description +estimatedTime +actualTime +completed</panel_attributes><additional_attributes></additional_attributes></element><element><id>Relation</id><coordinates><x>150</x><y>100</y><w>230</w><h>40</h></coordinates><panel_attributes>lt=<- +< createdBy</panel_attributes><additional_attributes>10;20;210;20</additional_attributes></element><element><id>Relation</id><coordinates><x>150</x><y>130</y><w>230</w><h>40</h></coordinates><panel_attributes>lt=<- +< assignedTo</panel_attributes><additional_attributes>10;20;210;20</additional_attributes></element></diagram>
\ No newline at end of file diff --git a/oop/10-task-tracker/docs/03-design.uxf b/oop/10-task-tracker/docs/03-design.uxf new file mode 100644 index 0000000..04a2deb --- /dev/null +++ b/oop/10-task-tracker/docs/03-design.uxf @@ -0,0 +1,40 @@ +<diagram program="umletino" version="15.1"><zoom_level>10</zoom_level><element><id>UMLClass</id><coordinates><x>20</x><y>420</y><w>120</w><h>60</h></coordinates><panel_attributes>User +-- +id: int +username: String</panel_attributes><additional_attributes></additional_attributes></element><element><id>UMLClass</id><coordinates><x>290</x><y>420</y><w>150</w><h>120</h></coordinates><panel_attributes>Task +-- +id: int +title: String +description: String +estimatedTime: Duration +actualTime: Duration +completed: boolean</panel_attributes><additional_attributes></additional_attributes></element><element><id>Relation</id><coordinates><x>130</x><y>420</y><w>180</w><h>40</h></coordinates><panel_attributes>lt=<- +< createdBy</panel_attributes><additional_attributes>10;20;160;20</additional_attributes></element><element><id>Relation</id><coordinates><x>130</x><y>450</y><w>180</w><h>40</h></coordinates><panel_attributes>lt=<- +< assignedTo</panel_attributes><additional_attributes>10;20;160;20</additional_attributes></element><element><id>UMLClass</id><coordinates><x>30</x><y>0</y><w>110</w><h>90</h></coordinates><panel_attributes>TextUI +-- +-- +createNewTask() +updateTask() +createNewUser() +start()</panel_attributes><additional_attributes></additional_attributes></element><element><id>UMLClass</id><coordinates><x>230</x><y>0</y><w>320</w><h>90</h></coordinates><panel_attributes><<interface>> +TaskManager +-- +-- +createNewTask(title: String, description: String): Task +findById(id: int): Task +updateTask(task: Task) +</panel_attributes><additional_attributes></additional_attributes></element><element><id>UMLClass</id><coordinates><x>0</x><y>170</y><w>210</w><h>70</h></coordinates><panel_attributes><<interface>> +UserManager +-- +-- +createNewUser(username: String)</panel_attributes><additional_attributes></additional_attributes></element><element><id>Relation</id><coordinates><x>130</x><y>10</y><w>120</w><h>30</h></coordinates><panel_attributes>lt=<-</panel_attributes><additional_attributes>100;10;10;10</additional_attributes></element><element><id>Relation</id><coordinates><x>80</x><y>80</y><w>30</w><h>110</h></coordinates><panel_attributes>lt=<-</panel_attributes><additional_attributes>10;90;10;10</additional_attributes></element><element><id>UMLClass</id><coordinates><x>230</x><y>190</y><w>310</w><h>90</h></coordinates><panel_attributes>InMemoryTaskManager +-- +-- +createNewTask(title: String, description: String): Task +findById(id: int): Task +updateTask(task: Task) +</panel_attributes><additional_attributes></additional_attributes></element><element><id>Relation</id><coordinates><x>350</x><y>80</y><w>30</w><h>130</h></coordinates><panel_attributes>lt=<<.</panel_attributes><additional_attributes>10;10;10;110</additional_attributes></element><element><id>Relation</id><coordinates><x>360</x><y>270</y><w>40</w><h>170</h></coordinates><panel_attributes>lt=<<<<- +m2=*</panel_attributes><additional_attributes>10;10;10;150</additional_attributes></element><element><id>UMLClass</id><coordinates><x>0</x><y>320</y><w>210</w><h>50</h></coordinates><panel_attributes>DBUserManager +-- +-- +createNewUser(username: String)</panel_attributes><additional_attributes></additional_attributes></element><element><id>Relation</id><coordinates><x>70</x><y>230</y><w>30</w><h>110</h></coordinates><panel_attributes>lt=<<.</panel_attributes><additional_attributes>10;10;10;90</additional_attributes></element></diagram>
\ No newline at end of file diff --git a/oop/10-task-tracker/pom.xml b/oop/10-task-tracker/pom.xml new file mode 100644 index 0000000..7989c8c --- /dev/null +++ b/oop/10-task-tracker/pom.xml @@ -0,0 +1,90 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <groupId>lk.ac.pdn.ceit.tasks</groupId> + <artifactId>task-tracker</artifactId> + <version>1.0-SNAPSHOT</version> + + <name>task-tracker</name> + <!-- FIXME change it to the project's website --> + <url>http://www.example.com</url> + + <properties> + <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> + <maven.compiler.release>25</maven.compiler.release> + </properties> + + <dependencyManagement> + <dependencies> + <dependency> + <groupId>org.junit</groupId> + <artifactId>junit-bom</artifactId> + <version>5.11.0</version> + <type>pom</type> + <scope>import</scope> + </dependency> + </dependencies> + </dependencyManagement> + + <dependencies> + <dependency> + <groupId>org.junit.jupiter</groupId> + <artifactId>junit-jupiter-api</artifactId> + <scope>test</scope> + </dependency> + <!-- Optionally: parameterized tests support --> + <dependency> + <groupId>org.junit.jupiter</groupId> + <artifactId>junit-jupiter-params</artifactId> + <scope>test</scope> + </dependency> + </dependencies> + + <build> + <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) --> + <plugins> + <!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle --> + <plugin> + <artifactId>maven-clean-plugin</artifactId> + <version>3.4.0</version> + </plugin> + <!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging --> + <plugin> + <artifactId>maven-resources-plugin</artifactId> + <version>3.3.1</version> + </plugin> + <plugin> + <artifactId>maven-compiler-plugin</artifactId> + <version>3.13.0</version> + </plugin> + <plugin> + <artifactId>maven-surefire-plugin</artifactId> + <version>3.3.0</version> + </plugin> + <plugin> + <artifactId>maven-jar-plugin</artifactId> + <version>3.4.2</version> + </plugin> + <plugin> + <artifactId>maven-install-plugin</artifactId> + <version>3.1.2</version> + </plugin> + <plugin> + <artifactId>maven-deploy-plugin</artifactId> + <version>3.1.2</version> + </plugin> + <!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle --> + <plugin> + <artifactId>maven-site-plugin</artifactId> + <version>3.12.1</version> + </plugin> + <plugin> + <artifactId>maven-project-info-reports-plugin</artifactId> + <version>3.6.1</version> + </plugin> + </plugins> + </pluginManagement> + </build> +</project> diff --git a/oop/10-task-tracker/src/main/java/lk/ac/pdn/ceit/tasks/App.java b/oop/10-task-tracker/src/main/java/lk/ac/pdn/ceit/tasks/App.java new file mode 100644 index 0000000..bb0ab24 --- /dev/null +++ b/oop/10-task-tracker/src/main/java/lk/ac/pdn/ceit/tasks/App.java @@ -0,0 +1,15 @@ +package lk.ac.pdn.ceit.tasks; + +import lk.ac.pdn.ceit.tasks.ui.TextUI; + +/** + * Hello world! + */ +public class App { + public static void main(String[] args) { + TextUI ui = new TextUI(); + // ui.setTaskManager(); + + ui.start(); + } +} diff --git a/oop/10-task-tracker/src/main/java/lk/ac/pdn/ceit/tasks/TaskManager.java b/oop/10-task-tracker/src/main/java/lk/ac/pdn/ceit/tasks/TaskManager.java new file mode 100644 index 0000000..8e22b30 --- /dev/null +++ b/oop/10-task-tracker/src/main/java/lk/ac/pdn/ceit/tasks/TaskManager.java @@ -0,0 +1,9 @@ +package lk.ac.pdn.ceit.tasks; + +import lk.ac.pdn.ceit.tasks.entities.Task; + +public interface TaskManager { + public Task createNewTask(String title, String description); + public Task findById(int id); + public void updateTask(Task task); +} diff --git a/oop/10-task-tracker/src/main/java/lk/ac/pdn/ceit/tasks/entities/Task.java b/oop/10-task-tracker/src/main/java/lk/ac/pdn/ceit/tasks/entities/Task.java new file mode 100644 index 0000000..26dfc4a --- /dev/null +++ b/oop/10-task-tracker/src/main/java/lk/ac/pdn/ceit/tasks/entities/Task.java @@ -0,0 +1,84 @@ +package lk.ac.pdn.ceit.tasks.entities; + +import java.time.Duration; + +public class Task { + private User createdBy; + private User assignedTo; + + private int id; + private String title; + private String description; + private Duration estimatedTime; + private Duration actualTime; + private boolean completed; + + public Task() { + } + + public Task(int id, String title, String description) { + this.id = id; + this.title = title; + this.description = description; + } + + public int getId() { + return id; + } + public void setId(int id) { + this.id = id; + } + public String getTitle() { + return title; + } + public void setTitle(String title) { + this.title = title; + } + public String getDescription() { + return description; + } + public void setDescription(String description) { + this.description = description; + } + public Duration getEstimatedTime() { + return estimatedTime; + } + public void setEstimatedTime(Duration estimatedTime) { + this.estimatedTime = estimatedTime; + } + public Duration getActualTime() { + return actualTime; + } + public void setActualTime(Duration actualTime) { + this.actualTime = actualTime; + } + public boolean isCompleted() { + return completed; + } + public void setCompleted(boolean completed) { + this.completed = completed; + } + + public User getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(User createdBy) { + this.createdBy = createdBy; + } + + public User getAssignedTo() { + return assignedTo; + } + + public void setAssignedTo(User assignedTo) { + this.assignedTo = assignedTo; + } + + @Override + public String toString() { + return "Task [id=" + id + ", title=" + title + ", description=" + description + ", estimatedTime=" + + estimatedTime + ", actualTime=" + actualTime + ", completed=" + completed + "]"; + } + +} diff --git a/oop/10-task-tracker/src/main/java/lk/ac/pdn/ceit/tasks/entities/User.java b/oop/10-task-tracker/src/main/java/lk/ac/pdn/ceit/tasks/entities/User.java new file mode 100644 index 0000000..2c45fc2 --- /dev/null +++ b/oop/10-task-tracker/src/main/java/lk/ac/pdn/ceit/tasks/entities/User.java @@ -0,0 +1,32 @@ +package lk.ac.pdn.ceit.tasks.entities; + +public class User { + private int id; + private String username; + + public User() { + } + + public User(int id, String username) { + this.id = id; + this.username = username; + } + + public int getId() { + return id; + } + public void setId(int id) { + this.id = id; + } + public String getUsername() { + return username; + } + public void setUsername(String username) { + this.username = username; + } + + @Override + public String toString() { + return "User [id=" + id + ", username=" + username + "]"; + } +} diff --git a/oop/10-task-tracker/src/main/java/lk/ac/pdn/ceit/tasks/ui/TextUI.java b/oop/10-task-tracker/src/main/java/lk/ac/pdn/ceit/tasks/ui/TextUI.java new file mode 100644 index 0000000..6bce661 --- /dev/null +++ b/oop/10-task-tracker/src/main/java/lk/ac/pdn/ceit/tasks/ui/TextUI.java @@ -0,0 +1,69 @@ +package lk.ac.pdn.ceit.tasks.ui; + +import lk.ac.pdn.ceit.tasks.TaskManager; +import lk.ac.pdn.ceit.tasks.entities.Task; + +public class TextUI { + private TaskManager taskManager; + + public void setTaskManager(TaskManager taskManager) { + this.taskManager = taskManager; + } + + public void start() { + while(true) { + String command = IO.readln("Command> "); + + switch (command.trim().toLowerCase()) { + case "q": + case "quit": + IO.println("Thank you for using Task Tracker."); + System.exit(0); + + case "createtask": + createNewTask(); + break; + + case "updatetask": + updateTask(); + break; + + default: + IO.println("Command not found."); + break; + } + } + } + + private void createNewTask() { + String title = IO.readln("Enter task title: "); + String description = IO.readln("Enter task description: "); + + Task newTask = taskManager.createNewTask(title, description); + + IO.print("New task created: " + newTask); + } + + private void updateTask() { + // Ask the user to enter task id + String taskId = IO.readln("Enter task ID: "); + + // Get the Task from TaskManager + Task task = taskManager.findById(Integer.parseInt(taskId)); + + // Show the Task details to user + IO.print(task); + + // Prompt the user to update Task properties + String title = IO.readln("New title: "); + if (! title.equals("")) { + task.setTitle(title); + } + // ... + + // Use the TaskManager and update the task + taskManager.updateTask(task); + IO.println("Task updated."); + } + +} diff --git a/oop/10-task-tracker/src/test/java/lk/ac/pdn/ceit/tasks/AppTest.java b/oop/10-task-tracker/src/test/java/lk/ac/pdn/ceit/tasks/AppTest.java new file mode 100644 index 0000000..c9bcf0c --- /dev/null +++ b/oop/10-task-tracker/src/test/java/lk/ac/pdn/ceit/tasks/AppTest.java @@ -0,0 +1,19 @@ +package lk.ac.pdn.ceit.tasks; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +import org.junit.jupiter.api.Test; + +/** + * Unit test for simple App. + */ +public class AppTest { + + /** + * Rigorous Test :-) + */ + @Test + public void shouldAnswerWithTrue() { + assertTrue(true); + } +} |
