Implement a list of required event to be replayed on the client to represent current joal state

This commit is contained in:
anthonyraymond 2017-07-05 23:44:54 +02:00
parent e64db4db17
commit 9617e13b6b
3 changed files with 100 additions and 13 deletions

View file

@ -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<StompMessage> replayableState() {
return this.messageSendingTemplate.getReplayablePayloads();
}
}

View file

@ -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<StompMessage> replayablePayloads;
public JoalMessageSendingTemplate(final SimpMessageSendingOperations messageSendingOperations) {
this.messageSendingOperations = messageSendingOperations;
this.replayablePayloads = new ArrayList<>(30);
}
public List<StompMessage> 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;
}
}
}
}

View file

@ -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;