public class TokenInterceptor extends BaseInterceptor {
static final String KEY_CODE = "code";
static final String KEY_TOKEN = "token";
final static ConditionVariable LOCK = new ConditionVariable(true);
static final AtomicBoolean mIsRefreshing = new AtomicBoolean(false);
static final Long REFRESH_WAIT_TIME = 25 * 1000L;
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
Map<String, Object> requestParams =
Response response = chain.proceed(request);
if (response.isSuccessful()) {
String code = getJsonResponseValue(parseResponseStr(response), KEY_CODE);
if (TOKEN_EXPIRE_CODE.equals(code)) {
if (mIsRefreshing.compareAndSet(false, true)) {
try {
LOCK.close();
Logger.d("API", "lock the request" + request.url().toString());
String currentToken = (String) requestParams.get(KEY_TOKEN);
String localToken =
if (currentToken != null && Objects.equals(currentToken, localToken)) {
boolean updateTokenStatus = updateToken(chain, currentToken);
if (updateTokenStatus) {
response = useNewTokenRequestAgain(chain, requestParams);
} else {
}
} else if (currentToken != null) {
response = useNewTokenRequestAgain(chain, requestParams);
}
} finally {
LOCK.open();
mIsRefreshing.set(false);
}
} else {
boolean conditionOpen = LOCK.block(REFRESH_WAIT_TIME);
if (conditionOpen) {
Logger.d("API", "other request again" + request.url().toString());
response = useNewTokenRequestAgain(chain, requestParams);
} else {
}
}
}
}
return response;
}
private boolean updateToken(Chain chain, String currentToken) throws IOException {
JsonRequest request =
request.addParam(KEY_TOKEN, currentToken);
if (Constants.DEBUG) {
Logger.d("API", "Updating token start, old token is:" + currentToken);
}
Response response = chain.proceed(request.getRequest());
if (response.isSuccessful()) {
String jsonResp = parseResponseStr(response);
if (Constants.DEBUG) {
Logger.d("API", "update token" + jsonResp);
}
TokenResponse tokenResponse =
if (tokenResponse.isSuccessful()) {
return true
}
} else {
response.close();
}
return false;
}
private Response useNewTokenRequestAgain(Chain chain, Map<String, Object> params) throws IOException {
String newToken =
Request.Builder againBuilder = chain.request().newBuilder();
Request request = JsonRequest.buildRequest(againBuilder, params, toke);
return chain.proceed(request);
}
}
protected String parseResponseStr(Response response) throws IOException {
ResponseBody responseBody = response.body();
if (responseBody != null) {
BufferedSource source = responseBody.source();
source.request(Long.MAX_VALUE);
Buffer buffer = source.getBuffer();
return buffer.clone().readString(StandardCharsets.UTF_8);
}
return null;
}
protected String getJsonResponseValue(String jsonString, String key) {
if (TextUtils.isEmpty(jsonString)) return null;
try {
return new JsonParser().parse(jsonString).getAsJsonObject().get(key).getAsString();
} catch (Exception exception) {
return null;
}
}