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

com.taboola.backstage.internal.CommunicationFactory Maven / Gradle / Ivy

package com.taboola.backstage.internal;

import java.util.concurrent.TimeUnit;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.taboola.backstage.internal.config.CommunicationConfig;
import com.taboola.backstage.internal.config.SerializationConfig;
import com.taboola.backstage.internal.interceptors.CommunicationInterceptor;
import com.taboola.backstage.internal.interceptors.HeadersInterceptor;
import com.taboola.backstage.internal.serialization.SerializationMapperCreator;

import okhttp3.ConnectionPool;
import okhttp3.OkHttpClient;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Retrofit;
import retrofit2.converter.jackson.JacksonConverterFactory;

/**
 * Created by vladi
 * Date: 10/4/2017
 * Time: 10:54 PM
 * By Taboola
 */
public final class CommunicationFactory {

    private final ObjectMapper objectMapper;
    private final Retrofit retrofit;
    private final Retrofit authRetrofit;

    public CommunicationFactory(CommunicationConfig communicationConfig, SerializationConfig serializationConfig) {
        this.objectMapper = SerializationMapperCreator.createObjectMapper(serializationConfig);
        Retrofit.Builder retrofitBuilder = createRetrofitBuilder(communicationConfig);

        this.authRetrofit = retrofitBuilder.baseUrl(communicationConfig.getAuthenticationBaseUrl()).build();
        this.retrofit = retrofitBuilder.baseUrl(communicationConfig.getBackstageBaseUrl()).build();
    }

    private HttpLoggingInterceptor createLoggingInterceptor(CommunicationConfig config) {
        HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(new CommunicationInterceptor());
        if(config.isDebug()) {
            loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
            loggingInterceptor.redactHeader("Authorization");
            loggingInterceptor.redactHeader("Cookie");
        } else {
            loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BASIC);
        }

        return loggingInterceptor;
    }

    private Retrofit.Builder createRetrofitBuilder(CommunicationConfig config) {
        return new Retrofit.Builder()
                            //TODO add ability to start retrofit2 in mock mode {option retrofit-mock}
                            .addConverterFactory(StringConverterFactory.create())
                            .addConverterFactory(JacksonConverterFactory.create(objectMapper))
                            .addCallAdapterFactory(SynchronousCallAdapterFactory.create(objectMapper))
                            .client(createOkHttpClient(config));
    }

    private OkHttpClient createOkHttpClient(CommunicationConfig config) {
        return new OkHttpClient.Builder()
                //TODO use global connection pool to prevent OkHttpClient default behaviour from creating too many file descriptors when performing async calls
                    .addInterceptor(new HeadersInterceptor(config.getHeaders()))
                    .addInterceptor(createLoggingInterceptor(config))
                    .readTimeout(config.getReadTimeoutMillis(), TimeUnit.MILLISECONDS)
                    .writeTimeout(config.getWriteTimeoutMillis(), TimeUnit.MILLISECONDS)
                    .connectTimeout(config.getConnectionTimeoutMillis(), TimeUnit.MILLISECONDS)
                    .connectionPool(new ConnectionPool(config.getMaxIdleConnections(),
                            config.getKeepAliveDurationMillis(), TimeUnit.MILLISECONDS))
                .build();
    }

    public  E createRetrofitAuthEndpoint(Class clazz) {
        return authRetrofit.create(clazz);
    }

    public  E createRetrofitEndpoint(Class clazz) {
        return retrofit.create(clazz);
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy