79 lines
3.0 KiB
Java
79 lines
3.0 KiB
Java
package com.amazon.SellingPartnerAPIAA;
|
|
|
|
import com.google.gson.Gson;
|
|
import com.google.gson.JsonObject;
|
|
import com.google.gson.JsonParser;
|
|
import com.squareup.okhttp.MediaType;
|
|
import com.squareup.okhttp.OkHttpClient;
|
|
import com.squareup.okhttp.Request;
|
|
import com.squareup.okhttp.RequestBody;
|
|
import com.squareup.okhttp.Response;
|
|
import lombok.AccessLevel;
|
|
import lombok.Getter;
|
|
import lombok.Setter;
|
|
|
|
import java.io.IOException;
|
|
|
|
class LWAClient {
|
|
private static final String ACCESS_TOKEN_KEY = "access_token";
|
|
private static final String ACCESS_TOKEN_EXPIRES_IN = "expires_in";
|
|
private static final MediaType JSON_MEDIA_TYPE = MediaType.parse("application/json; charset=utf-8");
|
|
@Getter
|
|
private String endpoint;
|
|
|
|
@Setter(AccessLevel.PACKAGE)
|
|
private OkHttpClient okHttpClient;
|
|
private LWAAccessTokenCache lwaAccessTokenCache;
|
|
|
|
/** Sets cache to store access token until token is expired */
|
|
public void setLWAAccessTokenCache(LWAAccessTokenCache tokenCache) {
|
|
this.lwaAccessTokenCache = tokenCache;
|
|
}
|
|
|
|
LWAClient(String endpoint) {
|
|
okHttpClient = new OkHttpClient();
|
|
this.endpoint = endpoint;
|
|
}
|
|
|
|
String getAccessToken(LWAAccessTokenRequestMeta lwaAccessTokenRequestMeta) {
|
|
if (lwaAccessTokenCache != null) {
|
|
return getAccessTokenFromCache(lwaAccessTokenRequestMeta);
|
|
} else {
|
|
return getAccessTokenFromEndpoint(lwaAccessTokenRequestMeta);
|
|
}
|
|
}
|
|
|
|
String getAccessTokenFromCache(LWAAccessTokenRequestMeta lwaAccessTokenRequestMeta) {
|
|
String accessTokenCacheData = (String) lwaAccessTokenCache.get(lwaAccessTokenRequestMeta);
|
|
if (accessTokenCacheData != null) {
|
|
return accessTokenCacheData;
|
|
} else {
|
|
return getAccessTokenFromEndpoint(lwaAccessTokenRequestMeta);
|
|
}
|
|
}
|
|
|
|
String getAccessTokenFromEndpoint(LWAAccessTokenRequestMeta lwaAccessTokenRequestMeta) {
|
|
RequestBody requestBody = RequestBody.create(JSON_MEDIA_TYPE, new Gson().toJson(lwaAccessTokenRequestMeta));
|
|
Request accessTokenRequest = new Request.Builder().url(endpoint).post(requestBody).build();
|
|
|
|
String accessToken;
|
|
try {
|
|
Response response = okHttpClient.newCall(accessTokenRequest).execute();
|
|
if (!response.isSuccessful()) {
|
|
throw new IOException("Unsuccessful LWA token exchange");
|
|
}
|
|
|
|
JsonObject responseJson = new JsonParser().parse(response.body().string()).getAsJsonObject();
|
|
|
|
accessToken = responseJson.get(ACCESS_TOKEN_KEY).getAsString();
|
|
if (lwaAccessTokenCache != null) {
|
|
long timeToTokenexpiry = responseJson.get(ACCESS_TOKEN_EXPIRES_IN).getAsLong();
|
|
lwaAccessTokenCache.put(lwaAccessTokenRequestMeta, accessToken, timeToTokenexpiry);
|
|
}
|
|
} catch (Exception e) {
|
|
throw new RuntimeException("Error getting LWA Access Token", e);
|
|
}
|
|
return accessToken;
|
|
}
|
|
}
|