diff --git a/assignment/src/main/java/ch/unisg/assignment/assignment/application/port/in/ApplyForTaskUseCase.java b/assignment/src/main/java/ch/unisg/assignment/assignment/application/port/in/ApplyForTaskUseCase.java
deleted file mode 100644
index 1e7180a..0000000
--- a/assignment/src/main/java/ch/unisg/assignment/assignment/application/port/in/ApplyForTaskUseCase.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package ch.unisg.assignment.assignment.application.port.in;
-
-import ch.unisg.assignment.assignment.domain.Task;
-
-public interface ApplyForTaskUseCase {
- Task applyForTask(ApplyForTaskCommand applyForTaskCommand);
-}
diff --git a/assignment/.gitignore b/roster/.gitignore
similarity index 100%
rename from assignment/.gitignore
rename to roster/.gitignore
diff --git a/assignment/.mvn/wrapper/MavenWrapperDownloader.java b/roster/.mvn/wrapper/MavenWrapperDownloader.java
similarity index 100%
rename from assignment/.mvn/wrapper/MavenWrapperDownloader.java
rename to roster/.mvn/wrapper/MavenWrapperDownloader.java
diff --git a/assignment/.mvn/wrapper/maven-wrapper.jar b/roster/.mvn/wrapper/maven-wrapper.jar
similarity index 100%
rename from assignment/.mvn/wrapper/maven-wrapper.jar
rename to roster/.mvn/wrapper/maven-wrapper.jar
diff --git a/assignment/.mvn/wrapper/maven-wrapper.properties b/roster/.mvn/wrapper/maven-wrapper.properties
similarity index 100%
rename from assignment/.mvn/wrapper/maven-wrapper.properties
rename to roster/.mvn/wrapper/maven-wrapper.properties
diff --git a/assignment/Dockerfile b/roster/Dockerfile
similarity index 100%
rename from assignment/Dockerfile
rename to roster/Dockerfile
diff --git a/assignment/mvnw b/roster/mvnw
similarity index 100%
rename from assignment/mvnw
rename to roster/mvnw
diff --git a/assignment/mvnw.cmd b/roster/mvnw.cmd
similarity index 100%
rename from assignment/mvnw.cmd
rename to roster/mvnw.cmd
diff --git a/assignment/pom.xml b/roster/pom.xml
similarity index 94%
rename from assignment/pom.xml
rename to roster/pom.xml
index b4650de..f51bff7 100644
--- a/assignment/pom.xml
+++ b/roster/pom.xml
@@ -56,6 +56,12 @@
1.2
+
+ org.eclipse.paho
+ org.eclipse.paho.client.mqttv3
+ 1.2.5
+
+
org.json
json
diff --git a/assignment/src/main/java/ch/unisg/assignment/AssignmentApplication.java b/roster/src/main/java/ch/unisg/roster/RosterApplication.java
similarity index 60%
rename from assignment/src/main/java/ch/unisg/assignment/AssignmentApplication.java
rename to roster/src/main/java/ch/unisg/roster/RosterApplication.java
index 30d7782..dd57a5d 100644
--- a/assignment/src/main/java/ch/unisg/assignment/AssignmentApplication.java
+++ b/roster/src/main/java/ch/unisg/roster/RosterApplication.java
@@ -1,13 +1,13 @@
-package ch.unisg.assignment;
+package ch.unisg.roster;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
-public class AssignmentApplication {
+public class RosterApplication {
public static void main(String[] args) {
- SpringApplication.run(AssignmentApplication.class, args);
+ SpringApplication.run(RosterApplication.class, args);
}
}
diff --git a/roster/src/main/java/ch/unisg/roster/roster/adapter/common/clients/TapasMqttClient.java b/roster/src/main/java/ch/unisg/roster/roster/adapter/common/clients/TapasMqttClient.java
new file mode 100644
index 0000000..8b5411b
--- /dev/null
+++ b/roster/src/main/java/ch/unisg/roster/roster/adapter/common/clients/TapasMqttClient.java
@@ -0,0 +1,94 @@
+package ch.unisg.roster.roster.adapter.common.clients;
+
+import ch.unisg.roster.roster.adapter.in.messaging.mqtt.AuctionEventsMqttDispatcher;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.eclipse.paho.client.mqttv3.*;
+import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
+
+import java.nio.charset.StandardCharsets;
+import java.util.UUID;
+
+/**
+ * MQTT client for your TAPAS application. This class is defined as a singleton, but it does not have
+ * to be this way. This class is only provided as an example to help you bootstrap your project.
+ * You are welcomed to change this class as you see fit.
+ */
+public class TapasMqttClient {
+ private static final Logger LOGGER = LogManager.getLogger(TapasMqttClient.class);
+
+ private static TapasMqttClient tapasClient = null;
+
+ private MqttClient mqttClient;
+ private final String mqttClientId;
+ private final String brokerAddress;
+
+ private final MessageReceivedCallback messageReceivedCallback;
+
+ private final AuctionEventsMqttDispatcher dispatcher;
+
+ private TapasMqttClient(String brokerAddress, AuctionEventsMqttDispatcher dispatcher) {
+ this.mqttClientId = UUID.randomUUID().toString();
+ this.brokerAddress = brokerAddress;
+
+ this.messageReceivedCallback = new MessageReceivedCallback();
+
+ this.dispatcher = dispatcher;
+ }
+
+ public static synchronized TapasMqttClient getInstance(String brokerAddress,
+ AuctionEventsMqttDispatcher dispatcher) {
+
+ if (tapasClient == null) {
+ tapasClient = new TapasMqttClient(brokerAddress, dispatcher);
+ }
+
+ return tapasClient;
+ }
+
+ public void startReceivingMessages() throws MqttException {
+ mqttClient = new org.eclipse.paho.client.mqttv3.MqttClient(brokerAddress, mqttClientId, new MemoryPersistence());
+ mqttClient.connect();
+ mqttClient.setCallback(messageReceivedCallback);
+
+ subscribeToAllTopics();
+ }
+
+ public void stopReceivingMessages() throws MqttException {
+ mqttClient.disconnect();
+ }
+
+ private void subscribeToAllTopics() throws MqttException {
+ for (String topic : dispatcher.getAllTopics()) {
+ subscribeToTopic(topic);
+ }
+ }
+
+ private void subscribeToTopic(String topic) throws MqttException {
+ mqttClient.subscribe(topic);
+ }
+
+ private void publishMessage(String topic, String payload) throws MqttException {
+ MqttMessage message = new MqttMessage(payload.getBytes(StandardCharsets.UTF_8));
+ mqttClient.publish(topic, message);
+ }
+
+ private class MessageReceivedCallback implements MqttCallback {
+
+ @Override
+ public void connectionLost(Throwable cause) { }
+
+ @Override
+ public void messageArrived(String topic, MqttMessage message) {
+ LOGGER.info("Received new MQTT message for topic " + topic + ": "
+ + new String(message.getPayload()));
+
+ if (topic != null && !topic.isEmpty()) {
+ dispatcher.dispatchEvent(topic, message);
+ }
+ }
+
+ @Override
+ public void deliveryComplete(IMqttDeliveryToken token) { }
+ }
+}
diff --git a/roster/src/main/java/ch/unisg/roster/roster/adapter/in/messaging/mqtt/AuctionEventMqttListener.java b/roster/src/main/java/ch/unisg/roster/roster/adapter/in/messaging/mqtt/AuctionEventMqttListener.java
new file mode 100644
index 0000000..6eb109f
--- /dev/null
+++ b/roster/src/main/java/ch/unisg/roster/roster/adapter/in/messaging/mqtt/AuctionEventMqttListener.java
@@ -0,0 +1,11 @@
+package ch.unisg.roster.roster.adapter.in.messaging.mqtt;
+
+import org.eclipse.paho.client.mqttv3.MqttMessage;
+
+/**
+ * Abstract MQTT listener for auction-related events
+ */
+public abstract class AuctionEventMqttListener {
+
+ public abstract boolean handleEvent(MqttMessage message);
+}
diff --git a/roster/src/main/java/ch/unisg/roster/roster/adapter/in/messaging/mqtt/AuctionEventsMqttDispatcher.java b/roster/src/main/java/ch/unisg/roster/roster/adapter/in/messaging/mqtt/AuctionEventsMqttDispatcher.java
new file mode 100644
index 0000000..d19c803
--- /dev/null
+++ b/roster/src/main/java/ch/unisg/roster/roster/adapter/in/messaging/mqtt/AuctionEventsMqttDispatcher.java
@@ -0,0 +1,52 @@
+package ch.unisg.roster.roster.adapter.in.messaging.mqtt;
+
+import org.eclipse.paho.client.mqttv3.*;
+
+import java.util.Hashtable;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Dispatches MQTT messages for known topics to associated event listeners. Used in conjunction with
+ * {@link ch.unisg.tapas.auctionhouse.adapter.common.clients.TapasMqttClient}.
+ *
+ * This is where you would define MQTT topics and map them to event listeners (see
+ * {@link AuctionEventsMqttDispatcher#initRouter()}).
+ *
+ * This class is only provided as an example to help you bootstrap the project. You are welcomed to
+ * change this class as you see fit.
+ */
+public class AuctionEventsMqttDispatcher {
+ private final Map router;
+
+ public AuctionEventsMqttDispatcher() {
+ this.router = new Hashtable<>();
+ initRouter();
+ }
+
+ // TODO: Register here your topics and event listener adapters
+ private void initRouter() {
+ router.put("ch/unisg/tapas-group-tutors/executors/added", new ExecutorAddedEventListenerMqttAdapter());
+ router.put("ch/unisg/tapas-group-tutors/executors/removed", new ExecutorRemovedEventListenerMqttAdapter());
+ }
+
+ /**
+ * Returns all topics registered with this dispatcher.
+ *
+ * @return the set of registered topics
+ */
+ public Set getAllTopics() {
+ return router.keySet();
+ }
+
+ /**
+ * Dispatches an event received via MQTT for a given topic.
+ *
+ * @param topic the topic for which the MQTT message was received
+ * @param message the received MQTT message
+ */
+ public void dispatchEvent(String topic, MqttMessage message) {
+ AuctionEventMqttListener listener = router.get(topic);
+ listener.handleEvent(message);
+ }
+}
diff --git a/roster/src/main/java/ch/unisg/roster/roster/adapter/in/messaging/mqtt/ExecutorAddedEventListenerMqttAdapter.java b/roster/src/main/java/ch/unisg/roster/roster/adapter/in/messaging/mqtt/ExecutorAddedEventListenerMqttAdapter.java
new file mode 100644
index 0000000..dd9257e
--- /dev/null
+++ b/roster/src/main/java/ch/unisg/roster/roster/adapter/in/messaging/mqtt/ExecutorAddedEventListenerMqttAdapter.java
@@ -0,0 +1,44 @@
+package ch.unisg.roster.roster.adapter.in.messaging.mqtt;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.eclipse.paho.client.mqttv3.MqttMessage;
+
+import ch.unisg.common.valueobject.ExecutorURI;
+import ch.unisg.roster.roster.application.handler.ExecutorAddedHandler;
+import ch.unisg.roster.roster.application.port.in.ExecutorAddedEvent;
+import ch.unisg.roster.roster.domain.valueobject.ExecutorType;
+
+public class ExecutorAddedEventListenerMqttAdapter extends AuctionEventMqttListener {
+ private static final Logger LOGGER = LogManager.getLogger(ExecutorAddedEventListenerMqttAdapter.class);
+
+ @Override
+ public boolean handleEvent(MqttMessage message) {
+ String payload = new String(message.getPayload());
+
+ try {
+ // Note: this messge representation is provided only as an example. You should use a
+ // representation that makes sense in the context of your application.
+ JsonNode data = new ObjectMapper().readTree(payload);
+
+ String taskType = data.get("taskType").asText();
+ String executorId = data.get("executorURI").asText();
+
+ ExecutorAddedEvent executorAddedEvent = new ExecutorAddedEvent(
+ new ExecutorURI(executorId),
+ new ExecutorType(taskType)
+ );
+
+ ExecutorAddedHandler newExecutorHandler = new ExecutorAddedHandler();
+ newExecutorHandler.handleNewExecutorEvent(executorAddedEvent);
+ } catch (JsonProcessingException | NullPointerException e) {
+ LOGGER.error(e.getMessage(), e);
+ return false;
+ }
+
+ return true;
+ }
+}
diff --git a/roster/src/main/java/ch/unisg/roster/roster/adapter/in/messaging/mqtt/ExecutorRemovedEventListenerMqttAdapter.java b/roster/src/main/java/ch/unisg/roster/roster/adapter/in/messaging/mqtt/ExecutorRemovedEventListenerMqttAdapter.java
new file mode 100644
index 0000000..d7b5067
--- /dev/null
+++ b/roster/src/main/java/ch/unisg/roster/roster/adapter/in/messaging/mqtt/ExecutorRemovedEventListenerMqttAdapter.java
@@ -0,0 +1,41 @@
+package ch.unisg.roster.roster.adapter.in.messaging.mqtt;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.eclipse.paho.client.mqttv3.MqttMessage;
+
+import ch.unisg.common.valueobject.ExecutorURI;
+import ch.unisg.roster.roster.application.handler.ExecutorRemovedHandler;
+import ch.unisg.roster.roster.application.port.in.ExecutorRemovedEvent;
+
+public class ExecutorRemovedEventListenerMqttAdapter extends AuctionEventMqttListener {
+ private static final Logger LOGGER = LogManager.getLogger(ExecutorRemovedEventListenerMqttAdapter.class);
+
+ @Override
+ public boolean handleEvent(MqttMessage message) {
+ String payload = new String(message.getPayload());
+
+ try {
+ // Note: this messge representation is provided only as an example. You should use a
+ // representation that makes sense in the context of your application.
+ JsonNode data = new ObjectMapper().readTree(payload);
+
+ String executorId = data.get("executorURI").asText();
+
+ ExecutorRemovedEvent executorRemovedEvent = new ExecutorRemovedEvent(
+ new ExecutorURI(executorId));
+
+ ExecutorRemovedHandler executorRemovedHandler = new ExecutorRemovedHandler();
+ executorRemovedHandler.handleExecutorRemovedEvent(executorRemovedEvent);
+
+ } catch (JsonProcessingException | NullPointerException e) {
+ LOGGER.error(e.getMessage(), e);
+ return false;
+ }
+
+ return true;
+ }
+}
diff --git a/assignment/src/main/java/ch/unisg/assignment/assignment/adapter/in/web/ApplyForTaskController.java b/roster/src/main/java/ch/unisg/roster/roster/adapter/in/web/ApplyForTaskController.java
similarity index 73%
rename from assignment/src/main/java/ch/unisg/assignment/assignment/adapter/in/web/ApplyForTaskController.java
rename to roster/src/main/java/ch/unisg/roster/roster/adapter/in/web/ApplyForTaskController.java
index 7b8331c..28170f0 100644
--- a/assignment/src/main/java/ch/unisg/assignment/assignment/adapter/in/web/ApplyForTaskController.java
+++ b/roster/src/main/java/ch/unisg/roster/roster/adapter/in/web/ApplyForTaskController.java
@@ -1,13 +1,13 @@
-package ch.unisg.assignment.assignment.adapter.in.web;
+package ch.unisg.roster.roster.adapter.in.web;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
-import ch.unisg.assignment.assignment.application.port.in.ApplyForTaskCommand;
-import ch.unisg.assignment.assignment.application.port.in.ApplyForTaskUseCase;
-import ch.unisg.assignment.assignment.domain.ExecutorInfo;
-import ch.unisg.assignment.assignment.domain.Task;
+import ch.unisg.roster.roster.application.port.in.ApplyForTaskCommand;
+import ch.unisg.roster.roster.application.port.in.ApplyForTaskUseCase;
+import ch.unisg.roster.roster.domain.ExecutorInfo;
+import ch.unisg.roster.roster.domain.Task;
@RestController
public class ApplyForTaskController {
diff --git a/assignment/src/main/java/ch/unisg/assignment/assignment/adapter/in/web/DeleteTaskController.java b/roster/src/main/java/ch/unisg/roster/roster/adapter/in/web/DeleteTaskController.java
similarity index 79%
rename from assignment/src/main/java/ch/unisg/assignment/assignment/adapter/in/web/DeleteTaskController.java
rename to roster/src/main/java/ch/unisg/roster/roster/adapter/in/web/DeleteTaskController.java
index b34e6db..eef8b71 100644
--- a/assignment/src/main/java/ch/unisg/assignment/assignment/adapter/in/web/DeleteTaskController.java
+++ b/roster/src/main/java/ch/unisg/roster/roster/adapter/in/web/DeleteTaskController.java
@@ -1,4 +1,4 @@
-package ch.unisg.assignment.assignment.adapter.in.web;
+package ch.unisg.roster.roster.adapter.in.web;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
@@ -6,9 +6,9 @@ import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
-import ch.unisg.assignment.assignment.application.port.in.DeleteTaskCommand;
-import ch.unisg.assignment.assignment.application.port.in.DeleteTaskUseCase;
-import ch.unisg.assignment.assignment.domain.Task;
+import ch.unisg.roster.roster.application.port.in.DeleteTaskCommand;
+import ch.unisg.roster.roster.application.port.in.DeleteTaskUseCase;
+import ch.unisg.roster.roster.domain.Task;
@RestController
public class DeleteTaskController {
diff --git a/assignment/src/main/java/ch/unisg/assignment/assignment/adapter/in/web/NewTaskController.java b/roster/src/main/java/ch/unisg/roster/roster/adapter/in/web/NewTaskController.java
similarity index 81%
rename from assignment/src/main/java/ch/unisg/assignment/assignment/adapter/in/web/NewTaskController.java
rename to roster/src/main/java/ch/unisg/roster/roster/adapter/in/web/NewTaskController.java
index 9faf2ec..af01346 100644
--- a/assignment/src/main/java/ch/unisg/assignment/assignment/adapter/in/web/NewTaskController.java
+++ b/roster/src/main/java/ch/unisg/roster/roster/adapter/in/web/NewTaskController.java
@@ -1,4 +1,4 @@
-package ch.unisg.assignment.assignment.adapter.in.web;
+package ch.unisg.roster.roster.adapter.in.web;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
@@ -6,9 +6,9 @@ import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
-import ch.unisg.assignment.assignment.application.port.in.NewTaskCommand;
-import ch.unisg.assignment.assignment.application.port.in.NewTaskUseCase;
-import ch.unisg.assignment.assignment.domain.Task;
+import ch.unisg.roster.roster.application.port.in.NewTaskCommand;
+import ch.unisg.roster.roster.application.port.in.NewTaskUseCase;
+import ch.unisg.roster.roster.domain.Task;
@RestController
public class NewTaskController {
diff --git a/assignment/src/main/java/ch/unisg/assignment/assignment/adapter/in/web/TaskCompletedController.java b/roster/src/main/java/ch/unisg/roster/roster/adapter/in/web/TaskCompletedController.java
similarity index 79%
rename from assignment/src/main/java/ch/unisg/assignment/assignment/adapter/in/web/TaskCompletedController.java
rename to roster/src/main/java/ch/unisg/roster/roster/adapter/in/web/TaskCompletedController.java
index df89c7f..f81db32 100644
--- a/assignment/src/main/java/ch/unisg/assignment/assignment/adapter/in/web/TaskCompletedController.java
+++ b/roster/src/main/java/ch/unisg/roster/roster/adapter/in/web/TaskCompletedController.java
@@ -1,4 +1,4 @@
-package ch.unisg.assignment.assignment.adapter.in.web;
+package ch.unisg.roster.roster.adapter.in.web;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
@@ -6,9 +6,9 @@ import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
-import ch.unisg.assignment.assignment.application.port.in.TaskCompletedCommand;
-import ch.unisg.assignment.assignment.application.port.in.TaskCompletedUseCase;
-import ch.unisg.assignment.assignment.domain.Task;
+import ch.unisg.roster.roster.application.port.in.TaskCompletedCommand;
+import ch.unisg.roster.roster.application.port.in.TaskCompletedUseCase;
+import ch.unisg.roster.roster.domain.Task;
@RestController
public class TaskCompletedController {
diff --git a/assignment/src/main/java/ch/unisg/assignment/assignment/adapter/in/web/WebControllerExceptionHandler.java b/roster/src/main/java/ch/unisg/roster/roster/adapter/in/web/WebControllerExceptionHandler.java
similarity index 93%
rename from assignment/src/main/java/ch/unisg/assignment/assignment/adapter/in/web/WebControllerExceptionHandler.java
rename to roster/src/main/java/ch/unisg/roster/roster/adapter/in/web/WebControllerExceptionHandler.java
index 19cce0d..f0a4974 100644
--- a/assignment/src/main/java/ch/unisg/assignment/assignment/adapter/in/web/WebControllerExceptionHandler.java
+++ b/roster/src/main/java/ch/unisg/roster/roster/adapter/in/web/WebControllerExceptionHandler.java
@@ -1,4 +1,4 @@
-package ch.unisg.assignment.assignment.adapter.in.web;
+package ch.unisg.roster.roster.adapter.in.web;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
diff --git a/assignment/src/main/java/ch/unisg/assignment/assignment/adapter/out/web/GetAllExecutorInExecutorPoolByTypeAdapter.java b/roster/src/main/java/ch/unisg/roster/roster/adapter/out/web/GetAllExecutorInExecutorPoolByTypeAdapter.java
similarity index 89%
rename from assignment/src/main/java/ch/unisg/assignment/assignment/adapter/out/web/GetAllExecutorInExecutorPoolByTypeAdapter.java
rename to roster/src/main/java/ch/unisg/roster/roster/adapter/out/web/GetAllExecutorInExecutorPoolByTypeAdapter.java
index 1c02839..df444ca 100644
--- a/assignment/src/main/java/ch/unisg/assignment/assignment/adapter/out/web/GetAllExecutorInExecutorPoolByTypeAdapter.java
+++ b/roster/src/main/java/ch/unisg/roster/roster/adapter/out/web/GetAllExecutorInExecutorPoolByTypeAdapter.java
@@ -1,4 +1,4 @@
-package ch.unisg.assignment.assignment.adapter.out.web;
+package ch.unisg.roster.roster.adapter.out.web;
import java.io.IOException;
import java.net.URI;
@@ -14,8 +14,8 @@ import org.springframework.context.annotation.Primary;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
-import ch.unisg.assignment.assignment.application.port.out.GetAllExecutorInExecutorPoolByTypePort;
-import ch.unisg.assignment.assignment.domain.valueobject.ExecutorType;
+import ch.unisg.roster.roster.application.port.out.GetAllExecutorInExecutorPoolByTypePort;
+import ch.unisg.roster.roster.domain.valueobject.ExecutorType;
@Component
@Primary
diff --git a/assignment/src/main/java/ch/unisg/assignment/assignment/adapter/out/web/PublishNewTaskEventAdapter.java b/roster/src/main/java/ch/unisg/roster/roster/adapter/out/web/PublishNewTaskEventAdapter.java
similarity index 91%
rename from assignment/src/main/java/ch/unisg/assignment/assignment/adapter/out/web/PublishNewTaskEventAdapter.java
rename to roster/src/main/java/ch/unisg/roster/roster/adapter/out/web/PublishNewTaskEventAdapter.java
index 10638d3..6a6b7f7 100644
--- a/assignment/src/main/java/ch/unisg/assignment/assignment/adapter/out/web/PublishNewTaskEventAdapter.java
+++ b/roster/src/main/java/ch/unisg/roster/roster/adapter/out/web/PublishNewTaskEventAdapter.java
@@ -1,4 +1,4 @@
-package ch.unisg.assignment.assignment.adapter.out.web;
+package ch.unisg.roster.roster.adapter.out.web;
import java.io.IOException;
import java.net.URI;
@@ -12,8 +12,8 @@ import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Component;
-import ch.unisg.assignment.assignment.application.port.out.NewTaskEventPort;
-import ch.unisg.assignment.assignment.domain.event.NewTaskEvent;
+import ch.unisg.roster.roster.application.port.out.NewTaskEventPort;
+import ch.unisg.roster.roster.domain.event.NewTaskEvent;
@Component
@Primary
diff --git a/assignment/src/main/java/ch/unisg/assignment/assignment/adapter/out/web/PublishTaskAssignedEventAdapter.java b/roster/src/main/java/ch/unisg/roster/roster/adapter/out/web/PublishTaskAssignedEventAdapter.java
similarity index 88%
rename from assignment/src/main/java/ch/unisg/assignment/assignment/adapter/out/web/PublishTaskAssignedEventAdapter.java
rename to roster/src/main/java/ch/unisg/roster/roster/adapter/out/web/PublishTaskAssignedEventAdapter.java
index 45a10f3..c71e306 100644
--- a/assignment/src/main/java/ch/unisg/assignment/assignment/adapter/out/web/PublishTaskAssignedEventAdapter.java
+++ b/roster/src/main/java/ch/unisg/roster/roster/adapter/out/web/PublishTaskAssignedEventAdapter.java
@@ -1,4 +1,4 @@
-package ch.unisg.assignment.assignment.adapter.out.web;
+package ch.unisg.roster.roster.adapter.out.web;
import java.io.IOException;
import java.net.URI;
@@ -13,8 +13,8 @@ import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Component;
-import ch.unisg.assignment.assignment.application.port.out.TaskAssignedEventPort;
-import ch.unisg.assignment.assignment.domain.event.TaskAssignedEvent;
+import ch.unisg.roster.roster.application.port.out.TaskAssignedEventPort;
+import ch.unisg.roster.roster.domain.event.TaskAssignedEvent;
@Component
@Primary
diff --git a/assignment/src/main/java/ch/unisg/assignment/assignment/adapter/out/web/PublishTaskCompletedEventAdapter.java b/roster/src/main/java/ch/unisg/roster/roster/adapter/out/web/PublishTaskCompletedEventAdapter.java
similarity index 89%
rename from assignment/src/main/java/ch/unisg/assignment/assignment/adapter/out/web/PublishTaskCompletedEventAdapter.java
rename to roster/src/main/java/ch/unisg/roster/roster/adapter/out/web/PublishTaskCompletedEventAdapter.java
index e9c4944..7038291 100644
--- a/assignment/src/main/java/ch/unisg/assignment/assignment/adapter/out/web/PublishTaskCompletedEventAdapter.java
+++ b/roster/src/main/java/ch/unisg/roster/roster/adapter/out/web/PublishTaskCompletedEventAdapter.java
@@ -1,4 +1,4 @@
-package ch.unisg.assignment.assignment.adapter.out.web;
+package ch.unisg.roster.roster.adapter.out.web;
import java.io.IOException;
import java.net.URI;
@@ -13,8 +13,8 @@ import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Component;
-import ch.unisg.assignment.assignment.application.port.out.TaskCompletedEventPort;
-import ch.unisg.assignment.assignment.domain.event.TaskCompletedEvent;
+import ch.unisg.roster.roster.application.port.out.TaskCompletedEventPort;
+import ch.unisg.roster.roster.domain.event.TaskCompletedEvent;
@Component
@Primary
diff --git a/roster/src/main/java/ch/unisg/roster/roster/application/handler/ExecutorAddedHandler.java b/roster/src/main/java/ch/unisg/roster/roster/application/handler/ExecutorAddedHandler.java
new file mode 100644
index 0000000..9545c07
--- /dev/null
+++ b/roster/src/main/java/ch/unisg/roster/roster/application/handler/ExecutorAddedHandler.java
@@ -0,0 +1,16 @@
+package ch.unisg.roster.roster.application.handler;
+
+import ch.unisg.roster.roster.application.port.in.ExecutorAddedEvent;
+import ch.unisg.roster.roster.application.port.in.ExecutorAddedEventHandler;
+import ch.unisg.roster.roster.domain.ExecutorRegistry;
+import org.springframework.stereotype.Component;
+
+@Component
+public class ExecutorAddedHandler implements ExecutorAddedEventHandler {
+
+ @Override
+ public boolean handleNewExecutorEvent(ExecutorAddedEvent executorAddedEvent) {
+ return ExecutorRegistry.getInstance().addExecutor(executorAddedEvent.getExecutorType(),
+ executorAddedEvent.getExecutorURI());
+ }
+}
diff --git a/roster/src/main/java/ch/unisg/roster/roster/application/handler/ExecutorRemovedHandler.java b/roster/src/main/java/ch/unisg/roster/roster/application/handler/ExecutorRemovedHandler.java
new file mode 100644
index 0000000..c6e3f68
--- /dev/null
+++ b/roster/src/main/java/ch/unisg/roster/roster/application/handler/ExecutorRemovedHandler.java
@@ -0,0 +1,19 @@
+package ch.unisg.roster.roster.application.handler;
+
+import ch.unisg.roster.roster.application.port.in.ExecutorRemovedEvent;
+import ch.unisg.roster.roster.application.port.in.ExecutorRemovedEventHandler;
+import ch.unisg.roster.roster.domain.ExecutorRegistry;
+import org.springframework.stereotype.Component;
+
+/**
+ * Handler for executor removed events. It removes the executor from this roster's executor
+ * registry.
+ */
+@Component
+public class ExecutorRemovedHandler implements ExecutorRemovedEventHandler {
+
+ @Override
+ public boolean handleExecutorRemovedEvent(ExecutorRemovedEvent executorRemovedEvent) {
+ return ExecutorRegistry.getInstance().removeExecutor(executorRemovedEvent.getExecutorURI());
+ }
+}
diff --git a/assignment/src/main/java/ch/unisg/assignment/assignment/application/port/in/ApplyForTaskCommand.java b/roster/src/main/java/ch/unisg/roster/roster/application/port/in/ApplyForTaskCommand.java
similarity index 82%
rename from assignment/src/main/java/ch/unisg/assignment/assignment/application/port/in/ApplyForTaskCommand.java
rename to roster/src/main/java/ch/unisg/roster/roster/application/port/in/ApplyForTaskCommand.java
index bdc16d9..f03ef5f 100644
--- a/assignment/src/main/java/ch/unisg/assignment/assignment/application/port/in/ApplyForTaskCommand.java
+++ b/roster/src/main/java/ch/unisg/roster/roster/application/port/in/ApplyForTaskCommand.java
@@ -1,8 +1,8 @@
-package ch.unisg.assignment.assignment.application.port.in;
+package ch.unisg.roster.roster.application.port.in;
import javax.validation.constraints.NotNull;
-import ch.unisg.assignment.assignment.domain.valueobject.ExecutorType;
+import ch.unisg.roster.roster.domain.valueobject.ExecutorType;
import ch.unisg.common.validation.SelfValidating;
import ch.unisg.common.valueobject.ExecutorURI;
import lombok.EqualsAndHashCode;
diff --git a/roster/src/main/java/ch/unisg/roster/roster/application/port/in/ApplyForTaskUseCase.java b/roster/src/main/java/ch/unisg/roster/roster/application/port/in/ApplyForTaskUseCase.java
new file mode 100644
index 0000000..61b7bd4
--- /dev/null
+++ b/roster/src/main/java/ch/unisg/roster/roster/application/port/in/ApplyForTaskUseCase.java
@@ -0,0 +1,7 @@
+package ch.unisg.roster.roster.application.port.in;
+
+import ch.unisg.roster.roster.domain.Task;
+
+public interface ApplyForTaskUseCase {
+ Task applyForTask(ApplyForTaskCommand applyForTaskCommand);
+}
diff --git a/assignment/src/main/java/ch/unisg/assignment/assignment/application/port/in/DeleteTaskCommand.java b/roster/src/main/java/ch/unisg/roster/roster/application/port/in/DeleteTaskCommand.java
similarity index 80%
rename from assignment/src/main/java/ch/unisg/assignment/assignment/application/port/in/DeleteTaskCommand.java
rename to roster/src/main/java/ch/unisg/roster/roster/application/port/in/DeleteTaskCommand.java
index 7239acc..9f59dc3 100644
--- a/assignment/src/main/java/ch/unisg/assignment/assignment/application/port/in/DeleteTaskCommand.java
+++ b/roster/src/main/java/ch/unisg/roster/roster/application/port/in/DeleteTaskCommand.java
@@ -1,8 +1,8 @@
-package ch.unisg.assignment.assignment.application.port.in;
+package ch.unisg.roster.roster.application.port.in;
import javax.validation.constraints.NotNull;
-import ch.unisg.assignment.assignment.domain.valueobject.ExecutorType;
+import ch.unisg.roster.roster.domain.valueobject.ExecutorType;
import ch.unisg.common.validation.SelfValidating;
import lombok.EqualsAndHashCode;
import lombok.Value;
diff --git a/assignment/src/main/java/ch/unisg/assignment/assignment/application/port/in/DeleteTaskUseCase.java b/roster/src/main/java/ch/unisg/roster/roster/application/port/in/DeleteTaskUseCase.java
similarity index 62%
rename from assignment/src/main/java/ch/unisg/assignment/assignment/application/port/in/DeleteTaskUseCase.java
rename to roster/src/main/java/ch/unisg/roster/roster/application/port/in/DeleteTaskUseCase.java
index e890e8b..2acfc63 100644
--- a/assignment/src/main/java/ch/unisg/assignment/assignment/application/port/in/DeleteTaskUseCase.java
+++ b/roster/src/main/java/ch/unisg/roster/roster/application/port/in/DeleteTaskUseCase.java
@@ -1,4 +1,4 @@
-package ch.unisg.assignment.assignment.application.port.in;
+package ch.unisg.roster.roster.application.port.in;
public interface DeleteTaskUseCase {
boolean deleteTask(DeleteTaskCommand deleteTaskCommand);
diff --git a/roster/src/main/java/ch/unisg/roster/roster/application/port/in/ExecutorAddedEvent.java b/roster/src/main/java/ch/unisg/roster/roster/application/port/in/ExecutorAddedEvent.java
new file mode 100644
index 0000000..0e10b8e
--- /dev/null
+++ b/roster/src/main/java/ch/unisg/roster/roster/application/port/in/ExecutorAddedEvent.java
@@ -0,0 +1,33 @@
+package ch.unisg.roster.roster.application.port.in;
+
+import lombok.Value;
+
+import javax.validation.constraints.NotNull;
+
+import ch.unisg.common.validation.SelfValidating;
+import ch.unisg.common.valueobject.ExecutorURI;
+import ch.unisg.roster.roster.domain.valueobject.ExecutorType;
+
+/**
+ * Event that notifies the auction house that an executor has been added to this TAPAS application.
+ */
+@Value
+public class ExecutorAddedEvent extends SelfValidating {
+ @NotNull
+ private final ExecutorURI executorURI;
+
+ @NotNull
+ private final ExecutorType executorType;
+
+ /**
+ * Constructs an executor added event.
+ *
+ * @param executorURI the identifier of the executor that was added to this TAPAS application
+ */
+ public ExecutorAddedEvent(ExecutorURI executorURI, ExecutorType executorType) {
+ this.executorURI = executorURI;
+ this.executorType = executorType;
+
+ this.validateSelf();
+ }
+}
diff --git a/roster/src/main/java/ch/unisg/roster/roster/application/port/in/ExecutorAddedEventHandler.java b/roster/src/main/java/ch/unisg/roster/roster/application/port/in/ExecutorAddedEventHandler.java
new file mode 100644
index 0000000..c7a9076
--- /dev/null
+++ b/roster/src/main/java/ch/unisg/roster/roster/application/port/in/ExecutorAddedEventHandler.java
@@ -0,0 +1,6 @@
+package ch.unisg.roster.roster.application.port.in;
+
+public interface ExecutorAddedEventHandler {
+
+ boolean handleNewExecutorEvent(ExecutorAddedEvent executorAddedEvent);
+}
diff --git a/roster/src/main/java/ch/unisg/roster/roster/application/port/in/ExecutorRemovedEvent.java b/roster/src/main/java/ch/unisg/roster/roster/application/port/in/ExecutorRemovedEvent.java
new file mode 100644
index 0000000..8753683
--- /dev/null
+++ b/roster/src/main/java/ch/unisg/roster/roster/application/port/in/ExecutorRemovedEvent.java
@@ -0,0 +1,27 @@
+package ch.unisg.roster.roster.application.port.in;
+
+import lombok.Value;
+
+import javax.validation.constraints.NotNull;
+
+import ch.unisg.common.validation.SelfValidating;
+import ch.unisg.common.valueobject.ExecutorURI;
+
+/**
+ * Event that notifies the auction house that an executor has been removed from this TAPAS application.
+ */
+@Value
+public class ExecutorRemovedEvent extends SelfValidating {
+ @NotNull
+ private final ExecutorURI executorURI;
+
+ /**
+ * Constructs an executor removed event.
+ *
+ * @param executorURI the identifier of the executor that was removed from this TAPAS application
+ */
+ public ExecutorRemovedEvent(ExecutorURI executorURI) {
+ this.executorURI = executorURI;
+ this.validateSelf();
+ }
+}
diff --git a/roster/src/main/java/ch/unisg/roster/roster/application/port/in/ExecutorRemovedEventHandler.java b/roster/src/main/java/ch/unisg/roster/roster/application/port/in/ExecutorRemovedEventHandler.java
new file mode 100644
index 0000000..79ee6a7
--- /dev/null
+++ b/roster/src/main/java/ch/unisg/roster/roster/application/port/in/ExecutorRemovedEventHandler.java
@@ -0,0 +1,6 @@
+package ch.unisg.roster.roster.application.port.in;
+
+public interface ExecutorRemovedEventHandler {
+
+ boolean handleExecutorRemovedEvent(ExecutorRemovedEvent executorRemovedEvent);
+}
diff --git a/assignment/src/main/java/ch/unisg/assignment/assignment/application/port/in/NewTaskCommand.java b/roster/src/main/java/ch/unisg/roster/roster/application/port/in/NewTaskCommand.java
similarity index 80%
rename from assignment/src/main/java/ch/unisg/assignment/assignment/application/port/in/NewTaskCommand.java
rename to roster/src/main/java/ch/unisg/roster/roster/application/port/in/NewTaskCommand.java
index f06798b..92a7403 100644
--- a/assignment/src/main/java/ch/unisg/assignment/assignment/application/port/in/NewTaskCommand.java
+++ b/roster/src/main/java/ch/unisg/roster/roster/application/port/in/NewTaskCommand.java
@@ -1,8 +1,8 @@
-package ch.unisg.assignment.assignment.application.port.in;
+package ch.unisg.roster.roster.application.port.in;
import javax.validation.constraints.NotNull;
-import ch.unisg.assignment.assignment.domain.valueobject.ExecutorType;
+import ch.unisg.roster.roster.domain.valueobject.ExecutorType;
import ch.unisg.common.validation.SelfValidating;
import lombok.EqualsAndHashCode;
import lombok.Value;
diff --git a/assignment/src/main/java/ch/unisg/assignment/assignment/application/port/in/NewTaskUseCase.java b/roster/src/main/java/ch/unisg/roster/roster/application/port/in/NewTaskUseCase.java
similarity index 62%
rename from assignment/src/main/java/ch/unisg/assignment/assignment/application/port/in/NewTaskUseCase.java
rename to roster/src/main/java/ch/unisg/roster/roster/application/port/in/NewTaskUseCase.java
index 21f084e..f1bd733 100644
--- a/assignment/src/main/java/ch/unisg/assignment/assignment/application/port/in/NewTaskUseCase.java
+++ b/roster/src/main/java/ch/unisg/roster/roster/application/port/in/NewTaskUseCase.java
@@ -1,4 +1,4 @@
-package ch.unisg.assignment.assignment.application.port.in;
+package ch.unisg.roster.roster.application.port.in;
public interface NewTaskUseCase {
boolean addNewTaskToQueue(NewTaskCommand newTaskCommand);
diff --git a/assignment/src/main/java/ch/unisg/assignment/assignment/application/port/in/TaskCompletedCommand.java b/roster/src/main/java/ch/unisg/roster/roster/application/port/in/TaskCompletedCommand.java
similarity index 91%
rename from assignment/src/main/java/ch/unisg/assignment/assignment/application/port/in/TaskCompletedCommand.java
rename to roster/src/main/java/ch/unisg/roster/roster/application/port/in/TaskCompletedCommand.java
index 08dc8eb..b7438c0 100644
--- a/assignment/src/main/java/ch/unisg/assignment/assignment/application/port/in/TaskCompletedCommand.java
+++ b/roster/src/main/java/ch/unisg/roster/roster/application/port/in/TaskCompletedCommand.java
@@ -1,4 +1,4 @@
-package ch.unisg.assignment.assignment.application.port.in;
+package ch.unisg.roster.roster.application.port.in;
import javax.validation.constraints.NotNull;
diff --git a/assignment/src/main/java/ch/unisg/assignment/assignment/application/port/in/TaskCompletedUseCase.java b/roster/src/main/java/ch/unisg/roster/roster/application/port/in/TaskCompletedUseCase.java
similarity index 64%
rename from assignment/src/main/java/ch/unisg/assignment/assignment/application/port/in/TaskCompletedUseCase.java
rename to roster/src/main/java/ch/unisg/roster/roster/application/port/in/TaskCompletedUseCase.java
index 1902952..51b305a 100644
--- a/assignment/src/main/java/ch/unisg/assignment/assignment/application/port/in/TaskCompletedUseCase.java
+++ b/roster/src/main/java/ch/unisg/roster/roster/application/port/in/TaskCompletedUseCase.java
@@ -1,4 +1,4 @@
-package ch.unisg.assignment.assignment.application.port.in;
+package ch.unisg.roster.roster.application.port.in;
public interface TaskCompletedUseCase {
void taskCompleted(TaskCompletedCommand taskCompletedCommand);
diff --git a/assignment/src/main/java/ch/unisg/assignment/assignment/application/port/out/GetAllExecutorInExecutorPoolByTypePort.java b/roster/src/main/java/ch/unisg/roster/roster/application/port/out/GetAllExecutorInExecutorPoolByTypePort.java
similarity index 63%
rename from assignment/src/main/java/ch/unisg/assignment/assignment/application/port/out/GetAllExecutorInExecutorPoolByTypePort.java
rename to roster/src/main/java/ch/unisg/roster/roster/application/port/out/GetAllExecutorInExecutorPoolByTypePort.java
index 9f6c824..f32a3f5 100644
--- a/assignment/src/main/java/ch/unisg/assignment/assignment/application/port/out/GetAllExecutorInExecutorPoolByTypePort.java
+++ b/roster/src/main/java/ch/unisg/roster/roster/application/port/out/GetAllExecutorInExecutorPoolByTypePort.java
@@ -1,6 +1,6 @@
-package ch.unisg.assignment.assignment.application.port.out;
+package ch.unisg.roster.roster.application.port.out;
-import ch.unisg.assignment.assignment.domain.valueobject.ExecutorType;
+import ch.unisg.roster.roster.domain.valueobject.ExecutorType;
public interface GetAllExecutorInExecutorPoolByTypePort {
/**
diff --git a/assignment/src/main/java/ch/unisg/assignment/assignment/application/port/out/NewTaskEventPort.java b/roster/src/main/java/ch/unisg/roster/roster/application/port/out/NewTaskEventPort.java
similarity index 56%
rename from assignment/src/main/java/ch/unisg/assignment/assignment/application/port/out/NewTaskEventPort.java
rename to roster/src/main/java/ch/unisg/roster/roster/application/port/out/NewTaskEventPort.java
index 243c7f2..75fda6d 100644
--- a/assignment/src/main/java/ch/unisg/assignment/assignment/application/port/out/NewTaskEventPort.java
+++ b/roster/src/main/java/ch/unisg/roster/roster/application/port/out/NewTaskEventPort.java
@@ -1,6 +1,6 @@
-package ch.unisg.assignment.assignment.application.port.out;
+package ch.unisg.roster.roster.application.port.out;
-import ch.unisg.assignment.assignment.domain.event.NewTaskEvent;
+import ch.unisg.roster.roster.domain.event.NewTaskEvent;
public interface NewTaskEventPort {
/**
diff --git a/assignment/src/main/java/ch/unisg/assignment/assignment/application/port/out/TaskAssignedEventPort.java b/roster/src/main/java/ch/unisg/roster/roster/application/port/out/TaskAssignedEventPort.java
similarity index 60%
rename from assignment/src/main/java/ch/unisg/assignment/assignment/application/port/out/TaskAssignedEventPort.java
rename to roster/src/main/java/ch/unisg/roster/roster/application/port/out/TaskAssignedEventPort.java
index 5f55ec8..2bcb2ae 100644
--- a/assignment/src/main/java/ch/unisg/assignment/assignment/application/port/out/TaskAssignedEventPort.java
+++ b/roster/src/main/java/ch/unisg/roster/roster/application/port/out/TaskAssignedEventPort.java
@@ -1,6 +1,6 @@
-package ch.unisg.assignment.assignment.application.port.out;
+package ch.unisg.roster.roster.application.port.out;
-import ch.unisg.assignment.assignment.domain.event.TaskAssignedEvent;
+import ch.unisg.roster.roster.domain.event.TaskAssignedEvent;
public interface TaskAssignedEventPort {
/**
diff --git a/assignment/src/main/java/ch/unisg/assignment/assignment/application/port/out/TaskCompletedEventPort.java b/roster/src/main/java/ch/unisg/roster/roster/application/port/out/TaskCompletedEventPort.java
similarity index 58%
rename from assignment/src/main/java/ch/unisg/assignment/assignment/application/port/out/TaskCompletedEventPort.java
rename to roster/src/main/java/ch/unisg/roster/roster/application/port/out/TaskCompletedEventPort.java
index 83ad179..a8c11ef 100644
--- a/assignment/src/main/java/ch/unisg/assignment/assignment/application/port/out/TaskCompletedEventPort.java
+++ b/roster/src/main/java/ch/unisg/roster/roster/application/port/out/TaskCompletedEventPort.java
@@ -1,6 +1,6 @@
-package ch.unisg.assignment.assignment.application.port.out;
+package ch.unisg.roster.roster.application.port.out;
-import ch.unisg.assignment.assignment.domain.event.TaskCompletedEvent;
+import ch.unisg.roster.roster.domain.event.TaskCompletedEvent;
public interface TaskCompletedEventPort {
/**
diff --git a/assignment/src/main/java/ch/unisg/assignment/assignment/application/service/ApplyForTaskService.java b/roster/src/main/java/ch/unisg/roster/roster/application/service/ApplyForTaskService.java
similarity index 65%
rename from assignment/src/main/java/ch/unisg/assignment/assignment/application/service/ApplyForTaskService.java
rename to roster/src/main/java/ch/unisg/roster/roster/application/service/ApplyForTaskService.java
index dfb70e0..26b75aa 100644
--- a/assignment/src/main/java/ch/unisg/assignment/assignment/application/service/ApplyForTaskService.java
+++ b/roster/src/main/java/ch/unisg/roster/roster/application/service/ApplyForTaskService.java
@@ -1,15 +1,15 @@
-package ch.unisg.assignment.assignment.application.service;
+package ch.unisg.roster.roster.application.service;
import javax.transaction.Transactional;
import org.springframework.stereotype.Component;
-import ch.unisg.assignment.assignment.application.port.in.ApplyForTaskCommand;
-import ch.unisg.assignment.assignment.application.port.in.ApplyForTaskUseCase;
-import ch.unisg.assignment.assignment.application.port.out.TaskAssignedEventPort;
-import ch.unisg.assignment.assignment.domain.Roster;
-import ch.unisg.assignment.assignment.domain.Task;
-import ch.unisg.assignment.assignment.domain.event.TaskAssignedEvent;
+import ch.unisg.roster.roster.application.port.in.ApplyForTaskCommand;
+import ch.unisg.roster.roster.application.port.in.ApplyForTaskUseCase;
+import ch.unisg.roster.roster.application.port.out.TaskAssignedEventPort;
+import ch.unisg.roster.roster.domain.Roster;
+import ch.unisg.roster.roster.domain.Task;
+import ch.unisg.roster.roster.domain.event.TaskAssignedEvent;
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
diff --git a/assignment/src/main/java/ch/unisg/assignment/assignment/application/service/DeleteTaskService.java b/roster/src/main/java/ch/unisg/roster/roster/application/service/DeleteTaskService.java
similarity index 67%
rename from assignment/src/main/java/ch/unisg/assignment/assignment/application/service/DeleteTaskService.java
rename to roster/src/main/java/ch/unisg/roster/roster/application/service/DeleteTaskService.java
index 7d67e4a..a6b4841 100644
--- a/assignment/src/main/java/ch/unisg/assignment/assignment/application/service/DeleteTaskService.java
+++ b/roster/src/main/java/ch/unisg/roster/roster/application/service/DeleteTaskService.java
@@ -1,12 +1,12 @@
-package ch.unisg.assignment.assignment.application.service;
+package ch.unisg.roster.roster.application.service;
import javax.transaction.Transactional;
import org.springframework.stereotype.Component;
-import ch.unisg.assignment.assignment.application.port.in.DeleteTaskCommand;
-import ch.unisg.assignment.assignment.application.port.in.DeleteTaskUseCase;
-import ch.unisg.assignment.assignment.domain.Roster;
+import ch.unisg.roster.roster.application.port.in.DeleteTaskCommand;
+import ch.unisg.roster.roster.application.port.in.DeleteTaskUseCase;
+import ch.unisg.roster.roster.domain.Roster;
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
diff --git a/assignment/src/main/java/ch/unisg/assignment/assignment/application/service/NewTaskService.java b/roster/src/main/java/ch/unisg/roster/roster/application/service/NewTaskService.java
similarity index 53%
rename from assignment/src/main/java/ch/unisg/assignment/assignment/application/service/NewTaskService.java
rename to roster/src/main/java/ch/unisg/roster/roster/application/service/NewTaskService.java
index d240a4b..588ed04 100644
--- a/assignment/src/main/java/ch/unisg/assignment/assignment/application/service/NewTaskService.java
+++ b/roster/src/main/java/ch/unisg/roster/roster/application/service/NewTaskService.java
@@ -1,16 +1,16 @@
-package ch.unisg.assignment.assignment.application.service;
+package ch.unisg.roster.roster.application.service;
import javax.transaction.Transactional;
import org.springframework.stereotype.Component;
-import ch.unisg.assignment.assignment.application.port.in.NewTaskCommand;
-import ch.unisg.assignment.assignment.application.port.in.NewTaskUseCase;
-import ch.unisg.assignment.assignment.application.port.out.GetAllExecutorInExecutorPoolByTypePort;
-import ch.unisg.assignment.assignment.application.port.out.NewTaskEventPort;
-import ch.unisg.assignment.assignment.domain.Roster;
-import ch.unisg.assignment.assignment.domain.Task;
-import ch.unisg.assignment.assignment.domain.event.NewTaskEvent;
+import ch.unisg.roster.roster.application.port.in.NewTaskCommand;
+import ch.unisg.roster.roster.application.port.in.NewTaskUseCase;
+import ch.unisg.roster.roster.application.port.out.NewTaskEventPort;
+import ch.unisg.roster.roster.domain.ExecutorRegistry;
+import ch.unisg.roster.roster.domain.Roster;
+import ch.unisg.roster.roster.domain.Task;
+import ch.unisg.roster.roster.domain.event.NewTaskEvent;
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
@@ -19,7 +19,6 @@ import lombok.RequiredArgsConstructor;
public class NewTaskService implements NewTaskUseCase {
private final NewTaskEventPort newTaskEventPort;
- private final GetAllExecutorInExecutorPoolByTypePort getAllExecutorInExecutorPoolByTypePort;
/**
* Checks if we can execute the give task, if yes the task gets added to the task queue and return true.
@@ -29,9 +28,10 @@ public class NewTaskService implements NewTaskUseCase {
@Override
public boolean addNewTaskToQueue(NewTaskCommand command) {
- // if (!getAllExecutorInExecutorPoolByTypePort.doesExecutorTypeExist(command.getTaskType())) {
- // return false;
- // }
+ ExecutorRegistry executorRegistry = ExecutorRegistry.getInstance();
+ if (!executorRegistry.containsTaskType(command.getTaskType())) {
+ return false;
+ }
Task task = new Task(command.getTaskID(), command.getTaskType());
diff --git a/assignment/src/main/java/ch/unisg/assignment/assignment/application/service/TaskCompletedService.java b/roster/src/main/java/ch/unisg/roster/roster/application/service/TaskCompletedService.java
similarity index 63%
rename from assignment/src/main/java/ch/unisg/assignment/assignment/application/service/TaskCompletedService.java
rename to roster/src/main/java/ch/unisg/roster/roster/application/service/TaskCompletedService.java
index 7c3e7f6..69b65d1 100644
--- a/assignment/src/main/java/ch/unisg/assignment/assignment/application/service/TaskCompletedService.java
+++ b/roster/src/main/java/ch/unisg/roster/roster/application/service/TaskCompletedService.java
@@ -1,14 +1,14 @@
-package ch.unisg.assignment.assignment.application.service;
+package ch.unisg.roster.roster.application.service;
import javax.transaction.Transactional;
import org.springframework.stereotype.Component;
-import ch.unisg.assignment.assignment.application.port.in.TaskCompletedCommand;
-import ch.unisg.assignment.assignment.application.port.in.TaskCompletedUseCase;
-import ch.unisg.assignment.assignment.application.port.out.TaskCompletedEventPort;
-import ch.unisg.assignment.assignment.domain.Roster;
-import ch.unisg.assignment.assignment.domain.event.TaskCompletedEvent;
+import ch.unisg.roster.roster.application.port.in.TaskCompletedCommand;
+import ch.unisg.roster.roster.application.port.in.TaskCompletedUseCase;
+import ch.unisg.roster.roster.application.port.out.TaskCompletedEventPort;
+import ch.unisg.roster.roster.domain.Roster;
+import ch.unisg.roster.roster.domain.event.TaskCompletedEvent;
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
diff --git a/assignment/src/main/java/ch/unisg/assignment/assignment/domain/ExecutorInfo.java b/roster/src/main/java/ch/unisg/roster/roster/domain/ExecutorInfo.java
similarity index 67%
rename from assignment/src/main/java/ch/unisg/assignment/assignment/domain/ExecutorInfo.java
rename to roster/src/main/java/ch/unisg/roster/roster/domain/ExecutorInfo.java
index 58b47dc..eb32ec0 100644
--- a/assignment/src/main/java/ch/unisg/assignment/assignment/domain/ExecutorInfo.java
+++ b/roster/src/main/java/ch/unisg/roster/roster/domain/ExecutorInfo.java
@@ -1,6 +1,6 @@
-package ch.unisg.assignment.assignment.domain;
+package ch.unisg.roster.roster.domain;
-import ch.unisg.assignment.assignment.domain.valueobject.ExecutorType;
+import ch.unisg.roster.roster.domain.valueobject.ExecutorType;
import ch.unisg.common.valueobject.ExecutorURI;
import lombok.Getter;
import lombok.Setter;
diff --git a/roster/src/main/java/ch/unisg/roster/roster/domain/ExecutorRegistry.java b/roster/src/main/java/ch/unisg/roster/roster/domain/ExecutorRegistry.java
new file mode 100644
index 0000000..4ddba0f
--- /dev/null
+++ b/roster/src/main/java/ch/unisg/roster/roster/domain/ExecutorRegistry.java
@@ -0,0 +1,92 @@
+package ch.unisg.roster.roster.domain;
+
+import java.util.*;
+
+import ch.unisg.common.valueobject.ExecutorURI;
+import ch.unisg.roster.roster.domain.valueobject.ExecutorType;
+
+/**
+ * Registry that keeps a track of executors internal to the TAPAS application and the types of tasks
+ * they can achieve. One executor may correspond to multiple task types.
+ * This class is a singleton.
+ */
+public class ExecutorRegistry {
+ private static ExecutorRegistry registry;
+
+ private final Map> executors;
+
+ private ExecutorRegistry() {
+ this.executors = new Hashtable<>();
+ }
+
+ public static synchronized ExecutorRegistry getInstance() {
+ if (registry == null) {
+ registry = new ExecutorRegistry();
+ }
+
+ return registry;
+ }
+
+ /**
+ * Adds an executor to the registry for a given task type.
+ *
+ * @param taskType the type of the task
+ * @param executorIdentifier the identifier of the executor (can be any string)
+ * @return true unless a runtime exception occurs
+ */
+ public boolean addExecutor(ExecutorType executorType, ExecutorURI executorURI) {
+ Set taskTypeExecs = executors.getOrDefault(executorType,
+ Collections.synchronizedSet(new HashSet<>()));
+
+ taskTypeExecs.add(executorURI);
+ executors.put(executorType, taskTypeExecs);
+
+ return true;
+ }
+
+ /**
+ * Removes an executor from the registry. The executor is disassociated from all known task types.
+ *
+ * @param executorURI the identifier of the executor
+ * @return true unless a runtime exception occurs
+ */
+ public boolean removeExecutor(ExecutorURI executorURI) {
+ Iterator iterator = executors.keySet().iterator();
+
+ while (iterator.hasNext()) {
+ ExecutorType executorType = iterator.next();
+ Set set = executors.get(executorType);
+
+ set.remove(executorURI);
+
+ if (set.isEmpty()) {
+ iterator.remove();
+ }
+ }
+
+ return true;
+ }
+
+ /**
+ * Checks if the registry contains an executor for a given task type. Used during task creation
+ * to decide if a task can be executed.
+ *
+ * @param taskType the task type being auctioned
+ * @return
+ */
+ public boolean containsTaskType(ExecutorType taskType) {
+ return executors.containsKey(taskType);
+ }
+
+ /**
+ * Adds a list of executors to current executor list. Should only be used on startup to
+ * add all available executors from the executor pool to the registry.
+ *
+ * @param executors the initial executors
+ * @return
+ */
+ public void init(Map> executors) {
+ this.executors.putAll(executors);
+ }
+
+}
diff --git a/assignment/src/main/java/ch/unisg/assignment/assignment/domain/Roster.java b/roster/src/main/java/ch/unisg/roster/roster/domain/Roster.java
similarity index 95%
rename from assignment/src/main/java/ch/unisg/assignment/assignment/domain/Roster.java
rename to roster/src/main/java/ch/unisg/roster/roster/domain/Roster.java
index fb259c1..cc9a0a6 100644
--- a/assignment/src/main/java/ch/unisg/assignment/assignment/domain/Roster.java
+++ b/roster/src/main/java/ch/unisg/roster/roster/domain/Roster.java
@@ -1,4 +1,4 @@
-package ch.unisg.assignment.assignment.domain;
+package ch.unisg.roster.roster.domain;
import java.util.ArrayList;
import java.util.Arrays;
@@ -6,7 +6,7 @@ import java.util.HashMap;
import java.util.logging.Level;
import java.util.logging.Logger;
-import ch.unisg.assignment.assignment.domain.valueobject.ExecutorType;
+import ch.unisg.roster.roster.domain.valueobject.ExecutorType;
import ch.unisg.common.valueobject.ExecutorURI;
public class Roster {
diff --git a/assignment/src/main/java/ch/unisg/assignment/assignment/domain/RosterItem.java b/roster/src/main/java/ch/unisg/roster/roster/domain/RosterItem.java
similarity index 90%
rename from assignment/src/main/java/ch/unisg/assignment/assignment/domain/RosterItem.java
rename to roster/src/main/java/ch/unisg/roster/roster/domain/RosterItem.java
index b405f44..cc39c6c 100644
--- a/assignment/src/main/java/ch/unisg/assignment/assignment/domain/RosterItem.java
+++ b/roster/src/main/java/ch/unisg/roster/roster/domain/RosterItem.java
@@ -1,4 +1,4 @@
-package ch.unisg.assignment.assignment.domain;
+package ch.unisg.roster.roster.domain;
import ch.unisg.common.valueobject.ExecutorURI;
import lombok.Getter;
diff --git a/assignment/src/main/java/ch/unisg/assignment/assignment/domain/Task.java b/roster/src/main/java/ch/unisg/roster/roster/domain/Task.java
similarity index 82%
rename from assignment/src/main/java/ch/unisg/assignment/assignment/domain/Task.java
rename to roster/src/main/java/ch/unisg/roster/roster/domain/Task.java
index 7daa738..40ef9fa 100644
--- a/assignment/src/main/java/ch/unisg/assignment/assignment/domain/Task.java
+++ b/roster/src/main/java/ch/unisg/roster/roster/domain/Task.java
@@ -1,6 +1,6 @@
-package ch.unisg.assignment.assignment.domain;
+package ch.unisg.roster.roster.domain;
-import ch.unisg.assignment.assignment.domain.valueobject.ExecutorType;
+import ch.unisg.roster.roster.domain.valueobject.ExecutorType;
import lombok.Getter;
import lombok.Setter;
diff --git a/assignment/src/main/java/ch/unisg/assignment/assignment/domain/event/NewTaskEvent.java b/roster/src/main/java/ch/unisg/roster/roster/domain/event/NewTaskEvent.java
similarity index 56%
rename from assignment/src/main/java/ch/unisg/assignment/assignment/domain/event/NewTaskEvent.java
rename to roster/src/main/java/ch/unisg/roster/roster/domain/event/NewTaskEvent.java
index 34e7f0b..1457f1d 100644
--- a/assignment/src/main/java/ch/unisg/assignment/assignment/domain/event/NewTaskEvent.java
+++ b/roster/src/main/java/ch/unisg/roster/roster/domain/event/NewTaskEvent.java
@@ -1,6 +1,6 @@
-package ch.unisg.assignment.assignment.domain.event;
+package ch.unisg.roster.roster.domain.event;
-import ch.unisg.assignment.assignment.domain.valueobject.ExecutorType;
+import ch.unisg.roster.roster.domain.valueobject.ExecutorType;
public class NewTaskEvent {
public final ExecutorType taskType;
diff --git a/assignment/src/main/java/ch/unisg/assignment/assignment/domain/event/TaskAssignedEvent.java b/roster/src/main/java/ch/unisg/roster/roster/domain/event/TaskAssignedEvent.java
similarity index 74%
rename from assignment/src/main/java/ch/unisg/assignment/assignment/domain/event/TaskAssignedEvent.java
rename to roster/src/main/java/ch/unisg/roster/roster/domain/event/TaskAssignedEvent.java
index d0178d4..9c57270 100644
--- a/assignment/src/main/java/ch/unisg/assignment/assignment/domain/event/TaskAssignedEvent.java
+++ b/roster/src/main/java/ch/unisg/roster/roster/domain/event/TaskAssignedEvent.java
@@ -1,4 +1,4 @@
-package ch.unisg.assignment.assignment.domain.event;
+package ch.unisg.roster.roster.domain.event;
public class TaskAssignedEvent {
public final String taskID;
diff --git a/assignment/src/main/java/ch/unisg/assignment/assignment/domain/event/TaskCompletedEvent.java b/roster/src/main/java/ch/unisg/roster/roster/domain/event/TaskCompletedEvent.java
similarity index 85%
rename from assignment/src/main/java/ch/unisg/assignment/assignment/domain/event/TaskCompletedEvent.java
rename to roster/src/main/java/ch/unisg/roster/roster/domain/event/TaskCompletedEvent.java
index 432a8f0..926f601 100644
--- a/assignment/src/main/java/ch/unisg/assignment/assignment/domain/event/TaskCompletedEvent.java
+++ b/roster/src/main/java/ch/unisg/roster/roster/domain/event/TaskCompletedEvent.java
@@ -1,4 +1,4 @@
-package ch.unisg.assignment.assignment.domain.event;
+package ch.unisg.roster.roster.domain.event;
public class TaskCompletedEvent {
public final String taskID;
diff --git a/assignment/src/main/java/ch/unisg/assignment/assignment/domain/valueobject/ExecutorType.java b/roster/src/main/java/ch/unisg/roster/roster/domain/valueobject/ExecutorType.java
similarity index 74%
rename from assignment/src/main/java/ch/unisg/assignment/assignment/domain/valueobject/ExecutorType.java
rename to roster/src/main/java/ch/unisg/roster/roster/domain/valueobject/ExecutorType.java
index bc5f467..72368e3 100644
--- a/assignment/src/main/java/ch/unisg/assignment/assignment/domain/valueobject/ExecutorType.java
+++ b/roster/src/main/java/ch/unisg/roster/roster/domain/valueobject/ExecutorType.java
@@ -1,4 +1,4 @@
-package ch.unisg.assignment.assignment.domain.valueobject;
+package ch.unisg.roster.roster.domain.valueobject;
import lombok.Value;
diff --git a/assignment/src/main/resources/application.properties b/roster/src/main/resources/application.properties
similarity index 100%
rename from assignment/src/main/resources/application.properties
rename to roster/src/main/resources/application.properties
diff --git a/assignment/src/test/java/ch/unisg/assignment/AssignmentApplicationTests.java b/roster/src/test/java/ch/unisg/roster/RosterApplicationTests.java
similarity index 70%
rename from assignment/src/test/java/ch/unisg/assignment/AssignmentApplicationTests.java
rename to roster/src/test/java/ch/unisg/roster/RosterApplicationTests.java
index 9da24b5..5ee712b 100644
--- a/assignment/src/test/java/ch/unisg/assignment/AssignmentApplicationTests.java
+++ b/roster/src/test/java/ch/unisg/roster/RosterApplicationTests.java
@@ -1,10 +1,10 @@
-package ch.unisg.assignment;
+package ch.unisg.roster;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
-class AssignmentApplicationTests {
+class RosterApplicationTests {
@Test
void contextLoads() {