File FaultCreator.java¶
File List > behaviour > evals > FaultCreator.java
Go to the documentation of this file
package skydata.behaviour.evals;
import java.time.Instant;
import java.util.HashSet;
import java.util.Random;
import java.util.Set;
import jade.core.behaviours.CyclicBehaviour;
import jade.lang.acl.ACLMessage;
import jade.lang.acl.MessageTemplate;
import skydata.internal.agents.SKAgent;
import skydata.internal.behaviours.SKAgentBehaviour;
import skydata.internal.message.SKAID;
import skydata.internal.message.SKLMessage;
public class FaultCreator extends SKAgentBehaviour {
private Set<SKAID> firsts;
private Set<SKAID> others;
private int nbFirst;
private int nbFirstCrashed;
private Set<SKAID> crashed;
private Random random;
private int nbSeconds;
public FaultCreator(SKAgent agent) {
super(agent);
this.nbSeconds = (Integer) (agent.args.get("nbSeconds"));
this.nbFirst = (Integer) (agent.args.get("nbFirst"));
this.firsts = new HashSet<>();
this.others = new HashSet<>();
this.crashed = new HashSet<>();
this.nbFirstCrashed = 0;
this.random = new Random();
}
@Override
public void action() {
double probability = (Double) (agent.args.get("probabilityCrash"));
Instant beginning = Instant.now();
agent.print("Failure creator enabled !");
MessageTemplate mtAnnounce = MessageTemplate.and(
MessageTemplate.MatchOntology("ANNOUNCE"),
MessageTemplate.and(
MessageTemplate.MatchPerformative(ACLMessage.INFORM),
MessageTemplate.MatchProtocol("FAILURE_SIMULATOR")));
agent.addBehaviour(new CyclicBehaviour(agent) {
@Override
public void action() {
SKLMessage acl = agent.skReceive(mtAnnounce);
if (acl == null) {
block();
return;
}
agent.print("Je reçoit une annonce d'un nouveau membre");
if (firsts.size() < nbFirst) {
firsts.add(acl.getSender());
} else {
others.add(acl.getSender());
}
}
});
MessageTemplate mtRequest = MessageTemplate.and(
MessageTemplate.MatchOntology("REQUEST"),
MessageTemplate.and(
MessageTemplate.MatchPerformative(ACLMessage.INFORM),
MessageTemplate.MatchProtocol("FAILURE_SIMULATOR")));
agent.addBehaviour(new CyclicBehaviour(agent) {
@Override
public void action() {
SKLMessage acl = agent.skReceive(mtRequest);
if (acl == null) {
block();
return;
}
agent.print("Je reçoit une requête de crash");
SKLMessage answer = new SKLMessage("ANSWER", "FAILURE_SIMULATOR");
answer.setContent(false);
if (Instant.now().toEpochMilli() - beginning.toEpochMilli() < nbSeconds * 1000) {
if (crashed.contains(acl.getSender())) {
answer.setContent(true);
} else if (firsts.contains(acl.getSender())) {
if (nbFirstCrashed + 1 <= firsts.size() / 2 && random.nextDouble() < probability) {
answer.setContent(true);
crashed.add(acl.getSender());
}
} else {
if (random.nextDouble() < probability) {
answer.setContent(true);
crashed.add(acl.getSender());
}
}
}
answer.addReceiver(acl.getSender());
agent.skSendNormal(answer);
}
});
}
}