From 9617e13b6b3de6f04725284cf0c61c5783a40e97 Mon Sep 17 00:00:00 2001 From: anthonyraymond Date: Wed, 5 Jul 2017 23:44:54 +0200 Subject: [PATCH] Implement a list of required event to be replayed on the client to represent current joal state --- .../joal/web/resources/SummaryController.java | 27 +++--- .../services/JoalMessageSendingTemplate.java | 83 ++++++++++++++++++- .../outgoing/StompMessageTypesTest.java | 3 + 3 files changed, 100 insertions(+), 13 deletions(-) diff --git a/src/main/java/org/araymond/joal/web/resources/SummaryController.java b/src/main/java/org/araymond/joal/web/resources/SummaryController.java index 466084b..06cef20 100644 --- a/src/main/java/org/araymond/joal/web/resources/SummaryController.java +++ b/src/main/java/org/araymond/joal/web/resources/SummaryController.java @@ -1,28 +1,35 @@ package org.araymond.joal.web.resources; -import org.araymond.joal.core.SeedManager; -import org.araymond.joal.core.config.JoalConfigProvider; +import org.araymond.joal.web.messages.outgoing.StompMessage; +import org.araymond.joal.web.services.JoalMessageSendingTemplate; +import org.springframework.http.MediaType; import org.springframework.messaging.handler.annotation.MessageMapping; import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; import javax.inject.Inject; +import java.util.List; /** * Created by raymo on 04/07/2017. */ -@Controller -@MessageMapping("/summary") +@RestController +@RequestMapping("/replayable") public class SummaryController { - private final JoalConfigProvider configProvider; - private final SeedManager seedManager; + private final JoalMessageSendingTemplate messageSendingTemplate; @Inject - public SummaryController(final JoalConfigProvider configProvider, final SeedManager seedManager) { - this.configProvider = configProvider; - this.seedManager = seedManager; + public SummaryController(final JoalMessageSendingTemplate messageSendingTemplate) { + this.messageSendingTemplate = messageSendingTemplate; + } + + @RequestMapping(value = "/list", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_UTF8_VALUE) + public List replayableState() { + return this.messageSendingTemplate.getReplayablePayloads(); } - } diff --git a/src/main/java/org/araymond/joal/web/services/JoalMessageSendingTemplate.java b/src/main/java/org/araymond/joal/web/services/JoalMessageSendingTemplate.java index 5b6d6ea..adaf794 100644 --- a/src/main/java/org/araymond/joal/web/services/JoalMessageSendingTemplate.java +++ b/src/main/java/org/araymond/joal/web/services/JoalMessageSendingTemplate.java @@ -2,12 +2,15 @@ package org.araymond.joal.web.services; import org.araymond.joal.web.messages.outgoing.MessagePayload; import org.araymond.joal.web.messages.outgoing.StompMessage; +import org.araymond.joal.web.messages.outgoing.impl.announce.AnnouncePayload; import org.springframework.messaging.MessagingException; -import org.springframework.messaging.core.MessagePostProcessor; import org.springframework.messaging.simp.SimpMessageSendingOperations; import org.springframework.stereotype.Service; -import java.util.Map; +import java.util.ArrayList; +import java.util.List; + +import static org.araymond.joal.web.messages.outgoing.StompMessageTypes.*; /** * Created by raymo on 29/06/2017. @@ -16,13 +19,87 @@ import java.util.Map; public class JoalMessageSendingTemplate { private final SimpMessageSendingOperations messageSendingOperations; + private final List replayablePayloads; public JoalMessageSendingTemplate(final SimpMessageSendingOperations messageSendingOperations) { this.messageSendingOperations = messageSendingOperations; + this.replayablePayloads = new ArrayList<>(30); + } + + public List getReplayablePayloads() { + return replayablePayloads; } public void convertAndSend(final String s, final MessagePayload payload) throws MessagingException { - messageSendingOperations.convertAndSend(s, StompMessage.wrap(payload)); + final StompMessage stompMessage = StompMessage.wrap(payload); + addToReplayable(stompMessage); + messageSendingOperations.convertAndSend(s, stompMessage); + } + + + private void addToReplayable(final StompMessage stompMessage) { + switch (stompMessage.getType()) { + case SEED_SESSION_HAS_STARTED: { + replayablePayloads.removeIf(message -> message.getType() == SEED_SESSION_HAS_STARTED || message.getType() == SEED_SESSION_HAS_ENDED); + replayablePayloads.add(stompMessage); + break; + } + case SEED_SESSION_HAS_ENDED: { + replayablePayloads.removeIf(message -> message.getType() == SEED_SESSION_HAS_STARTED || message.getType() == SEED_SESSION_HAS_ENDED); + replayablePayloads.add(stompMessage); + break; + } + case ANNOUNCER_HAS_STARTED: { + replayablePayloads.add(stompMessage); + break; + } + case ANNOUNCER_HAS_STOPPED: { + final String id = ((AnnouncePayload) stompMessage.getPayload()).getId(); + replayablePayloads.removeIf(message -> { + if (!AnnouncePayload.class.isAssignableFrom(message.getPayload().getClass())) { + return false; + } + return ((AnnouncePayload) message.getPayload()).getId().equals(id); + }); + break; + } + case ANNOUNCER_WILL_ANNOUNCE: { + final String id = ((AnnouncePayload) stompMessage.getPayload()).getId(); + replayablePayloads.removeIf(message -> { + if (!AnnouncePayload.class.isAssignableFrom(message.getPayload().getClass())) { + return false; + } + return ((AnnouncePayload) message.getPayload()).getId().equals(id) + && (message.getType() == ANNOUNCER_HAS_FAILED_TO_ANNOUNCE || message.getType() == ANNOUNCER_HAS_ANNOUNCED || message.getType() == ANNOUNCER_WILL_ANNOUNCE); + }); + replayablePayloads.add(stompMessage); + break; + } + case ANNOUNCER_HAS_ANNOUNCED: { + final String id = ((AnnouncePayload) stompMessage.getPayload()).getId(); + replayablePayloads.removeIf(message -> { + if (!AnnouncePayload.class.isAssignableFrom(message.getPayload().getClass())) { + return false; + } + return ((AnnouncePayload) message.getPayload()).getId().equals(id) + && (message.getType() == ANNOUNCER_HAS_FAILED_TO_ANNOUNCE || message.getType() == ANNOUNCER_HAS_ANNOUNCED || message.getType() == ANNOUNCER_WILL_ANNOUNCE); + }); + replayablePayloads.add(stompMessage); + break; + } + case ANNOUNCER_HAS_FAILED_TO_ANNOUNCE: { + final String id = ((AnnouncePayload) stompMessage.getPayload()).getId(); + replayablePayloads.removeIf(message -> { + if (!AnnouncePayload.class.isAssignableFrom(message.getPayload().getClass())) { + return false; + } + return ((AnnouncePayload) message.getPayload()).getId().equals(id) + && (message.getType() == ANNOUNCER_HAS_FAILED_TO_ANNOUNCE || message.getType() == ANNOUNCER_HAS_ANNOUNCED || message.getType() == ANNOUNCER_WILL_ANNOUNCE); + }); + replayablePayloads.add(stompMessage); + break; + } + } } } diff --git a/src/test/java/org/araymond/joal/web/messages/outgoing/StompMessageTypesTest.java b/src/test/java/org/araymond/joal/web/messages/outgoing/StompMessageTypesTest.java index c2b4886..b6c3a73 100644 --- a/src/test/java/org/araymond/joal/web/messages/outgoing/StompMessageTypesTest.java +++ b/src/test/java/org/araymond/joal/web/messages/outgoing/StompMessageTypesTest.java @@ -5,6 +5,9 @@ import org.araymond.joal.web.messages.outgoing.impl.global.SeedSessionHasEndedPa import org.araymond.joal.web.messages.outgoing.impl.global.SeedSessionHasStartedPayload; import org.junit.Test; +import java.util.ArrayList; +import java.util.List; + import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy;