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);
+}