////////////////////////// // Private utility methods ////////////////////////// private String[] getParticipantNames() { String[] pp = new String[participants.size()]; Iterator it = participants.iterator(); int i = 0; while (it.hasNext()) { AID id = (AID) it.next(); pp[i++] = id.getLocalName(); } return pp; }
/** * Utility method that updates the contact list extracting contact info and location from DF * descriptions. * * @param onlineContactsDescs array of {@link DFAgentDescription} objects that define services as * results of a DF query */ private void updateContactList(DFAgentDescription[] onlineContactsDescs) { for (int i = 0; i < onlineContactsDescs.length; i++) { Iterator serviceDescIt = onlineContactsDescs[i].getAllServices(); if (serviceDescIt.hasNext()) { ServiceDescription desc = (ServiceDescription) serviceDescIt.next(); Iterator propertyIt = desc.getAllProperties(); Location loc = Helper.extractLocation(propertyIt); AID cId = onlineContactsDescs[i].getName(); if (!cId.equals(myAgent.getAID())) { // Create an online contact (or update it) String phoneNumber = cId.getLocalName(); ContactManager.getInstance().addOrUpdateOnlineContact(phoneNumber, loc); } } } }
public void setup() { System.out.println("ASU.setup()"); getContentManager().registerLanguage(codec); getContentManager().registerOntology(ontology); ACLMessage aclmsg = new ACLMessage(ACLMessage.REQUEST); AssignPowerRequest apr = new AssignPowerRequest(); apr.setAssignedPower(100000); aclmsg.setLanguage(codec.getName()); aclmsg.setOntology(ontology.getName()); aclmsg.setProtocol(FIPANames.InteractionProtocol.FIPA_REQUEST); aclmsg.setReplyByDate(new Date(System.currentTimeMillis() + 30000)); AMSAgentDescription[] agents = null; try { SearchConstraints c = new SearchConstraints(); c.setMaxResults(new Long(-1)); agents = AMSService.search(this, new AMSAgentDescription(), c); } catch (Exception e) { System.out.println("Problem searching AMS: " + e); e.printStackTrace(); } for (AMSAgentDescription agent : agents) { AID agentID = agent.getName(); try { getContentManager().fillContent(aclmsg, new Action(agentID, apr)); } catch (Exception e) { e.printStackTrace(); } System.out.println(agentID.getLocalName()); if (agentID.getLocalName().compareTo("TURBINE") != 0) continue; aclmsg.clearAllReceiver(); aclmsg.addReceiver(agentID); System.out.println("Sending to " + agentID); addBehaviour(new ASURequestInitiatorBehaviour(this, aclmsg)); try { Thread.yield(); Thread.sleep(5000); } catch (Exception e) { System.out.println("INTERRUPT"); } ACLMessage aclmsg2 = new ACLMessage(ACLMessage.REQUEST); BeginPowerTransitionRequest bptr = new BeginPowerTransitionRequest(); bptr.setAssignedPowerValid(false); aclmsg2.setLanguage(codec.getName()); aclmsg2.setOntology(ontology.getName()); aclmsg2.setProtocol(FIPANames.InteractionProtocol.FIPA_REQUEST); aclmsg2.setReplyByDate(new Date(System.currentTimeMillis() + 30000)); try { getContentManager().fillContent(aclmsg2, new Action(agentID, bptr)); } catch (Exception e) { e.printStackTrace(); } aclmsg2.clearAllReceiver(); aclmsg2.addReceiver(agentID); System.out.println("Sending to " + agentID); addBehaviour(new ASURequestInitiatorBehaviour(this, aclmsg2)); } }
/** * Overrides SubscriptionInitiator.handleInform(), defining what to do each time the DF is * modified by a contact Basically it adds/removes/updates contacts from ContactList according * to what has happened to DF. It also fires events on the GUI any time a view refresh is * needed. * * @param inform the message from DF containing a list of changes */ protected void handleInform(ACLMessage inform) { myLogger.log( Logger.FINE, "Thread " + Thread.currentThread().getId() + ": Notification received from DF"); ContactManager.getInstance().resetModifications(); try { DFAgentDescription[] results = DFService.decodeNotification(inform.getContent()); if (results.length > 0) { for (int i = 0; i < results.length; ++i) { DFAgentDescription dfd = results[i]; AID contactAID = dfd.getName(); // Do something only if the notification deals with an agent different from the current // one if (!contactAID.equals(myAgent.getAID())) { myLogger.log( Logger.INFO, "Thread " + Thread.currentThread().getId() + ":df says that agent " + myAgent.getAID().getLocalName() + " updates or registers"); Iterator serviceIter = dfd.getAllServices(); // Registered or updated if (serviceIter.hasNext()) { ServiceDescription serviceDesc = (ServiceDescription) serviceIter.next(); Iterator propertyIt = serviceDesc.getAllProperties(); Location loc = Helper.extractLocation(propertyIt); String phoneNum = contactAID.getLocalName(); ContactManager.getInstance().addOrUpdateOnlineContact(phoneNum, loc); } else { myLogger.log( Logger.INFO, "Thread " + Thread.currentThread().getId() + ":df says that agent " + myAgent.getAID().getLocalName() + " deregisters"); String phoneNumber = contactAID.getLocalName(); Contact c = ContactManager.getInstance().getContact(phoneNumber); ContactManager.getInstance().setContactOffline(phoneNumber); MsnEvent event = MsnEventMgr.getInstance().createEvent(MsnEvent.CONTACT_DISCONNECT_EVENT); event.addParam(MsnEvent.CONTACT_DISCONNECT_PARAM_CONTACTNAME, c.getName()); MsnEventMgr.getInstance().fireEvent(event); } MsnEvent event = MsnEventMgr.getInstance().createEvent(MsnEvent.VIEW_REFRESH_EVENT); ContactListChanges changes = ContactManager.getInstance().getModifications(); Map<String, Contact> cMap = ContactManager.getInstance().getAllContacts(); Map<String, ContactLocation> cLocMap = ContactManager.getInstance().getAllContactLocations(); myLogger.log( Logger.FINE, "Thread " + Thread.currentThread().getId() + ":Adding to VIEW_REFRESH_EVENT this list of changes: " + changes.toString()); event.addParam(MsnEvent.VIEW_REFRESH_PARAM_LISTOFCHANGES, changes); event.addParam(MsnEvent.VIEW_REFRESH_CONTACTSMAP, cMap); event.addParam(MsnEvent.VIEW_REFRESH_PARAM_LOCATIONMAP, cLocMap); MsnEventMgr.getInstance().fireEvent(event); } } } } catch (Exception e) { myLogger.log(Logger.WARNING, "See printstack for Exception.", e); e.printStackTrace(); } }