package se.chalmers.gdcn.deceitful;
import net.tomp2p.p2p.Peer;
import net.tomp2p.peers.Number160;
import net.tomp2p.peers.PeerAddress;
import net.tomp2p.storage.Data;
import se.chalmers.gdcn.communicationToUI.ClientInterface;
import se.chalmers.gdcn.communicationToUI.CommandWord;
import se.chalmers.gdcn.communicationToUI.Operation;
import se.chalmers.gdcn.communicationToUI.OperationFinishedListener;
import se.chalmers.gdcn.control.TaskManager;
import se.chalmers.gdcn.files.FalseMeta;
import se.chalmers.gdcn.files.FileManagementUtils;
import se.chalmers.gdcn.files.TaskMeta;
import se.chalmers.gdcn.network.AbstractDeceitfulWork;
import se.chalmers.gdcn.network.StringHolder;
import se.chalmers.gdcn.network.TaskPasser;
import se.chalmers.gdcn.network.TaskPasser.WorkMethod;
import se.chalmers.gdcn.replica.ReplicaBox;
import se.chalmers.gdcn.taskbuilder.communicationToClient.TaskListener;
import java.io.File;
import java.io.IOException;
/**
* Created by HalfLeif on 2014-05-23.
*/
public class FalseWork extends AbstractDeceitfulWork {
private final TaskManager taskManager;
public FalseWork(TaskPasser taskPasser, ClientInterface client, Peer peer, TaskManager taskManager) {
super(client, taskPasser, peer);
this.taskManager = taskManager;
}
/**
* Simple attempt returning a random result to a jobOwner for a given task.
* Result size is hard-coded after the Module-name of the task.
*
* @param jobOwner jobOwner to dupe
*/
@Deceitful
@Override
public void requestWork(PeerAddress jobOwner){
taskPasser.requestWork(jobOwner, false, new WorkMethod() {
@Override
public void work(final PeerAddress jobOwner, final ReplicaBox replicaBox, final boolean autoWork) {
TaskMeta originalMeta = replicaBox.getTaskMeta();
final StringHolder stringHolder = new StringHolder();
TaskMeta falseMeta = FalseMeta.falsify(originalMeta, "False"+originalMeta.getModule().getFileName());
taskManager.startTask("FalseWork", falseMeta, stringHolder, jobOwner, new TaskListener() {
@Override
public void taskFinished(String taskName) {
final Number160 resultKey = replicaBox.getResultKey();
final String taskName1 = replicaBox.getTaskMeta().getTaskName();
client.addListener(new OperationFinishedListener(client, resultKey, CommandWord.PUT) {
@Override
protected void operationFinished(Operation operation) {
if (operation.isSuccess()) {
System.out.println("FalseWork: Task " + taskName1 + " finished. Job owner notified if still online.");
notifyJobOwner(taskPasser, jobOwner, myWorkerID, replicaBox.getReplicaID());
}
}
});
System.out.println("FalseWork: Task " + taskName + " finished. Attempt to upload and notify job owner.");
byte[] result = null;
try {
result = FileManagementUtils.fromFile(new File(stringHolder.getString()));
} catch (IOException e) {
e.printStackTrace();
taskFailed(taskName, e.getMessage());
}
if (result != null) {
System.out.println("\nResult holds " + result.length + " bytes.");
client.put(resultKey, jobOwner.getID(), new Data(result));
}
}
@Override
public void taskFailed(String taskName, String reason) {
}
});
}
});
}
}