package com.datdo.mobilib.api; import android.os.Handler; import android.text.TextUtils; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.regex.Pattern; import com.datdo.mobilib.api.MblApi.*; import com.datdo.mobilib.util.MblUtils; /** * <pre> * Request specification. * </pre> * @see com.datdo.mobilib.api.MblApi#run(MblRequest) */ public class MblRequest { static abstract class MblStatusCodeValidator { abstract boolean isSuccess(int statusCode); } static MblStatusCodeValidator sDefaultStatusCodeValidator = new MblStatusCodeValidator() { @Override boolean isSuccess(int statusCode) { return statusCode >= 200 && statusCode <= 299; } }; static MblApiCallback sDefaultCallback = new MblApiCallback() { @Override public void onSuccess(MblResponse response) { } @Override public void onFailure(MblResponse response) { } }; private String mUrl; private Method mMethod; private Map<String, ? extends Object> mParams = new HashMap<>(); private Map<String, String> mHeaderParams = new HashMap<>(); private long mCacheDuration = -1; private boolean mVerifySSL = false; private MblApiCallback mCallback = sDefaultCallback; private Handler mCallbackHandler = MblUtils.getMainThreadHandler(); private MblStatusCodeValidator mStatusCodeValidator = sDefaultStatusCodeValidator; private String mData; private boolean mRedirectEnabled = false; private long mTimeout = -1; public MblRequest() {} @Override public String toString() { List<String> tokens = new ArrayList<>(); tokens.add("URL=" + mUrl); tokens.add("METHOD=" + mMethod.name()); tokens.add("HEADERS=" + mHeaderParams); tokens.add("PARAMS=" + mParams); tokens.add("CACHE_DURATION=" + mCacheDuration); tokens.add("VERIFY_SSL=" + mVerifySSL); tokens.add("DATA=" + mData); tokens.add("REDIRECT_ENABLED=" + mRedirectEnabled); return "{" + TextUtils.join(", ", tokens) + "}"; } public MblRequest setUrl(String url) { mUrl = url; return this; } public MblRequest setMethod(Method method) { mMethod = method; return this; } public MblRequest setParams(Map<String, ? extends Object> params) { mParams = params; return this; } public MblRequest setParams(Object... args) { if (args.length % 2 != 0) { throw new RuntimeException("Number of arguments must be even"); } Map<String, Object> params = new HashMap<>(); for (int i = 0; i < args.length; i += 2) { if (args[i] == null) { throw new RuntimeException( "Argument at event index must not be NULL. Argument at index " + i + " is NULL"); } if (!(args[i] instanceof String)) { throw new RuntimeException( "Argument at event index must be instance of String. Argument at index " + i + " is instance of " + args[i].getClass().getSimpleName()); } String key = (String) args[i]; Object val = args[i+1]; params.put(key, val); } mParams = params; return this; } public MblRequest setHeaderParams(Map<String, String> headerParams) { mHeaderParams = headerParams; return this; } public MblRequest setHeaderParams(String... args) { if (args.length % 2 != 0) { throw new RuntimeException("Number of arguments must be even"); } Map<String, String> header = new HashMap<>(); for (int i = 0; i < args.length; i += 2) { if (args[i] == null) { throw new RuntimeException( "Argument at event index must not be NULL. Argument at index " + i + " is NULL"); } String key = args[i]; String val = args[i+1]; header.put(key, val); } mHeaderParams = header; return this; } public MblRequest setCacheDuration(long cacheDuration) { mCacheDuration = cacheDuration; return this; } public MblRequest setVerifySSL(boolean verifySSL) { mVerifySSL = verifySSL; return this; } public MblRequest setCallback(MblApiCallback callback) { mCallback = callback; return this; } public MblRequest setCallbackHandler(Handler callbackHandler) { mCallbackHandler = callbackHandler; return this; } public MblRequest setSuccessStatusCodes(final String regex) { mStatusCodeValidator = new MblStatusCodeValidator() { @Override boolean isSuccess(int statusCode) { return regex == null || String.valueOf(statusCode).matches(regex); } }; return this; } public MblRequest setSuccessStatusCodes(final int... statusCodes) { mStatusCodeValidator = new MblStatusCodeValidator() { @Override boolean isSuccess(int statusCode) { for (int i = 0; i < statusCodes.length; i++) { if (statusCode == statusCodes[i]) { return true; } } return false; } }; return this; } public MblRequest setData(String data) { mData = data; return this; } public MblRequest setRedirectEnabled(boolean redirectEnabled) { mRedirectEnabled = redirectEnabled; return this; } public MblRequest setTimeout(long timeout) { mTimeout = timeout; return this; } public String getUrl() { return mUrl; } public Method getMethod() { return mMethod; } public Map<String, ? extends Object> getParams() { return mParams; } public Map<String, String> getHeaderParams() { return mHeaderParams; } public long getCacheDuration() { return mCacheDuration; } public boolean isVerifySSL() { return mVerifySSL; } public MblApiCallback getCallback() { return mCallback; } public Handler getCallbackHandler() { return mCallbackHandler; } MblStatusCodeValidator getStatusCodeValidator() { return mStatusCodeValidator; } public String getData() { return mData; } public boolean isRedirectEnabled() { return mRedirectEnabled; } public long getTimeout() { return mTimeout; } }