package se.chalmers.gdcn.replica;
import se.chalmers.gdcn.control.TaskManager;
import se.chalmers.gdcn.control.WorkerReputationManager;
import se.chalmers.gdcn.network.WorkerID;
import se.chalmers.gdcn.utils.Time;
/**
* Created by Leif on 2014-04-16.
*/
public class ReplicaManagerBuilder {
private int replicas = 2;
private int expectedReputation = 3;
private Time timeoutLengthUnit = Time.MINUTE;
private int timeoutLengthValue = 15;
private long timerUpdateIntervalMillis = 50000;
private WorkerReputationManager workerReputationManager = null;
private TaskManager taskManager = null;
private WorkerID myWorkerID = null;
/**
* @param myWorkerID this node's workerID, used in WorkerReputationManager
* @param taskManager taskManager
*/
public ReplicaManagerBuilder(WorkerID myWorkerID, TaskManager taskManager) {
this.myWorkerID = myWorkerID;
this.taskManager = taskManager;
}
/**
* Only used for testing!
* @param workerReputationManager WorkerReputationManager
*/
public ReplicaManagerBuilder(WorkerReputationManager workerReputationManager) {
this.workerReputationManager = workerReputationManager;
}
public ReplicaManager create(){
if(workerReputationManager == null){
if(myWorkerID == null){
throw new IllegalStateException("WorkerID or WorkerReputationManager must be set before creation!");
}
workerReputationManager = new WorkerReputationManager(myWorkerID);
}
return new ReplicaManager(workerReputationManager, taskManager, timeoutLengthUnit, timerUpdateIntervalMillis,
replicas, expectedReputation, timeoutLengthValue);
}
public ReplicaManagerBuilder setReplicas(int replicas) {
this.replicas = replicas;
return this;
}
public ReplicaManagerBuilder setExpectedReputation(int expectedReputation) {
this.expectedReputation = expectedReputation;
return this;
}
/**
* Set timeout length for replica.
* @param length time length
* @param unit Time unit
* @return builder object
*/
public ReplicaManagerBuilder setTimeoutLength(int length, Time unit){
this.timeoutLengthUnit = unit;
this.timeoutLengthValue = length;
return this;
}
/**
* Set update time interval for timer, should be much lower than timeout interval.
* Update is cheap so this can be quite short.
* @param length time length
* @param unit Time unit
* @return builder object
*/
public ReplicaManagerBuilder setTimerUpdateInterval(int length, Time unit) {
this.timerUpdateIntervalMillis = unit.getComparedToMillis()*length;
return this;
}
}