package se.chalmers.gdcn.control;
import net.tomp2p.peers.PeerAddress;
import se.chalmers.gdcn.communicationToUI.ClientInterface;
import se.chalmers.gdcn.files.Downloader;
import se.chalmers.gdcn.files.JobUploader;
import se.chalmers.gdcn.files.TaskMeta;
import se.chalmers.gdcn.files.TaskMetaDataException;
import se.chalmers.gdcn.network.StringHolder;
import se.chalmers.gdcn.replica.ReplicaManager;
import se.chalmers.gdcn.taskbuilder.Task;
import se.chalmers.gdcn.taskbuilder.communicationToClient.TaskFailureListener;
import se.chalmers.gdcn.taskbuilder.communicationToClient.TaskListener;
import java.io.FileNotFoundException;
/**
* Created by HalfLeif on 2014-02-28.
*
* Manager of running tasks. Can run multiple tasks concurrently.
*/
public class TaskManager implements TaskRunner {
private final TaskListener taskListener;
private final ClientInterface client;
/**
*
* @param taskListener Listener for the different kinds of things TaskManager can do such as Upload job or work on task
* @param client Client such as {@link se.chalmers.gdcn.control.PeerOwner} that can do network operations.
*/
public TaskManager(TaskListener taskListener, ClientInterface client) {
this.taskListener = taskListener;
this.client = client;
}
//TODO handle Listeners more nicely...
/**
* Submits a runnable to run concurrently in the thread pool.
* Is currently used for solving challenges concurrently.
*
* @param runnable Runnable
*/
@Override
public void submit(Runnable runnable){
ThreadService.submit(runnable);
}
@Override
public TaskListener getTaskListener() {
return taskListener;
}
/**
* Work on this task
* @param projectName Name of working directory that contains /resources etc
* @param taskMeta Meta information of the task
* @param resultFileNameHolder Holder that will contain the absolute path of the future result file of this task.
* @param subjectListener Can be null, will be combined with the TaskManagers own listener.
*/
public void startTask(final String projectName, final TaskMeta taskMeta, final StringHolder resultFileNameHolder,
final PeerAddress jobOwner, final TaskListener subjectListener){
ThreadService.submit(new Runnable() {
@Override
public void run() {
//Delegates error passing to client (ie PeerOwner). Makes call to his listeners
try {
Downloader downloader = new Downloader(taskMeta, projectName, client, jobOwner,new TaskFailureListener() {
@Override
public void taskFailed(String taskName, String reason) {
if(subjectListener != null){
subjectListener.taskFailed(taskName, reason);
}
taskListener.taskFailed(taskName, reason);
}
});
boolean success = downloader.runAndAwait();
resultFileNameHolder.setString(downloader.futureResultFilePath());
if(!success){
TaskManager.this.taskListener.taskFailed(taskMeta.getTaskName(), "Unresolved dependencies");
return;
}
Task task = downloader.buildTask(new TaskListener() {
@Override
public void taskFinished(String taskName) {
if(subjectListener != null){
subjectListener.taskFinished(taskName);
}
taskListener.taskFinished(taskName);
}
@Override
public void taskFailed(String taskName, String reason) {
if(subjectListener != null){
subjectListener.taskFailed(taskName, reason);
}
taskListener.taskFailed(taskName, reason);
}
});
ThreadService.submit(task);
} catch (TaskMetaDataException e) {
e.printStackTrace();
if(subjectListener != null) {
subjectListener.taskFailed(taskMeta.getTaskName(), e.getMessage());
}
taskListener.taskFailed(taskMeta.getTaskName(), e.getMessage());
}
}
});
}
/**
* Upload entire job, that is all necessary files within the directory to fulfill the TaskMetas
* @param jobName Name of job directory
* @param replicaManager Manager that will produce replicas of each task
*/
public void uploadJob(final String jobName, final ReplicaManager replicaManager){
ThreadService.submit(new Runnable() {
@Override
public void run() {
try {
JobUploader jobUploader = JobUploader.create(jobName, client, taskListener, replicaManager);
boolean success = jobUploader.runAndAwait();
if(!success){
taskListener.taskFailed(jobName, "Unresolved dependencies");
} else {
taskListener.taskFinished(jobName);
System.out.println("push done");
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (TaskMetaDataException e) {
e.printStackTrace();
}
}
});
}
}