bdi-network-resilience

Changed way to find agents

9/12/2014 10:47:34 PM

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