/* * Copyright 2014 Phil Bayfield * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package me.philio.disqus.api; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import me.philio.disqus.DisqusConstants; import me.philio.disqus.api.exception.ApiException; import me.philio.disqus.api.exception.BadRequestException; import me.philio.disqus.api.exception.ForbiddenException; import me.philio.disqus.api.gson.ApplicationsUsageDeserializer; import me.philio.disqus.api.gson.BlacklistsEntryTypeAdapterFactory; import me.philio.disqus.api.gson.PostTypeAdapterFactory; import me.philio.disqus.api.gson.ThreadTypeAdapterFactory; import me.philio.disqus.api.model.applications.Usage; import me.philio.disqus.api.resources.Applications; import me.philio.disqus.api.resources.Blacklists; import me.philio.disqus.api.resources.Categories; import me.philio.disqus.api.resources.Exports; import me.philio.disqus.api.resources.Feeds; import me.philio.disqus.api.resources.Forums; import me.philio.disqus.api.resources.Imports; import me.philio.disqus.api.resources.Media; import me.philio.disqus.api.resources.Notes; import me.philio.disqus.api.resources.Posts; import me.philio.disqus.api.resources.Threads; import me.philio.disqus.api.resources.Users; import me.philio.disqus.api.resources.notes.Templates; import retrofit.ErrorHandler; import retrofit.RequestInterceptor; import retrofit.RestAdapter; import retrofit.RetrofitError; import retrofit.client.Response; import retrofit.converter.GsonConverter; /** * A wrapper round the Retrofit {@link RestAdapter} */ public class ApiClient { /** * Base URL for all Disqus endpoints */ private static final String BASE_URL = "https://disqus.com/api/3.0"; /** * User agent */ private static final String USER_AGENT = "Disqus Android/0.1"; /** * Rest adapter */ private RestAdapter mAdapter; /** * Set config and set up the {@link RestAdapter} * * @param config */ public ApiClient(final ApiConfig config) { // Build Gson with Disqus date format and type adapters Gson gson = new GsonBuilder() .setDateFormat(DisqusConstants.DATE_FORMAT) .registerTypeAdapter(Usage.class, new ApplicationsUsageDeserializer()) .registerTypeAdapterFactory(new BlacklistsEntryTypeAdapterFactory()) .registerTypeAdapterFactory(new PostTypeAdapterFactory()) .registerTypeAdapterFactory(new ThreadTypeAdapterFactory()) .create(); // Build RestAdapter mAdapter = new RestAdapter.Builder() .setEndpoint(BASE_URL) .setLogLevel(config != null ? config.getLogLevel() : RestAdapter.LogLevel.NONE) .setErrorHandler(new ErrorHandler() { @Override public Throwable handleError(RetrofitError cause) { Response response = cause.getResponse(); if (response != null) { switch (response.getStatus()) { case 400: return new BadRequestException(cause); case 401: return new ForbiddenException(cause); } } return new ApiException(cause); } }) .setRequestInterceptor(new RequestInterceptor() { @Override public void intercept(RequestFacade request) { request.addHeader("User-Agent", USER_AGENT); if (config != null) { // Public/secret key query params if (config.getApiSecret() != null) { request.addQueryParam("api_secret", config.getApiSecret()); } else if (config.getApiKey() != null) { request.addQueryParam("api_key", config.getApiKey()); } else { } // Access token query param if (config.getAccessToken() != null) { request.addQueryParam("access_token", config.getAccessToken()); } // Referrer if (config.getReferrer() != null) { request.addHeader("Referer", config.getReferrer()); } } } }) .setConverter(new GsonConverter(gson)) .build(); } /** * Create applications resource * * @return */ public Applications createApplications() { return mAdapter.create(Applications.class); } /** * Create blacklists resource * * @return */ public Blacklists createBlacklists() { return mAdapter.create(Blacklists.class); } /** * Create categories resource * * @return */ public Categories createCategories() { return mAdapter.create(Categories.class); } /** * Create exports resource * * @return */ public Exports createExports() { return mAdapter.create(Exports.class); } /** * Create feeds resource * * @return */ public Feeds createFeeds() { return mAdapter.create(Feeds.class); } /** * Create forums resource * * @return */ public Forums createForums() { return mAdapter.create(Forums.class); } /** * Create imports resource * * @return */ public Imports createImports() { return mAdapter.create(Imports.class); } /** * Create media resource * * @return */ public Media createMedia() { return mAdapter.create(Media.class); } /** * Create notes resource * * @return */ public Notes createNotes() { return mAdapter.create(Notes.class); } /** * Create notes/templates resource * * @return */ public Templates createNotesTemplates() { return mAdapter.create(Templates.class); } /** * Create posts resource * * @return */ public Posts createPosts() { return mAdapter.create(Posts.class); } /** * Create threads resource * * @return */ public Threads createThreads() { return mAdapter.create(Threads.class); } /** * Create users resource * * @return */ public Users createUsers() { return mAdapter.create(Users.class); } }