Im Rahmen unserer DDD-Schulung besteht die Aufgabe nun darin, den Schach-Server zu implementieren. Der Server soll beliebig viele Schach-Partien parallel verarbeiten können.
Eine REST-Schnittstelle ist bereits vorhanden (package com.iks.dddschach.api). Diese leitet an die Implementierung der API-Schnittstelle SchachspielApi weiter.
Diese API-Schnittstelle ist der zentrale Zugang zur Schach-Domäne! In der Zwiebelring-Darstellung umschließt sie die von Euch zu erstellende Domäne.
In SchachspielApiImpl befinden sie einige TODOs. Hier müssen die empfangenen Parameter an die Domain-Klassen weitergeleitet und die Ergebnisse letztlich an die REST-Schnittstelle zurückgegeben werden.
Im Package com.iks.dddschach.domain befinden sich bereits einige vorgefertigte Value-Objects, die vorzugsweise (wieder-) zu verwenden sind.
- Installationen von Java 8 und Maven
- Eine IDE wie z.B. Eclipse
- Von Vorteil: Ein Tool wie Postman zum Ausführen von REST-Calls.
- Erstelle oder suche Dir ein Verzeichnis für zwei (Java-)Projekte
- Führe dort git clone https://github.com/domainevent/dddschach.git aus (alternativ das Zip auf github.com/domainevent/dddschach laden und entpacken)
- Führe dort git clone https://github.com/domainevent/chessgui.git aus (alternativ das Zip auf github.com/domainevent/chessgui laden und entpacken)
- Im Verzeichnis dddschach einmal mvn tomcat7:run ausführen
- Anschließend im Browser localhost:8080/dddschach aufrufen. Dort sollte diese Dokumentation des Projekts erscheinen. Den Server bitte laufen lassen.
- Im Verzeichnis chessgui einmal mvn compile exec:java aufrufen. Daraufhin wird ein kleine GUI erscheinen. : Einfach mal auf "Weiß klicken" und eine Spielfigur ziehen. Diese sollte sich nach 1-2 Sekunden wieder auf die Ausgangposition zurückbewegen.
Wenn dies alles funktioniert hat, bist Du gerüstet. Nun zum Importieren des Projekts in...
- Menü File → Import → Maven → Existing Maven Projects
- Über Browse ins das oben unter 1. gewählte Verzeichnis navigieren und das Projekt dddschach laden
- Menü Run → Run Configurations → Maven Build → New
- Base directory ← Workspace ← dddschach
- Bei Goals "tomcat7:run" eintragen
- Reiter Source: Add → Java Project → dddschach
- Apply und Run
- Später: Icons Debug → m2 dddschach → Coding ohne Server-Restart!
Dazu zählen Objekte
- zum Verwalten von (beliebig vielen) Schachspielen,
- zum Entgegennehmen und Überprüfen von Schach(halb)zügen,
- und zum Liefern des aktuellen Spielfeldes.
Die Aufgaben befinden sich nochmals in den JavaDoc-Kommentaren der Schnittstelle SchachspielApi.
Die Richtigkeit der Implementierung kann durch Ausführen des Tests SchachspielApiTest überprüft werden.
Der REST-Service lässt sich mit mvn tomcat7:run starten.
Unter http://localhost:8080/dddschach/doc findet Ihr eine übersichtliche Dokumentation der REST-Schnittstelle (erstellt mit Enunciate).
GET auf http://localhost:8080/dddschach/api/isalive
Erwartetes Ergebnis (exemplarisch):
DDD-Schach is alive: Sat May 27 17:34:53 CEST 2017
POST auf http://localhost:8080/dddschach/api/games/
Body (x-www-form-urlencoded):
note:Ein kleiner Vermerk zum Spiel
Erwartetes Ergebnis (exemplarisch):
{ id": "1234567" }
GET auf http://localhost:8080/dddschach/api/games/0/board
Erwartetes Ergebnis (im Fall einer ungültigen Spiel-Id, hier 0):
{ "error code": "INVALID_GAMEID", "INVALID_GAMEID": "0" }
GET auf http://localhost:8080/dddschach/api/games/1234567/board
Erwartetes Ergebnis (im Fall einer gültigen Spiel-Id):
{ "board": [ [ { "figure": "R", "color": "w" }, { "figure": "P", "color": "w" ...
POST auf http://localhost:8080/dddschach/api/games/1234567/moves
Body (x-www-form-urlencoded):
move:b1-c3
Erwartetes Ergebnis
{ "index": 1 }
Auf Github gibt es das Projekt ChessGUI zum Download. Es lässt sich starten mit mvn compile exec:java. Startet man ChessGUI zweimal, lässt sich eine Schachpartie gegeneinander spielen - natürlich erst nachdem dddschach richtig implementiert worden ist :-)
Beim Start von ChessGUI wird gefragt, ob es sich um eine neue Partie handelt oder ob man sich über die Eingabe einer Spiel-ID "paaren" möchten. Der Initiator einer neuen Partie wählt hier "Neues Spiel". Anschließend ermittelt er über den Menüpunkt Spiel -> Spiel-ID die eindeutige ID dieser Partie und teilt sie seinem Mitspieler mit. Dieser kann die ID dann bei beim Start seiner ChessGUI eingeben. Anschließend synchronisieren die beiden ChessGUIs in regelmäßigen Abständen ihre Stellungen.
Hinweis: ChessGUI verbindet sich per Default mit dem dddschach-Server unter http://localhost:8080/dddschach/api. Dies lässt sich ggf. anpassen mit mvn exec:java -Dserver=...