Skip to content

Commit

Permalink
Add passing of source event to result handler
Browse files Browse the repository at this point in the history
  • Loading branch information
rchomczyk committed Oct 28, 2024
1 parent a49f418 commit 0a0749f
Show file tree
Hide file tree
Showing 5 changed files with 26 additions and 18 deletions.
3 changes: 2 additions & 1 deletion dew-common/src/dev/shiza/dew/event/EventBus.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@ public sealed interface EventBus permits EventBusImpl {
EventBus publisher(final EventPublisher eventPublisher);

@Contract("_, _ -> this")
<T> EventBus result(final Class<T> resultType, final ResultHandler<T> resultHandler);
<E extends Event, T> EventBus result(
final Class<T> resultType, final ResultHandler<E, T> resultHandler);

void subscribe(final Subscriber subscriber) throws SubscribingException;

Expand Down
6 changes: 4 additions & 2 deletions dew-common/src/dev/shiza/dew/event/EventBusImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,8 @@ public EventBus publisher(final EventPublisher eventPublisher) {
}

@Override
public <T> EventBus result(final Class<T> resultType, final ResultHandler<T> resultHandler) {
public <E extends Event, T> EventBus result(
final Class<T> resultType, final ResultHandler<E, T> resultHandler) {
resultHandlerFacade.register(resultType, resultHandler);
return this;
}
Expand Down Expand Up @@ -77,7 +78,8 @@ private void notifySubscription(
private void notifySubscribedMethods(
final MethodHandle invocation, final Subscriber subscriber, final Event event) {
try {
resultHandlerFacade.process(invocation.invoke(subscriber, event));
final Object returnedValue = invocation.invoke(subscriber, event);
resultHandlerFacade.process(event, returnedValue);
} catch (final Throwable exception) {
throw new EventPublishingException(
"Could not publish event, because of unexpected exception during method invocation.",
Expand Down
6 changes: 4 additions & 2 deletions dew-common/src/dev/shiza/dew/result/ResultHandler.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package dev.shiza.dew.result;

public interface ResultHandler<T> {
import dev.shiza.dew.event.Event;

void handle(final T result);
public interface ResultHandler<E extends Event, T> {

void handle(final E event, final T result);
}
6 changes: 4 additions & 2 deletions dew-common/src/dev/shiza/dew/result/ResultHandlerFacade.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
package dev.shiza.dew.result;

import dev.shiza.dew.event.Event;

public interface ResultHandlerFacade {

<T> void register(final Class<T> resultType, final ResultHandler<T> resultHandler);
<E extends Event, T> void register(final Class<T> resultType, final ResultHandler<E, T> resultHandler);

<T> void process(final T value);
<E extends Event, T> void process(final E event, final T value);
}
23 changes: 12 additions & 11 deletions dew-common/src/dev/shiza/dew/result/ResultHandlerService.java
Original file line number Diff line number Diff line change
@@ -1,46 +1,47 @@
package dev.shiza.dew.result;

import dev.shiza.dew.event.Event;
import java.util.Map;
import java.util.Map.Entry;

final class ResultHandlerService implements ResultHandlerFacade {

private final Map<Class<?>, ResultHandler<?>> handlers;
private final Map<Class<?>, ResultHandler<?, ?>> handlers;

ResultHandlerService(final Map<Class<?>, ResultHandler<?>> handlers) {
ResultHandlerService(final Map<Class<?>, ResultHandler<?, ?>> handlers) {
this.handlers = handlers;
}

@Override
public <T> void register(final Class<T> resultType, final ResultHandler<T> resultHandler) {
public <E extends Event, T> void register(
final Class<T> resultType, final ResultHandler<E, T> resultHandler) {
handlers.put(resultType, resultHandler);
}

@Override
public <T> void process(final T value) {
public <E extends Event, T> void process(final E event, final T value) {
if (value == null) {
return;
}

final ResultHandler<?> resultHandler = getResultHandler(value.getClass());
final ResultHandler<?, ?> resultHandler = getResultHandler(value.getClass());
if (resultHandler == null) {
throw new ResultHandlingException(
"Could not handle result of type %s, because of missing result handler."
.formatted(value.getClass().getName()));
}

((ResultHandler<T>) resultHandler).handle(value);
((ResultHandler<E, T>) resultHandler).handle(event, value);
}

private ResultHandler<?> getResultHandler(final Class<?> clazz) {
final ResultHandler<?> resultHandler = handlers.get(clazz);
private ResultHandler<?, ?> getResultHandler(final Class<?> clazz) {
final ResultHandler<?, ?> resultHandler = handlers.get(clazz);
if (resultHandler != null) {
return resultHandler;
}

for (final Entry<Class<?>, ResultHandler<?>> entry : handlers.entrySet()) {
final Class<?> resultType = entry.getKey();
if (resultType.isAssignableFrom(clazz) || clazz.isAssignableFrom(resultType)) {
for (final Entry<Class<?>, ResultHandler<?, ?>> entry : handlers.entrySet()) {
if (entry.getKey().isAssignableFrom(clazz) || clazz.isAssignableFrom(entry.getKey())) {
return entry.getValue();
}
}
Expand Down

0 comments on commit 0a0749f

Please sign in to comment.