diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/NetworkManager.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/NetworkManager.java index 880bd56..50b53d9 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/NetworkManager.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/NetworkManager.java @@ -14,7 +14,7 @@ import ch.unibas.dmi.dbis.cs108.casono.server.network.sessions.SessionManager; import ch.unibas.dmi.dbis.cs108.casono.server.network.transport.TcpTransport; /** - * Creates and manages the server socket. Accepts new incomming connections and creates sessions. + * Creates and manages the server socket. Accepts new incoming connections and creates sessions. */ public class NetworkManager implements Runnable { private Integer port; @@ -24,6 +24,13 @@ public class NetworkManager implements Runnable { private SessionManager sessionManager; private EventBus eventBus; + /** + * Creates a new NetworkManager with the given port, session manager, and event bus. + * + * @param port the port to listen on + * @param sessionManager the session manager to use + * @param eventBus the event bus for events + */ public NetworkManager(Integer port, SessionManager sessionManager, EventBus eventBus) { this.port = port; this.logger = LogManager.getLogger(NetworkManager.class); @@ -34,17 +41,26 @@ public class NetworkManager implements Runnable { this.eventBus.subscribe(DisconnectEvent.class, event -> clientDisconnected(event)); } - /* Starts the internal thread to accept new connections. + /** + * Starts the internal thread to accept new connections. */ public void start() { logger.debug("Starting server at port " + port); thread.start(); } + /** + * Handles client disconnection events. + * + * @param event the disconnect event + */ public void clientDisconnected(DisconnectEvent event) { logger.info("Session " + event.sessionId().value() + " disconnected adhasghd"); } + /** + * Runs the network manager loop, accepting connections. + */ @Override public void run() { try (ServerSocket serverSocket = new ServerSocket(port)) { diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/events/DisconnectEvent.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/events/DisconnectEvent.java index 65f8152..b6b0d78 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/events/DisconnectEvent.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/events/DisconnectEvent.java @@ -2,4 +2,7 @@ package ch.unibas.dmi.dbis.cs108.casono.server.network.events; import ch.unibas.dmi.dbis.cs108.casono.server.network.sessions.SessionId; +/** + * Represents a disconnect event for a session. + */ public record DisconnectEvent(SessionId sessionId) implements Event {} diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/events/Event.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/events/Event.java index 4fb6948..75c0954 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/events/Event.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/events/Event.java @@ -1,3 +1,6 @@ package ch.unibas.dmi.dbis.cs108.casono.server.network.events; +/** + * Marker interface for events in the event bus system. + */ interface Event {} diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/events/EventBus.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/events/EventBus.java index 6644313..4141ab8 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/events/EventBus.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/events/EventBus.java @@ -7,15 +7,29 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CopyOnWriteArrayList; import java.util.function.Consumer; +/** + * A simple event bus for publishing and subscribing to events. + */ public class EventBus { private final Map, List>> handlers = new ConcurrentHashMap<>(); + /** + * Subscribes a handler to a specific event type. + * + * @param eventType the class of the event to subscribe to + * @param handler the consumer to handle the event + */ @SuppressWarnings("unchecked") // This cast is safe, because handlers only get passed the type they subscribed to public void subscribe(Class eventType, Consumer handler) { handlers.computeIfAbsent(eventType, k -> new CopyOnWriteArrayList<>()) .add((Consumer) (Consumer) handler); } + /** + * Publishes an event to all subscribed handlers. + * + * @param event the event to publish + */ public void publish(T event) { Objects.requireNonNull(event, "event must not be null"); List> subscribers = handlers.get(event.getClass()); diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/sessions/Session.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/sessions/Session.java index e2ece59..9b2f344 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/sessions/Session.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/sessions/Session.java @@ -9,6 +9,9 @@ import ch.unibas.dmi.dbis.cs108.casono.server.network.events.DisconnectEvent; import ch.unibas.dmi.dbis.cs108.casono.server.network.events.EventBus; import ch.unibas.dmi.dbis.cs108.casono.server.network.transport.TransportLayer; +/** + * Represents a client session in the network server. + */ public class Session implements Runnable { private SessionId id; private Thread thread; @@ -17,6 +20,13 @@ public class Session implements Runnable { private Boolean running; private EventBus eventBus; + /** + * Creates a new Session with the given transport and event bus. + * + * @param transport the transport layer for communication + * @param eventBus the event bus for publishing events + * @throws IOException if an I/O error occurs during initialization + */ public Session(TransportLayer transport, EventBus eventBus) throws IOException { this.id = new SessionId(); this.thread = new Thread(this, "session-" + this.id.value()); @@ -28,19 +38,35 @@ public class Session implements Runnable { this.logger.info("Created new session"); } + /** + * Returns the ID of this session. + * + * @return the session ID + */ public SessionId getId() { return this.id; } + /** + * Starts the session thread. + */ public void start() { thread.start(); } + /** + * Closes the session and its transport. + * + * @throws IOException if an I/O error occurs + */ public void close() throws IOException { transport.close(); this.running = false; } + /** + * Runs the session loop, reading from the transport. + */ @Override public void run() { while (running) { diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/sessions/SessionId.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/sessions/SessionId.java index 117dba3..431ebdc 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/sessions/SessionId.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/sessions/SessionId.java @@ -2,20 +2,33 @@ package ch.unibas.dmi.dbis.cs108.casono.server.network.sessions; import java.util.UUID; +/** + * Represents a unique identifier for a session. + */ public class SessionId { - /** - * The SessionId is used to identify a unique client connection in the SessionRegistry - */ private final UUID value; + /** + * Creates a new SessionId with a randomly generated UUID. + */ public SessionId() { this.value = UUID.randomUUID(); } + /** + * Creates a new SessionId with the specified UUID. + * + * @param UUID to use for this SessionId + */ public SessionId(UUID value) { this.value = value; } + /** + * Returns the UUID value of this SessionId. + * + * @return the UUID value + */ public UUID value() { return value; } diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/sessions/SessionManager.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/sessions/SessionManager.java index f583be1..42bc4ac 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/sessions/SessionManager.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/sessions/SessionManager.java @@ -3,27 +3,56 @@ package ch.unibas.dmi.dbis.cs108.casono.server.network.sessions; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +/** + * Manages active sessions in the server. + */ public class SessionManager { private Map sessions; + /** + * Constructs a new SessionManager. + */ public SessionManager() { this.sessions = new ConcurrentHashMap<>(); } + /** + * Adds a session to the manager. + * + * @param session the session to add + */ public void addSession(Session session) { sessions.put(session.getId(), session); System.out.println("Added session " + session.getId().value() + " to session manager"); } + /** + * Removes a session by its ID. + * + * @param id the ID of the session to remove + * @return the removed session, or null if not found + */ public Session removeSession(SessionId id) { System.out.println("Removed session " + id.value() + " from session manager"); return sessions.remove(id); } + /** + * Removes the specified session. + * + * @param session the session to remove + * @return the removed session, or null if not found + */ public Session removeSession(Session session) { return sessions.remove(session.getId()); } + /** + * Retrieves a session by its ID. + * + * @param id the ID of the session to retrieve + * @return the session with the specified ID, or null if not found + */ public Session getSessionById(SessionId id) { return sessions.get(id); } diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/transport/TcpTransport.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/transport/TcpTransport.java index 6a761e6..3f80d6c 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/transport/TcpTransport.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/transport/TcpTransport.java @@ -6,17 +6,32 @@ import java.io.IOException; import java.net.Socket; import java.nio.charset.StandardCharsets; +/** + * Implements TCP-based transport layer for network communication. + */ public class TcpTransport implements TransportLayer { private Socket socket; private DataInputStream in; private DataOutputStream out; + /** + * Creates a new TcpTransport with the given socket. + * + * @param socket the socket to use for communication + * @throws IOException if an I/O error occurs + */ public TcpTransport(Socket socket) throws IOException { this.socket = socket; this.in = new DataInputStream(socket.getInputStream()); this.out = new DataOutputStream(socket.getOutputStream()); } + /** + * Reads a string from the socket. + * + * @return the read string + * @throws IOException if an I/O error occurs + */ public String read() throws IOException { int length = in.readInt(); byte[] payload = new byte[length]; @@ -24,6 +39,12 @@ public class TcpTransport implements TransportLayer { return new String(payload, StandardCharsets.UTF_8); } + /** + * Writes a string to the socket. + * + * @param payload the string to write + * @throws IOException if an I/O error occurs + */ public void write(String payload) throws IOException { byte[] rawPayload = payload.getBytes(StandardCharsets.UTF_8); out.writeInt(rawPayload.length); @@ -31,6 +52,11 @@ public class TcpTransport implements TransportLayer { out.flush(); } + /** + * Closes the socket. + * + * @throws IOException if an I/O error occurs + */ public void close() throws IOException { socket.close(); } diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/transport/TransportLayer.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/transport/TransportLayer.java index a4453e4..f487a9c 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/transport/TransportLayer.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/transport/TransportLayer.java @@ -2,8 +2,30 @@ package ch.unibas.dmi.dbis.cs108.casono.server.network.transport; import java.io.IOException; +/** + * Interface for transport layer implementations. + */ public interface TransportLayer { + /** + * Reads data from the transport layer. + * + * @return the read data as a string + * @throws IOException if an I/O error occurs + */ String read() throws IOException; + + /** + * Writes data to the transport layer. + * + * @param data the data to write + * @throws IOException if an I/O error occurs + */ void write(String data) throws IOException; + + /** + * Closes the transport layer. + * + * @throws IOException if an I/O error occurs + */ void close() throws IOException; }