diff --git a/pom.xml b/pom.xml index e091605..b6abe4f 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ com.neroyun mediator - 1.0.1 + 1.0.2 Mediator A simple mediator pattern implementation in Java https://github.com/nerosoftdev/mediator diff --git a/src/main/java/com/neroyun/mediator/Mediator.java b/src/main/java/com/neroyun/mediator/Mediator.java index 81f439b..0025159 100644 --- a/src/main/java/com/neroyun/mediator/Mediator.java +++ b/src/main/java/com/neroyun/mediator/Mediator.java @@ -1,10 +1,13 @@ package com.neroyun.mediator; +import com.neroyun.mediator.internal.QueryCallback; + /** * Defines the Mediator interface for handling commands, queries, and events. * The Mediator pattern promotes loose coupling between components by centralizing communication. * This interface can be implemented to create a concrete mediator that manages the interactions between various components in the system. */ +@SuppressWarnings("unused") public interface Mediator { /** @@ -26,11 +29,11 @@ public interface Mediator { /** * Executes a query and provides the result to the specified response handler. * @param query the query to be executed - * @param response the response handler + * @param callback the callback to handle the result of the query * @param the type of the query * @param the type of the result */ - , R> void execute(T query, R response); + , R> void execute(T query, QueryCallback callback); /** * Publishes an event to all interested handlers. diff --git a/src/main/java/com/neroyun/mediator/PipelinedMediator.java b/src/main/java/com/neroyun/mediator/PipelinedMediator.java index ad5aeab..b7a5c51 100644 --- a/src/main/java/com/neroyun/mediator/PipelinedMediator.java +++ b/src/main/java/com/neroyun/mediator/PipelinedMediator.java @@ -73,22 +73,22 @@ public , R> R execute(@NotNull T query) { } @Override - public , R> void execute(@NotNull T query, R response) { + public , R> void execute(@NotNull T query, QueryCallback callback) { checkArguments(query, "Query can not be null."); + var result = execute(query); + if (callback != null) { + callback.onCompleted(result); + } } @Override public void publish(@NotNull T event) { checkArguments(event, "Event can not be null."); - List tasks = handlers.supply() - .filter(handler -> handler.matches(event)) - .map(handler -> (Handler) handler) - .map(handler -> (Runnable) () -> { - var pipeline = buildMiddlewarePipeline(event, () -> handler.handle(event)); - pipeline.invoke(); - }) - .toList(); + List tasks = handlers.supply().filter(handler -> handler.matches(event)).map(handler -> (Handler) handler).map(handler -> (Runnable) () -> { + var pipeline = buildMiddlewarePipeline(event, () -> handler.handle(event)); + pipeline.invoke(); + }).toList(); if (tasks.isEmpty()) { return; @@ -134,11 +134,7 @@ public void publish(@NotNull T event) { */ private , R> Handler resolveHandler(T message) { // resolve handler from handlers stream - return handlers.supply() - .filter(handler -> handler.matches(message)) - .map(handler -> (Handler) handler) - .findFirst() - .orElseThrow(() -> new RuntimeException("No handler found for message: " + message.getClass().getName())); + return handlers.supply().filter(handler -> handler.matches(message)).map(handler -> (Handler) handler).findFirst().orElseThrow(() -> new RuntimeException("No handler found for message: " + message.getClass().getName())); } /** @@ -150,11 +146,7 @@ private , R> Handler resolveHandler(T message) { * @param the type of the response produced by the message handler */ private , R> void validate(T message) { - var errors = validators.supply() - .map(validator -> validator.validate(message)) - .filter(ValidationResult::isFailure) - .flatMap(result -> result.errors().stream()) - .toList(); + var errors = validators.supply().map(validator -> validator.validate(message)).filter(ValidationResult::isFailure).flatMap(result -> result.errors().stream()).toList(); if (!errors.isEmpty()) { throw new ValidationException(errors); } diff --git a/src/main/java/com/neroyun/mediator/internal/QueryCallback.java b/src/main/java/com/neroyun/mediator/internal/QueryCallback.java new file mode 100644 index 0000000..f110cba --- /dev/null +++ b/src/main/java/com/neroyun/mediator/internal/QueryCallback.java @@ -0,0 +1,6 @@ +package com.neroyun.mediator.internal; + +@FunctionalInterface +public interface QueryCallback { + void onCompleted(R results); +}