selling-partner-api-models/clients/sellingpartner-api-aa-java/src/com/amazon/SellingPartnerAPIAA/LWAClient.java

79 lines
3.0 KiB
Java
Raw Normal View History

2020-08-06 08:53:39 +08:00
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";
2020-08-06 08:53:39 +08:00
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;
}
2020-08-06 08:53:39 +08:00
LWAClient(String endpoint) {
okHttpClient = new OkHttpClient();
this.endpoint = endpoint;
}
2020-08-06 08:53:39 +08:00
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();
2020-08-06 08:53:39 +08:00
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();
2020-08-06 08:53:39 +08:00
accessToken = responseJson.get(ACCESS_TOKEN_KEY).getAsString();
if (lwaAccessTokenCache != null) {
long timeToTokenexpiry = responseJson.get(ACCESS_TOKEN_EXPIRES_IN).getAsLong();
lwaAccessTokenCache.put(lwaAccessTokenRequestMeta, accessToken, timeToTokenexpiry);
}
2020-08-06 08:53:39 +08:00
} catch (Exception e) {
throw new RuntimeException("Error getting LWA Access Token", e);
}
2020-08-06 08:53:39 +08:00
return accessToken;
}
2020-08-06 08:53:39 +08:00
}