001package com.gigya.android.sdk.api; 002 003import android.support.annotation.NonNull; 004 005import com.gigya.android.sdk.GigyaLogger; 006import com.gigya.android.sdk.network.GigyaError; 007import com.gigya.android.sdk.network.adapter.IRestAdapter; 008import com.gigya.android.sdk.network.adapter.IRestAdapterCallback; 009 010public class RetryDispatcher { 011 012 private static final String LOG_TAG = "RetryDispatcher"; 013 014 private GigyaApiRequest request; 015 private IRestAdapter adapter; 016 private IRetryHandler handler; 017 private int errorCode; 018 private int tries; 019 020 public interface IRetryHandler { 021 022 void onCompleteWithResponse(GigyaApiResponse retryResponse); 023 024 void onCompleteWithError(GigyaError error); 025 026 void onUpdateDate(String date); 027 } 028 029 private boolean decrement() { 030 this.tries--; 031 return this.tries > 0; 032 } 033 034 public void dispatch() { 035 adapter.send(request, false, new IRestAdapterCallback() { 036 037 @Override 038 public void onResponse(String jsonResponse, String responseDateHeader) { 039 040 // Make sure to update the offset date. 041 handler.onUpdateDate(responseDateHeader); 042 043 final GigyaApiResponse apiResponse = new GigyaApiResponse(jsonResponse); 044 final boolean retry = decrement(); 045 if (retry && apiResponse.getErrorCode() == errorCode) { 046 047 GigyaLogger.debug(LOG_TAG, "Retry error for code: " + errorCode + ". number of tries remaining = " + tries); 048 049 dispatch(); 050 return; 051 } 052 053 GigyaLogger.debug(LOG_TAG, "Retry success."); 054 055 handler.onCompleteWithResponse(apiResponse); 056 } 057 058 @Override 059 public void onError(GigyaError gigyaError) { 060 final boolean retry = decrement(); 061 if (retry && gigyaError.getErrorCode() == errorCode) { 062 063 GigyaLogger.debug(LOG_TAG, "Retry error for code: " + errorCode + ". number of tries remaining = " + tries); 064 065 dispatch(); 066 return; 067 } 068 069 GigyaLogger.debug(LOG_TAG, "Retry Error completion. Parent error flow will continue"); 070 071 handler.onCompleteWithError(gigyaError); 072 } 073 }); 074 } 075 076 public static class Builder { 077 078 private RetryDispatcher dispatcher; 079 080 public Builder(IRestAdapter adapter) { 081 dispatcher = new RetryDispatcher(); 082 dispatcher.adapter = adapter; 083 } 084 085 public RetryDispatcher.Builder request(@NonNull GigyaApiRequest request) { 086 dispatcher.request = request; 087 return this; 088 } 089 090 public RetryDispatcher.Builder errorCode(int errorCode) { 091 dispatcher.errorCode = errorCode; 092 return this; 093 } 094 095 public RetryDispatcher.Builder tries(int tries) { 096 dispatcher.tries = tries; 097 return this; 098 } 099 100 public RetryDispatcher handler(@NonNull IRetryHandler handler) { 101 dispatcher.handler = handler; 102 return dispatcher; 103 } 104 } 105 106}