/**
 *
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License. See License.txt in the project root for license information.
 *
 */

package com.microsoft.rest;

import com.microsoft.rest.retry.RetryHandler;
import com.microsoft.rest.serializer.JacksonMapperAdapter;
import com.squareup.okhttp.Interceptor;
import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.logging.HttpLoggingInterceptor;
import com.squareup.okhttp.logging.HttpLoggingInterceptor.Level;
import retrofit.Retrofit;

import java.net.CookieManager;
import java.net.CookiePolicy;
import java.util.List;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;

/**
 * ServiceClient is the abstraction for accessing REST operations and their payload data types.
 */
public abstract class ServiceClient {
    /**
     * The HTTP client object.
     */
    protected final OkHttpClient client;

    /**
     * The builder for building Retrofit services.
     */
    protected final Retrofit.Builder retrofitBuilder;

    /**
     * The adapter for {@link com.fasterxml.jackson.databind.ObjectMapper} for serialization
     * and deserialization operations.
     */
    protected JacksonMapperAdapter mapperAdapter;

    /**
     * Initializes a new instance of the ServiceClient class.
     */
    protected ServiceClient() {
        this(new OkHttpClient(), new Retrofit.Builder());

        CookieManager cookieManager = new CookieManager();
        cookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ALL);
        this.client.setCookieHandler(cookieManager);

        Executor executor = Executors.newCachedThreadPool();
        this.mapperAdapter = new JacksonMapperAdapter();
        this.retrofitBuilder
                .addConverterFactory(mapperAdapter.getConverterFactory())
                .callbackExecutor(executor);
    }

    /**
     * Initializes a new instance of the ServiceClient class.
     *
     * @param client the OkHttpClient instance to use
     * @param retrofitBuilder the builder to build up a rest adapter
     */
    protected ServiceClient(OkHttpClient client, Retrofit.Builder retrofitBuilder) {
        if (client == null) {
            throw new IllegalArgumentException("client == null");
        }
        if (retrofitBuilder == null) {
            throw new IllegalArgumentException("retrofitBuilder == null");
        }

        // Set up OkHttp client
        this.client = client;
        this.client.interceptors().add(new RetryHandler());
        this.client.interceptors().add(new UserAgentInterceptor());

        // Set up rest adapter builder
        this.retrofitBuilder = retrofitBuilder.client(this.client);
    }

    /**
     * Get the list of interceptors the OkHttp client will execute.
     * @return the list of interceptors
     */
    public List<Interceptor> getClientInterceptors() {
        return this.client.interceptors();
    }

    /**
     * Sets the logging level for OkHttp client.
     *
     * @param logLevel the logging level enum
     */
    public void setLogLevel(Level logLevel) {
        HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
        loggingInterceptor.setLevel(logLevel);
        this.getClientInterceptors().add(loggingInterceptor);
    }
}

@@ -3282,11 +3282,295 @@
 );%0A    %7D
+%0A%0A    /**%0A     * Gets the adapter for %7B@link com.fasterxml.jackson.databind.ObjectMapper%7D for serialization%0A     * and deserialization operations..%0A     *%0A     * @return the adapter.%0A     */%0A    public JacksonMapperAdapter getMapperAdapter() %7B%0A        return this.mapperAdapter;%0A    %7D
 %0A%7D%0A

Use the client referenced mapper adapter