package se.chalmers.gdcn.files;
import net.tomp2p.peers.Number160;
import net.tomp2p.storage.Data;
import se.chalmers.gdcn.communicationToUI.CommandWord;
import se.chalmers.gdcn.communicationToUI.NetworkInterface;
import se.chalmers.gdcn.replica.ReplicaManager;
import se.chalmers.gdcn.taskbuilder.communicationToClient.TaskFailureListener;
import se.chalmers.gdcn.taskbuilder.fileManagement.PathManager;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* Created by HalfLeif on 2014-03-05.
*/
public class JobUploader extends AbstractFileMaster{
private final TaskFailureListener taskFailureListener;
private JobUploader(PathManager pathManager, TaskMeta taskMeta, NetworkInterface client, TaskFailureListener taskFailureListener) throws TaskMetaDataException {
super(taskMeta, client, taskFailureListener, CommandWord.PUT, pathManager);
this.taskFailureListener = taskFailureListener;
}
/**
*
* @param jobName Name of directory for this job
* @param client Client that handles network operations
* @param taskFailureListener Listener that notifies on failures
* @param replicaManager ReplicaManager that makes replicas of read tasks
* @return JobUploader that pushes all job files to DHT
*
* @throws FileNotFoundException
* @throws TaskMetaDataException
*/
public static JobUploader create(String jobName, NetworkInterface client, TaskFailureListener taskFailureListener, ReplicaManager replicaManager) throws FileNotFoundException, TaskMetaDataException {
PathManager manager = PathManager.jobOwner(jobName);
File file = new File(manager.taskMetaDir());
System.out.println("MetaDir: "+file.getAbsolutePath());
String[] tasks = file.list();
Set<FileDep> allFileDependencies = new HashSet<>();
List<FileDep> dependencyTasks = new ArrayList<>();
for(String task:tasks){
if(task.equals(".DS_Store")){
continue;
}
System.out.println("\t"+task);
FileDep fileDep = new FileDep(task, "tasks", Number160.createHash(task), true, 0);
dependencyTasks.add(fileDep);
// allFileDependencies.add(fileDep); //Since taskMeta shall be sent using MPI instead...
}
List<TaskMeta> taskMetas = new ArrayList<>();
for(FileDep fileDep : dependencyTasks){
TaskMeta taskMeta = AbstractFileMaster.readMetaFile( FileManagementUtils.pathTo(manager, fileDep));
taskMetas.add(taskMeta);
taskMeta.getModule().setDhtKey(Number160.createHash(taskMeta.getModule().getFileName()));
setFileDepDHTKey(taskMeta.getModule());
for(FileDep f : taskMeta.getDependencies()) {
setFileDepDHTKey(f);
}
allFileDependencies.add(taskMeta.getModule());
allFileDependencies.addAll(taskMeta.getDependencies());
}
replicaManager.loadTasksAndReplicate(jobName, taskMetas);
for(FileDep fileDep : allFileDependencies){
System.out.println(" Dependency: "+fileDep.getFileName());
}
TaskMeta totalJobMeta = new TaskMeta("Upload"+jobName, null, new ArrayList<>(allFileDependencies));
return new JobUploader(manager, totalJobMeta, client, taskFailureListener);
}
/**
* {@inheritDoc}
*/
@Override
protected void ifFileExist(FileDep fileDep) {
File file = FileManagementUtils.pathTo(pathManager, fileDep);
try {
// System.out.println("Put " + FileManagementUtils.pathTo(pathManager, fileDep));
Data data = new Data(FileManagementUtils.fromFile(file));
client.put(fileDep.getDhtKey(), client.getID(), data);
//Handling OperationFinished is done in AbstractFileMaster
} catch (IOException e) {
e.printStackTrace();
taskFailureListener.taskFailed(taskMeta.getTaskName(), "Failed to serialize: " + FileManagementUtils.pathTo(pathManager, fileDep) +
"\n"+e.getMessage());
}
}
/**
* {@inheritDoc}
*/
@Override
protected void ifFileDoNotExist(FileDep fileDep) {
taskFailureListener.taskFailed(taskMeta.getTaskName(), "Unable to resolve "+ FileManagementUtils.pathTo(pathManager, fileDep));
}
/**
* {@inheritDoc}
*/
@Override
protected void operationForDependentFileSuccess(FileDep fileDep, Object result) {
System.out.println("Successfully put " + fileDep.getFileName());
super.fileDependencyResolved(fileDep);
}
private static void setFileDepDHTKey(FileDep f) {
f.setDhtKey(Number160.createHash(f.getFileName()));
}
}