mirror of
https://github.com/anthonyraymond/joal.git
synced 2024-09-20 15:26:25 +08:00
Implement a list of required event to be replayed on the client to represent current joal state
This commit is contained in:
parent
e64db4db17
commit
9617e13b6b
|
@ -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();
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
Loading…
Reference in a new issue