package com.alorma.gitskarios.core.client; import core.ApiClient; import java.util.concurrent.TimeUnit; import retrofit.RequestInterceptor; import retrofit.RestAdapter; import retrofit.RetrofitError; import retrofit.client.Client; import retrofit.client.Response; import retrofit.converter.Converter; import rx.Observable; public abstract class BaseClient<K> implements RequestInterceptor, RestAdapter.Log { private ApiClient client; public BaseClient(ApiClient client) { this.client = client; } protected RestAdapter getRestAdapter() { RestAdapter.Builder restAdapterBuilder = new RestAdapter.Builder().setEndpoint(client.getApiEndpoint()) .setRequestInterceptor(this) .setLogLevel(RestAdapter.LogLevel.FULL) .setLog(this); if (customConverter() != null) { restAdapterBuilder.setConverter(customConverter()); } if (getInterceptor() != null) { restAdapterBuilder.setClient(getInterceptor()); } return restAdapterBuilder.build(); } protected Client getInterceptor() { return null; } public Observable<K> observable() { return getApiObservable(getRestAdapter()).retry(this::retry).debounce(100, TimeUnit.MILLISECONDS); } protected Boolean retry(Integer integer, Throwable throwable) { if (throwable instanceof RetrofitError) { Response response = ((RetrofitError) throwable).getResponse(); if (response != null) { return response.getStatus() == 202 && integer < 3; } } return integer < 3; } protected abstract Observable<K> getApiObservable(RestAdapter restAdapter); protected Converter customConverter() { return null; } protected String getToken() { if (TokenProvider.getInstance() != null) { return TokenProvider.getInstance().getToken(); } return ""; } public ApiClient getClient() { return client; } }