From c0004768de6695e2acfa48c392765b03b81ba9d0 Mon Sep 17 00:00:00 2001 From: Mike Vink Date: Thu, 29 Jul 2021 17:37:06 +0200 Subject: refactor(): making battles is now easy --- api/src/main/java/akkamon/api/EventSocket.java | 11 +- api/src/main/java/akkamon/api/MessagingEngine.java | 131 +++++++++++---------- api/src/main/java/akkamon/api/models/Event.java | 4 +- .../java/akkamon/api/models/HeartBeatEvent.java | 6 +- .../main/java/akkamon/api/models/Interaction.java | 15 +-- .../akkamon/api/models/InteractionRequest.java | 13 -- .../api/models/OutgoingInteractionRequest.java | 15 +++ .../api/models/TrainerRegistrationReplyEvent.java | 9 +- 8 files changed, 110 insertions(+), 94 deletions(-) delete mode 100644 api/src/main/java/akkamon/api/models/InteractionRequest.java create mode 100644 api/src/main/java/akkamon/api/models/OutgoingInteractionRequest.java (limited to 'api/src/main/java') diff --git a/api/src/main/java/akkamon/api/EventSocket.java b/api/src/main/java/akkamon/api/EventSocket.java index 77950ed..0f92878 100644 --- a/api/src/main/java/akkamon/api/EventSocket.java +++ b/api/src/main/java/akkamon/api/EventSocket.java @@ -1,5 +1,6 @@ package akkamon.api; +import akkamon.domain.actors.AkkamonNexus; import akkamon.domain.AkkamonSession; import org.eclipse.jetty.websocket.api.Session; import org.eclipse.jetty.websocket.api.WebSocketAdapter; @@ -10,7 +11,7 @@ import java.util.concurrent.CountDownLatch; public class EventSocket extends WebSocketAdapter implements AkkamonSession { private final CountDownLatch closureLatch = new CountDownLatch(1); - private String trainerId; + private AkkamonNexus.TrainerID trainerID; @Override public void onWebSocketConnect(Session sess) @@ -59,12 +60,12 @@ public class EventSocket extends WebSocketAdapter implements AkkamonSession { } @Override - public void setTrainerId(String trainerId) { - this.trainerId = trainerId; + public void settrainerID(AkkamonNexus.TrainerID trainerID) { + this.trainerID = trainerID; } @Override - public String getTrainerId() { - return trainerId; + public AkkamonNexus.TrainerID gettrainerID() { + return this.trainerID; } } diff --git a/api/src/main/java/akkamon/api/MessagingEngine.java b/api/src/main/java/akkamon/api/MessagingEngine.java index 957ad6e..fb913ca 100644 --- a/api/src/main/java/akkamon/api/MessagingEngine.java +++ b/api/src/main/java/akkamon/api/MessagingEngine.java @@ -4,7 +4,7 @@ import akka.actor.typed.ActorRef; import akka.actor.typed.ActorSystem; import akkamon.api.models.*; import akkamon.domain.AkkamonMessageEngine; -import akkamon.domain.AkkamonNexus; +import akkamon.domain.actors.AkkamonNexus; import akkamon.domain.AkkamonSession; import akkamon.domain.InteractionHandshaker; import com.google.gson.Gson; @@ -15,15 +15,17 @@ import java.util.concurrent.TimeUnit; public class MessagingEngine implements AkkamonMessageEngine { + // nexus: a connection or series of connections linking two or more things. + private ActorRef nexus; + private Map> sceneIdToAkkamonSessions = new HashMap<>(); - private Map trainerIdToAkkamonSessions = new HashMap<>(); + private Map trainerIDToAkkamonSessions = new HashMap<>(); private Map> pendingInteractioRequestToHandshaker = new HashMap<>(); - private Gson gson = new Gson(); - private ActorRef system; + private Gson gson = new Gson(); public MessagingEngine() { - this.system = ActorSystem.create(AkkamonNexus.create(this), "akkamon-system"); + this.nexus = ActorSystem.create(AkkamonNexus.create(this), "akkamon-system"); ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(2); executor.scheduleAtFixedRate(new Runnable() { @@ -36,27 +38,29 @@ public class MessagingEngine implements AkkamonMessageEngine { } private void heartBeat() { - system.tell(new AkkamonNexus.RequestHeartBeat( + nexus.tell(new AkkamonNexus.RequestHeartBeat( UUID.randomUUID().getMostSignificantBits() & Long.MAX_VALUE, - system + nexus )); } @Override - public void broadCastHeartBeatToScene(String sceneId, - Map trainerPositions) { + public void broadCastHeartBeatToScene(String sceneId, Map trainerPositions) { + Set sceneSessions = sceneIdToAkkamonSessions.get(sceneId); // System.out.println(sceneSessions); // System.out.println(sceneIdToAkkamonSessions.keySet()); if (sceneSessions != null) { for (AkkamonSession session : sceneSessions) { - Map withoutSelf = new HashMap<>(trainerPositions); - withoutSelf.remove(session.getTrainerId()); + Map withoutSelf = new HashMap<>(trainerPositions); + withoutSelf.remove(session.gettrainerID()); + HeartBeatEvent heartBeat = new HeartBeatEvent( withoutSelf ); + String heartBeatMessage = gson.toJson(heartBeat); - // System.out.println("Sending to " + session.getTrainerId()); + // System.out.println("Sending to " + session.gettrainerID()); // System.out.println(heartBeatMessage); session.send( heartBeatMessage @@ -66,14 +70,21 @@ public class MessagingEngine implements AkkamonMessageEngine { } @Override - public void broadCastInteractionRequestToSessionWithTrainerIds(List trainerIds, String type, String trainerId, String requestName, ActorRef handshaker) { + public void broadCastInteractionRequestToSessionWithtrainerIDs( + List trainerIDs, + String type, + AkkamonNexus.TrainerID trainerID, + String requestName, + ActorRef handshaker) { + System.out.println("Sending interaction request " + requestName); this.pendingInteractioRequestToHandshaker.put(requestName, handshaker); - trainerIds.add(trainerId); - for (String id : trainerIds) { - AkkamonSession session = trainerIdToAkkamonSessions.get(id); + trainerIDs.add(trainerID); + + for (AkkamonNexus.TrainerID id : trainerIDs) { + AkkamonSession session = trainerIDToAkkamonSessions.get(id); if (session != null) { - session.send(gson.toJson(new InteractionRequest( + session.send(gson.toJson(new OutgoingInteractionRequest( type, id, requestName @@ -86,33 +97,35 @@ public class MessagingEngine implements AkkamonMessageEngine { @Override - public void registerTrainerSessionToSceneAndTrainerIdMaps(String sceneId, AkkamonSession session) { - System.out.println("Registering session to scene " + sceneId); - Set sceneIdMapping = sceneIdToAkkamonSessions.get(sceneId); - AkkamonSession trainerIdMapping = trainerIdToAkkamonSessions.get(session.getTrainerId()); + public void registerTrainerSessionToSceneAndtrainerIDMaps(AkkamonNexus.TrainerID trainerID, AkkamonSession session) { + System.out.println("Registering session to scene " + trainerID.scene); + + Set sceneIdMapping = sceneIdToAkkamonSessions.get(trainerID.scene); + // AkkamonSession trainerIDMapping = trainerIDToAkkamonSessions.get(session.gettrainerID()); + if (sceneIdMapping != null) { sceneIdMapping.add(session); } else { sceneIdMapping = new HashSet<>(); sceneIdMapping.add(session); - sceneIdToAkkamonSessions.put(sceneId, + sceneIdToAkkamonSessions.put(trainerID.scene, sceneIdMapping ); System.out.println(sceneIdToAkkamonSessions.keySet()); } - trainerIdToAkkamonSessions.put(session.getTrainerId(), session); - System.out.println(trainerIdToAkkamonSessions); + trainerIDToAkkamonSessions.put(session.gettrainerID(), session); + System.out.println(trainerIDToAkkamonSessions); - System.out.println("Sending trainerId: " + session.getTrainerId()); + System.out.println("Sending trainerID: " + session.gettrainerID()); // TODO what if registration goes wrong ... session.send( - gson.toJson(new TrainerRegistrationReplyEvent(session.getTrainerId())) + gson.toJson(new TrainerRegistrationReplyEvent(session.gettrainerID())) ); } @Override - public void removeTrainerSessionFromScene(String sceneId, AkkamonSession session) { + public void removeTrainerSessionFromScene(AkkamonNexus.TrainerID sceneId, AkkamonSession session) { this.sceneIdToAkkamonSessions.get(sceneId).remove(session); } @@ -123,12 +136,12 @@ public class MessagingEngine implements AkkamonMessageEngine { if (entry.getValue().contains(session)) sceneId = entry.getKey(); } - system.tell(new AkkamonNexus.RequestTrainerOffline( + nexus.tell(new AkkamonNexus.RequestTrainerOffline( UUID.randomUUID().getMostSignificantBits() & Long.MAX_VALUE, - session.getTrainerId(), + session.gettrainerID(), sceneId, session, - system + nexus )); } @@ -138,9 +151,10 @@ public class MessagingEngine implements AkkamonMessageEngine { } @Override - public void broadCastInteractionStart(String requestName, String interactionType, Set waitingToStartInteraction) { - for (String trainerId : waitingToStartInteraction) { - AkkamonSession session = trainerIdToAkkamonSessions.get(trainerId); + public void broadCastInteractionStart(String requestName, String interactionType, Set waitingToStartInteraction) { + for (AkkamonNexus.TrainerID trainerID : waitingToStartInteraction) { + + AkkamonSession session = trainerIDToAkkamonSessions.get(trainerID); session.send(gson.toJson( new InteractionStartEvent( requestName, @@ -152,75 +166,74 @@ public class MessagingEngine implements AkkamonMessageEngine { } @Override - public void broadCastHandshakeFail(String requestName, Set waitingToStartInteraction) { + public void broadCastHandshakeFail(String requestName, Set waitingToStartInteraction) { System.out.println("Handshake fail not implemented yet!"); } void incoming(AkkamonSession session, String message) { + System.out.println(message); Event event = gson.fromJson(message, Event.class); if (event == null) { System.out.println("Received non-supported message DTO."); return; } - // TODO use session trainerId + // TODO use session trainerID String sceneId = "DemoScene"; switch (event.type) { case INTERACTION_REPLY: System.out.println("received interaction reply!"); - sendToHandshaker(event.requestName, event.trainerId, event.sceneId, event.value); + sendToHandshaker(event.requestName, event.trainerID, event.value); break; case INTERACTION_REQUEST: System.out.println("received interaction request"); System.out.println(event.interaction); - system.tell(new AkkamonNexus.RequestInteraction( + nexus.tell(new AkkamonNexus.RequestInteraction( UUID.randomUUID().getMostSignificantBits() & Long.MAX_VALUE, event.interaction.type, - event.sceneId, - event.interaction.requestingTrainerId, - event.interaction.receivingTrainerIds, - system + event.trainerID, + event.interaction.receivingtrainerIDs, + nexus )); break; case START_MOVING: - system.tell(new AkkamonNexus.RequestStartMoving( + System.out.println(message); + nexus.tell(new AkkamonNexus.RequestStartMoving( UUID.randomUUID().getMostSignificantBits() & Long.MAX_VALUE, - session.getTrainerId(), - event.sceneId, + event.trainerID, event.direction, - system + nexus )); break; case NEW_TILE_POS: - system.tell( + nexus.tell( new AkkamonNexus.RequestNewTilePos( UUID.randomUUID().getMostSignificantBits() & Long.MAX_VALUE, - session.getTrainerId(), - event.sceneId, + event.trainerID, event.tilePos, - system + nexus ) ); break; case STOP_MOVING: - system.tell( + nexus.tell( new AkkamonNexus.RequestStopMoving( UUID.randomUUID().getMostSignificantBits() & Long.MAX_VALUE, - session.getTrainerId(), - event.sceneId, + event.trainerID, event.direction, - system + nexus ) ); break; case TRAINER_REGISTRATION_REQUEST: - String trainerId = String.valueOf(sceneIdToAkkamonSessions.get(sceneId) == null ? 1 : sceneIdToAkkamonSessions.get(sceneId).size() + 1); - system.tell(new AkkamonNexus.RequestTrainerRegistration( - trainerId, + // Here we make the trainerID and the scene is hard coded! + String trainerName = String.valueOf(sceneIdToAkkamonSessions.get(sceneId) == null ? 1 : sceneIdToAkkamonSessions.get(sceneId).size() + 1); + nexus.tell(new AkkamonNexus.RequestTrainerRegistration( + trainerName, sceneId, session, - system + nexus )); break; case HEART_BEAT: @@ -230,11 +243,11 @@ public class MessagingEngine implements AkkamonMessageEngine { } - private void sendToHandshaker(String requestName, String trainerId, String sceneId, boolean value) { + private void sendToHandshaker(String requestName, AkkamonNexus.TrainerID trainerID, boolean value) { ActorRef handshaker = pendingInteractioRequestToHandshaker.get(requestName); if (handshaker != null) { handshaker.tell( - new InteractionHandshaker.InteractionReply(requestName, trainerId, sceneId, value) + new InteractionHandshaker.InteractionReply(requestName, trainerID, value) ); } } diff --git a/api/src/main/java/akkamon/api/models/Event.java b/api/src/main/java/akkamon/api/models/Event.java index 4743453..06ca8d0 100644 --- a/api/src/main/java/akkamon/api/models/Event.java +++ b/api/src/main/java/akkamon/api/models/Event.java @@ -1,13 +1,13 @@ package akkamon.api.models; +import akkamon.domain.actors.AkkamonNexus; import akkamon.domain.Direction; import akkamon.domain.TilePos; public class Event { public EventType type; - public String trainerId; + public AkkamonNexus.TrainerID trainerID; public Direction direction; - public String sceneId; public TilePos tilePos; public Interaction interaction; public String requestName; diff --git a/api/src/main/java/akkamon/api/models/HeartBeatEvent.java b/api/src/main/java/akkamon/api/models/HeartBeatEvent.java index b795feb..2ec98ad 100644 --- a/api/src/main/java/akkamon/api/models/HeartBeatEvent.java +++ b/api/src/main/java/akkamon/api/models/HeartBeatEvent.java @@ -1,13 +1,13 @@ package akkamon.api.models; -import akkamon.domain.AkkamonNexus; +import akkamon.domain.actors.AkkamonNexus; import java.util.Map; public class HeartBeatEvent extends Event { - public Map remoteMovementQueues; + public Map remoteMovementQueues; - public HeartBeatEvent(Map remoteMovementQueues) { + public HeartBeatEvent(Map remoteMovementQueues) { this.type = EventType.HEART_BEAT; this.remoteMovementQueues = remoteMovementQueues; } diff --git a/api/src/main/java/akkamon/api/models/Interaction.java b/api/src/main/java/akkamon/api/models/Interaction.java index 5bc9d17..ad947e9 100644 --- a/api/src/main/java/akkamon/api/models/Interaction.java +++ b/api/src/main/java/akkamon/api/models/Interaction.java @@ -1,21 +1,22 @@ package akkamon.api.models; +import akkamon.domain.actors.AkkamonNexus; + import java.util.List; public class Interaction { public String type; - public String requestingTrainerId; - public List receivingTrainerIds; + public String requestingtrainerID; + public List receivingtrainerIDs; - public Interaction(String type, String requestingTrainerId, List receivingTrainerIds) { + public Interaction(String type, String requestingtrainerID, List receivingtrainerIDs) { this.type = type; - this.requestingTrainerId = requestingTrainerId; - this.receivingTrainerIds = receivingTrainerIds; + this.receivingtrainerIDs = receivingtrainerIDs; } public String toString() { return "interaction={\n\ttype: " + this.type + ",\n" + - "\trequestingTrainerId: " + this.requestingTrainerId + ",\n" + - "\treceivingTrainerIds: " + this.receivingTrainerIds + "\n}"; + "\trequestingtrainerID: " + this.requestingtrainerID + ",\n" + + "\treceivingtrainerIDs: " + this.receivingtrainerIDs + "\n}"; } } diff --git a/api/src/main/java/akkamon/api/models/InteractionRequest.java b/api/src/main/java/akkamon/api/models/InteractionRequest.java deleted file mode 100644 index ae91972..0000000 --- a/api/src/main/java/akkamon/api/models/InteractionRequest.java +++ /dev/null @@ -1,13 +0,0 @@ -package akkamon.api.models; - -public class InteractionRequest extends Event { - - public String interactionType; - - public InteractionRequest(String interactionType, String trainerId, String requestName) { - this.type = EventType.INTERACTION_REQUEST; - this.interactionType = interactionType; - this.trainerId = trainerId; - this.requestName = requestName; - } -} diff --git a/api/src/main/java/akkamon/api/models/OutgoingInteractionRequest.java b/api/src/main/java/akkamon/api/models/OutgoingInteractionRequest.java new file mode 100644 index 0000000..9360384 --- /dev/null +++ b/api/src/main/java/akkamon/api/models/OutgoingInteractionRequest.java @@ -0,0 +1,15 @@ +package akkamon.api.models; + +import akkamon.domain.actors.AkkamonNexus; + +public class OutgoingInteractionRequest extends Event { + + public String interactionType; + + public OutgoingInteractionRequest(String interactionType, AkkamonNexus.TrainerID trainerID, String requestName) { + this.type = EventType.INTERACTION_REQUEST; + this.interactionType = interactionType; + this.trainerID = trainerID; + this.requestName = requestName; + } +} diff --git a/api/src/main/java/akkamon/api/models/TrainerRegistrationReplyEvent.java b/api/src/main/java/akkamon/api/models/TrainerRegistrationReplyEvent.java index 107b722..2120e45 100644 --- a/api/src/main/java/akkamon/api/models/TrainerRegistrationReplyEvent.java +++ b/api/src/main/java/akkamon/api/models/TrainerRegistrationReplyEvent.java @@ -1,13 +1,12 @@ package akkamon.api.models; -import akkamon.domain.AkkamonNexus; - -import java.util.Map; +import akkamon.domain.actors.AkkamonNexus; public class TrainerRegistrationReplyEvent extends Event { - public TrainerRegistrationReplyEvent(String sessionTrainerId) { + + public TrainerRegistrationReplyEvent(AkkamonNexus.TrainerID sessiontrainerID) { this.type = EventType.TRAINER_REGISTRATION_REPLY; - this.trainerId = sessionTrainerId; + this.trainerID = sessiontrainerID; } } -- cgit v1.2.3