From 8150fdbf13b7a8a00a5c9d5c8a5a612fcf8864c9 Mon Sep 17 00:00:00 2001 From: Riley Schneider <88947587+Ferryry@users.noreply.github.com> Date: Wed, 3 Dec 2025 20:42:23 +0100 Subject: [PATCH 01/11] Updated from origin/main --- .gradle/8.14/fileHashes/fileHashes.lock | Bin 17 -> 17 bytes .../buildOutputCleanup/buildOutputCleanup.lock | Bin 17 -> 17 bytes .../java/hhn/temp/project/provider/Database.java | 1 + .../project/provider/SimpleDatabaseManager.java | 9 ++++++++- test/hhn/temp/project/DatabaseGoodCasesTest.java | 14 -------------- 5 files changed, 9 insertions(+), 15 deletions(-) diff --git a/.gradle/8.14/fileHashes/fileHashes.lock b/.gradle/8.14/fileHashes/fileHashes.lock index 3bdaec1a8f7fd341ca151b56ad3b2ecba29eccb8..59980652cf40366787c1e51f14bd0c0d2e185c6d 100644 GIT binary patch literal 17 UcmZQJ+4?|x>8n?D3=rT606a4VH~;_u literal 17 VcmZQJ+4?|x>8n?D3}C>x0RTLl1)u-` diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock index a4beab638e9dd3c60e6aec3ae9c039673dd95b87..ec8e1775d1ca302ba4256f7d81168feadc1f0a6a 100644 GIT binary patch literal 17 VcmZQBa#cSO`uvX|0~j#!0{}221Oos7 literal 17 UcmZQBa#cSO`uvX|0|eX!05I?b&;S4c diff --git a/src/main/java/hhn/temp/project/provider/Database.java b/src/main/java/hhn/temp/project/provider/Database.java index be2d5c74..2c44df3f 100644 --- a/src/main/java/hhn/temp/project/provider/Database.java +++ b/src/main/java/hhn/temp/project/provider/Database.java @@ -6,4 +6,5 @@ import java.sql.SQLException; public interface Database { public void connect() throws SQLException, IOException; + public void close() throws SQLException; } diff --git a/src/main/java/hhn/temp/project/provider/SimpleDatabaseManager.java b/src/main/java/hhn/temp/project/provider/SimpleDatabaseManager.java index 941e74e4..c624e80f 100644 --- a/src/main/java/hhn/temp/project/provider/SimpleDatabaseManager.java +++ b/src/main/java/hhn/temp/project/provider/SimpleDatabaseManager.java @@ -26,7 +26,7 @@ public class SimpleDatabaseManager implements DatabaseManager { @Override public void saveObject(E object) { - +g } @Override @@ -38,4 +38,11 @@ public class SimpleDatabaseManager implements DatabaseManager { public void connect() throws SQLException, IOException { connection = DriverManager.getConnection("jdbc:mysql://sql7.freesqldatabase.com/sql7810540?user=sql7810540&password=mXdJCFtDZz"); } + + @Override + public void close() throws SQLException { + if (connection != null) { + connection.close(); + } + } } diff --git a/test/hhn/temp/project/DatabaseGoodCasesTest.java b/test/hhn/temp/project/DatabaseGoodCasesTest.java index 4f776ea7..6e9ed491 100644 --- a/test/hhn/temp/project/DatabaseGoodCasesTest.java +++ b/test/hhn/temp/project/DatabaseGoodCasesTest.java @@ -13,18 +13,6 @@ public class DatabaseGoodCasesTest { private DatabaseManager databaseManager; - public class TestClass { - private int id; - private String dataString; - private int dataInteger; - - public TestClass(int id, String dataString, int dataInteger) { - this.id = id; - this.dataString = dataString; - this.dataInteger = dataInteger; - } - } - @BeforeEach public void setup() { databaseManager = new SimpleDatabaseManager<>(); @@ -33,7 +21,6 @@ public class DatabaseGoodCasesTest { @Test @DisplayName("Assert that the TestClass could be inserted into the database") public void assertGetTestClass() throws SQLException, IOException { - TestClass testClass = new TestClass(1, "Hello World", 123); databaseManager.connect(); databaseManager.getObject(1); @@ -42,7 +29,6 @@ public class DatabaseGoodCasesTest { @Test @DisplayName("Assert that the TestClass could be inserted into the database") public void assertInsertTestClass() throws SQLException, IOException { - TestClass testClass = new TestClass(1, "Hello World", 123); databaseManager.connect(); databaseManager.saveObject(testClass); From b801ea7d214fbf8549263d2c34065803bb418c8e Mon Sep 17 00:00:00 2001 From: Riley Schneider <88947587+Ferryry@users.noreply.github.com> Date: Wed, 3 Dec 2025 20:52:47 +0100 Subject: [PATCH 02/11] Added NotImplementedException, edited some DatabaseGoodCasesTest tests. --- src/main/java/hhn/temp/project/Task.java | 4 +--- .../temp/project/provider/DatabaseManager.java | 8 +++++--- .../project/provider/SimpleDatabaseManager.java | 14 ++++++++------ test/hhn/temp/project/DatabaseBadCasesTest.java | 8 +------- .../hhn/temp/project/DatabaseGoodCasesTest.java | 17 +++++++++++------ 5 files changed, 26 insertions(+), 25 deletions(-) diff --git a/src/main/java/hhn/temp/project/Task.java b/src/main/java/hhn/temp/project/Task.java index b5ee9cc9..f4d015bb 100644 --- a/src/main/java/hhn/temp/project/Task.java +++ b/src/main/java/hhn/temp/project/Task.java @@ -5,10 +5,8 @@ public class Task { String description; int taskId; int workerId; - AssignmentManager manager; TaskState state; - public Task(int taskId, int workerId, String name, String description, AssignmentManager manager) { - this.manager = manager; + public Task(int taskId, int workerId, String name, String description) { this.name = name; this.description = description; this.taskId = taskId; diff --git a/src/main/java/hhn/temp/project/provider/DatabaseManager.java b/src/main/java/hhn/temp/project/provider/DatabaseManager.java index 272943a9..21644dcf 100644 --- a/src/main/java/hhn/temp/project/provider/DatabaseManager.java +++ b/src/main/java/hhn/temp/project/provider/DatabaseManager.java @@ -1,10 +1,12 @@ package hhn.temp.project.provider; +import jdk.jshell.spi.ExecutionControl; + import java.util.Collection; public interface DatabaseManager extends Database { public void saveObjects(Collection objects); - public Collection getObjects(); - public void saveObject(E object); - public E getObject(int id); + public Collection getObjects() throws ExecutionControl.NotImplementedException; + public void saveObject(E object) throws ExecutionControl.NotImplementedException; + public E getObject(int id) throws ExecutionControl.NotImplementedException; } \ No newline at end of file diff --git a/src/main/java/hhn/temp/project/provider/SimpleDatabaseManager.java b/src/main/java/hhn/temp/project/provider/SimpleDatabaseManager.java index c624e80f..c12f9a1b 100644 --- a/src/main/java/hhn/temp/project/provider/SimpleDatabaseManager.java +++ b/src/main/java/hhn/temp/project/provider/SimpleDatabaseManager.java @@ -1,5 +1,7 @@ package hhn.temp.project.provider; +import jdk.jshell.spi.ExecutionControl; + import java.io.File; import java.io.IOException; import java.nio.file.Files; @@ -20,18 +22,18 @@ public class SimpleDatabaseManager implements DatabaseManager { } @Override - public Collection getObjects() { - return List.of(); + public Collection getObjects() throws ExecutionControl.NotImplementedException { + throw new ExecutionControl.NotImplementedException("Not Implemented!"); } @Override - public void saveObject(E object) { -g + public void saveObject(E object) throws ExecutionControl.NotImplementedException { + throw new ExecutionControl.NotImplementedException("Not Implemented!"); } @Override - public E getObject(int id) { - return null; + public E getObject(int id) throws ExecutionControl.NotImplementedException { + throw new ExecutionControl.NotImplementedException("Not Implemented!"); } @Override diff --git a/test/hhn/temp/project/DatabaseBadCasesTest.java b/test/hhn/temp/project/DatabaseBadCasesTest.java index c9d45048..6e73bd41 100644 --- a/test/hhn/temp/project/DatabaseBadCasesTest.java +++ b/test/hhn/temp/project/DatabaseBadCasesTest.java @@ -12,7 +12,7 @@ import static org.junit.jupiter.api.Assertions.*; public class DatabaseBadCasesTest { - private DatabaseManager databaseManager; + private DatabaseManager databaseManager; public class TestClass { private int id; @@ -30,10 +30,4 @@ public class DatabaseBadCasesTest { public void setup() { databaseManager = new SimpleDatabaseManager<>(); } - - @Test - @DisplayName("Assert connection failed") - public void assertConnectionFailed() { - assertThrows(SQLException.class, () -> databaseManager.connect()); - } } \ No newline at end of file diff --git a/test/hhn/temp/project/DatabaseGoodCasesTest.java b/test/hhn/temp/project/DatabaseGoodCasesTest.java index 6e9ed491..53b4e250 100644 --- a/test/hhn/temp/project/DatabaseGoodCasesTest.java +++ b/test/hhn/temp/project/DatabaseGoodCasesTest.java @@ -2,6 +2,7 @@ package hhn.temp.project; import hhn.temp.project.provider.DatabaseManager; import hhn.temp.project.provider.SimpleDatabaseManager; +import jdk.jshell.spi.ExecutionControl; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -11,27 +12,31 @@ import java.sql.SQLException; public class DatabaseGoodCasesTest { - private DatabaseManager databaseManager; + private DatabaseManager databaseManager; + private AssignmentManager manager; @BeforeEach public void setup() { databaseManager = new SimpleDatabaseManager<>(); + manager = new AssignmentManager(); } @Test @DisplayName("Assert that the TestClass could be inserted into the database") - public void assertGetTestClass() throws SQLException, IOException { + public void assertGetTestClass() throws SQLException, IOException, ExecutionControl.NotImplementedException { databaseManager.connect(); - databaseManager.getObject(1); + Task task = databaseManager.getObject(1); } @Test - @DisplayName("Assert that the TestClass could be inserted into the database") - public void assertInsertTestClass() throws SQLException, IOException { + @DisplayName("Assert that a simple Task could be inserted into the database") + public void assertInsertTestClass() throws SQLException, IOException, ExecutionControl.NotImplementedException { + + Task testTask = new Task(1, 1, "Hello World", "Description"); databaseManager.connect(); - databaseManager.saveObject(testClass); + databaseManager.saveObject(testTask); } @Test From d9da291d45c7b117097df587a5a42d04e8893265 Mon Sep 17 00:00:00 2001 From: Riley Schneider <88947587+Ferryry@users.noreply.github.com> Date: Wed, 3 Dec 2025 21:45:26 +0100 Subject: [PATCH 03/11] Added first sql-queries into the SimpleDatabaseManager.java (Still failing / Red Errors) --- .../hhn/temp/project/AssignmentManager.java | 2 +- .../project/provider/DatabaseManager.java | 6 +- .../provider/SimpleDatabaseManager.java | 59 ++++++++++++++++--- .../project/provider/sql/createTaskTable.sql | 7 +++ .../project/provider/sql/deleteTaskTable.sql | 1 + .../project/provider/sql/insertTaskTable.sql | 1 + .../project/provider/sql/selectTaskTable.sql | 1 + .../project/provider/sql/updateTaskTable.sql | 1 + .../temp/project/DatabaseGoodCasesTest.java | 3 + 9 files changed, 69 insertions(+), 12 deletions(-) create mode 100644 src/main/java/hhn/temp/project/provider/sql/createTaskTable.sql create mode 100644 src/main/java/hhn/temp/project/provider/sql/deleteTaskTable.sql create mode 100644 src/main/java/hhn/temp/project/provider/sql/insertTaskTable.sql create mode 100644 src/main/java/hhn/temp/project/provider/sql/selectTaskTable.sql create mode 100644 src/main/java/hhn/temp/project/provider/sql/updateTaskTable.sql diff --git a/src/main/java/hhn/temp/project/AssignmentManager.java b/src/main/java/hhn/temp/project/AssignmentManager.java index ec8d4510..756b1eeb 100644 --- a/src/main/java/hhn/temp/project/AssignmentManager.java +++ b/src/main/java/hhn/temp/project/AssignmentManager.java @@ -27,7 +27,7 @@ public class AssignmentManager { if (!workerMap.containsKey(workerId) || name == null || description == null) { throw new IllegalArgumentException("WorkerId must exist and name or description can't be null"); } - Task task = new Task(++taskIdCounter, workerId, name, description, this); + Task task = new Task(++taskIdCounter, workerId, name, description); taskMap.put(taskIdCounter, task); return taskIdCounter; } diff --git a/src/main/java/hhn/temp/project/provider/DatabaseManager.java b/src/main/java/hhn/temp/project/provider/DatabaseManager.java index 21644dcf..e59789c4 100644 --- a/src/main/java/hhn/temp/project/provider/DatabaseManager.java +++ b/src/main/java/hhn/temp/project/provider/DatabaseManager.java @@ -2,11 +2,13 @@ package hhn.temp.project.provider; import jdk.jshell.spi.ExecutionControl; +import java.io.IOException; +import java.sql.SQLException; import java.util.Collection; public interface DatabaseManager extends Database { - public void saveObjects(Collection objects); + public void saveObjects(Collection objects) throws ExecutionControl.NotImplementedException, IOException, SQLException; public Collection getObjects() throws ExecutionControl.NotImplementedException; - public void saveObject(E object) throws ExecutionControl.NotImplementedException; + public void saveObject(E object) throws ExecutionControl.NotImplementedException, IOException, SQLException; public E getObject(int id) throws ExecutionControl.NotImplementedException; } \ No newline at end of file diff --git a/src/main/java/hhn/temp/project/provider/SimpleDatabaseManager.java b/src/main/java/hhn/temp/project/provider/SimpleDatabaseManager.java index c12f9a1b..1542a698 100644 --- a/src/main/java/hhn/temp/project/provider/SimpleDatabaseManager.java +++ b/src/main/java/hhn/temp/project/provider/SimpleDatabaseManager.java @@ -1,34 +1,75 @@ package hhn.temp.project.provider; +import hhn.temp.project.Task; +import hhn.temp.project.TaskState; import jdk.jshell.spi.ExecutionControl; -import java.io.File; import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; import java.sql.Connection; import java.sql.DriverManager; +import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.Collection; -import java.util.List; public class SimpleDatabaseManager implements DatabaseManager { private Connection connection; - @Override - public void saveObjects(Collection objects) { - + private enum QueryMode { + SELECT, INSERT, DELETE, UPDATE } + private int taskStateToInt(TaskState taskState) { + return (taskState == TaskState.FINISHED) ? 1 : 0; + } + + private TaskState intToTaskState(int i) { + if (i < 0 || i > 1) { + throw new IllegalArgumentException("Integer may only bet 0 or 1"); + } + + return (i == 1) ? TaskState.FINISHED : TaskState.IN_PROGRESS; + } + + private String getQuery(QueryMode query) throws IOException { + String queryString = null; + + switch (query) { + case INSERT -> queryString = "INSERT INTO Task (name, description, workerid, taskstate) VALUES (?, ?, ?, ?)"; + case UPDATE -> queryString = "UPDATE Task SET name = ?, description = ?, taskstate = ? WHERE taskid = ?"; + case DELETE -> queryString = "DELETE FROM Task WHERE taskid = ?"; + case SELECT -> queryString = "SELECT * FROM Task WHERE workerid = ?"; + } + + return queryString; + } + + @Override + public void saveObjects(Collection objects) throws IOException, SQLException { + for (E obj : objects) { + saveObject(obj); + } + } + + @Override public Collection getObjects() throws ExecutionControl.NotImplementedException { throw new ExecutionControl.NotImplementedException("Not Implemented!"); } @Override - public void saveObject(E object) throws ExecutionControl.NotImplementedException { - throw new ExecutionControl.NotImplementedException("Not Implemented!"); + public void saveObject(E object) throws IOException, SQLException { + String query = getQuery(QueryMode.INSERT); + + if (object instanceof Task task) { + try (PreparedStatement ps = connection.prepareStatement(query)) { + ps.setInt(1, task.getTaskId()); + ps.setString(2, task.getName()); + ps.setString(3, task.getDescription()); + ps.setInt(4, task.getWorkerId()); + ps.setInt(5, taskStateToInt(task.getTaskState())); + } + } } @Override diff --git a/src/main/java/hhn/temp/project/provider/sql/createTaskTable.sql b/src/main/java/hhn/temp/project/provider/sql/createTaskTable.sql new file mode 100644 index 00000000..6e39b6f4 --- /dev/null +++ b/src/main/java/hhn/temp/project/provider/sql/createTaskTable.sql @@ -0,0 +1,7 @@ +CREATE TABLE Task ( + taskid INT AUTO_INCREMENT PRIMARY KEY, + name VARCHAR(255) NOT NULL, + description TEXT, + workerid INT, + taskstate INT +); \ No newline at end of file diff --git a/src/main/java/hhn/temp/project/provider/sql/deleteTaskTable.sql b/src/main/java/hhn/temp/project/provider/sql/deleteTaskTable.sql new file mode 100644 index 00000000..179a1d92 --- /dev/null +++ b/src/main/java/hhn/temp/project/provider/sql/deleteTaskTable.sql @@ -0,0 +1 @@ +DELETE FROM Task WHERE taskid = ? \ No newline at end of file diff --git a/src/main/java/hhn/temp/project/provider/sql/insertTaskTable.sql b/src/main/java/hhn/temp/project/provider/sql/insertTaskTable.sql new file mode 100644 index 00000000..bc00c911 --- /dev/null +++ b/src/main/java/hhn/temp/project/provider/sql/insertTaskTable.sql @@ -0,0 +1 @@ +INSERT INTO Task (name, description, workerid, taskstate) VALUES (?, ?, ?, ?) \ No newline at end of file diff --git a/src/main/java/hhn/temp/project/provider/sql/selectTaskTable.sql b/src/main/java/hhn/temp/project/provider/sql/selectTaskTable.sql new file mode 100644 index 00000000..34d1e37a --- /dev/null +++ b/src/main/java/hhn/temp/project/provider/sql/selectTaskTable.sql @@ -0,0 +1 @@ +SELECT * FROM Task WHERE workerid = ? \ No newline at end of file diff --git a/src/main/java/hhn/temp/project/provider/sql/updateTaskTable.sql b/src/main/java/hhn/temp/project/provider/sql/updateTaskTable.sql new file mode 100644 index 00000000..e013b304 --- /dev/null +++ b/src/main/java/hhn/temp/project/provider/sql/updateTaskTable.sql @@ -0,0 +1 @@ +UPDATE Task SET name = ?, description = ?, taskstate = ? WHERE taskid = ? \ No newline at end of file diff --git a/test/hhn/temp/project/DatabaseGoodCasesTest.java b/test/hhn/temp/project/DatabaseGoodCasesTest.java index 53b4e250..43768733 100644 --- a/test/hhn/temp/project/DatabaseGoodCasesTest.java +++ b/test/hhn/temp/project/DatabaseGoodCasesTest.java @@ -27,6 +27,7 @@ public class DatabaseGoodCasesTest { databaseManager.connect(); Task task = databaseManager.getObject(1); + databaseManager.close(); } @Test @@ -37,11 +38,13 @@ public class DatabaseGoodCasesTest { databaseManager.connect(); databaseManager.saveObject(testTask); + databaseManager.close(); } @Test @DisplayName("Assert connecting to database") public void assertConnectToDatabase() throws SQLException, IOException { databaseManager.connect(); + databaseManager.close(); } } \ No newline at end of file From 625e089a36ac0d960be3eb24b6f354a70ec47f2a Mon Sep 17 00:00:00 2001 From: Riley Schneider <88947587+Ferryry@users.noreply.github.com> Date: Wed, 3 Dec 2025 22:10:24 +0100 Subject: [PATCH 04/11] Prepared new tests --- .../hhn/temp/project/provider/Database.java | 1 + .../project/provider/DatabaseManager.java | 4 +- .../project/provider/sql/insertTaskTable.sql | 2 +- .../temp/project/DatabaseGoodCasesTest.java | 41 ++++++++++++++++--- 4 files changed, 39 insertions(+), 9 deletions(-) diff --git a/src/main/java/hhn/temp/project/provider/Database.java b/src/main/java/hhn/temp/project/provider/Database.java index 2c44df3f..f11f507d 100644 --- a/src/main/java/hhn/temp/project/provider/Database.java +++ b/src/main/java/hhn/temp/project/provider/Database.java @@ -7,4 +7,5 @@ import java.sql.SQLException; public interface Database { public void connect() throws SQLException, IOException; public void close() throws SQLException; + public void clearDatabase() throws SQLException; } diff --git a/src/main/java/hhn/temp/project/provider/DatabaseManager.java b/src/main/java/hhn/temp/project/provider/DatabaseManager.java index e59789c4..044b9ead 100644 --- a/src/main/java/hhn/temp/project/provider/DatabaseManager.java +++ b/src/main/java/hhn/temp/project/provider/DatabaseManager.java @@ -9,6 +9,6 @@ import java.util.Collection; public interface DatabaseManager extends Database { public void saveObjects(Collection objects) throws ExecutionControl.NotImplementedException, IOException, SQLException; public Collection getObjects() throws ExecutionControl.NotImplementedException; - public void saveObject(E object) throws ExecutionControl.NotImplementedException, IOException, SQLException; - public E getObject(int id) throws ExecutionControl.NotImplementedException; + public void saveObject(E object) throws IOException, SQLException; + public E getObject(int id) throws SQLException; } \ No newline at end of file diff --git a/src/main/java/hhn/temp/project/provider/sql/insertTaskTable.sql b/src/main/java/hhn/temp/project/provider/sql/insertTaskTable.sql index bc00c911..aafc7901 100644 --- a/src/main/java/hhn/temp/project/provider/sql/insertTaskTable.sql +++ b/src/main/java/hhn/temp/project/provider/sql/insertTaskTable.sql @@ -1 +1 @@ -INSERT INTO Task (name, description, workerid, taskstate) VALUES (?, ?, ?, ?) \ No newline at end of file +INSERT INTO Task (taskid, name, description, workerid, taskstate) VALUES (?, ?, ?, ?, ?) \ No newline at end of file diff --git a/test/hhn/temp/project/DatabaseGoodCasesTest.java b/test/hhn/temp/project/DatabaseGoodCasesTest.java index 43768733..e47e0e8e 100644 --- a/test/hhn/temp/project/DatabaseGoodCasesTest.java +++ b/test/hhn/temp/project/DatabaseGoodCasesTest.java @@ -7,8 +7,12 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.*; + import java.io.IOException; import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Collection; public class DatabaseGoodCasesTest { @@ -16,23 +20,37 @@ public class DatabaseGoodCasesTest { private AssignmentManager manager; @BeforeEach - public void setup() { + public void setup() throws SQLException, IOException { databaseManager = new SimpleDatabaseManager<>(); + databaseManager.connect(); + databaseManager.clearDatabase(); manager = new AssignmentManager(); } @Test @DisplayName("Assert that the TestClass could be inserted into the database") - public void assertGetTestClass() throws SQLException, IOException, ExecutionControl.NotImplementedException { + public void assertGetTestClass() throws SQLException, IOException { databaseManager.connect(); - Task task = databaseManager.getObject(1); + + Task task = new Task(1, 1, "hi", "hi"); + + databaseManager.saveObject(task); + + Task taskNew = databaseManager.getObject(1); + + assertEquals(task.getTaskId(), taskNew.getTaskId()); + assertEquals(task.getName(), taskNew.getName()); + assertEquals(task.getDescription(), taskNew.getDescription()); + assertEquals(task.getWorkerId(), taskNew.getWorkerId()); + assertEquals(task.getTaskState(), taskNew.getTaskState()); + databaseManager.close(); } @Test @DisplayName("Assert that a simple Task could be inserted into the database") - public void assertInsertTestClass() throws SQLException, IOException, ExecutionControl.NotImplementedException { + public void assertInsertTask() throws SQLException, IOException, ExecutionControl.NotImplementedException { Task testTask = new Task(1, 1, "Hello World", "Description"); @@ -42,9 +60,20 @@ public class DatabaseGoodCasesTest { } @Test - @DisplayName("Assert connecting to database") - public void assertConnectToDatabase() throws SQLException, IOException { + @DisplayName("Assert that simple Tasks could be inserted into the database") + public void assertInsertMultipleTasks() throws SQLException, IOException, ExecutionControl.NotImplementedException { + + Task testTaskZero = new Task(1, 1, "Hello", "Description"); + Task testTaskOne = new Task(2, 2, "World", "Description"); + Task testTaskTwo = new Task(3, 3, "Hello World", "Description"); + + Collection tasks = new ArrayList<>(); + tasks.add(testTaskZero); + tasks.add(testTaskOne); + tasks.add(testTaskTwo); + databaseManager.connect(); + databaseManager.saveObjects(tasks); databaseManager.close(); } } \ No newline at end of file From 41e711ab74956082b4a769ab459b6b17017e9e03 Mon Sep 17 00:00:00 2001 From: Riley Schneider <88947587+Ferryry@users.noreply.github.com> Date: Wed, 3 Dec 2025 22:22:30 +0100 Subject: [PATCH 05/11] Added resultSet.next() --- .../provider/SimpleDatabaseManager.java | 43 +++++++++++++++---- 1 file changed, 34 insertions(+), 9 deletions(-) diff --git a/src/main/java/hhn/temp/project/provider/SimpleDatabaseManager.java b/src/main/java/hhn/temp/project/provider/SimpleDatabaseManager.java index 1542a698..481c2628 100644 --- a/src/main/java/hhn/temp/project/provider/SimpleDatabaseManager.java +++ b/src/main/java/hhn/temp/project/provider/SimpleDatabaseManager.java @@ -5,10 +5,7 @@ import hhn.temp.project.TaskState; import jdk.jshell.spi.ExecutionControl; import java.io.IOException; -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.PreparedStatement; -import java.sql.SQLException; +import java.sql.*; import java.util.Collection; public class SimpleDatabaseManager implements DatabaseManager { @@ -31,11 +28,11 @@ public class SimpleDatabaseManager implements DatabaseManager { return (i == 1) ? TaskState.FINISHED : TaskState.IN_PROGRESS; } - private String getQuery(QueryMode query) throws IOException { + private String getQuery(QueryMode query) { String queryString = null; switch (query) { - case INSERT -> queryString = "INSERT INTO Task (name, description, workerid, taskstate) VALUES (?, ?, ?, ?)"; + case INSERT -> queryString = "INSERT INTO Task (taskid, name, description, workerid, taskstate) VALUES (?, ?, ?, ?, ?)"; case UPDATE -> queryString = "UPDATE Task SET name = ?, description = ?, taskstate = ? WHERE taskid = ?"; case DELETE -> queryString = "DELETE FROM Task WHERE taskid = ?"; case SELECT -> queryString = "SELECT * FROM Task WHERE workerid = ?"; @@ -44,6 +41,12 @@ public class SimpleDatabaseManager implements DatabaseManager { return queryString; } + public void clearDatabase() throws SQLException { + try (Statement statement = connection.createStatement()) { + statement.executeUpdate("TRUNCATE TABLE Task;"); + } + } + @Override public void saveObjects(Collection objects) throws IOException, SQLException { for (E obj : objects) { @@ -58,7 +61,7 @@ public class SimpleDatabaseManager implements DatabaseManager { } @Override - public void saveObject(E object) throws IOException, SQLException { + public void saveObject(E object) throws SQLException { String query = getQuery(QueryMode.INSERT); if (object instanceof Task task) { @@ -68,13 +71,35 @@ public class SimpleDatabaseManager implements DatabaseManager { ps.setString(3, task.getDescription()); ps.setInt(4, task.getWorkerId()); ps.setInt(5, taskStateToInt(task.getTaskState())); + + ps.executeUpdate(); } } } @Override - public E getObject(int id) throws ExecutionControl.NotImplementedException { - throw new ExecutionControl.NotImplementedException("Not Implemented!"); + public E getObject(int id) throws SQLException { + String query = getQuery(QueryMode.SELECT); + Task task = null; + + try (PreparedStatement ps = connection.prepareStatement(query)) { + ps.setInt(1, id); + + ResultSet resultSet = ps.executeQuery(); + + if (resultSet.next()) { + + task = new Task( + resultSet.getInt("taskid"), + resultSet.getInt("workderid"), + resultSet.getString("name"), + resultSet.getString("description") + ); + task.setTaskState(intToTaskState(resultSet.getInt("taskstate"))); + } + } + + return (E) task; } @Override From daafd7d09e5a4bfa4ad7e08d5ca6622aa3c78a69 Mon Sep 17 00:00:00 2001 From: Riley Schneider <88947587+Ferryry@users.noreply.github.com> Date: Wed, 3 Dec 2025 22:24:04 +0100 Subject: [PATCH 06/11] Fixed a typo in the query --- .../java/hhn/temp/project/provider/SimpleDatabaseManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/hhn/temp/project/provider/SimpleDatabaseManager.java b/src/main/java/hhn/temp/project/provider/SimpleDatabaseManager.java index 481c2628..8ebd65ac 100644 --- a/src/main/java/hhn/temp/project/provider/SimpleDatabaseManager.java +++ b/src/main/java/hhn/temp/project/provider/SimpleDatabaseManager.java @@ -91,7 +91,7 @@ public class SimpleDatabaseManager implements DatabaseManager { task = new Task( resultSet.getInt("taskid"), - resultSet.getInt("workderid"), + resultSet.getInt("workerid"), resultSet.getString("name"), resultSet.getString("description") ); From 995fba6fce00f861b45c78c959fb2dc80b6c9d2a Mon Sep 17 00:00:00 2001 From: Riley Schneider <88947587+Ferryry@users.noreply.github.com> Date: Wed, 3 Dec 2025 22:29:52 +0100 Subject: [PATCH 07/11] Added a placeholder method to delete objects from the database. --- .../java/hhn/temp/project/provider/Database.java | 2 +- .../hhn/temp/project/provider/DatabaseManager.java | 7 ++++--- .../project/provider/SimpleDatabaseManager.java | 13 +++++++++---- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/main/java/hhn/temp/project/provider/Database.java b/src/main/java/hhn/temp/project/provider/Database.java index f11f507d..9ff971df 100644 --- a/src/main/java/hhn/temp/project/provider/Database.java +++ b/src/main/java/hhn/temp/project/provider/Database.java @@ -5,7 +5,7 @@ import java.nio.file.Path; import java.sql.SQLException; public interface Database { - public void connect() throws SQLException, IOException; + public void connect() throws SQLException; public void close() throws SQLException; public void clearDatabase() throws SQLException; } diff --git a/src/main/java/hhn/temp/project/provider/DatabaseManager.java b/src/main/java/hhn/temp/project/provider/DatabaseManager.java index 044b9ead..2335d83d 100644 --- a/src/main/java/hhn/temp/project/provider/DatabaseManager.java +++ b/src/main/java/hhn/temp/project/provider/DatabaseManager.java @@ -7,8 +7,9 @@ import java.sql.SQLException; import java.util.Collection; public interface DatabaseManager extends Database { - public void saveObjects(Collection objects) throws ExecutionControl.NotImplementedException, IOException, SQLException; - public Collection getObjects() throws ExecutionControl.NotImplementedException; - public void saveObject(E object) throws IOException, SQLException; + public void saveObjects(Collection objects) throws SQLException; + public Collection getObjects() throws SQLException; + public void saveObject(E object) throws SQLException; public E getObject(int id) throws SQLException; + public void deleteObject(int id) throws SQLException; } \ No newline at end of file diff --git a/src/main/java/hhn/temp/project/provider/SimpleDatabaseManager.java b/src/main/java/hhn/temp/project/provider/SimpleDatabaseManager.java index 8ebd65ac..f7baa11a 100644 --- a/src/main/java/hhn/temp/project/provider/SimpleDatabaseManager.java +++ b/src/main/java/hhn/temp/project/provider/SimpleDatabaseManager.java @@ -48,7 +48,7 @@ public class SimpleDatabaseManager implements DatabaseManager { } @Override - public void saveObjects(Collection objects) throws IOException, SQLException { + public void saveObjects(Collection objects) throws SQLException { for (E obj : objects) { saveObject(obj); } @@ -56,8 +56,8 @@ public class SimpleDatabaseManager implements DatabaseManager { @Override - public Collection getObjects() throws ExecutionControl.NotImplementedException { - throw new ExecutionControl.NotImplementedException("Not Implemented!"); + public Collection getObjects() throws SQLException { + return null; } @Override @@ -103,7 +103,12 @@ public class SimpleDatabaseManager implements DatabaseManager { } @Override - public void connect() throws SQLException, IOException { + public void deleteObject(int id) throws SQLException { + throw new SQLException("Not implemented yet"); + } + + @Override + public void connect() throws SQLException { connection = DriverManager.getConnection("jdbc:mysql://sql7.freesqldatabase.com/sql7810540?user=sql7810540&password=mXdJCFtDZz"); } From f2cc964d393966ede42025bc866472e4720756a0 Mon Sep 17 00:00:00 2001 From: Riley Schneider <88947587+Ferryry@users.noreply.github.com> Date: Wed, 3 Dec 2025 23:04:21 +0100 Subject: [PATCH 08/11] Added new tests that needs to be implemented. --- .../project/provider/DatabaseManager.java | 5 +- .../provider/SimpleDatabaseManager.java | 43 +++++++++------- .../temp/project/DatabaseBadCasesTest.java | 17 ++++++- .../temp/project/DatabaseGoodCasesTest.java | 49 ++++++++++++++++--- 4 files changed, 87 insertions(+), 27 deletions(-) diff --git a/src/main/java/hhn/temp/project/provider/DatabaseManager.java b/src/main/java/hhn/temp/project/provider/DatabaseManager.java index 2335d83d..e2defa3e 100644 --- a/src/main/java/hhn/temp/project/provider/DatabaseManager.java +++ b/src/main/java/hhn/temp/project/provider/DatabaseManager.java @@ -10,6 +10,7 @@ public interface DatabaseManager extends Database { public void saveObjects(Collection objects) throws SQLException; public Collection getObjects() throws SQLException; public void saveObject(E object) throws SQLException; - public E getObject(int id) throws SQLException; - public void deleteObject(int id) throws SQLException; + public E getObject(int taskId) throws SQLException; + public void deleteObject(int taskId) throws SQLException; + public E updateObject(int taskId, E object) throws SQLException; } \ No newline at end of file diff --git a/src/main/java/hhn/temp/project/provider/SimpleDatabaseManager.java b/src/main/java/hhn/temp/project/provider/SimpleDatabaseManager.java index f7baa11a..d13775e0 100644 --- a/src/main/java/hhn/temp/project/provider/SimpleDatabaseManager.java +++ b/src/main/java/hhn/temp/project/provider/SimpleDatabaseManager.java @@ -2,11 +2,11 @@ package hhn.temp.project.provider; import hhn.temp.project.Task; import hhn.temp.project.TaskState; -import jdk.jshell.spi.ExecutionControl; -import java.io.IOException; import java.sql.*; +import java.util.ArrayList; import java.util.Collection; +import java.util.List; public class SimpleDatabaseManager implements DatabaseManager { @@ -78,33 +78,42 @@ public class SimpleDatabaseManager implements DatabaseManager { } @Override - public E getObject(int id) throws SQLException { + public E getObject(int taskId) throws SQLException { String query = getQuery(QueryMode.SELECT); Task task = null; - try (PreparedStatement ps = connection.prepareStatement(query)) { - ps.setInt(1, id); + PreparedStatement ps = connection.prepareStatement(query); + ps.setInt(1, taskId); - ResultSet resultSet = ps.executeQuery(); + ResultSet resultSet = ps.executeQuery(); - if (resultSet.next()) { + if (resultSet.next()) { - task = new Task( - resultSet.getInt("taskid"), - resultSet.getInt("workerid"), - resultSet.getString("name"), - resultSet.getString("description") - ); - task.setTaskState(intToTaskState(resultSet.getInt("taskstate"))); - } + task = new Task( + resultSet.getInt("taskid"), + resultSet.getInt("workerid"), + resultSet.getString("name"), + resultSet.getString("description") + ); + task.setTaskState(intToTaskState(resultSet.getInt("taskstate"))); } return (E) task; } @Override - public void deleteObject(int id) throws SQLException { - throw new SQLException("Not implemented yet"); + public void deleteObject(int taskId) throws SQLException { + String query = getQuery(QueryMode.DELETE); + + try (PreparedStatement ps = connection.prepareStatement(query)) { + ps.setInt(1, taskId); + ps.executeUpdate(); + } + } + + @Override + public E updateObject(int taskId, E object) throws SQLException { + return null; } @Override diff --git a/test/hhn/temp/project/DatabaseBadCasesTest.java b/test/hhn/temp/project/DatabaseBadCasesTest.java index 6e73bd41..f00db386 100644 --- a/test/hhn/temp/project/DatabaseBadCasesTest.java +++ b/test/hhn/temp/project/DatabaseBadCasesTest.java @@ -6,6 +6,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import java.io.IOException; import java.sql.SQLException; import static org.junit.jupiter.api.Assertions.*; @@ -27,7 +28,21 @@ public class DatabaseBadCasesTest { } @BeforeEach - public void setup() { + public void setup() throws SQLException, IOException { databaseManager = new SimpleDatabaseManager<>(); + databaseManager.connect(); + databaseManager.clearDatabase(); + } + + @Test + @DisplayName("Gets an object that may not be existent") + public void assertObjectShouldNotBeExistent() throws SQLException { + assertNull(databaseManager.getObject(999)); + } + + @Test + @DisplayName("Updates an object that does not exist") + public void assertUpdateNonExistentObject() throws SQLException { + assertNull(databaseManager.updateObject(123, new Task(1, 2, "", ""))); } } \ No newline at end of file diff --git a/test/hhn/temp/project/DatabaseGoodCasesTest.java b/test/hhn/temp/project/DatabaseGoodCasesTest.java index e47e0e8e..0c16f0fb 100644 --- a/test/hhn/temp/project/DatabaseGoodCasesTest.java +++ b/test/hhn/temp/project/DatabaseGoodCasesTest.java @@ -2,7 +2,6 @@ package hhn.temp.project; import hhn.temp.project.provider.DatabaseManager; import hhn.temp.project.provider.SimpleDatabaseManager; -import jdk.jshell.spi.ExecutionControl; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -17,19 +16,17 @@ import java.util.Collection; public class DatabaseGoodCasesTest { private DatabaseManager databaseManager; - private AssignmentManager manager; @BeforeEach public void setup() throws SQLException, IOException { databaseManager = new SimpleDatabaseManager<>(); databaseManager.connect(); databaseManager.clearDatabase(); - manager = new AssignmentManager(); } @Test @DisplayName("Assert that the TestClass could be inserted into the database") - public void assertGetTestClass() throws SQLException, IOException { + public void assertGetTestClass() throws SQLException { databaseManager.connect(); @@ -48,9 +45,26 @@ public class DatabaseGoodCasesTest { databaseManager.close(); } + @Test + @DisplayName("Assert that an inserted and deleted task is not there anymore") + public void assertDeleteTest() throws SQLException { + + databaseManager.connect(); + + Task task = new Task(9, 1, "hi", "hi"); + + databaseManager.saveObject(task); + + databaseManager.deleteObject(9); + + databaseManager.getObject(9); + + databaseManager.close(); + } + @Test @DisplayName("Assert that a simple Task could be inserted into the database") - public void assertInsertTask() throws SQLException, IOException, ExecutionControl.NotImplementedException { + public void assertInsertTask() throws SQLException { Task testTask = new Task(1, 1, "Hello World", "Description"); @@ -60,8 +74,8 @@ public class DatabaseGoodCasesTest { } @Test - @DisplayName("Assert that simple Tasks could be inserted into the database") - public void assertInsertMultipleTasks() throws SQLException, IOException, ExecutionControl.NotImplementedException { + @DisplayName("Assert that multiple Tasks could be inserted into the database") + public void assertInsertMultipleTasks() throws SQLException { Task testTaskZero = new Task(1, 1, "Hello", "Description"); Task testTaskOne = new Task(2, 2, "World", "Description"); @@ -76,4 +90,25 @@ public class DatabaseGoodCasesTest { databaseManager.saveObjects(tasks); databaseManager.close(); } + + @Test + @DisplayName("Assert insert object and update it") + public void assertInsertUpdateTask() throws SQLException { + + int taskId = 1; + + Task testTask = new Task(taskId, 1, "Hello World", "Description"); + Task newTask = new Task(taskId, 1, "No World", "Description"); + + databaseManager.connect(); + databaseManager.saveObject(testTask); + newTask = databaseManager.updateObject(testTask.getTaskId(), newTask); + + assertNotNull(testTask); + + assertNotEquals(testTask.getDescription(), newTask.getDescription()); + assertEquals(testTask.getTaskId(), newTask.getTaskId()); + + databaseManager.close(); + } } \ No newline at end of file From 292d6c74c3b9f1b752ba27d73ce2c65eba085605 Mon Sep 17 00:00:00 2001 From: Riley Schneider <88947587+Ferryry@users.noreply.github.com> Date: Wed, 3 Dec 2025 23:17:31 +0100 Subject: [PATCH 09/11] Implemented Update method --- .../provider/SimpleDatabaseManager.java | 38 +++++++++++++++---- .../project/provider/sql/createTaskTable.sql | 3 +- .../temp/project/DatabaseBadCasesTest.java | 2 +- 3 files changed, 33 insertions(+), 10 deletions(-) diff --git a/src/main/java/hhn/temp/project/provider/SimpleDatabaseManager.java b/src/main/java/hhn/temp/project/provider/SimpleDatabaseManager.java index d13775e0..68d9d8e1 100644 --- a/src/main/java/hhn/temp/project/provider/SimpleDatabaseManager.java +++ b/src/main/java/hhn/temp/project/provider/SimpleDatabaseManager.java @@ -65,15 +65,14 @@ public class SimpleDatabaseManager implements DatabaseManager { String query = getQuery(QueryMode.INSERT); if (object instanceof Task task) { - try (PreparedStatement ps = connection.prepareStatement(query)) { - ps.setInt(1, task.getTaskId()); - ps.setString(2, task.getName()); - ps.setString(3, task.getDescription()); - ps.setInt(4, task.getWorkerId()); - ps.setInt(5, taskStateToInt(task.getTaskState())); + PreparedStatement ps = connection.prepareStatement(query); + ps.setInt(1, task.getTaskId()); + ps.setString(2, task.getName()); + ps.setString(3, task.getDescription()); + ps.setInt(4, task.getWorkerId()); + ps.setInt(5, taskStateToInt(task.getTaskState())); - ps.executeUpdate(); - } + ps.executeUpdate(); } } @@ -113,6 +112,29 @@ public class SimpleDatabaseManager implements DatabaseManager { @Override public E updateObject(int taskId, E object) throws SQLException { + String query = getQuery(QueryMode.UPDATE); + + if (object instanceof Task task) { + + if (taskId != task.getTaskId()) { + throw new IllegalArgumentException("Task ID does not equals Task ID from Task!"); + } + + PreparedStatement ps = connection.prepareStatement(query); + ps.setString(1, task.getName()); + ps.setString(2, task.getDescription()); + ps.setInt(3, taskStateToInt(task.getTaskState())); + ps.setInt(4, task.getTaskId()); + + int updated = ps.executeUpdate(); + + if (updated == 0) { + return null; + } + + return (E) task; + } + return null; } diff --git a/src/main/java/hhn/temp/project/provider/sql/createTaskTable.sql b/src/main/java/hhn/temp/project/provider/sql/createTaskTable.sql index 6e39b6f4..bc1ab8f5 100644 --- a/src/main/java/hhn/temp/project/provider/sql/createTaskTable.sql +++ b/src/main/java/hhn/temp/project/provider/sql/createTaskTable.sql @@ -1,5 +1,6 @@ CREATE TABLE Task ( - taskid INT AUTO_INCREMENT PRIMARY KEY, + id INT AUTO_INCREMENT PRIMARY KEY, + taskid INT, name VARCHAR(255) NOT NULL, description TEXT, workerid INT, diff --git a/test/hhn/temp/project/DatabaseBadCasesTest.java b/test/hhn/temp/project/DatabaseBadCasesTest.java index f00db386..a775001c 100644 --- a/test/hhn/temp/project/DatabaseBadCasesTest.java +++ b/test/hhn/temp/project/DatabaseBadCasesTest.java @@ -43,6 +43,6 @@ public class DatabaseBadCasesTest { @Test @DisplayName("Updates an object that does not exist") public void assertUpdateNonExistentObject() throws SQLException { - assertNull(databaseManager.updateObject(123, new Task(1, 2, "", ""))); + assertNull(databaseManager.updateObject(123, new Task(123, 2, "", ""))); } } \ No newline at end of file From e9b2ad0a57ce416aaba93aa3d89cae611035e78a Mon Sep 17 00:00:00 2001 From: Riley Schneider <88947587+Ferryry@users.noreply.github.com> Date: Mon, 8 Dec 2025 17:50:21 +0100 Subject: [PATCH 10/11] Heavily refactored DatabaseManager.java and SimpleDatabaseManager.java. Fully refactored DatabaseGoodCasesTest.java and DatabaseBadCasesTest.java. --- .../hhn/temp/project/provider/Database.java | 24 ++- .../project/provider/DatabaseManager.java | 117 ++++++++++- .../provider/SimpleDatabaseManager.java | 190 ++++++------------ .../temp/project/DatabaseBadCasesTest.java | 40 ++-- .../temp/project/DatabaseGoodCasesTest.java | 108 ++++------ 5 files changed, 254 insertions(+), 225 deletions(-) diff --git a/src/main/java/hhn/temp/project/provider/Database.java b/src/main/java/hhn/temp/project/provider/Database.java index 9ff971df..1f9a84b4 100644 --- a/src/main/java/hhn/temp/project/provider/Database.java +++ b/src/main/java/hhn/temp/project/provider/Database.java @@ -4,8 +4,26 @@ import java.io.IOException; import java.nio.file.Path; import java.sql.SQLException; +/** + * A database interface with basic database connectivity + * @author Riley Schneider + */ public interface Database { - public void connect() throws SQLException; - public void close() throws SQLException; - public void clearDatabase() throws SQLException; + /** + * Creates a connection to the database + * @throws SQLException Thrown if database error occurs + */ + void connect() throws SQLException; + + /** + * Closes a connection to the database + * @throws SQLException Thrown if database error occurs + */ + void close() throws SQLException; + + /** + * Clears the entire tables in the database and reset primary key counter to each table + * @throws SQLException Thrown if database error occurs + */ + void clearDatabase() throws SQLException; } diff --git a/src/main/java/hhn/temp/project/provider/DatabaseManager.java b/src/main/java/hhn/temp/project/provider/DatabaseManager.java index e2defa3e..a29a05cd 100644 --- a/src/main/java/hhn/temp/project/provider/DatabaseManager.java +++ b/src/main/java/hhn/temp/project/provider/DatabaseManager.java @@ -1,16 +1,115 @@ package hhn.temp.project.provider; -import jdk.jshell.spi.ExecutionControl; +import hhn.temp.project.Task; +import hhn.temp.project.Worker; -import java.io.IOException; import java.sql.SQLException; import java.util.Collection; -public interface DatabaseManager extends Database { - public void saveObjects(Collection objects) throws SQLException; - public Collection getObjects() throws SQLException; - public void saveObject(E object) throws SQLException; - public E getObject(int taskId) throws SQLException; - public void deleteObject(int taskId) throws SQLException; - public E updateObject(int taskId, E object) throws SQLException; +/** + * Simple Database Manager to handle simple command such as insertion, deletion, updating of Task and Worker objects. + * @author Riley Schneider + */ +public interface DatabaseManager extends Database { + /** + * Saves a Task object into the database + * @param task Task to be saved into the database + * @throws SQLException Thrown if database error occurs + */ + void saveTask(Task task) throws SQLException; + + /** + * Saves a collection of Task objects into the database + * @param tasks Tasks to be saved into the database + * @throws SQLException Thrown if database error occurs + */ + void saveTasks(Collection tasks) throws SQLException; + + /** + * Saves a Worker object into the database + * @param worker Worker to be saved into the database + * @throws SQLException Thrown if database error occurs + */ + void saveWorker(Worker worker) throws SQLException; + + /** + * Saves a collection Worker objects into the database + * @param workers Workers to be saved into the database + * @throws SQLException Thrown if database error occurs + */ + void saveWorkers(Collection workers) throws SQLException; + + /** + * Updates a Task object that already exists in the database + * @param taskId The ID of the given task + * @param newTaskObject The new Task object that will overwrite the existent task on database + * @throws SQLException Thrown if database error occurs + */ + void updateTask(int taskId, Task newTaskObject) throws SQLException; + + /** + * Updates a Worker object that already exists in the database + * @param workerId The ID of the given worker + * @param newWorkerObject The new Worker object that will overwrite the existent task on database + * @throws SQLException Thrown if database error occurs + */ + void updateWorker(int workerId, Worker newWorkerObject) throws SQLException; + + /** + * Deletes a task from the database + * @param taskId The ID of the given task that needs to be deleted + * @throws SQLException Thrown if database error occurs + */ + void deleteTask(int taskId) throws SQLException; + + /** + * Deletes a worker from the database + * @param workerId The ID of the given worker that needs to be deleted + * @throws SQLException Thrown if database error occurs + */ + void deleteWorker(int workerId) throws SQLException; + + /** + * Gets a collection of all tasks available in the database + * @return A collection of tasks (empty if no task available) + * @throws SQLException Thrown if database error occurs + */ + Collection getTasks() throws SQLException; + + /** + * Gets a collection of all workers available in the database + * @return A collection of workers (empty if no task available) + * @throws SQLException Thrown if database error occurs + */ + Collection getWorkers() throws SQLException; + + /** + * Gets a task given by its ID from the database + * @param taskId The task ID + * @return A task from the database (NULL if no task found) + * @throws SQLException Thrown if database error occurs + */ + Task getTaskByTaskId(int taskId) throws SQLException; + + /** + * Gets a worker given by its ID from the database + * @param workerId The worker ID + * @return A worker from the database (NULL if no worker found) + * @throws SQLException Thrown if database error occurs + */ + Worker getWorkerByWorkerId(int workerId) throws SQLException; + + /** + * Gets the total number of available tasks in the database. + * @return The total number of tasks (0 = zero entries; -1 = error) + * @throws SQLException Thrown if database error occurs + */ + int getTotalNumberOfTasks() throws SQLException; + + /** + * Gets the total number of available workers in the database. + * @return The total number of workers (0 = zero entries; -1 = error) + * @throws SQLException Thrown if database error occurs + */ + int getTotalNumberOfWorkers() throws SQLException; } \ No newline at end of file diff --git a/src/main/java/hhn/temp/project/provider/SimpleDatabaseManager.java b/src/main/java/hhn/temp/project/provider/SimpleDatabaseManager.java index 68d9d8e1..4134a586 100644 --- a/src/main/java/hhn/temp/project/provider/SimpleDatabaseManager.java +++ b/src/main/java/hhn/temp/project/provider/SimpleDatabaseManager.java @@ -1,152 +1,94 @@ package hhn.temp.project.provider; import hhn.temp.project.Task; -import hhn.temp.project.TaskState; +import hhn.temp.project.Worker; import java.sql.*; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; +import java.util.*; -public class SimpleDatabaseManager implements DatabaseManager { +public class SimpleDatabaseManager implements DatabaseManager { - private Connection connection; - - private enum QueryMode { - SELECT, INSERT, DELETE, UPDATE + @Override + public void saveTask(Task task) throws SQLException { + throw new SQLException(); } - private int taskStateToInt(TaskState taskState) { - return (taskState == TaskState.FINISHED) ? 1 : 0; + @Override + public void saveTasks(Collection tasks) throws SQLException { + throw new SQLException(); } - private TaskState intToTaskState(int i) { - if (i < 0 || i > 1) { - throw new IllegalArgumentException("Integer may only bet 0 or 1"); - } - - return (i == 1) ? TaskState.FINISHED : TaskState.IN_PROGRESS; + @Override + public void saveWorker(Worker worker) throws SQLException { + throw new SQLException(); } - private String getQuery(QueryMode query) { - String queryString = null; + @Override + public void saveWorkers(Collection workers) throws SQLException { + throw new SQLException(); + } - switch (query) { - case INSERT -> queryString = "INSERT INTO Task (taskid, name, description, workerid, taskstate) VALUES (?, ?, ?, ?, ?)"; - case UPDATE -> queryString = "UPDATE Task SET name = ?, description = ?, taskstate = ? WHERE taskid = ?"; - case DELETE -> queryString = "DELETE FROM Task WHERE taskid = ?"; - case SELECT -> queryString = "SELECT * FROM Task WHERE workerid = ?"; - } + @Override + public void updateTask(int taskId, Task newTaskObject) throws SQLException { + throw new SQLException(); + } - return queryString; + @Override + public void updateWorker(int workerId, Worker newWorkerObject) throws SQLException { + throw new SQLException(); + } + + @Override + public void deleteTask(int taskId) throws SQLException { + throw new SQLException(); + } + + @Override + public void deleteWorker(int workerId) throws SQLException { + throw new SQLException(); + } + + @Override + public Collection getTasks() throws SQLException { + throw new SQLException(); + } + + @Override + public Collection getWorkers() throws SQLException { + throw new SQLException(); + } + + @Override + public Task getTaskByTaskId(int taskId) throws SQLException { + return new Task(0, 0, null, null); + } + + @Override + public Worker getWorkerByWorkerId(int workerId) throws SQLException { + return new Worker(null, 0); + } + + @Override + public int getTotalNumberOfTasks() throws SQLException { + return -1; + } + + @Override + public int getTotalNumberOfWorkers() throws SQLException { + return -1; } public void clearDatabase() throws SQLException { - try (Statement statement = connection.createStatement()) { - statement.executeUpdate("TRUNCATE TABLE Task;"); - } - } - - @Override - public void saveObjects(Collection objects) throws SQLException { - for (E obj : objects) { - saveObject(obj); - } - } - - - @Override - public Collection getObjects() throws SQLException { - return null; - } - - @Override - public void saveObject(E object) throws SQLException { - String query = getQuery(QueryMode.INSERT); - - if (object instanceof Task task) { - PreparedStatement ps = connection.prepareStatement(query); - ps.setInt(1, task.getTaskId()); - ps.setString(2, task.getName()); - ps.setString(3, task.getDescription()); - ps.setInt(4, task.getWorkerId()); - ps.setInt(5, taskStateToInt(task.getTaskState())); - - ps.executeUpdate(); - } - } - - @Override - public E getObject(int taskId) throws SQLException { - String query = getQuery(QueryMode.SELECT); - Task task = null; - - PreparedStatement ps = connection.prepareStatement(query); - ps.setInt(1, taskId); - - ResultSet resultSet = ps.executeQuery(); - - if (resultSet.next()) { - - task = new Task( - resultSet.getInt("taskid"), - resultSet.getInt("workerid"), - resultSet.getString("name"), - resultSet.getString("description") - ); - task.setTaskState(intToTaskState(resultSet.getInt("taskstate"))); - } - - return (E) task; - } - - @Override - public void deleteObject(int taskId) throws SQLException { - String query = getQuery(QueryMode.DELETE); - - try (PreparedStatement ps = connection.prepareStatement(query)) { - ps.setInt(1, taskId); - ps.executeUpdate(); - } - } - - @Override - public E updateObject(int taskId, E object) throws SQLException { - String query = getQuery(QueryMode.UPDATE); - - if (object instanceof Task task) { - - if (taskId != task.getTaskId()) { - throw new IllegalArgumentException("Task ID does not equals Task ID from Task!"); - } - - PreparedStatement ps = connection.prepareStatement(query); - ps.setString(1, task.getName()); - ps.setString(2, task.getDescription()); - ps.setInt(3, taskStateToInt(task.getTaskState())); - ps.setInt(4, task.getTaskId()); - - int updated = ps.executeUpdate(); - - if (updated == 0) { - return null; - } - - return (E) task; - } - - return null; + throw new SQLException(); } @Override public void connect() throws SQLException { - connection = DriverManager.getConnection("jdbc:mysql://sql7.freesqldatabase.com/sql7810540?user=sql7810540&password=mXdJCFtDZz"); + throw new SQLException(); } @Override public void close() throws SQLException { - if (connection != null) { - connection.close(); - } + throw new SQLException(); } } diff --git a/test/hhn/temp/project/DatabaseBadCasesTest.java b/test/hhn/temp/project/DatabaseBadCasesTest.java index a775001c..bda06a3f 100644 --- a/test/hhn/temp/project/DatabaseBadCasesTest.java +++ b/test/hhn/temp/project/DatabaseBadCasesTest.java @@ -13,36 +13,34 @@ import static org.junit.jupiter.api.Assertions.*; public class DatabaseBadCasesTest { - private DatabaseManager databaseManager; - - public class TestClass { - private int id; - private String dataString; - private int dataInteger; - - public TestClass(int id, String dataString, int dataInteger) { - this.id = id; - this.dataString = dataString; - this.dataInteger = dataInteger; - } - } + private DatabaseManager databaseManager; @BeforeEach - public void setup() throws SQLException, IOException { - databaseManager = new SimpleDatabaseManager<>(); + public void setup() throws SQLException { + databaseManager = new SimpleDatabaseManager(); databaseManager.connect(); databaseManager.clearDatabase(); } @Test - @DisplayName("Gets an object that may not be existent") - public void assertObjectShouldNotBeExistent() throws SQLException { - assertNull(databaseManager.getObject(999)); + @DisplayName("Inserting Tasks with the same ID") + public void insertTasksWithTheSameId() throws SQLException { + Task task = new Task(10, 10, "ABC", "XYZ"); + Task taskFaker = new Task(10, 5, "ABC!", "XYZ!"); + + databaseManager.saveTask(task); + + databaseManager.saveTask(taskFaker); } @Test - @DisplayName("Updates an object that does not exist") - public void assertUpdateNonExistentObject() throws SQLException { - assertNull(databaseManager.updateObject(123, new Task(123, 2, "", ""))); + @DisplayName("Inserting Workers with the same ID") + public void insertWorkersWithTheSameId() throws SQLException { + Worker worker = new Worker("Worker-1", 1); + Worker workerFaker = new Worker("Worker-100", 1); + + databaseManager.saveWorker(worker); + + databaseManager.saveWorker(workerFaker); } } \ No newline at end of file diff --git a/test/hhn/temp/project/DatabaseGoodCasesTest.java b/test/hhn/temp/project/DatabaseGoodCasesTest.java index 0c16f0fb..b72b00be 100644 --- a/test/hhn/temp/project/DatabaseGoodCasesTest.java +++ b/test/hhn/temp/project/DatabaseGoodCasesTest.java @@ -12,103 +12,75 @@ import java.io.IOException; import java.sql.SQLException; import java.util.ArrayList; import java.util.Collection; +import java.util.List; public class DatabaseGoodCasesTest { - private DatabaseManager databaseManager; + private DatabaseManager databaseManager; @BeforeEach - public void setup() throws SQLException, IOException { - databaseManager = new SimpleDatabaseManager<>(); + public void setup() throws SQLException { + databaseManager = new SimpleDatabaseManager(); databaseManager.connect(); databaseManager.clearDatabase(); } @Test - @DisplayName("Assert that the TestClass could be inserted into the database") - public void assertGetTestClass() throws SQLException { + @DisplayName("Inserting test task into the database and receiving back the same test task") + public void insertTaskAndReceiveItBackTest() throws SQLException { + Task task = new Task(123, 10, "Hello World", "Doing Something, hell yeah!"); - databaseManager.connect(); + databaseManager.saveTask(task); - Task task = new Task(1, 1, "hi", "hi"); + Task reTask = databaseManager.getTaskByTaskId(task.getTaskId()); - databaseManager.saveObject(task); + assertNotNull(reTask); + assertEquals(task.getTaskId(), reTask.getTaskId()); + assertEquals(task.getDescription(), reTask.getDescription()); + assertEquals(task.getName(), reTask.getName()); + assertEquals(task.getWorkerId(), reTask.getWorkerId()); - Task taskNew = databaseManager.getObject(1); - - assertEquals(task.getTaskId(), taskNew.getTaskId()); - assertEquals(task.getName(), taskNew.getName()); - assertEquals(task.getDescription(), taskNew.getDescription()); - assertEquals(task.getWorkerId(), taskNew.getWorkerId()); - assertEquals(task.getTaskState(), taskNew.getTaskState()); - - databaseManager.close(); + assertEquals(1, databaseManager.getTotalNumberOfTasks()); } @Test - @DisplayName("Assert that an inserted and deleted task is not there anymore") - public void assertDeleteTest() throws SQLException { + @DisplayName("Inserting test worker into the database and receiving back the same test worker") + public void insertWorkerAndReceivedItBackTest() throws SQLException { + Worker worker = new Worker("Worker-01", 12345678); - databaseManager.connect(); + databaseManager.saveWorker(worker); - Task task = new Task(9, 1, "hi", "hi"); + Worker reWorker = databaseManager.getWorkerByWorkerId(worker.getId()); - databaseManager.saveObject(task); + assertNotNull(reWorker); - databaseManager.deleteObject(9); - - databaseManager.getObject(9); - - databaseManager.close(); + assertEquals(worker.getId(), reWorker.getId()); + assertEquals(worker.getName(), reWorker.getName()); } @Test - @DisplayName("Assert that a simple Task could be inserted into the database") - public void assertInsertTask() throws SQLException { + @DisplayName("Clearing the database (Task and Worker) test") + public void clearDatabaseTest() throws SQLException, InterruptedException { + Task task1 = new Task(10, 5, "Hello", "World"); + Task task2 = new Task(9, 4, "Hochschule", "Heilbronn"); + Task task3 = new Task(8, 9, "Gangnam", "Style"); + Collection tasks = List.of(task1, task2, task3); - Task testTask = new Task(1, 1, "Hello World", "Description"); + Worker worker1 = new Worker("ABC", 2); + Worker worker2 = new Worker("XYZ", 9); + Collection workers = List.of(worker1, worker2); - databaseManager.connect(); - databaseManager.saveObject(testTask); - databaseManager.close(); - } + databaseManager.saveTasks(tasks); + databaseManager.saveWorkers(workers); - @Test - @DisplayName("Assert that multiple Tasks could be inserted into the database") - public void assertInsertMultipleTasks() throws SQLException { + Thread.sleep(500); - Task testTaskZero = new Task(1, 1, "Hello", "Description"); - Task testTaskOne = new Task(2, 2, "World", "Description"); - Task testTaskTwo = new Task(3, 3, "Hello World", "Description"); + assertEquals(tasks.size(), databaseManager.getTotalNumberOfTasks()); + assertEquals(workers.size(), databaseManager.getTotalNumberOfWorkers()); - Collection tasks = new ArrayList<>(); - tasks.add(testTaskZero); - tasks.add(testTaskOne); - tasks.add(testTaskTwo); + databaseManager.clearDatabase(); - databaseManager.connect(); - databaseManager.saveObjects(tasks); - databaseManager.close(); - } - - @Test - @DisplayName("Assert insert object and update it") - public void assertInsertUpdateTask() throws SQLException { - - int taskId = 1; - - Task testTask = new Task(taskId, 1, "Hello World", "Description"); - Task newTask = new Task(taskId, 1, "No World", "Description"); - - databaseManager.connect(); - databaseManager.saveObject(testTask); - newTask = databaseManager.updateObject(testTask.getTaskId(), newTask); - - assertNotNull(testTask); - - assertNotEquals(testTask.getDescription(), newTask.getDescription()); - assertEquals(testTask.getTaskId(), newTask.getTaskId()); - - databaseManager.close(); + assertEquals(0, databaseManager.getTotalNumberOfTasks()); + assertEquals(0, databaseManager.getTotalNumberOfWorkers()); } } \ No newline at end of file From 0dd7fd4687e1b4432de208c3335d50659dc5b8ee Mon Sep 17 00:00:00 2001 From: Riley Schneider <88947587+Ferryry@users.noreply.github.com> Date: Mon, 8 Dec 2025 18:06:43 +0100 Subject: [PATCH 11/11] Provide mock-like DB manager for integration testing --- .../provider/SimpleDatabaseManager.java | 133 +++++++++++++++--- 1 file changed, 116 insertions(+), 17 deletions(-) diff --git a/src/main/java/hhn/temp/project/provider/SimpleDatabaseManager.java b/src/main/java/hhn/temp/project/provider/SimpleDatabaseManager.java index 4134a586..e53ff173 100644 --- a/src/main/java/hhn/temp/project/provider/SimpleDatabaseManager.java +++ b/src/main/java/hhn/temp/project/provider/SimpleDatabaseManager.java @@ -8,87 +8,186 @@ import java.util.*; public class SimpleDatabaseManager implements DatabaseManager { + private boolean connected = false; + private Map temporaryTaskList = new HashMap(); + private Map temporaryWorkerList = new HashMap<>(); + @Override public void saveTask(Task task) throws SQLException { - throw new SQLException(); + if (!connected) { + throw new SQLException("[CONNECTION FAILED] Instance is not connected to database."); + } + + if (!temporaryTaskList.containsKey(task.getTaskId())) { + temporaryTaskList.put(task.getTaskId(), task); + } else { + throw new SQLException("[INSERTION FAILED] Task with the same Task ID already exists."); + } } @Override public void saveTasks(Collection tasks) throws SQLException { - throw new SQLException(); + for (Task task : tasks) { + saveTask(task); + } } @Override public void saveWorker(Worker worker) throws SQLException { - throw new SQLException(); + if (!connected) { + throw new SQLException("[CONNECTION FAILED] Instance is not connected to database."); + } + + if (!temporaryWorkerList.containsKey(worker.getId())) { + temporaryWorkerList.put(worker.getId(), worker); + } else { + throw new SQLException("[INSERTION FAILED] Task with the same Task ID already exists."); + } } @Override public void saveWorkers(Collection workers) throws SQLException { - throw new SQLException(); + for (Worker worker : workers) { + saveWorker(worker); + } } @Override public void updateTask(int taskId, Task newTaskObject) throws SQLException { - throw new SQLException(); + if (!connected) { + throw new SQLException("[CONNECTION FAILED] Instance is not connected to database."); + } + + if (temporaryTaskList.containsKey(taskId) && newTaskObject.getTaskId() == taskId) { + temporaryTaskList.remove(taskId); + temporaryTaskList.put(taskId, newTaskObject); + return; + } + + throw new SQLException("[UPDATE FAILED] Task ID not found OR Task ID does not equal New Task ID."); } @Override public void updateWorker(int workerId, Worker newWorkerObject) throws SQLException { - throw new SQLException(); + if (!connected) { + throw new SQLException("[CONNECTION FAILED] Instance is not connected to database."); + } + + if (temporaryWorkerList.containsKey(workerId) && newWorkerObject.getId() == workerId) { + temporaryWorkerList.remove(workerId); + temporaryWorkerList.put(workerId, newWorkerObject); + return; + } + + throw new SQLException("[UPDATE FAILED] Worker ID not found OR Worker ID does not equal New Worker ID."); } @Override public void deleteTask(int taskId) throws SQLException { - throw new SQLException(); + if (!connected) { + throw new SQLException("[CONNECTION FAILED] Instance is not connected to database."); + } + + if (temporaryTaskList.containsKey(taskId)) { + temporaryTaskList.remove(taskId); + return; + } + + throw new SQLException("[DELETION FAILED] Could not find Task ID. Nothing to delete."); } @Override public void deleteWorker(int workerId) throws SQLException { - throw new SQLException(); + if (!connected) { + throw new SQLException("[CONNECTION FAILED] Instance is not connected to database."); + } + + if (temporaryWorkerList.containsKey(workerId)) { + temporaryWorkerList.remove(workerId); + return; + } + + throw new SQLException("[DELETION FAILED] Could not find Worker ID. Nothing to delete."); } @Override public Collection getTasks() throws SQLException { - throw new SQLException(); + if (!connected) { + throw new SQLException("[CONNECTION FAILED] Instance is not connected to database."); + } + + return temporaryTaskList.values(); } @Override public Collection getWorkers() throws SQLException { - throw new SQLException(); + if (!connected) { + throw new SQLException("[CONNECTION FAILED] Instance is not connected to database."); + } + + return temporaryWorkerList.values(); } @Override public Task getTaskByTaskId(int taskId) throws SQLException { - return new Task(0, 0, null, null); + if (!connected) { + throw new SQLException("[CONNECTION FAILED] Instance is not connected to database."); + } + + if (temporaryTaskList.containsKey(taskId)) { + return temporaryTaskList.get(taskId); + } + + throw new SQLException("[SELECTION FAILED] Could not find Task ID. Nothing to get."); } @Override public Worker getWorkerByWorkerId(int workerId) throws SQLException { - return new Worker(null, 0); + if (!connected) { + throw new SQLException("[CONNECTION FAILED] Instance is not connected to database."); + } + + if (temporaryWorkerList.containsKey(workerId)) { + return temporaryWorkerList.get(workerId); + } + + throw new SQLException("[SELECTION FAILED] Could not find Worker ID. Nothing to get."); } @Override public int getTotalNumberOfTasks() throws SQLException { - return -1; + if (!connected) { + throw new SQLException("[CONNECTION FAILED] Instance is not connected to database."); + } + + return temporaryTaskList.size(); } @Override public int getTotalNumberOfWorkers() throws SQLException { - return -1; + if (!connected) { + throw new SQLException("[CONNECTION FAILED] Instance is not connected to database."); + } + + return temporaryWorkerList.size(); } public void clearDatabase() throws SQLException { - throw new SQLException(); + if (!connected) { + throw new SQLException("[CONNECTION FAILED] Instance is not connected to database."); + } + + temporaryTaskList.clear(); + temporaryWorkerList.clear(); } @Override public void connect() throws SQLException { - throw new SQLException(); + connected = true; } @Override public void close() throws SQLException { - throw new SQLException(); + connected = false; } }