diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/ServerApp.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/ServerApp.java index 126b341..9327139 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/ServerApp.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/ServerApp.java @@ -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.events.DisconnectEvent; import ch.unibas.dmi.dbis.cs108.casono.server.network.events.EventBus; +import ch.unibas.dmi.dbis.cs108.casono.server.network.parser.CommandParserDispatcher; import ch.unibas.dmi.dbis.cs108.casono.server.network.sessions.SessionManager; import java.time.Duration; import java.util.concurrent.Executors; @@ -26,7 +27,8 @@ public class ServerApp { logger.info("Starting server at port {}", port); 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)); NetworkManager networkManager = new NetworkManager(port, sessionManager); 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 0a9be66..6959ed7 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/sessions/Session.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/sessions/Session.java @@ -1,6 +1,7 @@ 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.parser.CommandParserDispatcher; import ch.unibas.dmi.dbis.cs108.casono.server.network.response.PrimitiveResponse; import ch.unibas.dmi.dbis.cs108.casono.server.network.transport.TransportLayer; import java.io.IOException; @@ -12,6 +13,7 @@ public class Session { private final SessionId id; private final TransportLayer transport; private final BlockingQueue responseQueue; + private final CommandParserDispatcher dispatcher; private static final int RESPOND_QUEUE_SIZE = 32; /** @@ -21,9 +23,11 @@ public class Session { * @param eventBus the event bus for publishing events * @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.transport = transport; + this.dispatcher = dispatcher; this.responseQueue = new ArrayBlockingQueue<>(RESPOND_QUEUE_SIZE); } @@ -53,4 +57,13 @@ public class Session { public BlockingQueue getResponseQueue() { return responseQueue; } + + /** + * Returns the CommandParserDispatcher of this session + * + * @return the dispatcher to dispatch PrimitiveRequests to for parsing + */ + public CommandParserDispatcher getDispatcher() { + return dispatcher; + } } 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 2ff6e38..bbf1a14 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 @@ -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.EventBus; +import ch.unibas.dmi.dbis.cs108.casono.server.network.parser.CommandParserDispatcher; import ch.unibas.dmi.dbis.cs108.casono.server.network.transport.TransportLayer; import java.io.IOException; import java.util.Map; @@ -14,12 +15,14 @@ public class SessionManager { private Map sessions; private final EventBus eventBus; private final Logger logger; + private final CommandParserDispatcher dispatcher; /** Constructs a new SessionManager. */ - public SessionManager(EventBus eventBus) { + public SessionManager(EventBus eventBus, CommandParserDispatcher dispatcher) { this.sessions = new ConcurrentHashMap<>(); this.eventBus = eventBus; this.logger = LogManager.getLogger(SessionManager.class); + this.dispatcher = dispatcher; } /** @@ -31,7 +34,7 @@ public class SessionManager { * @return newly created session */ public Session create(TransportLayer transport) { - Session session = new Session(transport, eventBus); + Session session = new Session(transport, eventBus, dispatcher); SessionReader reader = new SessionReader(session, eventBus); SessionWriter writer = new SessionWriter(session); diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/sessions/SessionReader.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/sessions/SessionReader.java index 0abe830..0b21190 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/sessions/SessionReader.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/sessions/SessionReader.java @@ -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.EventBus; +import ch.unibas.dmi.dbis.cs108.casono.server.network.parser.CommandParserDispatcher; import ch.unibas.dmi.dbis.cs108.casono.server.network.parser.PrimitiveRequest; import ch.unibas.dmi.dbis.cs108.casono.server.network.parser.ProtocolParser; import ch.unibas.dmi.dbis.cs108.casono.server.network.parser.ProtocolParserException; import ch.unibas.dmi.dbis.cs108.casono.server.network.parser.RawRequest; +import ch.unibas.dmi.dbis.cs108.casono.server.network.parser.Request; import ch.unibas.dmi.dbis.cs108.casono.server.network.parser.RequestContext; import ch.unibas.dmi.dbis.cs108.casono.server.network.transport.RawPacket; 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 TransportLayer transport; private final EventBus eventBus; + private final CommandParserDispatcher dispatcher; private final Logger logger; public SessionReader(Session session, EventBus eventBus) { this.session = session; this.transport = session.getTransport(); this.eventBus = eventBus; + this.dispatcher = session.getDispatcher(); this.logger = LogManager.getLogger( SessionReader.class.toString() + "-" + session.getId().value()); @@ -46,6 +50,8 @@ public class SessionReader implements Runnable { PrimitiveRequest primitiveRequest = new PrimitiveRequest( requestContext, rawRequest.command(), rawRequest.parameters()); + + Request request = dispatcher.parse(primitiveRequest); } catch (EOFException e) { logger.info("Client disconnected"); eventBus.publish(new DisconnectEvent(session.getId()));