From f619c5492374f4cc78b58fe2d68c9c65bb318398 Mon Sep 17 00:00:00 2001 From: "ZEIAD-LAPTOP\\zeiad" Date: Tue, 30 Dec 2025 10:28:20 +0200 Subject: [PATCH 01/11] implement MessageRouter and remove its logic from server, refactor Authentication Service update project architecture reformat all code files upgrade to java 25 for javafx usage later on --- nbactions.xml | 78 ++++---- pom.xml | 69 ++++--- .../com/mycompany/tictactoeserver/App.java | 38 ++-- .../datasource/database/Database.java | 32 ++-- .../datasource/database/dao/PlayerDAO.java | 22 +-- .../dao/{RoomDao.java => RoomDAO.java} | 54 +++--- .../datasource/model/ActivityPoint.java | 3 +- .../datasource/model/Player.java | 10 +- .../datasource/model/Room.java | 10 +- .../authentication/AuthenticationManager.java | 94 ---------- .../communication/CommunicationManager.java | 29 --- .../domain/communication/Message.java | 33 ---- .../domain/communication/MessageType.java | 18 -- .../domain/entity/AuthResponseEntity.java | 31 ++++ .../domain/entity/AuthenticationDto.java | 57 ------ .../domain/game/GameManager.java | 9 - .../security/ServerSecurityManager.java | 51 ------ .../domain/server/GameServerManager.java | 169 ++++++------------ .../server/PlayerConnectionHandler.java | 87 ++++----- .../domain/server/ServerManager.java | 21 --- .../authentication/AuthenticationService.java | 104 +++++++++++ .../domain/services/communication/Action.java | 32 ++++ .../{ => services}/communication/Header.java | 19 +- .../services/communication/Message.java | 45 +++++ .../services/communication/MessageRouter.java | 67 +++++++ .../services/communication/MessageType.java | 41 +++++ .../domain/services/game/GameManager.java | 7 + .../security/ServerSecurityManager.java | 49 +++++ .../statistics/StatisticsManager.java | 3 +- .../callbacks/PlayerHandlerCallback.java | 3 +- .../utils/callbacks/StringCallback.java | 3 +- .../domain/utils/callbacks/VoidCallback.java | 3 +- .../DatabaeDisConnectionException.java | 8 +- .../DatabaseConnectionException.java | 2 +- .../exception/ExceptionHandlerMiddleware.java | 27 +-- .../exception/HashingException.java | 10 +- .../exception/PlayerConnectionException.java | 2 +- .../exception/PlayerDeletionException.java | 2 +- .../exception/PlayerInsertionException.java | 4 +- .../exception/PlayerNotFoundException.java | 2 +- .../PlayerReceiveMessageException.java | 2 +- .../exception/PlayerSendMessageException.java | 2 +- .../exception/PlayerUpdateException.java | 2 +- .../exception/RoomCreationException.java | 14 +- .../exception/RoomNotFoundException.java | 10 +- .../exception/RoomUpdationException.java | 10 +- .../exception/ServerInterruptException.java | 2 +- .../exception/StopServerException.java | 2 +- .../presentation/MainScreenController.java | 11 +- src/main/java/module-info.java | 2 +- .../presentation/main_screen.fxml | 16 +- src/main/resources/database/database.sql | 51 +++--- 52 files changed, 722 insertions(+), 750 deletions(-) rename src/main/java/com/mycompany/tictactoeserver/datasource/database/dao/{RoomDao.java => RoomDAO.java} (62%) delete mode 100644 src/main/java/com/mycompany/tictactoeserver/domain/authentication/AuthenticationManager.java delete mode 100644 src/main/java/com/mycompany/tictactoeserver/domain/communication/CommunicationManager.java delete mode 100644 src/main/java/com/mycompany/tictactoeserver/domain/communication/Message.java delete mode 100644 src/main/java/com/mycompany/tictactoeserver/domain/communication/MessageType.java create mode 100644 src/main/java/com/mycompany/tictactoeserver/domain/entity/AuthResponseEntity.java delete mode 100644 src/main/java/com/mycompany/tictactoeserver/domain/entity/AuthenticationDto.java delete mode 100644 src/main/java/com/mycompany/tictactoeserver/domain/game/GameManager.java delete mode 100644 src/main/java/com/mycompany/tictactoeserver/domain/security/ServerSecurityManager.java delete mode 100644 src/main/java/com/mycompany/tictactoeserver/domain/server/ServerManager.java create mode 100644 src/main/java/com/mycompany/tictactoeserver/domain/services/authentication/AuthenticationService.java create mode 100644 src/main/java/com/mycompany/tictactoeserver/domain/services/communication/Action.java rename src/main/java/com/mycompany/tictactoeserver/domain/{ => services}/communication/Header.java (57%) create mode 100644 src/main/java/com/mycompany/tictactoeserver/domain/services/communication/Message.java create mode 100644 src/main/java/com/mycompany/tictactoeserver/domain/services/communication/MessageRouter.java create mode 100644 src/main/java/com/mycompany/tictactoeserver/domain/services/communication/MessageType.java create mode 100644 src/main/java/com/mycompany/tictactoeserver/domain/services/game/GameManager.java create mode 100644 src/main/java/com/mycompany/tictactoeserver/domain/services/security/ServerSecurityManager.java rename src/main/java/com/mycompany/tictactoeserver/domain/{ => services}/statistics/StatisticsManager.java (80%) rename src/main/java/com/mycompany/tictactoeserver/domain/{ => utils}/exception/DatabaeDisConnectionException.java (61%) rename src/main/java/com/mycompany/tictactoeserver/domain/{ => utils}/exception/DatabaseConnectionException.java (88%) rename src/main/java/com/mycompany/tictactoeserver/domain/{ => utils}/exception/ExceptionHandlerMiddleware.java (66%) rename src/main/java/com/mycompany/tictactoeserver/domain/{ => utils}/exception/HashingException.java (75%) rename src/main/java/com/mycompany/tictactoeserver/domain/{ => utils}/exception/PlayerConnectionException.java (78%) rename src/main/java/com/mycompany/tictactoeserver/domain/{ => utils}/exception/PlayerDeletionException.java (87%) rename src/main/java/com/mycompany/tictactoeserver/domain/{ => utils}/exception/PlayerInsertionException.java (76%) rename src/main/java/com/mycompany/tictactoeserver/domain/{ => utils}/exception/PlayerNotFoundException.java (87%) rename src/main/java/com/mycompany/tictactoeserver/domain/{ => utils}/exception/PlayerReceiveMessageException.java (79%) rename src/main/java/com/mycompany/tictactoeserver/domain/{ => utils}/exception/PlayerSendMessageException.java (78%) rename src/main/java/com/mycompany/tictactoeserver/domain/{ => utils}/exception/PlayerUpdateException.java (87%) rename src/main/java/com/mycompany/tictactoeserver/domain/{ => utils}/exception/RoomCreationException.java (63%) rename src/main/java/com/mycompany/tictactoeserver/domain/{ => utils}/exception/RoomNotFoundException.java (67%) rename src/main/java/com/mycompany/tictactoeserver/domain/{ => utils}/exception/RoomUpdationException.java (75%) rename src/main/java/com/mycompany/tictactoeserver/domain/{ => utils}/exception/ServerInterruptException.java (78%) rename src/main/java/com/mycompany/tictactoeserver/domain/{ => utils}/exception/StopServerException.java (77%) diff --git a/nbactions.xml b/nbactions.xml index a0cb38e..f53975f 100644 --- a/nbactions.xml +++ b/nbactions.xml @@ -1,40 +1,40 @@ - - - run - - jar - - - clean - javafx:run - - - - debug - - clean - javafx:run@ide-debug - - - true - - - - profile - - clean - javafx:run@ide-profile - - - - CUSTOM-jlink - jlink - - clean - - compile - javafx:jlink - - - + + + run + + jar + + + clean + javafx:run + + + + debug + + clean + javafx:run@ide-debug + + + true + + + + profile + + clean + javafx:run@ide-profile + + + + CUSTOM-jlink + jlink + + clean + + compile + javafx:jlink + + + diff --git a/pom.xml b/pom.xml index 2b6c6ce..0c550bf 100644 --- a/pom.xml +++ b/pom.xml @@ -1,93 +1,90 @@ - + + 4.0.0 + com.mycompany TicTacToeServer 1.0-SNAPSHOT + UTF-8 - 11 - 11 + 25 + 25.0.1 + org.openjfx javafx-controls - 13 + ${javafx.version} + org.openjfx javafx-fxml - 13 + ${javafx.version} + org.apache.derby derbyclient 10.9.1.0 + org.json json 20240303 + + org.apache.maven.plugins maven-compiler-plugin - 3.8.0 + 4.0.0-beta-3 - 11 + ${maven.compiler.release} + org.openjfx javafx-maven-plugin - 0.0.4 + 0.0.8 + com.mycompany.tictactoeserver.App + + + + - - default-cli + - - debug - - - - - - - ide-debug - - - - - - - - - ide-profile - - - - - - - + + + + + + diff --git a/src/main/java/com/mycompany/tictactoeserver/App.java b/src/main/java/com/mycompany/tictactoeserver/App.java index 22d34dc..79709be 100644 --- a/src/main/java/com/mycompany/tictactoeserver/App.java +++ b/src/main/java/com/mycompany/tictactoeserver/App.java @@ -1,31 +1,28 @@ package com.mycompany.tictactoeserver; import com.mycompany.tictactoeserver.datasource.database.Database; -import com.mycompany.tictactoeserver.domain.exception.DatabaseConnectionException; -import com.mycompany.tictactoeserver.domain.exception.ExceptionHandlerMiddleware; -import java.io.IOException; -import java.net.URL; +import com.mycompany.tictactoeserver.domain.services.communication.MessageRouter; +import com.mycompany.tictactoeserver.domain.utils.exception.DatabaseConnectionException; +import com.mycompany.tictactoeserver.domain.utils.exception.ExceptionHandlerMiddleware; import javafx.application.Application; import javafx.fxml.FXMLLoader; import javafx.scene.Parent; import javafx.scene.Scene; import javafx.stage.Stage; +import java.io.IOException; +import java.net.URL; + public class App extends Application { private static Scene scene; @Override public void start(Stage stage) throws IOException { - try { - Database db = Database.getInstance(); - db.connect(); - scene = new Scene(loadFXML("presentation/main_screen"), 640, 480); - stage.setScene(scene); - stage.show(); - } catch (DatabaseConnectionException ex) { - System.getLogger(App.class.getName()).log(System.Logger.Level.ERROR, (String) null, ex); - } + setupDependencies(); + scene = new Scene(loadFXML("presentation/main_screen"), 640, 480); + stage.setScene(scene); + stage.show(); } static void setRoot(String fxml) throws IOException { @@ -41,7 +38,7 @@ private static Parent loadFXML(String fxml) throws IOException { return fxmlLoader.load(); } - public static void main(String[] args) { + static void main(String[] args) { Thread.setDefaultUncaughtExceptionHandler((thread, throwable) -> { if (throwable instanceof Exception) { @@ -51,6 +48,19 @@ public static void main(String[] args) { } }); + launch(); } + + private void setupDependencies() { + try { + Database.getInstance().connect(); + + } catch (DatabaseConnectionException ex) { + System.getLogger(App.class.getName()).log(System.Logger.Level.ERROR, (String) null, ex); + } + + MessageRouter.getInstance(); + + } } \ No newline at end of file diff --git a/src/main/java/com/mycompany/tictactoeserver/datasource/database/Database.java b/src/main/java/com/mycompany/tictactoeserver/datasource/database/Database.java index 0843cea..da058d5 100644 --- a/src/main/java/com/mycompany/tictactoeserver/datasource/database/Database.java +++ b/src/main/java/com/mycompany/tictactoeserver/datasource/database/Database.java @@ -1,35 +1,33 @@ package com.mycompany.tictactoeserver.datasource.database; -import com.mycompany.tictactoeserver.domain.exception.DatabaeDisConnectionException; -import com.mycompany.tictactoeserver.domain.exception.DatabaseConnectionException; +import com.mycompany.tictactoeserver.domain.utils.exception.DatabaeDisConnectionException; +import com.mycompany.tictactoeserver.domain.utils.exception.DatabaseConnectionException; + import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class Database { - private static Database instance = null; private Connection connection = null; - private Database() { } + private static Database instance = null; + + private Database() { + } public static Database getInstance() { - - if (instance == null) { - synchronized (Database.class) { - if (instance == null) { - instance = new Database(); - } - } + synchronized (Database.class) { + if (instance == null) + instance = new Database(); } - + return instance; } - public void connect() throws DatabaseConnectionException{ - if (connection != null) { + public void connect() throws DatabaseConnectionException { + if (connection != null) return; - } try { connection = DriverManager.getConnection( @@ -42,13 +40,13 @@ public void connect() throws DatabaseConnectionException{ } } - public void disconnect() throws DatabaeDisConnectionException{ + public void disconnect() throws DatabaeDisConnectionException { try { if (connection != null && !connection.isClosed()) { connection.close(); } } catch (SQLException e) { - throw new DatabaeDisConnectionException(e.getStackTrace()); + throw new DatabaeDisConnectionException(e.getStackTrace()); } finally { connection = null; } diff --git a/src/main/java/com/mycompany/tictactoeserver/datasource/database/dao/PlayerDAO.java b/src/main/java/com/mycompany/tictactoeserver/datasource/database/dao/PlayerDAO.java index 059fc63..917509e 100644 --- a/src/main/java/com/mycompany/tictactoeserver/datasource/database/dao/PlayerDAO.java +++ b/src/main/java/com/mycompany/tictactoeserver/datasource/database/dao/PlayerDAO.java @@ -8,18 +8,12 @@ * * @author sheri */ + import com.mycompany.tictactoeserver.datasource.database.Database; import com.mycompany.tictactoeserver.datasource.model.Player; -import com.mycompany.tictactoeserver.domain.exception.ExceptionHandlerMiddleware; -import com.mycompany.tictactoeserver.domain.exception.PlayerDeletionException; -import com.mycompany.tictactoeserver.domain.exception.PlayerInsertionException; -import com.mycompany.tictactoeserver.domain.exception.PlayerNotFoundException; -import com.mycompany.tictactoeserver.domain.exception.PlayerUpdateException; -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; +import com.mycompany.tictactoeserver.domain.utils.exception.*; + +import java.sql.*; import java.util.ArrayList; import java.util.List; @@ -65,10 +59,10 @@ public Player findByUsername(String username) { try (PreparedStatement stmt = connection.prepareStatement(sql)) { stmt.setString(1, username); ResultSet rs = stmt.executeQuery(); - if (rs.next()) {return mapRow(rs);} - - else { - return null; + if (rs.next()) { + return mapRow(rs); + } else { + return null; } } catch (SQLException e) { exceptionHandler.handleException(new PlayerNotFoundException(e.getStackTrace())); diff --git a/src/main/java/com/mycompany/tictactoeserver/datasource/database/dao/RoomDao.java b/src/main/java/com/mycompany/tictactoeserver/datasource/database/dao/RoomDAO.java similarity index 62% rename from src/main/java/com/mycompany/tictactoeserver/datasource/database/dao/RoomDao.java rename to src/main/java/com/mycompany/tictactoeserver/datasource/database/dao/RoomDAO.java index 39919e8..9dcd2b8 100644 --- a/src/main/java/com/mycompany/tictactoeserver/datasource/database/dao/RoomDao.java +++ b/src/main/java/com/mycompany/tictactoeserver/datasource/database/dao/RoomDAO.java @@ -3,32 +3,32 @@ * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template */ package com.mycompany.tictactoeserver.datasource.database.dao; + import com.mycompany.tictactoeserver.datasource.database.Database; -import com.mycompany.tictactoeserver.domain.exception.*; import com.mycompany.tictactoeserver.datasource.model.Room; +import com.mycompany.tictactoeserver.domain.utils.exception.RoomCreationException; +import com.mycompany.tictactoeserver.domain.utils.exception.RoomNotFoundException; +import com.mycompany.tictactoeserver.domain.utils.exception.RoomUpdationException; + +import java.sql.*; -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Timestamp; /** * - * @author mahmoud + * @author mahmoud */ -public class RoomDao { - +public class RoomDAO { + private final Connection connection; - public RoomDao() { + public RoomDAO() { this.connection = Database.getInstance().getConnection(); } public void createRoom(Room room) throws RoomCreationException { -String sqlCreation = - "INSERT INTO ROOM (id, first_player_id, second_player_id, status, created_at) " + - "VALUES (?, ?, ?, ?, ?)"; + String sqlCreation = + "INSERT INTO ROOM (id, first_player_id, second_player_id, status, created_at) " + + "VALUES (?, ?, ?, ?, ?)"; try (PreparedStatement roomCreationStatement = connection.prepareStatement(sqlCreation)) { roomCreationStatement.setString(1, room.getId()); roomCreationStatement.setString(2, room.getFirstPlayerId()); @@ -40,24 +40,24 @@ public void createRoom(Room room) throws RoomCreationException { throw new RoomCreationException(ex.getStackTrace()); } } - - public void updateRoom(Room room) throws RoomUpdationException { - String sqlUpdate = "UPDATE ROOM SET first_player_id = ?, second_player_id = ?, winner_id = ?, status = ?, created_at = ? WHERE id = ?"; - try (PreparedStatement ps = connection.prepareStatement(sqlUpdate)) { - ps.setString(1, room.getFirstPlayerId()); - ps.setString(2, room.getSecondPlayerId()); - ps.setString(3, room.getWinnerId()); - ps.setInt(4, room.getStatus()); - ps.setTimestamp(5, Timestamp.valueOf(room.getCreatedAt())); - ps.setString(6, room.getId()); + public void updateRoom(Room room) throws RoomUpdationException { + String sqlUpdate = "UPDATE ROOM SET first_player_id = ?, second_player_id = ?, winner_id = ?, status = ?, created_at = ? WHERE id = ?"; - ps.executeUpdate(); - } catch (SQLException ex) { - throw new RoomUpdationException(ex.getStackTrace()); + try (PreparedStatement ps = connection.prepareStatement(sqlUpdate)) { + ps.setString(1, room.getFirstPlayerId()); + ps.setString(2, room.getSecondPlayerId()); + ps.setString(3, room.getWinnerId()); + ps.setInt(4, room.getStatus()); + ps.setTimestamp(5, Timestamp.valueOf(room.getCreatedAt())); + ps.setString(6, room.getId()); + + ps.executeUpdate(); + } catch (SQLException ex) { + throw new RoomUpdationException(ex.getStackTrace()); + } } -} public Room findRoomById(String roomId) throws RoomNotFoundException { String sqlSearchingByID = "SELECT * FROM ROOM WHERE id = ?"; diff --git a/src/main/java/com/mycompany/tictactoeserver/datasource/model/ActivityPoint.java b/src/main/java/com/mycompany/tictactoeserver/datasource/model/ActivityPoint.java index f292132..5e84398 100644 --- a/src/main/java/com/mycompany/tictactoeserver/datasource/model/ActivityPoint.java +++ b/src/main/java/com/mycompany/tictactoeserver/datasource/model/ActivityPoint.java @@ -2,6 +2,7 @@ import java.time.LocalDateTime; + public class ActivityPoint { private String playerId; private LocalDateTime startTime; @@ -12,7 +13,7 @@ public ActivityPoint() { } public ActivityPoint(String playerId) { - this.startTime = LocalDateTime.now(); + this.startTime = LocalDateTime.now(); this.playerId = playerId; } diff --git a/src/main/java/com/mycompany/tictactoeserver/datasource/model/Player.java b/src/main/java/com/mycompany/tictactoeserver/datasource/model/Player.java index a814774..a8825e1 100644 --- a/src/main/java/com/mycompany/tictactoeserver/datasource/model/Player.java +++ b/src/main/java/com/mycompany/tictactoeserver/datasource/model/Player.java @@ -4,12 +4,12 @@ public class Player { - final private String id; + final private String id; private String username; private String password; private int score; - - + + public Player() { this.id = UUID.randomUUID().toString(); this.score = 0; @@ -21,6 +21,7 @@ public Player(String username, String password) { this.password = password; this.score = 0; } + public Player(String username, String password, int score) { this.id = UUID.randomUUID().toString(); this.username = username; @@ -29,11 +30,10 @@ public Player(String username, String password, int score) { } - public String getId() { return id; } - + public String getUsername() { return username; } diff --git a/src/main/java/com/mycompany/tictactoeserver/datasource/model/Room.java b/src/main/java/com/mycompany/tictactoeserver/datasource/model/Room.java index ef0162f..432e371 100644 --- a/src/main/java/com/mycompany/tictactoeserver/datasource/model/Room.java +++ b/src/main/java/com/mycompany/tictactoeserver/datasource/model/Room.java @@ -10,19 +10,21 @@ public class Room { private String secondPlayerId; private String winnerId; private int status; - private LocalDateTime createdAt; + private LocalDateTime createdAt; public Room() { this.id = UUID.randomUUID().toString(); this.createdAt = LocalDateTime.now(); } - public Room(String firstPlayerId ) { - this.id = UUID.randomUUID().toString(); + + public Room(String firstPlayerId) { + this.id = UUID.randomUUID().toString(); this.createdAt = LocalDateTime.now(); this.firstPlayerId = firstPlayerId; } + public Room(String firstPlayerId, String secondPlayerId) { - this.id = UUID.randomUUID().toString(); + this.id = UUID.randomUUID().toString(); this.createdAt = LocalDateTime.now(); this.firstPlayerId = firstPlayerId; this.secondPlayerId = secondPlayerId; diff --git a/src/main/java/com/mycompany/tictactoeserver/domain/authentication/AuthenticationManager.java b/src/main/java/com/mycompany/tictactoeserver/domain/authentication/AuthenticationManager.java deleted file mode 100644 index f71f52f..0000000 --- a/src/main/java/com/mycompany/tictactoeserver/domain/authentication/AuthenticationManager.java +++ /dev/null @@ -1,94 +0,0 @@ -package com.mycompany.tictactoeserver.domain.authentication; - -import com.mycompany.tictactoeserver.datasource.database.dao.PlayerDAO; -import com.mycompany.tictactoeserver.datasource.model.Player; -import com.mycompany.tictactoeserver.domain.communication.Header; -import com.mycompany.tictactoeserver.domain.communication.Message; -import com.mycompany.tictactoeserver.domain.communication.MessageType; -import com.mycompany.tictactoeserver.domain.entity.AuthenticationDto; -import com.mycompany.tictactoeserver.domain.exception.ExceptionHandlerMiddleware; -import com.mycompany.tictactoeserver.domain.exception.HashingException; -import com.mycompany.tictactoeserver.domain.exception.ServerInterruptException; -import com.mycompany.tictactoeserver.domain.security.ServerSecurityManager; - -public class AuthenticationManager { - - - private static AuthenticationManager instance ; - private final PlayerDAO playerDao ; - - private AuthenticationManager() { - this.playerDao = new PlayerDAO(); - } - - public static AuthenticationManager getInstance() - { - if(instance==null) - instance= new AuthenticationManager(); - - return instance; - } - - - - - public Message register(String username , String plainTextPassword){ - - AuthenticationDto player = new AuthenticationDto( - playerDao.findByUsername(username) - ); - - if(!player.isPlayerFound()){ - - try { - String hashedPassword = ServerSecurityManager.hashText(plainTextPassword); - playerDao.insert(new Player(username , hashedPassword)); - player.setPassword(hashedPassword); - player.setUsername(username); - } catch (HashingException ex) { - ServerInterruptException customException = new ServerInterruptException(ex.getStackTrace()); - ExceptionHandlerMiddleware.getInstance().handleException(customException); - } - } - - - return new Message( new Header(MessageType.ERROR), player); - - } - - public Message login(String username , String plainTextPassword){ - - try { - AuthenticationDto player = new AuthenticationDto( - playerDao.findByUsername(username) - ); - - String hashedPassword = ServerSecurityManager.hashText(plainTextPassword); - Header messagHeader = new Header(); - - - - if( player.isPlayerFound() && - username.equals(player.getUsername()) && - hashedPassword.endsWith(player.getPassword())){ - - messagHeader.setMsgType(MessageType.RESPONSE); - } - else{ - messagHeader.setMsgType(MessageType.ERROR); - } - - return new Message( messagHeader, player); - } catch (HashingException ex) { - ServerInterruptException customException = new ServerInterruptException(ex.getStackTrace()); - ExceptionHandlerMiddleware.getInstance().handleException(customException); - } - return null ; - } - - - - - - -} diff --git a/src/main/java/com/mycompany/tictactoeserver/domain/communication/CommunicationManager.java b/src/main/java/com/mycompany/tictactoeserver/domain/communication/CommunicationManager.java deleted file mode 100644 index 12df134..0000000 --- a/src/main/java/com/mycompany/tictactoeserver/domain/communication/CommunicationManager.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license - * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template - */ -package com.mycompany.tictactoeserver.domain.communication; - -import org.json.JSONObject; - -/** - * - * @author Hazem - */ -public class CommunicationManager { - - public static JSONObject toJSON(Object msg) - { - JSONObject jsonMessage = new JSONObject(msg); - return jsonMessage; - } - - public static String fromJSON(JSONObject jsonMessage) - { - String msg = jsonMessage.toString(); - return msg; - } - - - -} diff --git a/src/main/java/com/mycompany/tictactoeserver/domain/communication/Message.java b/src/main/java/com/mycompany/tictactoeserver/domain/communication/Message.java deleted file mode 100644 index e91c91d..0000000 --- a/src/main/java/com/mycompany/tictactoeserver/domain/communication/Message.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license - * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template - */ -package com.mycompany.tictactoeserver.domain.communication; - -/** - * - * @author Hazem - */ -public class Message { - private Header header; - private Object data; - - public Message() { - header=null; - data=null; - } - - - public Message(Header header, Object data) { - this.header = header; - this.data = data; - } - - public Header getHeader() { - return header; - } - - public Object getData() { - return data; - } -} diff --git a/src/main/java/com/mycompany/tictactoeserver/domain/communication/MessageType.java b/src/main/java/com/mycompany/tictactoeserver/domain/communication/MessageType.java deleted file mode 100644 index bf9599d..0000000 --- a/src/main/java/com/mycompany/tictactoeserver/domain/communication/MessageType.java +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license - * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Enum.java to edit this template - */ -package com.mycompany.tictactoeserver.domain.communication; - -/** - * - * @author Hazem - */ -public enum MessageType { - REQUEST, - RESPONSE, - EVENT, - ERROR -} - - diff --git a/src/main/java/com/mycompany/tictactoeserver/domain/entity/AuthResponseEntity.java b/src/main/java/com/mycompany/tictactoeserver/domain/entity/AuthResponseEntity.java new file mode 100644 index 0000000..18f773c --- /dev/null +++ b/src/main/java/com/mycompany/tictactoeserver/domain/entity/AuthResponseEntity.java @@ -0,0 +1,31 @@ +package com.mycompany.tictactoeserver.domain.entity; + +import com.mycompany.tictactoeserver.datasource.model.Player; +import org.json.JSONObject; + +public class AuthResponseEntity { + String id; + String username; + int score; + + public AuthResponseEntity() { + } + + public AuthResponseEntity(Player player) { + id = player.getId(); + username = player.getUsername(); + score = player.getScore(); + } + + public JSONObject toJson() { + JSONObject json = new JSONObject(); + + json.put("id", id); + json.put("username", username); + json.put("score", score); + + return json; + + } + +} diff --git a/src/main/java/com/mycompany/tictactoeserver/domain/entity/AuthenticationDto.java b/src/main/java/com/mycompany/tictactoeserver/domain/entity/AuthenticationDto.java deleted file mode 100644 index b84516f..0000000 --- a/src/main/java/com/mycompany/tictactoeserver/domain/entity/AuthenticationDto.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.mycompany.tictactoeserver.domain.entity; - -import com.mycompany.tictactoeserver.datasource.model.Player; - -public class AuthenticationDto { - - private String username ; - private String password ; - - public AuthenticationDto() { - } - - public AuthenticationDto(Player player) { - if(player!=null) - { - this.username= player.getUsername(); - this.password= player.getPassword(); - } - else - { - this.username=null; - this.password=null; - } - } - - public AuthenticationDto(String username, String password) { - this.username = username; - this.password = password; - } - - public String getPassword() { - return password; - } - - public String getUsername() { - return username; - } - - public void setPassword(String password) { - this.password = password; - } - - public void setUsername(String username) { - this.username = username; - } - - public boolean isPlayerFound() - { - return username!=null; - } - - @Override - public String toString() - { - return "Username: " +username ; - } -} diff --git a/src/main/java/com/mycompany/tictactoeserver/domain/game/GameManager.java b/src/main/java/com/mycompany/tictactoeserver/domain/game/GameManager.java deleted file mode 100644 index 3f5d3ef..0000000 --- a/src/main/java/com/mycompany/tictactoeserver/domain/game/GameManager.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.mycompany.tictactoeserver.domain.game; - -import java.util.UUID; - -public interface GameManager { - void createRoom(); - - void addPlayer(UUID uuid); -} \ No newline at end of file diff --git a/src/main/java/com/mycompany/tictactoeserver/domain/security/ServerSecurityManager.java b/src/main/java/com/mycompany/tictactoeserver/domain/security/ServerSecurityManager.java deleted file mode 100644 index 027913a..0000000 --- a/src/main/java/com/mycompany/tictactoeserver/domain/security/ServerSecurityManager.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license - * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template - */ -package com.mycompany.tictactoeserver.domain.security; - -import com.mycompany.tictactoeserver.domain.exception.HashingException; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; - -/** - * - * @author Hazem - */ -public class ServerSecurityManager { - final static private String algorithm = "SHA-256"; - - public ServerSecurityManager() { - } - - public static String hashText(String text) throws HashingException { - - try { - byte[] rawText= text.getBytes(); - - MessageDigest messageDigest = MessageDigest.getInstance(algorithm); - - messageDigest.update(rawText); - - byte []encryptedrawText = messageDigest.digest(); - - String encryptedText = bytesToHex(encryptedrawText); - - return encryptedText; - } catch (NoSuchAlgorithmException ex) { - throw new HashingException(ex.getStackTrace()); - } - } - - private static String bytesToHex(byte []bytes) - { - StringBuilder hexString = new StringBuilder(); - - for (byte b : bytes){ - hexString.append(String.format("%02X", b)); - } - return hexString.toString(); - } - -} - diff --git a/src/main/java/com/mycompany/tictactoeserver/domain/server/GameServerManager.java b/src/main/java/com/mycompany/tictactoeserver/domain/server/GameServerManager.java index 7ed88e8..617f26c 100644 --- a/src/main/java/com/mycompany/tictactoeserver/domain/server/GameServerManager.java +++ b/src/main/java/com/mycompany/tictactoeserver/domain/server/GameServerManager.java @@ -1,17 +1,18 @@ package com.mycompany.tictactoeserver.domain.server; -import com.mycompany.tictactoeserver.domain.authentication.AuthenticationManager; -import com.mycompany.tictactoeserver.domain.communication.Message; -import com.mycompany.tictactoeserver.domain.exception.*; +import com.mycompany.tictactoeserver.domain.services.communication.MessageRouter; import com.mycompany.tictactoeserver.domain.utils.callbacks.PlayerHandlerCallback; +import com.mycompany.tictactoeserver.domain.utils.exception.ExceptionHandlerMiddleware; +import com.mycompany.tictactoeserver.domain.utils.exception.PlayerSendMessageException; +import com.mycompany.tictactoeserver.domain.utils.exception.ServerInterruptException; + import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.net.SocketException; import java.util.Vector; -import org.json.JSONObject; -public class GameServerManager implements ServerManager { +public class GameServerManager { private final Vector players = new Vector<>(); public Thread thread; private final ServerRunnable runnable; @@ -25,128 +26,78 @@ public static GameServerManager getInstance() { return instance; } - private GameServerManager() - { - runnable = new ServerRunnable(this::addListener); + private GameServerManager() { + runnable = new ServerRunnable(this::addPlayer); thread = new Thread(runnable); thread.start(); } - public boolean isRunning() - { + public boolean isRunning() { return runnable.isRunning(); } - @Override - public synchronized void start() - { - System.out.println("Starting GameServerManager"); - runnable.toggleRunning(); + public void start() { + synchronized (lock) { + System.out.println("Starting GameServerManager"); + runnable.toggleRunning(); + } } - @Override public void stop() { System.out.println("Stopping GameServerManager"); runnable.toggleRunning(); - Vector snapshot; + Vector copy; synchronized (lock) { - snapshot = new Vector<>(players); + copy = new Vector<>(players); players.clear(); } - for (PlayerConnectionHandler p : snapshot) { + for (PlayerConnectionHandler p : copy) { p.close(); } } - - - - @Override - public void broadcastMessage(String message) throws PlayerSendMessageException - { + public void broadcastMessage(String message) throws PlayerSendMessageException { synchronized (lock) { - for (PlayerConnectionHandler player : players) - { + for (PlayerConnectionHandler player : players) { sendMessage(message, player); } } } - @Override - public void sendMessage(String message, PlayerConnectionHandler player) throws PlayerSendMessageException - { + public void sendMessage(String message, PlayerConnectionHandler player) throws PlayerSendMessageException { player.sendMessageToPlayer(message); } - @Override - public void parseMessage(String message, PlayerConnectionHandler player) - { - mapFunction(message, player); - } + public void onReceiveMessage(String message, PlayerConnectionHandler sender) { + MessageRouter router = MessageRouter.getInstance(); - @Override - public void addListener(PlayerConnectionHandler player) { - synchronized (lock) { players.add(player); } + try { + router.navigateMessage(message, sender); + } catch (PlayerSendMessageException e) { + ExceptionHandlerMiddleware.getInstance().handleException(e); + } } - @Override - public void removeListener(PlayerConnectionHandler player) { - synchronized (lock) { players.remove(player); } + public void addPlayer(PlayerConnectionHandler player) { + synchronized (lock) { + players.add(player); + } } - private void mapFunction(String message, PlayerConnectionHandler player) - { - JSONObject jsonMessage= new JSONObject( message); - String functoin = jsonMessage.getString("function"); - String username = jsonMessage.getString("username"); - String password = jsonMessage.getString("password"); - AuthenticationManager auth = AuthenticationManager.getInstance(); - Message msg = new Message(); - switch (functoin) - { - - case "login": - { - msg = auth.login(username, password); - break; - } - case "register": - { - - msg=auth.register(username, password); - System.out.println("Assign message"); - break; - } - - default: - try - { - broadcastMessage(message); - } - catch (PlayerSendMessageException e) - { - throw new RuntimeException(e); - } - - } - try { - JSONObject obj = new JSONObject(msg); - System.out.println(msg.getData().toString()); - player.sendMessageToPlayer(obj.toString()); - } catch (PlayerSendMessageException ex) { - System.getLogger(GameServerManager.class.getName()).log(System.Logger.Level.ERROR, (String) null, ex); + public void removePlayer(PlayerConnectionHandler player) { + synchronized (lock) { + players.remove(player); } } } -class ServerRunnable implements Runnable -{ +class ServerRunnable implements Runnable { private volatile ServerSocket serverSocket; PlayerHandlerCallback onAdd; @@ -154,26 +105,20 @@ class ServerRunnable implements Runnable int PORT = 4321; - ServerRunnable(PlayerHandlerCallback onAdd) - { + ServerRunnable(PlayerHandlerCallback onAdd) { this.onAdd = onAdd; - try - { + try { serverSocket = new ServerSocket(PORT); - } - catch (IOException e) - { - ServerInterruptException interruptException = new ServerInterruptException(e.getStackTrace()); + } catch (IOException e) { + ServerInterruptException interruptException = new ServerInterruptException(e.getStackTrace()); ExceptionHandlerMiddleware.getInstance().handleException(interruptException); } } - public synchronized void toggleRunning() - { + public synchronized void toggleRunning() { isRunning = !isRunning; - if(isRunning) - { + if (isRunning) { notify(); System.out.println("Server Notified"); } @@ -184,17 +129,12 @@ public boolean isRunning() { } @Override - public void run() - { - - while (true) - { - try - { - synchronized (this) - { - if (!isRunning) - { + public void run() { + + while (true) { + try { + synchronized (this) { + if (!isRunning) { System.out.println("Server Waiting..."); serverSocket.close(); wait(); @@ -204,22 +144,15 @@ public void run() System.out.println("Server Accepting..."); Socket clientSocket = serverSocket.accept(); - if(isRunning) - { + if (isRunning) { onAdd.call(new PlayerConnectionHandler(clientSocket)); System.out.println("Client Connected: " + clientSocket.getInetAddress().getHostAddress()); - } - else - { + } else { clientSocket.close(); } - } - catch (SocketException | InterruptedException ex) - { + } catch (SocketException | InterruptedException ex) { System.out.println("Server Closed, Exception: ---> " + ex.getMessage()); - } - catch (IOException e) - { + } catch (IOException e) { ServerInterruptException customException = new ServerInterruptException(e.getStackTrace()); ExceptionHandlerMiddleware.getInstance().handleException(customException); } diff --git a/src/main/java/com/mycompany/tictactoeserver/domain/server/PlayerConnectionHandler.java b/src/main/java/com/mycompany/tictactoeserver/domain/server/PlayerConnectionHandler.java index 7d7b63e..1586b48 100644 --- a/src/main/java/com/mycompany/tictactoeserver/domain/server/PlayerConnectionHandler.java +++ b/src/main/java/com/mycompany/tictactoeserver/domain/server/PlayerConnectionHandler.java @@ -1,9 +1,12 @@ package com.mycompany.tictactoeserver.domain.server; import com.mycompany.tictactoeserver.datasource.model.Player; -import com.mycompany.tictactoeserver.domain.exception.*; import com.mycompany.tictactoeserver.domain.utils.callbacks.StringCallback; import com.mycompany.tictactoeserver.domain.utils.callbacks.VoidCallback; +import com.mycompany.tictactoeserver.domain.utils.exception.ExceptionHandlerMiddleware; +import com.mycompany.tictactoeserver.domain.utils.exception.PlayerConnectionException; +import com.mycompany.tictactoeserver.domain.utils.exception.PlayerSendMessageException; + import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; @@ -16,50 +19,42 @@ public class PlayerConnectionHandler { private final PlayerRunnable runnable; PlayerConnectionHandler(Socket socket) { - runnable = new PlayerRunnable(socket, this::receiveMessageFromPlayer, this::onCloseRunnable ); + runnable = new PlayerRunnable(socket, this::receiveMessageFromPlayer, this::onCloseRunnable); Thread thread = new Thread(runnable); thread.start(); } - public void sendMessageToPlayer(String message) throws PlayerSendMessageException - { + public void sendMessageToPlayer(String message) throws PlayerSendMessageException { runnable.sendMessageToSocket(message); } - public void receiveMessageFromPlayer(String message) - { - serverManager.parseMessage(message, this); + public void receiveMessageFromPlayer(String message) { + serverManager.onReceiveMessage(message, this); } - public void close() - { + public void close() { runnable.setRunning(false); runnable.close(); } - private void onCloseRunnable() - { - serverManager.removeListener(this); + private void onCloseRunnable() { + serverManager.removePlayer(this); } - - public Player getPlayer() - { + public Player getPlayer() { return player; } - public void setPlayer(Player player) - { + public void setPlayer(Player player) { this.player = player; } } -class PlayerRunnable implements Runnable -{ +class PlayerRunnable implements Runnable { private final Socket socket; private DataInputStream in; private DataOutputStream out; @@ -69,19 +64,15 @@ class PlayerRunnable implements Runnable private volatile boolean isRunning = true; - PlayerRunnable(Socket socket, StringCallback onReceive, VoidCallback onClose) - { + PlayerRunnable(Socket socket, StringCallback onReceive, VoidCallback onClose) { this.onReceive = onReceive; this.onClose = onClose; this.socket = socket; - try - { + try { this.in = new DataInputStream(socket.getInputStream()); this.out = new DataOutputStream(socket.getOutputStream()); - } - catch (IOException e) - { + } catch (IOException e) { close(); PlayerConnectionException connectionException = new PlayerConnectionException(e.getStackTrace()); ExceptionHandlerMiddleware.getInstance().handleException(connectionException); @@ -89,27 +80,20 @@ class PlayerRunnable implements Runnable } } - public synchronized void setRunning(boolean isRunning) - { + public synchronized void setRunning(boolean isRunning) { this.isRunning = isRunning; - if(this.isRunning) - { + if (this.isRunning) { notify(); System.out.println("Notified"); } } @Override - public void run() - { - try - { - while (true) - { - synchronized (this) - { - if (!isRunning) - { + public void run() { + try { + while (true) { + synchronized (this) { + if (!isRunning) { System.out.println("Player Waiting..."); wait(); } @@ -119,10 +103,7 @@ public void run() System.out.println("in: ---> " + msg); onReceive.call(msg); } - } - - catch (InterruptedException | IOException ex) - { + } catch (InterruptedException | IOException ex) { onClose.call(); close(); System.out.println("Client Disconnected"); @@ -139,24 +120,20 @@ public void sendMessageToSocket(String message) throws PlayerSendMessageExceptio } } - public void close() - { - try - { + public void close() { + try { if (in != null) in.close(); + } catch (IOException ignored) { } - catch (IOException ignored) {} - try - { + try { if (out != null) out.close(); + } catch (IOException ignored) { } - catch (IOException ignored) {} - try - { + try { if (socket != null && !socket.isClosed()) socket.close(); + } catch (IOException ignored) { } - catch (IOException ignored) {} } } \ No newline at end of file diff --git a/src/main/java/com/mycompany/tictactoeserver/domain/server/ServerManager.java b/src/main/java/com/mycompany/tictactoeserver/domain/server/ServerManager.java deleted file mode 100644 index e79c5f8..0000000 --- a/src/main/java/com/mycompany/tictactoeserver/domain/server/ServerManager.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.mycompany.tictactoeserver.domain.server; - -import com.mycompany.tictactoeserver.domain.exception.*; - -public interface ServerManager { - void start() ; - - void stop() throws StopServerException; - - void broadcastMessage(String message) throws PlayerSendMessageException; - - void sendMessage(String message, PlayerConnectionHandler player) throws PlayerSendMessageException; - - - void addListener(PlayerConnectionHandler listener); - - void removeListener(PlayerConnectionHandler listener); - - void parseMessage(String message, PlayerConnectionHandler player); - -} \ No newline at end of file diff --git a/src/main/java/com/mycompany/tictactoeserver/domain/services/authentication/AuthenticationService.java b/src/main/java/com/mycompany/tictactoeserver/domain/services/authentication/AuthenticationService.java new file mode 100644 index 0000000..c5bd818 --- /dev/null +++ b/src/main/java/com/mycompany/tictactoeserver/domain/services/authentication/AuthenticationService.java @@ -0,0 +1,104 @@ +package com.mycompany.tictactoeserver.domain.services.authentication; + +import com.mycompany.tictactoeserver.datasource.database.dao.PlayerDAO; +import com.mycompany.tictactoeserver.datasource.model.Player; +import com.mycompany.tictactoeserver.domain.entity.AuthResponseEntity; +import com.mycompany.tictactoeserver.domain.services.communication.Action; +import com.mycompany.tictactoeserver.domain.services.communication.Header; +import com.mycompany.tictactoeserver.domain.services.communication.Message; +import com.mycompany.tictactoeserver.domain.services.communication.MessageType; +import com.mycompany.tictactoeserver.domain.services.security.ServerSecurityManager; +import com.mycompany.tictactoeserver.domain.utils.exception.ExceptionHandlerMiddleware; +import com.mycompany.tictactoeserver.domain.utils.exception.HashingException; +import com.mycompany.tictactoeserver.domain.utils.exception.ServerInterruptException; +import org.json.JSONObject; + +public class AuthenticationService { + + + private static AuthenticationService instance; + private final PlayerDAO playerDao; + + private AuthenticationService() { + this.playerDao = new PlayerDAO(); + } + + public static AuthenticationService getInstance() { + if (instance == null) + instance = new AuthenticationService(); + + return instance; + } + + + public Message register(String username, String plainTextPassword) { + + Player player = playerDao.findByUsername(username); + + if (player != null) { + JSONObject json = new JSONObject(); + json.put("error", "Username already exists"); + return new Message(new Header(MessageType.ERROR, Action.REGISTER), json); + } + + AuthResponseEntity responseEntity; + + try { + + String hashedPassword = ServerSecurityManager.hashText(plainTextPassword); + Player newPlayer = new Player(username, hashedPassword); + playerDao.insert(newPlayer); + responseEntity = new AuthResponseEntity(newPlayer); + + } catch (HashingException ex) { + + ServerInterruptException customException = new ServerInterruptException(ex.getStackTrace()); + ExceptionHandlerMiddleware.getInstance().handleException(customException); + + JSONObject json = new JSONObject(); + json.put("error", "Internal Server Error"); + return new Message(new Header(MessageType.ERROR, Action.REGISTER), json); + + } + + + return new Message(new Header(MessageType.RESPONSE, Action.REGISTER), responseEntity.toJson()); + + } + + public Message login(String username, String plainTextPassword) { + + try { + + Player player = playerDao.findByUsername(username); + + if (player == null) { + JSONObject json = new JSONObject(); + json.put("error", "Invalid Credentials"); + return new Message(new Header(MessageType.ERROR, Action.LOGIN), json); + } + + + String hashedPassword = ServerSecurityManager.hashText(plainTextPassword); + if (!hashedPassword.equals(player.getPassword())) { + JSONObject json = new JSONObject(); + json.put("error", "Invalid Credentials"); + return new Message(new Header(MessageType.ERROR, Action.LOGIN), json); + } + + + AuthResponseEntity responseEntity = new AuthResponseEntity(player); + return new Message(new Header(MessageType.RESPONSE, Action.LOGIN), responseEntity.toJson()); + + } catch (HashingException ex) { + ServerInterruptException customException = new ServerInterruptException(ex.getStackTrace()); + ExceptionHandlerMiddleware.getInstance().handleException(customException); + + JSONObject json = new JSONObject(); + json.put("error", "Internal Server Error"); + return new Message(new Header(MessageType.ERROR, Action.LOGIN), json); + } + } + + +} \ No newline at end of file diff --git a/src/main/java/com/mycompany/tictactoeserver/domain/services/communication/Action.java b/src/main/java/com/mycompany/tictactoeserver/domain/services/communication/Action.java new file mode 100644 index 0000000..eec918c --- /dev/null +++ b/src/main/java/com/mycompany/tictactoeserver/domain/services/communication/Action.java @@ -0,0 +1,32 @@ +package com.mycompany.tictactoeserver.domain.services.communication; + +public enum Action { + LOGIN(10), + REGISTER(20), + REQUEST_GAME(30), + GAME_RESPONSE(40), + SEND_GAME_UPDATE(50); + + + final int id; + + Action(int id) { + this.id = id; + } + + public int getId() { + return id; + } + + public static Action valueOf(int id) { + for (Action action : Action.values()) { + if (action.getId() == id) { + return action; + } + } + + return null; + } + + +} diff --git a/src/main/java/com/mycompany/tictactoeserver/domain/communication/Header.java b/src/main/java/com/mycompany/tictactoeserver/domain/services/communication/Header.java similarity index 57% rename from src/main/java/com/mycompany/tictactoeserver/domain/communication/Header.java rename to src/main/java/com/mycompany/tictactoeserver/domain/services/communication/Header.java index bd7c17d..c38aa12 100644 --- a/src/main/java/com/mycompany/tictactoeserver/domain/communication/Header.java +++ b/src/main/java/com/mycompany/tictactoeserver/domain/services/communication/Header.java @@ -2,7 +2,7 @@ * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template */ -package com.mycompany.tictactoeserver.domain.communication; +package com.mycompany.tictactoeserver.domain.services.communication; /** * @@ -10,14 +10,16 @@ */ public class Header { - - private MessageType msgType ; + + private MessageType msgType; + private Action action; public Header() { } - public Header(MessageType msgType) { + public Header(MessageType msgType, Action action) { this.msgType = msgType; + this.action = action; } public MessageType getMsgType() { @@ -27,5 +29,12 @@ public MessageType getMsgType() { public void setMsgType(MessageType msgType) { this.msgType = msgType; } - + + public Action getAction() { + return action; + } + + public void setAction(Action action) { + this.action = action; + } } diff --git a/src/main/java/com/mycompany/tictactoeserver/domain/services/communication/Message.java b/src/main/java/com/mycompany/tictactoeserver/domain/services/communication/Message.java new file mode 100644 index 0000000..81f6fe0 --- /dev/null +++ b/src/main/java/com/mycompany/tictactoeserver/domain/services/communication/Message.java @@ -0,0 +1,45 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package com.mycompany.tictactoeserver.domain.services.communication; + +import org.json.JSONObject; + +/** + * + * @author Hazem + */ +public class Message { + private Header header = null; + private JSONObject data = null; + + public Message() { + } + + public Message(Header header, JSONObject data) { + this.header = header; + this.data = data; + } + + public Header getHeader() { + return header; + } + + public JSONObject getData() { + return data; + } + + public JSONObject toJson() { + JSONObject jsonMessage = new JSONObject(); + + jsonMessage.put("type", this.header.getMsgType()); + jsonMessage.put("action", this.header.getAction()); + + jsonMessage.put("data", this.data); + + + return jsonMessage; + + } +} diff --git a/src/main/java/com/mycompany/tictactoeserver/domain/services/communication/MessageRouter.java b/src/main/java/com/mycompany/tictactoeserver/domain/services/communication/MessageRouter.java new file mode 100644 index 0000000..a870237 --- /dev/null +++ b/src/main/java/com/mycompany/tictactoeserver/domain/services/communication/MessageRouter.java @@ -0,0 +1,67 @@ +package com.mycompany.tictactoeserver.domain.services.communication; + +import com.mycompany.tictactoeserver.domain.server.GameServerManager; +import com.mycompany.tictactoeserver.domain.server.PlayerConnectionHandler; +import com.mycompany.tictactoeserver.domain.services.authentication.AuthenticationService; +import com.mycompany.tictactoeserver.domain.utils.exception.PlayerSendMessageException; +import org.json.JSONObject; + +public class MessageRouter { + private static MessageRouter instance; + private final GameServerManager server; + + private MessageRouter() { + server = GameServerManager.getInstance(); + } + + public static MessageRouter getInstance() { + if (instance == null) { + instance = new MessageRouter(); + } + return instance; + } + + public void navigateMessage(String message, PlayerConnectionHandler sender) throws PlayerSendMessageException { + JSONObject json = new JSONObject(message); + + MessageType messageType = MessageType.valueOf(json.getInt("type")); + + assert messageType != null; + switch (messageType) { + case REQUEST: + Message msg = handleRequest(json); + server.sendMessage(msg.toJson().toString(), sender); + break; + case RESPONSE: + // Handle response messages + break; + case EVENT: + // Handle event messages + break; + case ERROR: + // Handle error messages + break; + default: + System.out.println("Unknown MessageType: " + messageType); + break; + } + } + + private Message handleRequest(JSONObject json) { + Action action = Action.valueOf(json.getInt("action")); + + assert action != null; + return switch (action) { + case LOGIN -> + AuthenticationService.getInstance().login(json.getString("username"), json.getString("password")); + case REGISTER -> + AuthenticationService.getInstance().register(json.getString("username"), json.getString("password")); + default -> { + System.out.println("Unknown Action: " + action); + yield new Message(); + } + }; + } + + +} diff --git a/src/main/java/com/mycompany/tictactoeserver/domain/services/communication/MessageType.java b/src/main/java/com/mycompany/tictactoeserver/domain/services/communication/MessageType.java new file mode 100644 index 0000000..b17266e --- /dev/null +++ b/src/main/java/com/mycompany/tictactoeserver/domain/services/communication/MessageType.java @@ -0,0 +1,41 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Enum.java to edit this template + */ +package com.mycompany.tictactoeserver.domain.services.communication; + +/** + * + * @author Hazem + */ +public enum MessageType { + REQUEST(10), + RESPONSE(20), + EVENT(30), + ERROR(40); + + final int id; + + MessageType(int id) { + this.id = id; + } + + public int getId() { + return id; + } + + public static MessageType valueOf(int id) { + for (MessageType type : MessageType.values()) { + if (type.getId() == id) { + return type; + } + } + + return null; + } + +} + + + + diff --git a/src/main/java/com/mycompany/tictactoeserver/domain/services/game/GameManager.java b/src/main/java/com/mycompany/tictactoeserver/domain/services/game/GameManager.java new file mode 100644 index 0000000..98500b5 --- /dev/null +++ b/src/main/java/com/mycompany/tictactoeserver/domain/services/game/GameManager.java @@ -0,0 +1,7 @@ +package com.mycompany.tictactoeserver.domain.services.game; + +public interface GameManager { + void createRoom(); + + void addPlayer(String uuid); +} \ No newline at end of file diff --git a/src/main/java/com/mycompany/tictactoeserver/domain/services/security/ServerSecurityManager.java b/src/main/java/com/mycompany/tictactoeserver/domain/services/security/ServerSecurityManager.java new file mode 100644 index 0000000..6d7367d --- /dev/null +++ b/src/main/java/com/mycompany/tictactoeserver/domain/services/security/ServerSecurityManager.java @@ -0,0 +1,49 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package com.mycompany.tictactoeserver.domain.services.security; + +import com.mycompany.tictactoeserver.domain.utils.exception.HashingException; + +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +/** + * + * @author Hazem + */ +public class ServerSecurityManager { + final static private String algorithm = "SHA-256"; + + public ServerSecurityManager() { + } + + public static String hashText(String text) throws HashingException { + + try { + byte[] rawText = text.getBytes(); + + MessageDigest messageDigest = MessageDigest.getInstance(algorithm); + + messageDigest.update(rawText); + + byte[] encryptedrawText = messageDigest.digest(); + + return bytesToHex(encryptedrawText); + } catch (NoSuchAlgorithmException ex) { + throw new HashingException(ex.getStackTrace()); + } + } + + private static String bytesToHex(byte[] bytes) { + StringBuilder hexString = new StringBuilder(); + + for (byte b : bytes) { + hexString.append(String.format("%02X", b)); + } + return hexString.toString(); + } + +} + diff --git a/src/main/java/com/mycompany/tictactoeserver/domain/statistics/StatisticsManager.java b/src/main/java/com/mycompany/tictactoeserver/domain/services/statistics/StatisticsManager.java similarity index 80% rename from src/main/java/com/mycompany/tictactoeserver/domain/statistics/StatisticsManager.java rename to src/main/java/com/mycompany/tictactoeserver/domain/services/statistics/StatisticsManager.java index 12eba58..aa75c0a 100644 --- a/src/main/java/com/mycompany/tictactoeserver/domain/statistics/StatisticsManager.java +++ b/src/main/java/com/mycompany/tictactoeserver/domain/services/statistics/StatisticsManager.java @@ -1,4 +1,4 @@ -package com.mycompany.tictactoeserver.domain.statistics; +package com.mycompany.tictactoeserver.domain.services.statistics; import com.mycompany.tictactoeserver.datasource.model.ActivityPoint; import com.mycompany.tictactoeserver.datasource.model.Player; @@ -7,5 +7,6 @@ public interface StatisticsManager { Vector getActivity(); + Vector getLeaderboard(); } diff --git a/src/main/java/com/mycompany/tictactoeserver/domain/utils/callbacks/PlayerHandlerCallback.java b/src/main/java/com/mycompany/tictactoeserver/domain/utils/callbacks/PlayerHandlerCallback.java index 279d7bf..be082cd 100644 --- a/src/main/java/com/mycompany/tictactoeserver/domain/utils/callbacks/PlayerHandlerCallback.java +++ b/src/main/java/com/mycompany/tictactoeserver/domain/utils/callbacks/PlayerHandlerCallback.java @@ -3,7 +3,6 @@ import com.mycompany.tictactoeserver.domain.server.PlayerConnectionHandler; @FunctionalInterface -public interface PlayerHandlerCallback -{ +public interface PlayerHandlerCallback { void call(PlayerConnectionHandler player); } diff --git a/src/main/java/com/mycompany/tictactoeserver/domain/utils/callbacks/StringCallback.java b/src/main/java/com/mycompany/tictactoeserver/domain/utils/callbacks/StringCallback.java index 6829d63..5cebc42 100644 --- a/src/main/java/com/mycompany/tictactoeserver/domain/utils/callbacks/StringCallback.java +++ b/src/main/java/com/mycompany/tictactoeserver/domain/utils/callbacks/StringCallback.java @@ -1,7 +1,6 @@ package com.mycompany.tictactoeserver.domain.utils.callbacks; @FunctionalInterface -public interface StringCallback -{ +public interface StringCallback { void call(String msg); } diff --git a/src/main/java/com/mycompany/tictactoeserver/domain/utils/callbacks/VoidCallback.java b/src/main/java/com/mycompany/tictactoeserver/domain/utils/callbacks/VoidCallback.java index 0653c70..00180fa 100644 --- a/src/main/java/com/mycompany/tictactoeserver/domain/utils/callbacks/VoidCallback.java +++ b/src/main/java/com/mycompany/tictactoeserver/domain/utils/callbacks/VoidCallback.java @@ -1,8 +1,7 @@ package com.mycompany.tictactoeserver.domain.utils.callbacks; @FunctionalInterface -public interface VoidCallback -{ +public interface VoidCallback { void call(); } diff --git a/src/main/java/com/mycompany/tictactoeserver/domain/exception/DatabaeDisConnectionException.java b/src/main/java/com/mycompany/tictactoeserver/domain/utils/exception/DatabaeDisConnectionException.java similarity index 61% rename from src/main/java/com/mycompany/tictactoeserver/domain/exception/DatabaeDisConnectionException.java rename to src/main/java/com/mycompany/tictactoeserver/domain/utils/exception/DatabaeDisConnectionException.java index aaf8325..3f743c1 100644 --- a/src/main/java/com/mycompany/tictactoeserver/domain/exception/DatabaeDisConnectionException.java +++ b/src/main/java/com/mycompany/tictactoeserver/domain/utils/exception/DatabaeDisConnectionException.java @@ -2,15 +2,15 @@ * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template */ -package com.mycompany.tictactoeserver.domain.exception; +package com.mycompany.tictactoeserver.domain.utils.exception; /** * * @author sheri */ -public class DatabaeDisConnectionException extends Exception{ - public DatabaeDisConnectionException(StackTraceElement[] stackTrace) { +public class DatabaeDisConnectionException extends Exception { + public DatabaeDisConnectionException(StackTraceElement[] stackTrace) { super("database-dis-connection-exception"); super.setStackTrace(stackTrace); - } + } } diff --git a/src/main/java/com/mycompany/tictactoeserver/domain/exception/DatabaseConnectionException.java b/src/main/java/com/mycompany/tictactoeserver/domain/utils/exception/DatabaseConnectionException.java similarity index 88% rename from src/main/java/com/mycompany/tictactoeserver/domain/exception/DatabaseConnectionException.java rename to src/main/java/com/mycompany/tictactoeserver/domain/utils/exception/DatabaseConnectionException.java index 9630fab..79651d5 100644 --- a/src/main/java/com/mycompany/tictactoeserver/domain/exception/DatabaseConnectionException.java +++ b/src/main/java/com/mycompany/tictactoeserver/domain/utils/exception/DatabaseConnectionException.java @@ -2,7 +2,7 @@ * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template */ -package com.mycompany.tictactoeserver.domain.exception; +package com.mycompany.tictactoeserver.domain.utils.exception; /** * diff --git a/src/main/java/com/mycompany/tictactoeserver/domain/exception/ExceptionHandlerMiddleware.java b/src/main/java/com/mycompany/tictactoeserver/domain/utils/exception/ExceptionHandlerMiddleware.java similarity index 66% rename from src/main/java/com/mycompany/tictactoeserver/domain/exception/ExceptionHandlerMiddleware.java rename to src/main/java/com/mycompany/tictactoeserver/domain/utils/exception/ExceptionHandlerMiddleware.java index 89d2373..f9489d9 100644 --- a/src/main/java/com/mycompany/tictactoeserver/domain/exception/ExceptionHandlerMiddleware.java +++ b/src/main/java/com/mycompany/tictactoeserver/domain/utils/exception/ExceptionHandlerMiddleware.java @@ -1,4 +1,4 @@ -package com.mycompany.tictactoeserver.domain.exception; +package com.mycompany.tictactoeserver.domain.utils.exception; import java.util.Arrays; @@ -17,9 +17,8 @@ public static ExceptionHandlerMiddleware getInstance() { } - public void handleException(Exception ex) { - + switch (ex.getMessage()) { case "start-server-exception": case "stop-server-exception": @@ -29,19 +28,10 @@ public void handleException(Exception ex) { case "database-connection-exception": case "database-dis-connection-exception": case "hashing-exception": - - System.out.println("hashing-exception"); - break; - case "room-not-found-exception": - System.out.println("room-not-found-exception"); - break; - case "room-updation-exception": - System.out.println("room-updation-exception"); - break; - case "room-creation-exception": - System.out.println("room-creation-exception"); - break; - case "player-insertion-exception": + case "room-not-found-exception": + case "room-updation-exception": + case "room-creation-exception": + case "player-insertion-exception": case "player-update-exception": case "player-deletion-exception": case "player-not-found-exception": @@ -49,13 +39,12 @@ public void handleException(Exception ex) { } - + logError(ex.getMessage(), ex.getStackTrace()); } - - private void logError(String message, StackTraceElement[] stackTrace){ + private void logError(String message, StackTraceElement[] stackTrace) { System.out.println(message + ": ---> " + Arrays.toString(stackTrace)); } diff --git a/src/main/java/com/mycompany/tictactoeserver/domain/exception/HashingException.java b/src/main/java/com/mycompany/tictactoeserver/domain/utils/exception/HashingException.java similarity index 75% rename from src/main/java/com/mycompany/tictactoeserver/domain/exception/HashingException.java rename to src/main/java/com/mycompany/tictactoeserver/domain/utils/exception/HashingException.java index 0eb9a6a..1c87475 100644 --- a/src/main/java/com/mycompany/tictactoeserver/domain/exception/HashingException.java +++ b/src/main/java/com/mycompany/tictactoeserver/domain/utils/exception/HashingException.java @@ -2,7 +2,7 @@ * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template */ -package com.mycompany.tictactoeserver.domain.exception; +package com.mycompany.tictactoeserver.domain.utils.exception; import java.security.NoSuchAlgorithmException; @@ -10,14 +10,12 @@ * * @author Hazem */ -public class HashingException extends NoSuchAlgorithmException{ +public class HashingException extends NoSuchAlgorithmException { public HashingException(StackTraceElement[] stackTrace) { super("hashing-exception"); super.setStackTrace(stackTrace); } - - - - + + } diff --git a/src/main/java/com/mycompany/tictactoeserver/domain/exception/PlayerConnectionException.java b/src/main/java/com/mycompany/tictactoeserver/domain/utils/exception/PlayerConnectionException.java similarity index 78% rename from src/main/java/com/mycompany/tictactoeserver/domain/exception/PlayerConnectionException.java rename to src/main/java/com/mycompany/tictactoeserver/domain/utils/exception/PlayerConnectionException.java index f83b481..a45aa1c 100644 --- a/src/main/java/com/mycompany/tictactoeserver/domain/exception/PlayerConnectionException.java +++ b/src/main/java/com/mycompany/tictactoeserver/domain/utils/exception/PlayerConnectionException.java @@ -1,4 +1,4 @@ -package com.mycompany.tictactoeserver.domain.exception; +package com.mycompany.tictactoeserver.domain.utils.exception; public class PlayerConnectionException extends Exception { diff --git a/src/main/java/com/mycompany/tictactoeserver/domain/exception/PlayerDeletionException.java b/src/main/java/com/mycompany/tictactoeserver/domain/utils/exception/PlayerDeletionException.java similarity index 87% rename from src/main/java/com/mycompany/tictactoeserver/domain/exception/PlayerDeletionException.java rename to src/main/java/com/mycompany/tictactoeserver/domain/utils/exception/PlayerDeletionException.java index 6b9be82..01d5bf9 100644 --- a/src/main/java/com/mycompany/tictactoeserver/domain/exception/PlayerDeletionException.java +++ b/src/main/java/com/mycompany/tictactoeserver/domain/utils/exception/PlayerDeletionException.java @@ -2,7 +2,7 @@ * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template */ -package com.mycompany.tictactoeserver.domain.exception; +package com.mycompany.tictactoeserver.domain.utils.exception; /** * diff --git a/src/main/java/com/mycompany/tictactoeserver/domain/exception/PlayerInsertionException.java b/src/main/java/com/mycompany/tictactoeserver/domain/utils/exception/PlayerInsertionException.java similarity index 76% rename from src/main/java/com/mycompany/tictactoeserver/domain/exception/PlayerInsertionException.java rename to src/main/java/com/mycompany/tictactoeserver/domain/utils/exception/PlayerInsertionException.java index 0e3f30e..30098b6 100644 --- a/src/main/java/com/mycompany/tictactoeserver/domain/exception/PlayerInsertionException.java +++ b/src/main/java/com/mycompany/tictactoeserver/domain/utils/exception/PlayerInsertionException.java @@ -2,13 +2,13 @@ * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template */ -package com.mycompany.tictactoeserver.domain.exception; +package com.mycompany.tictactoeserver.domain.utils.exception; /** * * @author sheri */ -public class PlayerInsertionException extends Exception{ +public class PlayerInsertionException extends Exception { public PlayerInsertionException(StackTraceElement[] stackTrace) { super("player-insertion-exception"); super.setStackTrace(stackTrace); diff --git a/src/main/java/com/mycompany/tictactoeserver/domain/exception/PlayerNotFoundException.java b/src/main/java/com/mycompany/tictactoeserver/domain/utils/exception/PlayerNotFoundException.java similarity index 87% rename from src/main/java/com/mycompany/tictactoeserver/domain/exception/PlayerNotFoundException.java rename to src/main/java/com/mycompany/tictactoeserver/domain/utils/exception/PlayerNotFoundException.java index c97b895..0bf7777 100644 --- a/src/main/java/com/mycompany/tictactoeserver/domain/exception/PlayerNotFoundException.java +++ b/src/main/java/com/mycompany/tictactoeserver/domain/utils/exception/PlayerNotFoundException.java @@ -2,7 +2,7 @@ * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template */ -package com.mycompany.tictactoeserver.domain.exception; +package com.mycompany.tictactoeserver.domain.utils.exception; /** * diff --git a/src/main/java/com/mycompany/tictactoeserver/domain/exception/PlayerReceiveMessageException.java b/src/main/java/com/mycompany/tictactoeserver/domain/utils/exception/PlayerReceiveMessageException.java similarity index 79% rename from src/main/java/com/mycompany/tictactoeserver/domain/exception/PlayerReceiveMessageException.java rename to src/main/java/com/mycompany/tictactoeserver/domain/utils/exception/PlayerReceiveMessageException.java index ae61e41..744b8cc 100644 --- a/src/main/java/com/mycompany/tictactoeserver/domain/exception/PlayerReceiveMessageException.java +++ b/src/main/java/com/mycompany/tictactoeserver/domain/utils/exception/PlayerReceiveMessageException.java @@ -1,4 +1,4 @@ -package com.mycompany.tictactoeserver.domain.exception; +package com.mycompany.tictactoeserver.domain.utils.exception; public class PlayerReceiveMessageException extends Exception { diff --git a/src/main/java/com/mycompany/tictactoeserver/domain/exception/PlayerSendMessageException.java b/src/main/java/com/mycompany/tictactoeserver/domain/utils/exception/PlayerSendMessageException.java similarity index 78% rename from src/main/java/com/mycompany/tictactoeserver/domain/exception/PlayerSendMessageException.java rename to src/main/java/com/mycompany/tictactoeserver/domain/utils/exception/PlayerSendMessageException.java index ec2e12c..4f4cb9c 100644 --- a/src/main/java/com/mycompany/tictactoeserver/domain/exception/PlayerSendMessageException.java +++ b/src/main/java/com/mycompany/tictactoeserver/domain/utils/exception/PlayerSendMessageException.java @@ -1,4 +1,4 @@ -package com.mycompany.tictactoeserver.domain.exception; +package com.mycompany.tictactoeserver.domain.utils.exception; public class PlayerSendMessageException extends Exception { diff --git a/src/main/java/com/mycompany/tictactoeserver/domain/exception/PlayerUpdateException.java b/src/main/java/com/mycompany/tictactoeserver/domain/utils/exception/PlayerUpdateException.java similarity index 87% rename from src/main/java/com/mycompany/tictactoeserver/domain/exception/PlayerUpdateException.java rename to src/main/java/com/mycompany/tictactoeserver/domain/utils/exception/PlayerUpdateException.java index 7e33afb..b252da9 100644 --- a/src/main/java/com/mycompany/tictactoeserver/domain/exception/PlayerUpdateException.java +++ b/src/main/java/com/mycompany/tictactoeserver/domain/utils/exception/PlayerUpdateException.java @@ -2,7 +2,7 @@ * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template */ -package com.mycompany.tictactoeserver.domain.exception; +package com.mycompany.tictactoeserver.domain.utils.exception; /** * diff --git a/src/main/java/com/mycompany/tictactoeserver/domain/exception/RoomCreationException.java b/src/main/java/com/mycompany/tictactoeserver/domain/utils/exception/RoomCreationException.java similarity index 63% rename from src/main/java/com/mycompany/tictactoeserver/domain/exception/RoomCreationException.java rename to src/main/java/com/mycompany/tictactoeserver/domain/utils/exception/RoomCreationException.java index ecd0114..da72f89 100644 --- a/src/main/java/com/mycompany/tictactoeserver/domain/exception/RoomCreationException.java +++ b/src/main/java/com/mycompany/tictactoeserver/domain/utils/exception/RoomCreationException.java @@ -2,17 +2,17 @@ * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template */ -package com.mycompany.tictactoeserver.domain.exception; +package com.mycompany.tictactoeserver.domain.utils.exception; /** * - * @author mahmoud + * @author mahmoud */ -public class RoomCreationException extends Exception{ - - public RoomCreationException(StackTraceElement[] stackTrace){ - super("room-creation-exception"); +public class RoomCreationException extends Exception { + + public RoomCreationException(StackTraceElement[] stackTrace) { + super("room-creation-exception"); super.setStackTrace(stackTrace); } - + } diff --git a/src/main/java/com/mycompany/tictactoeserver/domain/exception/RoomNotFoundException.java b/src/main/java/com/mycompany/tictactoeserver/domain/utils/exception/RoomNotFoundException.java similarity index 67% rename from src/main/java/com/mycompany/tictactoeserver/domain/exception/RoomNotFoundException.java rename to src/main/java/com/mycompany/tictactoeserver/domain/utils/exception/RoomNotFoundException.java index 5c02434..aeb7dad 100644 --- a/src/main/java/com/mycompany/tictactoeserver/domain/exception/RoomNotFoundException.java +++ b/src/main/java/com/mycompany/tictactoeserver/domain/utils/exception/RoomNotFoundException.java @@ -2,16 +2,16 @@ * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template */ -package com.mycompany.tictactoeserver.domain.exception; +package com.mycompany.tictactoeserver.domain.utils.exception; /** * * @author mahmoud */ -public class RoomNotFoundException extends Exception{ - public RoomNotFoundException(StackTraceElement[] stackTrace){ - super("room-not-found-exception"); +public class RoomNotFoundException extends Exception { + public RoomNotFoundException(StackTraceElement[] stackTrace) { + super("room-not-found-exception"); super.setStackTrace(stackTrace); } - + } diff --git a/src/main/java/com/mycompany/tictactoeserver/domain/exception/RoomUpdationException.java b/src/main/java/com/mycompany/tictactoeserver/domain/utils/exception/RoomUpdationException.java similarity index 75% rename from src/main/java/com/mycompany/tictactoeserver/domain/exception/RoomUpdationException.java rename to src/main/java/com/mycompany/tictactoeserver/domain/utils/exception/RoomUpdationException.java index a529cca..2d082b3 100644 --- a/src/main/java/com/mycompany/tictactoeserver/domain/exception/RoomUpdationException.java +++ b/src/main/java/com/mycompany/tictactoeserver/domain/utils/exception/RoomUpdationException.java @@ -2,17 +2,17 @@ * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template */ -package com.mycompany.tictactoeserver.domain.exception; +package com.mycompany.tictactoeserver.domain.utils.exception; /** * * @author mahmoud */ -public class RoomUpdationException extends Exception{ - - public RoomUpdationException(StackTraceElement[] stackTrace){ +public class RoomUpdationException extends Exception { + + public RoomUpdationException(StackTraceElement[] stackTrace) { super("room-updation-exception"); super.setStackTrace(stackTrace); } - + } diff --git a/src/main/java/com/mycompany/tictactoeserver/domain/exception/ServerInterruptException.java b/src/main/java/com/mycompany/tictactoeserver/domain/utils/exception/ServerInterruptException.java similarity index 78% rename from src/main/java/com/mycompany/tictactoeserver/domain/exception/ServerInterruptException.java rename to src/main/java/com/mycompany/tictactoeserver/domain/utils/exception/ServerInterruptException.java index 9a52313..65a3b87 100644 --- a/src/main/java/com/mycompany/tictactoeserver/domain/exception/ServerInterruptException.java +++ b/src/main/java/com/mycompany/tictactoeserver/domain/utils/exception/ServerInterruptException.java @@ -1,4 +1,4 @@ -package com.mycompany.tictactoeserver.domain.exception; +package com.mycompany.tictactoeserver.domain.utils.exception; public class ServerInterruptException extends Exception { public ServerInterruptException(StackTraceElement[] stackTrace) { diff --git a/src/main/java/com/mycompany/tictactoeserver/domain/exception/StopServerException.java b/src/main/java/com/mycompany/tictactoeserver/domain/utils/exception/StopServerException.java similarity index 77% rename from src/main/java/com/mycompany/tictactoeserver/domain/exception/StopServerException.java rename to src/main/java/com/mycompany/tictactoeserver/domain/utils/exception/StopServerException.java index f45c149..3d11c15 100644 --- a/src/main/java/com/mycompany/tictactoeserver/domain/exception/StopServerException.java +++ b/src/main/java/com/mycompany/tictactoeserver/domain/utils/exception/StopServerException.java @@ -1,4 +1,4 @@ -package com.mycompany.tictactoeserver.domain.exception; +package com.mycompany.tictactoeserver.domain.utils.exception; public class StopServerException extends Exception { diff --git a/src/main/java/com/mycompany/tictactoeserver/presentation/MainScreenController.java b/src/main/java/com/mycompany/tictactoeserver/presentation/MainScreenController.java index 97da7ee..9cd2376 100644 --- a/src/main/java/com/mycompany/tictactoeserver/presentation/MainScreenController.java +++ b/src/main/java/com/mycompany/tictactoeserver/presentation/MainScreenController.java @@ -22,9 +22,8 @@ public void initialize(URL url, ResourceBundle resourceBundle) { private void toggleServer() { GameServerManager serverManager = GameServerManager.getInstance(); - try - { - if(!serverManager.isRunning()){ + try { + if (!serverManager.isRunning()) { serverManager.start(); centerButton.setText("Stop Server"); return; @@ -32,12 +31,10 @@ private void toggleServer() { serverManager.stop(); centerButton.setText("Start Server"); - } - catch (Exception e) - { + } catch (Exception e) { System.out.println("Msg: " + e.getMessage()); System.out.println("Trace: " + Arrays.toString(e.getStackTrace())); - showAlert(Alert.AlertType.ERROR, e.getMessage(), Arrays.toString(e.getStackTrace())); + showAlert(Alert.AlertType.ERROR, e.getMessage(), Arrays.toString(e.getStackTrace())); } } diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java index fb77551..0186d4b 100644 --- a/src/main/java/module-info.java +++ b/src/main/java/module-info.java @@ -12,7 +12,7 @@ exports com.mycompany.tictactoeserver; exports com.mycompany.tictactoeserver.presentation; exports com.mycompany.tictactoeserver.domain.server; - exports com.mycompany.tictactoeserver.domain.exception; + exports com.mycompany.tictactoeserver.domain.utils.exception; exports com.mycompany.tictactoeserver.domain.utils.callbacks; exports com.mycompany.tictactoeserver.datasource.model; diff --git a/src/main/resources/com/mycompany/tictactoeserver/presentation/main_screen.fxml b/src/main/resources/com/mycompany/tictactoeserver/presentation/main_screen.fxml index 09bce10..e97408b 100644 --- a/src/main/resources/com/mycompany/tictactoeserver/presentation/main_screen.fxml +++ b/src/main/resources/com/mycompany/tictactoeserver/presentation/main_screen.fxml @@ -1,10 +1,12 @@ - - - - -
-
+ + + +
+
diff --git a/src/main/resources/database/database.sql b/src/main/resources/database/database.sql index c42f2b1..ec8ad15 100644 --- a/src/main/resources/database/database.sql +++ b/src/main/resources/database/database.sql @@ -1,51 +1,54 @@ - -create table Player ( - id varchar(36) primary key, - username varchar(50) not null unique, +create table Player +( + id varchar(36) primary key, + username varchar(50) not null unique, password varchar(100) not null, - score int default 0 -- start with 0 scoree by default - + score int default 0 + ); -create table Room ( - id varchar(36) primary key, - first_player_id varchar(36), +create table Room +( + id varchar(36) primary key, + first_player_id varchar(36), second_player_id varchar(36), - winner_id varchar(36), - status int, - created_at timestamp default current_timestamp, + winner_id varchar(36), + status int, + created_at timestamp default current_timestamp, constraint fk_room_first_player foreign key (first_player_id) - references player(id), + references player (id), constraint fk_room_second_player foreign key (second_player_id) - references player(id), + references player (id), constraint fk_room_winner foreign key (winner_id) - references player(id) + references player (id) ); -create table Player_Room( +create table Player_Room +( player_id varchar(36), - room_id varchar(36), + room_id varchar(36), primary key (player_id, room_id), constraint fk_player_room_player foreign key (player_id) - references player(id), + references player (id), constraint fk_player_room_room foreign key (room_id) - references room(id) + references room (id) ); -create table Activity ( - player_id varchar(36), +create table Activity +( + player_id varchar(36), start_time timestamp, - end_time timestamp, - constraint pk_activity primary key(player_id, start_time), + end_time timestamp, + constraint pk_activity primary key (player_id, start_time), constraint fk_activity_player foreign key (player_id) - references player(id) + references player (id) ); From 9ccf833a5970004b70fa103de0690f3448e1b137 Mon Sep 17 00:00:00 2001 From: Hazem Abdelraouf <79346842+Hazem-0@users.noreply.github.com> Date: Tue, 30 Dec 2025 11:21:55 +0200 Subject: [PATCH 02/11] Refactor AuthenticationService package and imports Updated package structure and import statements in AuthenticationService. --- .../authentication/AuthenticationService.java | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/mycompany/tictactoeserver/domain/services/authentication/AuthenticationService.java b/src/main/java/com/mycompany/tictactoeserver/domain/services/authentication/AuthenticationService.java index c5bd818..791000a 100644 --- a/src/main/java/com/mycompany/tictactoeserver/domain/services/authentication/AuthenticationService.java +++ b/src/main/java/com/mycompany/tictactoeserver/domain/services/authentication/AuthenticationService.java @@ -1,16 +1,15 @@ -package com.mycompany.tictactoeserver.domain.services.authentication; +package com.mycompany.tictactoeserver.domain.server; import com.mycompany.tictactoeserver.datasource.database.dao.PlayerDAO; import com.mycompany.tictactoeserver.datasource.model.Player; +import com.mycompany.tictactoeserver.domain.communication.Header; +import com.mycompany.tictactoeserver.domain.communication.Message; +import com.mycompany.tictactoeserver.domain.communication.MessageType; import com.mycompany.tictactoeserver.domain.entity.AuthResponseEntity; -import com.mycompany.tictactoeserver.domain.services.communication.Action; -import com.mycompany.tictactoeserver.domain.services.communication.Header; -import com.mycompany.tictactoeserver.domain.services.communication.Message; -import com.mycompany.tictactoeserver.domain.services.communication.MessageType; -import com.mycompany.tictactoeserver.domain.services.security.ServerSecurityManager; -import com.mycompany.tictactoeserver.domain.utils.exception.ExceptionHandlerMiddleware; -import com.mycompany.tictactoeserver.domain.utils.exception.HashingException; -import com.mycompany.tictactoeserver.domain.utils.exception.ServerInterruptException; +import com.mycompany.tictactoeserver.domain.exception.ExceptionHandlerMiddleware; +import com.mycompany.tictactoeserver.domain.exception.HashingException; +import com.mycompany.tictactoeserver.domain.exception.ServerInterruptException; +import com.mycompany.tictactoeserver.domain.security.ServerSecurityManager; import org.json.JSONObject; public class AuthenticationService { @@ -101,4 +100,4 @@ public Message login(String username, String plainTextPassword) { } -} \ No newline at end of file +} From f549cc47c7b56e2cd6ae158666f961a5a38edda4 Mon Sep 17 00:00:00 2001 From: Hazem Abdelraouf <79346842+Hazem-0@users.noreply.github.com> Date: Tue, 30 Dec 2025 11:23:59 +0200 Subject: [PATCH 03/11] Fix AuthResponseEntity.java From f85268fa16e6ae7e3df97852bb6508b3535d3e52 Mon Sep 17 00:00:00 2001 From: zeiad mohammed <152809651+ZeiadT@users.noreply.github.com> Date: Tue, 30 Dec 2025 15:52:25 +0200 Subject: [PATCH 04/11] Fix formatting of debug options in pom.xml --- pom.xml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 2c41743..0c550bf 100644 --- a/pom.xml +++ b/pom.xml @@ -74,7 +74,8 @@ - + @@ -85,4 +86,5 @@ +
From 5e7d97e76e8cd3b7f12603209343d4ba71b5e042 Mon Sep 17 00:00:00 2001 From: zeiad mohammed <152809651+ZeiadT@users.noreply.github.com> Date: Tue, 30 Dec 2025 15:57:49 +0200 Subject: [PATCH 05/11] Update maven-compiler-plugin version to 3.13.0 --- pom.xml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/pom.xml b/pom.xml index 0c550bf..73eaa59 100644 --- a/pom.xml +++ b/pom.xml @@ -43,14 +43,14 @@ - - org.apache.maven.plugins - maven-compiler-plugin - 4.0.0-beta-3 - - ${maven.compiler.release} - - + + org.apache.maven.plugins + maven-compiler-plugin + 3.13.0 + + 25 + + org.openjfx From caa2899b9ce0c27ad903b42b505c312cea53e220 Mon Sep 17 00:00:00 2001 From: zeiad mohammed <152809651+ZeiadT@users.noreply.github.com> Date: Tue, 30 Dec 2025 16:04:16 +0200 Subject: [PATCH 06/11] Fix package declaration in AuthenticationService --- .../domain/services/authentication/AuthenticationService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/mycompany/tictactoeserver/domain/services/authentication/AuthenticationService.java b/src/main/java/com/mycompany/tictactoeserver/domain/services/authentication/AuthenticationService.java index 791000a..30c2354 100644 --- a/src/main/java/com/mycompany/tictactoeserver/domain/services/authentication/AuthenticationService.java +++ b/src/main/java/com/mycompany/tictactoeserver/domain/services/authentication/AuthenticationService.java @@ -1,4 +1,4 @@ -package com.mycompany.tictactoeserver.domain.server; +package com.mycompany.tictactoeserver.domain.service.authentication; import com.mycompany.tictactoeserver.datasource.database.dao.PlayerDAO; import com.mycompany.tictactoeserver.datasource.model.Player; From 6ab94ca10e21cd037bfb79f6420787447efa83dd Mon Sep 17 00:00:00 2001 From: zeiad mohammed <152809651+ZeiadT@users.noreply.github.com> Date: Tue, 30 Dec 2025 16:08:54 +0200 Subject: [PATCH 07/11] Fix package structure in AuthenticationService --- .../authentication/AuthenticationService.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/mycompany/tictactoeserver/domain/services/authentication/AuthenticationService.java b/src/main/java/com/mycompany/tictactoeserver/domain/services/authentication/AuthenticationService.java index 30c2354..091524c 100644 --- a/src/main/java/com/mycompany/tictactoeserver/domain/services/authentication/AuthenticationService.java +++ b/src/main/java/com/mycompany/tictactoeserver/domain/services/authentication/AuthenticationService.java @@ -1,15 +1,15 @@ -package com.mycompany.tictactoeserver.domain.service.authentication; +package com.mycompany.tictactoeserver.domain.services.authentication; import com.mycompany.tictactoeserver.datasource.database.dao.PlayerDAO; import com.mycompany.tictactoeserver.datasource.model.Player; -import com.mycompany.tictactoeserver.domain.communication.Header; -import com.mycompany.tictactoeserver.domain.communication.Message; -import com.mycompany.tictactoeserver.domain.communication.MessageType; +import com.mycompany.tictactoeserver.domain.services.communication.Header; +import com.mycompany.tictactoeserver.domain.services.communication.Message; +import com.mycompany.tictactoeserver.domain.services.communication.MessageType; import com.mycompany.tictactoeserver.domain.entity.AuthResponseEntity; -import com.mycompany.tictactoeserver.domain.exception.ExceptionHandlerMiddleware; -import com.mycompany.tictactoeserver.domain.exception.HashingException; -import com.mycompany.tictactoeserver.domain.exception.ServerInterruptException; -import com.mycompany.tictactoeserver.domain.security.ServerSecurityManager; +import com.mycompany.tictactoeserver.domain.utils.exception.ExceptionHandlerMiddleware; +import com.mycompany.tictactoeserver.domain.utils.exception.HashingException; +import com.mycompany.tictactoeserver.domain.utils.exception.ServerInterruptException; +import com.mycompany.tictactoeserver.domain.services.security.ServerSecurityManager; import org.json.JSONObject; public class AuthenticationService { From 3c20cc2d22d5fa37ae95518bcf13acf947dec37d Mon Sep 17 00:00:00 2001 From: Hazem Abdelraouf <79346842+Hazem-0@users.noreply.github.com> Date: Tue, 30 Dec 2025 16:18:11 +0200 Subject: [PATCH 08/11] Fix import and paths --- .../services/authentication/AuthenticationService.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/mycompany/tictactoeserver/domain/services/authentication/AuthenticationService.java b/src/main/java/com/mycompany/tictactoeserver/domain/services/authentication/AuthenticationService.java index 091524c..8b80e2c 100644 --- a/src/main/java/com/mycompany/tictactoeserver/domain/services/authentication/AuthenticationService.java +++ b/src/main/java/com/mycompany/tictactoeserver/domain/services/authentication/AuthenticationService.java @@ -2,14 +2,15 @@ import com.mycompany.tictactoeserver.datasource.database.dao.PlayerDAO; import com.mycompany.tictactoeserver.datasource.model.Player; +import com.mycompany.tictactoeserver.domain.entity.AuthResponseEntity; +import com.mycompany.tictactoeserver.domain.services.communication.Action; import com.mycompany.tictactoeserver.domain.services.communication.Header; import com.mycompany.tictactoeserver.domain.services.communication.Message; import com.mycompany.tictactoeserver.domain.services.communication.MessageType; -import com.mycompany.tictactoeserver.domain.entity.AuthResponseEntity; +import com.mycompany.tictactoeserver.domain.services.security.ServerSecurityManager; import com.mycompany.tictactoeserver.domain.utils.exception.ExceptionHandlerMiddleware; import com.mycompany.tictactoeserver.domain.utils.exception.HashingException; import com.mycompany.tictactoeserver.domain.utils.exception.ServerInterruptException; -import com.mycompany.tictactoeserver.domain.services.security.ServerSecurityManager; import org.json.JSONObject; public class AuthenticationService { From 357864573009aa57d8901090a935fa787f575a3e Mon Sep 17 00:00:00 2001 From: zeiad mohammed <152809651+ZeiadT@users.noreply.github.com> Date: Tue, 30 Dec 2025 16:25:43 +0200 Subject: [PATCH 09/11] Add unique ID generation to ActivityPoint constructor --- .../tictactoeserver/datasource/model/ActivityPoint.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/com/mycompany/tictactoeserver/datasource/model/ActivityPoint.java b/src/main/java/com/mycompany/tictactoeserver/datasource/model/ActivityPoint.java index 6761710..f5ae23c 100644 --- a/src/main/java/com/mycompany/tictactoeserver/datasource/model/ActivityPoint.java +++ b/src/main/java/com/mycompany/tictactoeserver/datasource/model/ActivityPoint.java @@ -18,6 +18,8 @@ public ActivityPoint() { public ActivityPoint(String playerId) { this.startTime = LocalDateTime.now(); this.playerId = playerId; + + this.id = UUID.randomUUID().toString(); } public String getId() { return id; From 25ef3b7fcc93f3c2307c90bfef7bed6718eeb152 Mon Sep 17 00:00:00 2001 From: "ZEIAD-LAPTOP\\zeiad" Date: Tue, 30 Dec 2025 20:18:49 +0200 Subject: [PATCH 10/11] implement MessageRouter and remove its logic from server, refactor Authentication Service update project architecture reformat all code files upgrade to java 25 for javafx usage later on --- pom.xml | 4 ++-- src/main/java/com/mycompany/tictactoeserver/App.java | 5 ----- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/pom.xml b/pom.xml index 0c550bf..d2433b8 100644 --- a/pom.xml +++ b/pom.xml @@ -46,9 +46,9 @@ org.apache.maven.plugins maven-compiler-plugin - 4.0.0-beta-3 + 3.13.0 - ${maven.compiler.release} + 25 diff --git a/src/main/java/com/mycompany/tictactoeserver/App.java b/src/main/java/com/mycompany/tictactoeserver/App.java index 79709be..328b769 100644 --- a/src/main/java/com/mycompany/tictactoeserver/App.java +++ b/src/main/java/com/mycompany/tictactoeserver/App.java @@ -53,12 +53,7 @@ static void main(String[] args) { } private void setupDependencies() { - try { - Database.getInstance().connect(); - } catch (DatabaseConnectionException ex) { - System.getLogger(App.class.getName()).log(System.Logger.Level.ERROR, (String) null, ex); - } MessageRouter.getInstance(); From 35525e0ba1587687794bf6aeba1a299783ddf9a9 Mon Sep 17 00:00:00 2001 From: "ZEIAD-LAPTOP\\zeiad" Date: Tue, 30 Dec 2025 20:34:56 +0200 Subject: [PATCH 11/11] implement MessageRouter and remove its logic from server, refactor Authentication Service update project architecture reformat all code files upgrade to java 25 for javafx usage later on --- src/main/java/com/mycompany/tictactoeserver/App.java | 7 +++++-- .../datasource/database/dao/ActivityDAO.java | 6 +++--- .../domain/services/statistics/ActivityService.java | 6 +++--- .../utils/exception/ActiveSessionExistsException.java | 2 +- .../domain/utils/exception/ActivityNotFoundException.java | 2 +- .../domain/utils/exception/DataAccessException.java | 2 +- 6 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/mycompany/tictactoeserver/App.java b/src/main/java/com/mycompany/tictactoeserver/App.java index 328b769..5eadb71 100644 --- a/src/main/java/com/mycompany/tictactoeserver/App.java +++ b/src/main/java/com/mycompany/tictactoeserver/App.java @@ -53,9 +53,12 @@ static void main(String[] args) { } private void setupDependencies() { - + try { + Database.getInstance().connect(); + } catch (DatabaseConnectionException e) { + ExceptionHandlerMiddleware.getInstance().handleException(e); + } MessageRouter.getInstance(); - } } \ No newline at end of file diff --git a/src/main/java/com/mycompany/tictactoeserver/datasource/database/dao/ActivityDAO.java b/src/main/java/com/mycompany/tictactoeserver/datasource/database/dao/ActivityDAO.java index a349f33..ba83946 100644 --- a/src/main/java/com/mycompany/tictactoeserver/datasource/database/dao/ActivityDAO.java +++ b/src/main/java/com/mycompany/tictactoeserver/datasource/database/dao/ActivityDAO.java @@ -2,9 +2,9 @@ import com.mycompany.tictactoeserver.datasource.database.Database; import com.mycompany.tictactoeserver.datasource.model.ActivityPoint; -import com.mycompany.tictactoeserver.domain.exception.ActiveSessionExistsException; -import com.mycompany.tictactoeserver.domain.exception.ActivityNotFoundException; -import com.mycompany.tictactoeserver.domain.exception.DataAccessException; +import com.mycompany.tictactoeserver.domain.utils.exception.ActiveSessionExistsException; +import com.mycompany.tictactoeserver.domain.utils.exception.ActivityNotFoundException; +import com.mycompany.tictactoeserver.domain.utils.exception.DataAccessException; import java.sql.*; import java.time.LocalDateTime; diff --git a/src/main/java/com/mycompany/tictactoeserver/domain/services/statistics/ActivityService.java b/src/main/java/com/mycompany/tictactoeserver/domain/services/statistics/ActivityService.java index 6cf24bf..2e40c25 100644 --- a/src/main/java/com/mycompany/tictactoeserver/domain/services/statistics/ActivityService.java +++ b/src/main/java/com/mycompany/tictactoeserver/domain/services/statistics/ActivityService.java @@ -1,8 +1,8 @@ -package com.mycompany.tictactoeserver.domain.statistics; +package com.mycompany.tictactoeserver.domain.services.statistics; -import com.mycompany.tictactoeserver.datasource.database.dao.ActivityDAO; +import com.mycompany.tictactoeserver.datasource.database.dao.*; import com.mycompany.tictactoeserver.datasource.model.ActivityPoint; -import com.mycompany.tictactoeserver.domain.exception.*; +import com.mycompany.tictactoeserver.domain.utils.exception.*; public class ActivityService { private final ActivityDAO activityDao; diff --git a/src/main/java/com/mycompany/tictactoeserver/domain/utils/exception/ActiveSessionExistsException.java b/src/main/java/com/mycompany/tictactoeserver/domain/utils/exception/ActiveSessionExistsException.java index 02b16ee..564924b 100644 --- a/src/main/java/com/mycompany/tictactoeserver/domain/utils/exception/ActiveSessionExistsException.java +++ b/src/main/java/com/mycompany/tictactoeserver/domain/utils/exception/ActiveSessionExistsException.java @@ -1,4 +1,4 @@ -package com.mycompany.tictactoeserver.domain.exception; +package com.mycompany.tictactoeserver.domain.utils.exception; public class ActiveSessionExistsException extends Exception { public ActiveSessionExistsException(StackTraceElement[] stackTraceElements) { diff --git a/src/main/java/com/mycompany/tictactoeserver/domain/utils/exception/ActivityNotFoundException.java b/src/main/java/com/mycompany/tictactoeserver/domain/utils/exception/ActivityNotFoundException.java index d8361b1..52fd9ed 100644 --- a/src/main/java/com/mycompany/tictactoeserver/domain/utils/exception/ActivityNotFoundException.java +++ b/src/main/java/com/mycompany/tictactoeserver/domain/utils/exception/ActivityNotFoundException.java @@ -1,4 +1,4 @@ -package com.mycompany.tictactoeserver.domain.exception; +package com.mycompany.tictactoeserver.domain.utils.exception; public class ActivityNotFoundException extends Exception { public ActivityNotFoundException(StackTraceElement[] stackTraceElements) { diff --git a/src/main/java/com/mycompany/tictactoeserver/domain/utils/exception/DataAccessException.java b/src/main/java/com/mycompany/tictactoeserver/domain/utils/exception/DataAccessException.java index 34e3b68..c8791b6 100644 --- a/src/main/java/com/mycompany/tictactoeserver/domain/utils/exception/DataAccessException.java +++ b/src/main/java/com/mycompany/tictactoeserver/domain/utils/exception/DataAccessException.java @@ -1,4 +1,4 @@ -package com.mycompany.tictactoeserver.domain.exception; +package com.mycompany.tictactoeserver.domain.utils.exception; public class DataAccessException extends Exception { public DataAccessException(StackTraceElement[] stackTraceElements) {