445 lines
15 KiB
Java
445 lines
15 KiB
Java
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();
|
|
}
|
|
}
|