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;