From ebb2e267bf89af4ddc0da130f0f6c91dc4d5819b Mon Sep 17 00:00:00 2001 From: Lars Simon Winzer Date: Wed, 8 Apr 2026 17:23:38 +0200 Subject: [PATCH] Add: Implement CommandHandlerExecutor for evaluation of pre-execution checks in CommandRouter --- .../dbis/cs108/casono/server/ServerApp.java | 4 ++- .../execution/CommandHandlerExecutor.java | 27 +++++++++++++++++++ .../command/execution/CommandRouter.java | 8 +++++- 3 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/command/execution/CommandHandlerExecutor.java 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 b553a36..febc9a9 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 @@ -15,6 +15,7 @@ import ch.unibas.dmi.dbis.cs108.casono.server.app.commands.ping.PingRequest; import ch.unibas.dmi.dbis.cs108.casono.server.domain.user.UserCleanupJob; 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.command.execution.CommandHandlerExecutor; import ch.unibas.dmi.dbis.cs108.casono.server.network.command.execution.CommandRouter; import ch.unibas.dmi.dbis.cs108.casono.server.network.command.parsing.CommandParserDispatcher; import ch.unibas.dmi.dbis.cs108.casono.server.network.events.DisconnectEvent; @@ -48,7 +49,8 @@ public class ServerApp { CommandParserDispatcher dispatcher = new CommandParserDispatcher(); SessionManager sessionManager = new SessionManager(eventBus, dispatcher); ResponseDispatcher responseDispatcher = new ResponseDispatcher(sessionManager); - CommandRouter router = new CommandRouter(); + CommandHandlerExecutor handlerExecutor = new CommandHandlerExecutor(responseDispatcher); + CommandRouter router = new CommandRouter(handlerExecutor); eventBus.subscribe(DisconnectEvent.class, event -> sessionManager.onDisconnect(event)); diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/command/execution/CommandHandlerExecutor.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/command/execution/CommandHandlerExecutor.java new file mode 100644 index 0000000..7526c1b --- /dev/null +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/command/execution/CommandHandlerExecutor.java @@ -0,0 +1,27 @@ +package ch.unibas.dmi.dbis.cs108.casono.server.network.command.execution; + +import ch.unibas.dmi.dbis.cs108.casono.server.network.command.execution.checks.HandlerCheck; +import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.request.Request; +import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.response.Response; +import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.response.dispatcher.ResponseDispatcher; +import java.util.Optional; + +public class CommandHandlerExecutor { + private final ResponseDispatcher responseDispatcher; + + public CommandHandlerExecutor(ResponseDispatcher responseDispatcher) { + this.responseDispatcher = responseDispatcher; + } + + public void execute(CommandHandler handler, Request request) { + for (HandlerCheck check : handler.getChecks()) { + Optional result = check.check(request); + if (result.isPresent()) { + responseDispatcher.dispatch(result.get()); + return; + } + } + + handler.execute(request); + } +} diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/command/execution/CommandRouter.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/command/execution/CommandRouter.java index 269c6a4..366db11 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/command/execution/CommandRouter.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/command/execution/CommandRouter.java @@ -6,6 +6,11 @@ import java.util.Map; public class CommandRouter { private final Map, CommandHandler> handlers = new HashMap<>(); + private final CommandHandlerExecutor handlerExecutor; + + public CommandRouter(CommandHandlerExecutor commandHandlerExecutor) { + this.handlerExecutor = commandHandlerExecutor; + } public void register(Class request, CommandHandler handler) { handlers.put(request, handler); @@ -23,6 +28,7 @@ public class CommandRouter { throw new UnknownRequestException( "Unable to execute request " + requestName + ". Type unknown", requestName); } - handler.execute(request); + + handlerExecutor.execute(handler, request); } }