From 1601f3eda56a7b4d8bb27c1d596867f4bf562f28 Mon Sep 17 00:00:00 2001 From: rafal <63915083+rchomczyk@users.noreply.github.com> Date: Thu, 14 Nov 2024 19:19:01 +0100 Subject: [PATCH] Add more fluent configuration flow for event bus --- .../src/dev/shiza/dew/event/EventBus.java | 11 +-- .../shiza/dew/event/EventBusConfigurator.java | 74 +++++++++++++++++++ .../dev/shiza/dew/event/EventBusFactory.java | 29 -------- .../src/dev/shiza/dew/event/EventBusImpl.java | 33 +++------ ...EventPublisher.java => EventExecutor.java} | 2 +- .../MapBasedResultProcessorRegistry.java | 15 ++-- .../ResultProcessorRegistryFactory.java | 9 ++- 7 files changed, 100 insertions(+), 73 deletions(-) create mode 100644 dew-common/src/dev/shiza/dew/event/EventBusConfigurator.java delete mode 100644 dew-common/src/dev/shiza/dew/event/EventBusFactory.java rename dew-common/src/dev/shiza/dew/event/{EventPublisher.java => EventExecutor.java} (72%) diff --git a/dew-common/src/dev/shiza/dew/event/EventBus.java b/dew-common/src/dev/shiza/dew/event/EventBus.java index 4f3157e..7732a0b 100644 --- a/dew-common/src/dev/shiza/dew/event/EventBus.java +++ b/dew-common/src/dev/shiza/dew/event/EventBus.java @@ -1,22 +1,13 @@ package dev.shiza.dew.event; -import dev.shiza.dew.result.ResultProcessor; import dev.shiza.dew.subscription.Subscriber; import dev.shiza.dew.subscription.SubscribingException; -import org.jetbrains.annotations.Contract; public sealed interface EventBus permits EventBusImpl { - @Contract("_ -> this") - EventBus publisher(final EventPublisher eventPublisher); - - @Contract("_, _ -> this") - EventBus result( - final Class resultType, final ResultProcessor resultProcessor); - void subscribe(final Subscriber subscriber) throws SubscribingException; - void publish(final EventPublisher eventPublisher, final Event event, final String... targets) + void publish(final EventExecutor eventExecutor, final Event event, final String... targets) throws EventPublishingException; void publish(final Event event, final String... targets) throws EventPublishingException; diff --git a/dew-common/src/dev/shiza/dew/event/EventBusConfigurator.java b/dew-common/src/dev/shiza/dew/event/EventBusConfigurator.java new file mode 100644 index 0000000..4abb057 --- /dev/null +++ b/dew-common/src/dev/shiza/dew/event/EventBusConfigurator.java @@ -0,0 +1,74 @@ +package dev.shiza.dew.event; + +import dev.shiza.dew.result.ResultProcessor; +import dev.shiza.dew.result.ResultProcessorFacade; +import dev.shiza.dew.result.ResultProcessorFacadeFactory; +import dev.shiza.dew.result.registry.ResultProcessorRegistry; +import dev.shiza.dew.result.registry.ResultProcessorRegistryFactory; +import dev.shiza.dew.subscription.SubscriptionFacadeFactory; +import java.util.HashMap; +import java.util.Map; +import java.util.function.Consumer; + +public final class EventBusConfigurator { + + private final EventExecuteConfig eventExecuteConfig = new EventExecuteConfig(); + private final ResultProcessingConfig resultProcessingConfig = new ResultProcessingConfig(); + + private EventBusConfigurator() {} + + public static EventBus configure(final Consumer consumer) { + final EventBusConfigurator eventBusConfigurator = new EventBusConfigurator(); + consumer.accept(eventBusConfigurator); + + final EventExecuteConfig eventExecuteConfig = eventBusConfigurator.eventExecuteConfig; + final EventExecutor eventExecutor = eventExecuteConfig.eventExecutor; + + final ResultProcessingConfig resultProcessingConfig = + eventBusConfigurator.resultProcessingConfig; + final ResultProcessorRegistry resultProcessorRegistry = + ResultProcessorRegistryFactory.createMapBasedRegistry( + resultProcessingConfig.resultProcessors); + final ResultProcessorFacade resultProcessorFacade = + ResultProcessorFacadeFactory.create(resultProcessorRegistry); + + return new EventBusImpl( + SubscriptionFacadeFactory.create(), + resultProcessorFacade, + resultProcessorRegistry, + eventExecutor); + } + + public void execute(final Consumer consumer) { + consumer.accept(eventExecuteConfig); + } + + public void process(final Consumer consumer) { + consumer.accept(resultProcessingConfig); + } + + public static final class EventExecuteConfig { + + private EventExecutor eventExecutor = Runnable::run; + + private EventExecuteConfig() {} + + public void executor(final EventExecutor eventExecutor) { + this.eventExecutor = eventExecutor; + } + } + + public static final class ResultProcessingConfig { + + private final Map, ResultProcessor> resultProcessors; + + private ResultProcessingConfig() { + this.resultProcessors = new HashMap<>(); + } + + public void processor( + final Class resultType, final ResultProcessor resultProcessor) { + resultProcessors.put(resultType, resultProcessor); + } + } +} diff --git a/dew-common/src/dev/shiza/dew/event/EventBusFactory.java b/dew-common/src/dev/shiza/dew/event/EventBusFactory.java deleted file mode 100644 index c9470f8..0000000 --- a/dew-common/src/dev/shiza/dew/event/EventBusFactory.java +++ /dev/null @@ -1,29 +0,0 @@ -package dev.shiza.dew.event; - -import dev.shiza.dew.result.ResultProcessorFacade; -import dev.shiza.dew.result.ResultProcessorFacadeFactory; -import dev.shiza.dew.result.registry.ResultProcessorRegistry; -import dev.shiza.dew.result.registry.ResultProcessorRegistryFactory; -import dev.shiza.dew.subscription.SubscriptionFacade; -import dev.shiza.dew.subscription.SubscriptionFacadeFactory; - -public final class EventBusFactory { - - private EventBusFactory() {} - - public static EventBus create( - final SubscriptionFacade subscriptionFacade, - final ResultProcessorFacade resultProcessorFacade, - final ResultProcessorRegistry resultProcessorRegistry) { - return new EventBusImpl(subscriptionFacade, resultProcessorFacade, resultProcessorRegistry); - } - - public static EventBus create() { - final ResultProcessorRegistry resultProcessorRegistry = - ResultProcessorRegistryFactory.createMapBasedRegistry(); - return create( - SubscriptionFacadeFactory.create(), - ResultProcessorFacadeFactory.create(resultProcessorRegistry), - resultProcessorRegistry); - } -} diff --git a/dew-common/src/dev/shiza/dew/event/EventBusImpl.java b/dew-common/src/dev/shiza/dew/event/EventBusImpl.java index de2c450..07fb799 100644 --- a/dew-common/src/dev/shiza/dew/event/EventBusImpl.java +++ b/dew-common/src/dev/shiza/dew/event/EventBusImpl.java @@ -1,6 +1,5 @@ package dev.shiza.dew.event; -import dev.shiza.dew.result.ResultProcessor; import dev.shiza.dew.result.ResultProcessorFacade; import dev.shiza.dew.result.registry.ResultProcessorRegistry; import dev.shiza.dew.subscription.Subscriber; @@ -15,28 +14,17 @@ final class EventBusImpl implements EventBus { private final SubscriptionFacade subscriptionFacade; private final ResultProcessorFacade resultProcessorFacade; private final ResultProcessorRegistry resultProcessorRegistry; - private EventPublisher eventPublisher; + private final EventExecutor eventExecutor; EventBusImpl( final SubscriptionFacade subscriptionFacade, final ResultProcessorFacade resultProcessorFacade, - final ResultProcessorRegistry resultProcessorRegistry) { + final ResultProcessorRegistry resultProcessorRegistry, + final EventExecutor eventExecutor) { this.subscriptionFacade = subscriptionFacade; this.resultProcessorFacade = resultProcessorFacade; this.resultProcessorRegistry = resultProcessorRegistry; - } - - @Override - public EventBus publisher(final EventPublisher eventPublisher) { - this.eventPublisher = eventPublisher; - return this; - } - - @Override - public EventBus result( - final Class resultType, final ResultProcessor resultProcessor) { - resultProcessorRegistry.register(resultType, resultProcessor); - return this; + this.eventExecutor = eventExecutor; } @Override @@ -45,29 +33,28 @@ public void subscribe(final Subscriber subscriber) { } @Override - public void publish( - final EventPublisher eventPublisher, final Event event, final String... targets) + public void publish(final EventExecutor eventExecutor, final Event event, final String... targets) throws EventPublishingException { final Set subscriptions = subscriptionFacade.getSubscriptionsByEventType(event.getClass()); for (final Subscription subscription : subscriptions) { - notifySubscription(subscription, eventPublisher, event, targets); + notifySubscription(subscription, eventExecutor, event, targets); } } @Override public void publish(final Event event, final String... targets) { - if (eventPublisher == null) { + if (eventExecutor == null) { throw new EventPublishingException( "Could not publish event, because of not specifying default event publisher."); } - publish(eventPublisher, event, targets); + publish(eventExecutor, event, targets); } private void notifySubscription( final Subscription subscription, - final EventPublisher eventPublisher, + final EventExecutor eventExecutor, final Event event, final String[] targets) { final Subscriber subscriber = subscription.subscriber(); @@ -76,7 +63,7 @@ private void notifySubscription( } for (final MethodHandle invocation : subscription.invocations()) { - eventPublisher.execute(() -> notifySubscribedMethods(invocation, subscriber, event)); + eventExecutor.execute(() -> notifySubscribedMethods(invocation, subscriber, event)); } } diff --git a/dew-common/src/dev/shiza/dew/event/EventPublisher.java b/dew-common/src/dev/shiza/dew/event/EventExecutor.java similarity index 72% rename from dew-common/src/dev/shiza/dew/event/EventPublisher.java rename to dew-common/src/dev/shiza/dew/event/EventExecutor.java index 8ec27f1..d00ff42 100644 --- a/dew-common/src/dev/shiza/dew/event/EventPublisher.java +++ b/dew-common/src/dev/shiza/dew/event/EventExecutor.java @@ -1,7 +1,7 @@ package dev.shiza.dew.event; @FunctionalInterface -public interface EventPublisher { +public interface EventExecutor { void execute(final Runnable task); } diff --git a/dew-common/src/dev/shiza/dew/result/registry/MapBasedResultProcessorRegistry.java b/dew-common/src/dev/shiza/dew/result/registry/MapBasedResultProcessorRegistry.java index 29453fa..35b8b6e 100644 --- a/dew-common/src/dev/shiza/dew/result/registry/MapBasedResultProcessorRegistry.java +++ b/dew-common/src/dev/shiza/dew/result/registry/MapBasedResultProcessorRegistry.java @@ -2,32 +2,31 @@ import dev.shiza.dew.event.Event; import dev.shiza.dew.result.ResultProcessor; -import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; final class MapBasedResultProcessorRegistry implements ResultProcessorRegistry { - private final Map, ResultProcessor> handlers; + private final Map, ResultProcessor> resultProcessors; - MapBasedResultProcessorRegistry() { - this.handlers = new HashMap<>(); + MapBasedResultProcessorRegistry(final Map, ResultProcessor> resultProcessors) { + this.resultProcessors = resultProcessors; } @Override public void register( final Class resultType, final ResultProcessor resultProcessor) { - handlers.put(resultType, resultProcessor); + resultProcessors.put(resultType, resultProcessor); } @Override public ResultProcessor getResultHandlerByClass(final Class resultType) { - final ResultProcessor resultProcessor = handlers.get(resultType); + final ResultProcessor resultProcessor = resultProcessors.get(resultType); if (resultProcessor != null) { return resultProcessor; } - for (final Entry, ResultProcessor> entry : handlers.entrySet()) { + for (final Entry, ResultProcessor> entry : resultProcessors.entrySet()) { if (isAssignableFrom(entry.getKey(), resultType)) { return entry.getValue(); } @@ -38,7 +37,7 @@ public void register( @Override public boolean isProcessingRequired() { - return !handlers.isEmpty(); + return !resultProcessors.isEmpty(); } private boolean isAssignableFrom(final Class type, final Class otherType) { diff --git a/dew-common/src/dev/shiza/dew/result/registry/ResultProcessorRegistryFactory.java b/dew-common/src/dev/shiza/dew/result/registry/ResultProcessorRegistryFactory.java index f4d6c8d..05d1f83 100644 --- a/dew-common/src/dev/shiza/dew/result/registry/ResultProcessorRegistryFactory.java +++ b/dew-common/src/dev/shiza/dew/result/registry/ResultProcessorRegistryFactory.java @@ -1,10 +1,15 @@ package dev.shiza.dew.result.registry; +import dev.shiza.dew.event.Event; +import dev.shiza.dew.result.ResultProcessor; +import java.util.Map; + public final class ResultProcessorRegistryFactory { private ResultProcessorRegistryFactory() {} - public static ResultProcessorRegistry createMapBasedRegistry() { - return new MapBasedResultProcessorRegistry(); + public static ResultProcessorRegistry createMapBasedRegistry( + final Map, ResultProcessor> resultProcessors) { + return new MapBasedResultProcessorRegistry(resultProcessors); } }