import java.util.ArrayList;
import java.util.Random;
import java.util.TimerTask;
/**
* The Class OptimisticUnchoking.
*
* @author Deepak, Mike, Josh
*/
public class OptimisticUnchoking extends TimerTask{
/** The manager. */
Manager manager;
/**
* Instantiates a new optimistic unchoking.
*
* @param manager the manager
*/
OptimisticUnchoking(Manager manager){
this.manager = manager;
}
/* (non-Javadoc)
* @see java.util.TimerTask#run()
*/
public void run(){
Peer worst = null;
long worstRate = Long.MAX_VALUE;
for(Peer p : manager.peers){
if(p.weAreChokingPeer == false){
if(manager.downloadingStatus == true){
if(worstRate > p.totalDownload){
worst = p;
worstRate = p.totalDownload;
}
} else {
if(worstRate > p.totalUpload){
worst = p;
worstRate = p.totalUpload;
}
}
}
}
ArrayList<Integer> indices = new ArrayList<Integer>();
for(Peer p : manager.peers){
if(p.weAreChokingPeer == true){
indices.add(manager.peers.indexOf(p));
}
}
System.out.println(indices);
Random random = new Random();
int n = random.nextInt(indices.size());
worst.weAreChokingPeer = true;
RUBTClient.updatePeerChokeStatus(worst, true);
manager.peers.get(indices.get(n)).weAreChokingPeer = false;
RUBTClient.updatePeerChokeStatus(manager.peers.get(indices.get(n)),false);
worst.choke();
manager.peers.get(indices.get(n)).unchoke();
for(Peer p : manager.peers){
p.totalDownload = 0;
p.totalDownload = 0;
}
}
}