From edc2279434df0428e78fb168814cf602758a6b5c Mon Sep 17 00:00:00 2001 From: reynisson Date: Thu, 23 Dec 2021 14:14:32 +0000 Subject: [PATCH] Code clean up and test fixes --- .../common/validation/SelfValidating.java | 2 +- .../main/java/ch/unisg/executorbase/Task.java | 4 +- .../services/ExecuteTaskServiceBase.java | 2 +- .../services/ExecutionFinishedService.java | 2 +- .../java/ch/unisg/common/SelfValidating.java | 2 +- .../mongodb/ExecutorRepository.java | 6 +- .../domain/ExecutorAddedEvent.java | 2 +- .../domain/ExecutorRemovedEvent.java | 2 +- ...ddNewExecutorToExecutorPoolSystemTest.java | 8 +- ...ecutorToExecutorPoolWebControllerTest.java | 4 +- ...dNewExecutorToExecutorPoolServiceTest.java | 12 +- .../domain}/ExecutorPoolTest.java | 4 +- .../in/web/ApplyForTaskWebController.java | 2 +- .../persistence/mongodb/RosterRepository.java | 2 +- .../ch/unisg/roster/roster/domain/Roster.java | 4 +- .../roster/roster/domain/RosterItem.java | 6 +- ...ewAssignmentToRosterServiceSystemTest.java | 27 +++-- .../in/web/ApplyForTaskWebControllerTest.java | 9 +- .../mongodb/RosterPersistenceAdapterTest.java | 2 - .../AddNewAssignmentToRosterServiceTest.java | 3 +- .../roster/roster/domain/RosterTest.java | 11 +- .../tapas/TapasAuctionHouseApplication.java | 8 +- .../mqtt/AuctionEventMqttListener.java | 2 +- .../BidReceivedEventListenerMqttAdapter.java | 4 +- ...ExecutorAddedEventListenerMqttAdapter.java | 4 +- ...ecutorRemovedEventListenerMqttAdapter.java | 5 +- ...uctionStartedEventListenerMqttAdapter.java | 69 +++--------- ...tionStartedEventListenerWebSubAdapter.java | 104 ------------------ ...tionStartedEventListenerWebSubAdapter.java | 66 +++++++++++ .../web/AuctionHouseDiscoveryHttpAdapter.java | 6 +- .../PlaceBidForAuctionCommandHttpAdapter.java | 37 ++++++- .../handler/AuctionStartedHandler.java | 10 +- .../tapas/auctionhouse/domain/Auction.java | 12 ++ .../domain/AuctionHouseDiscovery.java | 2 +- .../domain/AuctionStartedEvent.java | 2 +- .../auctionhouse/domain/AuctionWonEvent.java | 2 +- .../common/AuctionHouseResourceDirectory.java | 6 +- .../ch/unisg/tapas/common/SelfValidating.java | 2 +- .../tapastasks/common/SelfValidating.java | 2 +- .../persistence/mongodb/TaskRepository.java | 6 +- .../unisg/tapastasks/archunit/Adapters.java | 4 +- .../tapastasks/archunit/ApplicationLayer.java | 6 +- .../archunit/HexagonalArchitecture.java | 2 +- 43 files changed, 216 insertions(+), 261 deletions(-) rename executor-pool/src/test/java/ch/unisg/executorpool/{ => executorpool}/AddNewExecutorToExecutorPoolSystemTest.java (88%) rename executor-pool/src/test/java/ch/unisg/executorpool/{ => executorpool/adapter/in/web}/AddNewExecutorToExecutorPoolWebControllerTest.java (96%) rename executor-pool/src/test/java/ch/unisg/executorpool/{ => executorpool/application/service}/AddNewExecutorToExecutorPoolServiceTest.java (92%) rename executor-pool/src/test/java/ch/unisg/executorpool/{ => executorpool/domain}/ExecutorPoolTest.java (96%) delete mode 100644 tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/adapter/in/messaging/websub/AuctionStartedEventListenerWebSubAdapter.java create mode 100644 tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/adapter/in/messaging/websub/ExternalAuctionStartedEventListenerWebSubAdapter.java diff --git a/common/src/main/java/ch/unisg/common/validation/SelfValidating.java b/common/src/main/java/ch/unisg/common/validation/SelfValidating.java index bb2d0fe..7dc6012 100644 --- a/common/src/main/java/ch/unisg/common/validation/SelfValidating.java +++ b/common/src/main/java/ch/unisg/common/validation/SelfValidating.java @@ -9,7 +9,7 @@ import java.util.Set; public abstract class SelfValidating { - private Validator validator; + private final Validator validator; protected SelfValidating() { ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); diff --git a/executor-base/src/main/java/ch/unisg/executorbase/Task.java b/executor-base/src/main/java/ch/unisg/executorbase/Task.java index ad07039..1bf873a 100644 --- a/executor-base/src/main/java/ch/unisg/executorbase/Task.java +++ b/executor-base/src/main/java/ch/unisg/executorbase/Task.java @@ -6,7 +6,7 @@ import lombok.Setter; public class Task { @Getter - private String taskID; + private final String taskID; @Getter @Setter @@ -15,7 +15,7 @@ public class Task { // TODO maybe create a value object for inputData so we can make sure it is in the right // format. @Getter - private String inputData; + private final String inputData; public Task(String taskID, String inputData) { this.taskID = taskID; diff --git a/executor-base/src/main/java/ch/unisg/executorbase/services/ExecuteTaskServiceBase.java b/executor-base/src/main/java/ch/unisg/executorbase/services/ExecuteTaskServiceBase.java index 6827fde..80ece25 100644 --- a/executor-base/src/main/java/ch/unisg/executorbase/services/ExecuteTaskServiceBase.java +++ b/executor-base/src/main/java/ch/unisg/executorbase/services/ExecuteTaskServiceBase.java @@ -9,7 +9,7 @@ import ch.unisg.executorbase.Task; public abstract class ExecuteTaskServiceBase implements ExecuteTaskServiceInterface { - private Logger logger = Logger.getLogger(ExecuteTaskServiceBase.class.getName()); + private final Logger logger = Logger.getLogger(ExecuteTaskServiceBase.class.getName()); @Autowired private Executor executor; diff --git a/executor-base/src/main/java/ch/unisg/executorbase/services/ExecutionFinishedService.java b/executor-base/src/main/java/ch/unisg/executorbase/services/ExecutionFinishedService.java index 92f74d2..eea4fb9 100644 --- a/executor-base/src/main/java/ch/unisg/executorbase/services/ExecutionFinishedService.java +++ b/executor-base/src/main/java/ch/unisg/executorbase/services/ExecutionFinishedService.java @@ -18,7 +18,7 @@ public class ExecutionFinishedService { @Value("${roster.uri}") private String rosterUri; - private Logger logger = Logger.getLogger(ExecutionFinishedService.class.getName()); + private final Logger logger = Logger.getLogger(ExecutionFinishedService.class.getName()); /** * Publishes the execution finished event diff --git a/executor-pool/src/main/java/ch/unisg/common/SelfValidating.java b/executor-pool/src/main/java/ch/unisg/common/SelfValidating.java index cacf16e..e23394b 100644 --- a/executor-pool/src/main/java/ch/unisg/common/SelfValidating.java +++ b/executor-pool/src/main/java/ch/unisg/common/SelfValidating.java @@ -9,7 +9,7 @@ import java.util.Set; public class SelfValidating { - private Validator validator; + private final Validator validator; public SelfValidating() { ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); diff --git a/executor-pool/src/main/java/ch/unisg/executorpool/adapter/out/persistence/mongodb/ExecutorRepository.java b/executor-pool/src/main/java/ch/unisg/executorpool/adapter/out/persistence/mongodb/ExecutorRepository.java index a2752c9..0db19c8 100644 --- a/executor-pool/src/main/java/ch/unisg/executorpool/adapter/out/persistence/mongodb/ExecutorRepository.java +++ b/executor-pool/src/main/java/ch/unisg/executorpool/adapter/out/persistence/mongodb/ExecutorRepository.java @@ -8,10 +8,10 @@ import org.springframework.stereotype.Repository; @Repository public interface ExecutorRepository extends MongoRepository { - public MongoExecutorDocument findByExecutorUri(String executorUri, String executorTaskType); + MongoExecutorDocument findByExecutorUri(String executorUri, String executorTaskType); - public List findByExecutorTaskType(String executorTaskType); + List findByExecutorTaskType(String executorTaskType); - public void deleteByExecutorUri(String executorUri); + void deleteByExecutorUri(String executorUri); } diff --git a/executor-pool/src/main/java/ch/unisg/executorpool/domain/ExecutorAddedEvent.java b/executor-pool/src/main/java/ch/unisg/executorpool/domain/ExecutorAddedEvent.java index 6ec291e..918df75 100644 --- a/executor-pool/src/main/java/ch/unisg/executorpool/domain/ExecutorAddedEvent.java +++ b/executor-pool/src/main/java/ch/unisg/executorpool/domain/ExecutorAddedEvent.java @@ -4,7 +4,7 @@ import lombok.Getter; public class ExecutorAddedEvent { @Getter - private ExecutorClass executorClass; + private final ExecutorClass executorClass; public ExecutorAddedEvent(ExecutorClass executorClass) { this.executorClass = executorClass; } } diff --git a/executor-pool/src/main/java/ch/unisg/executorpool/domain/ExecutorRemovedEvent.java b/executor-pool/src/main/java/ch/unisg/executorpool/domain/ExecutorRemovedEvent.java index 417e8a7..42b3cfc 100644 --- a/executor-pool/src/main/java/ch/unisg/executorpool/domain/ExecutorRemovedEvent.java +++ b/executor-pool/src/main/java/ch/unisg/executorpool/domain/ExecutorRemovedEvent.java @@ -4,7 +4,7 @@ import lombok.Getter; public class ExecutorRemovedEvent { @Getter - private ExecutorClass executorClass; + private final ExecutorClass executorClass; public ExecutorRemovedEvent(ExecutorClass executorClass) { this.executorClass = executorClass; } } diff --git a/executor-pool/src/test/java/ch/unisg/executorpool/AddNewExecutorToExecutorPoolSystemTest.java b/executor-pool/src/test/java/ch/unisg/executorpool/executorpool/AddNewExecutorToExecutorPoolSystemTest.java similarity index 88% rename from executor-pool/src/test/java/ch/unisg/executorpool/AddNewExecutorToExecutorPoolSystemTest.java rename to executor-pool/src/test/java/ch/unisg/executorpool/executorpool/AddNewExecutorToExecutorPoolSystemTest.java index 4310005..fb7f08e 100644 --- a/executor-pool/src/test/java/ch/unisg/executorpool/AddNewExecutorToExecutorPoolSystemTest.java +++ b/executor-pool/src/test/java/ch/unisg/executorpool/executorpool/AddNewExecutorToExecutorPoolSystemTest.java @@ -1,4 +1,4 @@ -package ch.unisg.executorpool; +package ch.unisg.executorpool.executorpool; import org.json.JSONException; import org.json.JSONObject; @@ -32,9 +32,9 @@ public class AddNewExecutorToExecutorPoolSystemTest { ExecutorTaskType executorTaskType = new ExecutorTaskType("system-integration-test-type"); ExecutorUri executorUri = new ExecutorUri(java.net.URI.create("example.org")); - ResponseEntity response = whenAddNewExecutorToEmptyPool(executorTaskType, executorUri); + ResponseEntity response = whenAddNewExecutorToEmptyPool(executorTaskType, executorUri); - JSONObject responseJson = new JSONObject(response.getBody().toString()); + var responseJson = new JSONObject(response.getBody().toString()); String respExecutorUri = responseJson.getString("executorUri"); String respExecutorTaskType = responseJson.getString("executorTaskType"); @@ -59,7 +59,7 @@ public class AddNewExecutorToExecutorPoolSystemTest { HttpEntity request = new HttpEntity<>(jsonPayLoad,headers); - return restTemplate.exchange("/executor-pool/AddExecutor", HttpMethod.POST, request, Object.class); + return restTemplate.exchange("/executor-pool/executors", HttpMethod.POST, request, Object.class); } diff --git a/executor-pool/src/test/java/ch/unisg/executorpool/AddNewExecutorToExecutorPoolWebControllerTest.java b/executor-pool/src/test/java/ch/unisg/executorpool/executorpool/adapter/in/web/AddNewExecutorToExecutorPoolWebControllerTest.java similarity index 96% rename from executor-pool/src/test/java/ch/unisg/executorpool/AddNewExecutorToExecutorPoolWebControllerTest.java rename to executor-pool/src/test/java/ch/unisg/executorpool/executorpool/adapter/in/web/AddNewExecutorToExecutorPoolWebControllerTest.java index f34056f..67246f3 100644 --- a/executor-pool/src/test/java/ch/unisg/executorpool/AddNewExecutorToExecutorPoolWebControllerTest.java +++ b/executor-pool/src/test/java/ch/unisg/executorpool/executorpool/adapter/in/web/AddNewExecutorToExecutorPoolWebControllerTest.java @@ -1,4 +1,4 @@ -package ch.unisg.executorpool; +package ch.unisg.executorpool.executorpool.adapter.in.web; import ch.unisg.executorpool.application.port.out.LoadExecutorPort; import org.junit.jupiter.api.Test; @@ -56,7 +56,7 @@ public class AddNewExecutorToExecutorPoolWebControllerTest { .addNewExecutorToExecutorPool(addNewExecutorToExecutorPoolCommand)) .thenReturn(executorStub); - mockMvc.perform(post("/executor-pool/AddExecutor") + mockMvc.perform(post("/executor-pool/executors") .contentType(ExecutorJsonRepresentation.EXECUTOR_MEDIA_TYPE) .content(jsonPayLoad)) .andExpect(status().isCreated()); diff --git a/executor-pool/src/test/java/ch/unisg/executorpool/AddNewExecutorToExecutorPoolServiceTest.java b/executor-pool/src/test/java/ch/unisg/executorpool/executorpool/application/service/AddNewExecutorToExecutorPoolServiceTest.java similarity index 92% rename from executor-pool/src/test/java/ch/unisg/executorpool/AddNewExecutorToExecutorPoolServiceTest.java rename to executor-pool/src/test/java/ch/unisg/executorpool/executorpool/application/service/AddNewExecutorToExecutorPoolServiceTest.java index 3f6f70e..c382b88 100644 --- a/executor-pool/src/test/java/ch/unisg/executorpool/AddNewExecutorToExecutorPoolServiceTest.java +++ b/executor-pool/src/test/java/ch/unisg/executorpool/executorpool/application/service/AddNewExecutorToExecutorPoolServiceTest.java @@ -1,4 +1,4 @@ -package ch.unisg.executorpool; +package ch.unisg.executorpool.executorpool.application.service; import static org.mockito.Mockito.times; @@ -23,12 +23,12 @@ public class AddNewExecutorToExecutorPoolServiceTest { private final AddExecutorPort addExecutorPort = Mockito.mock(AddExecutorPort.class); private final ExecutorAddedEventPort newExecutorAddedEventPort = Mockito.mock(ExecutorAddedEventPort.class); private final AddNewExecutorToExecutorPoolService addNewExecutorToExecutorPoolService = new AddNewExecutorToExecutorPoolService( - newExecutorAddedEventPort, addExecutorPort); + newExecutorAddedEventPort, addExecutorPort); @Test void addingSucceeds() { - ExecutorClass newExecutor = givenAnExecutorWithTypeAndUri(new ExecutorClass.ExecutorTaskType("test-type"), + ExecutorClass newExecutor = givenAnExecutorWithTypeAndUri(new ExecutorClass.ExecutorTaskType("test-type"), new ExecutorClass.ExecutorUri(URI.create("example.org"))); ExecutorPool executorPool = givenAnEmptyExecutorPool(ExecutorPool.getExecutorPool()); @@ -49,9 +49,9 @@ public class AddNewExecutorToExecutorPoolServiceTest { private ExecutorPool givenAnEmptyExecutorPool(ExecutorPool executorPool) { executorPool.getListOfExecutors().getValue().clear(); return executorPool; - } + } - private ExecutorClass givenAnExecutorWithTypeAndUri(ExecutorClass.ExecutorTaskType executorTaskType, + private ExecutorClass givenAnExecutorWithTypeAndUri(ExecutorClass.ExecutorTaskType executorTaskType, ExecutorUri executorUri) { ExecutorClass executor = Mockito.mock(ExecutorClass.class); @@ -61,5 +61,5 @@ public class AddNewExecutorToExecutorPoolServiceTest { } - + } diff --git a/executor-pool/src/test/java/ch/unisg/executorpool/ExecutorPoolTest.java b/executor-pool/src/test/java/ch/unisg/executorpool/executorpool/domain/ExecutorPoolTest.java similarity index 96% rename from executor-pool/src/test/java/ch/unisg/executorpool/ExecutorPoolTest.java rename to executor-pool/src/test/java/ch/unisg/executorpool/executorpool/domain/ExecutorPoolTest.java index 358deb1..08743fa 100644 --- a/executor-pool/src/test/java/ch/unisg/executorpool/ExecutorPoolTest.java +++ b/executor-pool/src/test/java/ch/unisg/executorpool/executorpool/domain/ExecutorPoolTest.java @@ -1,4 +1,4 @@ -package ch.unisg.executorpool; +package ch.unisg.executorpool.executorpool.domain; import java.net.URI; @@ -13,8 +13,6 @@ import ch.unisg.executorpool.domain.ExecutorClass.ExecutorTaskType; public class ExecutorPoolTest { - private static final URI URI = null; - @Test void addNewExecutorToExecutorPoolSuccess() { ExecutorPool executorPool = ExecutorPool.getExecutorPool(); diff --git a/roster/src/main/java/ch/unisg/roster/roster/adapter/in/web/ApplyForTaskWebController.java b/roster/src/main/java/ch/unisg/roster/roster/adapter/in/web/ApplyForTaskWebController.java index e20daed..6fe9624 100644 --- a/roster/src/main/java/ch/unisg/roster/roster/adapter/in/web/ApplyForTaskWebController.java +++ b/roster/src/main/java/ch/unisg/roster/roster/adapter/in/web/ApplyForTaskWebController.java @@ -29,7 +29,7 @@ public class ApplyForTaskWebController { **/ @PostMapping(path = "/task/apply", consumes = {"application/json"}) public Task applyForTask (@RequestBody ExecutorInfo executorInfo) { - logger.info("Roster | Execuor applying for task"); + logger.info("Roster | Executor applying for task"); ApplyForTaskCommand command = new ApplyForTaskCommand(executorInfo.getExecutorType(), executorInfo.getExecutorURI()); diff --git a/roster/src/main/java/ch/unisg/roster/roster/adapter/out/persistence/mongodb/RosterRepository.java b/roster/src/main/java/ch/unisg/roster/roster/adapter/out/persistence/mongodb/RosterRepository.java index eff2b56..42de5d8 100644 --- a/roster/src/main/java/ch/unisg/roster/roster/adapter/out/persistence/mongodb/RosterRepository.java +++ b/roster/src/main/java/ch/unisg/roster/roster/adapter/out/persistence/mongodb/RosterRepository.java @@ -5,5 +5,5 @@ import org.springframework.stereotype.Repository; @Repository public interface RosterRepository extends MongoRepository{ - public MongoRosterDocument findByTaskId(String taskId); + MongoRosterDocument findByTaskId(String taskId); } diff --git a/roster/src/main/java/ch/unisg/roster/roster/domain/Roster.java b/roster/src/main/java/ch/unisg/roster/roster/domain/Roster.java index 1153caa..9e3b0ca 100644 --- a/roster/src/main/java/ch/unisg/roster/roster/domain/Roster.java +++ b/roster/src/main/java/ch/unisg/roster/roster/domain/Roster.java @@ -12,10 +12,10 @@ public class Roster { private static final Roster roster = new Roster(); // Queues which hold all the tasks which need to be assigned | Will be replaced by message queue later - private HashMap> queues = new HashMap<>(); + private final HashMap> queues = new HashMap<>(); // Roster witch holds information about which executor is assigned to a task - private HashMap rosterMap = new HashMap<>(); + private final HashMap rosterMap = new HashMap<>(); Logger logger = Logger.getLogger(Roster.class.getName()); diff --git a/roster/src/main/java/ch/unisg/roster/roster/domain/RosterItem.java b/roster/src/main/java/ch/unisg/roster/roster/domain/RosterItem.java index dbe5a87..9a7161b 100644 --- a/roster/src/main/java/ch/unisg/roster/roster/domain/RosterItem.java +++ b/roster/src/main/java/ch/unisg/roster/roster/domain/RosterItem.java @@ -6,13 +6,13 @@ import lombok.Getter; public class RosterItem { @Getter - private String taskID; + private final String taskID; @Getter - private String taskType; + private final String taskType; @Getter - private ExecutorURI executorURI; + private final ExecutorURI executorURI; public RosterItem(String taskID, String taskType, ExecutorURI executorURI) { this.taskID = taskID; diff --git a/roster/src/test/java/ch/unisg/roster/roster/AddNewAssignmentToRosterServiceSystemTest.java b/roster/src/test/java/ch/unisg/roster/roster/AddNewAssignmentToRosterServiceSystemTest.java index 8df4d0a..67ca985 100644 --- a/roster/src/test/java/ch/unisg/roster/roster/AddNewAssignmentToRosterServiceSystemTest.java +++ b/roster/src/test/java/ch/unisg/roster/roster/AddNewAssignmentToRosterServiceSystemTest.java @@ -28,41 +28,40 @@ public class AddNewAssignmentToRosterServiceSystemTest { @Test void addNewAssignmentToRosterService() throws JSONException { - String rosterItemId = "TEST-ID"; + String taskId = "TEST-ID"; String executorType = "TEST-TYPE"; + String inputData = "TEST-DATA"; String executorURI = "TEST-URI"; - ResponseEntity response = whenAddNewAssignmentToRoster(rosterItemId, executorType, executorURI); - - System.out.println(response.getBody().toString()); + ResponseEntity response = whenAddNewAssignmentToRoster(taskId, executorType, inputData, executorURI); JSONObject responseJson = new JSONObject(response.getBody().toString()); - String respExecutorType = responseJson.getString("executorType"); - String respExecutorURI = responseJson.getString("executorURI"); + String respTaskId = responseJson.getString("taskID"); + String respTaskType = responseJson.getJSONObject("taskType").getString("value"); + String respInputData = responseJson.getString("inputData"); - then(response.getStatusCode()).isEqualTo(HttpStatus.CREATED); - then(respExecutorType).isEqualTo(executorType); - then(respExecutorURI).isEqualTo(executorURI); + then(response.getStatusCode()).isEqualTo(HttpStatus.OK); + then(respTaskId).isEqualTo(respTaskId); + then(respTaskType).isEqualTo(executorType); + then(respInputData).isEqualTo(inputData); then(Roster.getInstance().getRosterMap().size()).isEqualTo(1); - - } private ResponseEntity whenAddNewAssignmentToRoster( - String rosterItemId, + String taskId, String executorType, + String inputData, String executorURI) throws JSONException { Roster roster = Roster.getInstance(); roster.getRosterMap().clear(); - roster.addTaskToQueue(new Task(rosterItemId, new ExecutorType(executorType), executorURI)); + roster.addTaskToQueue(new Task(taskId, new ExecutorType(executorType), inputData)); HttpHeaders headers = new HttpHeaders(); headers.add("Content-Type", "application/json"); String jsonPayLoad = new JSONObject() - .put("rosterItemId", rosterItemId) .put("executorType", executorType) .put("executorURI", executorURI) .toString(); diff --git a/roster/src/test/java/ch/unisg/roster/roster/adapter/in/web/ApplyForTaskWebControllerTest.java b/roster/src/test/java/ch/unisg/roster/roster/adapter/in/web/ApplyForTaskWebControllerTest.java index fce0387..954d577 100644 --- a/roster/src/test/java/ch/unisg/roster/roster/adapter/in/web/ApplyForTaskWebControllerTest.java +++ b/roster/src/test/java/ch/unisg/roster/roster/adapter/in/web/ApplyForTaskWebControllerTest.java @@ -5,6 +5,7 @@ import ch.unisg.common.valueobject.ExecutorURI; import ch.unisg.roster.roster.adapter.out.persistence.mongodb.RosterRepository; 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.in.LoadRosterItemPort; import ch.unisg.roster.roster.domain.RosterItem; import ch.unisg.roster.roster.domain.Task; import ch.unisg.roster.roster.domain.valueobject.ExecutorType; @@ -15,7 +16,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.test.web.servlet.MockMvc; - +import static org.mockito.BDDMockito.eq; import static org.mockito.BDDMockito.then; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @@ -29,6 +30,9 @@ public class ApplyForTaskWebControllerTest { @MockBean private ApplyForTaskUseCase applyForTaskUseCase; + @MockBean + private LoadRosterItemPort loadRosterItemPort; + @MockBean RosterRepository rosterRepository; @@ -55,14 +59,13 @@ public class ApplyForTaskWebControllerTest { Mockito.when(applyForTaskUseCase.applyForTask(applyForTaskCommand)) .thenReturn(taskStub); - mockMvc.perform(post("/task/apply/") .contentType("application/json") .content(jsonPayLoad)) .andExpect(status().is2xxSuccessful()); then(applyForTaskUseCase).should() - .applyForTask(new ApplyForTaskCommand(new ExecutorType(executorType), new ExecutorURI(executorURI))); + .applyForTask(eq(new ApplyForTaskCommand(new ExecutorType(executorType), new ExecutorURI(executorURI)))); } } diff --git a/roster/src/test/java/ch/unisg/roster/roster/adapter/out/persistence/mongodb/RosterPersistenceAdapterTest.java b/roster/src/test/java/ch/unisg/roster/roster/adapter/out/persistence/mongodb/RosterPersistenceAdapterTest.java index 8a8d858..a022667 100644 --- a/roster/src/test/java/ch/unisg/roster/roster/adapter/out/persistence/mongodb/RosterPersistenceAdapterTest.java +++ b/roster/src/test/java/ch/unisg/roster/roster/adapter/out/persistence/mongodb/RosterPersistenceAdapterTest.java @@ -38,7 +38,6 @@ public class RosterPersistenceAdapterTest { new ExecutorURI(executorURI) ); - adapterUnderTest.addRosterItem(testRosterItem); MongoRosterDocument retrievedDoc = rosterRepository.findByTaskId(taskId); @@ -46,7 +45,6 @@ public class RosterPersistenceAdapterTest { assertThat(retrievedDoc.taskId).isEqualTo(taskId); assertThat(retrievedDoc.executorURI).isEqualTo(executorURI); assertThat(retrievedDoc.taskType).isEqualTo(executorType); - } @Test diff --git a/roster/src/test/java/ch/unisg/roster/roster/application/service/AddNewAssignmentToRosterServiceTest.java b/roster/src/test/java/ch/unisg/roster/roster/application/service/AddNewAssignmentToRosterServiceTest.java index d089315..733e2dd 100644 --- a/roster/src/test/java/ch/unisg/roster/roster/application/service/AddNewAssignmentToRosterServiceTest.java +++ b/roster/src/test/java/ch/unisg/roster/roster/application/service/AddNewAssignmentToRosterServiceTest.java @@ -41,7 +41,6 @@ public class AddNewAssignmentToRosterServiceTest { Task newTask = givenATaskWithIdAndType("TEST-ID", "TEST-TYPE", "TEST-INPUT"); RosterItem newRosterItem = givenARosterItemWithIdAndTypeAndExecutorUri("TEST-ID", "TEST-TYPE", "TEST-URI"); - // TODO Add task to queue Roster roster = Roster.getInstance(); roster.addTaskToQueue(newTask); @@ -50,6 +49,8 @@ public class AddNewAssignmentToRosterServiceTest { Task assignedTask = applyForTaskService.applyForTask(applyForTaskCommand); assertThat(assignedTask).isNotNull(); + // Checks that the first (and only) task type has no tasks + assertThat(roster.getAllTasksFromQueue().stream().findFirst().get()).hasSize(0); then(taskAssignedEventPort).should(times(1)) .publishTaskAssignedEvent(any(TaskAssignedEvent.class)); diff --git a/roster/src/test/java/ch/unisg/roster/roster/domain/RosterTest.java b/roster/src/test/java/ch/unisg/roster/roster/domain/RosterTest.java index d2e62e6..45ef41b 100644 --- a/roster/src/test/java/ch/unisg/roster/roster/domain/RosterTest.java +++ b/roster/src/test/java/ch/unisg/roster/roster/domain/RosterTest.java @@ -28,13 +28,8 @@ public class RosterTest { assertThat(rosterMap.iterator().next().getTaskType()).isEqualTo("TEST-TYPE"); assertThat(rosterMap.iterator().next().getExecutorURI().getValue().toString()).isEqualTo("TEST-URI"); - assertThat(task.getTaskType().getValue().toString()).isEqualTo("TEST-TYPE"); + assertThat(task.getTaskType().getValue()).isEqualTo("TEST-TYPE"); assertThat(task.getTaskID()).isEqualTo("TEST-ID"); - - boolean empty_queue = roster.deleteTask("TEST-ID"); - // TODO test that the task was removed from the Queue similar to below --> I don't know if it actually gets deleted or not - //assertThat(empty_queue).isEqualTo(true); - //assertThat(queues.size()).isEqualTo(0); } @Test @@ -45,8 +40,8 @@ public class RosterTest { roster.addTaskToQueue(new Task("TEST-ID", "TEST-TYPE")); boolean test = roster.deleteTask("TEST-ID"); - // TODO Fix assert for queue assertThat(test).isEqualTo(true); - assertThat(queues.size()).isEqualTo(1); + // Checks that the first (and only) task type has no tasks + assertThat(queues.stream().findFirst().get()).hasSize(0); } } diff --git a/tapas-auction-house/src/main/java/ch/unisg/tapas/TapasAuctionHouseApplication.java b/tapas-auction-house/src/main/java/ch/unisg/tapas/TapasAuctionHouseApplication.java index f738311..c828d23 100644 --- a/tapas-auction-house/src/main/java/ch/unisg/tapas/TapasAuctionHouseApplication.java +++ b/tapas-auction-house/src/main/java/ch/unisg/tapas/TapasAuctionHouseApplication.java @@ -36,7 +36,7 @@ public class TapasAuctionHouseApplication { SpringApplication tapasAuctioneerApp = new SpringApplication(TapasAuctionHouseApplication.class); ENVIRONMENT = tapasAuctioneerApp.run(args).getEnvironment(); // TODO Set start up of message services with config - // We will use these bootstrap methods in Week 6: + bootstrapMarketplaceWithWebSub(); bootstrapMarketplaceWithMqtt(); var getExecutorsService = new GetExecutorsService(); @@ -56,12 +56,6 @@ public class TapasAuctionHouseApplication { subscriber.subscribeToAuctionHouseEndpoint(endpoint.getWebSubUri().getValue()); } } - // try { - // subscriber.subscribeToAuctionHouseEndpoint(new URI("http://6b4e-130-82-250-227.ngrok.io/websub-discovery")); - // } catch (URISyntaxException e) { - // // TODO Auto-generated catch block - // e.printStackTrace(); - // } } /** diff --git a/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/adapter/in/messaging/mqtt/AuctionEventMqttListener.java b/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/adapter/in/messaging/mqtt/AuctionEventMqttListener.java index 6da39e6..23b0307 100644 --- a/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/adapter/in/messaging/mqtt/AuctionEventMqttListener.java +++ b/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/adapter/in/messaging/mqtt/AuctionEventMqttListener.java @@ -7,5 +7,5 @@ import org.eclipse.paho.client.mqttv3.MqttMessage; */ public abstract class AuctionEventMqttListener { - public abstract boolean handleEvent(MqttMessage message); + public abstract void handleEvent(MqttMessage message); } diff --git a/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/adapter/in/messaging/mqtt/BidReceivedEventListenerMqttAdapter.java b/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/adapter/in/messaging/mqtt/BidReceivedEventListenerMqttAdapter.java index 29f45da..31a9d78 100644 --- a/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/adapter/in/messaging/mqtt/BidReceivedEventListenerMqttAdapter.java +++ b/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/adapter/in/messaging/mqtt/BidReceivedEventListenerMqttAdapter.java @@ -20,7 +20,7 @@ public class BidReceivedEventListenerMqttAdapter extends AuctionEventMqttListene private static final Logger LOGGER = LogManager.getLogger(BidReceivedEventListenerMqttAdapter.class); @Override - public boolean handleEvent(MqttMessage message){ + public void handleEvent(MqttMessage message){ String payload = new String(message.getPayload()); try { @@ -44,9 +44,7 @@ public class BidReceivedEventListenerMqttAdapter extends AuctionEventMqttListene bidReceivedHandler.handleNewBidReceivedEvent(bidReceivedEvent); } catch (JsonProcessingException | NullPointerException e) { LOGGER.error(e.getMessage(), e); - return false; } - return true; } } diff --git a/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/adapter/in/messaging/mqtt/ExecutorAddedEventListenerMqttAdapter.java b/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/adapter/in/messaging/mqtt/ExecutorAddedEventListenerMqttAdapter.java index 6d9e1da..6122441 100644 --- a/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/adapter/in/messaging/mqtt/ExecutorAddedEventListenerMqttAdapter.java +++ b/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/adapter/in/messaging/mqtt/ExecutorAddedEventListenerMqttAdapter.java @@ -23,7 +23,7 @@ public class ExecutorAddedEventListenerMqttAdapter extends AuctionEventMqttListe private static final Logger LOGGER = LogManager.getLogger(ExecutorAddedEventListenerMqttAdapter.class); @Override - public boolean handleEvent(MqttMessage message) { + public void handleEvent(MqttMessage message) { String payload = new String(message.getPayload()); try { @@ -43,9 +43,7 @@ public class ExecutorAddedEventListenerMqttAdapter extends AuctionEventMqttListe newExecutorHandler.handleNewExecutorEvent(executorAddedEvent); } catch (JsonProcessingException | NullPointerException e) { LOGGER.error(e.getMessage(), e); - return false; } - return true; } } diff --git a/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/adapter/in/messaging/mqtt/ExecutorRemovedEventListenerMqttAdapter.java b/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/adapter/in/messaging/mqtt/ExecutorRemovedEventListenerMqttAdapter.java index cf767c7..09ab879 100644 --- a/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/adapter/in/messaging/mqtt/ExecutorRemovedEventListenerMqttAdapter.java +++ b/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/adapter/in/messaging/mqtt/ExecutorRemovedEventListenerMqttAdapter.java @@ -23,7 +23,7 @@ public class ExecutorRemovedEventListenerMqttAdapter extends AuctionEventMqttLis private static final Logger LOGGER = LogManager.getLogger(ExecutorRemovedEventListenerMqttAdapter.class); @Override - public boolean handleEvent(MqttMessage message) { + public void handleEvent(MqttMessage message) { String payload = new String(message.getPayload()); try { @@ -41,9 +41,6 @@ public class ExecutorRemovedEventListenerMqttAdapter extends AuctionEventMqttLis newExecutorHandler.handleExecutorRemovedEvent(executorRemovedEvent); } catch (JsonProcessingException | NullPointerException e) { LOGGER.error(e.getMessage(), e); - return false; } - - return true; } } diff --git a/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/adapter/in/messaging/mqtt/ExternalAuctionStartedEventListenerMqttAdapter.java b/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/adapter/in/messaging/mqtt/ExternalAuctionStartedEventListenerMqttAdapter.java index 50e145c..e801e30 100644 --- a/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/adapter/in/messaging/mqtt/ExternalAuctionStartedEventListenerMqttAdapter.java +++ b/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/adapter/in/messaging/mqtt/ExternalAuctionStartedEventListenerMqttAdapter.java @@ -1,12 +1,8 @@ package ch.unisg.tapas.auctionhouse.adapter.in.messaging.mqtt; -import ch.unisg.tapas.auctionhouse.adapter.common.formats.BidJsonRepresentation; -import ch.unisg.tapas.auctionhouse.adapter.common.formats.TaskJsonRepresentation; -import ch.unisg.tapas.auctionhouse.application.handler.BidReceivedHandler; -import ch.unisg.tapas.auctionhouse.application.port.in.BidReceivedEvent; +import ch.unisg.tapas.auctionhouse.application.handler.AuctionStartedHandler; +import ch.unisg.tapas.auctionhouse.application.port.in.AuctionStartedEvent; import ch.unisg.tapas.auctionhouse.domain.Auction; -import ch.unisg.tapas.auctionhouse.domain.Bid; -import ch.unisg.tapas.auctionhouse.domain.ExecutorRegistry; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; @@ -14,23 +10,17 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.eclipse.paho.client.mqttv3.MqttMessage; -import java.io.IOException; import java.net.URI; -import java.net.http.HttpClient; -import java.net.http.HttpRequest; -import java.net.http.HttpResponse; +import java.sql.Timestamp; + public class ExternalAuctionStartedEventListenerMqttAdapter extends AuctionEventMqttListener{ private static final Logger LOGGER = LogManager.getLogger(ExternalAuctionStartedEventListenerMqttAdapter.class); - String auctionHouseURI = "https://tapas-auction-house.86-119-35-40.nip.io/"; - - String taskListURI = "https://tapas-tasks.86-119-35-40.nip.io"; - @Override - public boolean handleEvent(MqttMessage message){ + public void handleEvent(MqttMessage message){ String payload = new String(message.getPayload()); - System.out.println("New auction"); + System.out.println("New external MQTT auction"); try { // Note: this message representation is provided only as an example. You should use a @@ -44,46 +34,21 @@ public class ExternalAuctionStartedEventListenerMqttAdapter extends AuctionEvent String taskType = data.get("taskType").asText(); String deadline = data.get("deadline").asText(); - var capable = ExecutorRegistry.getInstance().containsTaskType(new Auction.AuctionedTaskType(taskType)); - System.out.println("Capable: " + capable); - // TODO check deadline - if(capable){ - var bid = new Bid( - new Auction.AuctionId(auctionId), - new Bid.BidderName("Group-1"), - new Bid.BidderAuctionHouseUri(URI.create(auctionHouseURI)), - new Bid.BidderTaskListUri(URI.create(taskListURI)) - ); + var auction = new Auction( + new Auction.AuctionId(auctionId), + new Auction.AuctionHouseUri(URI.create(auctionHouseUri)), + new Auction.AuctionedTaskUri(URI.create(taskUri)), + new Auction.AuctionedTaskType(taskType), + new Auction.AuctionDeadline(Timestamp.valueOf(deadline)) + ); - String body = BidJsonRepresentation.serialize(bid); - LOGGER.info(body); - var postURI = URI.create(auctionHouseUri + "/bid"); - HttpRequest postRequest = HttpRequest.newBuilder() - .uri(postURI) - .header("Content-Type", BidJsonRepresentation.MEDIA_TYPE) - .POST(HttpRequest.BodyPublishers.ofString(body)) - .build(); + var event = new AuctionStartedEvent(auction); + var handler = new AuctionStartedHandler(); + handler.handleAuctionStartedEvent(event); - HttpClient client = HttpClient.newHttpClient(); - var postResponse = client.send(postRequest, HttpResponse.BodyHandlers.ofString()); - LOGGER.info(postResponse.statusCode()); - } - } catch (JsonProcessingException | NullPointerException e) { - LOGGER.error(e.getMessage(), e); - return false; - } catch (IOException e) { - - LOGGER.error(e.getMessage(), e); + } catch (JsonProcessingException e) { e.printStackTrace(); - } catch (InterruptedException e) { - - LOGGER.error(e.getMessage(), e); - e.printStackTrace(); - } catch (Exception e){ - LOGGER.error(e.getMessage(), e); } - - return true; } } diff --git a/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/adapter/in/messaging/websub/AuctionStartedEventListenerWebSubAdapter.java b/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/adapter/in/messaging/websub/AuctionStartedEventListenerWebSubAdapter.java deleted file mode 100644 index 44db8a2..0000000 --- a/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/adapter/in/messaging/websub/AuctionStartedEventListenerWebSubAdapter.java +++ /dev/null @@ -1,104 +0,0 @@ -package ch.unisg.tapas.auctionhouse.adapter.in.messaging.websub; - -import ch.unisg.tapas.auctionhouse.adapter.common.formats.AuctionJsonRepresentation; -import ch.unisg.tapas.auctionhouse.adapter.common.formats.BidJsonRepresentation; -import ch.unisg.tapas.auctionhouse.application.handler.AuctionStartedHandler; -import ch.unisg.tapas.auctionhouse.application.port.in.AuctionStartedEvent; -import ch.unisg.tapas.auctionhouse.domain.Auction; -import ch.unisg.tapas.auctionhouse.domain.Bid; -import ch.unisg.tapas.auctionhouse.domain.Auction.AuctionDeadline; -import ch.unisg.tapas.auctionhouse.domain.Auction.AuctionHouseUri; -import ch.unisg.tapas.auctionhouse.domain.Auction.AuctionId; -import ch.unisg.tapas.auctionhouse.domain.Auction.AuctionedTaskType; -import ch.unisg.tapas.auctionhouse.domain.Auction.AuctionedTaskUri; - -import java.io.IOException; -import java.net.URI; -import java.net.URISyntaxException; -import java.net.http.HttpClient; -import java.net.http.HttpRequest; -import java.net.http.HttpResponse; -import java.security.Timestamp; -import java.util.Collection; -import java.util.Date; - -import com.fasterxml.jackson.core.JsonProcessingException; - -import org.json.JSONArray; -import org.json.JSONObject; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -/** - * This class is a template for handling auction started events received via WebSub - */ -@RestController -public class AuctionStartedEventListenerWebSubAdapter { - private final AuctionStartedHandler auctionStartedHandler; - - public AuctionStartedEventListenerWebSubAdapter(AuctionStartedHandler auctionStartedHandler) { - this.auctionStartedHandler = auctionStartedHandler; - } - /** - * Controller which listens to auction-started callbacks - * @return 200 OK - * @throws URISyntaxException - **/ - // TODO generate a new capability ID instead of using a hardcoded one. - @PostMapping(path = "/auction-started/74c72c7f-2739-4124-aa35-a3225171a97c") - public ResponseEntity handleExecutorAddedEvent(@RequestBody String payload) throws URISyntaxException { - - System.out.println("new websub auctions"); - System.out.println(payload); - - - JSONArray auctions = new JSONArray(payload); - if (auctions.length() > 0) { - JSONObject auction = auctions.getJSONObject(0); - System.out.print(auction); - - - String auctionHouseURI = "https://tapas-auction-house.86-119-35-40.nip.io/"; - - String taskListURI = "https://tapas-tasks.86-119-35-40.nip.io"; - - // TODO Sanitize URIs - String auctionId = auction.getString("auctionId"); - String auctionHouseUri = auction.getString("auctionHouseUri"); - - var bid = new Bid( - new Auction.AuctionId(auctionId), - new Bid.BidderName("Group-1"), - new Bid.BidderAuctionHouseUri(URI.create(auctionHouseURI)), - new Bid.BidderTaskListUri(URI.create(taskListURI)) - ); - - String body; - try { - body = BidJsonRepresentation.serialize(bid); - //LOGGER.info(body); - var postURI = URI.create(auctionHouseUri + "/bid"); - HttpRequest postRequest = HttpRequest.newBuilder() - .uri(postURI) - .header("Content-Type", BidJsonRepresentation.MEDIA_TYPE) - .POST(HttpRequest.BodyPublishers.ofString(body)) - .build(); - - HttpClient client = HttpClient.newHttpClient(); - var postResponse = client.send(postRequest, HttpResponse.BodyHandlers.ofString()); - } catch (JsonProcessingException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (InterruptedException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - }; - - return new ResponseEntity<>(HttpStatus.OK); - } -} diff --git a/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/adapter/in/messaging/websub/ExternalAuctionStartedEventListenerWebSubAdapter.java b/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/adapter/in/messaging/websub/ExternalAuctionStartedEventListenerWebSubAdapter.java new file mode 100644 index 0000000..ae30a96 --- /dev/null +++ b/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/adapter/in/messaging/websub/ExternalAuctionStartedEventListenerWebSubAdapter.java @@ -0,0 +1,66 @@ +package ch.unisg.tapas.auctionhouse.adapter.in.messaging.websub; + +import ch.unisg.tapas.auctionhouse.application.handler.AuctionStartedHandler; +import ch.unisg.tapas.auctionhouse.application.port.in.AuctionStartedEvent; +import ch.unisg.tapas.auctionhouse.domain.Auction; +import org.json.JSONArray; +import org.json.JSONObject; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import java.net.URI; +import java.net.URISyntaxException; +import java.sql.Timestamp; + +/** + * This class is a template for handling auction started events received via WebSub + */ +@RestController +public class ExternalAuctionStartedEventListenerWebSubAdapter { + private final AuctionStartedHandler auctionStartedHandler; + + public ExternalAuctionStartedEventListenerWebSubAdapter(AuctionStartedHandler auctionStartedHandler) { + this.auctionStartedHandler = auctionStartedHandler; + } + /** + * Controller which listens to auction-started callbacks + * @return 200 OK + * @throws URISyntaxException + **/ + // TODO generate a new capability ID instead of using a hardcoded one. + @PostMapping(path = "/auction-started/74c72c7f-2739-4124-aa35-a3225171a97c") + public ResponseEntity handleExecutorAddedEvent(@RequestBody String payload) throws URISyntaxException { + + System.out.println("New external WebSub auction"); + System.out.println(payload); + + + JSONArray auctions = new JSONArray(payload); + if (auctions.length() > 0) { + JSONObject auctionJson = auctions.getJSONObject(0); + System.out.print(auctionJson); + + String auctionId = auctionJson.getString("auctionId"); + String auctionHouseUri = auctionJson.getString("auctionHouseUri"); + String taskUri = auctionJson.getString("taskUri"); + String taskType = auctionJson.getString("taskType"); + String deadline = auctionJson.getString("deadline"); + + var auction = new Auction( + new Auction.AuctionId(auctionId), + new Auction.AuctionHouseUri(URI.create(auctionHouseUri)), + new Auction.AuctionedTaskUri(URI.create(taskUri)), + new Auction.AuctionedTaskType(taskType), + new Auction.AuctionDeadline(Timestamp.valueOf(deadline)) + ); + + var event = new AuctionStartedEvent(auction); + auctionStartedHandler.handleAuctionStartedEvent(event); + } + + return new ResponseEntity<>(HttpStatus.OK); + } +} diff --git a/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/adapter/out/web/AuctionHouseDiscoveryHttpAdapter.java b/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/adapter/out/web/AuctionHouseDiscoveryHttpAdapter.java index 1db4a18..366e513 100644 --- a/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/adapter/out/web/AuctionHouseDiscoveryHttpAdapter.java +++ b/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/adapter/out/web/AuctionHouseDiscoveryHttpAdapter.java @@ -53,13 +53,13 @@ public class AuctionHouseDiscoveryHttpAdapter implements AuctionHouseDiscoveryPo return returnList; } - return Collections.emptyList(); + return Collections.emptyList(); } catch (IOException e) { e.printStackTrace(); - return Collections.emptyList(); + return Collections.emptyList(); } catch (InterruptedException e) { e.printStackTrace(); - return Collections.emptyList(); + return Collections.emptyList(); } } diff --git a/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/adapter/out/web/PlaceBidForAuctionCommandHttpAdapter.java b/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/adapter/out/web/PlaceBidForAuctionCommandHttpAdapter.java index 6db8c68..8a56b8f 100644 --- a/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/adapter/out/web/PlaceBidForAuctionCommandHttpAdapter.java +++ b/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/adapter/out/web/PlaceBidForAuctionCommandHttpAdapter.java @@ -1,19 +1,48 @@ package ch.unisg.tapas.auctionhouse.adapter.out.web; +import ch.unisg.tapas.auctionhouse.adapter.common.formats.BidJsonRepresentation; +import ch.unisg.tapas.auctionhouse.adapter.in.messaging.mqtt.ExternalAuctionStartedEventListenerMqttAdapter; import ch.unisg.tapas.auctionhouse.application.port.out.PlaceBidForAuctionCommand; import ch.unisg.tapas.auctionhouse.application.port.out.PlaceBidForAuctionCommandPort; +import com.fasterxml.jackson.core.JsonProcessingException; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.springframework.context.annotation.Primary; import org.springframework.stereotype.Component; -/** - * This class is a tempalte for implementing a place bid for auction command via HTTP. - */ +import java.io.IOException; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; + + @Component @Primary public class PlaceBidForAuctionCommandHttpAdapter implements PlaceBidForAuctionCommandPort { + private static final Logger LOGGER = LogManager.getLogger(PlaceBidForAuctionCommandHttpAdapter.class); @Override public void placeBid(PlaceBidForAuctionCommand command) { - // TODO + try{ + var body = BidJsonRepresentation.serialize(command.getBid()); + LOGGER.info("Body of bid to be bid:" + body); + + var postRequest = HttpRequest.newBuilder() + .uri(command.getAuction().getAuctionHouseUri().getValue()) + .header("Content-Type", BidJsonRepresentation.MEDIA_TYPE) + .POST(HttpRequest.BodyPublishers.ofString(body)) + .build(); + + HttpClient client = HttpClient.newHttpClient(); + var postResponse = client.send(postRequest, HttpResponse.BodyHandlers.ofString()); + + LOGGER.info(postResponse.statusCode()); + } catch (JsonProcessingException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } catch (InterruptedException e) { + e.printStackTrace(); + } } } diff --git a/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/application/handler/AuctionStartedHandler.java b/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/application/handler/AuctionStartedHandler.java index e4b312f..b3d7f1a 100644 --- a/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/application/handler/AuctionStartedHandler.java +++ b/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/application/handler/AuctionStartedHandler.java @@ -37,7 +37,12 @@ public class AuctionStartedHandler implements AuctionStartedEventHandler { public boolean handleAuctionStartedEvent(AuctionStartedEvent auctionStartedEvent) { Auction auction = auctionStartedEvent.getAuction(); - if (ExecutorRegistry.getInstance().containsTaskType(auction.getTaskType())) { + var capable = ExecutorRegistry.getInstance().containsTaskType(auction.getTaskType()); + var auctionOngoing = !auction.deadlineHasPassed(); + System.out.println("Capable: " + capable); + System.out.println("Auction ongoing: " + auction.deadlineHasPassed()); + + if(capable && auctionOngoing){ LOGGER.info("Placing bid for task " + auction.getTaskUri() + " of type " + auction.getTaskType() + " in auction " + auction.getAuctionId() + " from auction house " + auction.getAuctionHouseUri().getValue().toString()); @@ -50,7 +55,8 @@ public class AuctionStartedHandler implements AuctionStartedEventHandler { PlaceBidForAuctionCommand command = new PlaceBidForAuctionCommand(auction, bid); placeBidForAuctionCommandPort.placeBid(command); - } else { + } + else if(!capable) { LOGGER.info("Cannot execute this task type: " + auction.getTaskType().getValue()); } diff --git a/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/domain/Auction.java b/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/domain/Auction.java index c6d9333..a6fdb21 100644 --- a/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/domain/Auction.java +++ b/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/domain/Auction.java @@ -5,6 +5,7 @@ import lombok.Value; import java.net.URI; import java.sql.Timestamp; +import java.time.LocalDateTime; import java.util.*; /** @@ -129,6 +130,17 @@ public class Auction { return auctionStatus.getValue() == Status.OPEN; } + /** + * Checks if the deadline has passed. + * Useful to check if external auctions are finished. + * + * @return true if deadline is greater than current timestamp, false otherwise + */ + public boolean deadlineHasPassed() { + var currentTime = new Timestamp(System.currentTimeMillis()); + return currentTime.before(deadline.getValue()); + } + /** * Closes the auction. Called by the StartAuctionService after the auction deadline has expired. */ diff --git a/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/domain/AuctionHouseDiscovery.java b/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/domain/AuctionHouseDiscovery.java index c51ec98..48e5fa9 100644 --- a/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/domain/AuctionHouseDiscovery.java +++ b/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/domain/AuctionHouseDiscovery.java @@ -25,7 +25,7 @@ public class AuctionHouseDiscovery { // static String AUCTION_HOUSE_URI = "http://localhost:8086"; @Getter - private List auctionHouseDiscoveryList = new ArrayList<>() { + private final List auctionHouseDiscoveryList = new ArrayList<>() { }; private AuctionHouseDiscovery() { diff --git a/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/domain/AuctionStartedEvent.java b/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/domain/AuctionStartedEvent.java index 7cac1ec..58bdccd 100644 --- a/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/domain/AuctionStartedEvent.java +++ b/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/domain/AuctionStartedEvent.java @@ -7,7 +7,7 @@ import lombok.Getter; */ public class AuctionStartedEvent { @Getter - private Auction auction; + private final Auction auction; public AuctionStartedEvent(Auction auction) { this.auction = auction; diff --git a/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/domain/AuctionWonEvent.java b/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/domain/AuctionWonEvent.java index 484646c..22cfcaa 100644 --- a/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/domain/AuctionWonEvent.java +++ b/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/domain/AuctionWonEvent.java @@ -8,7 +8,7 @@ import lombok.Getter; public class AuctionWonEvent { // The winning bid @Getter - private Bid winningBid; + private final Bid winningBid; public AuctionWonEvent(Bid winningBid) { this.winningBid = winningBid; diff --git a/tapas-auction-house/src/main/java/ch/unisg/tapas/common/AuctionHouseResourceDirectory.java b/tapas-auction-house/src/main/java/ch/unisg/tapas/common/AuctionHouseResourceDirectory.java index e44690f..47ca9a8 100644 --- a/tapas-auction-house/src/main/java/ch/unisg/tapas/common/AuctionHouseResourceDirectory.java +++ b/tapas-auction-house/src/main/java/ch/unisg/tapas/common/AuctionHouseResourceDirectory.java @@ -31,12 +31,12 @@ public class AuctionHouseResourceDirectory { this.rdEndpoint = rdEndpoint; } - private AuctionHouseDiscoveryPort auctionHouseDiscoveryport = new AuctionHouseDiscoveryHttpAdapter(); + private final AuctionHouseDiscoveryPort auctionHouseDiscoveryport = new AuctionHouseDiscoveryHttpAdapter(); - private List auctionHouseEndpoints = new ArrayList<>(); + private final List auctionHouseEndpoints = new ArrayList<>(); // List to keep track of already fetched endpoints - private List fetchedEndpoints = new ArrayList<>(); + private final List fetchedEndpoints = new ArrayList<>(); /** * Retrieves the endpoints of all auctions houses registered with this directory. diff --git a/tapas-auction-house/src/main/java/ch/unisg/tapas/common/SelfValidating.java b/tapas-auction-house/src/main/java/ch/unisg/tapas/common/SelfValidating.java index 1b56db4..39fa40d 100644 --- a/tapas-auction-house/src/main/java/ch/unisg/tapas/common/SelfValidating.java +++ b/tapas-auction-house/src/main/java/ch/unisg/tapas/common/SelfValidating.java @@ -5,7 +5,7 @@ import java.util.Set; public class SelfValidating { - private Validator validator; + private final Validator validator; public SelfValidating() { ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); diff --git a/tapas-tasks/src/main/java/ch/unisg/tapastasks/common/SelfValidating.java b/tapas-tasks/src/main/java/ch/unisg/tapastasks/common/SelfValidating.java index d7cf6fc..2528d79 100644 --- a/tapas-tasks/src/main/java/ch/unisg/tapastasks/common/SelfValidating.java +++ b/tapas-tasks/src/main/java/ch/unisg/tapastasks/common/SelfValidating.java @@ -9,7 +9,7 @@ import java.util.Set; public abstract class SelfValidating { - private Validator validator; + private final Validator validator; public SelfValidating() { ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); diff --git a/tapas-tasks/src/main/java/ch/unisg/tapastasks/tasks/adapter/out/persistence/mongodb/TaskRepository.java b/tapas-tasks/src/main/java/ch/unisg/tapastasks/tasks/adapter/out/persistence/mongodb/TaskRepository.java index a6585c7..11120d2 100644 --- a/tapas-tasks/src/main/java/ch/unisg/tapastasks/tasks/adapter/out/persistence/mongodb/TaskRepository.java +++ b/tapas-tasks/src/main/java/ch/unisg/tapastasks/tasks/adapter/out/persistence/mongodb/TaskRepository.java @@ -8,9 +8,9 @@ import java.util.List; @Repository public interface TaskRepository extends MongoRepository { - public MongoTaskDocument findByTaskId(String taskId); + MongoTaskDocument findByTaskId(String taskId); - public List getAllBy(); + List getAllBy(); - public void deleteByTaskId(String taskId); + void deleteByTaskId(String taskId); } diff --git a/tapas-tasks/src/test/java/ch/unisg/tapastasks/archunit/Adapters.java b/tapas-tasks/src/test/java/ch/unisg/tapastasks/archunit/Adapters.java index 92a764b..49d74ee 100644 --- a/tapas-tasks/src/test/java/ch/unisg/tapastasks/archunit/Adapters.java +++ b/tapas-tasks/src/test/java/ch/unisg/tapastasks/archunit/Adapters.java @@ -8,8 +8,8 @@ import java.util.List; public class Adapters extends ArchitectureElement { private final HexagonalArchitecture parentContext; - private List incomingAdapterPackages = new ArrayList<>(); - private List outgoingAdapterPackages = new ArrayList<>(); + private final List incomingAdapterPackages = new ArrayList<>(); + private final List outgoingAdapterPackages = new ArrayList<>(); Adapters(HexagonalArchitecture parentContext, String basePackage) { super(basePackage); diff --git a/tapas-tasks/src/test/java/ch/unisg/tapastasks/archunit/ApplicationLayer.java b/tapas-tasks/src/test/java/ch/unisg/tapastasks/archunit/ApplicationLayer.java index e8e00a5..167e87a 100644 --- a/tapas-tasks/src/test/java/ch/unisg/tapastasks/archunit/ApplicationLayer.java +++ b/tapas-tasks/src/test/java/ch/unisg/tapastasks/archunit/ApplicationLayer.java @@ -8,9 +8,9 @@ import java.util.List; public class ApplicationLayer extends ArchitectureElement { private final HexagonalArchitecture parentContext; - private List incomingPortsPackages = new ArrayList<>(); - private List outgoingPortsPackages = new ArrayList<>(); - private List servicePackages = new ArrayList<>(); + private final List incomingPortsPackages = new ArrayList<>(); + private final List outgoingPortsPackages = new ArrayList<>(); + private final List servicePackages = new ArrayList<>(); public ApplicationLayer(String basePackage, HexagonalArchitecture parentContext) { super(basePackage); diff --git a/tapas-tasks/src/test/java/ch/unisg/tapastasks/archunit/HexagonalArchitecture.java b/tapas-tasks/src/test/java/ch/unisg/tapastasks/archunit/HexagonalArchitecture.java index 1445968..c9b8614 100644 --- a/tapas-tasks/src/test/java/ch/unisg/tapastasks/archunit/HexagonalArchitecture.java +++ b/tapas-tasks/src/test/java/ch/unisg/tapastasks/archunit/HexagonalArchitecture.java @@ -11,7 +11,7 @@ public class HexagonalArchitecture extends ArchitectureElement { private Adapters adapters; private ApplicationLayer applicationLayer; private String configurationPackage; - private List domainPackages = new ArrayList<>(); + private final List domainPackages = new ArrayList<>(); public static HexagonalArchitecture boundedContext(String basePackage) { return new HexagonalArchitecture(basePackage);