Merge branch 'feat/use-parser-dispatcher-in-reader' into 'main'

Made SessionReader invoke parsing of request with CommandParserDispatcher uppon recieving request

Closes #13

See merge request cs108-fs26/Gruppe-13!46
This commit was merged in pull request #202.
This commit is contained in:
Lars Simon Winzer
2026-03-25 19:39:14 +01:00
4 changed files with 28 additions and 4 deletions
@@ -5,6 +5,7 @@ import ch.unibas.dmi.dbis.cs108.casono.server.domain.user.UserRegistry;
import ch.unibas.dmi.dbis.cs108.casono.server.network.NetworkManager; import ch.unibas.dmi.dbis.cs108.casono.server.network.NetworkManager;
import ch.unibas.dmi.dbis.cs108.casono.server.network.events.DisconnectEvent; 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.events.EventBus;
import ch.unibas.dmi.dbis.cs108.casono.server.network.parser.CommandParserDispatcher;
import ch.unibas.dmi.dbis.cs108.casono.server.network.sessions.SessionManager; import ch.unibas.dmi.dbis.cs108.casono.server.network.sessions.SessionManager;
import java.time.Duration; import java.time.Duration;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
@@ -26,7 +27,8 @@ public class ServerApp {
logger.info("Starting server at port {}", port); logger.info("Starting server at port {}", port);
EventBus eventBus = new EventBus(); EventBus eventBus = new EventBus();
SessionManager sessionManager = new SessionManager(eventBus); CommandParserDispatcher dispatcher = new CommandParserDispatcher();
SessionManager sessionManager = new SessionManager(eventBus, dispatcher);
eventBus.subscribe(DisconnectEvent.class, event -> sessionManager.onDisconnect(event)); eventBus.subscribe(DisconnectEvent.class, event -> sessionManager.onDisconnect(event));
NetworkManager networkManager = new NetworkManager(port, sessionManager); NetworkManager networkManager = new NetworkManager(port, sessionManager);
@@ -1,6 +1,7 @@
package ch.unibas.dmi.dbis.cs108.casono.server.network.sessions; package ch.unibas.dmi.dbis.cs108.casono.server.network.sessions;
import ch.unibas.dmi.dbis.cs108.casono.server.network.events.EventBus; import ch.unibas.dmi.dbis.cs108.casono.server.network.events.EventBus;
import ch.unibas.dmi.dbis.cs108.casono.server.network.parser.CommandParserDispatcher;
import ch.unibas.dmi.dbis.cs108.casono.server.network.response.PrimitiveResponse; import ch.unibas.dmi.dbis.cs108.casono.server.network.response.PrimitiveResponse;
import ch.unibas.dmi.dbis.cs108.casono.server.network.transport.TransportLayer; import ch.unibas.dmi.dbis.cs108.casono.server.network.transport.TransportLayer;
import java.io.IOException; import java.io.IOException;
@@ -12,6 +13,7 @@ public class Session {
private final SessionId id; private final SessionId id;
private final TransportLayer transport; private final TransportLayer transport;
private final BlockingQueue<PrimitiveResponse> responseQueue; private final BlockingQueue<PrimitiveResponse> responseQueue;
private final CommandParserDispatcher dispatcher;
private static final int RESPOND_QUEUE_SIZE = 32; private static final int RESPOND_QUEUE_SIZE = 32;
/** /**
@@ -21,9 +23,11 @@ public class Session {
* @param eventBus the event bus for publishing events * @param eventBus the event bus for publishing events
* @throws IOException if an I/O error occurs during initialization * @throws IOException if an I/O error occurs during initialization
*/ */
public Session(TransportLayer transport, EventBus eventBus) { public Session(
TransportLayer transport, EventBus eventBus, CommandParserDispatcher dispatcher) {
this.id = new SessionId(); this.id = new SessionId();
this.transport = transport; this.transport = transport;
this.dispatcher = dispatcher;
this.responseQueue = new ArrayBlockingQueue<>(RESPOND_QUEUE_SIZE); this.responseQueue = new ArrayBlockingQueue<>(RESPOND_QUEUE_SIZE);
} }
@@ -53,4 +57,13 @@ public class Session {
public BlockingQueue<PrimitiveResponse> getResponseQueue() { public BlockingQueue<PrimitiveResponse> getResponseQueue() {
return responseQueue; return responseQueue;
} }
/**
* Returns the CommandParserDispatcher of this session
*
* @return the dispatcher to dispatch PrimitiveRequests to for parsing
*/
public CommandParserDispatcher getDispatcher() {
return dispatcher;
}
} }
@@ -2,6 +2,7 @@ package ch.unibas.dmi.dbis.cs108.casono.server.network.sessions;
import ch.unibas.dmi.dbis.cs108.casono.server.network.events.DisconnectEvent; import ch.unibas.dmi.dbis.cs108.casono.server.network.events.DisconnectEvent;
import ch.unibas.dmi.dbis.cs108.casono.server.network.events.EventBus; import ch.unibas.dmi.dbis.cs108.casono.server.network.events.EventBus;
import ch.unibas.dmi.dbis.cs108.casono.server.network.parser.CommandParserDispatcher;
import ch.unibas.dmi.dbis.cs108.casono.server.network.transport.TransportLayer; import ch.unibas.dmi.dbis.cs108.casono.server.network.transport.TransportLayer;
import java.io.IOException; import java.io.IOException;
import java.util.Map; import java.util.Map;
@@ -14,12 +15,14 @@ public class SessionManager {
private Map<SessionId, SessionHandle> sessions; private Map<SessionId, SessionHandle> sessions;
private final EventBus eventBus; private final EventBus eventBus;
private final Logger logger; private final Logger logger;
private final CommandParserDispatcher dispatcher;
/** Constructs a new SessionManager. */ /** Constructs a new SessionManager. */
public SessionManager(EventBus eventBus) { public SessionManager(EventBus eventBus, CommandParserDispatcher dispatcher) {
this.sessions = new ConcurrentHashMap<>(); this.sessions = new ConcurrentHashMap<>();
this.eventBus = eventBus; this.eventBus = eventBus;
this.logger = LogManager.getLogger(SessionManager.class); this.logger = LogManager.getLogger(SessionManager.class);
this.dispatcher = dispatcher;
} }
/** /**
@@ -31,7 +34,7 @@ public class SessionManager {
* @return newly created session * @return newly created session
*/ */
public Session create(TransportLayer transport) { public Session create(TransportLayer transport) {
Session session = new Session(transport, eventBus); Session session = new Session(transport, eventBus, dispatcher);
SessionReader reader = new SessionReader(session, eventBus); SessionReader reader = new SessionReader(session, eventBus);
SessionWriter writer = new SessionWriter(session); SessionWriter writer = new SessionWriter(session);
@@ -2,10 +2,12 @@ package ch.unibas.dmi.dbis.cs108.casono.server.network.sessions;
import ch.unibas.dmi.dbis.cs108.casono.server.network.events.DisconnectEvent; import ch.unibas.dmi.dbis.cs108.casono.server.network.events.DisconnectEvent;
import ch.unibas.dmi.dbis.cs108.casono.server.network.events.EventBus; import ch.unibas.dmi.dbis.cs108.casono.server.network.events.EventBus;
import ch.unibas.dmi.dbis.cs108.casono.server.network.parser.CommandParserDispatcher;
import ch.unibas.dmi.dbis.cs108.casono.server.network.parser.PrimitiveRequest; import ch.unibas.dmi.dbis.cs108.casono.server.network.parser.PrimitiveRequest;
import ch.unibas.dmi.dbis.cs108.casono.server.network.parser.ProtocolParser; import ch.unibas.dmi.dbis.cs108.casono.server.network.parser.ProtocolParser;
import ch.unibas.dmi.dbis.cs108.casono.server.network.parser.ProtocolParserException; import ch.unibas.dmi.dbis.cs108.casono.server.network.parser.ProtocolParserException;
import ch.unibas.dmi.dbis.cs108.casono.server.network.parser.RawRequest; import ch.unibas.dmi.dbis.cs108.casono.server.network.parser.RawRequest;
import ch.unibas.dmi.dbis.cs108.casono.server.network.parser.Request;
import ch.unibas.dmi.dbis.cs108.casono.server.network.parser.RequestContext; import ch.unibas.dmi.dbis.cs108.casono.server.network.parser.RequestContext;
import ch.unibas.dmi.dbis.cs108.casono.server.network.transport.RawPacket; import ch.unibas.dmi.dbis.cs108.casono.server.network.transport.RawPacket;
import ch.unibas.dmi.dbis.cs108.casono.server.network.transport.TransportLayer; import ch.unibas.dmi.dbis.cs108.casono.server.network.transport.TransportLayer;
@@ -19,12 +21,14 @@ public class SessionReader implements Runnable {
private final Session session; private final Session session;
private final TransportLayer transport; private final TransportLayer transport;
private final EventBus eventBus; private final EventBus eventBus;
private final CommandParserDispatcher dispatcher;
private final Logger logger; private final Logger logger;
public SessionReader(Session session, EventBus eventBus) { public SessionReader(Session session, EventBus eventBus) {
this.session = session; this.session = session;
this.transport = session.getTransport(); this.transport = session.getTransport();
this.eventBus = eventBus; this.eventBus = eventBus;
this.dispatcher = session.getDispatcher();
this.logger = this.logger =
LogManager.getLogger( LogManager.getLogger(
SessionReader.class.toString() + "-" + session.getId().value()); SessionReader.class.toString() + "-" + session.getId().value());
@@ -46,6 +50,8 @@ public class SessionReader implements Runnable {
PrimitiveRequest primitiveRequest = PrimitiveRequest primitiveRequest =
new PrimitiveRequest( new PrimitiveRequest(
requestContext, rawRequest.command(), rawRequest.parameters()); requestContext, rawRequest.command(), rawRequest.parameters());
Request request = dispatcher.parse(primitiveRequest);
} catch (EOFException e) { } catch (EOFException e) {
logger.info("Client disconnected"); logger.info("Client disconnected");
eventBus.publish(new DisconnectEvent(session.getId())); eventBus.publish(new DisconnectEvent(session.getId()));