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

com.tvd12.ezymq.common.EzyMQRpcProxyBuilder Maven / Gradle / Ivy

package com.tvd12.ezymq.common;

import com.tvd12.ezymq.common.codec.EzyMQBytesDataCodec;
import com.tvd12.ezymq.common.codec.EzyMQDataCodec;
import com.tvd12.ezymq.common.setting.EzyMQRpcSettings;
import com.tvd12.ezymq.common.setting.EzyMQSettings;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

@SuppressWarnings({"rawtypes", "unchecked"})
public abstract class EzyMQRpcProxyBuilder<
    S extends EzyMQRpcSettings,
    P extends EzyMQProxy,
    PB extends EzyMQRpcProxyBuilder
    >
    extends EzyMQProxyBuilder {

    protected final Map requestTypeByCommand =
        new HashMap<>();
    protected final Map> messageTypeMapByTopic =
        new HashMap<>();

    @Override
    public EzyMQRpcSettings.Builder settingsBuilder() {
        return (EzyMQRpcSettings.Builder) super.settingsBuilder();
    }

    @Override
    protected abstract EzyMQRpcSettings.Builder newSettingBuilder();

    public PB mapRequestType(String cmd, Class requestType) {
        this.requestTypeByCommand.put(cmd, requestType);
        return (PB) this;
    }

    public PB mapRequestTypes(Map requestTypes) {
        this.requestTypeByCommand.putAll(requestTypes);
        return (PB) this;
    }

    public PB mapTopicMessageType(
        String topic,
        String cmd,
        Class messageType
    ) {
        this.messageTypeMapByTopic.computeIfAbsent(
            topic,
            k -> new HashMap<>()
        ).put(cmd, messageType);
        return (PB) this;
    }

    public PB mapTopicMessageTypes(
        String topic,
        Map> messageTypes
    ) {
        this.messageTypeMapByTopic.computeIfAbsent(
            topic,
            k -> new HashMap<>()
        ).putAll(messageTypes);
        return (PB) this;
    }

    @Override
    protected Set> getBeanAnnotationClasses() {
        Set> annotationClasses = new HashSet<>(
            super.getBeanAnnotationClasses()
        );
        annotationClasses.add(getMessageConsumerAnnotationClass());
        return annotationClasses;
    }

    protected abstract Class getMessageConsumerAnnotationClass();

    @Override
    protected void decorateSettingBuilder(
        EzyMQSettings.Builder settingsBuilder
    ) {
        EzyMQRpcSettings.Builder builder =
            (EzyMQRpcSettings.Builder) settingsBuilder;
        builder
            .mapRequestTypes(requestTypeByCommand)
            .mapTopicMessageTypes(messageTypeMapByTopic)
            .addRequestInterceptors(
                beanContext.getSingletons(
                    getRequestInterceptorAnnotationClass()
                )
            )
            .addRequestHandlers(
                beanContext.getSingletons(
                    getRequestHandlerAnnotationClass()
                )
            )
            .addMessageConsumers(
                beanContext.getSingletons(
                    getMessageConsumerAnnotationClass()
                )
            );
    }

    @Override
    protected EzyMQDataCodec newDataCodec() {
        return EzyMQBytesDataCodec.builder()
            .marshaller(marshaller)
            .unmarshaller(unmarshaller)
            .messageSerializer(messageSerializer)
            .messageDeserializer(messageDeserializer)
            .mapRequestTypes(settings.getRequestTypeByCommand())
            .mapTopicMessageTypes(settings.getMessageTypeMapByTopic())
            .build();
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy