summaryrefslogtreecommitdiff
path: root/domain/src/main/java
diff options
context:
space:
mode:
authorMike Vink <mike1994vink@gmail.com>2021-07-21 12:46:35 +0200
committerMike Vink <mike1994vink@gmail.com>2021-07-21 12:46:35 +0200
commitda613e94970da31409464c81740162f9bd7c7831 (patch)
treee16a81890f5e43b771ae8a227580e9a535b82652 /domain/src/main/java
parentf4dc48cd8359d5b8da35f678ae6630c5c4427769 (diff)
feat(): start making heartbeatquery
Diffstat (limited to 'domain/src/main/java')
-rw-r--r--domain/src/main/java/akkamon/domain/AkkamonMessageEngine.java6
-rw-r--r--domain/src/main/java/akkamon/domain/AkkamonNexus.java152
-rw-r--r--domain/src/main/java/akkamon/domain/AkkamonSession.java4
-rw-r--r--domain/src/main/java/akkamon/domain/Direction.java3
-rw-r--r--domain/src/main/java/akkamon/domain/SceneTrainerGroup.java88
-rw-r--r--domain/src/main/java/akkamon/domain/TilePos.java10
-rw-r--r--domain/src/main/java/akkamon/domain/Trainer.java34
7 files changed, 276 insertions, 21 deletions
diff --git a/domain/src/main/java/akkamon/domain/AkkamonMessageEngine.java b/domain/src/main/java/akkamon/domain/AkkamonMessageEngine.java
index fd22ce1..fc03915 100644
--- a/domain/src/main/java/akkamon/domain/AkkamonMessageEngine.java
+++ b/domain/src/main/java/akkamon/domain/AkkamonMessageEngine.java
@@ -2,9 +2,9 @@ package akkamon.domain;
public interface AkkamonMessageEngine {
// broadcasts position info to WebSocket Clients
- void broadCastGridPosition();
+ void broadCastToScene(String sceneId, String message);
- void registerTrainerSession(String trainerId, AkkamonSession session);
+ void registerTrainerSessionToScene(String sceneId, AkkamonSession session);
- void removeTrainerSession(String trainerId, AkkamonSession session);
+ void removeTrainerSessionFromScene(String sceneId, AkkamonSession session);
}
diff --git a/domain/src/main/java/akkamon/domain/AkkamonNexus.java b/domain/src/main/java/akkamon/domain/AkkamonNexus.java
index c9e07f0..0b52ffa 100644
--- a/domain/src/main/java/akkamon/domain/AkkamonNexus.java
+++ b/domain/src/main/java/akkamon/domain/AkkamonNexus.java
@@ -15,7 +15,8 @@ public class AkkamonNexus extends AbstractBehavior<AkkamonNexus.Command> {
public interface Command {}
- public static class RequestTrainerRegistration implements AkkamonNexus.Command, SceneTrainerGroup.Command {
+ public static class RequestTrainerRegistration
+ implements AkkamonNexus.Command, SceneTrainerGroup.Command {
public String trainerId;
public String sceneId;
public AkkamonSession session;
@@ -47,20 +48,104 @@ public class AkkamonNexus extends AbstractBehavior<AkkamonNexus.Command> {
}
}
- public static class RequestStartMoving implements Command, SceneTrainerGroup.Command {
+ public static class RequestStartMoving
+ implements Command, SceneTrainerGroup.Command, Trainer.Command {
public long requestId;
- public String trainerid;
+ public String trainerId;
public String sceneId;
public Direction direction;
+ public ActorRef<AkkamonNexus.Command> replyTo;
- public RequestStartMoving(long requestId, String trainerid, String sceneId, Direction direction) {
+ public RequestStartMoving(long requestId, String trainerId, String sceneId, Direction direction, ActorRef<AkkamonNexus.Command> replyTo) {
this.requestId = requestId;
- this.trainerid = trainerid;
+ this.trainerId = trainerId;
this.sceneId = sceneId;
this.direction = direction;
+ this.replyTo = replyTo;
+ }
+ }
+
+ public static class RequestStopMoving
+ implements Command, SceneTrainerGroup.Command, Trainer.Command {
+ public long requestId;
+ public String trainerId;
+ public String sceneId;
+ public Direction direction;
+ public ActorRef<AkkamonNexus.Command> replyTo;
+
+ public RequestStopMoving(
+ long requestId,
+ String trainerId,
+ String sceneId,
+ Direction direction,
+ ActorRef<AkkamonNexus.Command> replyTo) {
+ this.requestId = requestId;
+ this.trainerId = trainerId;
+ this.sceneId = sceneId;
+ this.direction = direction;
+ this.replyTo = replyTo;
+ }
+ }
+
+ public static class RequestNewTilePos
+ implements Command, SceneTrainerGroup.Command, Trainer.Command {
+ public long requestId;
+ public String trainerId;
+ public String sceneId;
+ public TilePos tilePos;
+ public ActorRef<AkkamonNexus.Command> replyTo;
+
+ public RequestNewTilePos(long requestId, String trainerId, String sceneId, TilePos tilePos, ActorRef<Command> replyTo) {
+ this.requestId = requestId;
+ this.trainerId = trainerId;
+ this.sceneId = sceneId;
+ this.tilePos = tilePos;
+ this.replyTo = replyTo;
+ }
+ }
+
+ public static class RequestHeartBeat
+ implements Command, SceneTrainerGroup.Command {
+
+ public long requestId;
+ public ActorRef<AkkamonNexus.Command> replyTo;
+
+ public RequestHeartBeat(long requestId, ActorRef<AkkamonNexus.Command> replyTo) {
+ this.requestId = requestId;
+ this.replyTo = replyTo;
}
}
+ public static class RespondHeartBeatQuery implements Command {
+
+ }
+
+ public interface TrainerPositionReading { }
+
+ public static class TrainerPosition implements TrainerPositionReading {
+ public final TilePos value;
+
+ public TrainerPosition(TilePos value) {
+ this.value = value;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ TrainerPosition other = (TrainerPosition) o;
+
+ return this.value.x == other.value.x && this.value.y == other.value.y;
+ }
+
+ @Override
+ public String toString() {
+ return "TrainerPosition={x: " + value.x + ", " + value.y + "}";
+ }
+
+ }
+
private static class SceneTrainerGroupTerminated implements AkkamonNexus.Command {
public SceneTrainerGroupTerminated(String sceneId) {
}
@@ -82,21 +167,59 @@ public class AkkamonNexus extends AbstractBehavior<AkkamonNexus.Command> {
@Override
public Receive<Command> createReceive() {
return newReceiveBuilder()
- .onMessage(
- RequestTrainerRegistration.class,
- this::onTrainerRegistration
- )
- .onMessage(
- TrainerRegistered.class,
- this::onTrainerRegistered
- )
+ .onMessage(RequestTrainerRegistration.class, this::onTrainerRegistration)
+ .onMessage(TrainerRegistered.class, this::onTrainerRegistered)
+ .onMessage(RequestHeartBeat.class, this::onHeartBeat)
+ .onMessage(RequestStartMoving.class, this::onStartMoving)
+ .onMessage(RequestStopMoving.class, this::onStopMoving)
+ .onMessage(RequestNewTilePos.class, this::onNewTilePos)
.build();
}
+ private AkkamonNexus onHeartBeat(RequestHeartBeat heartBeatRequest) {
+ return this;
+ }
+
+ private AkkamonNexus onNewTilePos(RequestNewTilePos newTilePosRequest) {
+ ActorRef<SceneTrainerGroup.Command> sceneTrainerGroup = sceneIdToActor.get(
+ newTilePosRequest.sceneId
+ );
+ if (sceneTrainerGroup != null) {
+ sceneTrainerGroup.tell(newTilePosRequest);
+ } else {
+ getContext().getLog().info("Ignoring newTilePos request in scene {}, it isn't mapped to a sceneTrainerActor.");
+ }
+ return this;
+ }
+
+ private AkkamonNexus onStopMoving(RequestStopMoving stopMovingRequest) {
+ ActorRef<SceneTrainerGroup.Command> sceneTrainerGroup = sceneIdToActor.get(
+ stopMovingRequest.sceneId
+ );
+ if (sceneTrainerGroup != null) {
+ sceneTrainerGroup.tell(stopMovingRequest);
+ } else {
+ getContext().getLog().info("Ignoring stopMove request in scene {}, it isn't mapped to a sceneTrainerActor.");
+ }
+ return this;
+ }
+
+ private AkkamonNexus onStartMoving(RequestStartMoving startMovingRequest) {
+ ActorRef<SceneTrainerGroup.Command> sceneTrainerGroup = sceneIdToActor.get(
+ startMovingRequest.sceneId
+ );
+ if (sceneTrainerGroup != null) {
+ sceneTrainerGroup.tell(startMovingRequest);
+ } else {
+ getContext().getLog().info("Ignoring stopMove request in scene {}, it isn't mapped to a sceneTrainerActor.");
+ }
+ return this;
+ }
+
private AkkamonNexus onTrainerRegistered(TrainerRegistered reply) {
// TODO test when registration fails?
getContext().getLog().info("Adding {} to Live AkkamonSessions in Messaging Engine", reply.trainerId);
- messageEngine.registerTrainerSession(reply.trainerId, reply.session);
+ messageEngine.registerTrainerSessionToScene(reply.trainerId, reply.session);
return this;
}
@@ -121,5 +244,4 @@ public class AkkamonNexus extends AbstractBehavior<AkkamonNexus.Command> {
return this;
}
-
}
diff --git a/domain/src/main/java/akkamon/domain/AkkamonSession.java b/domain/src/main/java/akkamon/domain/AkkamonSession.java
index b04aaab..68aa1fc 100644
--- a/domain/src/main/java/akkamon/domain/AkkamonSession.java
+++ b/domain/src/main/java/akkamon/domain/AkkamonSession.java
@@ -2,4 +2,8 @@ package akkamon.domain;
public interface AkkamonSession {
void send(String event);
+
+ void setTrainerId(String trainerId);
+
+ String getTrainerId();
}
diff --git a/domain/src/main/java/akkamon/domain/Direction.java b/domain/src/main/java/akkamon/domain/Direction.java
index c0908d8..71343c6 100644
--- a/domain/src/main/java/akkamon/domain/Direction.java
+++ b/domain/src/main/java/akkamon/domain/Direction.java
@@ -4,5 +4,6 @@ public enum Direction {
UP,
DOWN,
LEFT,
- RIGHT
+ RIGHT,
+ NONE
}
diff --git a/domain/src/main/java/akkamon/domain/SceneTrainerGroup.java b/domain/src/main/java/akkamon/domain/SceneTrainerGroup.java
index e6bd8ce..f01edc4 100644
--- a/domain/src/main/java/akkamon/domain/SceneTrainerGroup.java
+++ b/domain/src/main/java/akkamon/domain/SceneTrainerGroup.java
@@ -46,14 +46,100 @@ public class SceneTrainerGroup extends AbstractBehavior<SceneTrainerGroup.Comman
return newReceiveBuilder()
.onMessage(
AkkamonNexus.RequestTrainerRegistration.class,
- this::onTrainerRegistration)
+ this::onTrainerRegistration
+ )
+ .onMessage(
+ AkkamonNexus.RequestStartMoving.class,
+ this::onStartMoving
+ )
+ .onMessage(
+ AkkamonNexus.RequestStopMoving.class,
+ this::onStopMoving
+ )
+ .onMessage(
+ AkkamonNexus.RequestNewTilePos.class,
+ this::onNewTilePos
+ )
.build();
}
+ private SceneTrainerGroup onNewTilePos(AkkamonNexus.RequestNewTilePos newTilePosRequest) {
+ if (this.sceneId.equals(newTilePosRequest.sceneId)) {
+ ActorRef<Trainer.Command> trainerActor = trainerIdToActor.get(newTilePosRequest.trainerId);
+ if (trainerActor != null) {
+ trainerActor.tell(newTilePosRequest);
+ } else {
+ getContext()
+ .getLog()
+ .warn(
+ "Ignoring newTilePos for trainerId {}. There is no actor mapped to it.",
+ newTilePosRequest.trainerId
+ );
+ }
+ } else {
+ getContext()
+ .getLog()
+ .warn(
+ "Ignoring newTilePos for {}. This actor is responsible for {}.",
+ newTilePosRequest.sceneId,
+ this.sceneId);
+ }
+ return this;
+ }
+
+ private SceneTrainerGroup onStopMoving(AkkamonNexus.RequestStopMoving stopMovingRequest) {
+ if (this.sceneId.equals(stopMovingRequest.sceneId)) {
+ ActorRef<Trainer.Command> trainerActor = trainerIdToActor.get(stopMovingRequest.trainerId);
+ if (trainerActor != null) {
+ trainerActor.tell(stopMovingRequest);
+ } else {
+ getContext()
+ .getLog()
+ .warn(
+ "Ignoring stopMovingRequest for trainerId {}. There is no actor mapped to it.",
+ stopMovingRequest.trainerId
+ );
+ }
+ } else {
+ getContext()
+ .getLog()
+ .warn(
+ "Ignoring stopMovingRequest for {}. This actor is responsible for {}.",
+ stopMovingRequest.sceneId,
+ this.sceneId);
+ }
+ return this;
+ }
+
+ private SceneTrainerGroup onStartMoving(AkkamonNexus.RequestStartMoving startMovingRequest) {
+ if (this.sceneId.equals(startMovingRequest.sceneId)) {
+ ActorRef<Trainer.Command> trainerActor = trainerIdToActor.get(startMovingRequest.trainerId);
+ if (trainerActor != null) {
+ trainerActor.tell(startMovingRequest);
+ } else {
+ getContext()
+ .getLog()
+ .warn(
+ "Ignoring startMovingRequest for trainerId {}. There is no actor mapped to it.",
+ startMovingRequest.trainerId
+ );
+ }
+ } else {
+ getContext()
+ .getLog()
+ .warn(
+ "Ignoring startMovingRequest for {}. This actor is responsible for {}.",
+ startMovingRequest.sceneId,
+ this.sceneId);
+ }
+ return this;
+ }
+
private SceneTrainerGroup onTrainerRegistration(AkkamonNexus.RequestTrainerRegistration registrationRequest) {
if (this.sceneId.equals(registrationRequest.sceneId)) {
ActorRef<Trainer.Command> trainerActor = trainerIdToActor.get(registrationRequest.trainerId);
if (trainerActor != null) {
+ // TODO add optional already registered?
registrationRequest.replyTo.tell(new AkkamonNexus.TrainerRegistered(
registrationRequest.trainerId,
registrationRequest.session
diff --git a/domain/src/main/java/akkamon/domain/TilePos.java b/domain/src/main/java/akkamon/domain/TilePos.java
new file mode 100644
index 0000000..95e3f71
--- /dev/null
+++ b/domain/src/main/java/akkamon/domain/TilePos.java
@@ -0,0 +1,10 @@
+package akkamon.domain;
+
+public class TilePos {
+ public int x;
+ public int y;
+
+ public String toString() {
+ return "tilePos={x: " + x + ", y: " + y + "}";
+ }
+}
diff --git a/domain/src/main/java/akkamon/domain/Trainer.java b/domain/src/main/java/akkamon/domain/Trainer.java
index 7f540a1..b756a97 100644
--- a/domain/src/main/java/akkamon/domain/Trainer.java
+++ b/domain/src/main/java/akkamon/domain/Trainer.java
@@ -6,6 +6,8 @@ import akka.actor.typed.javadsl.ActorContext;
import akka.actor.typed.javadsl.Behaviors;
import akka.actor.typed.javadsl.Receive;
+import java.util.Optional;
+
public class Trainer extends AbstractBehavior<Trainer.Command> {
public interface Command { }
@@ -17,6 +19,8 @@ public class Trainer extends AbstractBehavior<Trainer.Command> {
private String sceneId;
private String trainerId;
+ private Optional<TilePos> lastValidTilePos = Optional.empty();
+
public Trainer(ActorContext<Command> context, String sceneId, String trainerId) {
super(context);
this.sceneId = sceneId;
@@ -25,7 +29,35 @@ public class Trainer extends AbstractBehavior<Trainer.Command> {
@Override
public Receive<Command> createReceive() {
- return null;
+ return newReceiveBuilder()
+ .onMessage(
+ AkkamonNexus.RequestStartMoving.class,
+ this::onStartMoving
+ )
+ .onMessage(
+ AkkamonNexus.RequestStopMoving.class,
+ this::onStopMoving)
+ .onMessage(
+ AkkamonNexus.RequestNewTilePos.class,
+ this::onNewTilePos
+ )
+ .build();
+ }
+
+ private Trainer onNewTilePos(AkkamonNexus.RequestNewTilePos newTilePosRequest) {
+ getContext().getLog().info("Trainer {} has new {}.", trainerId, newTilePosRequest.tilePos);
+ lastValidTilePos = Optional.of(newTilePosRequest.tilePos);
+ return this;
+ }
+
+ private Trainer onStopMoving(AkkamonNexus.RequestStopMoving stopMovingRequest) {
+ getContext().getLog().info("Trainer {} stops to move {}.", trainerId, stopMovingRequest.direction);
+ return this;
+ }
+
+ private Trainer onStartMoving(AkkamonNexus.RequestStartMoving startMovingRequest) {
+ getContext().getLog().info("Trainer {} starts to move {}.", trainerId, startMovingRequest.direction);
+ return this;
}
}