Skip to content

File UpdateStatsHarbour.java

File List > behaviours > UpdateStatsHarbour.java

Go to the documentation of this file

package skydata.internal.behaviours;

import java.io.IOException;
import java.io.Serializable;
import java.util.HashMap;

import jade.core.behaviours.CyclicBehaviour;
import jade.core.behaviours.TickerBehaviour;
import jade.lang.acl.ACLMessage;
import jade.lang.acl.MessageTemplate;
import jade.lang.acl.UnreadableException;
import skydata.internal.agents.SKAgent;
import skydata.internal.agents.SKD;
import skydata.internal.message.SKAID;
import skydata.internal.message.SKLMessage;

public class UpdateStatsHarbour extends SKAgentBehaviour {

    public UpdateStatsHarbour(SKAgent agent) {
        super(agent);
    }

    @SuppressWarnings("rawtypes")
    @Override
    public void action() {

        SKD agent = (SKD) this.agent;

        HashMap<SKAID, HashMap<String, Comparable>> harboursStats = agent.getHarboursStats();
        String[] wantedStats = new String[] { "available", "capacity" };

        // Regularly, we ask the information
        agent.addBehaviour(new TickerBehaviour(agent, 5000) {
            @Override
            public void onTick() {
                SKLMessage request = new SKLMessage("STATS_REQUEST", "HARBOUR");
                for (SKAID harbour : agent.connectedHarbours()) {
                    request.addReceiver(harbour);
                }
                request.setContent((Serializable) wantedStats);
                agent.skSendNormal(request);

            }
        });

        // Manage the reception
        MessageTemplate mtStats = MessageTemplate.and(
                MessageTemplate.MatchOntology("STATS_RESPONSE"),
                MessageTemplate.and(
                        MessageTemplate.MatchProtocol("HARBOUR"),
                        MessageTemplate.MatchPerformative(ACLMessage.INFORM)));
        agent.addBehaviour(new CyclicBehaviour(agent) {
            @SuppressWarnings("unchecked")
            @Override
            public void action() {
                SKLMessage acl = agent.skReceive(mtStats);
                if (acl != null) {
                    SKAID sender = acl.getSender();
                    HashMap<String, Comparable> hashMapContent = (HashMap<String, Comparable>) acl.getContent();
                    harboursStats.put(sender, hashMapContent);

                } else {
                    block();
                }

            }
        });
    }

}