Compare commits
21 Commits
97990a3e76
...
database
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0f23b15ad4 | ||
|
|
3050405792 | ||
| e667389694 | |||
| 6ac08e2db1 | |||
| 20afbbf461 | |||
| 0b74bf5eea | |||
| 6ccb68285f | |||
| 0c83baec46 | |||
| 654305f2cd | |||
| a390509f87 | |||
| 85446bc230 | |||
| f0da7b0f9a | |||
| c85d55ce7d | |||
| a875f24e83 | |||
| 760009b4d6 | |||
| bb71c7e329 | |||
|
|
35e22bba99 | ||
|
|
3344ba67cc | ||
| 2af4f4b7a4 | |||
| 79df3d300e | |||
| 7201f66214 |
2
.idea/gradle.xml
generated
2
.idea/gradle.xml
generated
@@ -5,6 +5,8 @@
|
||||
<option name="linkedExternalProjectsSettings">
|
||||
<GradleProjectSettings>
|
||||
<option name="externalProjectPath" value="$PROJECT_DIR$" />
|
||||
<option name="gradleHome" value="C:\Gradle\gradle-9.0.0" />
|
||||
<option name="gradleJvm" value="17" />
|
||||
<option name="modules">
|
||||
<set>
|
||||
<option value="$PROJECT_DIR$" />
|
||||
|
||||
2
.idea/misc.xml
generated
2
.idea/misc.xml
generated
@@ -4,7 +4,7 @@
|
||||
<component name="FrameworkDetectionExcludesConfiguration">
|
||||
<file type="web" url="file://$PROJECT_DIR$" />
|
||||
</component>
|
||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="homebrew-17" project-jdk-type="JavaSDK">
|
||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="17" project-jdk-type="JavaSDK">
|
||||
<output url="file://$PROJECT_DIR$/out" />
|
||||
</component>
|
||||
</project>
|
||||
1
.idea/modules.xml
generated
1
.idea/modules.xml
generated
@@ -2,6 +2,7 @@
|
||||
<project version="4">
|
||||
<component name="ProjectModuleManager">
|
||||
<modules>
|
||||
<module fileurl="file://$PROJECT_DIR$/.idea/modules/Template.iml" filepath="$PROJECT_DIR$/.idea/modules/Template.iml" />
|
||||
<module fileurl="file://$PROJECT_DIR$/.idea/modules/Template.test.iml" filepath="$PROJECT_DIR$/.idea/modules/Template.test.iml" />
|
||||
</modules>
|
||||
</component>
|
||||
|
||||
40
README.md
40
README.md
@@ -1,2 +1,40 @@
|
||||
# Temp-Java-Gradle
|
||||
@Author Kevin Schoenmayer, Riley Schneider, Can Oezdemir, Lasse Grosshans
|
||||
|
||||
Volle Dokumentation mit Bildern, Vorbereitungen und Klassendiagramm unter
|
||||
https://docs.google.com/document/d/1iPl3XoZdvn1zqYCNlzHklEf_bRBGnQm41bAEaWz_s0w/edit?usp=sharing
|
||||
|
||||
|
||||
Voraussetzungen:
|
||||
Docker (inkl. Docker Compose)
|
||||
Java 17
|
||||
Git
|
||||
|
||||
Projekt bauen, testen und starten:
|
||||
|
||||
1. Projekt klonen:
|
||||
git clone https://home.luithardt.cloud:5400/KevinSchoenmayer/GseTDDUebungKCLR
|
||||
|
||||
2. Zu ...\GseTDDUebungKCLR\docker in cmd navigieren
|
||||
Docker starten:
|
||||
docker compose up -d
|
||||
|
||||
3. Tabellenerstellung fuer die Testumgebung:
|
||||
Verbinden Sie sich mit dem Programm Ihrer Wahl mit der Datenbank (z.B. HeidiSQL). Die Anmeldeinformationen finden Sie in der compose.yml-Datei.
|
||||
Fuehren Sie nun auf der Datenbank folgende SQL-Befehle aus dieser Dateien aus:
|
||||
resources\sql\createTaskTable.sql
|
||||
resources\sql\createWorkerTable.sql
|
||||
Sie sollten in Ihrer Datenbank nun zwei neue Tabellen sehen: Task und Worker. Wenn dem so sei, koennen Sie mit Punkt (6) fortfahren.
|
||||
|
||||
4. Projekt starten:
|
||||
gradle cleanRun --console=plain --quiet
|
||||
Jetzt werden die Tests durchgefuehrt und in
|
||||
...\GseTDDUebungKCLR\build\reports\tests\index.html
|
||||
gespeichert (genaue Adresse fuer .html wird automatisch angegeben),
|
||||
die Jacoco Test Coverage erzeugt und in
|
||||
...\GseTDDUebungKCLR\build\reports\jacoco\html\index.html
|
||||
gespeichert (genaue Adresse fuer .html wird automatisch angegeben),
|
||||
und das Programm in der Command Line gestartet.
|
||||
|
||||
Nutze ?, um dir die Befehle anzeigen zu lassen.
|
||||
|
||||
|
||||
|
||||
103
build.gradle
103
build.gradle
@@ -1,6 +1,7 @@
|
||||
plugins {
|
||||
id 'java'
|
||||
id 'jacoco'
|
||||
id 'application'
|
||||
}
|
||||
|
||||
group = 'hhn.temp.project'
|
||||
@@ -17,11 +18,6 @@ dependencies {
|
||||
implementation 'com.mysql:mysql-connector-j:9.5.0'
|
||||
}
|
||||
|
||||
jacoco {
|
||||
toolVersion = '0.8.13'
|
||||
reportsDirectory.set(layout.buildDirectory.dir('customJacocoReportDir'))
|
||||
}
|
||||
|
||||
sourceSets {
|
||||
main {
|
||||
java {
|
||||
@@ -35,6 +31,7 @@ sourceSets {
|
||||
}
|
||||
}
|
||||
|
||||
// Test configuration
|
||||
test {
|
||||
useJUnitPlatform()
|
||||
testLogging {
|
||||
@@ -42,13 +39,105 @@ test {
|
||||
exceptionFormat "full"
|
||||
showStandardStreams = true
|
||||
}
|
||||
|
||||
// Generate test reports in a specific location
|
||||
reports {
|
||||
html.outputLocation.set(layout.buildDirectory.dir("reports/tests"))
|
||||
junitXml.outputLocation.set(layout.buildDirectory.dir("reports/tests"))
|
||||
}
|
||||
|
||||
finalizedBy jacocoTestReport
|
||||
}
|
||||
|
||||
// Jacoco configuration
|
||||
jacoco {
|
||||
toolVersion = '0.8.13'
|
||||
reportsDirectory.set(layout.buildDirectory.dir('reports/jacoco'))
|
||||
}
|
||||
|
||||
jacocoTestReport {
|
||||
dependsOn test
|
||||
reports {
|
||||
xml.required = false
|
||||
xml.required = true
|
||||
csv.required = false
|
||||
html.outputLocation.set(layout.buildDirectory.dir('jacocoHtml'))
|
||||
html.required = true
|
||||
html.outputLocation.set(layout.buildDirectory.dir("reports/jacoco/html"))
|
||||
}
|
||||
}
|
||||
|
||||
// Application configuration
|
||||
application {
|
||||
mainClass = "hhn.temp.project.Main"
|
||||
}
|
||||
|
||||
// Custom task to print information after build
|
||||
task printInfo {
|
||||
dependsOn test, jacocoTestReport
|
||||
doLast {
|
||||
println("\n" + "="*50)
|
||||
println("BUILD AND TESTS COMPLETED SUCCESSFULLY!")
|
||||
println("="*50)
|
||||
println("\nTest Results Location:")
|
||||
println(" HTML: ${layout.buildDirectory.get()}/reports/tests/index.html")
|
||||
println(" XML: ${layout.buildDirectory.get()}/reports/tests/TEST-*.xml")
|
||||
|
||||
println("\nJacoco Coverage Reports:")
|
||||
println(" HTML: ${layout.buildDirectory.get()}/reports/jacoco/html/index.html")
|
||||
println(" XML: ${layout.buildDirectory.get()}/reports/jacoco/test/jacocoTestReport.xml")
|
||||
|
||||
println("\nTo run the application:")
|
||||
println(" gradle run --console=plain")
|
||||
println("\nTo run tests and generate coverage reports:")
|
||||
println(" gradle test jacocoTestReport")
|
||||
println("="*50)
|
||||
}
|
||||
}
|
||||
|
||||
// Custom task that combines clean, test, jacocoTestReport
|
||||
task cleanTestReport {
|
||||
dependsOn clean, test, jacocoTestReport
|
||||
description = 'Clean build and run tests with coverage reports'
|
||||
group = 'verification'
|
||||
}
|
||||
|
||||
// Configure the standard run task
|
||||
run {
|
||||
dependsOn test, jacocoTestReport
|
||||
standardInput = System.in
|
||||
|
||||
doFirst {
|
||||
println("\n" + "="*50)
|
||||
println("TESTS COMPLETED - STARTING APPLICATION...")
|
||||
println("="*50)
|
||||
}
|
||||
}
|
||||
|
||||
// Create an alias task
|
||||
task cleanRun {
|
||||
dependsOn clean, run
|
||||
description = 'Clean build, run tests with coverage, then run the application'
|
||||
group = 'application'
|
||||
}
|
||||
|
||||
// Alternative: Create a separate task that doesn't chain dependencies
|
||||
task startApp(type: JavaExec) {
|
||||
description = 'Start the application (without running tests first)'
|
||||
group = 'application'
|
||||
|
||||
classpath = sourceSets.main.runtimeClasspath
|
||||
mainClass = application.mainClass
|
||||
standardInput = System.in
|
||||
standardOutput = System.out
|
||||
|
||||
// Configure to run in foreground
|
||||
systemProperties System.getProperties()
|
||||
|
||||
doFirst {
|
||||
println("\n" + "="*50)
|
||||
println("STARTING APPLICATION...")
|
||||
println("="*50)
|
||||
}
|
||||
}
|
||||
|
||||
// Make test and jacocoTestReport trigger the info print
|
||||
test.finalizedBy printInfo
|
||||
19
docker/compose.yml
Normal file
19
docker/compose.yml
Normal file
@@ -0,0 +1,19 @@
|
||||
version: "3.9"
|
||||
|
||||
services:
|
||||
mysql:
|
||||
image: mysql:8.0
|
||||
container_name: mysql-db
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
MYSQL_ROOT_PASSWORD: root
|
||||
MYSQL_DATABASE: sql7810540
|
||||
MYSQL_USER: sql7810540
|
||||
MYSQL_PASSWORD: mXdJCFtDZz
|
||||
ports:
|
||||
- "3306:3306"
|
||||
volumes:
|
||||
- mysql_data:/var/lib/mysql
|
||||
|
||||
volumes:
|
||||
mysql_data:
|
||||
1
resources/sql/CountAllFieldsTask.sql
Normal file
1
resources/sql/CountAllFieldsTask.sql
Normal file
@@ -0,0 +1 @@
|
||||
SELECT COUNT(*) AS total FROM Task
|
||||
1
resources/sql/CountAllFieldsWorker.sql
Normal file
1
resources/sql/CountAllFieldsWorker.sql
Normal file
@@ -0,0 +1 @@
|
||||
SELECT COUNT(*) AS total FROM Worker
|
||||
1
resources/sql/InsertWorkerTable.sql
Normal file
1
resources/sql/InsertWorkerTable.sql
Normal file
@@ -0,0 +1 @@
|
||||
INSERT INTO Worker (workerid, name) VALUES (?, ?)
|
||||
1
resources/sql/SelectAllTask.sql
Normal file
1
resources/sql/SelectAllTask.sql
Normal file
@@ -0,0 +1 @@
|
||||
SELECT * FROM Task
|
||||
1
resources/sql/SelectAllWorker.sql
Normal file
1
resources/sql/SelectAllWorker.sql
Normal file
@@ -0,0 +1 @@
|
||||
SELECT * FROM Worker
|
||||
1
resources/sql/SelectTaskById.sql
Normal file
1
resources/sql/SelectTaskById.sql
Normal file
@@ -0,0 +1 @@
|
||||
SELECT * FROM Task WHERE taskid = ? LIMIT 1
|
||||
1
resources/sql/SelectWorkerById.sql
Normal file
1
resources/sql/SelectWorkerById.sql
Normal file
@@ -0,0 +1 @@
|
||||
SELECT * FROM Worker WHERE workerid = ? LIMIT 1
|
||||
1
resources/sql/UpdateWorkerTable.sql
Normal file
1
resources/sql/UpdateWorkerTable.sql
Normal file
@@ -0,0 +1 @@
|
||||
UPDATE Worker SET workerid = ?, name = ? WHERE workerid = ?
|
||||
@@ -4,5 +4,5 @@ CREATE TABLE Task (
|
||||
name VARCHAR(255) NOT NULL,
|
||||
description TEXT,
|
||||
workerid INT,
|
||||
taskstate INT
|
||||
taskstate BIT
|
||||
);
|
||||
5
resources/sql/createWorkerTable.sql
Normal file
5
resources/sql/createWorkerTable.sql
Normal file
@@ -0,0 +1,5 @@
|
||||
CREATE TABLE Worker (
|
||||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
workerid INT,
|
||||
name VARCHAR(255) NOT NULL
|
||||
);
|
||||
@@ -1,34 +1,100 @@
|
||||
package hhn.temp.project;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import hhn.temp.project.provider.SimpleDatabaseManager;
|
||||
|
||||
import java.sql.SQLException;
|
||||
import java.util.*;
|
||||
|
||||
public class AssignmentManager {
|
||||
Map<Integer, Worker> workerMap;
|
||||
Map<Integer, Task> taskMap;
|
||||
int workerIdCounter;
|
||||
int taskIdCounter;
|
||||
private Map<Integer, Worker> workerMap;
|
||||
private Map<Integer, Task> taskMap;
|
||||
private int workerIdCounter;
|
||||
private int taskIdCounter;
|
||||
private UserCommands userInterface;
|
||||
private SimpleDatabaseManager database;
|
||||
|
||||
public AssignmentManager() {
|
||||
database = new SimpleDatabaseManager();
|
||||
connect();
|
||||
workerMap = new HashMap<>();
|
||||
taskMap = new HashMap<>();
|
||||
int workerIdCounter = 1000;
|
||||
int taskIdCounter = 0;
|
||||
workerIdCounter = 1000;
|
||||
taskIdCounter = 0;
|
||||
sync();
|
||||
userInterface = new UserCommands(this);
|
||||
}
|
||||
private void connect() {
|
||||
try {
|
||||
database.connect();
|
||||
} catch (SQLException e) {
|
||||
System.err.println("Failed to connect to database");
|
||||
}
|
||||
}
|
||||
private void sync() {
|
||||
workerMap.clear();
|
||||
taskMap.clear();
|
||||
try {
|
||||
Collection<Worker> workers = database.getWorkers();
|
||||
if (workers != null) {
|
||||
for (Worker worker : workers) {
|
||||
workerMap.put(worker.getId(),worker);
|
||||
if (worker.getId() > workerIdCounter) {
|
||||
workerIdCounter = worker.getId();
|
||||
}
|
||||
}
|
||||
}
|
||||
Collection<Task> tasks = database.getTasks();
|
||||
if (tasks != null) {
|
||||
for (Task task : tasks) {
|
||||
taskMap.put(task.getTaskId(),task);
|
||||
if (task.getTaskId() > taskIdCounter) {
|
||||
taskIdCounter = task.getTaskId();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} catch (SQLException e) {
|
||||
System.err.println("Failed to sync");
|
||||
}
|
||||
}
|
||||
public Map<Integer, Task> getTaskMap() {
|
||||
return taskMap;
|
||||
}
|
||||
public Map<Integer, Worker> getWorkerMap() {return workerMap;}
|
||||
|
||||
public int createWorker(String name) {
|
||||
sync();
|
||||
Worker worker = new Worker(name, ++workerIdCounter);
|
||||
workerMap.put(workerIdCounter, worker);
|
||||
try {
|
||||
database.saveWorker(worker);
|
||||
} catch (SQLException e) {
|
||||
System.err.println("Failed to save worker");
|
||||
}
|
||||
return workerIdCounter;
|
||||
}
|
||||
public void removeWorker(int workerId) {
|
||||
if (!workerMap.containsKey(workerId)) {
|
||||
throw new IllegalArgumentException("WorkerId must exist in order to remove it");
|
||||
}
|
||||
workerMap.remove(workerId);
|
||||
try {
|
||||
database.deleteWorker(workerId);
|
||||
} catch (SQLException e) {
|
||||
System.err.println("Failed to delete worker");
|
||||
}
|
||||
}
|
||||
public int addTask(int workerId, String name, String description) {
|
||||
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);
|
||||
taskMap.put(taskIdCounter, task);
|
||||
try {
|
||||
database.saveTask(task);
|
||||
} catch (SQLException e) {
|
||||
System.err.println("Failed to save task");
|
||||
}
|
||||
return taskIdCounter;
|
||||
}
|
||||
public Task getTask(int taskId) {
|
||||
@@ -37,8 +103,11 @@ public class AssignmentManager {
|
||||
}
|
||||
return taskMap.get(taskId);
|
||||
}
|
||||
public Map<Integer, Task> getTaskMap() {
|
||||
return taskMap;
|
||||
public Worker getWorker(int workerId) {
|
||||
if (!workerMap.containsKey(workerId)) {
|
||||
throw new IllegalArgumentException("Worker Id does not exist");
|
||||
}
|
||||
return workerMap.get(workerId);
|
||||
}
|
||||
public void editTask(int workerId, int taskId, String name, String description) {
|
||||
if (!workerMap.containsKey(workerId) || !taskMap.containsKey(taskId)) {
|
||||
@@ -47,12 +116,22 @@ public class AssignmentManager {
|
||||
Task task = taskMap.get(taskId);
|
||||
task.setName(name);
|
||||
task.setDescription(description);
|
||||
try {
|
||||
database.updateTask(task.getTaskId(),task);
|
||||
} catch (SQLException e) {
|
||||
System.err.println("Failed to update Task");
|
||||
}
|
||||
}
|
||||
public void removeTask(int taskId) {
|
||||
if (!taskMap.containsKey(taskId)) {
|
||||
throw new IllegalArgumentException("Task Id does not exist");
|
||||
}
|
||||
taskMap.remove(taskId);
|
||||
try {
|
||||
database.deleteTask(taskId);
|
||||
} catch (SQLException e) {
|
||||
System.err.println("Failed to remove task");
|
||||
}
|
||||
}
|
||||
public void finishTask(int workerId, int taskId) {
|
||||
if (!workerMap.containsKey(workerId) || !taskMap.containsKey(taskId)) {
|
||||
@@ -60,6 +139,11 @@ public class AssignmentManager {
|
||||
}
|
||||
Task task = taskMap.get(taskId);
|
||||
task.setTaskState(TaskState.FINISHED);
|
||||
try {
|
||||
database.updateTask(taskId,task);
|
||||
} catch (SQLException e) {
|
||||
System.err.println("Failed to finish task");
|
||||
}
|
||||
}
|
||||
public void unfinishTask(int workerId, int taskId) {
|
||||
if (!workerMap.containsKey(workerId) || !taskMap.containsKey(taskId)) {
|
||||
@@ -67,6 +151,22 @@ public class AssignmentManager {
|
||||
}
|
||||
Task task = taskMap.get(taskId);
|
||||
task.setTaskState(TaskState.IN_PROGRESS);
|
||||
try {
|
||||
database.updateTask(taskId,task);
|
||||
} catch (SQLException e) {
|
||||
System.err.println("Failed to finish task");
|
||||
}
|
||||
}
|
||||
public UserCommands getUserCommands() {
|
||||
return userInterface;
|
||||
}
|
||||
|
||||
public void startCLI() {
|
||||
userInterface.start();
|
||||
}
|
||||
|
||||
public void stopCLI() {
|
||||
userInterface.stop();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
10
src/main/java/hhn/temp/project/Main.java
Normal file
10
src/main/java/hhn/temp/project/Main.java
Normal file
@@ -0,0 +1,10 @@
|
||||
package hhn.temp.project;
|
||||
|
||||
import java.util.Scanner;
|
||||
|
||||
public class Main {
|
||||
public static void main(String[] args) {
|
||||
AssignmentManager manager = new AssignmentManager();
|
||||
manager.startCLI();
|
||||
}
|
||||
}
|
||||
@@ -1,11 +1,11 @@
|
||||
package hhn.temp.project;
|
||||
|
||||
public class Task {
|
||||
String name;
|
||||
String description;
|
||||
int taskId;
|
||||
int workerId;
|
||||
TaskState state;
|
||||
private String name;
|
||||
private String description;
|
||||
private int taskId;
|
||||
private int workerId;
|
||||
private TaskState state;
|
||||
public Task(int taskId, int workerId, String name, String description) {
|
||||
this.name = name;
|
||||
this.description = description;
|
||||
|
||||
444
src/main/java/hhn/temp/project/UserCommands.java
Normal file
444
src/main/java/hhn/temp/project/UserCommands.java
Normal file
@@ -0,0 +1,444 @@
|
||||
package hhn.temp.project;
|
||||
|
||||
import java.util.Scanner;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
|
||||
public class UserCommands implements Runnable {
|
||||
private Scanner scanner;
|
||||
private AssignmentManager manager;
|
||||
private Integer selectedTaskId = null;
|
||||
private Integer selectedWorkerId = null;
|
||||
private AtomicBoolean running = new AtomicBoolean(false);
|
||||
private Thread cliThread;
|
||||
|
||||
private enum InputState {
|
||||
MAIN_MENU,
|
||||
TASK_SELECTED,
|
||||
WORKER_SELECTED,
|
||||
AWAITING_EDIT_INPUT,
|
||||
AWAITING_CREATE_TASK_WORKER,
|
||||
AWAITING_CREATE_TASK_NAME,
|
||||
AWAITING_CREATE_TASK_DESC,
|
||||
AWAITING_CREATE_WORKER_NAME,
|
||||
AWAITING_TASK_SELECTION
|
||||
}
|
||||
|
||||
private InputState currentState = InputState.MAIN_MENU;
|
||||
private Integer tempWorkerId = null;
|
||||
private String tempTaskName = null;
|
||||
|
||||
public UserCommands(AssignmentManager manager) {
|
||||
this.manager = manager;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
scanner = new Scanner(System.in);
|
||||
running.set(true);
|
||||
|
||||
while (running.get()) {
|
||||
printPrompt();
|
||||
String input = scanner.nextLine().trim();
|
||||
|
||||
if ("exit".equalsIgnoreCase(input)) {
|
||||
stop();
|
||||
continue;
|
||||
}
|
||||
|
||||
handleInput(input);
|
||||
}
|
||||
scanner.close();
|
||||
}
|
||||
|
||||
public void start() {
|
||||
if (cliThread == null || !cliThread.isAlive()) {
|
||||
cliThread = new Thread(this, "CLI-Thread");
|
||||
cliThread.start();
|
||||
}
|
||||
}
|
||||
|
||||
public void stop() {
|
||||
running.set(false);
|
||||
if (cliThread != null) {
|
||||
cliThread.interrupt();
|
||||
}
|
||||
}
|
||||
|
||||
private void printPrompt() {
|
||||
if (!running.get()) return;
|
||||
|
||||
switch (currentState) {
|
||||
case MAIN_MENU:
|
||||
System.out.println("Type '?' or 'help' for a list of commands");
|
||||
break;
|
||||
case TASK_SELECTED:
|
||||
System.out.println("Task " + selectedTaskId + " selected. Commands: finish, unfinish, remove, edit, back");
|
||||
break;
|
||||
case WORKER_SELECTED:
|
||||
if (selectedWorkerId != null) {
|
||||
System.out.println("Worker " + selectedWorkerId + " selected. Commands: remove, back");
|
||||
} else {
|
||||
System.out.println("Enter worker ID to select (or 'back'):");
|
||||
}
|
||||
break;
|
||||
case AWAITING_EDIT_INPUT:
|
||||
System.out.println("Enter new name;description:");
|
||||
break;
|
||||
case AWAITING_CREATE_WORKER_NAME:
|
||||
System.out.println("Enter worker name:");
|
||||
break;
|
||||
case AWAITING_CREATE_TASK_WORKER:
|
||||
System.out.println("Enter worker ID:");
|
||||
break;
|
||||
case AWAITING_CREATE_TASK_NAME:
|
||||
System.out.println("Enter task name:");
|
||||
break;
|
||||
case AWAITING_CREATE_TASK_DESC:
|
||||
System.out.println("Enter task description:");
|
||||
break;
|
||||
}
|
||||
System.out.print("> ");
|
||||
}
|
||||
|
||||
public void handleInput(String input) {
|
||||
if (input == null || input.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ("?".equals(input) || "help".equalsIgnoreCase(input)) {
|
||||
showHelp();
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
switch (currentState) {
|
||||
case MAIN_MENU:
|
||||
handleMainMenuInput(input);
|
||||
break;
|
||||
case TASK_SELECTED:
|
||||
handleTaskSelectionInput(input);
|
||||
break;
|
||||
case WORKER_SELECTED:
|
||||
handleWorkerSelectionInput(input);
|
||||
break;
|
||||
case AWAITING_EDIT_INPUT:
|
||||
handleEditInput(input);
|
||||
break;
|
||||
case AWAITING_CREATE_TASK_WORKER:
|
||||
handleCreateTaskWorkerInput(input);
|
||||
break;
|
||||
case AWAITING_CREATE_TASK_NAME:
|
||||
handleCreateTaskNameInput(input);
|
||||
break;
|
||||
case AWAITING_CREATE_TASK_DESC:
|
||||
handleCreateTaskDescInput(input);
|
||||
break;
|
||||
case AWAITING_CREATE_WORKER_NAME:
|
||||
handleCreateWorkerNameInput(input);
|
||||
break;
|
||||
case AWAITING_TASK_SELECTION:
|
||||
handleTaskIdInput(input);
|
||||
break;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
System.out.println("Error: " + e.getMessage());
|
||||
resetToMainMenu();
|
||||
}
|
||||
}
|
||||
|
||||
private void showHelp() {
|
||||
System.out.println("=== Available Commands ===");
|
||||
System.out.println("General:");
|
||||
System.out.println(" help, ? - Show this help");
|
||||
System.out.println(" exit - Exit the program");
|
||||
System.out.println(" createworker - Create a new worker");
|
||||
System.out.println(" createtask - Create a new task");
|
||||
System.out.println(" selecttask - Select a task to work with");
|
||||
System.out.println(" listworkers - List all workers");
|
||||
System.out.println(" listtasks - List all tasks with status");
|
||||
System.out.println(" listfinished - List only finished tasks");
|
||||
System.out.println(" listunfinished - List only unfinished tasks");
|
||||
|
||||
System.out.println("\nWhen a task is selected:");
|
||||
System.out.println(" finish - Mark task as finished");
|
||||
System.out.println(" unfinish - Mark task as unfinished");
|
||||
System.out.println(" remove - Remove the task");
|
||||
System.out.println(" edit - Edit task name and description");
|
||||
System.out.println(" back - Return to main menu");
|
||||
|
||||
System.out.println("\nWhen a worker is selected:");
|
||||
System.out.println(" remove - Remove the worker");
|
||||
System.out.println(" back - Return to main menu");
|
||||
}
|
||||
|
||||
private void handleMainMenuInput(String input) {
|
||||
switch (input.toLowerCase()) {
|
||||
case "createworker":
|
||||
System.out.println("Enter worker name:");
|
||||
currentState = InputState.AWAITING_CREATE_WORKER_NAME;
|
||||
break;
|
||||
|
||||
case "createtask":
|
||||
System.out.println("Enter worker ID:");
|
||||
currentState = InputState.AWAITING_CREATE_TASK_WORKER;
|
||||
break;
|
||||
|
||||
case "selecttask":
|
||||
System.out.println("Enter task ID:");
|
||||
currentState = InputState.AWAITING_TASK_SELECTION;
|
||||
break;
|
||||
|
||||
case "listworkers":
|
||||
listWorkers();
|
||||
break;
|
||||
|
||||
case "listtasks":
|
||||
listAllTasks();
|
||||
break;
|
||||
|
||||
case "listfinished":
|
||||
listTasksByStatus(TaskState.FINISHED);
|
||||
break;
|
||||
|
||||
case "listunfinished":
|
||||
listTasksByStatus(TaskState.IN_PROGRESS);
|
||||
break;
|
||||
|
||||
default:
|
||||
System.out.println("Unknown command. Type 'help' for available commands.");
|
||||
}
|
||||
}
|
||||
|
||||
private void listWorkers() {
|
||||
System.out.println("\nAvailable workers:");
|
||||
if (manager.getWorkerMap().isEmpty()) {
|
||||
System.out.println(" No workers found.");
|
||||
} else {
|
||||
for (Worker w : manager.getWorkerMap().values()) {
|
||||
System.out.println(" " + w.getId() + ": " + w.getName());
|
||||
}
|
||||
}
|
||||
System.out.println();
|
||||
}
|
||||
|
||||
private void listAllTasks() {
|
||||
System.out.println("\nAll tasks:");
|
||||
if (manager.getTaskMap().isEmpty()) {
|
||||
System.out.println(" No tasks found.");
|
||||
} else {
|
||||
for (Task task : manager.getTaskMap().values()) {
|
||||
Worker worker = manager.getWorker(task.getWorkerId());
|
||||
String status = task.getTaskState() == TaskState.FINISHED ? "[FINISHED]" : "[IN PROGRESS]";
|
||||
System.out.println(String.format(" %d: %s - %s (Worker: %d - %s)",
|
||||
task.getTaskId(), status, task.getName(),
|
||||
worker.getId(), worker.getName()));
|
||||
}
|
||||
}
|
||||
System.out.println();
|
||||
}
|
||||
|
||||
private void listTasksByStatus(TaskState status) {
|
||||
System.out.println("\nTasks with status: " + status);
|
||||
boolean found = false;
|
||||
|
||||
for (Task task : manager.getTaskMap().values()) {
|
||||
if (task.getTaskState() == status) {
|
||||
Worker worker = manager.getWorker(task.getWorkerId());
|
||||
System.out.println(String.format(" %d: %s (Worker: %d - %s)",
|
||||
task.getTaskId(), task.getName(),
|
||||
worker.getId(), worker.getName()));
|
||||
found = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (!found) {
|
||||
System.out.println(" No tasks found with this status.");
|
||||
}
|
||||
System.out.println();
|
||||
}
|
||||
|
||||
private void handleWorkerSelectionInput(String input) {
|
||||
if ("back".equalsIgnoreCase(input)) {
|
||||
resetToMainMenu();
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
int workerId = Integer.parseInt(input.trim());
|
||||
Worker worker = manager.getWorker(workerId);
|
||||
if (worker != null) {
|
||||
selectedWorkerId = workerId;
|
||||
System.out.println("Worker " + workerId + " (" + worker.getName() + ") selected");
|
||||
System.out.println("Commands: remove, back");
|
||||
} else {
|
||||
System.out.println("Worker not found. Please enter a valid worker ID:");
|
||||
}
|
||||
} catch (NumberFormatException e) {
|
||||
if (selectedWorkerId != null) {
|
||||
handleWorkerCommand(input);
|
||||
} else {
|
||||
System.out.println("Invalid input. Please enter a worker ID or 'back':");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void handleWorkerCommand(String input) {
|
||||
switch (input.toLowerCase()) {
|
||||
case "remove":
|
||||
manager.removeWorker(selectedWorkerId);
|
||||
System.out.println("Worker removed");
|
||||
resetToMainMenu();
|
||||
break;
|
||||
|
||||
case "back":
|
||||
resetToMainMenu();
|
||||
break;
|
||||
|
||||
default:
|
||||
System.out.println("Unknown command. Available commands: remove, back");
|
||||
}
|
||||
}
|
||||
|
||||
private void handleCreateWorkerNameInput(String input) {
|
||||
int workerId = manager.createWorker(input.trim());
|
||||
System.out.println("Created worker with ID: " + workerId);
|
||||
resetToMainMenu();
|
||||
}
|
||||
private void handleTaskIdInput(String input) {
|
||||
if ("back".equalsIgnoreCase(input)) {
|
||||
resetToMainMenu();
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
int taskId = Integer.parseInt(input.trim());
|
||||
Task task = manager.getTask(taskId);
|
||||
if (task != null) {
|
||||
selectedTaskId = taskId;
|
||||
currentState = InputState.TASK_SELECTED;
|
||||
System.out.println("Task " + taskId + " (" + task.getName() + ") selected");
|
||||
System.out.println("Commands: finish, unfinish, remove, edit, back");
|
||||
} else {
|
||||
System.out.println("Task not found. Please enter a valid task ID:");
|
||||
}
|
||||
} catch (NumberFormatException e) {
|
||||
System.out.println("Invalid input. Please enter a task ID or 'back':");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void handleCreateTaskWorkerInput(String input) {
|
||||
try {
|
||||
tempWorkerId = Integer.parseInt(input.trim());
|
||||
System.out.println("Enter task name:");
|
||||
currentState = InputState.AWAITING_CREATE_TASK_NAME;
|
||||
} catch (NumberFormatException e) {
|
||||
System.out.println("Invalid worker ID. Please enter a number:");
|
||||
}
|
||||
}
|
||||
|
||||
private void handleCreateTaskNameInput(String input) {
|
||||
tempTaskName = input.trim();
|
||||
System.out.println("Enter task description:");
|
||||
currentState = InputState.AWAITING_CREATE_TASK_DESC;
|
||||
}
|
||||
|
||||
private void handleCreateTaskDescInput(String input) {
|
||||
int taskId = manager.addTask(tempWorkerId, tempTaskName, input.trim());
|
||||
System.out.println("Created task with ID: " + taskId);
|
||||
resetToMainMenu();
|
||||
}
|
||||
|
||||
private void resetToMainMenu() {
|
||||
currentState = InputState.MAIN_MENU;
|
||||
selectedTaskId = null;
|
||||
selectedWorkerId = null;
|
||||
tempWorkerId = null;
|
||||
tempTaskName = null;
|
||||
}
|
||||
|
||||
private void handleTaskSelectionInput(String input) {
|
||||
if ("back".equalsIgnoreCase(input)) {
|
||||
resetToMainMenu();
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
int taskId = Integer.parseInt(input.trim());
|
||||
Task task = manager.getTask(taskId);
|
||||
if (task != null) {
|
||||
selectedTaskId = taskId;
|
||||
currentState = InputState.TASK_SELECTED;
|
||||
System.out.println("Task " + taskId + " (" + task.getName() + ") selected");
|
||||
System.out.println("Commands: finish, unfinish, remove, edit, back");
|
||||
} else {
|
||||
System.out.println("Task not found. Please enter a valid task ID:");
|
||||
}
|
||||
} catch (NumberFormatException e) {
|
||||
if (selectedTaskId != null) {
|
||||
handleTaskCommand(input);
|
||||
} else {
|
||||
System.out.println("Invalid input. Please enter a task ID or 'back':");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void handleTaskCommand(String input) {
|
||||
switch (input.toLowerCase()) {
|
||||
case "finish":
|
||||
manager.finishTask(manager.getTask(selectedTaskId).getWorkerId(),selectedTaskId);
|
||||
System.out.println("Task marked as finished");
|
||||
break;
|
||||
|
||||
case "unfinish":
|
||||
manager.unfinishTask(manager.getTask(selectedTaskId).getWorkerId(),selectedTaskId);
|
||||
System.out.println("Task marked as unfinished");
|
||||
break;
|
||||
|
||||
case "remove":
|
||||
manager.removeTask(selectedTaskId);
|
||||
System.out.println("Task removed");
|
||||
resetToMainMenu();
|
||||
break;
|
||||
|
||||
case "edit":
|
||||
System.out.println("Enter new name;description:");
|
||||
currentState = InputState.AWAITING_EDIT_INPUT;
|
||||
break;
|
||||
|
||||
case "back":
|
||||
resetToMainMenu();
|
||||
break;
|
||||
|
||||
default:
|
||||
System.out.println("Unknown command. Type 'help' for available commands.");
|
||||
}
|
||||
}
|
||||
|
||||
private void handleEditInput(String input) {
|
||||
String[] parts = input.split(";", 2);
|
||||
if (parts.length == 2) {
|
||||
manager.editTask(manager.getTask(selectedTaskId).getWorkerId(), selectedTaskId, parts[0], parts[1]);
|
||||
System.out.println("Task edited");
|
||||
} else {
|
||||
System.out.println("Invalid format. Use: name;description");
|
||||
System.out.println("Please try again:");
|
||||
return;
|
||||
}
|
||||
currentState = InputState.TASK_SELECTED;
|
||||
}
|
||||
|
||||
public Scanner getScanner() {
|
||||
return scanner;
|
||||
}
|
||||
|
||||
//only for testing
|
||||
public void setScanner(Scanner scanner) {
|
||||
this.scanner = scanner;
|
||||
}
|
||||
|
||||
//only for testing
|
||||
public boolean isRunning() {
|
||||
return running.get();
|
||||
}
|
||||
}
|
||||
@@ -1,8 +1,8 @@
|
||||
package hhn.temp.project;
|
||||
|
||||
public class Worker {
|
||||
String name;
|
||||
int workerId;
|
||||
private String name;
|
||||
private int workerId;
|
||||
public Worker(String name, int workerId) {
|
||||
this.name = name;
|
||||
this.workerId = workerId;
|
||||
|
||||
@@ -1,193 +1,403 @@
|
||||
package hhn.temp.project.provider;
|
||||
|
||||
import hhn.temp.project.Task;
|
||||
import hhn.temp.project.TaskState;
|
||||
import hhn.temp.project.Worker;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.sql.*;
|
||||
import java.util.*;
|
||||
|
||||
public class SimpleDatabaseManager implements DatabaseManager {
|
||||
|
||||
private boolean connected = false;
|
||||
private Map<Integer, Task> temporaryTaskList = new HashMap();
|
||||
private Map<Integer, Worker> temporaryWorkerList = new HashMap<>();
|
||||
private Connection connection;
|
||||
|
||||
private final static Path INSERT_TASK = Path.of("resources/sql/InsertTaskTable.sql");
|
||||
private final static Path DELETE_TASK = Path.of("resources/sql/DeleteTaskTable.sql");
|
||||
private final static Path SELECT_TASK = Path.of("resources/sql/SelectTaskTable.sql");
|
||||
private final static Path UPDATE_TASK = Path.of("resources/sql/UpdateTaskTable.sql");
|
||||
private final static Path COUNT_ALL_TASK = Path.of("resources/sql/CountAllFieldsTask.sql");
|
||||
private final static Path SELECT_ALL_TASK = Path.of("resources/sql/SelectAllTask.sql");
|
||||
private final static Path SELECT_TASK_BY_ID = Path.of("resources/sql/SelectTaskById.sql");
|
||||
private final static Path INSERT_WORKER = Path.of("resources/sql/InsertWorkerTable.sql");
|
||||
private final static Path DELETE_WORKER = Path.of("resources/sql/DeleteWorkerTable.sql");
|
||||
private final static Path SELECT_WORKER = Path.of("resources/sql/SelectWorkerTable.sql");
|
||||
private final static Path UPDATE_WORKER = Path.of("resources/sql/UpdateWorkerTable.sql");
|
||||
private final static Path COUNT_ALL_WORKER = Path.of("resources/sql/CountAllFieldsWorker.sql");
|
||||
private final static Path SELECT_ALL_WORKER = Path.of("resources/sql/SelectAllWorker.sql");
|
||||
private final static Path SELECT_WORKER_BY_ID = Path.of("resources/sql/SelectWorkerById.sql");
|
||||
|
||||
public enum QueryMode {
|
||||
INSERT_TASK,
|
||||
SELECT_TASK,
|
||||
UPDATE_TASK,
|
||||
DELETE_TASK,
|
||||
SELECT_ALL_TASK,
|
||||
SELECT_TASK_BY_ID,
|
||||
COUNT_ALL_TASK,
|
||||
INSERT_WORKER,
|
||||
SELECT_WORKER,
|
||||
UPDATE_WORKER,
|
||||
DELETE_WORKER,
|
||||
COUNT_ALL_WORKER,
|
||||
SELECT_ALL_WORKER,
|
||||
SELECT_WORKER_BY_ID,
|
||||
}
|
||||
|
||||
private String loadFile(QueryMode queryMode) throws IOException {
|
||||
switch (queryMode) {
|
||||
case INSERT_TASK -> {
|
||||
return Files.readString(INSERT_TASK);
|
||||
}
|
||||
case SELECT_TASK -> {
|
||||
return Files.readString(SELECT_TASK);
|
||||
}
|
||||
case DELETE_TASK -> {
|
||||
return Files.readString(DELETE_TASK);
|
||||
}
|
||||
case UPDATE_TASK -> {
|
||||
return Files.readString(UPDATE_TASK);
|
||||
}
|
||||
case COUNT_ALL_TASK -> {
|
||||
return Files.readString(COUNT_ALL_TASK);
|
||||
}
|
||||
case SELECT_ALL_TASK -> {
|
||||
return Files.readString(SELECT_ALL_TASK);
|
||||
}
|
||||
case SELECT_TASK_BY_ID -> {
|
||||
return Files.readString(SELECT_TASK_BY_ID);
|
||||
}
|
||||
case INSERT_WORKER -> {
|
||||
return Files.readString(INSERT_WORKER);
|
||||
}
|
||||
case SELECT_WORKER -> {
|
||||
return Files.readString(SELECT_WORKER);
|
||||
}
|
||||
case DELETE_WORKER -> {
|
||||
return Files.readString(DELETE_WORKER);
|
||||
}
|
||||
case UPDATE_WORKER -> {
|
||||
return Files.readString(UPDATE_WORKER);
|
||||
}
|
||||
case COUNT_ALL_WORKER -> {
|
||||
return Files.readString(COUNT_ALL_WORKER);
|
||||
}
|
||||
case SELECT_ALL_WORKER -> {
|
||||
return Files.readString(SELECT_ALL_WORKER);
|
||||
}
|
||||
case SELECT_WORKER_BY_ID -> {
|
||||
return Files.readString(SELECT_WORKER_BY_ID);
|
||||
}
|
||||
default -> {
|
||||
return "";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private TaskState integerToTaskState(final int in) {
|
||||
return in == 1 ? TaskState.FINISHED : TaskState.IN_PROGRESS;
|
||||
}
|
||||
|
||||
private int taskStateToInteger(final TaskState taskState) {
|
||||
return taskState == TaskState.FINISHED ? 1 : 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void saveTask(Task task) throws SQLException {
|
||||
if (!connected) {
|
||||
throw new SQLException("[CONNECTION FAILED] Instance is not connected to database.");
|
||||
public void saveTask(final Task task) throws SQLException {
|
||||
String query;
|
||||
try {
|
||||
query = loadFile(QueryMode.INSERT_TASK);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
return;
|
||||
}
|
||||
|
||||
if (!temporaryTaskList.containsKey(task.getTaskId())) {
|
||||
temporaryTaskList.put(task.getTaskId(), task);
|
||||
} else {
|
||||
throw new SQLException("[INSERTION FAILED] Task with the same Task ID already exists.");
|
||||
try (PreparedStatement preparedStatement = connection.prepareStatement(query);) {
|
||||
preparedStatement.setInt(1, task.getTaskId());
|
||||
preparedStatement.setString(2, task.getName());
|
||||
preparedStatement.setString(3, task.getDescription());
|
||||
preparedStatement.setInt(4, task.getWorkerId());
|
||||
preparedStatement.setInt(5, taskStateToInteger(task.getTaskState()));
|
||||
preparedStatement.execute();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void saveTasks(Collection<Task> tasks) throws SQLException {
|
||||
public void saveTasks(final Collection<Task> tasks) throws SQLException {
|
||||
for (Task task : tasks) {
|
||||
saveTask(task);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void saveWorker(Worker worker) throws SQLException {
|
||||
if (!connected) {
|
||||
throw new SQLException("[CONNECTION FAILED] Instance is not connected to database.");
|
||||
public void saveWorker(final Worker worker) throws SQLException {
|
||||
String query;
|
||||
try {
|
||||
query = loadFile(QueryMode.INSERT_WORKER);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
return;
|
||||
}
|
||||
|
||||
if (!temporaryWorkerList.containsKey(worker.getId())) {
|
||||
temporaryWorkerList.put(worker.getId(), worker);
|
||||
} else {
|
||||
throw new SQLException("[INSERTION FAILED] Task with the same Task ID already exists.");
|
||||
try (PreparedStatement preparedStatement = connection.prepareStatement(query);) {
|
||||
preparedStatement.setInt(1, worker.getId());
|
||||
preparedStatement.setString(2, worker.getName());
|
||||
preparedStatement.execute();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void saveWorkers(Collection<Worker> workers) throws SQLException {
|
||||
public void saveWorkers(final Collection<Worker> workers) throws SQLException {
|
||||
for (Worker worker : workers) {
|
||||
saveWorker(worker);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateTask(int taskId, Task newTaskObject) throws 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);
|
||||
public void updateTask(final int taskId, final Task newTaskObject) throws SQLException {
|
||||
String query;
|
||||
try {
|
||||
query = loadFile(QueryMode.UPDATE_TASK);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
return;
|
||||
}
|
||||
|
||||
throw new SQLException("[UPDATE FAILED] Task ID not found OR Task ID does not equal New Task ID.");
|
||||
try (PreparedStatement preparedStatement = connection.prepareStatement(query);) {
|
||||
preparedStatement.setString(1, newTaskObject.getName());
|
||||
preparedStatement.setString(2, newTaskObject.getDescription());
|
||||
preparedStatement.setInt(3, taskStateToInteger(newTaskObject.getTaskState()));
|
||||
preparedStatement.setInt(4, taskId);
|
||||
preparedStatement.execute();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateWorker(int workerId, Worker newWorkerObject) throws 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);
|
||||
public void updateWorker(final int workerId, final Worker newWorkerObject) throws SQLException {
|
||||
String query;
|
||||
try {
|
||||
query = loadFile(QueryMode.UPDATE_WORKER);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
return;
|
||||
}
|
||||
|
||||
throw new SQLException("[UPDATE FAILED] Worker ID not found OR Worker ID does not equal New Worker ID.");
|
||||
try (PreparedStatement preparedStatement = connection.prepareStatement(query);) {
|
||||
preparedStatement.setInt(1, newWorkerObject.getId());
|
||||
preparedStatement.setString(2, newWorkerObject.getName());
|
||||
preparedStatement.setInt(3, workerId);
|
||||
preparedStatement.execute();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deleteTask(int taskId) throws SQLException {
|
||||
if (!connected) {
|
||||
throw new SQLException("[CONNECTION FAILED] Instance is not connected to database.");
|
||||
}
|
||||
|
||||
if (temporaryTaskList.containsKey(taskId)) {
|
||||
temporaryTaskList.remove(taskId);
|
||||
public void deleteTask(final int taskId) throws SQLException {
|
||||
String query;
|
||||
try {
|
||||
query = loadFile(QueryMode.DELETE_TASK);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
return;
|
||||
}
|
||||
|
||||
throw new SQLException("[DELETION FAILED] Could not find Task ID. Nothing to delete.");
|
||||
try (PreparedStatement preparedStatement = connection.prepareStatement(query);) {
|
||||
preparedStatement.setInt(1, taskId);
|
||||
preparedStatement.execute();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deleteWorker(int workerId) throws SQLException {
|
||||
if (!connected) {
|
||||
throw new SQLException("[CONNECTION FAILED] Instance is not connected to database.");
|
||||
}
|
||||
|
||||
if (temporaryWorkerList.containsKey(workerId)) {
|
||||
temporaryWorkerList.remove(workerId);
|
||||
public void deleteWorker(final int workerId) throws SQLException {
|
||||
String query;
|
||||
try {
|
||||
query = loadFile(QueryMode.DELETE_WORKER);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
return;
|
||||
}
|
||||
|
||||
throw new SQLException("[DELETION FAILED] Could not find Worker ID. Nothing to delete.");
|
||||
try (PreparedStatement preparedStatement = connection.prepareStatement(query);) {
|
||||
preparedStatement.setInt(1, workerId);
|
||||
preparedStatement.execute();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<Task> getTasks() throws SQLException {
|
||||
if (!connected) {
|
||||
throw new SQLException("[CONNECTION FAILED] Instance is not connected to database.");
|
||||
String query;
|
||||
try {
|
||||
query = loadFile(QueryMode.SELECT_ALL_TASK);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
|
||||
return temporaryTaskList.values();
|
||||
Collection<Task> tasks = new ArrayList<>();
|
||||
|
||||
try (Statement statement = connection.createStatement();
|
||||
ResultSet rs = statement.executeQuery(query);) {
|
||||
|
||||
while (rs.next()) {
|
||||
int taskId = rs.getInt("taskid");
|
||||
String name = rs.getString("name");
|
||||
String description = rs.getString("description");
|
||||
int workerId = rs.getInt("workerid");
|
||||
TaskState taskState = integerToTaskState(rs.getInt("taskstate"));
|
||||
|
||||
Task task = new Task(taskId, workerId, name, description);
|
||||
task.setTaskState(taskState);
|
||||
|
||||
tasks.add(task);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return tasks;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<Worker> getWorkers() throws SQLException {
|
||||
if (!connected) {
|
||||
throw new SQLException("[CONNECTION FAILED] Instance is not connected to database.");
|
||||
String query;
|
||||
try {
|
||||
query = loadFile(QueryMode.SELECT_ALL_WORKER);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
|
||||
return temporaryWorkerList.values();
|
||||
Collection<Worker> workers = new ArrayList<>();
|
||||
|
||||
try (Statement statement = connection.createStatement();
|
||||
ResultSet rs = statement.executeQuery(query);) {
|
||||
|
||||
while (rs.next()) {
|
||||
int workerId = rs.getInt("workerid");
|
||||
String name = rs.getString("name");
|
||||
|
||||
Worker worker = new Worker(name, workerId);
|
||||
|
||||
workers.add(worker);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return workers;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Task getTaskByTaskId(int taskId) throws SQLException {
|
||||
if (!connected) {
|
||||
throw new SQLException("[CONNECTION FAILED] Instance is not connected to database.");
|
||||
public Task getTaskByTaskId(final int taskId) throws SQLException {
|
||||
String query;
|
||||
try {
|
||||
query = loadFile(QueryMode.SELECT_TASK_BY_ID);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
|
||||
if (temporaryTaskList.containsKey(taskId)) {
|
||||
return temporaryTaskList.get(taskId);
|
||||
try (PreparedStatement statement = connection.prepareStatement(query);) {
|
||||
|
||||
statement.setInt(1, taskId);
|
||||
|
||||
ResultSet rs = statement.executeQuery();
|
||||
|
||||
while (rs.next()) {
|
||||
int taskId1 = rs.getInt("taskid");
|
||||
String name = rs.getString("name");
|
||||
String description = rs.getString("description");
|
||||
int workerId = rs.getInt("workerid");
|
||||
TaskState taskState = integerToTaskState(rs.getInt("taskstate"));
|
||||
|
||||
Task task = new Task(taskId1, workerId, name, description);
|
||||
task.setTaskState(taskState);
|
||||
|
||||
return task;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
throw new SQLException("[SELECTION FAILED] Could not find Task ID. Nothing to get.");
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Worker getWorkerByWorkerId(int workerId) throws SQLException {
|
||||
if (!connected) {
|
||||
throw new SQLException("[CONNECTION FAILED] Instance is not connected to database.");
|
||||
public Worker getWorkerByWorkerId(final int workerId) throws SQLException {
|
||||
String query;
|
||||
try {
|
||||
query = loadFile(QueryMode.SELECT_WORKER_BY_ID);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
|
||||
if (temporaryWorkerList.containsKey(workerId)) {
|
||||
return temporaryWorkerList.get(workerId);
|
||||
try (PreparedStatement statement = connection.prepareStatement(query);) {
|
||||
|
||||
statement.setInt(1, workerId);
|
||||
|
||||
ResultSet rs = statement.executeQuery();
|
||||
|
||||
while (rs.next()) {
|
||||
int workerId1 = rs.getInt("workerid");
|
||||
String name = rs.getString("name");
|
||||
|
||||
Worker worker = new Worker(name, workerId1);
|
||||
|
||||
return worker;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
throw new SQLException("[SELECTION FAILED] Could not find Worker ID. Nothing to get.");
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getTotalNumberOfTasks() throws SQLException {
|
||||
if (!connected) {
|
||||
throw new SQLException("[CONNECTION FAILED] Instance is not connected to database.");
|
||||
String query = "";
|
||||
try {
|
||||
query = loadFile(QueryMode.COUNT_ALL_TASK);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
return -1;
|
||||
}
|
||||
try (Statement statement = connection.createStatement();
|
||||
ResultSet rs = statement.executeQuery(query);) {
|
||||
|
||||
if (rs.next()) {
|
||||
return rs.getInt("total");
|
||||
}
|
||||
}
|
||||
|
||||
return temporaryTaskList.size();
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getTotalNumberOfWorkers() throws SQLException {
|
||||
if (!connected) {
|
||||
throw new SQLException("[CONNECTION FAILED] Instance is not connected to database.");
|
||||
String query = "";
|
||||
try {
|
||||
query = loadFile(QueryMode.COUNT_ALL_WORKER);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
return -1;
|
||||
}
|
||||
try (Statement statement = connection.createStatement();
|
||||
ResultSet rs = statement.executeQuery(query);) {
|
||||
|
||||
if (rs.next()) {
|
||||
return rs.getInt("total");
|
||||
}
|
||||
}
|
||||
|
||||
return temporaryWorkerList.size();
|
||||
return 0;
|
||||
}
|
||||
|
||||
public void clearDatabase() throws SQLException {
|
||||
if (!connected) {
|
||||
throw new SQLException("[CONNECTION FAILED] Instance is not connected to database.");
|
||||
try (Statement statement = connection.createStatement()) {
|
||||
statement.execute("TRUNCATE TABLE Task");
|
||||
statement.execute("TRUNCATE TABLE Worker");
|
||||
}
|
||||
|
||||
temporaryTaskList.clear();
|
||||
temporaryWorkerList.clear();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void connect() throws SQLException {
|
||||
connected = true;
|
||||
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/sql7810540?user=sql7810540&password=mXdJCFtDZz");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void close() throws SQLException {
|
||||
connected = false;
|
||||
connection.close();
|
||||
}
|
||||
}
|
||||
@@ -52,4 +52,20 @@ public class BadCasesTest {
|
||||
assertThrows(IllegalArgumentException.class, () -> manager.finishTask(20405, 21034));
|
||||
assertThrows(IllegalArgumentException.class, () -> manager.unfinishTask(20405, 21034));
|
||||
}
|
||||
@Test
|
||||
@DisplayName("Assert that removing a non-existent worker throws an Exception")
|
||||
public void assertRemovingNonExistentWorkerFails() {
|
||||
assertThrows(IllegalArgumentException.class, () -> manager.removeWorker(34054));
|
||||
}
|
||||
@Test
|
||||
@DisplayName("Assert non-existent commands are recognized as such")
|
||||
public void assertInvalidCommandsDontCrash() {
|
||||
int workerId = manager.createWorker("Alfred");
|
||||
int taskId = manager.addTask(workerId, "Run", "Jog 10 Miles");
|
||||
try {
|
||||
manager.getUserCommands().handleInput("baum");
|
||||
} catch (Exception e) {
|
||||
fail("Should not crash just because a command is invalid");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,12 +5,8 @@ import hhn.temp.project.provider.SimpleDatabaseManager;
|
||||
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.*;
|
||||
|
||||
public class DatabaseBadCasesTest {
|
||||
|
||||
private DatabaseManager databaseManager;
|
||||
@@ -19,7 +15,7 @@ public class DatabaseBadCasesTest {
|
||||
public void setup() throws SQLException {
|
||||
databaseManager = new SimpleDatabaseManager();
|
||||
databaseManager.connect();
|
||||
databaseManager.clearDatabase();
|
||||
//databaseManager.clearDatabase();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -31,6 +27,9 @@ public class DatabaseBadCasesTest {
|
||||
databaseManager.saveTask(task);
|
||||
|
||||
databaseManager.saveTask(taskFaker);
|
||||
|
||||
databaseManager.deleteTask(task.getTaskId());
|
||||
databaseManager.deleteTask(taskFaker.getTaskId());
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -42,5 +41,8 @@ public class DatabaseBadCasesTest {
|
||||
databaseManager.saveWorker(worker);
|
||||
|
||||
databaseManager.saveWorker(workerFaker);
|
||||
|
||||
databaseManager.deleteWorker(worker.getId());
|
||||
databaseManager.deleteWorker(workerFaker.getId());
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,5 @@
|
||||
package hhn.temp.project;
|
||||
|
||||
import hhn.temp.project.provider.DatabaseManager;
|
||||
import hhn.temp.project.provider.SimpleDatabaseManager;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.DisplayName;
|
||||
@@ -8,21 +7,19 @@ 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;
|
||||
import java.util.List;
|
||||
|
||||
public class DatabaseGoodCasesTest {
|
||||
|
||||
private DatabaseManager databaseManager;
|
||||
private SimpleDatabaseManager databaseManager;
|
||||
|
||||
@BeforeEach
|
||||
public void setup() throws SQLException {
|
||||
databaseManager = new SimpleDatabaseManager();
|
||||
databaseManager.connect();
|
||||
databaseManager.clearDatabase();
|
||||
//databaseManager.clearDatabase();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -40,7 +37,7 @@ public class DatabaseGoodCasesTest {
|
||||
assertEquals(task.getName(), reTask.getName());
|
||||
assertEquals(task.getWorkerId(), reTask.getWorkerId());
|
||||
|
||||
assertEquals(1, databaseManager.getTotalNumberOfTasks());
|
||||
databaseManager.deleteTask(task.getTaskId());
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -56,9 +53,11 @@ public class DatabaseGoodCasesTest {
|
||||
|
||||
assertEquals(worker.getId(), reWorker.getId());
|
||||
assertEquals(worker.getName(), reWorker.getName());
|
||||
|
||||
databaseManager.deleteWorker(worker.getId());
|
||||
}
|
||||
|
||||
@Test
|
||||
/*@Test
|
||||
@DisplayName("Clearing the database (Task and Worker) test")
|
||||
public void clearDatabaseTest() throws SQLException, InterruptedException {
|
||||
Task task1 = new Task(10, 5, "Hello", "World");
|
||||
@@ -82,5 +81,5 @@ public class DatabaseGoodCasesTest {
|
||||
|
||||
assertEquals(0, databaseManager.getTotalNumberOfTasks());
|
||||
assertEquals(0, databaseManager.getTotalNumberOfWorkers());
|
||||
}
|
||||
}*/
|
||||
}
|
||||
@@ -4,6 +4,8 @@ import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.DisplayName;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import java.util.Scanner;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
|
||||
public class GoodCasesTest {
|
||||
@@ -13,6 +15,7 @@ public class GoodCasesTest {
|
||||
public void setup() {
|
||||
manager = new AssignmentManager();
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("Assert that a Worker can add a Task")
|
||||
public void assertWorkerCanAddTask() {
|
||||
@@ -30,6 +33,7 @@ public class GoodCasesTest {
|
||||
int taskId = manager.addTask(workerId, "Run", "Jog 10 Miles");
|
||||
assertEquals(sizeCount + 1, manager.getTaskMap().size());
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("Assert existing Tasks can be edited")
|
||||
public void assertExistingTasksCanBeEdited() {
|
||||
@@ -50,6 +54,7 @@ public class GoodCasesTest {
|
||||
manager.removeTask(taskId);
|
||||
assertEquals(sizeCount, manager.getTaskMap().size());
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("Assert deleted Tasks no longer show up in the List")
|
||||
public void assertDeletedTasksDisappear() {
|
||||
@@ -58,18 +63,20 @@ public class GoodCasesTest {
|
||||
manager.removeTask(taskId);
|
||||
assertThrows(IllegalArgumentException.class, () -> manager.getTask(taskId));
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("Check Getters")
|
||||
public void assertGettersWorkCorrectly() {
|
||||
int workerId = manager.createWorker("Alfred");
|
||||
int taskId = manager.addTask(workerId, "Run", "Jog 10 Miles");
|
||||
assertEquals("Alfred", manager.workerMap.get(workerId).getName());
|
||||
assertEquals("Alfred", manager.getWorkerMap().get(workerId).getName());
|
||||
//This one may be somewhat nonsensical, but it ensures the getId works so one may iterate over the workerMap
|
||||
assertEquals(manager.workerMap.get(workerId).getId(), workerId);
|
||||
assertEquals(manager.getWorkerMap().get(workerId).getId(), workerId);
|
||||
assertEquals(manager.getTask(taskId).getTaskId(), taskId);
|
||||
assertEquals(manager.getTask(taskId).getWorkerId(), workerId);
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("Assert that Task State is actually changed when submitted as finished")
|
||||
public void assertTaskStateChanges() {
|
||||
@@ -81,4 +88,68 @@ public class GoodCasesTest {
|
||||
assertSame(TaskState.IN_PROGRESS, manager.getTask(taskId).getTaskState());
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("Assert that the Scanner is actually started when AM calls start")
|
||||
public void assertScannerExists() {
|
||||
try {
|
||||
Scanner scanner = manager.getUserCommands().getScanner();
|
||||
} catch (Exception e) {
|
||||
fail("Scanner does not exists or can't be gotten by getScanner()");
|
||||
}
|
||||
}
|
||||
@Test
|
||||
@DisplayName("Check that every required surface command actually works")
|
||||
public void assertCommandsAreRecognized() {
|
||||
assertDoesNotThrow(() -> manager.getUserCommands().handleInput("?"));
|
||||
assertDoesNotThrow(() -> manager.getUserCommands().handleInput("help"));
|
||||
assertDoesNotThrow(() -> manager.getUserCommands().handleInput("createWorker"));
|
||||
assertDoesNotThrow(() -> manager.getUserCommands().handleInput("createTask"));
|
||||
assertDoesNotThrow(() -> manager.getUserCommands().handleInput("selectTask"));
|
||||
assertDoesNotThrow(() -> manager.getUserCommands().handleInput("listWorkers"));
|
||||
assertDoesNotThrow(() -> manager.getUserCommands().handleInput("exit"));
|
||||
}
|
||||
@Test
|
||||
@DisplayName("Check that every task command works")
|
||||
public void assertFinishingTasksIsPossibleThroughUi() {
|
||||
int workerId = manager.createWorker("Alfred");
|
||||
int taskId = manager.addTask(workerId, "Run", "Jog 10 Miles");
|
||||
manager.getUserCommands().handleInput("selectTask");
|
||||
assertDoesNotThrow(() -> manager.getUserCommands().handleInput(taskId + ""));
|
||||
assertDoesNotThrow(() -> manager.getUserCommands().handleInput("finish"));
|
||||
assertDoesNotThrow(() -> manager.getUserCommands().handleInput("unfinish"));
|
||||
assertDoesNotThrow(() -> manager.getUserCommands().handleInput("remove"));
|
||||
assertDoesNotThrow(() -> manager.getUserCommands().handleInput("back"));
|
||||
assertDoesNotThrow(() -> manager.getUserCommands().handleInput("edit"));
|
||||
}
|
||||
@Test
|
||||
@DisplayName("Check that editing is possible through UI")
|
||||
public void assertEditingTasksIsPossibleThroughUi() {
|
||||
int workerId = manager.createWorker("Alfred");
|
||||
int taskId = manager.addTask(workerId, "Run", "Jog 10 Miles");
|
||||
manager.getUserCommands().handleInput("selectTask");
|
||||
manager.getUserCommands().handleInput(taskId + "");
|
||||
manager.getUserCommands().handleInput("edit");
|
||||
manager.getUserCommands().handleInput("Walk;Walk 3 Miles");
|
||||
assertEquals("Walk", manager.getTask(taskId).getName());
|
||||
assertEquals("Walk 3 Miles", manager.getTask(taskId).getDescription());
|
||||
manager.getUserCommands().handleInput("back");
|
||||
}
|
||||
@Test
|
||||
@DisplayName("Assert that removing Workers is possible through the UI")
|
||||
public void assertRemovingWorkersIsPossibleThroughUI() {
|
||||
int workerId = manager.createWorker("Alfred");
|
||||
int workerId2 = manager.createWorker("Balfred");
|
||||
manager.getUserCommands().handleInput("listWorkers");
|
||||
manager.getUserCommands().handleInput(workerId + "");
|
||||
assertDoesNotThrow(() -> manager.getUserCommands().handleInput("remove"));
|
||||
manager.getUserCommands().handleInput(workerId2 + "");
|
||||
assertDoesNotThrow(() -> manager.getUserCommands().handleInput("back"));
|
||||
}
|
||||
@Test
|
||||
@DisplayName("Assert that removing a worker removes the worker from the worker list")
|
||||
public void assertRemoveWorkerActuallyRemoves() {
|
||||
int workerId = manager.createWorker("Alfred");
|
||||
manager.removeWorker(workerId);
|
||||
assertThrows(IllegalArgumentException.class, () -> manager.getWorker(workerId)); // Use getWorker
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user