From c10aaf15b538cf774879a4f3fa66858bc7725973 Mon Sep 17 00:00:00 2001 From: Lars Simon Winzer Date: Thu, 19 Mar 2026 18:09:31 +0100 Subject: [PATCH] Add: Move read logic to SessionReader runnable --- .../server/network/sessions/Session.java | 59 +------------------ .../network/sessions/SessionReader.java | 53 +++++++++++++++++ 2 files changed, 56 insertions(+), 56 deletions(-) create mode 100644 src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/sessions/SessionReader.java 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 c76ecce..67a24fd 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,24 +1,13 @@ 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.PrimitiveRequest; -import ch.unibas.dmi.dbis.cs108.casono.server.network.parser.ProtocolParser; -import ch.unibas.dmi.dbis.cs108.casono.server.network.transport.RawPacket; import ch.unibas.dmi.dbis.cs108.casono.server.network.transport.TransportLayer; -import java.io.EOFException; import java.io.IOException; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; /** Represents a client session in the network server. */ -public class Session implements Runnable { +public class Session { private SessionId id; - private Thread thread; private TransportLayer transport; - private Logger logger; - private Boolean running; - private EventBus eventBus; /** * Creates a new Session with the given transport and event bus. @@ -27,15 +16,9 @@ public class Session implements Runnable { * @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 { + public Session(TransportLayer transport, EventBus eventBus) { this.id = new SessionId(); - this.thread = new Thread(this, "session-" + this.id.value()); this.transport = transport; - this.running = true; - this.eventBus = eventBus; - - this.logger = LogManager.getLogger(Session.class.toString() + id.value()); - this.logger.info("Created new session"); } /** @@ -49,46 +32,10 @@ public class Session implements Runnable { /** * Returns the TransportLayer of this session - * + * * @return the transport layer of the session */ public TransportLayer getTransport() { return transport; } - - /** 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) { - try { - RawPacket rawPacket = transport.read(); - logger.debug("Recieved: {}", rawPacket); - - PrimitiveRequest primitiveRequest = ProtocolParser.parse(rawPacket); - logger.debug("Parsed request to {}", primitiveRequest); - } catch (EOFException e) { - logger.info("Client disconnected"); - eventBus.publish(new DisconnectEvent(id)); - break; - } catch (IOException e) { - e.printStackTrace(); - break; - } - } - } } 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 new file mode 100644 index 0000000..2f8e5fc --- /dev/null +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/sessions/SessionReader.java @@ -0,0 +1,53 @@ +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.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.transport.RawPacket; +import ch.unibas.dmi.dbis.cs108.casono.server.network.transport.TransportLayer; +import ch.unibas.dmi.dbis.cs108.casono.server.tokenizer.TokenizerException; +import java.io.EOFException; +import java.io.IOException; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +public class SessionReader implements Runnable { + private final Session session; + private final TransportLayer transport; + private final EventBus eventBus; + private final Logger logger; + + public SessionReader(Session session, EventBus eventBus) { + this.session = session; + this.transport = session.getTransport(); + this.eventBus = eventBus; + this.logger = + LogManager.getLogger( + SessionReader.class.toString() + "-" + session.getId().value()); + } + + @Override + public void run() { + while (!Thread.currentThread().isInterrupted()) { + try { + RawPacket rawPacket = transport.read(); + logger.debug("Recieved: {}", rawPacket); + + PrimitiveRequest primitiveRequest = ProtocolParser.parse(rawPacket); + logger.debug("Parsed request to {}", primitiveRequest); + } catch (EOFException e) { + logger.info("Client disconnected"); + eventBus.publish(new DisconnectEvent(session.getId())); + break; + } catch (TokenizerException | ProtocolParserException e) { + logger.trace("Error occured while parsing request", e); + + // TODO: Send error response to client + } catch (IOException e) { + logger.trace("Unexpected exception while reading from transport", e); + } + } + } +}