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}