Skip to content

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);
            }
        });

    }

}