InMemoryEventBus.java

package org.sanmibuh.ddd.infrastructure;

import java.util.List;
import lombok.extern.slf4j.Slf4j;
import org.sanmibuh.ddd.domain.DomainEvent;
import org.sanmibuh.ddd.domain.NoSubscribersRequired;
import org.sanmibuh.ddd.port.DomainEventHandler;
import org.sanmibuh.ddd.port.EventBus;

@Slf4j
public final class InMemoryEventBus implements EventBus {

  private final EventHandlerRegistry registry;

  public InMemoryEventBus(final List<DomainEventHandler<?>> handlers) {
    registry = new EventHandlerRegistry(handlers);
  }

  @Override
  @SuppressWarnings("unchecked")
  public void publish(final DomainEvent event) {
    final var handlers = registry.handlersFor(event.getClass());
    if (isDropped(event, handlers)) {
      log.warn(
          "No handler registered for domain event {}; the event was dropped and not delivered.",
          event.getClass().getName());
      return;
    }
    for (final var handler : handlers) {
      ((DomainEventHandler<DomainEvent>) handler).handle(event);
    }
  }

  private static boolean isDropped(
      final DomainEvent event, final List<DomainEventHandler<?>> handlers) {
    return handlers.isEmpty() && !event.getClass().isAnnotationPresent(NoSubscribersRequired.class);
  }
}