Vorgefertigte Klassen für einen Schach-Server im Rahmen einer DDD-Schulung
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
logs
src
.gitignore
README.md
pom.xml

README.md

DDD-Schach

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.

Technische Voraussetzungen

  • Installationen von Java 8 und Maven
  • Eine IDE wie z.B. Eclipse
  • Von Vorteil: Ein Tool wie Postman zum Ausführen von REST-Calls.

Vorbereitungen

  1. Erstelle oder suche Dir ein Verzeichnis für zwei (Java-)Projekte
  2. Führe dort git clone https://github.com/domainevent/dddschach.git aus (alternativ das Zip auf github.com/domainevent/dddschach laden und entpacken)
  3. Führe dort git clone https://github.com/domainevent/chessgui.git aus (alternativ das Zip auf github.com/domainevent/chessgui laden und entpacken)
  4. Im Verzeichnis dddschach einmal mvn tomcat7:run ausführen
  5. Anschließend im Browser localhost:8080/dddschach aufrufen. Dort sollte diese Dokumentation des Projekts erscheinen. Den Server bitte laufen lassen.
  6. 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...

Eclipse

Importieren des Projekts dddschach

  1. Menü File → Import → Maven → Existing Maven Projects
  2. Über Browse ins das oben unter 1. gewählte Verzeichnis navigieren und das Projekt dddschach laden

Starten bzw. Debuggen von dddschach

  1. Menü Run → Run Configurations → Maven Build → New
  2. Base directory ← Workspace ← dddschach
  3. Bei Goals "tomcat7:run" eintragen
  4. Reiter Source: Add → Java Project → dddschach
  5. Apply und Run
  6. Später: Icons Debug → m2 dddschach → Coding ohne Server-Restart!

Aufgabe(n)

Implementierung der Schachdomäne.

Dazu zählen Objekte

  1. zum Verwalten von (beliebig vielen) Schachspielen,
  2. zum Entgegennehmen und Überprüfen von Schach(halb)zügen,
  3. und zum Liefern des aktuellen Spielfeldes.

Die Aufgaben befinden sich nochmals in den JavaDoc-Kommentaren der Schnittstelle SchachspielApi.

Testen

Die Richtigkeit der Implementierung kann durch Ausführen des Tests SchachspielApiTest überprüft werden.

Starten der Web-Applikation

Der REST-Service lässt sich mit mvn tomcat7:run starten.

REST

Dokumentation der Schnittstelle

Unter http://localhost:8080/dddschach/doc findet Ihr eine übersichtliche Dokumentation der REST-Schnittstelle (erstellt mit Enunciate).

Is-Alive-Check

GET auf http://localhost:8080/dddschach/api/isalive
Erwartetes Ergebnis (exemplarisch):

DDD-Schach is alive: Sat May 27 17:34:53 CEST 2017

Neues Spiel

POST auf http://localhost:8080/dddschach/api/games/
Body (x-www-form-urlencoded):

note:Ein kleiner Vermerk zum Spiel

Erwartetes Ergebnis (exemplarisch):

{
    id": "1234567"
}

Abfrage des Spielbretts

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"
      ...

Ausführen eines Halbzugs

POST auf http://localhost:8080/dddschach/api/games/1234567/moves
Body (x-www-form-urlencoded):

move:b1-c3

Erwartetes Ergebnis

{
  "index": 1
}

Spielen mit ChessGUI

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 :-)

Wie paaren sich zwei Spieler?

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=...