Add pre-execution checks with CommandHandlerExecutor to CommandHandler #242

Merged
lars.winzer merged 12 commits from feat/57-pre-execution-checks-for-commandhandler into main 2026-04-08 18:58:21 +02:00
3 changed files with 37 additions and 2 deletions
Showing only changes of commit ebb2e267bf - Show all commits
@@ -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));
@@ -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<Request> handler, Request request) {
for (HandlerCheck check : handler.getChecks()) {
Optional<Response> result = check.check(request);
if (result.isPresent()) {
responseDispatcher.dispatch(result.get());
return;
}
}
handler.execute(request);
}
}
@@ -6,6 +6,11 @@ import java.util.Map;
public class CommandRouter {
private final Map<Class<? extends Request>, CommandHandler<?>> handlers = new HashMap<>();
private final CommandHandlerExecutor handlerExecutor;
public CommandRouter(CommandHandlerExecutor commandHandlerExecutor) {
this.handlerExecutor = commandHandlerExecutor;
}
public <T extends Request> void register(Class<T> request, CommandHandler<T> 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);
}
}