package in.srain.cube.cache;
import android.text.TextUtils;
import in.srain.cube.request.JsonData;
public class Query<T> implements ICacheAble<T> {
public enum RequestType {
USE_CACHE_NOT_EXPIRED,
USE_DATA_CREATED,
USE_CACHE_ANYWAY,
FAIL,
}
private QueryHandler mHandler;
private CacheManager mCacheManager;
private long mCacheTime = 86400;
private String mCacheKey;
private boolean mUseCacheAnyway = false;
private boolean mDisable = false;
private String mInitAssertPath = null;
public Query(CacheManager cacheManager) {
mCacheManager = cacheManager;
}
public void continueAfterCreateData(final String data) {
if (!TextUtils.isEmpty(data)) {
mCacheManager.continueAfterCreateData(this, data);
} else {
queryFail();
}
}
public Query<T> setCacheTime(long time) {
mCacheTime = time;
return this;
}
private void queryFail() {
mHandler.onQueryFinish(RequestType.FAIL, null, true);
}
public <T> void setHandler(QueryHandler<T> handler) {
mHandler = handler;
}
public void query() {
mCacheManager.requestCache(this);
}
public T querySync() {
return mCacheManager.requestCacheSync(this);
}
@Override
public long getCacheTime() {
return mCacheTime;
}
@Override
public String getCacheKey() {
return mCacheKey;
}
@Override
public Query<T> setCacheKey(String key) {
mCacheKey = key;
return this;
}
@Override
public Query<T> setUseCacheAnyway(boolean use) {
mUseCacheAnyway = use;
return this;
}
@Override
public boolean useCacheAnyway() {
return mUseCacheAnyway;
}
@Override
public Query<T> setAssertInitDataPath(String path) {
mInitAssertPath = path;
return this;
}
@Override
public String getAssertInitDataPath() {
return mInitAssertPath;
}
@Override
public T processRawDataFromCache(JsonData rawData) {
if (mHandler != null) {
return (T) mHandler.processRawDataFromCache(rawData);
}
return null;
}
@Override
public void onCacheData(CacheResultType cacheResultType, T cacheData, boolean outOfDate) {
switch (cacheResultType) {
case FROM_CACHE_FILE:
break;
case FROM_INIT_FILE:
break;
case FROM_MEMORY:
break;
case FROM_CREATED:
break;
}
if (outOfDate) {
if (mHandler != null && mUseCacheAnyway) {
mHandler.onQueryFinish(RequestType.USE_CACHE_ANYWAY, cacheData, outOfDate);
}
} else {
switch (cacheResultType) {
case FROM_CACHE_FILE:
break;
case FROM_INIT_FILE:
break;
case FROM_MEMORY:
break;
case FROM_CREATED:
break;
}
if (mHandler != null) {
mHandler.onQueryFinish(RequestType.USE_CACHE_NOT_EXPIRED, cacheData, true);
}
}
}
@Override
public void onNoCacheData(CacheManager cacheManager) {
if (mHandler != null) {
continueAfterCreateData(mHandler.createDataForCache(this));
} else {
queryFail();
}
}
@Override
public Query<T> setDisableCache(boolean disable) {
mDisable = disable;
return this;
}
@Override
public boolean cacheIsDisabled() {
return mHandler != null && mDisable;
}
}