Skip to content

File Basic.java

File List > algorithm > migration > Basic.java

Go to the documentation of this file

package skydata.behaviour.algorithm.migration;

import jade.core.AID;
import jade.core.behaviours.CyclicBehaviour;
import jade.lang.acl.ACLMessage;
import jade.lang.acl.MessageTemplate;
import skydata.internal.agents.SKAgent;
import skydata.internal.agents.SKD;
import skydata.internal.behaviours.SKAgentBehaviour;
import skydata.internal.message.SKLMessage;

public class Basic extends SKAgentBehaviour {

    private SKD skd;

    public Basic(SKAgent agent) {
        super(agent);
        skd = (SKD) agent;
    }

    @Override
    public void action() {

        // When an agent wishes to migrate
        SKAgentBehaviour whenWantMigrate = new SKAgentBehaviour(agent) {
            @Override
            public void actionWithParameters(Object o) {
                AID harbour = (AID) o;
                skd.migrate(harbour, true);
            }
        };

        skd.addInternalUpdate("WANT_MIGRATE", whenWantMigrate);

        // When an agent has finished migrating
        SKAgentBehaviour afterMigration = new SKAgentBehaviour(agent) {
            public void action() {
                SKLMessage message = new SKLMessage("UPDATE_POSITION", "MIGRATION");
                skd.broadcastFamily(message);
            }
        };

        skd.addInternalUpdate("AFTER_MIGRATION", afterMigration);

        // when you receive someone update
        MessageTemplate mtUpdate = MessageTemplate.and(
                MessageTemplate.MatchProtocol("MIGRATION"),
                MessageTemplate.and(
                        MessageTemplate.MatchPerformative(ACLMessage.INFORM),
                        MessageTemplate.MatchOntology("UPDATE_POSITION")));
        skd.addBehaviour(new CyclicBehaviour(skd) {
            @Override
            public void action() {
                SKLMessage msg = skd.skReceive(mtUpdate);
                if (msg == null) {
                    block();
                    return;
                }
                skd.updatePositionFamily(msg.getSender());

            }
        });

    }

}