From 665e006b89541d550100b5bf3d31a00ac707b80f Mon Sep 17 00:00:00 2001 From: Lars Simon Winzer Date: Tue, 31 Mar 2026 20:27:36 +0200 Subject: [PATCH 1/5] Refactor: Update response classes to use RequestContext instead of SessionId + request id BREAKING CHANGES --- .../server/network/protocol/response/ErrorResponse.java | 8 +++----- .../server/network/protocol/response/OkResponse.java | 6 +++--- .../casono/server/network/protocol/response/Response.java | 7 ++++--- .../server/network/protocol/response/SuccessResponse.java | 6 +++--- 4 files changed, 13 insertions(+), 14 deletions(-) diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/ErrorResponse.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/ErrorResponse.java index 1136e11..b676613 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/ErrorResponse.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/ErrorResponse.java @@ -1,7 +1,7 @@ package ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.response; +import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.request.RequestContext; import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.response.builder.ResponseBody; -import ch.unibas.dmi.dbis.cs108.casono.server.network.sessions.SessionId; /** Response representing an error outcome for a client's request. */ public class ErrorResponse extends Response { @@ -13,11 +13,9 @@ public class ErrorResponse extends Response { * @param errorCode a short error code identifying the failure * @param errorMessage a human readable error message */ - public ErrorResponse( - SessionId sessionId, int requestId, String errorCode, String errorMessage) { + public ErrorResponse(RequestContext context, String errorCode, String errorMessage) { super( - sessionId, - requestId, + context, ResponseBody.builder().param("CODE", errorCode).param("MSG", errorMessage).build()); } diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/OkResponse.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/OkResponse.java index f0d7cd6..28e08a6 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/OkResponse.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/OkResponse.java @@ -1,7 +1,7 @@ package ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.response; +import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.request.RequestContext; import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.response.builder.ResponseBody; -import ch.unibas.dmi.dbis.cs108.casono.server.network.sessions.SessionId; /** * A simple success response with an empty body. @@ -15,7 +15,7 @@ public class OkResponse extends SuccessResponse { * @param sessionId the target session id * @param requestId the originating request id */ - public OkResponse(SessionId sessionId, int requestId) { - super(sessionId, requestId, ResponseBody.builder().build()); + public OkResponse(RequestContext context) { + super(context, ResponseBody.builder().build()); } } diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/Response.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/Response.java index d0918fb..36b3cdb 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/Response.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/Response.java @@ -1,5 +1,6 @@ package ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.response; +import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.request.RequestContext; import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.response.builder.ResponseBody; import ch.unibas.dmi.dbis.cs108.casono.server.network.sessions.SessionId; @@ -16,9 +17,9 @@ public abstract class Response { * @param requestId the request identifier this response corresponds to * @param body the structured response body */ - protected Response(SessionId sessionId, int requestId, ResponseBody body) { - this.sessionId = sessionId; - this.requestId = requestId; + protected Response(RequestContext context, ResponseBody body) { + this.sessionId = context.sessionId(); + this.requestId = context.requestId(); this.body = body; } diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/SuccessResponse.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/SuccessResponse.java index 3df95b9..9f1bb91 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/SuccessResponse.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/SuccessResponse.java @@ -1,7 +1,7 @@ package ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.response; +import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.request.RequestContext; import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.response.builder.ResponseBody; -import ch.unibas.dmi.dbis.cs108.casono.server.network.sessions.SessionId; /** * Abstract {@link Response} specialization indicating a successful outcome. @@ -17,8 +17,8 @@ public abstract class SuccessResponse extends Response { * @param requestId the originating request id * @param body the response body */ - protected SuccessResponse(SessionId sessionId, int requestId, ResponseBody body) { - super(sessionId, requestId, body); + protected SuccessResponse(RequestContext context, ResponseBody body) { + super(context, body); } /** -- 2.52.0 From 34d782e252e2509013fe30a7434a3895696db144 Mon Sep 17 00:00:00 2001 From: Lars Simon Winzer Date: Tue, 31 Mar 2026 20:32:11 +0200 Subject: [PATCH 2/5] Refactor: Use RequestContext in SessionReader when instantiating responses --- .../server/network/sessions/SessionReader.java | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) 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 d7f6cdf..9fba8ae 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 @@ -46,11 +46,13 @@ public class SessionReader implements Runnable { while (!Thread.currentThread().isInterrupted()) { RawPacket rawPacket = null; RawRequest rawRequest = null; + RequestContext requestContext = null; try { // Step 1: Read from transport rawPacket = transport.read(); session.updateLastInboundActivity(); logger.debug("Recieved: {}", rawPacket); + requestContext = new RequestContext(session.getId(), rawPacket.requestId()); // Step 2: Syntax validation and conversion into transport object rawRequest = ProtocolParser.parse(rawPacket.payload()); @@ -58,9 +60,7 @@ public class SessionReader implements Runnable { PrimitiveRequest primitiveRequest = new PrimitiveRequest( - new RequestContext(session.getId(), rawPacket.requestId()), - rawRequest.command(), - rawRequest.parameters()); + requestContext, rawRequest.command(), rawRequest.parameters()); logger.debug("Converted to {}", primitiveRequest); // Step 3: Parse into Request and execute Request @@ -76,8 +76,7 @@ public class SessionReader implements Runnable { sendErrorResponse( new ErrorResponse( - session.getId(), - rawPacket.requestId(), + requestContext, "PARSING_ERROR", "Error occured during parsing. Likely due to malformed payload.")); @@ -85,8 +84,7 @@ public class SessionReader implements Runnable { logger.error("Recieved unknown command '{}' from client", rawRequest.command(), e); sendErrorResponse( new ErrorResponse( - session.getId(), - rawPacket.requestId(), + requestContext, "UNKNOWN_COMMAND", "This command is unknown to the server.")); @@ -97,8 +95,7 @@ public class SessionReader implements Runnable { logger.error("Unexpected RuntimeException occured", e); sendErrorResponse( new ErrorResponse( - session.getId(), - rawPacket.requestId(), + requestContext, "INTERNAL_ERROR", "Unexpected internal server error occured.")); } -- 2.52.0 From 945418798b2b4ce49f54b5efc632a2a6d843cd2a Mon Sep 17 00:00:00 2001 From: Lars Simon Winzer Date: Tue, 31 Mar 2026 20:35:29 +0200 Subject: [PATCH 3/5] Refactor: Replace dedicated fields for SessionId and request id with RequestContext --- .../server/network/protocol/response/Response.java | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/Response.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/Response.java index 36b3cdb..6426595 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/Response.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/Response.java @@ -6,8 +6,7 @@ import ch.unibas.dmi.dbis.cs108.casono.server.network.sessions.SessionId; /** Abstract base class for all server responses sent to clients. */ public abstract class Response { - private final SessionId sessionId; - private final int requestId; + private final RequestContext context; private final ResponseBody body; /** @@ -18,8 +17,7 @@ public abstract class Response { * @param body the structured response body */ protected Response(RequestContext context, ResponseBody body) { - this.sessionId = context.sessionId(); - this.requestId = context.requestId(); + this.context = context; this.body = body; } @@ -36,7 +34,7 @@ public abstract class Response { * @return the target {@link SessionId} */ public SessionId getSessionId() { - return sessionId; + return context.sessionId(); } /** @@ -45,7 +43,7 @@ public abstract class Response { * @return the numeric request id */ public int getRequestId() { - return requestId; + return context.requestId(); } /** -- 2.52.0 From 2ad2981724abdf442b565962ba15d96e641a80f1 Mon Sep 17 00:00:00 2001 From: Lars Simon Winzer Date: Tue, 31 Mar 2026 20:36:40 +0200 Subject: [PATCH 4/5] Docs: Improve javaDoc for getSessionId method in Response --- .../cs108/casono/server/network/protocol/response/Response.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/Response.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/Response.java index 6426595..0514c24 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/Response.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/Response.java @@ -29,7 +29,7 @@ public abstract class Response { public abstract String prefix(); /** - * Returns the session id that should receive this response. + * Returns the session id of the session that should receive this response. * * @return the target {@link SessionId} */ -- 2.52.0 From 307c234c91a6084b7e52eea2bd93abe86f7f5c1f Mon Sep 17 00:00:00 2001 From: Lars Simon Winzer Date: Tue, 31 Mar 2026 20:47:46 +0200 Subject: [PATCH 5/5] Docs: Fix javaDoc comments to match changes --- .../casono/server/network/protocol/response/ErrorResponse.java | 3 +-- .../casono/server/network/protocol/response/OkResponse.java | 3 +-- .../casono/server/network/protocol/response/Response.java | 3 +-- .../server/network/protocol/response/SuccessResponse.java | 3 +-- 4 files changed, 4 insertions(+), 8 deletions(-) diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/ErrorResponse.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/ErrorResponse.java index b676613..44c9aab 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/ErrorResponse.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/ErrorResponse.java @@ -8,8 +8,7 @@ public class ErrorResponse extends Response { /** * Construct an error response with a code and message. * - * @param sessionId the target session id - * @param requestId the originating request id + * @param context the RequestContext of the request * @param errorCode a short error code identifying the failure * @param errorMessage a human readable error message */ diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/OkResponse.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/OkResponse.java index 28e08a6..cc5526c 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/OkResponse.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/OkResponse.java @@ -12,8 +12,7 @@ public class OkResponse extends SuccessResponse { /** * Create a minimal successful response (no body content). * - * @param sessionId the target session id - * @param requestId the originating request id + * @param context the RequestContext of the request */ public OkResponse(RequestContext context) { super(context, ResponseBody.builder().build()); diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/Response.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/Response.java index 0514c24..13d7ad9 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/Response.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/Response.java @@ -12,8 +12,7 @@ public abstract class Response { /** * Create a new {@code Response}. * - * @param sessionId the id of the session this response targets - * @param requestId the request identifier this response corresponds to + * @param context the RequestContext of the request * @param body the structured response body */ protected Response(RequestContext context, ResponseBody body) { diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/SuccessResponse.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/SuccessResponse.java index 9f1bb91..9b96860 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/SuccessResponse.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/protocol/response/SuccessResponse.java @@ -13,8 +13,7 @@ public abstract class SuccessResponse extends Response { /** * Create a successful response with the provided body. * - * @param sessionId the session id this response targets - * @param requestId the originating request id + * @param context the RequestContext of the request * @param body the response body */ protected SuccessResponse(RequestContext context, ResponseBody body) { -- 2.52.0