All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.reactivecommons.async.api.HandlerRegistry Maven / Gradle / Ivy

The newest version!
package org.reactivecommons.async.api;

import io.cloudevents.CloudEvent;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.reactivecommons.async.api.handlers.CloudCommandHandler;
import org.reactivecommons.async.api.handlers.CloudEventHandler;
import org.reactivecommons.async.api.handlers.DomainCommandHandler;
import org.reactivecommons.async.api.handlers.DomainEventHandler;
import org.reactivecommons.async.api.handlers.QueryHandler;
import org.reactivecommons.async.api.handlers.QueryHandlerDelegate;
import org.reactivecommons.async.api.handlers.registered.RegisteredCommandHandler;
import org.reactivecommons.async.api.handlers.registered.RegisteredEventListener;
import org.reactivecommons.async.api.handlers.registered.RegisteredQueryHandler;

import java.lang.reflect.ParameterizedType;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;

@Getter
@NoArgsConstructor(access = AccessLevel.PACKAGE)
public class HandlerRegistry {
    public static final String DEFAULT_DOMAIN = "app";
    private final Map>> domainEventListeners = new ConcurrentHashMap<>();
    private final List> dynamicEventHandlers = new CopyOnWriteArrayList<>();
    private final List> eventNotificationListener = new CopyOnWriteArrayList<>();
    private final List> handlers = new CopyOnWriteArrayList<>();
    private final List> commandHandlers = new CopyOnWriteArrayList<>();


    public static HandlerRegistry register() {
        HandlerRegistry instance = new HandlerRegistry();
        instance.domainEventListeners.put(DEFAULT_DOMAIN, new CopyOnWriteArrayList<>());
        return instance;
    }

    public  HandlerRegistry listenDomainEvent(String domain, String eventName, DomainEventHandler handler, Class eventClass) {
        domainEventListeners.computeIfAbsent(domain, ignored -> new CopyOnWriteArrayList<>())
                .add(new RegisteredEventListener<>(eventName, handler, eventClass));
        return this;
    }

    public HandlerRegistry listenDomainCloudEvent(String domain, String eventName, CloudEventHandler handler) {
        domainEventListeners.computeIfAbsent(domain, ignored -> new CopyOnWriteArrayList<>())
                .add(new RegisteredEventListener<>(eventName, handler, CloudEvent.class));
        return this;
    }

    public  HandlerRegistry listenEvent(String eventName, DomainEventHandler handler, Class eventClass) {
        domainEventListeners.computeIfAbsent(DEFAULT_DOMAIN, ignored -> new CopyOnWriteArrayList<>())
                .add(new RegisteredEventListener<>(eventName, handler, eventClass));
        return this;
    }

    public HandlerRegistry listenCloudEvent(String eventName, CloudEventHandler handler) {
        domainEventListeners.computeIfAbsent(DEFAULT_DOMAIN, ignored -> new CopyOnWriteArrayList<>())
                .add(new RegisteredEventListener<>(eventName, handler, CloudEvent.class));
        return this;
    }

    public  HandlerRegistry listenNotificationEvent(String eventName, DomainEventHandler handler, Class eventClass) {
        eventNotificationListener.add(new RegisteredEventListener<>(eventName, handler, eventClass));
        return this;
    }

    public HandlerRegistry listenNotificationCloudEvent(String eventName, CloudEventHandler handler) {
        eventNotificationListener.add(new RegisteredEventListener<>(eventName, handler, CloudEvent.class));
        return this;
    }

    public  HandlerRegistry handleDynamicEvents(String eventNamePattern, DomainEventHandler handler, Class eventClass) {
        dynamicEventHandlers.add(new RegisteredEventListener<>(eventNamePattern, handler, eventClass));
        return this;
    }

    public HandlerRegistry handleDynamicCloudEvents(String eventNamePattern, CloudEventHandler handler) {
        dynamicEventHandlers.add(new RegisteredEventListener<>(eventNamePattern, handler, CloudEvent.class));
        return this;
    }

    public  HandlerRegistry handleCommand(String commandName, DomainCommandHandler fn, Class commandClass) {
        commandHandlers.add(new RegisteredCommandHandler<>(commandName, fn, commandClass));
        return this;
    }

    public HandlerRegistry handleCloudEventCommand(String commandName, CloudCommandHandler handler) {
        commandHandlers.add(new RegisteredCommandHandler<>(commandName, handler, CloudEvent.class));
        return this;
    }

    public  HandlerRegistry serveQuery(String resource, QueryHandler handler, Class queryClass) {
        handlers.add(new RegisteredQueryHandler<>(resource, (ignored, message) -> handler.handle(message), queryClass));
        return this;
    }

    public  HandlerRegistry serveQuery(String resource, QueryHandlerDelegate handler, Class queryClass) {
        handlers.add(new RegisteredQueryHandler<>(resource, handler, queryClass));
        return this;
    }

    public  HandlerRegistry serveCloudEventQuery(String resource, QueryHandler handler) {
        handlers.add(new RegisteredQueryHandler<>(resource, (ignored, message) -> handler.handle(message), CloudEvent.class));
        return this;
    }

    public  HandlerRegistry serveCloudEventQuery(String resource, QueryHandlerDelegate handler) {
        handlers.add(new RegisteredQueryHandler<>(resource, handler, CloudEvent.class));
        return this;
    }


    @Deprecated(forRemoval = true)
    public  HandlerRegistry listenEvent(String eventName, DomainEventHandler handler) {
        return listenEvent(eventName, handler, inferGenericParameterType(handler));
    }

    @Deprecated(forRemoval = true)
    public  HandlerRegistry handleDynamicEvents(String eventNamePattern, DomainEventHandler handler) {
        return handleDynamicEvents(eventNamePattern, handler, inferGenericParameterType(handler));
    }

    @Deprecated(forRemoval = true)
    public  HandlerRegistry handleCommand(String commandName, DomainCommandHandler handler) {
        commandHandlers.add(new RegisteredCommandHandler<>(commandName, handler, inferGenericParameterType(handler)));
        return this;
    }

    @Deprecated(forRemoval = true)
    public  HandlerRegistry serveQuery(String resource, QueryHandler handler) {
        return serveQuery(resource, handler, inferGenericParameterType(handler));
    }

    @Deprecated(forRemoval = true)
    @SuppressWarnings("unchecked")
    private  Class inferGenericParameterType(QueryHandler handler) {
        try {
            ParameterizedType genericSuperclass = (ParameterizedType) handler.getClass().getGenericInterfaces()[0];
            return (Class) genericSuperclass.getActualTypeArguments()[1];
        } catch (Exception e) {
            throw new RuntimeException("Fail to infer generic Query class, please use serveQuery(path, handler, " +
                    "class) instead");
        }
    }

    @Deprecated(forRemoval = true)
    @SuppressWarnings("unchecked")
    private  Class inferGenericParameterType(DomainCommandHandler handler) {
        try {
            ParameterizedType genericSuperclass = (ParameterizedType) handler.getClass().getGenericInterfaces()[0];
            return (Class) genericSuperclass.getActualTypeArguments()[0];
        } catch (Exception e) {
            throw new RuntimeException("Fail to infer generic Command class, please use handleCommand(path, handler, " +
                    "class) instead");
        }
    }

    @Deprecated(forRemoval = true)
    private  Class inferGenericParameterType(DomainEventHandler handler) {
        try {
            ParameterizedType genericSuperclass = (ParameterizedType) handler.getClass().getGenericInterfaces()[0];
            return (Class) genericSuperclass.getActualTypeArguments()[0];
        } catch (Exception e) {
            throw new RuntimeException("Fail to infer generic Query class, please use listenEvent(eventName, handler," +
                    " class) instead");
        }
    }
}







© 2015 - 2025 Weber Informatics LLC | Privacy Policy