Skip to content

File UpdateFamilyKnowledge.java

File List > behaviours > UpdateFamilyKnowledge.java

Go to the documentation of this file

package skydata.internal.behaviours;

import java.io.IOException;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import jade.lang.acl.ACLMessage;
import jade.lang.acl.MessageTemplate;
import jade.lang.acl.UnreadableException;
import jade.core.behaviours.CyclicBehaviour;
import skydata.internal.agents.SKAgent;
import skydata.internal.agents.SKD;
import skydata.internal.message.SKAID;
import skydata.internal.message.SKLMessage;

public class UpdateFamilyKnowledge extends SKAgentBehaviour {

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

    public Set<SKAID> copySet(Set<SKAID> set) {
        Set<SKAID> copiedSet = new HashSet<SKAID>();
        for (SKAID m : set) {
            copiedSet.add((SKAID) m);
        }
        return copiedSet;
    }

    @Override
    public void action() {

        SKD skd = (SKD) this.agent;

        // Manage the reception of an update message
        MessageTemplate mtUpdate = MessageTemplate.and(
                MessageTemplate.MatchOntology("UPDATE_FAMILY_INFORM"),
                MessageTemplate.and(
                        MessageTemplate.MatchProtocol("MANAGE_FAMILY"),
                        MessageTemplate.MatchPerformative(ACLMessage.INFORM)));
        skd.addBehaviour(new CyclicBehaviour(agent) {
            @Override
            public void action() {
                SKLMessage acl = skd.skReceive(mtUpdate);
                if (acl != null) {
                    Object obj = acl.getContent();
                    if (obj != null) {
                        @SuppressWarnings("unchecked")
                        Map<String, Set<SKAID>> Message = (Map<String, Set<SKAID>>) obj;
                        Set<SKAID> agents = Message.get("family");
                        Set<SKAID> deleted = Message.get("deleted");
                        if (!skd.getDeletedFamilyMembers().equals(deleted)) {
                            skd.mergeWithDeletedFamilyMembers(deleted);
                        }
                        if (!agents.equals(skd.getFamily())) {
                            skd.mergeWithFamily(agents);
                        }
                        skd.getFamily().removeAll(skd.getDeletedFamilyMembers());
                    }
                } else {
                    block();
                }

            }
        });

        // Manage the reception of a deletion message
        MessageTemplate mtDeleted = MessageTemplate.and(
                MessageTemplate.MatchOntology("DELETED"),
                MessageTemplate.and(
                        MessageTemplate.MatchProtocol("MANAGE_FAMILY"),
                        MessageTemplate.MatchPerformative(ACLMessage.INFORM)));
        skd.addBehaviour(new CyclicBehaviour(agent) {

            @Override
            public void action() {
                SKLMessage acl = skd.skReceive(mtDeleted);
                if (acl != null) {
                    skd.deletedFamilyMembers.add(acl.getSender());
                    skd.removeFromFamily(acl.getSender());

                } else {
                    block();
                }
            }
        });

        // When i want to delete, i send a message to other
        skd.addInternalUpdate("DELETION", new SKAgentBehaviour(agent) {
            @Override
            public void action() {
                SKLMessage message = new SKLMessage("DELETED", "MANAGE_FAMILY");
                skd.broadcastFamily(message);
            }
        });
    }

}