diff --git a/monitor-server/src/main/java/org/gridsuite/monitor/server/services/ConsumerService.java b/monitor-server/src/main/java/org/gridsuite/monitor/server/services/ConsumerService.java index f2ea5fc..d134038 100644 --- a/monitor-server/src/main/java/org/gridsuite/monitor/server/services/ConsumerService.java +++ b/monitor-server/src/main/java/org/gridsuite/monitor/server/services/ConsumerService.java @@ -7,6 +7,7 @@ package org.gridsuite.monitor.server.services; import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import org.gridsuite.monitor.commons.MessageType; import org.gridsuite.monitor.commons.ProcessExecutionStatusUpdate; @@ -71,7 +72,7 @@ private void handleStepStatusUpdate(UUID executionId, Message message) { } private void handleStepsStatusesUpdate(UUID executionId, Message message) { - List processExecutionSteps = parsePayload(message.getPayload(), List.class); + List processExecutionSteps = parsePayload(message.getPayload(), new TypeReference>() { }); monitorService.updateStepsStatuses(executionId, processExecutionSteps); } @@ -82,4 +83,12 @@ private T parsePayload(String payload, Class clazz) { throw new UncheckedIOException("Failed to parse payload as " + clazz.getSimpleName(), e); } } + + private T parsePayload(String payload, TypeReference typeReference) { + try { + return objectMapper.readValue(payload, typeReference); + } catch (JsonProcessingException e) { + throw new UncheckedIOException("Failed to parse payload as " + typeReference.getType().getTypeName(), e); + } + } } diff --git a/monitor-server/src/test/java/org/gridsuite/monitor/server/services/ConsumerServiceTest.java b/monitor-server/src/test/java/org/gridsuite/monitor/server/services/ConsumerServiceTest.java index ac13844..ffb86b8 100644 --- a/monitor-server/src/test/java/org/gridsuite/monitor/server/services/ConsumerServiceTest.java +++ b/monitor-server/src/test/java/org/gridsuite/monitor/server/services/ConsumerServiceTest.java @@ -99,6 +99,24 @@ void consumeMonitorUpdateThrowsOnInvalidJson() { verify(monitorService, never()).updateStepStatus(any(), any()); } + @Test + void consumeMonitorUpdateStepsStatusesThrowsOnInvalidJson() { + UUID executionId = UUID.randomUUID(); + String invalidPayload = "{invalid json}"; + Map headers = new HashMap<>(); + headers.put(ConsumerService.HEADER_MESSAGE_TYPE, MessageType.STEPS_STATUSES_UPDATE.toString()); + headers.put(ConsumerService.HEADER_EXECUTION_ID, executionId.toString()); + Message message = new GenericMessage<>(invalidPayload, headers); + Consumer> consumer = consumerService.consumeMonitorUpdate(); + + assertThatThrownBy(() -> consumer.accept(message)) + .isInstanceOf(UncheckedIOException.class) + .hasMessageContaining("Failed to parse payload as java.util.List"); + + verify(monitorService, never()).updateExecutionStatus(any(), any(), any(), any(), any()); + verify(monitorService, never()).updateStepsStatuses(any(), any()); + } + @Test void consumeProcessExecutionStepUpdateMessage() throws JsonProcessingException { UUID executionId = UUID.randomUUID();