Details
diff --git a/network-resilience/src/br/ufrgs/inf/bdinetr/agent/RequestBeliefGoalPlanBody.java b/network-resilience/src/br/ufrgs/inf/bdinetr/agent/RequestBeliefGoalPlanBody.java
index 3856bc7..de2e437 100644
--- a/network-resilience/src/br/ufrgs/inf/bdinetr/agent/RequestBeliefGoalPlanBody.java
+++ b/network-resilience/src/br/ufrgs/inf/bdinetr/agent/RequestBeliefGoalPlanBody.java
@@ -23,7 +23,12 @@ package br.ufrgs.inf.bdinetr.agent;
import jade.content.ContentElement;
import jade.content.lang.sl.SLCodec;
-import jade.core.messaging.TopicManagementHelper;
+import jade.core.AID;
+import jade.domain.DFService;
+import jade.domain.FIPAException;
+import jade.domain.FIPANames.ContentLanguage;
+import jade.domain.FIPAAgentManagement.DFAgentDescription;
+import jade.domain.FIPAAgentManagement.ServiceDescription;
import jade.lang.acl.ACLMessage;
import jade.lang.acl.MessageTemplate;
@@ -61,6 +66,8 @@ public class RequestBeliefGoalPlanBody extends BeliefGoalPlanBody {
private State state;
private long requestTime;
private Set<ACLMessage> positiveAnswers;
+ private Set<AID> receivers;
+ private int answers;
@Override
protected void execute() {
@@ -73,11 +80,15 @@ public class RequestBeliefGoalPlanBody extends BeliefGoalPlanBody {
myAgent.getContentManager().fillContent(msg, getGoal());
// FIXME send request to specific role
- TopicManagementHelper topicHelper = (TopicManagementHelper) myAgent
- .getHelper(TopicManagementHelper.SERVICE_NAME);
+ receivers = new HashSet<>();
for (Role role : Role.values()) {
- msg.addReceiver(topicHelper.createTopic(role.name()));
+ for (DFAgentDescription agentDesc : getReceivers(role)) {
+ if (receivers.add(agentDesc.getName())) {
+ msg.addReceiver(agentDesc.getName());
+ }
+ }
}
+ log.info(receivers);
this.requestTime = System.currentTimeMillis();
msg.setConversationId("cin" + requestTime);
@@ -86,24 +97,27 @@ public class RequestBeliefGoalPlanBody extends BeliefGoalPlanBody {
this.mt = MessageTemplate.and(MessageTemplate
.MatchConversationId(msg.getConversationId()),
MessageTemplate.MatchInReplyTo(msg.getReplyWith()));
+ this.answers = 0;
this.positiveAnswers = new HashSet<>();
this.state = State.ReceivingResponses;
break;
case ReceivingResponses:
ACLMessage reply = myAgent.receive(mt);
if (reply != null) {
+ this.answers++;
if (ACLMessage.PROPOSE == reply.getPerformative()) {
log.info("Agent " + reply.getSender()
- + "sent a proposal");
+ + " sent a proposal");
positiveAnswers.add(reply);
} else {
log.info("Agent " + reply.getSender()
- + "refused the request");
+ + " refused the request");
}
} else {
block(MSG_TIME_OUT);
}
- if ((System.currentTimeMillis() - requestTime) > ANSWER_TIME_OUT) {
+ if (answers >= receivers.size()
+ || (System.currentTimeMillis() - requestTime) >= ANSWER_TIME_OUT) {
this.state = State.Selecting;
} else {
log.info("Waiting for more answers...");
@@ -174,4 +188,23 @@ public class RequestBeliefGoalPlanBody extends BeliefGoalPlanBody {
this.state = State.Resquesting;
}
+ private DFAgentDescription[] getReceivers(Role role) {
+ DFAgentDescription dfd = new DFAgentDescription();
+ ServiceDescription sd = new ServiceDescription();
+ sd.setType(role.name());
+ sd.addLanguages(ContentLanguage.FIPA_SL);
+ sd.addOntologies(BDINetROntology.ONTOLOGY_NAME);
+ dfd.addServices(sd);
+
+ try {
+ return DFService.search(myAgent, dfd);
+ } catch (FIPAException fe) {
+ log.error(myAgent.getLocalName()
+ + " search with DF unsucceeded. Reason: " + fe.getMessage());
+ log.error(fe);
+ fe.printStackTrace();
+ return new DFAgentDescription[0];
+ }
+ }
+
}
diff --git a/network-resilience/src/br/ufrgs/inf/bdinetr/agent/RespondBeliefGoalPlanBody.java b/network-resilience/src/br/ufrgs/inf/bdinetr/agent/RespondBeliefGoalPlanBody.java
index f65d67a..189dc01 100644
--- a/network-resilience/src/br/ufrgs/inf/bdinetr/agent/RespondBeliefGoalPlanBody.java
+++ b/network-resilience/src/br/ufrgs/inf/bdinetr/agent/RespondBeliefGoalPlanBody.java
@@ -31,6 +31,7 @@ import org.apache.commons.logging.LogFactory;
import bdi4jade.annotation.Parameter;
import bdi4jade.annotation.Parameter.Direction;
import bdi4jade.belief.Belief;
+import bdi4jade.core.Capability;
import bdi4jade.event.GoalEvent;
import bdi4jade.goal.BeliefGoal;
import bdi4jade.goal.GoalStatus;
@@ -68,11 +69,17 @@ public class RespondBeliefGoalPlanBody extends AbstractPlanBody {
.extractContent(beliefGoalMsg);
if (content instanceof BeliefGoal) {
beliefGoal = (BeliefGoal<?>) content;
- Boolean canAchieve = getCapability().canAchieve(beliefGoal);
+ Boolean canAchieve = false;
+ for (Capability part : getCapability()
+ .getPartCapabilities()) {
+ if (part.canAchieve(beliefGoal)) {
+ canAchieve = true;
+ break;
+ }
+ }
outcomingMsg
.setPerformative(canAchieve ? ACLMessage.PROPOSE
: ACLMessage.REFUSE);
- outcomingMsg.setContentObject(canAchieve);
log.info("Agent " + myAgent + " can achieve " + content
+ ": " + canAchieve);
} else {
diff --git a/network-resilience/src/br/ufrgs/inf/bdinetr/agent/RouterAgent.java b/network-resilience/src/br/ufrgs/inf/bdinetr/agent/RouterAgent.java
index d6ab52d..e499e57 100644
--- a/network-resilience/src/br/ufrgs/inf/bdinetr/agent/RouterAgent.java
+++ b/network-resilience/src/br/ufrgs/inf/bdinetr/agent/RouterAgent.java
@@ -22,8 +22,11 @@
package br.ufrgs.inf.bdinetr.agent;
import jade.content.lang.sl.SLCodec;
-import jade.core.AID;
-import jade.core.messaging.TopicManagementHelper;
+import jade.domain.DFService;
+import jade.domain.FIPAException;
+import jade.domain.FIPANames.ContentLanguage;
+import jade.domain.FIPAAgentManagement.DFAgentDescription;
+import jade.domain.FIPAAgentManagement.ServiceDescription;
import jade.lang.acl.ACLMessage;
import jade.lang.acl.MessageTemplate;
import jade.lang.acl.MessageTemplate.MatchExpression;
@@ -150,21 +153,30 @@ public class RouterAgent extends SingleCapabilityAgent implements
@Override
protected void init() {
+ DFAgentDescription dfd = new DFAgentDescription();
+ dfd.setName(getAID());
for (Capability capability : getAllCapabilities()) {
if (capability instanceof RouterAgentCapability) {
- try {
- TopicManagementHelper topicHelper = (TopicManagementHelper) getHelper(TopicManagementHelper.SERVICE_NAME);
- AID roleTopic = topicHelper
- .createTopic(((RouterAgentCapability) capability)
- .getRole().name());
- topicHelper.register(roleTopic);
- } catch (Exception exc) {
- log.error(exc);
- exc.printStackTrace();
- }
+ ServiceDescription sd = new ServiceDescription();
+ sd.setType(((RouterAgentCapability) capability).getRole()
+ .name());
+ sd.setName(getLocalName());
+ sd.addLanguages(ContentLanguage.FIPA_SL);
+ sd.addOntologies(BDINetROntology.ONTOLOGY_NAME);
+ dfd.addServices(sd);
}
}
+ try {
+ DFService.register(this, dfd);
+ } catch (FIPAException fe) {
+ log.error(getLocalName()
+ + " registration with DF unsucceeded. Reason: "
+ + fe.getMessage());
+ log.error(fe);
+ fe.printStackTrace();
+ }
+
getContentManager().registerLanguage(new SLCodec());
getContentManager().registerOntology(BDINetROntology.getInstance());
}