package in.srain.cube.request;
import in.srain.cube.concurrent.SimpleExecutor;
import in.srain.cube.concurrent.SimpleTask;
import in.srain.cube.request.sender.BaseRequestSender;
import in.srain.cube.request.sender.RequestSenderFactory;
import in.srain.cube.util.CLog;
import in.srain.cube.util.CubeDebug;
/**
* @author http://www.liaohuqiu.net
*/
public class DefaultRequestProxy implements IRequestProxy {
private static final boolean DEBUG = CubeDebug.DEBUG_REQUEST;
private static final String LOG_TAG = CubeDebug.DEBUG_REQUEST_LOG_TAG;
private static IRequestProxy sInstance;
private SimpleExecutor mSimpleExecutor;
protected DefaultRequestProxy() {
mSimpleExecutor = SimpleExecutor.create("cube-request-", 2, 4);
}
public static IRequestProxy getInstance() {
if (sInstance == null) {
sInstance = new DefaultRequestProxy();
}
return sInstance;
}
protected static <T> T doSyncRequest(IRequest<T> request) {
T data = null;
try {
StringBuilder sb = new StringBuilder();
RequestData requestData = request.getRequestData();
if (DEBUG) {
CLog.d(LOG_TAG, "%s", requestData);
}
BaseRequestSender requestSender = RequestSenderFactory.create(request);
if (requestSender != null) {
requestSender.send();
requestSender.getResponse(sb);
if (DEBUG) {
CLog.d(LOG_TAG, "%s: %s", requestData, sb.toString());
}
data = request.onDataFromServer(sb.toString());
}
} catch (Exception e) {
e.printStackTrace();
request.setFailData(FailData.networkError(request));
}
return data;
}
@Override
public <T> T requestSync(final IRequest<T> request) {
final T data = doSyncRequest(request);
Runnable runnable = new Runnable() {
@Override
public void run() {
if (data == null) {
request.onRequestFail(request.getFailData());
} else {
request.onRequestSuccess(data);
}
}
};
SimpleTask.post(runnable);
return data;
}
@Override
public <T> void sendRequest(final IRequest<T> request) {
DoRequestTask<T> doRequestTask = new DoRequestTask<T>(request);
mSimpleExecutor.execute(doRequestTask);
}
@Override
public void prepareRequest(RequestBase request) {
}
@Override
public void onRequestFail(RequestBase request, FailData failData) {
}
@Override
public JsonData processOriginDataFromServer(RequestBase request, JsonData data) {
return data;
}
private static class DoRequestTask<T> extends SimpleTask {
private T mData;
private IRequest<T> mRequest;
private DoRequestTask(IRequest<T> request) {
mRequest = request;
}
@Override
public void doInBackground() {
mData = doSyncRequest(mRequest);
}
@Override
public void onFinish(boolean canceled) {
if (mData == null) {
mRequest.onRequestFail(mRequest.getFailData());
} else {
mRequest.onRequestSuccess(mData);
}
}
}
}