summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKamal Wickramanayake <kamal@inbox.lk>2026-03-22 15:33:43 +0530
committerKamal Wickramanayake <kamal@inbox.lk>2026-03-22 15:33:43 +0530
commit8f875db252cfead19b029ff443f81d087c3cf097 (patch)
treee1474def31b18a48868417b5445ce1676d7298ec
parent938427dace1a9622a55e3f81845fb82af697d001 (diff)
Added 10-task-tracker
-rw-r--r--oop/10-task-tracker/.gitignore1
-rw-r--r--oop/10-task-tracker/.mvn/jvm.config0
-rw-r--r--oop/10-task-tracker/.mvn/maven.config0
-rw-r--r--oop/10-task-tracker/docs/01-requirements.txt6
-rw-r--r--oop/10-task-tracker/docs/02-domain-model.uxf13
-rw-r--r--oop/10-task-tracker/docs/03-design.uxf40
-rw-r--r--oop/10-task-tracker/pom.xml90
-rw-r--r--oop/10-task-tracker/src/main/java/lk/ac/pdn/ceit/tasks/App.java15
-rw-r--r--oop/10-task-tracker/src/main/java/lk/ac/pdn/ceit/tasks/TaskManager.java9
-rw-r--r--oop/10-task-tracker/src/main/java/lk/ac/pdn/ceit/tasks/entities/Task.java84
-rw-r--r--oop/10-task-tracker/src/main/java/lk/ac/pdn/ceit/tasks/entities/User.java32
-rw-r--r--oop/10-task-tracker/src/main/java/lk/ac/pdn/ceit/tasks/ui/TextUI.java69
-rw-r--r--oop/10-task-tracker/src/test/java/lk/ac/pdn/ceit/tasks/AppTest.java19
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=&lt;-
+&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=&lt;-
+&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=&lt;-
+&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=&lt;-
+&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>&lt;&lt;interface&gt;&gt;
+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>&lt;&lt;interface&gt;&gt;
+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=&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=&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=&lt;&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=&lt;&lt;&lt;&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=&lt;&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);
+ }
+}