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