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

com.rbkmoney.woody.api.interceptor.ext.ExtendableInterceptor Maven / Gradle / Ivy

There is a newer version: 1.1.23
Show newest version
package com.rbkmoney.woody.api.interceptor.ext;

import com.rbkmoney.woody.api.interceptor.Interceptor;
import com.rbkmoney.woody.api.trace.TraceData;

import java.util.List;
import java.util.function.BiFunction;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class ExtendableInterceptor implements Interceptor {
    private final InterceptorExtension[] extensions;
    private final BiFunction errContextResolver;

    public static List concatBundleLists(List first, List second) {
        return Stream.concat(first.stream(), second.stream()).collect(Collectors.toList());
    }

    public ExtendableInterceptor(List extensions, BiFunction errContextResolver) {
        this.extensions = extensions.toArray(new InterceptorExtension[0]);
        this.errContextResolver = errContextResolver;
    }

    public ExtendableInterceptor(List extensionBundles, BiFunction errContextResolver, boolean isClient, boolean isRequest) {
        this(extensionBundles.stream()
                        .map(bundle -> {
                            ExtensionBundle.ContextBundle ctxBundle = isClient ? bundle.getClientBundle() : bundle.getServiceBundle();
                            return isRequest ? ctxBundle.getRequestExtension() : ctxBundle.getResponseExtension();
                        })
                        .collect(Collectors.toList()),
                errContextResolver
        );
    }

    public ExtendableInterceptor(Function> primaryBundlesProvider, List secondaryBundles, boolean isClient, boolean isRequest) {
        this(
                concatBundleLists(
                        primaryBundlesProvider.apply(isClient),
                        secondaryBundles),
                (traceData, throwable) -> isClient,
                isClient,
                isRequest
        );
    }

    @Override
    public boolean intercept(TraceData traceData, Object providerContext, Object... contextParams) {
        try {
            ExtensionContext extContext = createContext(traceData, providerContext, contextParams);
            initInterception(extContext);
            for (int i = 0; i < extensions.length; ++i) {
                extensions[i].apply(extContext);
            }
            finalizeInterception(extContext);
            return true;
        } catch (Exception e) {
            return interceptError(traceData, e, errContextResolver.apply(traceData, e));
        }
    }

    protected ExtensionContext createContext(TraceData traceData, Object providerContext, Object[] contextParams) {
        return new ExtensionContext(traceData, providerContext, contextParams);
    }

    protected void initInterception(ExtensionContext extContext) {
    }

    protected void finalizeInterception(ExtensionContext extContext) {
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy