package se.chalmers.gdcn.deceitful;
import net.tomp2p.p2p.Peer;
import net.tomp2p.p2p.PeerMaker;
import net.tomp2p.peers.PeerAddress;
import se.chalmers.gdcn.communicationToUI.ClientInterface;
import se.chalmers.gdcn.control.TaskManager;
import se.chalmers.gdcn.files.DataFilesManager;
import se.chalmers.gdcn.network.AbstractDeceitfulWork;
import se.chalmers.gdcn.network.TaskPasser;
import se.chalmers.gdcn.network.TaskPasser.WorkMethod;
import se.chalmers.gdcn.replica.ReplicaBox;
import java.io.IOException;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
/**
* Created by HalfLeif on 2014-05-23.
*
* TODO doesn't work atm, fix later if want to use this one
* @deprecated
*/
public class SpamWork implements DeceitfulWork{
private final TaskManager taskManager;
private final ClientInterface client;
private final Peer[] peers;
private final SpamWorkerNode[] spamWorkerNodes;
private KeyPairGenerator keyPairGenerator = null;
private int startPort = 37000;
private long timeout = 25000L;
public SpamWork(int times, TaskManager taskManager, ClientInterface client) {
this.taskManager = taskManager;
this.client = client;
this.peers = new Peer[times];
this.spamWorkerNodes = new SpamWorkerNode[times];
try {
keyPairGenerator = KeyPairGenerator.getInstance("RSA");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
public void setStartPort(int startPort) {
this.startPort = startPort;
}
public void setTimeout(long timeout) {
this.timeout = timeout;
}
@Deceitful
@Override
public void requestWork(final PeerAddress jobOwner) {
try {
for(int ix=0; ix<peers.length; ++ix){
KeyPair keyPair = keyPairGenerator.generateKeyPair();
Peer peer1 = new PeerMaker(keyPair).setPorts(startPort+ix).makeAndListen();
DataFilesManager dataFilesManager = new DataFilesManager("DECEIT",""+ix);
TaskPasser taskPasser = new TaskPasser(peer1, taskManager, client, dataFilesManager);
final SpamWorkerNode spamWorkerNode = new SpamWorkerNode(client, taskPasser, peer1);
spamWorkerNodes[ix] = spamWorkerNode;
taskManager.submit(new Runnable() {
@Override
public void run() {
spamWorkerNode.requestWork(jobOwner);
}
});
}
taskManager.submit(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(timeout);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Shutdown all peers");
stop();
}
});
} catch (IOException e) {
e.printStackTrace();
stop();
}
}
private void stop(){
for(Peer peer : peers){
if(peer != null && !peer.isShutdown()){
peer.shutdown();
}
}
}
private static class SpamWorkerNode extends AbstractDeceitfulWork{
public SpamWorkerNode(ClientInterface client, TaskPasser taskPasser, Peer peer) {
super(client, taskPasser, peer);
}
private WorkMethod workMethod = new WorkMethod() {
@Override
public void work(PeerAddress jobOwner, ReplicaBox replicaBox, boolean autoWork) {
final String taskName = replicaBox.getTaskMeta().getTaskName();
System.out.println("Task " + taskName + " finished. Will never notify job owner!");
requestWork(jobOwner);
}
};
@Override
public void requestWork(PeerAddress jobOwner) {
taskPasser.requestWork(jobOwner, true, workMethod);
}
}
}