package com.nutiteq.task;
import com.mgmaps.utils.Queue;
import com.nutiteq.cache.Cache;
import com.nutiteq.fs.FileSystem;
import com.nutiteq.io.ResourceRequestor;
import com.nutiteq.io.RetrieveResourceTask;
import com.nutiteq.license.LicenseKeyCheck;
import com.nutiteq.listeners.ErrorListener;
import com.nutiteq.net.DefaultDownloadStreamOpener;
import com.nutiteq.net.DownloadCounter;
import com.nutiteq.net.DownloadHandler;
import com.nutiteq.net.DownloadRequestor;
import com.nutiteq.net.DownloadStreamOpener;
public class TasksRunnerImpl implements DownloadHandler, TasksRunner {
private final Queue executionQueue;
private Object currentObject;
private boolean stopping;
private boolean started;
private ErrorListener errorListener;
private TaskWorker worker;
public TasksRunnerImpl(final Queue tasksQueue) {
executionQueue = tasksQueue;
worker = new TaskWorker(this, new DefaultDownloadStreamOpener(), null, null, null, null);
}
public boolean hasMoreTasks() {
return !executionQueue.isEmpty();
}
public Object getNextTask() {
currentObject = executionQueue.pop();
return currentObject;
}
/**
* Enqueue task for execution.
*/
public void enqueue(final Task o) {
if (!stopping && (!o.equals(currentObject)) && executionQueue.find(o) == null) {
executionQueue.push(o);
if (!started) {
return;
}
synchronized (worker) {
worker.notify();
}
}
}
public void quit() {
stopping = true;
synchronized (worker) {
worker.quit();
worker=null;
}
}
public void setErrorListener(final ErrorListener errorListener) {
this.errorListener = errorListener;
}
public synchronized void enqueueDownload(final ResourceRequestor d, final int cacheLevel) {
final RetrieveResourceTask task = new RetrieveResourceTask(d);
enqueue(task);
}
public synchronized void enqueueDownloadRequestor(final DownloadRequestor requestor,
final int cacheLevel) {
final DownloadRequestorTask task = new DownloadRequestorTask(requestor, errorListener, this);
enqueue(task);
}
public void setDownloadStreamOpener(final DownloadStreamOpener opener) {
worker.setDownloadStreamOpener(opener);
}
public void setNetworkCache(final Cache networkCache) {
worker.setNetworkCache(networkCache);
}
public void setWorker(final TaskWorker next) {
worker = next;
}
public void taskCompleted() {
currentObject = null;
}
public void startWorker() {
started = true;
synchronized (worker) {
if(!worker.isAlive()){
worker.start();
}
}
}
public void setDownloadCounter(final DownloadCounter downloadCounter) {
worker.setDownloadCounter(downloadCounter);
}
public void setFileSystem(final FileSystem fs) {
worker.setFileSystem(fs);
}
public Cache getNetworkCache() {
return worker.getNetworkCache();
}
public FileSystem getFileSystem() {
return worker.getFileSystem();
}
public void setLicenceKeyCheck(final LicenseKeyCheck licenseKeyCheck) {
worker.setLicenceKeyCheck(licenseKeyCheck);
}
}