diff options
| author | Mike Vink <mike1994vink@gmail.com> | 2021-07-20 20:55:26 +0200 |
|---|---|---|
| committer | Mike Vink <mike1994vink@gmail.com> | 2021-07-20 20:55:26 +0200 |
| commit | b5ec13318a8b6a5f825eb726d6465873495a49ab (patch) | |
| tree | 8fd086ceaa31d0b18cab6aa3e88f2668bf922788 /domain | |
| parent | 5f016158e73a7828c9dec1810e54bbe2550d8c20 (diff) | |
feat(): figuring out movePlayerMessage
Diffstat (limited to 'domain')
9 files changed, 71 insertions, 85 deletions
diff --git a/domain/build.gradle b/domain/build.gradle index 4b7063a..efe3079 100644 --- a/domain/build.gradle +++ b/domain/build.gradle @@ -26,10 +26,6 @@ dependencies { implementation 'ch.qos.logback:logback-classic:1.2.3' implementation 'junit:junit:4.12' - // Reference the domain subproject. - implementation project(':api') - - testImplementation "com.typesafe.akka:akka-actor-testkit-typed_${versions.ScalaBinary}" testImplementation "com.typesafe.akka:akka-stream-testkit_${versions.ScalaBinary}" diff --git a/domain/src/main/java/akkamon/domain/Akkamon.java b/domain/src/main/java/akkamon/domain/Akkamon.java deleted file mode 100644 index 602a6fe..0000000 --- a/domain/src/main/java/akkamon/domain/Akkamon.java +++ /dev/null @@ -1,6 +0,0 @@ -package akkamon.domain; - -public interface Akkamon { - void newPlayerConnected(String name, String password); - void updateTrainerPosition(String name, float x, float y); -} diff --git a/domain/src/main/java/akkamon/domain/AkkamonImpl.java b/domain/src/main/java/akkamon/domain/AkkamonImpl.java deleted file mode 100644 index 534abf2..0000000 --- a/domain/src/main/java/akkamon/domain/AkkamonImpl.java +++ /dev/null @@ -1,41 +0,0 @@ -package akkamon.domain; - -import java.util.HashMap; - -public class AkkamonImpl implements Akkamon { - - private static AkkamonImpl instance; - - private static HashMap<String, Trainer> dummyTrainersCollection = new HashMap<>(); - - public static AkkamonImpl getInstance() { - if (instance == null) { - instance = new AkkamonImpl(); - } - return instance; - } - - @Override - public void newPlayerConnected(String name, String password) { - // switch (dummyTrainersCollection.size()) { - // case 0: - // dummyTrainersCollection.put("Ash", new Trainer("Ash")); - // break; - // case 1: - // dummyTrainersCollection.put("Misty", new Trainer("Misty")); - // break; - // } - } - - public void updateTrainerPosition(String name, float x, float y) { - // Trainer trainer = dummyTrainersCollection.get(name); - // trainer.newPosition(x, y); - } - - public HashMap<String, Trainer> getDummyTrainersCollection() { - return dummyTrainersCollection; - } - - - -} diff --git a/domain/src/main/java/akkamon/domain/AkkamonMessageEngine.java b/domain/src/main/java/akkamon/domain/AkkamonMessageEngine.java new file mode 100644 index 0000000..fd22ce1 --- /dev/null +++ b/domain/src/main/java/akkamon/domain/AkkamonMessageEngine.java @@ -0,0 +1,10 @@ +package akkamon.domain; + +public interface AkkamonMessageEngine { + // broadcasts position info to WebSocket Clients + void broadCastGridPosition(); + + void registerTrainerSession(String trainerId, AkkamonSession session); + + void removeTrainerSession(String trainerId, AkkamonSession session); +} diff --git a/domain/src/main/java/akkamon/domain/AkkamonNexus.java b/domain/src/main/java/akkamon/domain/AkkamonNexus.java index a64e751..acae59d 100644 --- a/domain/src/main/java/akkamon/domain/AkkamonNexus.java +++ b/domain/src/main/java/akkamon/domain/AkkamonNexus.java @@ -18,20 +18,32 @@ public class AkkamonNexus extends AbstractBehavior<AkkamonNexus.Command> { public static class RequestTrainerRegistration implements AkkamonNexus.Command, SceneTrainerGroup.Command { public String trainerId; public String sceneId; - public ActorRef<TrainerRegistered> replyTo; - - public RequestTrainerRegistration(String trainerId, String sceneId, ActorRef<TrainerRegistered> replyTo) { + public AkkamonSession session; + public ActorRef<Command> replyTo; + + public RequestTrainerRegistration( + String trainerId, + String sceneId, + AkkamonSession session, + ActorRef<Command> replyTo + ) { this.trainerId = trainerId; this.sceneId = sceneId; + this.session = session; this.replyTo = replyTo; } } - public static class TrainerRegistered { - private ActorRef<Trainer.Command> trainer; + public static class TrainerRegistered implements Command { + private String trainerId; + private AkkamonSession session; - public TrainerRegistered(ActorRef<Trainer.Command> trainer) { - this.trainer = trainer; + public TrainerRegistered( + String trainerId, + AkkamonSession session + ) { + this.trainerId = trainerId; + this.session = session; } } @@ -40,16 +52,17 @@ public class AkkamonNexus extends AbstractBehavior<AkkamonNexus.Command> { } } - - public static Behavior<AkkamonNexus.Command> create() { - return Behaviors.setup(AkkamonNexus::new); + public static Behavior<AkkamonNexus.Command> create(AkkamonMessageEngine messagingEngine) { + return Behaviors.setup(context -> new AkkamonNexus(context, messagingEngine)); } + private AkkamonMessageEngine messageEngine; private Map<String, ActorRef<SceneTrainerGroup.Command>> sceneIdToActor = new HashMap<>(); - public AkkamonNexus(ActorContext<Command> context) { + public AkkamonNexus(ActorContext<Command> context, AkkamonMessageEngine msgEngine) { super(context); - getContext().getLog().info("AkkamonNexus is spinning"); + this.messageEngine = msgEngine; + getContext().getLog().info("AkkamonNexus is up and running, waiting eagerly for your messages!"); } @Override @@ -59,13 +72,26 @@ public class AkkamonNexus extends AbstractBehavior<AkkamonNexus.Command> { RequestTrainerRegistration.class, this::onTrainerRegistration ) + .onMessage( + TrainerRegistered.class, + this::onTrainerRegistered + ) .build(); } + 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); + return this; + } + private AkkamonNexus onTrainerRegistration(RequestTrainerRegistration registrationRequest) { String sceneId = registrationRequest.sceneId; String trainerId = registrationRequest.trainerId; + getContext().getLog().info("Nexus received registration request for {} in {}", trainerId, sceneId); + ActorRef<SceneTrainerGroup.Command> sceneTrainerGroup = sceneIdToActor.get(sceneId); if (sceneTrainerGroup != null) { sceneTrainerGroup.tell(registrationRequest); diff --git a/domain/src/main/java/akkamon/domain/AkkamonSession.java b/domain/src/main/java/akkamon/domain/AkkamonSession.java new file mode 100644 index 0000000..b04aaab --- /dev/null +++ b/domain/src/main/java/akkamon/domain/AkkamonSession.java @@ -0,0 +1,5 @@ +package akkamon.domain; + +public interface AkkamonSession { + void send(String event); +} diff --git a/domain/src/main/java/akkamon/domain/SceneTrainerGroup.java b/domain/src/main/java/akkamon/domain/SceneTrainerGroup.java index fb9456a..e6bd8ce 100644 --- a/domain/src/main/java/akkamon/domain/SceneTrainerGroup.java +++ b/domain/src/main/java/akkamon/domain/SceneTrainerGroup.java @@ -54,7 +54,10 @@ public class SceneTrainerGroup extends AbstractBehavior<SceneTrainerGroup.Comman if (this.sceneId.equals(registrationRequest.sceneId)) { ActorRef<Trainer.Command> trainerActor = trainerIdToActor.get(registrationRequest.trainerId); if (trainerActor != null) { - registrationRequest.replyTo.tell(new AkkamonNexus.TrainerRegistered(trainerActor)); + registrationRequest.replyTo.tell(new AkkamonNexus.TrainerRegistered( + registrationRequest.trainerId, + registrationRequest.session + )); } else { getContext().getLog().info("Creating trainer actor for {}", registrationRequest.trainerId); trainerActor = @@ -63,7 +66,10 @@ public class SceneTrainerGroup extends AbstractBehavior<SceneTrainerGroup.Comman getContext() .watchWith(trainerActor, new SceneTrainerGroup.TrainerOffline(trainerActor, sceneId, registrationRequest.trainerId)); trainerIdToActor.put(registrationRequest.trainerId, trainerActor); - registrationRequest.replyTo.tell(new AkkamonNexus.TrainerRegistered(trainerActor)); + registrationRequest.replyTo.tell(new AkkamonNexus.TrainerRegistered( + registrationRequest.trainerId, + registrationRequest.session + )); } } else { getContext() diff --git a/domain/src/test/java/akkamon/domain/AkkamonImplTest.java b/domain/src/test/java/akkamon/domain/AkkamonImplTest.java deleted file mode 100644 index 90c4f44..0000000 --- a/domain/src/test/java/akkamon/domain/AkkamonImplTest.java +++ /dev/null @@ -1,16 +0,0 @@ -package akkamon.domain; - -import org.junit.Test; - -import static junit.framework.TestCase.assertNotNull; - -class AkkamonImplTest { - - class getInstance_behaviour { - @Test - void given_there_is_no_instance_yet_when_getInstance_is_called_then_give_class_property_instance() { - assertNotNull(AkkamonImpl.getInstance()); - } - } - -}
\ No newline at end of file diff --git a/domain/src/test/java/akkamon/domain/AkkamonNexusTest.java b/domain/src/test/java/akkamon/domain/AkkamonNexusTest.java index 5150b1c..d83bdcb 100644 --- a/domain/src/test/java/akkamon/domain/AkkamonNexusTest.java +++ b/domain/src/test/java/akkamon/domain/AkkamonNexusTest.java @@ -13,15 +13,21 @@ public class AkkamonNexusTest { @Test public void given_a_registration_request_when_no_scene_or_trainer_exists_in_the_system_then_create_scene_and_trainer_and_reply() { - TestProbe<AkkamonNexus.TrainerRegistered> probe = - testKit.createTestProbe(AkkamonNexus.TrainerRegistered.class); + TestProbe<AkkamonNexus.Command> probe = + testKit.createTestProbe(AkkamonNexus.Command.class); ActorRef<SceneTrainerGroup.Command> sceneTrainerGroupActor = testKit.spawn(SceneTrainerGroup.create("start")); - sceneTrainerGroupActor.tell(new AkkamonNexus.RequestTrainerRegistration("ash", "start", probe.getRef())); + // TODO use mockito to mock AkkamonSessions - probe.expectMessageClass(AkkamonNexus.TrainerRegistered.class); + // sceneTrainerGroupActor.tell(new AkkamonNexus.RequestTrainerRegistration( + // "ash", + // "start", + // probe.getRef() + // )); + + // probe.expectMessageClass(AkkamonNexus.TrainerRegistered.class); } |
