Add RequestContext to simplify creation of Request which requires SessionId and RequestId #201

Merged
lars.winzer merged 7 commits from feat/request-context-record into main 2026-03-24 18:29:28 +01:00
6 changed files with 55 additions and 8 deletions
@@ -3,4 +3,5 @@ package ch.unibas.dmi.dbis.cs108.casono.server.network.parser;
import java.util.List; import java.util.List;
/** Created by the ProtocolParser to allow easy access to the request contents */ /** Created by the ProtocolParser to allow easy access to the request contents */
public record PrimitiveRequest(int requestId, String command, List<Parameter> parameters) {} public record PrimitiveRequest(
RequestContext context, String command, List<Parameter> parameters) {}
@@ -1,6 +1,5 @@
package ch.unibas.dmi.dbis.cs108.casono.server.network.parser; package ch.unibas.dmi.dbis.cs108.casono.server.network.parser;
import ch.unibas.dmi.dbis.cs108.casono.server.network.transport.RawPacket;
import ch.unibas.dmi.dbis.cs108.casono.server.tokenizer.RawToken; import ch.unibas.dmi.dbis.cs108.casono.server.tokenizer.RawToken;
import ch.unibas.dmi.dbis.cs108.casono.server.tokenizer.Token; import ch.unibas.dmi.dbis.cs108.casono.server.tokenizer.Token;
import ch.unibas.dmi.dbis.cs108.casono.server.tokenizer.TokenClassifier; import ch.unibas.dmi.dbis.cs108.casono.server.tokenizer.TokenClassifier;
@@ -19,15 +18,15 @@ public class ProtocolParser {
* @param packet the RawPacket containing the recieved data * @param packet the RawPacket containing the recieved data
* @return created PrimitiveRequest * @return created PrimitiveRequest
*/ */
public static PrimitiveRequest parse(RawPacket packet) { public static RawRequest parse(String payload) {
List<RawToken> rawTokens = Tokenizer.tokenize(packet.payload()); List<RawToken> rawTokens = Tokenizer.tokenize(payload);
List<Token> tokens = TokenClassifier.classify(rawTokens); List<Token> tokens = TokenClassifier.classify(rawTokens);
Iterator<Token> iterator = tokens.iterator(); Iterator<Token> iterator = tokens.iterator();
String command = readCommand(iterator); String command = readCommand(iterator);
List<Parameter> parameters = readParameters(iterator); List<Parameter> parameters = readParameters(iterator);
return new PrimitiveRequest(packet.requestId(), command, parameters); return new RawRequest(command, parameters);
} }
/** /**
@@ -0,0 +1,5 @@
package ch.unibas.dmi.dbis.cs108.casono.server.network.parser;
import java.util.List;
public record RawRequest(String command, List<Parameter> parameters) {}
@@ -1,4 +1,24 @@
package ch.unibas.dmi.dbis.cs108.casono.server.network.parser; package ch.unibas.dmi.dbis.cs108.casono.server.network.parser;
import ch.unibas.dmi.dbis.cs108.casono.server.network.sessions.SessionId;
/** Request, produced by the CommandParser */ /** Request, produced by the CommandParser */
public interface Request {} public abstract class Request {
protected final RequestContext context;
public Request(RequestContext context) {
this.context = context;
}
public RequestContext getContext() {
return context;
}
public SessionId getSessionId() {
return context.sessionId();
}
public int getRequestId() {
return context.requestId();
}
}
@@ -0,0 +1,14 @@
package ch.unibas.dmi.dbis.cs108.casono.server.network.parser;
import ch.unibas.dmi.dbis.cs108.casono.server.network.sessions.SessionId;
/**
* Immutable context for a network request.
*
* <p>Contains the originating session's identifier and the request's id. Later used to create
* response.
*
* @param sessionId the identifier of the session that initiated the request
* @param requestId the request's numeric id within the session
*/
public record RequestContext(SessionId sessionId, int requestId) {}
@@ -5,6 +5,8 @@ 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.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.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;
import ch.unibas.dmi.dbis.cs108.casono.server.tokenizer.TokenizerException; import ch.unibas.dmi.dbis.cs108.casono.server.tokenizer.TokenizerException;
@@ -36,8 +38,14 @@ public class SessionReader implements Runnable {
rawPacket = transport.read(); rawPacket = transport.read();
logger.debug("Recieved: {}", rawPacket); logger.debug("Recieved: {}", rawPacket);
PrimitiveRequest primitiveRequest = ProtocolParser.parse(rawPacket); RawRequest rawRequest = ProtocolParser.parse(rawPacket.payload());
logger.debug("Parsed request to {}", primitiveRequest); logger.debug("Parsed request to {}", rawRequest);
RequestContext requestContext =
new RequestContext(session.getId(), rawPacket.requestId());
PrimitiveRequest primitiveRequest =
new PrimitiveRequest(
requestContext, rawRequest.command(), rawRequest.parameters());
} 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()));