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

io.relayr.java.api.ApiModule Maven / Gradle / Ivy

package io.relayr.java.api;

import com.squareup.okhttp.Cache;
import com.squareup.okhttp.OkHttpClient;

import java.io.File;

import javax.inject.Named;
import javax.inject.Singleton;

import dagger.Module;
import dagger.Provides;
import io.relayr.java.RelayrJavaApp;
import retrofit.Endpoint;
import retrofit.Endpoints;
import retrofit.ErrorHandler;
import retrofit.RequestInterceptor;
import retrofit.RestAdapter;
import retrofit.RetrofitError;
import retrofit.client.Client;
import retrofit.client.OkClient;
import retrofit.client.Response;

@Module(
        complete = false,
        library = true
)
public class ApiModule {

    private static final String API_ENDPOINT_DEV = "https://dev-api.relayr.io";
    private static final String API_ENDPOINT = "https://api.relayr.io";

    private static final int DISK_CACHE_SIZE = 50 * 1024 * 1024; // 50MB
    private static final String USER_AGENT = "JavaSdk";

    public static String getApiPoint() {
        return RelayrJavaApp.PRODUCTION ? API_ENDPOINT : API_ENDPOINT_DEV;
    }

    private static final RequestInterceptor apiRequestInterceptor = new RequestInterceptor() {
        @Override
        public void intercept(RequestFacade request) {
            request.addHeader("User-Agent", USER_AGENT);
            request.addHeader("Authorization", RelayrJavaApp.getToken());
            request.addHeader("Content-Type", "application/json; charset=UTF-8");
        }
    };

    private static final RequestInterceptor modelsRequestInterceptor = new RequestInterceptor() {
        @Override
        public void intercept(RequestFacade request) {
            request.addHeader("User-Agent", ApiModule.USER_AGENT);
            request.addHeader("Authorization", RelayrJavaApp.getToken());
            request.addHeader("Content-Type", "application/hal+json");
        }
    };

    private static final RequestInterceptor oauthRequestInterceptor = new RequestInterceptor() {
        @Override
        public void intercept(RequestFacade request) {
            request.addHeader("User-Agent", USER_AGENT);
        }
    };

    @Provides @Singleton Endpoint provideEndpoint() {
        return Endpoints.newFixedEndpoint(getApiPoint());
    }

    @Provides @Singleton OkHttpClient provideOkHttpClient() {
        return createOkHttpClient();
    }

    @Provides @Singleton Client provideClient(OkHttpClient client) {
        return new OkClient(client);
    }

    @Provides @Singleton @Named("api") RestAdapter provideApiRestAdapter(
            Endpoint endpoint, Client client) {
        return createRestAdapter(client, endpoint, apiRequestInterceptor, RelayrJavaApp.getLogLevel());
    }

    @Provides @Singleton @Named("oauth") RestAdapter provideOauthRestAdapter(
            Endpoint endpoint, Client client) {
        return createRestAdapter(client, endpoint, oauthRequestInterceptor, RelayrJavaApp.getLogLevel());
    }

    @Provides @Singleton @Named("models") RestAdapter provideModelsRestAdapter(
            Endpoint endpoint, Client client) {
        return createRestAdapter(client, endpoint, modelsRequestInterceptor, RelayrJavaApp.getLogLevel());
    }

    @Provides @Singleton OauthApi provideOauthApi(@Named("oauth") RestAdapter adapter) {
        return adapter.create(OauthApi.class);
    }

    @Provides @Singleton ChannelApi provideChannelApi(@Named("api")
                                                      RestAdapter adapter) {
        return adapter.create(ChannelApi.class);
    }

    @Provides @Singleton CloudApi provideCloudApi(@Named("api") RestAdapter adapter) {
        return adapter.create(CloudApi.class);
    }

    @Provides @Singleton RelayrApi provideRelayrApi(@Named("api") RestAdapter adapter) {
        return adapter.create(RelayrApi.class);
    }

    @Provides @Singleton DeviceApi provideDeviceApi(@Named("api") RestAdapter adapter) {
        return adapter.create(DeviceApi.class);
    }

    @Provides @Singleton AccountsApi provideAccountsApi(@Named("api") RestAdapter adapter) {
        return adapter.create(AccountsApi.class);
    }

    @Provides @Singleton GroupsApi provideGroupsApi(@Named("api") RestAdapter adapter) {
        return adapter.create(GroupsApi.class);
    }

    @Provides @Singleton UserApi provideUserApi(@Named("api") RestAdapter adapter) {
        return adapter.create(UserApi.class);
    }

    @Provides @Singleton
    DeviceModelsApi provideDeviceModelsApi(@Named("models") RestAdapter adapter) {
        return adapter.create(DeviceModelsApi.class);
    }

    private RestAdapter createRestAdapter(Client client, Endpoint endpoint,
                                          RequestInterceptor interceptor,
                                          RestAdapter.LogLevel logLevel) {
        return new RestAdapter.Builder()
                .setClient(client)
                .setEndpoint(endpoint)
                .setRequestInterceptor(interceptor)
                .setErrorHandler(new ApiErrorHandler())
                .setLogLevel(logLevel)
                .build();
    }

    private static OkHttpClient createOkHttpClient() {
        OkHttpClient client = new OkHttpClient();

        File cacheDir = new File("/", "https");
        Cache cache = new Cache(cacheDir, DISK_CACHE_SIZE);
        client.setCache(cache);

        return client;
    }

    class ApiErrorHandler implements ErrorHandler {
        @Override public Throwable handleError(RetrofitError cause) {
            Response response = cause.getResponse();
            if (response != null && response.getStatus() > 301) return new Exception(cause);
            return cause;
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy