package com.shizhefei.task.tasks;
import com.shizhefei.mvc.RequestHandle;
import com.shizhefei.mvc.ResponseSender;
import com.shizhefei.task.Code;
import com.shizhefei.task.IAsyncTask;
import com.shizhefei.task.TaskHelper;
import com.shizhefei.task.function.Func1;
import com.shizhefei.task.imp.SimpleCallback;
class ConcatLinkTask<D1, DATA> extends LinkTask<DATA> {
private IAsyncTask<D1> task;
private Func1<D1, IAsyncTask<DATA>> func1;
private ProxyRequestHandle proxyRequestHandle;
public ConcatLinkTask(IAsyncTask<D1> task, Func1<D1, IAsyncTask<DATA>> func1) {
this.func1 = func1;
this.task = task;
proxyRequestHandle = new ProxyRequestHandle();
}
@Override
public RequestHandle execute(final ResponseSender<DATA> sender) throws Exception {
proxyRequestHandle.requestHandle = TaskHelper.createExecutor(task, new SimpleCallback<D1>() {
@Override
public void onProgress(Object task, int percent, long current, long total, Object extraData) {
super.onProgress(task, percent, current, total, extraData);
sender.sendProgress(current, total, extraData);
}
@Override
public void onPostExecute(Object task, Code code, Exception exception, D1 d1) {
switch (code) {
case SUCCESS:
try {
IAsyncTask<DATA> task2 = func1.call(d1);
proxyRequestHandle.requestHandle = task2.execute(sender);
} catch (Exception e) {
sender.sendError(e);
e.printStackTrace();
}
break;
case EXCEPTION:
sender.sendError(exception);
break;
case CANCEL:
func1 = null;
break;
}
}
}).execute();
return proxyRequestHandle;
}
private static class ProxyRequestHandle implements RequestHandle {
private RequestHandle requestHandle;
@Override
public void cancle() {
if (requestHandle != null) {
requestHandle.cancle();
}
}
@Override
public boolean isRunning() {
if (requestHandle != null) {
return requestHandle.isRunning();
}
return false;
}
}
}