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

com.taboola.rest.api.RestAPIClient Maven / Gradle / Ivy

The newest version!
package com.taboola.rest.api;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.taboola.rest.api.exceptions.factories.DefaultExceptionFactory;
import com.taboola.rest.api.exceptions.factories.ExceptionFactory;
import com.taboola.rest.api.internal.CommunicationFactory;
import com.taboola.rest.api.internal.StringResponseFactories;
import com.taboola.rest.api.internal.config.CommunicationConfig;
import com.taboola.rest.api.internal.config.SerializationConfig;
import com.taboola.rest.api.internal.config.UserAgentHeader;
import com.taboola.rest.api.internal.serialization.SerializationMapperCreator;
import com.taboola.rest.api.model.CommunicationInterceptor;
import com.taboola.rest.api.model.HttpLoggingLevel;
import com.taboola.rest.api.model.MultiRequestHeadersSupplier;
import com.taboola.rest.api.model.NoOpCommunicationInterceptor;
import com.taboola.rest.api.model.RequestHeader;
import com.taboola.rest.api.model.RequestHeadersSupplier;
import com.taboola.rest.api.model.StringResponseFactory;

/**
 * Created by vladi.m
 * Date 23/06/2021
 * Time 16:42
 * Copyright Taboola
 */
public class RestAPIClient {

    private static final Logger logger = LogManager.getLogger(RestAPIClient.class);

    private final CommunicationFactory communicator;

    private RestAPIClient(CommunicationFactory communicator) {
        this.communicator = communicator;
    }

    public  E createRetrofitEndpoint(Class endpointClazz) {
        Objects.requireNonNull(endpointClazz, "clazz");
        logger.debug("creating endpoint using retrofit for class [{}]", endpointClazz::toString);
        return communicator.createRetrofitEndpoint(endpointClazz);
    }

    public static RestAPIClientBuilder builder() {
        return new RestAPIClientBuilder();
    }

    public static class RestAPIClientBuilder {
        private static final String VERSION = "1.0.8";
        private static final Integer DEFAULT_MAX_IDLE_CONNECTIONS = 5;
        private static final Long DEFAULT_KEEP_ALIVE_DURATION_MILLIS = 300_000L;
        private static final SerializationConfig DEFAULT_SERIALIZATION_CONFIG = new SerializationConfig();
        private static final String DEFAULT_REST_API_VERSION = "UNDEFINED";
        private static final String DEFAULT_USER_AGENT_SUFFIX = "UNDEFINED";
        private static final String DEFAULT_USER_AGENT_PREFIX = "UNDEFINED";
        private static final ExceptionFactory DEFAULT_EXCEPTION_FACTORY = new DefaultExceptionFactory();
        private static final CommunicationInterceptor DEFAULT_COMMUNICATION_INTERCEPTOR = new NoOpCommunicationInterceptor();

        private String baseUrl;
        private Long writeTimeoutMillis;
        private Long connectionTimeoutMillis;
        private Long readTimeoutMillis;
        private Integer maxIdleConnections;
        private Long keepAliveDurationMillis;
        private Long callTimeoutMillis;
        private Boolean debug;
        private SerializationConfig serializationConfig;
        private Collection headers;
        private RequestHeadersSupplier headersSupplier;
        private String userAgentPrefix;
        private String userAgentSuffix;
        private String restAPIVersion;
        private ExceptionFactory exceptionFactory;
        private ObjectMapper objectMapper;
        private final StringResponseFactories stringResponseFactories = new StringResponseFactories();
        private HttpLoggingLevel loggingLevel;
        private CommunicationInterceptor communicationInterceptor;

        public RestAPIClientBuilder setLoggingLevel(HttpLoggingLevel loggingLevel) {
            this.loggingLevel = loggingLevel;
            return this;
        }

        public RestAPIClientBuilder setBaseUrl(String baseUrl) {
            this.baseUrl = baseUrl;
            return this;
        }

        public RestAPIClientBuilder setUserAgentSuffix(String userAgentSuffix) {
            this.userAgentSuffix = userAgentSuffix;
            return this;
        }

        public RestAPIClientBuilder setUserAgentPrefix(String userAgentPrefix) {
            this.userAgentPrefix = userAgentPrefix;
            return this;
        }

        public RestAPIClientBuilder setConnectionTimeoutMillis(Long connectionTimeoutMillis) {
            this.connectionTimeoutMillis = connectionTimeoutMillis;
            return this;
        }

        public RestAPIClientBuilder setReadTimeoutMillis(Long readTimeoutMillis) {
            this.readTimeoutMillis = readTimeoutMillis;
            return this;
        }

        public RestAPIClientBuilder setWriteTimeoutMillis(Long writeTimeoutMillis) {
            this.writeTimeoutMillis = writeTimeoutMillis;
            return this;
        }

        public RestAPIClientBuilder setMaxIdleConnections(Integer maxIdleConnections) {
            this.maxIdleConnections = maxIdleConnections;
            return this;
        }

        public RestAPIClientBuilder setKeepAliveDurationMillis(Long keepAliveDurationMillis) {
            this.keepAliveDurationMillis = keepAliveDurationMillis;
            return this;
        }

        public RestAPIClientBuilder setCallTimeoutMillis(Long callTimeoutMillis) {
            this.callTimeoutMillis = callTimeoutMillis;
            return this;
        }

        public RestAPIClientBuilder setDebug(Boolean debug) {
            this.debug = debug;
            return this;
        }

        public RestAPIClientBuilder setSerializationConfig(SerializationConfig serializationConfig) {
            this.serializationConfig = serializationConfig;
            return this;
        }

        public RestAPIClientBuilder setHeaders(Collection headers) {
            this.headers = headers;
            return this;
        }

        public RestAPIClientBuilder setHeadersSupplier(RequestHeadersSupplier headersSupplier) {
            this.headersSupplier = headersSupplier;
            return this;
        }

        public RestAPIClientBuilder setAPIVersion(String restAPIVersion) {
            this.restAPIVersion = restAPIVersion;
            return this;
        }

        public RestAPIClientBuilder setExceptionFactory(ExceptionFactory exceptionFactory) {
            this.exceptionFactory = exceptionFactory;
            return this;
        }

        public RestAPIClientBuilder setObjectMapper(ObjectMapper objectMapper) {
            this.objectMapper = objectMapper;
            return this;
        }

        public RestAPIClientBuilder setCommunicationInterceptor(CommunicationInterceptor communicationInterceptor) {
            this.communicationInterceptor = communicationInterceptor;
            return this;
        }

        public RestAPIClientBuilder addStringBodyResponseFactory(Class clazz, StringResponseFactory stringResponseFactory) {
            stringResponseFactories.addFactory(clazz, stringResponseFactory);
            return this;
        }

        public RestAPIClient build() {
            organizeState();
            String finalUserAgent = String.format("%s/%s/%s (%s)", userAgentPrefix, restAPIVersion, VERSION, userAgentSuffix);
            Collection headers = getAllHeaders(this.headers, finalUserAgent);
            RequestHeadersSupplier multiRequestHeadersSupplier = new MultiRequestHeadersSupplier(() -> headers, headersSupplier);

            CommunicationConfig config = new CommunicationConfig(baseUrl, connectionTimeoutMillis, readTimeoutMillis, writeTimeoutMillis, maxIdleConnections,
                    keepAliveDurationMillis, callTimeoutMillis, multiRequestHeadersSupplier, debug, exceptionFactory, objectMapper, stringResponseFactories, loggingLevel, communicationInterceptor);
            return new RestAPIClient(new CommunicationFactory(config));
        }

        private Collection getAllHeaders(Collection clientHeaders, String finalUserAgent) {
            List headers = new ArrayList<>();
            if (clientHeaders != null) {
                headers.addAll(clientHeaders.stream().
                        filter(Objects::nonNull)
                        .collect(Collectors.toList()));
            }
            headers.add(new UserAgentHeader(finalUserAgent));
            return headers;
        }

        private void organizeState() {
            if (baseUrl == null) {
                throw new IllegalStateException("Missing base url");
            }

            if (connectionTimeoutMillis == null) {
                connectionTimeoutMillis = 0L;
            }

            if (readTimeoutMillis == null) {
                readTimeoutMillis = 0L;
            }

            if (writeTimeoutMillis == null) {
                writeTimeoutMillis = 0L;
            }

            if (callTimeoutMillis == null) {
                callTimeoutMillis = 0L;
            }

            if (maxIdleConnections == null) {
                maxIdleConnections = DEFAULT_MAX_IDLE_CONNECTIONS;
            }

            if (keepAliveDurationMillis == null) {
                keepAliveDurationMillis = DEFAULT_KEEP_ALIVE_DURATION_MILLIS;
            }

            if (userAgentSuffix == null) {
                userAgentSuffix = DEFAULT_USER_AGENT_SUFFIX;
            }

            if (userAgentPrefix == null) {
                userAgentPrefix = DEFAULT_USER_AGENT_PREFIX;
            }

            if (restAPIVersion == null) {
                restAPIVersion = DEFAULT_REST_API_VERSION;
            }

            if (debug == null) {
                debug = false;
            }

            if (serializationConfig == null) {
                serializationConfig = DEFAULT_SERIALIZATION_CONFIG;
            }

            if (exceptionFactory == null) {
                exceptionFactory = DEFAULT_EXCEPTION_FACTORY;
            }

            if (objectMapper == null) {
                objectMapper = SerializationMapperCreator.createObjectMapper(serializationConfig);
            }

            if (loggingLevel == null) {
                loggingLevel = HttpLoggingLevel.BASIC;
            }

            if (communicationInterceptor == null) {
                communicationInterceptor = DEFAULT_COMMUNICATION_INTERCEPTOR;
            }
        }
    }


}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy