package com.github.scribejava.core.oauth; import com.github.scribejava.core.httpclient.HttpClientProvider; import com.github.scribejava.core.httpclient.HttpClient; import com.github.scribejava.core.httpclient.HttpClientConfig; import com.github.scribejava.core.httpclient.jdk.JDKHttpClient; import com.github.scribejava.core.httpclient.jdk.JDKHttpClientConfig; import com.github.scribejava.core.model.OAuthAsyncRequestCallback; import com.github.scribejava.core.model.OAuthConfig; import com.github.scribejava.core.model.OAuthRequest; import com.github.scribejava.core.model.Response; import com.github.scribejava.core.model.Token; import java.io.File; import java.io.IOException; import java.util.ServiceLoader; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; /** * The main ScribeJava object. * * A facade responsible for the retrieval of request and access tokens and for the signing of HTTP requests. * @param <T> type of token used to sign the request */ public abstract class OAuthService<T extends Token> implements AutoCloseable { private final OAuthConfig config; private final HttpClient httpClient; public OAuthService(OAuthConfig config) { this.config = config; final HttpClientConfig httpClientConfig = config.getHttpClientConfig(); final HttpClient externalHttpClient = config.getHttpClient(); if (httpClientConfig == null && externalHttpClient == null) { httpClient = new JDKHttpClient(JDKHttpClientConfig.defaultConfig()); } else { httpClient = externalHttpClient == null ? getClient(httpClientConfig) : externalHttpClient; } } private static HttpClient getClient(HttpClientConfig config) { for (HttpClientProvider provider : ServiceLoader.load(HttpClientProvider.class)) { final HttpClient client = provider.createClient(config); if (client != null) { return client; } } return null; } @Override public void close() throws IOException { httpClient.close(); } public OAuthConfig getConfig() { return config; } /** * Returns the OAuth version of the service. * * @return OAuth version as string */ public abstract String getVersion(); public abstract void signRequest(T token, OAuthRequest request); public Future<Response> executeAsync(OAuthRequest request) { return execute(request, null); } public Future<Response> execute(OAuthRequest request, OAuthAsyncRequestCallback<Response> callback) { return execute(request, callback, null); } public <R> Future<R> execute(OAuthRequest request, OAuthAsyncRequestCallback<R> callback, OAuthRequest.ResponseConverter<R> converter) { final File filePayload = request.getFilePayload(); if (filePayload != null) { return httpClient.executeAsync(config.getUserAgent(), request.getHeaders(), request.getVerb(), request.getCompleteUrl(), filePayload, callback, converter); } else if (request.getStringPayload() != null) { return httpClient.executeAsync(config.getUserAgent(), request.getHeaders(), request.getVerb(), request.getCompleteUrl(), request.getStringPayload(), callback, converter); } else { return httpClient.executeAsync(config.getUserAgent(), request.getHeaders(), request.getVerb(), request.getCompleteUrl(), request.getByteArrayPayload(), callback, converter); } } public Response execute(OAuthRequest request) throws InterruptedException, ExecutionException, IOException { final File filePayload = request.getFilePayload(); if (filePayload != null) { return httpClient.execute(config.getUserAgent(), request.getHeaders(), request.getVerb(), request.getCompleteUrl(), filePayload); } else if (request.getStringPayload() != null) { return httpClient.execute(config.getUserAgent(), request.getHeaders(), request.getVerb(), request.getCompleteUrl(), request.getStringPayload()); } else { return httpClient.execute(config.getUserAgent(), request.getHeaders(), request.getVerb(), request.getCompleteUrl(), request.getByteArrayPayload()); } } }