diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 04bb8bd..c1e9f56 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -6,11 +6,13 @@ stages:
# Reusable definitions
.gradle-cache: &gradle-cache
+ variables:
+ GRADLE_USER_HOME: '$CI_PROJECT_DIR/.gradle-home'
cache:
key: '$CI_PROJECT_ID-gradle'
paths:
- .gradle/
- - ~/.gradle/caches/
+ - .gradle-home/
.on-commit: &on-commit
rules:
@@ -22,7 +24,7 @@ stages:
.on-mr: &on-mr
rules:
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
- allow_failure: true # deactivate after all issues (shown by checkstyle) have been resolved
+ allow_failure: false
# Jobs
checkstyle:
@@ -30,7 +32,7 @@ checkstyle:
stage: lint
image: gradle:9.3.1-jdk25
script:
- - gradle checkstyleMain checkstyleTest
+ - gradle checkstyleMain checkstyleTest --configuration-cache --configuration-cache-problems=warn
allow_failure: true
artifacts:
when: always
@@ -47,8 +49,8 @@ checkstyle-mr:
stage: lint
image: gradle:9.3.1-jdk25
script:
- - gradle checkstyleMain checkstyleTest
- allow_failure: true
+ - gradle checkstyleMain checkstyleTest --configuration-cache --configuration-cache-problems=warn
+ allow_failure: false
artifacts:
when: always
paths:
@@ -66,6 +68,7 @@ checkstyle-report:
- job: checkstyle-mr
artifacts: true
optional: true
+ when: always
rules:
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
script:
@@ -81,7 +84,7 @@ compile-check:
stage: build
image: gradle:9.3.1-jdk25
script:
- - gradle compileTestJava
+ - gradle compileTestJava --configuration-cache --configuration-cache-problems=warn
needs: []
rules:
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
@@ -89,12 +92,20 @@ compile-check:
- if: '$CI_COMMIT_BRANCH'
allow_failure: false
+javadoc-check:
+ <<: [*gradle-cache, *on-mr]
+ stage: build
+ image: gradle:9.3.1-jdk25
+ script:
+ - gradle javaDoc --configuration-cache --configuration-cache-problems=warn
+ needs: []
+
test:
<<: *gradle-cache
stage: test
image: gradle:9.3.1-jdk25
script:
- - gradle test
+ - gradle test --configuration-cache --configuration-cache-problems=warn
artifacts:
when: always
reports:
diff --git a/.gitlab/issue_templates/Bug Report.md b/.gitlab/issue_templates/Bug Report.md
index 2f04712..a397976 100644
--- a/.gitlab/issue_templates/Bug Report.md
+++ b/.gitlab/issue_templates/Bug Report.md
@@ -34,7 +34,7 @@
### Checklist
- [ ] I reproduced the problem using the steps above
-- [ ] I searched documentation docs for relevant information
+- [ ] I searched documentation for relevant information
- [ ] I added relevant labels
/label ~bug
diff --git a/.gitlab/issue_templates/Feature Request.md b/.gitlab/issue_templates/Feature Request.md
index 5a11cf5..ae3c136 100644
--- a/.gitlab/issue_templates/Feature Request.md
+++ b/.gitlab/issue_templates/Feature Request.md
@@ -11,8 +11,8 @@
### Checklist
-- [ ] I reproduced the problem using the steps above
-- [ ] I searched documentation docs for relevant information
+- [ ] I have described the function in detail
+- [ ] I searched docs for alternative implementations matching my needs
- [ ] I added relevant labels
/label ~enhancement
diff --git a/build.gradle b/build.gradle
index a7f3f9e..4360c82 100644
--- a/build.gradle
+++ b/build.gradle
@@ -108,3 +108,17 @@ tasks.register('fatJar', Jar) {
configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
})
}
+
+ tasks.register('javadocJar', Jar) {
+ group = 'build'
+ description = 'Assembles a Javadoc JAR.'
+ dependsOn tasks.named('javadoc')
+ archiveClassifier = 'javadoc'
+ from(tasks.javadoc.destinationDir)
+ }
+
+ tasks.register('build-cs108') {
+ group = 'build'
+ description = 'Produces executable JAR and Javadoc JAR for CS108.'
+ dependsOn tasks.named('fatJar'), tasks.named('javadocJar')
+ }
diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ClientApp.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ClientApp.java
index 7fa4291..d5e2e2a 100644
--- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ClientApp.java
+++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ClientApp.java
@@ -10,15 +10,15 @@ import org.apache.logging.log4j.Logger;
/**
* Entry point for the Casono client application. Handles client startup and connection parameters.
*
- *
Standardkonstruktor für die Anwendung.
+ *
Default constructor for the application.
*/
public class ClientApp {
private static final Logger LOGGER = LogManager.getLogger(ClientApp.class);
- /** Standardkonstruktor. */
+ /** Default constructor. */
public ClientApp() {
- // Standardkonstruktor
+ // Default constructor
}
/**
diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/Launcher.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/Launcher.java
index f4d4069..85d42df 100644
--- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/Launcher.java
+++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/Launcher.java
@@ -6,13 +6,13 @@ import javafx.application.Application;
/**
* Launcher for the Casono main UI.
*
- *
Standardkonstruktor für die Anwendung.
+ *
Default constructor for the application.
*/
public class Launcher {
- /** Standardkonstruktor. */
+ /** Default constructor. */
public Launcher() {
- // Standardkonstruktor
+ // Default constructor
}
/**
diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/chatui/ChatController.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/chatui/ChatController.java
index b6b273f..1f7abe3 100644
--- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/chatui/ChatController.java
+++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/chatui/ChatController.java
@@ -41,6 +41,11 @@ public class ChatController {
chatScrollPane.vvalueProperty().bind(chatVBox.heightProperty());
}
+ /** Standardkonstruktor. Wird von FXML verwendet. */
+ public ChatController() {
+ // default constructor for FXML
+ }
+
/**
* Diese Methode wird vom Senden-Button oder Enter ausgelöst. Sie gibt die eigene Nachricht an
* das Netzwerkprotokoll weiter.
diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/gameui/CasinoGameController.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/gameui/CasinoGameController.java
index c96c9bd..ae52485 100644
--- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/gameui/CasinoGameController.java
+++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/gameui/CasinoGameController.java
@@ -15,11 +15,22 @@ import javafx.scene.layout.VBox;
*/
public class CasinoGameController {
+ /** Standardkonstruktor. Wird von FXML verwendet. */
+ public CasinoGameController() {
+ // default constructor for FXML
+ }
+
@FXML private Label welcomeText;
@FXML private VBox casinoTable;
// TODO: Test-Logik: wird durch echte Spielinteraktionen ersetzt,
// sobald die GameEngine fertig ist
+
+ /**
+ * Temporäre Test-Methode, die bei Klick auf den Tisch eine Platzhalteraktion ausführt.
+ *
+ *
Wird in der finalen Implementierung durch die Spiel-Logik ersetzt.
+ */
@FXML
public void onTableClick() {
welcomeText.setText("Einsatz akzeptiert!");
diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/gameui/CasinoGameUI.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/gameui/CasinoGameUI.java
index f9b5419..5083ee6 100644
--- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/gameui/CasinoGameUI.java
+++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/gameui/CasinoGameUI.java
@@ -17,6 +17,11 @@ import javafx.stage.Stage;
*/
public class CasinoGameUI extends Application {
+ /** Standardkonstruktor. */
+ public CasinoGameUI() {
+ // default no-arg constructor
+ }
+
private static final int DEFAULT_WIDTH = 1200;
private static final int DEFAULT_HEIGHT = 800;
@@ -29,7 +34,7 @@ public class CasinoGameUI extends Application {
@Override
public void start(Stage stage) throws IOException {
FXMLLoader fxmlLoader =
- new FXMLLoader(CasinoGameUI.class.getResource("/ui-structure/casinogameui.fxml"));
+ new FXMLLoader(CasinoGameUI.class.getResource("/ui-structure/Casinogameui.fxml"));
Scene scene = new Scene(fxmlLoader.load(), DEFAULT_WIDTH, DEFAULT_HEIGHT);
stage.setTitle("Casono (GAME)");
diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/gameui/gameuicomponents/CasinoBrowserController.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/gameui/gameuicomponents/CasinoBrowserController.java
index e351b7a..03c4644 100644
--- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/gameui/gameuicomponents/CasinoBrowserController.java
+++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/gameui/gameuicomponents/CasinoBrowserController.java
@@ -27,6 +27,8 @@ import javafx.scene.shape.Rectangle;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javafx.stage.Stage;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
/**
* Experimenteller integrierter Browser für Casono.
@@ -50,13 +52,17 @@ import javafx.stage.Stage;
*/
public class CasinoBrowserController {
+ /** Standardkonstruktor. Initialisiert den CasinoBrowserController. */
+ public CasinoBrowserController() {
+ // Intentionally left blank; controller initialization is FXML-driven.
+ }
+
private static final Set TRUSTED_DOMAINS = new HashSet<>();
private static final CookieManager COOKIE_MANAGER =
new CookieManager(null, CookiePolicy.ACCEPT_ORIGINAL_SERVER);
- private static final org.apache.logging.log4j.Logger LOGGER =
- org.apache.logging.log4j.LogManager.getLogger(CasinoBrowserController.class);
+ private static final Logger LOGGER = LogManager.getLogger(CasinoBrowserController.class);
private static final int LOGO_HEIGHT = 40;
private static final int CORNER_RADIUS = 40;
@@ -354,8 +360,9 @@ public class CasinoBrowserController {
fwdBtn.getStyleClass().add("gray-button");
fwdBtn.setOnAction(
e -> {
- if (engine.getHistory().getCurrentIndex()
- < engine.getHistory().getEntries().size() - 1) {
+ int currentIndex = engine.getHistory().getCurrentIndex();
+ int lastIndex = engine.getHistory().getEntries().size() - 1;
+ if (currentIndex < lastIndex) {
engine.getHistory().go(1);
}
});
@@ -423,7 +430,7 @@ public class CasinoBrowserController {
Scene scene = new Scene(root, WINDOW_WIDTH, WINDOW_HEIGHT);
- var css = CasinoBrowserController.class.getResource("/ui-structure/casinogameui.css");
+ var css = CasinoBrowserController.class.getResource("/ui-structure/Casinogameui.css");
if (css != null) {
scene.getStylesheets().add(css.toExternalForm());
@@ -512,10 +519,11 @@ public class CasinoBrowserController {
alert.setTitle("Unbekannte Website");
alert.setHeaderText("Diese Website ist nicht bekannt");
- alert.setContentText(
+ String content =
host
- + "\n\nDiese Seite ist nicht vom "
- + "Casono Browser verifiziert.\nMöchten Sie sie trotzdem öffnen?");
+ + "\n\nDiese Seite ist nicht vom Casono Browser verifiziert.\n"
+ + "Möchten Sie sie trotzdem öffnen?";
+ alert.setContentText(content);
var stream = CasinoBrowserController.class.getResourceAsStream(LOGO_PATH);
Image logo = new Image(stream);
diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/gameui/gameuicomponents/TaskbarController.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/gameui/gameuicomponents/TaskbarController.java
index 33e1e32..b446f3a 100644
--- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/gameui/gameuicomponents/TaskbarController.java
+++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/gameui/gameuicomponents/TaskbarController.java
@@ -1,12 +1,14 @@
package ch.unibas.dmi.dbis.cs108.casono.client.ui.gameui.gameuicomponents;
-import javafx.application.Platform;
+import ch.unibas.dmi.dbis.cs108.casono.client.ui.lobbyui.Casinomainui;
import javafx.fxml.FXML;
import javafx.scene.control.TextField;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.HBox;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
/**
* Controller für die interaktive Taskleiste innerhalb der Poker-UI.
@@ -16,8 +18,12 @@ import javafx.scene.layout.HBox;
*/
public class TaskbarController {
- private static final org.apache.logging.log4j.Logger LOGGER =
- org.apache.logging.log4j.LogManager.getLogger(CasinoBrowserController.class);
+ /** Standardkonstruktor. Wird von FXML verwendet. */
+ public TaskbarController() {
+ // default constructor for FXML
+ }
+
+ private static final Logger LOGGER = LogManager.getLogger(CasinoBrowserController.class);
@FXML private HBox taskbar;
@FXML private TextField taskbarInput;
@@ -92,15 +98,21 @@ public class TaskbarController {
processBet();
}
- /**
- * Wird aufgerufen, wenn der Exit-Button in der Taskleiste gedrückt wird.
- *
- *
TODO: Logik implementieren, um zur Lobby zurückzukehren, ohne die gesamte Anwendung zu
- * schließen (kein System.exit/Platform.exit).
- */
@FXML
private void onExitButtonClick() {
- Platform.exit();
+ javafx.application.Platform.runLater(
+ () -> {
+ // Close game stage
+ javafx.stage.Stage currentStage =
+ (javafx.stage.Stage) taskbar.getScene().getWindow();
+ currentStage.close();
+ // Lobby-UI starten
+ try {
+ new Casinomainui().start(new javafx.stage.Stage());
+ } catch (Exception e) {
+ LOGGER.error("Fehler beim Starten der Lobby-UI: {}", e.getMessage());
+ }
+ });
}
/**
diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/lobbyui/Casinomainui.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/lobbyui/Casinomainui.java
index 959c8d3..0088781 100644
--- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/lobbyui/Casinomainui.java
+++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/lobbyui/Casinomainui.java
@@ -10,13 +10,13 @@ import javafx.stage.Stage;
/**
* JavaFX Application class for the Casono main UI.
*
- *
Standardkonstruktor für die Anwendung.
+ *
Default constructor for the application.
*/
public class Casinomainui extends Application {
- /** Standardkonstruktor. */
+ /** Default constructor. */
public Casinomainui() {
- // Standardkonstruktor
+ // Default constructor
}
private static final int SCENE_WIDTH = 1200;
diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/lobbyui/CasinomainuiController.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/lobbyui/CasinomainuiController.java
index 56fe07e..c82a381 100644
--- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/lobbyui/CasinomainuiController.java
+++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/lobbyui/CasinomainuiController.java
@@ -28,6 +28,7 @@ public class CasinomainuiController {
private LobbyButtonGridManager gridManager;
private int nextButtonId = 1;
+ /** Default constructor for dependency injection by FXMLLoader. */
public CasinomainuiController() {
// Default constructor
}
@@ -39,7 +40,7 @@ public class CasinomainuiController {
subtitleLabel.setText("Texas Hold'em Poker");
logoView.setImage(new Image(getClass().getResource("/images/logo.png").toExternalForm()));
- translationManager = new LobbyButtonTranslationManager();
+ translationManager = LobbyButtonTranslationManager.getInstance();
gridManager =
new LobbyButtonGridManager(new javafx.scene.layout.GridPane(), translationManager);
casinoTable.getChildren().clear();
@@ -57,7 +58,7 @@ public class CasinomainuiController {
@FXML
public void handleCreateLobbyButton() {
if (translationManager.isFull()) {
- LOGGER.warn("Grid voll! Keine weiteren Lobbys moeglich.");
+ LOGGER.warn("Grid is full! No more lobbies available.");
return;
}
int buttonId = nextButtonId++;
@@ -67,7 +68,7 @@ public class CasinomainuiController {
LOGGER.info("ButtonID: {}, LobbyID: {}", buttonId, lobbyId);
gridManager.renderLobbyButtons();
} catch (Exception e) {
- LOGGER.error("Fehler beim Hinzufügen: {}", e.getMessage());
+ LOGGER.error("Error while adding lobby button: {}", e.getMessage());
}
}
}
diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/lobbyui/LobbyButtonGridManager.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/lobbyui/LobbyButtonGridManager.java
index 03259a7..3f75b0f 100644
--- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/lobbyui/LobbyButtonGridManager.java
+++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/lobbyui/LobbyButtonGridManager.java
@@ -17,6 +17,8 @@ import org.apache.logging.log4j.Logger;
* ButtonID to LobbyID.
*/
public class LobbyButtonGridManager {
+ private static final double BUTTON_WIDTH_MARGIN = 20.0;
+ private static final double BUTTON_MIN_SIZE = 10.0;
private static final Logger LOGGER = LogManager.getLogger(LobbyButtonGridManager.class);
/** GridPane for the button grid. */
@@ -46,7 +48,8 @@ public class LobbyButtonGridManager {
public LobbyButtonGridManager(
GridPane gridPane, LobbyButtonTranslationManager translationManager) {
this.gridPane = gridPane;
- this.translationManager = translationManager;
+ // Singleton immer verwenden
+ this.translationManager = LobbyButtonTranslationManager.getInstance();
}
/**
@@ -65,8 +68,21 @@ public class LobbyButtonGridManager {
int buttonId = entry.getKey();
Button btn = new Button();
btn.setId("lobbyBtn-" + buttonId);
- btn.setGraphic(
- new ImageView(new Image(getClass().getResourceAsStream(BUTTON_IMAGE_PATH))));
+ ImageView imageView =
+ new ImageView(new Image(getClass().getResourceAsStream(BUTTON_IMAGE_PATH)));
+ imageView.setPreserveRatio(true);
+ // Dynamische Breite: Bindung an die Zellengröße
+ imageView
+ .fitWidthProperty()
+ .bind(gridPane.widthProperty().divide(COLS).subtract(BUTTON_WIDTH_MARGIN));
+ imageView.setSmooth(true);
+ btn.setGraphic(imageView);
+ btn.setMaxWidth(Double.MAX_VALUE);
+ btn.setMaxHeight(Double.MAX_VALUE);
+ btn.setMinWidth(BUTTON_MIN_SIZE);
+ btn.setMinHeight(BUTTON_MIN_SIZE);
+ GridPane.setHgrow(btn, javafx.scene.layout.Priority.ALWAYS);
+ GridPane.setVgrow(btn, javafx.scene.layout.Priority.ALWAYS);
btn.setOnAction(
e -> {
Integer lobbyId = translationManager.getLobbyIdForButton(buttonId);
@@ -99,8 +115,22 @@ public class LobbyButtonGridManager {
* @param lobbyId The lobbyId to join
*/
public void joinLobby(int lobbyId) {
- // TODO: Replace with actual join logic
+ // Game-UI starten und Lobby-UI schließen
LOGGER.info("Joining lobby: {}", lobbyId);
+ javafx.application.Platform.runLater(
+ () -> {
+ // Lobby-Stage schließen
+ javafx.stage.Stage currentStage =
+ (javafx.stage.Stage) gridPane.getScene().getWindow();
+ currentStage.close();
+ // Game-UI starten
+ try {
+ new ch.unibas.dmi.dbis.cs108.casono.client.ui.gameui.CasinoGameUI()
+ .start(new javafx.stage.Stage());
+ } catch (Exception e) {
+ LOGGER.error("Fehler beim Starten der Game-UI: {}", e.getMessage());
+ }
+ });
}
/**
diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/lobbyui/LobbyButtonTranslationManager.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/lobbyui/LobbyButtonTranslationManager.java
index 19af19e..967fe83 100644
--- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/lobbyui/LobbyButtonTranslationManager.java
+++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/lobbyui/LobbyButtonTranslationManager.java
@@ -4,36 +4,53 @@ import java.util.HashMap;
import java.util.Map;
/**
- * Verwaltet das Mapping zwischen Button-IDs und Lobby-IDs rein im Speicher. Keine Dateioperationen,
- * nur Laufzeitdatenstruktur.
+ * Manages the mapping between Button IDs and Lobby IDs in memory only. No file operations,
+ * runtime-only data structure.
*/
public class LobbyButtonTranslationManager {
- /** Maximale Anzahl an Buttons/Lobbys */
+
+ // Singleton instance
+ private static LobbyButtonTranslationManager instance;
+
+ // Singleton access
+ /**
+ * Returns the singleton instance of the manager.
+ *
+ * @return the single instance of {@code LobbyButtonTranslationManager}
+ */
+ public static LobbyButtonTranslationManager getInstance() {
+ if (instance == null) {
+ instance = new LobbyButtonTranslationManager();
+ }
+ return instance;
+ }
+
+ /** Maximum number of buttons/lobbies */
private static final int MAX_BUTTONS = 8;
- /** Zuordnung ButtonID → LobbyID */
+ /** Mapping ButtonID → LobbyID */
private final Map buttonIdToLobbyId = new HashMap<>();
- /** Konstruktor: initialisiert die Zuordnung leer. */
- public LobbyButtonTranslationManager() {
- // Zuordnung bleibt leer beim Start
+ /** Private constructor for the singleton pattern */
+ private LobbyButtonTranslationManager() {
+ // Mapping is empty at startup
}
/**
- * Prüft, ob das Grid voll ist (MAX_BUTTONS erreicht).
+ * Checks whether the grid is full (MAX_BUTTONS reached).
*
- * @return true, wenn Grid voll; sonst false
+ * @return true if the grid is full; otherwise false
*/
public boolean isFull() {
return buttonIdToLobbyId.size() >= MAX_BUTTONS;
}
/**
- * Fügt eine Zuordnung ButtonID → LobbyID hinzu.
+ * Adds a mapping ButtonID → LobbyID.
*
- * @param buttonId Die ID des Buttons
- * @param lobbyId Die ID der Lobby
- * @throws Exception wenn das Grid voll ist
+ * @param buttonId the ID of the button
+ * @param lobbyId the ID of the lobby
+ * @throws Exception when the grid is full
*/
public void addLobbyButton(int buttonId, int lobbyId) throws Exception {
if (isFull()) {
@@ -43,28 +60,28 @@ public class LobbyButtonTranslationManager {
}
/**
- * Entfernt eine Zuordnung für die gegebene ButtonID.
+ * Removes the mapping for the given ButtonID.
*
- * @param buttonId Die ID des zu entfernenden Buttons
+ * @param buttonId the ID of the button to remove
*/
public void removeLobbyButton(int buttonId) {
buttonIdToLobbyId.remove(buttonId);
}
/**
- * Gibt die LobbyID für eine gegebene ButtonID zurück.
+ * Returns the LobbyID for a given ButtonID.
*
- * @param buttonId Die ButtonID
- * @return Die zugehoerige LobbyID oder null, falls nicht vorhanden
+ * @param buttonId the ButtonID
+ * @return the associated LobbyID or null if not present
*/
public Integer getLobbyIdForButton(int buttonId) {
return buttonIdToLobbyId.get(buttonId);
}
/**
- * Gibt die gesamte Zuordnung ButtonID → LobbyID zurück.
+ * Returns the full mapping ButtonID → LobbyID.
*
- * @return Map aller Zuordnungen
+ * @return Map of all mappings
*/
public Map getButtonIdToLobbyId() {
return buttonIdToLobbyId;
diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/ServerApp.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/ServerApp.java
index 2391450..5687b5b 100644
--- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/ServerApp.java
+++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/ServerApp.java
@@ -3,10 +3,11 @@ package ch.unibas.dmi.dbis.cs108.casono.server;
import ch.unibas.dmi.dbis.cs108.casono.server.domain.user.UserCleanupJob;
import ch.unibas.dmi.dbis.cs108.casono.server.domain.user.UserRegistry;
import ch.unibas.dmi.dbis.cs108.casono.server.network.NetworkManager;
-import ch.unibas.dmi.dbis.cs108.casono.server.network.command.CommandRouter;
+import ch.unibas.dmi.dbis.cs108.casono.server.network.command.execution.CommandRouter;
+import ch.unibas.dmi.dbis.cs108.casono.server.network.command.parsing.CommandParserDispatcher;
import ch.unibas.dmi.dbis.cs108.casono.server.network.events.DisconnectEvent;
import ch.unibas.dmi.dbis.cs108.casono.server.network.events.EventBus;
-import ch.unibas.dmi.dbis.cs108.casono.server.network.parser.CommandParserDispatcher;
+import ch.unibas.dmi.dbis.cs108.casono.server.network.sessions.SessionDisconnectJob;
import ch.unibas.dmi.dbis.cs108.casono.server.network.sessions.SessionManager;
import java.time.Duration;
import java.util.concurrent.Executors;
@@ -17,9 +18,12 @@ import org.apache.logging.log4j.Logger;
/** Application class for starting the server. */
public class ServerApp {
- public static final int USER_CLEANUP_JOB_DELAY = 0;
- public static final int USER_CLEANUP_JOB_PERIOD = 10;
- public static final int USER_CLEANUP_JOB_RECONNECT_THRESHOLD = 10;
+ private static final int USER_CLEANUP_JOB_DELAY = 0;
+ private static final int USER_CLEANUP_JOB_PERIOD = 10;
+ private static final int USER_CLEANUP_JOB_RECONNECT_THRESHOLD = 10;
+ private static final int SESSION_DISCONNECT_JOB_DELAY = 0;
+ private static final int SESSION_DISCONNECT_JOB_PERIOD = 2;
+ private static final int SESSION_DISCONNECT_JOB_TIMEOUT = 5;
public static void start(String arg) {
int port = Integer.parseInt(arg);
@@ -45,6 +49,14 @@ public class ServerApp {
USER_CLEANUP_JOB_DELAY,
USER_CLEANUP_JOB_PERIOD,
TimeUnit.SECONDS);
+ scheduler.scheduleAtFixedRate(
+ new SessionDisconnectJob(
+ sessionManager,
+ eventBus,
+ Duration.ofSeconds(SESSION_DISCONNECT_JOB_TIMEOUT)),
+ SESSION_DISCONNECT_JOB_DELAY,
+ SESSION_DISCONNECT_JOB_PERIOD,
+ TimeUnit.SECONDS);
networkManager.start();
}
diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/domain/user/UserRegistry.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/domain/user/UserRegistry.java
index 6a60877..adb1abe 100644
--- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/domain/user/UserRegistry.java
+++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/domain/user/UserRegistry.java
@@ -58,7 +58,6 @@ public class UserRegistry {
*
* @param sessionId the session ID of the disconnected client
*/
- // TODO: Add to EventRegistry with DisconnectEvent
public synchronized void onDisconnect(SessionId sessionId) {
User user = bySessionId.remove(sessionId);
if (user == null) {
diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/command/CommandHandler.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/command/CommandHandler.java
deleted file mode 100644
index 34228c7..0000000
--- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/command/CommandHandler.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package ch.unibas.dmi.dbis.cs108.casono.server.network.command;
-
-import ch.unibas.dmi.dbis.cs108.casono.server.network.parser.Request;
-
-public interface CommandHandler {
- void execute(T request);
-}
diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/command/execution/CommandHandler.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/command/execution/CommandHandler.java
new file mode 100644
index 0000000..0fdae3c
--- /dev/null
+++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/command/execution/CommandHandler.java
@@ -0,0 +1,7 @@
+package ch.unibas.dmi.dbis.cs108.casono.server.network.command.execution;
+
+import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.request.Request;
+
+public interface CommandHandler {
+ void execute(T request);
+}
diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/command/CommandRouter.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/command/execution/CommandRouter.java
similarity index 85%
rename from src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/command/CommandRouter.java
rename to src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/command/execution/CommandRouter.java
index 0badeff..269c6a4 100644
--- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/command/CommandRouter.java
+++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/command/execution/CommandRouter.java
@@ -1,6 +1,6 @@
-package ch.unibas.dmi.dbis.cs108.casono.server.network.command;
+package ch.unibas.dmi.dbis.cs108.casono.server.network.command.execution;
-import ch.unibas.dmi.dbis.cs108.casono.server.network.parser.Request;
+import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.request.Request;
import java.util.HashMap;
import java.util.Map;
diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/command/UnknownRequestException.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/command/execution/UnknownRequestException.java
similarity index 81%
rename from src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/command/UnknownRequestException.java
rename to src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/command/execution/UnknownRequestException.java
index 60c7fa3..1493f25 100644
--- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/command/UnknownRequestException.java
+++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/command/execution/UnknownRequestException.java
@@ -1,4 +1,4 @@
-package ch.unibas.dmi.dbis.cs108.casono.server.network.command;
+package ch.unibas.dmi.dbis.cs108.casono.server.network.command.execution;
public class UnknownRequestException extends RuntimeException {
private final String requestName;
diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/command/parsing/CommandParser.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/command/parsing/CommandParser.java
new file mode 100644
index 0000000..7a777e3
--- /dev/null
+++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/command/parsing/CommandParser.java
@@ -0,0 +1,18 @@
+package ch.unibas.dmi.dbis.cs108.casono.server.network.command.parsing;
+
+import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.request.PrimitiveRequest;
+import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.request.Request;
+
+/**
+ * Parser to convert the PrimitiveRequest to a Request and performing checks for required fields and
+ * data types
+ */
+public interface CommandParser {
+ /**
+ * Parses the provided PrimitiveRequest into a command-specific request
+ *
+ * @param primitiveRequest
+ * @return
+ */
+ T parse(PrimitiveRequest primitiveRequest);
+}
diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/parser/CommandParserDispatcher.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/command/parsing/CommandParserDispatcher.java
similarity index 80%
rename from src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/parser/CommandParserDispatcher.java
rename to src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/command/parsing/CommandParserDispatcher.java
index 722815c..02480ac 100644
--- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/parser/CommandParserDispatcher.java
+++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/command/parsing/CommandParserDispatcher.java
@@ -1,5 +1,7 @@
-package ch.unibas.dmi.dbis.cs108.casono.server.network.parser;
+package ch.unibas.dmi.dbis.cs108.casono.server.network.command.parsing;
+import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.request.PrimitiveRequest;
+import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.request.Request;
import java.util.HashMap;
import java.util.Map;
diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/command/parsing/RequestParameter.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/command/parsing/RequestParameter.java
new file mode 100644
index 0000000..d0ca720
--- /dev/null
+++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/command/parsing/RequestParameter.java
@@ -0,0 +1,4 @@
+package ch.unibas.dmi.dbis.cs108.casono.server.network.command.parsing;
+
+/** Used in the PrimitiveRequest class to store the key of a parameter with its respective value */
+public record RequestParameter(String key, String value) {}
diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/parser/UnknownCommandException.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/command/parsing/UnknownCommandException.java
similarity index 78%
rename from src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/parser/UnknownCommandException.java
rename to src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/command/parsing/UnknownCommandException.java
index 5048d70..0b5759b 100644
--- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/parser/UnknownCommandException.java
+++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/command/parsing/UnknownCommandException.java
@@ -1,4 +1,4 @@
-package ch.unibas.dmi.dbis.cs108.casono.server.network.parser;
+package ch.unibas.dmi.dbis.cs108.casono.server.network.command.parsing;
/**
* Exception thrown when the CommandParserDispatcher has no registered handler for the provided
diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/parser/CommandParser.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/parser/CommandParser.java
deleted file mode 100644
index ae00bca..0000000
--- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/parser/CommandParser.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package ch.unibas.dmi.dbis.cs108.casono.server.network.parser;
-
-/**
- * Parser to convert the PrimitiveRequest to a Request and performing checks for required fields and
- * data types
- */
-public interface CommandParser {
- /**
- * Parses the provided PrimitiveRequest into a command-specific request
- *
- * @param primitiveRequest
- * @return
- */
- Request parse(PrimitiveRequest primitiveRequest);
-}
diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/parser/Parameter.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/parser/Parameter.java
deleted file mode 100644
index fb35343..0000000
--- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/parser/Parameter.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package ch.unibas.dmi.dbis.cs108.casono.server.network.parser;
-
-/** Used in the PrimitiveRequest class to store the key of a parameter with its respective value */
-public record Parameter(String key, String value) {}
diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/parser/PrimitiveRequest.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/parser/PrimitiveRequest.java
deleted file mode 100644
index 4135e47..0000000
--- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/parser/PrimitiveRequest.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package ch.unibas.dmi.dbis.cs108.casono.server.network.parser;
-
-import java.util.List;
-
-/** Created by the ProtocolParser to allow easy access to the request contents */
-public record PrimitiveRequest(
- RequestContext context, String command, List parameters) {}
diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/parser/RawRequest.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/parser/RawRequest.java
deleted file mode 100644
index fbbc0e5..0000000
--- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/parser/RawRequest.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package ch.unibas.dmi.dbis.cs108.casono.server.network.parser;
-
-import java.util.List;
-
-public record RawRequest(String command, List parameters) {}
diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/parser/ProtocolParser.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/parser/ProtocolParser.java
similarity index 72%
rename from src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/parser/ProtocolParser.java
rename to src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/parser/ProtocolParser.java
index 8f8b4d4..569fa32 100644
--- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/parser/ProtocolParser.java
+++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/parser/ProtocolParser.java
@@ -1,10 +1,12 @@
-package ch.unibas.dmi.dbis.cs108.casono.server.network.parser;
+package ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.parser;
-import ch.unibas.dmi.dbis.cs108.casono.server.tokenizer.RawToken;
-import ch.unibas.dmi.dbis.cs108.casono.server.tokenizer.Token;
-import ch.unibas.dmi.dbis.cs108.casono.server.tokenizer.TokenClassifier;
-import ch.unibas.dmi.dbis.cs108.casono.server.tokenizer.TokenType;
-import ch.unibas.dmi.dbis.cs108.casono.server.tokenizer.Tokenizer;
+import ch.unibas.dmi.dbis.cs108.casono.server.network.command.parsing.RequestParameter;
+import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.parser.tokenizer.RawToken;
+import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.parser.tokenizer.Token;
+import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.parser.tokenizer.TokenClassifier;
+import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.parser.tokenizer.TokenType;
+import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.parser.tokenizer.Tokenizer;
+import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.request.RawRequest;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
@@ -15,7 +17,7 @@ public class ProtocolParser {
/**
* Parses the payload of the provided RawPacket
*
- * @param packet the RawPacket containing the recieved data
+ * @param payload the payload to parse and check for syntax
* @return created PrimitiveRequest
*/
public static RawRequest parse(String payload) {
@@ -24,7 +26,7 @@ public class ProtocolParser {
Iterator iterator = tokens.iterator();
String command = readCommand(iterator);
- List parameters = readParameters(iterator);
+ List parameters = readParameters(iterator);
return new RawRequest(command, parameters);
}
@@ -50,8 +52,8 @@ public class ProtocolParser {
* @param iterator
* @return list containing all parsed parameters
*/
- private static List readParameters(Iterator iterator) {
- List parameters = new ArrayList<>();
+ private static List readParameters(Iterator iterator) {
+ List parameters = new ArrayList<>();
try {
while (iterator.hasNext()) {
@@ -65,7 +67,7 @@ public class ProtocolParser {
readSeperator(iterator.next());
String value = readValue(iterator.next());
- parameters.add(new Parameter(key, value));
+ parameters.add(new RequestParameter(key, value));
}
} catch (NoSuchElementException e) {
throw new ProtocolParserException("Ran out of tokens while reading parameter");
diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/parser/ProtocolParserException.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/parser/ProtocolParserException.java
similarity index 67%
rename from src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/parser/ProtocolParserException.java
rename to src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/parser/ProtocolParserException.java
index e00e960..63e57a9 100644
--- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/parser/ProtocolParserException.java
+++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/parser/ProtocolParserException.java
@@ -1,4 +1,4 @@
-package ch.unibas.dmi.dbis.cs108.casono.server.network.parser;
+package ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.parser;
public class ProtocolParserException extends RuntimeException {
public ProtocolParserException(String message) {
diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/tokenizer/RawToken.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/parser/tokenizer/RawToken.java
similarity index 63%
rename from src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/tokenizer/RawToken.java
rename to src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/parser/tokenizer/RawToken.java
index c8bc6bb..1a07f35 100644
--- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/tokenizer/RawToken.java
+++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/parser/tokenizer/RawToken.java
@@ -1,4 +1,4 @@
-package ch.unibas.dmi.dbis.cs108.casono.server.tokenizer;
+package ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.parser.tokenizer;
/** Represents a raw (unclassified) token in the tokenizer. */
public record RawToken(RawTokenType type, String value, int line, int column) {}
diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/tokenizer/RawTokenType.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/parser/tokenizer/RawTokenType.java
similarity index 51%
rename from src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/tokenizer/RawTokenType.java
rename to src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/parser/tokenizer/RawTokenType.java
index b37d430..15949a3 100644
--- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/tokenizer/RawTokenType.java
+++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/parser/tokenizer/RawTokenType.java
@@ -1,4 +1,4 @@
-package ch.unibas.dmi.dbis.cs108.casono.server.tokenizer;
+package ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.parser.tokenizer;
public enum RawTokenType {
WORD,
diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/tokenizer/State.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/parser/tokenizer/State.java
similarity index 89%
rename from src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/tokenizer/State.java
rename to src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/parser/tokenizer/State.java
index d130a52..2848d99 100644
--- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/tokenizer/State.java
+++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/parser/tokenizer/State.java
@@ -1,4 +1,4 @@
-package ch.unibas.dmi.dbis.cs108.casono.server.tokenizer;
+package ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.parser.tokenizer;
import java.util.ArrayList;
import java.util.List;
diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/tokenizer/Token.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/parser/tokenizer/Token.java
similarity index 59%
rename from src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/tokenizer/Token.java
rename to src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/parser/tokenizer/Token.java
index 93b9026..c99d3cd 100644
--- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/tokenizer/Token.java
+++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/parser/tokenizer/Token.java
@@ -1,4 +1,4 @@
-package ch.unibas.dmi.dbis.cs108.casono.server.tokenizer;
+package ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.parser.tokenizer;
/** Represents a token in the tokenizer. */
public record Token(TokenType type, String value, int line, int column) {}
diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/tokenizer/TokenClassifier.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/parser/tokenizer/TokenClassifier.java
similarity index 97%
rename from src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/tokenizer/TokenClassifier.java
rename to src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/parser/tokenizer/TokenClassifier.java
index cb19021..330dcbb 100644
--- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/tokenizer/TokenClassifier.java
+++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/parser/tokenizer/TokenClassifier.java
@@ -1,4 +1,4 @@
-package ch.unibas.dmi.dbis.cs108.casono.server.tokenizer;
+package ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.parser.tokenizer;
import java.util.ArrayList;
import java.util.List;
diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/tokenizer/TokenType.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/parser/tokenizer/TokenType.java
similarity index 63%
rename from src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/tokenizer/TokenType.java
rename to src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/parser/tokenizer/TokenType.java
index af52b02..5096da9 100644
--- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/tokenizer/TokenType.java
+++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/parser/tokenizer/TokenType.java
@@ -1,4 +1,4 @@
-package ch.unibas.dmi.dbis.cs108.casono.server.tokenizer;
+package ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.parser.tokenizer;
/** Enumeration of token types used in the tokenizer. */
public enum TokenType {
diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/tokenizer/Tokenizer.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/parser/tokenizer/Tokenizer.java
similarity index 98%
rename from src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/tokenizer/Tokenizer.java
rename to src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/parser/tokenizer/Tokenizer.java
index 805d05b..843edf9 100644
--- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/tokenizer/Tokenizer.java
+++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/parser/tokenizer/Tokenizer.java
@@ -1,4 +1,4 @@
-package ch.unibas.dmi.dbis.cs108.casono.server.tokenizer;
+package ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.parser.tokenizer;
import java.util.List;
diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/tokenizer/TokenizerException.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/parser/tokenizer/TokenizerException.java
similarity index 84%
rename from src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/tokenizer/TokenizerException.java
rename to src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/parser/tokenizer/TokenizerException.java
index 0975b1d..c514a1e 100644
--- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/tokenizer/TokenizerException.java
+++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/parser/tokenizer/TokenizerException.java
@@ -1,4 +1,4 @@
-package ch.unibas.dmi.dbis.cs108.casono.server.tokenizer;
+package ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.parser.tokenizer;
/** Exception thrown during tokenization. */
public class TokenizerException extends RuntimeException {
diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/request/PrimitiveRequest.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/request/PrimitiveRequest.java
new file mode 100644
index 0000000..e591a2f
--- /dev/null
+++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/request/PrimitiveRequest.java
@@ -0,0 +1,8 @@
+package ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.request;
+
+import ch.unibas.dmi.dbis.cs108.casono.server.network.command.parsing.RequestParameter;
+import java.util.List;
+
+/** Created by the ProtocolParser to allow easy access to the request contents */
+public record PrimitiveRequest(
+ RequestContext context, String command, List parameters) {}
diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/request/RawRequest.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/request/RawRequest.java
new file mode 100644
index 0000000..f5033a3
--- /dev/null
+++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/request/RawRequest.java
@@ -0,0 +1,6 @@
+package ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.request;
+
+import ch.unibas.dmi.dbis.cs108.casono.server.network.command.parsing.RequestParameter;
+import java.util.List;
+
+public record RawRequest(String command, List parameters) {}
diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/parser/Request.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/request/Request.java
similarity index 87%
rename from src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/parser/Request.java
rename to src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/request/Request.java
index 8b3d70f..1e618ad 100644
--- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/parser/Request.java
+++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/request/Request.java
@@ -1,4 +1,4 @@
-package ch.unibas.dmi.dbis.cs108.casono.server.network.parser;
+package ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.request;
import ch.unibas.dmi.dbis.cs108.casono.server.network.sessions.SessionId;
diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/parser/RequestContext.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/request/RequestContext.java
similarity index 86%
rename from src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/parser/RequestContext.java
rename to src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/request/RequestContext.java
index 6881885..63816f6 100644
--- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/parser/RequestContext.java
+++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/request/RequestContext.java
@@ -1,4 +1,4 @@
-package ch.unibas.dmi.dbis.cs108.casono.server.network.parser;
+package ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.request;
import ch.unibas.dmi.dbis.cs108.casono.server.network.sessions.SessionId;
diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/request/accessor/MissingParameterException.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/request/accessor/MissingParameterException.java
new file mode 100644
index 0000000..bda6e7e
--- /dev/null
+++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/request/accessor/MissingParameterException.java
@@ -0,0 +1,26 @@
+package ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.request.accessor;
+
+/** Exception thrown when a required parameter key is not found. */
+public class MissingParameterException extends RuntimeException {
+ private final String parameterKey;
+
+ /**
+ * Creates a new exception for a missing required parameter.
+ *
+ * @param message human-readable description of the missing parameter
+ * @param parameterKey key of the parameter that could not be found
+ */
+ public MissingParameterException(String message, String parameterKey) {
+ super(message);
+ this.parameterKey = parameterKey;
+ }
+
+ /**
+ * Returns the missing parameter key.
+ *
+ * @return key of the parameter that could not be found
+ */
+ public String getParameterKey() {
+ return parameterKey;
+ }
+}
diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/request/accessor/ParameterParseException.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/request/accessor/ParameterParseException.java
new file mode 100644
index 0000000..e6f9f1f
--- /dev/null
+++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/request/accessor/ParameterParseException.java
@@ -0,0 +1,27 @@
+package ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.request.accessor;
+
+/** Exception thrown when a parameter value cannot be converted to the requested type. */
+public class ParameterParseException extends RuntimeException {
+ private final String parameterKey;
+
+ /**
+ * Creates a new parse exception with a root cause.
+ *
+ * @param message human-readable description of the parsing failure
+ * @param parameterKey key for whose value the error occured
+ * @param cause original exception thrown during parsing
+ */
+ public ParameterParseException(String message, String parameterKey, Throwable cause) {
+ super(message, cause);
+ this.parameterKey = parameterKey;
+ }
+
+ /**
+ * Returns the missing parameter key.
+ *
+ * @return key for whose value the error occured
+ */
+ public String getParameterKey() {
+ return parameterKey;
+ }
+}
diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/request/accessor/RequestParameterAccessor.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/request/accessor/RequestParameterAccessor.java
new file mode 100644
index 0000000..04071e3
--- /dev/null
+++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/request/accessor/RequestParameterAccessor.java
@@ -0,0 +1,116 @@
+package ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.request.accessor;
+
+import ch.unibas.dmi.dbis.cs108.casono.server.network.command.parsing.RequestParameter;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * Provides typed access to a request's parameters by indexing them by key.
+ *
+ *
Supports required and optional lookups, with optional conversion from {@link String} values to
+ * domain-specific types via parser functions.
+ */
+public class RequestParameterAccessor {
+ private final Map index;
+
+ /**
+ * Creates an accessor
+ *
+ * @param parameters to use
+ */
+ public RequestParameterAccessor(List parameters) {
+ this.index =
+ parameters.stream()
+ .collect(
+ Collectors.toUnmodifiableMap(
+ RequestParameter::key, RequestParameter::value));
+ }
+
+ /**
+ * Returns the raw value for a required parameter key.
+ *
+ * @param key parameter key to look up
+ * @return raw parameter value
+ * @throws MissingParameterException if no parameter with the given key exists
+ */
+ public String require(String key) throws MissingParameterException {
+ String value = index.get(key);
+ if (value == null) {
+ throw new MissingParameterException(
+ "Required parameter with key '" + key + "' is missing.", key);
+ }
+ return value;
+ }
+
+ /**
+ * Returns a parsed value for a required parameter key.
+ *
+ * @param key parameter key to look up
+ * @param parser parser used to convert the raw value
+ * @param target type returned by the parser
+ * @return parsed parameter value
+ * @throws MissingParameterException if no parameter with the given key exists
+ * @throws ParameterParseException if parsing the raw value fails
+ */
+ public T require(String key, ThrowingParser parser)
+ throws MissingParameterException, ParameterParseException {
+ String value = require(key);
+ try {
+ return parser.parse(value);
+ } catch (Exception e) {
+ throw new ParameterParseException(
+ "Error while parsing '" + key + "' with specified parser", key, e);
+ }
+ }
+
+ /**
+ * Returns the raw value for a parameter key or the provided default value if missing.
+ *
+ * @param key parameter key to look up
+ * @param defaultValue value returned when the key does not exist
+ * @return found parameter value or {@code defaultValue} if absent
+ */
+ public String optional(String key, String defaultValue) {
+ String value = index.get(key);
+ if (value == null) {
+ return defaultValue;
+ }
+ return value;
+ }
+
+ /**
+ * Returns a parsed value for a parameter key or the provided default value if missing.
+ *
+ * @param key parameter key to look up
+ * @param defaultValue value returned when the key does not exist
+ * @param parser parser used to convert the raw value
+ * @param target type returned by the parser
+ * @return parsed parameter value or {@code defaultValue} if absent
+ * @throws ParameterParseException if parsing the raw value fails
+ */
+ public T optional(String key, T defaultValue, ThrowingParser parser)
+ throws ParameterParseException {
+ String value = index.get(key);
+ if (value == null) {
+ return defaultValue;
+ }
+
+ try {
+ return parser.parse(value);
+ } catch (Exception e) {
+ throw new ParameterParseException(
+ "Error while parsing '" + key + "' with specified parser", key, e);
+ }
+ }
+
+ /**
+ * Checks whether a parameter with the given key exists.
+ *
+ * @param key parameter key to check
+ * @return {@code true} if the key exists, otherwise {@code false}
+ */
+ public boolean containsKey(String key) {
+ return index.containsKey(key);
+ }
+}
diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/request/accessor/ThrowingParser.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/request/accessor/ThrowingParser.java
new file mode 100644
index 0000000..688304b
--- /dev/null
+++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/request/accessor/ThrowingParser.java
@@ -0,0 +1,18 @@
+package ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.request.accessor;
+
+/**
+ * Functional parser interface used to convert a raw string parameter into a target type.
+ *
+ * @param target type produced by the parser
+ */
+@FunctionalInterface
+interface ThrowingParser {
+ /**
+ * Parses the provided raw parameter value.
+ *
+ * @param value raw parameter value
+ * @return parsed value
+ * @throws Exception if the value cannot be parsed
+ */
+ T parse(String value) throws Exception;
+}
diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/response/ErrorResponse.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/ErrorResponse.java
similarity index 61%
rename from src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/response/ErrorResponse.java
rename to src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/ErrorResponse.java
index 602181b..44c9aab 100644
--- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/response/ErrorResponse.java
+++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/ErrorResponse.java
@@ -1,22 +1,20 @@
-package ch.unibas.dmi.dbis.cs108.casono.server.network.response;
+package ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.response;
-import ch.unibas.dmi.dbis.cs108.casono.server.network.sessions.SessionId;
+import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.request.RequestContext;
+import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.response.builder.ResponseBody;
/** Response representing an error outcome for a client's request. */
public class ErrorResponse extends Response {
/**
* Construct an error response with a code and message.
*
- * @param sessionId the target session id
- * @param requestId the originating request id
+ * @param context the RequestContext of the request
* @param errorCode a short error code identifying the failure
* @param errorMessage a human readable error message
*/
- public ErrorResponse(
- SessionId sessionId, int requestId, String errorCode, String errorMessage) {
+ public ErrorResponse(RequestContext context, String errorCode, String errorMessage) {
super(
- sessionId,
- requestId,
+ context,
ResponseBody.builder().param("CODE", errorCode).param("MSG", errorMessage).build());
}
diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/OkResponse.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/OkResponse.java
new file mode 100644
index 0000000..cc5526c
--- /dev/null
+++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/OkResponse.java
@@ -0,0 +1,20 @@
+package ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.response;
+
+import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.request.RequestContext;
+import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.response.builder.ResponseBody;
+
+/**
+ * A simple success response with an empty body.
+ *
+ *
Use this to acknowledge successful requests that do not carry additional payload data.
+ */
+public class OkResponse extends SuccessResponse {
+ /**
+ * Create a minimal successful response (no body content).
+ *
+ * @param context the RequestContext of the request
+ */
+ public OkResponse(RequestContext context) {
+ super(context, ResponseBody.builder().build());
+ }
+}
diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/response/PrimitiveResponse.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/PrimitiveResponse.java
similarity index 84%
rename from src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/response/PrimitiveResponse.java
rename to src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/PrimitiveResponse.java
index 1ef7a6a..3f7ce3d 100644
--- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/response/PrimitiveResponse.java
+++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/PrimitiveResponse.java
@@ -1,4 +1,4 @@
-package ch.unibas.dmi.dbis.cs108.casono.server.network.response;
+package ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.response;
import ch.unibas.dmi.dbis.cs108.casono.server.network.sessions.SessionId;
diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/response/Response.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/Response.java
similarity index 64%
rename from src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/response/Response.java
rename to src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/Response.java
index 8a3cf96..13d7ad9 100644
--- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/response/Response.java
+++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/Response.java
@@ -1,23 +1,22 @@
-package ch.unibas.dmi.dbis.cs108.casono.server.network.response;
+package ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.response;
+import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.request.RequestContext;
+import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.response.builder.ResponseBody;
import ch.unibas.dmi.dbis.cs108.casono.server.network.sessions.SessionId;
/** Abstract base class for all server responses sent to clients. */
public abstract class Response {
- private final SessionId sessionId;
- private final int requestId;
+ private final RequestContext context;
private final ResponseBody body;
/**
* Create a new {@code Response}.
*
- * @param sessionId the id of the session this response targets
- * @param requestId the request identifier this response corresponds to
+ * @param context the RequestContext of the request
* @param body the structured response body
*/
- protected Response(SessionId sessionId, int requestId, ResponseBody body) {
- this.sessionId = sessionId;
- this.requestId = requestId;
+ protected Response(RequestContext context, ResponseBody body) {
+ this.context = context;
this.body = body;
}
@@ -29,12 +28,12 @@ public abstract class Response {
public abstract String prefix();
/**
- * Returns the session id that should receive this response.
+ * Returns the session id of the session that should receive this response.
*
* @return the target {@link SessionId}
*/
public SessionId getSessionId() {
- return sessionId;
+ return context.sessionId();
}
/**
@@ -43,7 +42,7 @@ public abstract class Response {
* @return the numeric request id
*/
public int getRequestId() {
- return requestId;
+ return context.requestId();
}
/**
diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/response/SuccessResponse.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/SuccessResponse.java
similarity index 61%
rename from src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/response/SuccessResponse.java
rename to src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/SuccessResponse.java
index e88913f..9b96860 100644
--- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/response/SuccessResponse.java
+++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/SuccessResponse.java
@@ -1,6 +1,7 @@
-package ch.unibas.dmi.dbis.cs108.casono.server.network.response;
+package ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.response;
-import ch.unibas.dmi.dbis.cs108.casono.server.network.sessions.SessionId;
+import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.request.RequestContext;
+import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.response.builder.ResponseBody;
/**
* Abstract {@link Response} specialization indicating a successful outcome.
@@ -12,12 +13,11 @@ public abstract class SuccessResponse extends Response {
/**
* Create a successful response with the provided body.
*
- * @param sessionId the session id this response targets
- * @param requestId the originating request id
+ * @param context the RequestContext of the request
* @param body the response body
*/
- protected SuccessResponse(SessionId sessionId, int requestId, ResponseBody body) {
- super(sessionId, requestId, body);
+ protected SuccessResponse(RequestContext context, ResponseBody body) {
+ super(context, body);
}
/**
diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/response/ResponseBlock.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/builder/ResponseBlock.java
similarity index 81%
rename from src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/response/ResponseBlock.java
rename to src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/builder/ResponseBlock.java
index 075abaf..e738a27 100644
--- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/response/ResponseBlock.java
+++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/builder/ResponseBlock.java
@@ -1,4 +1,4 @@
-package ch.unibas.dmi.dbis.cs108.casono.server.network.response;
+package ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.response.builder;
import java.util.List;
diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/response/ResponseBody.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/builder/ResponseBody.java
similarity index 86%
rename from src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/response/ResponseBody.java
rename to src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/builder/ResponseBody.java
index 8c52ffc..bb783d7 100644
--- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/response/ResponseBody.java
+++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/builder/ResponseBody.java
@@ -1,5 +1,6 @@
-package ch.unibas.dmi.dbis.cs108.casono.server.network.response;
+package ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.response.builder;
+import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.response.Response;
import java.util.List;
/**
diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/response/ResponseBodyBuilder.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/builder/ResponseBodyBuilder.java
similarity index 95%
rename from src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/response/ResponseBodyBuilder.java
rename to src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/builder/ResponseBodyBuilder.java
index f6491b0..c05083d 100644
--- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/response/ResponseBodyBuilder.java
+++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/builder/ResponseBodyBuilder.java
@@ -1,4 +1,4 @@
-package ch.unibas.dmi.dbis.cs108.casono.server.network.response;
+package ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.response.builder;
import java.util.ArrayList;
import java.util.List;
diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/response/ResponseNode.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/builder/ResponseNode.java
similarity index 71%
rename from src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/response/ResponseNode.java
rename to src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/builder/ResponseNode.java
index c3af815..b2bb118 100644
--- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/response/ResponseNode.java
+++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/builder/ResponseNode.java
@@ -1,4 +1,4 @@
-package ch.unibas.dmi.dbis.cs108.casono.server.network.response;
+package ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.response.builder;
/**
* Marker interface for elements that may appear in a {@link ResponseBody}.
diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/response/ResponseParameter.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/builder/ResponseParameter.java
similarity index 89%
rename from src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/response/ResponseParameter.java
rename to src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/builder/ResponseParameter.java
index 87f599a..73ffbf7 100644
--- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/response/ResponseParameter.java
+++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/builder/ResponseParameter.java
@@ -1,4 +1,4 @@
-package ch.unibas.dmi.dbis.cs108.casono.server.network.response;
+package ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.response.builder;
/**
* A parameter node stored in a {@link ResponseBody}.
diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/dispatcher/ResponseDispatchException.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/dispatcher/ResponseDispatchException.java
new file mode 100644
index 0000000..6cf4010
--- /dev/null
+++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/dispatcher/ResponseDispatchException.java
@@ -0,0 +1,7 @@
+package ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.response.dispatcher;
+
+public class ResponseDispatchException extends RuntimeException {
+ public ResponseDispatchException(String message, Throwable cause) {
+ super(message, cause);
+ }
+}
diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/response/ResponseDispatcher.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/dispatcher/ResponseDispatcher.java
similarity index 60%
rename from src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/response/ResponseDispatcher.java
rename to src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/dispatcher/ResponseDispatcher.java
index 57b9181..1895d44 100644
--- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/response/ResponseDispatcher.java
+++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/dispatcher/ResponseDispatcher.java
@@ -1,5 +1,7 @@
-package ch.unibas.dmi.dbis.cs108.casono.server.network.response;
+package ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.response.dispatcher;
+import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.response.PrimitiveResponse;
+import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.response.Response;
import ch.unibas.dmi.dbis.cs108.casono.server.network.sessions.Session;
import ch.unibas.dmi.dbis.cs108.casono.server.network.sessions.SessionManager;
@@ -25,12 +27,17 @@ public class ResponseDispatcher {
* the target session's response queue.
*
* @param response the response to dispatch
- * @throws InterruptedException if the thread is interrupted while waiting to enqueue the
- * primitive response
+ * @throws ResponseDispatchException wraps any exceptions that occur during dispatching, such as
+ * the {@link InterruptedException}
*/
- public void dispatch(Response response) throws InterruptedException {
+ public void dispatch(Response response) {
PrimitiveResponse primitiveResponse = ResponseEncoder.encode(response);
Session session = sessionManager.getSessionById(response.getSessionId());
- session.getResponseQueue().put(primitiveResponse);
+ try {
+ session.getResponseQueue().put(primitiveResponse);
+ } catch (InterruptedException e) {
+ Thread.currentThread().interrupt();
+ throw new ResponseDispatchException("Interrupted while dispatching response", e);
+ }
}
}
diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/response/ResponseEncoder.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/dispatcher/ResponseEncoder.java
similarity index 85%
rename from src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/response/ResponseEncoder.java
rename to src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/dispatcher/ResponseEncoder.java
index dbe8d12..013ddd5 100644
--- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/response/ResponseEncoder.java
+++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/dispatcher/ResponseEncoder.java
@@ -1,4 +1,10 @@
-package ch.unibas.dmi.dbis.cs108.casono.server.network.response;
+package ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.response.dispatcher;
+
+import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.response.PrimitiveResponse;
+import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.response.Response;
+import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.response.builder.ResponseBlock;
+import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.response.builder.ResponseNode;
+import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.response.builder.ResponseParameter;
/**
* Utility responsible for encoding a {@link Response} into a protocol payload string and wrapping
diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/response/OkResponse.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/response/OkResponse.java
deleted file mode 100644
index a3f26c5..0000000
--- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/response/OkResponse.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package ch.unibas.dmi.dbis.cs108.casono.server.network.response;
-
-import ch.unibas.dmi.dbis.cs108.casono.server.network.sessions.SessionId;
-
-/**
- * A simple success response with an empty body.
- *
- *
Use this to acknowledge successful requests that do not carry additional payload data.
- */
-public class OkResponse extends SuccessResponse {
- /**
- * Create a minimal successful response (no body content).
- *
- * @param sessionId the target session id
- * @param requestId the originating request id
- */
- public OkResponse(SessionId sessionId, int requestId) {
- super(sessionId, requestId, ResponseBody.builder().build());
- }
-}
diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/sessions/Session.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/sessions/Session.java
index d6e2094..73eafb7 100644
--- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/sessions/Session.java
+++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/sessions/Session.java
@@ -1,17 +1,18 @@
package ch.unibas.dmi.dbis.cs108.casono.server.network.sessions;
-import ch.unibas.dmi.dbis.cs108.casono.server.network.command.CommandRouter;
+import ch.unibas.dmi.dbis.cs108.casono.server.network.command.execution.CommandRouter;
+import ch.unibas.dmi.dbis.cs108.casono.server.network.command.parsing.CommandParserDispatcher;
import ch.unibas.dmi.dbis.cs108.casono.server.network.events.EventBus;
-import ch.unibas.dmi.dbis.cs108.casono.server.network.parser.CommandParserDispatcher;
-import ch.unibas.dmi.dbis.cs108.casono.server.network.response.PrimitiveResponse;
+import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.response.PrimitiveResponse;
import ch.unibas.dmi.dbis.cs108.casono.server.network.transport.TransportLayer;
-import java.io.IOException;
+import java.time.Instant;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
/** Represents a client session in the network server. */
public class Session {
private final SessionId id;
+ private Instant lastActivity;
private final TransportLayer transport;
private final BlockingQueue responseQueue;
private final CommandParserDispatcher dispatcher;
@@ -23,7 +24,6 @@ public class Session {
*
* @param transport the transport layer for communication
* @param eventBus the event bus for publishing events
- * @throws IOException if an I/O error occurs during initialization
*/
public Session(
TransportLayer transport,
@@ -31,6 +31,7 @@ public class Session {
CommandParserDispatcher dispatcher,
CommandRouter router) {
this.id = new SessionId();
+ this.lastActivity = Instant.now();
this.transport = transport;
this.dispatcher = dispatcher;
this.router = router;
@@ -46,6 +47,20 @@ public class Session {
return this.id;
}
+ /**
+ * Gets the timestamp of the last inbound activity for this session.
+ *
+ * @return an {@link Instant} representing the time of the last inbound activity
+ */
+ public Instant getLastInboundActivity() {
+ return lastActivity;
+ }
+
+ /** Updates the timestamp of the last inbound activity for this session. */
+ public void updateLastInboundActivity() {
+ this.lastActivity = Instant.now();
+ }
+
/**
* Returns the TransportLayer of this session
*
diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/sessions/SessionDisconnectJob.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/sessions/SessionDisconnectJob.java
new file mode 100644
index 0000000..6fd481d
--- /dev/null
+++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/sessions/SessionDisconnectJob.java
@@ -0,0 +1,40 @@
+package ch.unibas.dmi.dbis.cs108.casono.server.network.sessions;
+
+import ch.unibas.dmi.dbis.cs108.casono.server.network.events.DisconnectEvent;
+import ch.unibas.dmi.dbis.cs108.casono.server.network.events.EventBus;
+import java.time.Duration;
+import java.time.Instant;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+public class SessionDisconnectJob implements Runnable {
+ private final Logger logger;
+ private final SessionManager sessionManager;
+ private final EventBus eventBus;
+ private final Duration timeoutThreshold;
+
+ public SessionDisconnectJob(
+ SessionManager sessionManager, EventBus eventBus, Duration timeoutThreshold) {
+ this.logger = LogManager.getLogger(SessionDisconnectJob.class);
+ this.sessionManager = sessionManager;
+ this.eventBus = eventBus;
+ this.timeoutThreshold = timeoutThreshold;
+ }
+
+ @Override
+ public void run() {
+ logger.debug("Job started.");
+ Instant threshold = Instant.now().minus(timeoutThreshold);
+
+ for (Session session : sessionManager.getAllSessions()) {
+ if (session.getLastInboundActivity().isBefore(threshold)) {
+ eventBus.publish(new DisconnectEvent(session.getId()));
+ logger.info(
+ "Initiated disconnect of {}, as it hasn't been active since a while",
+ session.getId());
+ }
+ }
+
+ logger.debug("Job finished.");
+ }
+}
diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/sessions/SessionId.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/sessions/SessionId.java
index 2645323..3dff81a 100644
--- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/sessions/SessionId.java
+++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/sessions/SessionId.java
@@ -14,7 +14,7 @@ public class SessionId {
/**
* Creates a new SessionId with the specified UUID.
*
- * @param UUID to use for this SessionId
+ * @param value UUID to use for this SessionId
*/
public SessionId(UUID value) {
this.value = value;
diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/sessions/SessionManager.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/sessions/SessionManager.java
index b3d52a6..c0ffe55 100644
--- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/sessions/SessionManager.java
+++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/sessions/SessionManager.java
@@ -1,13 +1,15 @@
package ch.unibas.dmi.dbis.cs108.casono.server.network.sessions;
-import ch.unibas.dmi.dbis.cs108.casono.server.network.command.CommandRouter;
+import ch.unibas.dmi.dbis.cs108.casono.server.network.command.execution.CommandRouter;
+import ch.unibas.dmi.dbis.cs108.casono.server.network.command.parsing.CommandParserDispatcher;
import ch.unibas.dmi.dbis.cs108.casono.server.network.events.DisconnectEvent;
import ch.unibas.dmi.dbis.cs108.casono.server.network.events.EventBus;
-import ch.unibas.dmi.dbis.cs108.casono.server.network.parser.CommandParserDispatcher;
import ch.unibas.dmi.dbis.cs108.casono.server.network.transport.TransportLayer;
import java.io.IOException;
+import java.util.Collection;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.stream.Collectors;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@@ -86,7 +88,7 @@ public class SessionManager {
/**
* Handler for the DisconnectEvent
*
- * @param id of the session that disconnected
+ * @param event the DisconnectEvent to handle
*/
public void onDisconnect(DisconnectEvent event) {
logger.debug("Recieved DisconnectEvent event for session {}", event.sessionId().value());
@@ -109,4 +111,8 @@ public class SessionManager {
return handle.session();
}
+
+ public Collection getAllSessions() {
+ return sessions.values().stream().map(SessionHandle::session).collect(Collectors.toList());
+ }
}
diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/sessions/SessionReader.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/sessions/SessionReader.java
index cd74de9..6fb4378 100644
--- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/sessions/SessionReader.java
+++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/sessions/SessionReader.java
@@ -1,18 +1,23 @@
package ch.unibas.dmi.dbis.cs108.casono.server.network.sessions;
-import ch.unibas.dmi.dbis.cs108.casono.server.network.command.CommandRouter;
+import ch.unibas.dmi.dbis.cs108.casono.server.network.command.execution.CommandRouter;
+import ch.unibas.dmi.dbis.cs108.casono.server.network.command.parsing.CommandParserDispatcher;
+import ch.unibas.dmi.dbis.cs108.casono.server.network.command.parsing.UnknownCommandException;
import ch.unibas.dmi.dbis.cs108.casono.server.network.events.DisconnectEvent;
import ch.unibas.dmi.dbis.cs108.casono.server.network.events.EventBus;
-import ch.unibas.dmi.dbis.cs108.casono.server.network.parser.CommandParserDispatcher;
-import ch.unibas.dmi.dbis.cs108.casono.server.network.parser.PrimitiveRequest;
-import ch.unibas.dmi.dbis.cs108.casono.server.network.parser.ProtocolParser;
-import ch.unibas.dmi.dbis.cs108.casono.server.network.parser.ProtocolParserException;
-import ch.unibas.dmi.dbis.cs108.casono.server.network.parser.RawRequest;
-import ch.unibas.dmi.dbis.cs108.casono.server.network.parser.Request;
-import ch.unibas.dmi.dbis.cs108.casono.server.network.parser.RequestContext;
+import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.parser.ProtocolParser;
+import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.parser.ProtocolParserException;
+import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.parser.tokenizer.TokenizerException;
+import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.request.PrimitiveRequest;
+import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.request.RawRequest;
+import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.request.Request;
+import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.request.RequestContext;
+import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.response.ErrorResponse;
+import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.response.PrimitiveResponse;
+import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.response.dispatcher.ResponseDispatchException;
+import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.response.dispatcher.ResponseEncoder;
import ch.unibas.dmi.dbis.cs108.casono.server.network.transport.RawPacket;
import ch.unibas.dmi.dbis.cs108.casono.server.network.transport.TransportLayer;
-import ch.unibas.dmi.dbis.cs108.casono.server.tokenizer.TokenizerException;
import java.io.EOFException;
import java.io.IOException;
import org.apache.logging.log4j.LogManager;
@@ -41,34 +46,79 @@ public class SessionReader implements Runnable {
public void run() {
while (!Thread.currentThread().isInterrupted()) {
RawPacket rawPacket = null;
+ RawRequest rawRequest = null;
+ RequestContext requestContext = null;
try {
+ // Step 1: Read from transport
rawPacket = transport.read();
+ session.updateLastInboundActivity();
logger.debug("Recieved: {}", rawPacket);
+ requestContext = new RequestContext(session.getId(), rawPacket.requestId());
- RawRequest rawRequest = ProtocolParser.parse(rawPacket.payload());
+ // Step 2: Syntax validation and conversion into transport object
+ rawRequest = ProtocolParser.parse(rawPacket.payload());
logger.debug("Parsed request to {}", rawRequest);
- RequestContext requestContext =
- new RequestContext(session.getId(), rawPacket.requestId());
PrimitiveRequest primitiveRequest =
new PrimitiveRequest(
requestContext, rawRequest.command(), rawRequest.parameters());
logger.debug("Converted to {}", primitiveRequest);
+ // Step 3: Parse into Request and execute Request
Request request = dispatcher.parse(primitiveRequest);
-
router.execute(request);
} catch (EOFException e) {
logger.info("Client disconnected");
eventBus.publish(new DisconnectEvent(session.getId()));
break;
+
} catch (TokenizerException | ProtocolParserException e) {
logger.error("Error occured while parsing request. RawPacket: {}", rawPacket, e);
- // TODO: Send error response to client
+ sendErrorResponse(
+ new ErrorResponse(
+ requestContext,
+ "PARSING_ERROR",
+ "Error occured during parsing. Likely due to malformed payload."));
+
+ } catch (UnknownCommandException e) {
+ logger.error("Recieved unknown command '{}' from client", rawRequest.command(), e);
+ sendErrorResponse(
+ new ErrorResponse(
+ requestContext,
+ "UNKNOWN_COMMAND",
+ "This command is unknown to the server."));
+
+ } catch (ResponseDispatchException e) {
+ logger.error(
+ "Unexpected ResponseDispatchException exception while dispatching request",
+ e);
+
} catch (IOException e) {
- logger.error("Unexpected exception while reading from transport", e);
+ logger.error("Unexpected IO exception while reading from transport", e);
+
+ } catch (RuntimeException e) {
+ logger.error("Unexpected RuntimeException occured", e);
+ sendErrorResponse(
+ new ErrorResponse(
+ requestContext,
+ "INTERNAL_ERROR",
+ "Unexpected internal server error occured."));
}
}
}
+
+ /**
+ * Helperfunction to send ErrorResponse to client
+ *
+ * @param response to send to the client
+ */
+ private void sendErrorResponse(ErrorResponse response) {
+ PrimitiveResponse primitiveResponse = ResponseEncoder.encode(response);
+ try {
+ session.getResponseQueue().put(primitiveResponse);
+ } catch (InterruptedException e) {
+ logger.error("Got interrupted while sending ErrorResponse to client.");
+ }
+ }
}
diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/sessions/SessionWriter.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/sessions/SessionWriter.java
index e5c3e78..c59abb3 100644
--- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/sessions/SessionWriter.java
+++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/sessions/SessionWriter.java
@@ -1,6 +1,6 @@
package ch.unibas.dmi.dbis.cs108.casono.server.network.sessions;
-import ch.unibas.dmi.dbis.cs108.casono.server.network.response.PrimitiveResponse;
+import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.response.PrimitiveResponse;
import ch.unibas.dmi.dbis.cs108.casono.server.network.transport.RawPacket;
import ch.unibas.dmi.dbis.cs108.casono.server.network.transport.TransportLayer;
import java.io.IOException;
diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/transport/TcpTransport.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/transport/TcpTransport.java
index 9a15f01..e46277d 100644
--- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/transport/TcpTransport.java
+++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/transport/TcpTransport.java
@@ -50,8 +50,8 @@ public class TcpTransport implements TransportLayer {
int requestId = data.requestId();
byte[] rawPayload = data.payload().getBytes(StandardCharsets.UTF_8);
- out.writeInt(requestId);
out.writeInt(rawPayload.length);
+ out.writeInt(requestId);
out.write(rawPayload);
out.flush();
}
diff --git a/src/main/resources/images/background-3.png b/src/main/resources/images/background-3.png
new file mode 100644
index 0000000..a299281
Binary files /dev/null and b/src/main/resources/images/background-3.png differ
diff --git a/src/main/resources/images/background-4.png b/src/main/resources/images/background-4.png
new file mode 100644
index 0000000..19b9edb
Binary files /dev/null and b/src/main/resources/images/background-4.png differ
diff --git a/src/main/resources/images/blue-background-1.png b/src/main/resources/images/blue-background-1.png
new file mode 100644
index 0000000..52d497d
Binary files /dev/null and b/src/main/resources/images/blue-background-1.png differ
diff --git a/src/main/resources/images/card-cross-1-1.png b/src/main/resources/images/card-cross-1-1.png
new file mode 100644
index 0000000..dccdaa5
Binary files /dev/null and b/src/main/resources/images/card-cross-1-1.png differ
diff --git a/src/main/resources/images/card-cross-1-3.png b/src/main/resources/images/card-cross-1-3.png
new file mode 100644
index 0000000..9724b1e
Binary files /dev/null and b/src/main/resources/images/card-cross-1-3.png differ
diff --git a/src/main/resources/images/card-cross-10-3.png b/src/main/resources/images/card-cross-10-3.png
new file mode 100644
index 0000000..f13385c
Binary files /dev/null and b/src/main/resources/images/card-cross-10-3.png differ
diff --git a/src/main/resources/images/card-cross-2-3.png b/src/main/resources/images/card-cross-2-3.png
new file mode 100644
index 0000000..acf3262
Binary files /dev/null and b/src/main/resources/images/card-cross-2-3.png differ
diff --git a/src/main/resources/images/card-cross-3-3.png b/src/main/resources/images/card-cross-3-3.png
new file mode 100644
index 0000000..20fffc1
Binary files /dev/null and b/src/main/resources/images/card-cross-3-3.png differ
diff --git a/src/main/resources/images/card-cross-4-3.png b/src/main/resources/images/card-cross-4-3.png
new file mode 100644
index 0000000..be35620
Binary files /dev/null and b/src/main/resources/images/card-cross-4-3.png differ
diff --git a/src/main/resources/images/card-cross-5-3.png b/src/main/resources/images/card-cross-5-3.png
new file mode 100644
index 0000000..b053703
Binary files /dev/null and b/src/main/resources/images/card-cross-5-3.png differ
diff --git a/src/main/resources/images/card-cross-6-3.png b/src/main/resources/images/card-cross-6-3.png
new file mode 100644
index 0000000..2f6429b
Binary files /dev/null and b/src/main/resources/images/card-cross-6-3.png differ
diff --git a/src/main/resources/images/card-cross-7-3.png b/src/main/resources/images/card-cross-7-3.png
new file mode 100644
index 0000000..c950802
Binary files /dev/null and b/src/main/resources/images/card-cross-7-3.png differ
diff --git a/src/main/resources/images/card-cross-8-3.png b/src/main/resources/images/card-cross-8-3.png
new file mode 100644
index 0000000..5fc5f58
Binary files /dev/null and b/src/main/resources/images/card-cross-8-3.png differ
diff --git a/src/main/resources/images/card-cross-9-3.png b/src/main/resources/images/card-cross-9-3.png
new file mode 100644
index 0000000..41d317f
Binary files /dev/null and b/src/main/resources/images/card-cross-9-3.png differ
diff --git a/src/main/resources/images/card-cross-ace-3.png b/src/main/resources/images/card-cross-ace-3.png
new file mode 100644
index 0000000..1eb1eda
Binary files /dev/null and b/src/main/resources/images/card-cross-ace-3.png differ
diff --git a/src/main/resources/images/card-cross-jack-3.png b/src/main/resources/images/card-cross-jack-3.png
new file mode 100644
index 0000000..d81adf0
Binary files /dev/null and b/src/main/resources/images/card-cross-jack-3.png differ
diff --git a/src/main/resources/images/card-cross-king-3.png b/src/main/resources/images/card-cross-king-3.png
new file mode 100644
index 0000000..2e7b58e
Binary files /dev/null and b/src/main/resources/images/card-cross-king-3.png differ
diff --git a/src/main/resources/images/card-cross-queen-3.png b/src/main/resources/images/card-cross-queen-3.png
new file mode 100644
index 0000000..1aa81a2
Binary files /dev/null and b/src/main/resources/images/card-cross-queen-3.png differ
diff --git a/src/main/resources/images/card-diamond-1-3.png b/src/main/resources/images/card-diamond-1-3.png
new file mode 100644
index 0000000..a9ac4aa
Binary files /dev/null and b/src/main/resources/images/card-diamond-1-3.png differ
diff --git a/src/main/resources/images/card-diamond-10-3.png b/src/main/resources/images/card-diamond-10-3.png
new file mode 100644
index 0000000..989f685
Binary files /dev/null and b/src/main/resources/images/card-diamond-10-3.png differ
diff --git a/src/main/resources/images/card-diamond-2-3.png b/src/main/resources/images/card-diamond-2-3.png
new file mode 100644
index 0000000..c79670f
Binary files /dev/null and b/src/main/resources/images/card-diamond-2-3.png differ
diff --git a/src/main/resources/images/card-diamond-3-3.png b/src/main/resources/images/card-diamond-3-3.png
new file mode 100644
index 0000000..e980945
Binary files /dev/null and b/src/main/resources/images/card-diamond-3-3.png differ
diff --git a/src/main/resources/images/card-diamond-4-3.png b/src/main/resources/images/card-diamond-4-3.png
new file mode 100644
index 0000000..c71c59d
Binary files /dev/null and b/src/main/resources/images/card-diamond-4-3.png differ
diff --git a/src/main/resources/images/card-diamond-5-3.png b/src/main/resources/images/card-diamond-5-3.png
new file mode 100644
index 0000000..f91de3a
Binary files /dev/null and b/src/main/resources/images/card-diamond-5-3.png differ
diff --git a/src/main/resources/images/card-diamond-6-3.png b/src/main/resources/images/card-diamond-6-3.png
new file mode 100644
index 0000000..6dd1156
Binary files /dev/null and b/src/main/resources/images/card-diamond-6-3.png differ
diff --git a/src/main/resources/images/card-diamond-7-3.png b/src/main/resources/images/card-diamond-7-3.png
new file mode 100644
index 0000000..79e9392
Binary files /dev/null and b/src/main/resources/images/card-diamond-7-3.png differ
diff --git a/src/main/resources/images/card-diamond-8-3.png b/src/main/resources/images/card-diamond-8-3.png
new file mode 100644
index 0000000..6f1ac39
Binary files /dev/null and b/src/main/resources/images/card-diamond-8-3.png differ
diff --git a/src/main/resources/images/card-diamond-9-3.png b/src/main/resources/images/card-diamond-9-3.png
new file mode 100644
index 0000000..b2bfd22
Binary files /dev/null and b/src/main/resources/images/card-diamond-9-3.png differ
diff --git a/src/main/resources/images/card-diamond-ace-3.png b/src/main/resources/images/card-diamond-ace-3.png
new file mode 100644
index 0000000..29b3180
Binary files /dev/null and b/src/main/resources/images/card-diamond-ace-3.png differ
diff --git a/src/main/resources/images/card-diamond-jack-3.png b/src/main/resources/images/card-diamond-jack-3.png
new file mode 100644
index 0000000..1c7fab1
Binary files /dev/null and b/src/main/resources/images/card-diamond-jack-3.png differ
diff --git a/src/main/resources/images/card-diamond-king-3.png b/src/main/resources/images/card-diamond-king-3.png
new file mode 100644
index 0000000..aaa0ab5
Binary files /dev/null and b/src/main/resources/images/card-diamond-king-3.png differ
diff --git a/src/main/resources/images/card-diamond-queen-3.png b/src/main/resources/images/card-diamond-queen-3.png
new file mode 100644
index 0000000..04873ee
Binary files /dev/null and b/src/main/resources/images/card-diamond-queen-3.png differ
diff --git a/src/main/resources/images/card-heart-1-1.png b/src/main/resources/images/card-heart-1-1.png
new file mode 100644
index 0000000..6418ba0
Binary files /dev/null and b/src/main/resources/images/card-heart-1-1.png differ
diff --git a/src/main/resources/images/card-heart-1-3.png b/src/main/resources/images/card-heart-1-3.png
new file mode 100644
index 0000000..44cc678
Binary files /dev/null and b/src/main/resources/images/card-heart-1-3.png differ
diff --git a/src/main/resources/images/card-heart-10-3.png b/src/main/resources/images/card-heart-10-3.png
new file mode 100644
index 0000000..a56f125
Binary files /dev/null and b/src/main/resources/images/card-heart-10-3.png differ
diff --git a/src/main/resources/images/card-heart-2-3.png b/src/main/resources/images/card-heart-2-3.png
new file mode 100644
index 0000000..5998f0b
Binary files /dev/null and b/src/main/resources/images/card-heart-2-3.png differ
diff --git a/src/main/resources/images/card-heart-3-3.png b/src/main/resources/images/card-heart-3-3.png
new file mode 100644
index 0000000..de6a64e
Binary files /dev/null and b/src/main/resources/images/card-heart-3-3.png differ
diff --git a/src/main/resources/images/card-heart-4-3.png b/src/main/resources/images/card-heart-4-3.png
new file mode 100644
index 0000000..1461c1f
Binary files /dev/null and b/src/main/resources/images/card-heart-4-3.png differ
diff --git a/src/main/resources/images/card-heart-5-3.png b/src/main/resources/images/card-heart-5-3.png
new file mode 100644
index 0000000..9b25594
Binary files /dev/null and b/src/main/resources/images/card-heart-5-3.png differ
diff --git a/src/main/resources/images/card-heart-6-3.png b/src/main/resources/images/card-heart-6-3.png
new file mode 100644
index 0000000..a60ce4b
Binary files /dev/null and b/src/main/resources/images/card-heart-6-3.png differ
diff --git a/src/main/resources/images/card-heart-7-3.png b/src/main/resources/images/card-heart-7-3.png
new file mode 100644
index 0000000..7d51eca
Binary files /dev/null and b/src/main/resources/images/card-heart-7-3.png differ
diff --git a/src/main/resources/images/card-heart-8-3.png b/src/main/resources/images/card-heart-8-3.png
new file mode 100644
index 0000000..640bb09
Binary files /dev/null and b/src/main/resources/images/card-heart-8-3.png differ
diff --git a/src/main/resources/images/card-heart-9-3.png b/src/main/resources/images/card-heart-9-3.png
new file mode 100644
index 0000000..e13d594
Binary files /dev/null and b/src/main/resources/images/card-heart-9-3.png differ
diff --git a/src/main/resources/images/card-heart-ace-3.png b/src/main/resources/images/card-heart-ace-3.png
new file mode 100644
index 0000000..6b8e378
Binary files /dev/null and b/src/main/resources/images/card-heart-ace-3.png differ
diff --git a/src/main/resources/images/card-heart-jack-3.png b/src/main/resources/images/card-heart-jack-3.png
new file mode 100644
index 0000000..887ba39
Binary files /dev/null and b/src/main/resources/images/card-heart-jack-3.png differ
diff --git a/src/main/resources/images/card-heart-king-3.png b/src/main/resources/images/card-heart-king-3.png
new file mode 100644
index 0000000..947e312
Binary files /dev/null and b/src/main/resources/images/card-heart-king-3.png differ
diff --git a/src/main/resources/images/card-heart-queen-3.png b/src/main/resources/images/card-heart-queen-3.png
new file mode 100644
index 0000000..13a62a1
Binary files /dev/null and b/src/main/resources/images/card-heart-queen-3.png differ
diff --git a/src/main/resources/images/card-pik-1-1.png b/src/main/resources/images/card-pik-1-1.png
new file mode 100644
index 0000000..0e6cbde
Binary files /dev/null and b/src/main/resources/images/card-pik-1-1.png differ
diff --git a/src/main/resources/images/card-pik-1-3.png b/src/main/resources/images/card-pik-1-3.png
new file mode 100644
index 0000000..b1e1080
Binary files /dev/null and b/src/main/resources/images/card-pik-1-3.png differ
diff --git a/src/main/resources/images/card-pik-10-3.png b/src/main/resources/images/card-pik-10-3.png
new file mode 100644
index 0000000..b40b0ce
Binary files /dev/null and b/src/main/resources/images/card-pik-10-3.png differ
diff --git a/src/main/resources/images/card-pik-2-3.png b/src/main/resources/images/card-pik-2-3.png
new file mode 100644
index 0000000..44e3123
Binary files /dev/null and b/src/main/resources/images/card-pik-2-3.png differ
diff --git a/src/main/resources/images/card-pik-3-3.png b/src/main/resources/images/card-pik-3-3.png
new file mode 100644
index 0000000..a26b334
Binary files /dev/null and b/src/main/resources/images/card-pik-3-3.png differ
diff --git a/src/main/resources/images/card-pik-4-3.png b/src/main/resources/images/card-pik-4-3.png
new file mode 100644
index 0000000..efed0ae
Binary files /dev/null and b/src/main/resources/images/card-pik-4-3.png differ
diff --git a/src/main/resources/images/card-pik-5-3.png b/src/main/resources/images/card-pik-5-3.png
new file mode 100644
index 0000000..97b766d
Binary files /dev/null and b/src/main/resources/images/card-pik-5-3.png differ
diff --git a/src/main/resources/images/card-pik-6-3.png b/src/main/resources/images/card-pik-6-3.png
new file mode 100644
index 0000000..6a4e211
Binary files /dev/null and b/src/main/resources/images/card-pik-6-3.png differ
diff --git a/src/main/resources/images/card-pik-7-3.png b/src/main/resources/images/card-pik-7-3.png
new file mode 100644
index 0000000..7012f03
Binary files /dev/null and b/src/main/resources/images/card-pik-7-3.png differ
diff --git a/src/main/resources/images/card-pik-8-3.png b/src/main/resources/images/card-pik-8-3.png
new file mode 100644
index 0000000..fed7ff4
Binary files /dev/null and b/src/main/resources/images/card-pik-8-3.png differ
diff --git a/src/main/resources/images/card-pik-9-3.png b/src/main/resources/images/card-pik-9-3.png
new file mode 100644
index 0000000..924911d
Binary files /dev/null and b/src/main/resources/images/card-pik-9-3.png differ
diff --git a/src/main/resources/images/card-pik-ace-3.png b/src/main/resources/images/card-pik-ace-3.png
new file mode 100644
index 0000000..37df3d3
Binary files /dev/null and b/src/main/resources/images/card-pik-ace-3.png differ
diff --git a/src/main/resources/images/card-pik-jack-3.png b/src/main/resources/images/card-pik-jack-3.png
new file mode 100644
index 0000000..f450d6b
Binary files /dev/null and b/src/main/resources/images/card-pik-jack-3.png differ
diff --git a/src/main/resources/images/card-pik-king-3.png b/src/main/resources/images/card-pik-king-3.png
new file mode 100644
index 0000000..02ebde9
Binary files /dev/null and b/src/main/resources/images/card-pik-king-3.png differ
diff --git a/src/main/resources/images/card-pik-queen-3.png b/src/main/resources/images/card-pik-queen-3.png
new file mode 100644
index 0000000..0a5bc5a
Binary files /dev/null and b/src/main/resources/images/card-pik-queen-3.png differ
diff --git a/src/main/resources/images/chip-1-5.png b/src/main/resources/images/chip-1-5.png
new file mode 100644
index 0000000..32474d6
Binary files /dev/null and b/src/main/resources/images/chip-1-5.png differ
diff --git a/src/main/resources/images/chip-10-5.png b/src/main/resources/images/chip-10-5.png
new file mode 100644
index 0000000..5cde84b
Binary files /dev/null and b/src/main/resources/images/chip-10-5.png differ
diff --git a/src/main/resources/images/chip-100-5.png b/src/main/resources/images/chip-100-5.png
new file mode 100644
index 0000000..d039c12
Binary files /dev/null and b/src/main/resources/images/chip-100-5.png differ
diff --git a/src/main/resources/images/chip-1000-5.png b/src/main/resources/images/chip-1000-5.png
new file mode 100644
index 0000000..7178e4e
Binary files /dev/null and b/src/main/resources/images/chip-1000-5.png differ
diff --git a/src/main/resources/images/chip-10000-5.png b/src/main/resources/images/chip-10000-5.png
new file mode 100644
index 0000000..7cbfb3c
Binary files /dev/null and b/src/main/resources/images/chip-10000-5.png differ
diff --git a/src/main/resources/images/chip-100000-5.png b/src/main/resources/images/chip-100000-5.png
new file mode 100644
index 0000000..2eab023
Binary files /dev/null and b/src/main/resources/images/chip-100000-5.png differ
diff --git a/src/main/resources/images/chip-2-5.png b/src/main/resources/images/chip-2-5.png
new file mode 100644
index 0000000..2dd7a9a
Binary files /dev/null and b/src/main/resources/images/chip-2-5.png differ
diff --git a/src/main/resources/images/chip-20-5.png b/src/main/resources/images/chip-20-5.png
new file mode 100644
index 0000000..a105f08
Binary files /dev/null and b/src/main/resources/images/chip-20-5.png differ
diff --git a/src/main/resources/images/chip-200-5.png b/src/main/resources/images/chip-200-5.png
new file mode 100644
index 0000000..1893e92
Binary files /dev/null and b/src/main/resources/images/chip-200-5.png differ
diff --git a/src/main/resources/images/chip-2000-5.png b/src/main/resources/images/chip-2000-5.png
new file mode 100644
index 0000000..e3e0ba0
Binary files /dev/null and b/src/main/resources/images/chip-2000-5.png differ
diff --git a/src/main/resources/images/chip-20000-5.png b/src/main/resources/images/chip-20000-5.png
new file mode 100644
index 0000000..9c6cb9d
Binary files /dev/null and b/src/main/resources/images/chip-20000-5.png differ
diff --git a/src/main/resources/images/chip-3-5.png b/src/main/resources/images/chip-3-5.png
new file mode 100644
index 0000000..720c2a9
Binary files /dev/null and b/src/main/resources/images/chip-3-5.png differ
diff --git a/src/main/resources/images/chip-4-5.png b/src/main/resources/images/chip-4-5.png
new file mode 100644
index 0000000..61278fc
Binary files /dev/null and b/src/main/resources/images/chip-4-5.png differ
diff --git a/src/main/resources/images/chip-5-5.png b/src/main/resources/images/chip-5-5.png
new file mode 100644
index 0000000..7c60b57
Binary files /dev/null and b/src/main/resources/images/chip-5-5.png differ
diff --git a/src/main/resources/images/chip-50-5.png b/src/main/resources/images/chip-50-5.png
new file mode 100644
index 0000000..4b2fda4
Binary files /dev/null and b/src/main/resources/images/chip-50-5.png differ
diff --git a/src/main/resources/images/chip-500-5.png b/src/main/resources/images/chip-500-5.png
new file mode 100644
index 0000000..49bc939
Binary files /dev/null and b/src/main/resources/images/chip-500-5.png differ
diff --git a/src/main/resources/images/chip-5000-5.png b/src/main/resources/images/chip-5000-5.png
new file mode 100644
index 0000000..927deb0
Binary files /dev/null and b/src/main/resources/images/chip-5000-5.png differ
diff --git a/src/main/resources/images/chip-50000-5.png b/src/main/resources/images/chip-50000-5.png
new file mode 100644
index 0000000..b67bea8
Binary files /dev/null and b/src/main/resources/images/chip-50000-5.png differ
diff --git a/src/main/resources/images/chip-6-5.png b/src/main/resources/images/chip-6-5.png
new file mode 100644
index 0000000..7aecc36
Binary files /dev/null and b/src/main/resources/images/chip-6-5.png differ
diff --git a/src/main/resources/images/chip-7-5.png b/src/main/resources/images/chip-7-5.png
new file mode 100644
index 0000000..8199a10
Binary files /dev/null and b/src/main/resources/images/chip-7-5.png differ
diff --git a/src/main/resources/images/chip-8-5.png b/src/main/resources/images/chip-8-5.png
new file mode 100644
index 0000000..a72e08c
Binary files /dev/null and b/src/main/resources/images/chip-8-5.png differ
diff --git a/src/main/resources/images/green-background-1.png b/src/main/resources/images/green-background-1.png
new file mode 100644
index 0000000..20496df
Binary files /dev/null and b/src/main/resources/images/green-background-1.png differ
diff --git a/src/main/resources/images/lobbypictures/lobby_1_created.png b/src/main/resources/images/lobbypictures/lobby_1_created.png
new file mode 100644
index 0000000..cf9b467
Binary files /dev/null and b/src/main/resources/images/lobbypictures/lobby_1_created.png differ
diff --git a/src/main/resources/images/lobbypictures/lobby_1_running.png b/src/main/resources/images/lobbypictures/lobby_1_running.png
new file mode 100644
index 0000000..fc44fad
Binary files /dev/null and b/src/main/resources/images/lobbypictures/lobby_1_running.png differ
diff --git a/src/main/resources/images/lobbypictures/lobby_2_created.png b/src/main/resources/images/lobbypictures/lobby_2_created.png
new file mode 100644
index 0000000..5082013
Binary files /dev/null and b/src/main/resources/images/lobbypictures/lobby_2_created.png differ
diff --git a/src/main/resources/images/lobbypictures/lobby_2_running.png b/src/main/resources/images/lobbypictures/lobby_2_running.png
new file mode 100644
index 0000000..9ed62c2
Binary files /dev/null and b/src/main/resources/images/lobbypictures/lobby_2_running.png differ
diff --git a/src/main/resources/images/lobbypictures/lobby_3_created.png b/src/main/resources/images/lobbypictures/lobby_3_created.png
new file mode 100644
index 0000000..dda0d19
Binary files /dev/null and b/src/main/resources/images/lobbypictures/lobby_3_created.png differ
diff --git a/src/main/resources/images/lobbypictures/lobby_3_running.png b/src/main/resources/images/lobbypictures/lobby_3_running.png
new file mode 100644
index 0000000..73450fb
Binary files /dev/null and b/src/main/resources/images/lobbypictures/lobby_3_running.png differ
diff --git a/src/main/resources/images/lobbypictures/lobby_4_created.png b/src/main/resources/images/lobbypictures/lobby_4_created.png
new file mode 100644
index 0000000..34dc9cc
Binary files /dev/null and b/src/main/resources/images/lobbypictures/lobby_4_created.png differ
diff --git a/src/main/resources/images/lobbypictures/lobby_4_running.png b/src/main/resources/images/lobbypictures/lobby_4_running.png
new file mode 100644
index 0000000..3ec3d4e
Binary files /dev/null and b/src/main/resources/images/lobbypictures/lobby_4_running.png differ
diff --git a/src/main/resources/images/lobbypictures/lobby_5_created.png b/src/main/resources/images/lobbypictures/lobby_5_created.png
new file mode 100644
index 0000000..dacdba0
Binary files /dev/null and b/src/main/resources/images/lobbypictures/lobby_5_created.png differ
diff --git a/src/main/resources/images/lobbypictures/lobby_5_running.png b/src/main/resources/images/lobbypictures/lobby_5_running.png
new file mode 100644
index 0000000..661615a
Binary files /dev/null and b/src/main/resources/images/lobbypictures/lobby_5_running.png differ
diff --git a/src/main/resources/images/lobbypictures/lobby_6_created.png b/src/main/resources/images/lobbypictures/lobby_6_created.png
new file mode 100644
index 0000000..41ce0db
Binary files /dev/null and b/src/main/resources/images/lobbypictures/lobby_6_created.png differ
diff --git a/src/main/resources/images/lobbypictures/lobby_6_running.png b/src/main/resources/images/lobbypictures/lobby_6_running.png
new file mode 100644
index 0000000..23fec97
Binary files /dev/null and b/src/main/resources/images/lobbypictures/lobby_6_running.png differ
diff --git a/src/main/resources/images/lobbypictures/lobby_7_created.png b/src/main/resources/images/lobbypictures/lobby_7_created.png
new file mode 100644
index 0000000..710ac33
Binary files /dev/null and b/src/main/resources/images/lobbypictures/lobby_7_created.png differ
diff --git a/src/main/resources/images/lobbypictures/lobby_7_running.png b/src/main/resources/images/lobbypictures/lobby_7_running.png
new file mode 100644
index 0000000..b5e272f
Binary files /dev/null and b/src/main/resources/images/lobbypictures/lobby_7_running.png differ
diff --git a/src/main/resources/images/lobbypictures/lobby_8_created.png b/src/main/resources/images/lobbypictures/lobby_8_created.png
new file mode 100644
index 0000000..60099ae
Binary files /dev/null and b/src/main/resources/images/lobbypictures/lobby_8_created.png differ
diff --git a/src/main/resources/images/lobbypictures/lobby_8_running.png b/src/main/resources/images/lobbypictures/lobby_8_running.png
new file mode 100644
index 0000000..6025a4d
Binary files /dev/null and b/src/main/resources/images/lobbypictures/lobby_8_running.png differ
diff --git a/src/main/resources/images/logo-black-1.png b/src/main/resources/images/logo-black-1.png
new file mode 100644
index 0000000..73053b6
Binary files /dev/null and b/src/main/resources/images/logo-black-1.png differ
diff --git a/src/main/resources/images/logo-white-1.png b/src/main/resources/images/logo-white-1.png
new file mode 100644
index 0000000..e906bd4
Binary files /dev/null and b/src/main/resources/images/logo-white-1.png differ
diff --git a/src/main/resources/images/logo-with-text-3.png b/src/main/resources/images/logo-with-text-3.png
new file mode 100644
index 0000000..3a4fed7
Binary files /dev/null and b/src/main/resources/images/logo-with-text-3.png differ
diff --git a/src/main/resources/images/old_images/chip-1-4.png b/src/main/resources/images/old_images/chip-1-4.png
new file mode 100644
index 0000000..089c5b5
Binary files /dev/null and b/src/main/resources/images/old_images/chip-1-4.png differ
diff --git a/src/main/resources/images/old_images/chip-10-4.png b/src/main/resources/images/old_images/chip-10-4.png
new file mode 100644
index 0000000..a10e6bf
Binary files /dev/null and b/src/main/resources/images/old_images/chip-10-4.png differ
diff --git a/src/main/resources/images/old_images/chip-100-4.png b/src/main/resources/images/old_images/chip-100-4.png
new file mode 100644
index 0000000..4ddbe1d
Binary files /dev/null and b/src/main/resources/images/old_images/chip-100-4.png differ
diff --git a/src/main/resources/images/old_images/chip-1000-4.png b/src/main/resources/images/old_images/chip-1000-4.png
new file mode 100644
index 0000000..23b05d1
Binary files /dev/null and b/src/main/resources/images/old_images/chip-1000-4.png differ
diff --git a/src/main/resources/images/old_images/chip-10000-4.png b/src/main/resources/images/old_images/chip-10000-4.png
new file mode 100644
index 0000000..3fe9429
Binary files /dev/null and b/src/main/resources/images/old_images/chip-10000-4.png differ
diff --git a/src/main/resources/images/old_images/chip-100000-4.png b/src/main/resources/images/old_images/chip-100000-4.png
new file mode 100644
index 0000000..afe4afc
Binary files /dev/null and b/src/main/resources/images/old_images/chip-100000-4.png differ
diff --git a/src/main/resources/images/old_images/chip-2-4.png b/src/main/resources/images/old_images/chip-2-4.png
new file mode 100644
index 0000000..c4bcb88
Binary files /dev/null and b/src/main/resources/images/old_images/chip-2-4.png differ
diff --git a/src/main/resources/images/old_images/chip-20-4.png b/src/main/resources/images/old_images/chip-20-4.png
new file mode 100644
index 0000000..49c9a9a
Binary files /dev/null and b/src/main/resources/images/old_images/chip-20-4.png differ
diff --git a/src/main/resources/images/old_images/chip-200-4.png b/src/main/resources/images/old_images/chip-200-4.png
new file mode 100644
index 0000000..2ed608a
Binary files /dev/null and b/src/main/resources/images/old_images/chip-200-4.png differ
diff --git a/src/main/resources/images/old_images/chip-2000-4.png b/src/main/resources/images/old_images/chip-2000-4.png
new file mode 100644
index 0000000..d73d9d8
Binary files /dev/null and b/src/main/resources/images/old_images/chip-2000-4.png differ
diff --git a/src/main/resources/images/old_images/chip-20000-4.png b/src/main/resources/images/old_images/chip-20000-4.png
new file mode 100644
index 0000000..d25c548
Binary files /dev/null and b/src/main/resources/images/old_images/chip-20000-4.png differ
diff --git a/src/main/resources/images/old_images/chip-3-4.png b/src/main/resources/images/old_images/chip-3-4.png
new file mode 100644
index 0000000..2a9c147
Binary files /dev/null and b/src/main/resources/images/old_images/chip-3-4.png differ
diff --git a/src/main/resources/images/old_images/chip-4-4.png b/src/main/resources/images/old_images/chip-4-4.png
new file mode 100644
index 0000000..e3cd0ae
Binary files /dev/null and b/src/main/resources/images/old_images/chip-4-4.png differ
diff --git a/src/main/resources/images/old_images/chip-5-4.png b/src/main/resources/images/old_images/chip-5-4.png
new file mode 100644
index 0000000..89b8334
Binary files /dev/null and b/src/main/resources/images/old_images/chip-5-4.png differ
diff --git a/src/main/resources/images/old_images/chip-50-4.png b/src/main/resources/images/old_images/chip-50-4.png
new file mode 100644
index 0000000..e69468b
Binary files /dev/null and b/src/main/resources/images/old_images/chip-50-4.png differ
diff --git a/src/main/resources/images/old_images/chip-500-4.png b/src/main/resources/images/old_images/chip-500-4.png
new file mode 100644
index 0000000..76ae2c2
Binary files /dev/null and b/src/main/resources/images/old_images/chip-500-4.png differ
diff --git a/src/main/resources/images/old_images/chip-5000-4.png b/src/main/resources/images/old_images/chip-5000-4.png
new file mode 100644
index 0000000..1708082
Binary files /dev/null and b/src/main/resources/images/old_images/chip-5000-4.png differ
diff --git a/src/main/resources/images/old_images/chip-50000-4.png b/src/main/resources/images/old_images/chip-50000-4.png
new file mode 100644
index 0000000..8030aee
Binary files /dev/null and b/src/main/resources/images/old_images/chip-50000-4.png differ
diff --git a/src/main/resources/images/old_images/chip-6-4.png b/src/main/resources/images/old_images/chip-6-4.png
new file mode 100644
index 0000000..e7fea89
Binary files /dev/null and b/src/main/resources/images/old_images/chip-6-4.png differ
diff --git a/src/main/resources/images/old_images/chip-7-4.png b/src/main/resources/images/old_images/chip-7-4.png
new file mode 100644
index 0000000..62b452a
Binary files /dev/null and b/src/main/resources/images/old_images/chip-7-4.png differ
diff --git a/src/main/resources/images/old_images/chip-8-4.png b/src/main/resources/images/old_images/chip-8-4.png
new file mode 100644
index 0000000..42119b2
Binary files /dev/null and b/src/main/resources/images/old_images/chip-8-4.png differ
diff --git a/src/main/resources/images/placeholder-animation.mp4 b/src/main/resources/images/placeholder-animation.mp4
new file mode 100644
index 0000000..dc81e12
Binary files /dev/null and b/src/main/resources/images/placeholder-animation.mp4 differ
diff --git a/src/main/resources/images/red-background-1.png b/src/main/resources/images/red-background-1.png
new file mode 100644
index 0000000..fe375e9
Binary files /dev/null and b/src/main/resources/images/red-background-1.png differ
diff --git a/src/main/resources/images/taskbar-logo-black-1.png b/src/main/resources/images/taskbar-logo-black-1.png
new file mode 100644
index 0000000..f800ab8
Binary files /dev/null and b/src/main/resources/images/taskbar-logo-black-1.png differ
diff --git a/src/main/resources/ui-structure/casinogameui.css b/src/main/resources/ui-structure/Casinogameui.css
similarity index 100%
rename from src/main/resources/ui-structure/casinogameui.css
rename to src/main/resources/ui-structure/Casinogameui.css
diff --git a/src/main/resources/ui-structure/Casinogameui.fxml b/src/main/resources/ui-structure/Casinogameui.fxml
index 91bbe26..08bbf56 100644
--- a/src/main/resources/ui-structure/Casinogameui.fxml
+++ b/src/main/resources/ui-structure/Casinogameui.fxml
@@ -5,12 +5,12 @@
-
+
+ stylesheets="@Casinogameui.css">
@@ -78,14 +78,14 @@
-
+
-
+
@@ -99,7 +99,7 @@
-
+
@@ -114,7 +114,7 @@
-
+
@@ -129,7 +129,7 @@
-
+
diff --git a/src/main/resources/ui-structure/Casinomainui.fxml b/src/main/resources/ui-structure/Casinomainui.fxml
index 2d18a48..7cae21e 100644
--- a/src/main/resources/ui-structure/Casinomainui.fxml
+++ b/src/main/resources/ui-structure/Casinomainui.fxml
@@ -106,20 +106,7 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
diff --git a/src/main/resources/ui-structure/components/chatbox.fxml b/src/main/resources/ui-structure/components/Chatbox.fxml
similarity index 98%
rename from src/main/resources/ui-structure/components/chatbox.fxml
rename to src/main/resources/ui-structure/components/Chatbox.fxml
index 3e518ba..c61e28e 100644
--- a/src/main/resources/ui-structure/components/chatbox.fxml
+++ b/src/main/resources/ui-structure/components/Chatbox.fxml
@@ -21,7 +21,7 @@
xmlns:fx="http://javafx.com/fxml/1"
fx:controller="ch.unibas.dmi.dbis.cs108.casono.client.ui.chatui.ChatController"
alignment="CENTER"
- stylesheets="@chatui.css">
+ stylesheets="@Chatui.css">
diff --git a/src/main/resources/ui-structure/components/chatui.css b/src/main/resources/ui-structure/components/Chatui.css
similarity index 100%
rename from src/main/resources/ui-structure/components/chatui.css
rename to src/main/resources/ui-structure/components/Chatui.css
diff --git a/src/main/resources/ui-structure/gameuicomponents/playerstatus.fxml b/src/main/resources/ui-structure/gameuicomponents/Playerstatus.fxml
similarity index 100%
rename from src/main/resources/ui-structure/gameuicomponents/playerstatus.fxml
rename to src/main/resources/ui-structure/gameuicomponents/Playerstatus.fxml
diff --git a/src/main/resources/ui-structure/gameuicomponents/taskbar.fxml b/src/main/resources/ui-structure/gameuicomponents/Taskbar.fxml
similarity index 100%
rename from src/main/resources/ui-structure/gameuicomponents/taskbar.fxml
rename to src/main/resources/ui-structure/gameuicomponents/Taskbar.fxml
diff --git a/src/test/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/lobbyui/LobbyButtonGridManagerTest.java b/src/test/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/lobbyui/LobbyButtonGridManagerTest.java
index 67aaae4..765deb0 100644
--- a/src/test/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/lobbyui/LobbyButtonGridManagerTest.java
+++ b/src/test/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/lobbyui/LobbyButtonGridManagerTest.java
@@ -13,7 +13,7 @@ class LobbyButtonGridManagerTest {
@BeforeEach
void setUp() {
gridPane = new GridPane();
- translationManager = new LobbyButtonTranslationManager();
+ translationManager = LobbyButtonTranslationManager.getInstance();
translationManager.getButtonIdToLobbyId().clear();
gridManager = new LobbyButtonGridManager(gridPane, translationManager);
}
@@ -23,10 +23,4 @@ class LobbyButtonGridManagerTest {
int lobbyId = gridManager.createLobby();
assertTrue(lobbyId > 0);
}
-
- @Test
- void testJoinLobbyPlaceholder() {
- // check if exception is thrown
- assertDoesNotThrow(() -> gridManager.joinLobby(123));
- }
}
diff --git a/src/test/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/lobbyui/LobbyButtonTranslationManagerTest.java b/src/test/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/lobbyui/LobbyButtonTranslationManagerTest.java
index d19532a..dfcce6a 100644
--- a/src/test/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/lobbyui/LobbyButtonTranslationManagerTest.java
+++ b/src/test/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/lobbyui/LobbyButtonTranslationManagerTest.java
@@ -6,11 +6,12 @@ import java.util.Map;
import org.junit.jupiter.api.*;
class LobbyButtonTranslationManagerTest {
+
LobbyButtonTranslationManager manager;
@BeforeEach
void setUp() {
- manager = new LobbyButtonTranslationManager();
+ manager = LobbyButtonTranslationManager.getInstance();
manager.getButtonIdToLobbyId().clear();
}
diff --git a/src/test/java/ch/unibas/dmi/dbis/cs108/casono/server/tokenizer/StateTest.java b/src/test/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/parser/tokenizer/StateTest.java
similarity index 95%
rename from src/test/java/ch/unibas/dmi/dbis/cs108/casono/server/tokenizer/StateTest.java
rename to src/test/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/parser/tokenizer/StateTest.java
index fd1717b..19832cc 100644
--- a/src/test/java/ch/unibas/dmi/dbis/cs108/casono/server/tokenizer/StateTest.java
+++ b/src/test/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/parser/tokenizer/StateTest.java
@@ -1,4 +1,4 @@
-package ch.unibas.dmi.dbis.cs108.casono.server.tokenizer;
+package ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.parser.tokenizer;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
diff --git a/src/test/java/ch/unibas/dmi/dbis/cs108/casono/server/tokenizer/TokenizerExceptionTest.java b/src/test/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/parser/tokenizer/TokenizerExceptionTest.java
similarity index 85%
rename from src/test/java/ch/unibas/dmi/dbis/cs108/casono/server/tokenizer/TokenizerExceptionTest.java
rename to src/test/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/parser/tokenizer/TokenizerExceptionTest.java
index d161b9b..bb6bc58 100644
--- a/src/test/java/ch/unibas/dmi/dbis/cs108/casono/server/tokenizer/TokenizerExceptionTest.java
+++ b/src/test/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/parser/tokenizer/TokenizerExceptionTest.java
@@ -1,4 +1,4 @@
-package ch.unibas.dmi.dbis.cs108.casono.server.tokenizer;
+package ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.parser.tokenizer;
import static org.junit.jupiter.api.Assertions.assertEquals;