crystal-wallet-android/app/src/main/java/cy/agorise/crystalwallet/apigenerator/insightapi/InsightApiServiceGenerator....

131 lines
3.9 KiB
Java

package cy.agorise.crystalwallet.apigenerator.insightapi;
import java.io.IOException;
import java.util.HashMap;
import java.util.concurrent.TimeUnit;
import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
/**
* Generatir fir tge okhttp connection of the Insight API
* TODO finish documentation
*/
class InsightApiServiceGenerator {
/**
* Tag used for logging
*/
public static String TAG = "InsightApiServiceGenerator";
/**
* The complete uri to connect to the insight api, this change from coin to coin
*/
private static String sApiBaseUrl;
/**
* Loggin interceptor
*/
private static HttpLoggingInterceptor sLogging;
/**
* Http builder
*/
private static OkHttpClient.Builder sClientBuilder;
/**
* Builder for the retrofit class
*/
private static Retrofit.Builder sBuilder;
/**
*
*/
private static HashMap<Class<?>, Object> sServices;
/**
* Constructor, using the url of a insigth api coin
* @param apiBaseUrl The complete url to the server of the insight api
*/
InsightApiServiceGenerator(String apiBaseUrl) {
sApiBaseUrl= apiBaseUrl;
sLogging = new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY);
sClientBuilder = new OkHttpClient.Builder().addInterceptor(sLogging);
sBuilder = new Retrofit.Builder().baseUrl(sApiBaseUrl).addConverterFactory(GsonConverterFactory.create());
sServices = new HashMap<>();
}
/**
*
* @param klass
* @param thing
* @param <T>
*/
private static <T> void setService(Class<T> klass, T thing) {
sServices.put(klass, thing);
}
/**
*
* @param serviceClass
* @param <T>
* @return
*/
public <T> T getService(Class<T> serviceClass) {
T service = serviceClass.cast(sServices.get(serviceClass));
if (service == null) {
service = createService(serviceClass);
setService(serviceClass, service);
}
return service;
}
/**
*
* @param serviceClass
* @param <S>
* @return
*/
private static <S> S createService(Class<S> serviceClass) {
sClientBuilder.interceptors().add(new Interceptor() {
@Override
public okhttp3.Response intercept(Chain chain) throws IOException {
okhttp3.Request original = chain.request();
okhttp3.Request.Builder requestBuilder = original.newBuilder().method(original.method(), original.body());
okhttp3.Request request = requestBuilder.build();
return chain.proceed(request);
}
});
sClientBuilder.readTimeout(30, TimeUnit.SECONDS);
sClientBuilder.connectTimeout(30, TimeUnit.SECONDS);
OkHttpClient client = sClientBuilder.build();
Retrofit retrofit = sBuilder.client(client).build();
return retrofit.create(serviceClass);
}
/**
*
* @return
*/
public static InsightApiService Create() {
OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
httpClient.interceptors().add(new Interceptor() {
@Override
public okhttp3.Response intercept(Chain chain) throws IOException {
okhttp3.Request original = chain.request();
// Customize the request
okhttp3.Request request = original.newBuilder().method(original.method(), original.body()).build();
return chain.proceed(request);
}
});
OkHttpClient client = httpClient.build();
Retrofit retrofit = new Retrofit.Builder().baseUrl(sApiBaseUrl).client(client).build();
return retrofit.create(InsightApiService.class);
}
}